From a7bbcd4eaa42801805aecc9329def193cdf7f238 Mon Sep 17 00:00:00 2001 From: MohammadTaha Basiri Date: Fri, 10 Jun 2022 11:38:15 +0430 Subject: [PATCH] v2.1.1 --- lib/main.dart | 13 +++++++- lib/providers/user.dart | 16 ++++++++++ lib/services/app_initalizer.dart | 1 + lib/views/home/home.dart | 24 +++++++++++++++ .../direct_list/widgets/direct_item.dart | 2 ++ lib/views/home/settings/settings.dart | 28 +++++++++++++---- .../statistic_details_state.dart | 2 +- lib/views/splash/splash.dart | 1 + lib/views/widgets/didvan/bnb.dart | 30 +++++++++++++++---- lib/views/widgets/didvan/page_view.dart | 3 ++ pubspec.lock | 4 +-- 11 files changed, 109 insertions(+), 15 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index c8b4e77..4a7e5d6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,12 +4,23 @@ import 'package:didvan/providers/media.dart'; import 'package:didvan/providers/theme.dart'; import 'package:didvan/providers/user.dart'; import 'package:didvan/routes/route_generator.dart'; +import 'package:didvan/services/app_initalizer.dart'; import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; -void main() { +void main() async { + await Firebase.initializeApp(); + final initMsg = await FirebaseMessaging.instance.getInitialMessage(); + if (initMsg != null) { + AppInitializer.clickAction = initMsg.data['click_action'].replaceAll( + 'navigate-', + '', + ); + } runApp(const Didvan()); } diff --git a/lib/providers/user.dart b/lib/providers/user.dart index 428233a..4e0ebee 100644 --- a/lib/providers/user.dart +++ b/lib/providers/user.dart @@ -12,6 +12,14 @@ import 'package:didvan/utils/action_sheet.dart'; class UserProvider extends CoreProvier { late User user; bool isAuthenticated = false; + int _unreadMessageCount = 0; + + set unreadMessageCount(int value) { + _unreadMessageCount = value; + notifyListeners(); + } + + int get unreadMessageCount => _unreadMessageCount; static final List _radarMarkQueue = []; static final List _newsMarkQueue = []; @@ -211,4 +219,12 @@ class UserProvider extends CoreProvier { _statisticMarkQueue.removeWhere((element) => element.key == id); }); } + + Future getUnreadMessageCount() async { + final RequestService service = RequestService(RequestHelper.directs); + await service.httpGet(); + if (service.isSuccess) { + _unreadMessageCount = service.result['unread'] ?? 0; + } + } } diff --git a/lib/services/app_initalizer.dart b/lib/services/app_initalizer.dart index b8a2378..8d04ecf 100644 --- a/lib/services/app_initalizer.dart +++ b/lib/services/app_initalizer.dart @@ -8,6 +8,7 @@ import 'package:path_provider/path_provider.dart'; class AppInitializer { static String? fcmToken; + static String? clickAction; static Future setupServices() async { if (!kIsWeb) { diff --git a/lib/views/home/home.dart b/lib/views/home/home.dart index aec1a56..2f08d76 100644 --- a/lib/views/home/home.dart +++ b/lib/views/home/home.dart @@ -1,10 +1,15 @@ import 'package:didvan/config/design_config.dart'; +import 'package:didvan/models/requests/news.dart'; +import 'package:didvan/models/requests/radar.dart'; +import 'package:didvan/models/requests/studio.dart'; +import 'package:didvan/services/app_initalizer.dart'; import 'package:didvan/views/home/home_state.dart'; import 'package:didvan/views/home/news/news.dart'; import 'package:didvan/views/home/radar/radar.dart'; import 'package:didvan/views/home/settings/settings.dart'; import 'package:didvan/views/home/statistic/statistic.dart'; import 'package:didvan/views/home/studio/studio.dart'; +import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart'; import 'package:didvan/views/widgets/didvan/bnb.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -26,6 +31,25 @@ class _HomeState extends State with SingleTickerProviderStateMixin { _tabController.addListener(() { context.read().currentPageIndex = _tabController.index; }); + // if (AppInitializer.clickAction != null) { + // final clickAction = AppInitializer.clickAction!; + // String routeName = ''; + // if (clickAction.contains('podcast')) { + // context.read().getStudioDetails(); + // return; + // } + // Navigator.of(context).pushNamed( + // clickAction.split('-').first, + // arguments: { + // 'id': clickAction.split('-')[1], + // 'args': clickAction.contains('radar') + // ? const RadarRequestArgs(page: 0) + // : clickAction.contains('news') + // ? const NewsRequestArgs(page: 0) + // : const StudioRequestArgs(page: 0), + // }, + // ); + // } super.initState(); } diff --git a/lib/views/home/settings/direct_list/widgets/direct_item.dart b/lib/views/home/settings/direct_list/widgets/direct_item.dart index da51414..2a5fdbf 100644 --- a/lib/views/home/settings/direct_list/widgets/direct_item.dart +++ b/lib/views/home/settings/direct_list/widgets/direct_item.dart @@ -1,6 +1,7 @@ import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/models/chat_room/chat_room.dart'; +import 'package:didvan/providers/user.dart'; import 'package:didvan/routes/routes.dart'; import 'package:didvan/utils/date_time.dart'; import 'package:didvan/views/home/settings/direct_list/direct_list_state.dart'; @@ -26,6 +27,7 @@ class ChatRoomItem extends StatelessWidget { int unreadCount = chatRoom.unread; chatRoom.unread = 0; state.unreadCount -= unreadCount; + context.read().unreadMessageCount -= unreadCount; }, child: Container( color: Colors.transparent, diff --git a/lib/views/home/settings/settings.dart b/lib/views/home/settings/settings.dart index a39a728..6ca9cff 100644 --- a/lib/views/home/settings/settings.dart +++ b/lib/views/home/settings/settings.dart @@ -1,3 +1,4 @@ +import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/providers/theme.dart'; import 'package:didvan/providers/user.dart'; @@ -5,6 +6,7 @@ import 'package:didvan/routes/routes.dart'; import 'package:didvan/services/storage/storage.dart'; import 'package:didvan/views/home/widgets/logo_app_bar.dart'; import 'package:didvan/views/home/widgets/menu_item.dart'; +import 'package:didvan/views/widgets/didvan/badge.dart'; import 'package:didvan/views/widgets/didvan/card.dart'; import 'package:didvan/views/widgets/didvan/divider.dart'; import 'package:didvan/views/widgets/didvan/text.dart'; @@ -33,11 +35,27 @@ class Settings extends StatelessWidget { DidvanCard( child: Column( children: [ - MenuOption( - title: 'پیام‌ها', - icon: DidvanIcons.message_regular, - onTap: () => - Navigator.of(context).pushNamed(Routes.directList), + Consumer( + child: Icon( + DidvanIcons.angle_left_regular, + size: 18, + color: Theme.of(context).colorScheme.title, + ), + builder: (context, state, child) => MenuOption( + title: 'پیام‌ها', + icon: DidvanIcons.message_regular, + onTap: () => + Navigator.of(context).pushNamed(Routes.directList), + trailing: Row( + children: [ + if (state.unreadMessageCount != 0) + DidvanBadge( + text: state.unreadMessageCount.toString(), + ), + child!, + ], + ), + ), ), const DidvanDivider(), MenuOption( diff --git a/lib/views/home/statistic/statistic_details/statistic_details_state.dart b/lib/views/home/statistic/statistic_details/statistic_details_state.dart index f4af93d..291f791 100644 --- a/lib/views/home/statistic/statistic_details/statistic_details_state.dart +++ b/lib/views/home/statistic/statistic_details/statistic_details_state.dart @@ -153,7 +153,7 @@ class StatisticDetailsState extends CoreProvier { double.parse(value.replaceAll(',', '')); Future getRelatedContents() async { - if (relatedContents!.isNotEmpty) return; + if (relatedContents?.isNotEmpty ?? true) return; final service = RequestService(RequestHelper.tag( ids: tags.map((tag) => tag.id).toList(), )); diff --git a/lib/views/splash/splash.dart b/lib/views/splash/splash.dart index d0b8595..7642e71 100644 --- a/lib/views/splash/splash.dart +++ b/lib/views/splash/splash.dart @@ -115,6 +115,7 @@ class _SplashState extends State { } RequestService.token = token; final result = await userProvider.getUserInfo(); + await userProvider.getUnreadMessageCount(); if (!result) { StorageService.delete(key: 'token'); Navigator.of(context).pushNamedAndRemoveUntil( diff --git a/lib/views/widgets/didvan/bnb.dart b/lib/views/widgets/didvan/bnb.dart index 542331e..0b8bf72 100644 --- a/lib/views/widgets/didvan/bnb.dart +++ b/lib/views/widgets/didvan/bnb.dart @@ -3,6 +3,7 @@ import 'package:didvan/config/design_config.dart'; import 'package:didvan/config/theme_data.dart'; import 'package:didvan/constants/app_icons.dart'; import 'package:didvan/models/enums.dart'; +import 'package:didvan/providers/user.dart'; import 'package:didvan/services/media/media.dart'; import 'package:didvan/utils/action_sheet.dart'; import 'package:didvan/views/home/studio/studio_details/studio_details_state.dart'; @@ -82,6 +83,8 @@ class DidvanBNB extends StatelessWidget { onTap: () => onTabChanged(3), ), _NavBarItem( + hasBadge: + context.watch().unreadMessageCount != 0, isSelected: currentTabIndex == 4, title: 'تنظیمات', selectedIcon: DidvanIcons.setting_solid, @@ -360,6 +363,7 @@ class _NavBarItem extends StatelessWidget { final String title; final IconData selectedIcon; final IconData unselectedIcon; + final bool hasBadge; const _NavBarItem({ Key? key, required this.isSelected, @@ -367,6 +371,7 @@ class _NavBarItem extends StatelessWidget { required this.selectedIcon, required this.unselectedIcon, required this.onTap, + this.hasBadge = false, }) : super(key: key); @override @@ -397,12 +402,25 @@ class _NavBarItem extends StatelessWidget { ? Theme.of(context).colorScheme.focused : Theme.of(context).colorScheme.surface, ), - child: Icon( - isSelected ? selectedIcon : unselectedIcon, - size: 32, - color: DesignConfig.isDark - ? Theme.of(context).colorScheme.text - : Theme.of(context).colorScheme.title, + child: Stack( + children: [ + Icon( + isSelected ? selectedIcon : unselectedIcon, + size: 32, + color: DesignConfig.isDark + ? Theme.of(context).colorScheme.text + : Theme.of(context).colorScheme.title, + ), + if (hasBadge) + Container( + height: 12, + width: 12, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ], ), ), DidvanText( diff --git a/lib/views/widgets/didvan/page_view.dart b/lib/views/widgets/didvan/page_view.dart index 637537d..b7ada13 100644 --- a/lib/views/widgets/didvan/page_view.dart +++ b/lib/views/widgets/didvan/page_view.dart @@ -279,6 +279,9 @@ class _DidvanPageViewState extends State { margin: EdgeInsets.zero, padding: EdgeInsets.zero, ), + 'a': Style( + textAlign: TextAlign.left, + ), }, ); } diff --git a/pubspec.lock b/pubspec.lock index 8768ce1..a460b0a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -795,7 +795,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.1.2" + version: "6.1.3" url_launcher_android: dependency: transitive description: @@ -914,7 +914,7 @@ packages: name: webview_flutter_android url: "https://pub.dartlang.org" source: hosted - version: "2.8.10" + version: "2.8.11" webview_flutter_platform_interface: dependency: transitive description: