import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/pages_desktop_specific/address_book_view/desktop_address_book.dart'; import 'package:stackwallet/pages_desktop_specific/desktop_buy/desktop_buy_view.dart'; import 'package:stackwallet/pages_desktop_specific/desktop_exchange/desktop_exchange_view.dart'; import 'package:stackwallet/pages_desktop_specific/desktop_menu.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/my_stack_view.dart'; import 'package:stackwallet/pages_desktop_specific/notifications/desktop_notifications_view.dart'; import 'package:stackwallet/pages_desktop_specific/settings/desktop_settings_view.dart'; import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/desktop_about_view.dart'; import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/desktop_support_view.dart'; import 'package:stackwallet/providers/desktop/current_desktop_menu_item.dart'; import 'package:stackwallet/providers/global/auto_swb_service_provider.dart'; import 'package:stackwallet/providers/global/notifications_provider.dart'; import 'package:stackwallet/providers/global/prefs_provider.dart'; import 'package:stackwallet/providers/global/wallets_provider.dart'; import 'package:stackwallet/providers/ui/transaction_filter_provider.dart'; import 'package:stackwallet/providers/ui/unread_notifications_provider.dart'; import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/widgets/background.dart'; final currentWalletIdProvider = StateProvider((_) => null); class DesktopHomeView extends ConsumerStatefulWidget { const DesktopHomeView({Key? key}) : super(key: key); static const String routeName = "/desktopHome"; @override ConsumerState createState() => _DesktopHomeViewState(); } class _DesktopHomeViewState extends ConsumerState { final GlobalKey myStackViewNavKey = GlobalKey(); late final Navigator myStackViewNav; @override void initState() { myStackViewNav = Navigator( key: myStackViewNavKey, onGenerateRoute: RouteGenerator.generateRoute, initialRoute: MyStackView.routeName, ); super.initState(); } final Map contentViews = { DesktopMenuItemId.myStack: Container( // key: Key("desktopStackHomeKey"), // onGenerateRoute: RouteGenerator.generateRoute, // initialRoute: MyStackView.routeName, ), DesktopMenuItemId.exchange: const Navigator( key: Key("desktopExchangeHomeKey"), onGenerateRoute: RouteGenerator.generateRoute, initialRoute: DesktopExchangeView.routeName, ), DesktopMenuItemId.buy: const Navigator( key: Key("desktopBuyHomeKey"), onGenerateRoute: RouteGenerator.generateRoute, initialRoute: DesktopBuyView.routeName, ), DesktopMenuItemId.notifications: const Navigator( key: Key("desktopNotificationsHomeKey"), onGenerateRoute: RouteGenerator.generateRoute, initialRoute: DesktopNotificationsView.routeName, ), DesktopMenuItemId.addressBook: const Navigator( key: Key("desktopAddressBookHomeKey"), onGenerateRoute: RouteGenerator.generateRoute, initialRoute: DesktopAddressBook.routeName, ), DesktopMenuItemId.settings: const Navigator( key: Key("desktopSettingHomeKey"), onGenerateRoute: RouteGenerator.generateRoute, initialRoute: DesktopSettingsView.routeName, ), DesktopMenuItemId.support: const Navigator( key: Key("desktopSupportHomeKey"), onGenerateRoute: RouteGenerator.generateRoute, initialRoute: DesktopSupportView.routeName, ), DesktopMenuItemId.about: const Navigator( key: Key("desktopAboutHomeKey"), onGenerateRoute: RouteGenerator.generateRoute, initialRoute: DesktopAboutView.routeName, ), }; void onMenuSelectionWillChange(DesktopMenuItemId newKey) { // handle logging out of active wallet if (ref.read(prevDesktopMenuItemProvider.state).state == DesktopMenuItemId.myStack && ref.read(prevDesktopMenuItemProvider.state).state == newKey) { Navigator.of(myStackViewNavKey.currentContext!) .popUntil(ModalRoute.withName(MyStackView.routeName)); if (ref.read(currentWalletIdProvider.state).state != null) { final managerProvider = ref .read(walletsChangeNotifierProvider) .getManagerProvider(ref.read(currentWalletIdProvider.state).state!); if (ref.read(managerProvider).shouldAutoSync) { ref.read(managerProvider).shouldAutoSync = false; } ref.read(transactionFilterProvider.state).state = null; if (ref.read(prefsChangeNotifierProvider).isAutoBackupEnabled && ref.read(prefsChangeNotifierProvider).backupFrequencyType == BackupFrequencyType.afterClosingAWallet) { ref.read(autoSWBServiceProvider).doBackup(); } ref.read(managerProvider.notifier).isActiveWallet = false; } } ref.read(prevDesktopMenuItemProvider.state).state = newKey; // check for unread notifications and refresh provider before // showing notifications view if (newKey == DesktopMenuItemId.notifications) { ref.refresh(unreadNotificationsStateProvider); } // mark notifications as read if leaving notifications view if (ref.read(currentDesktopMenuItemProvider.state).state == DesktopMenuItemId.notifications && newKey != DesktopMenuItemId.notifications) { final Set unreadNotificationIds = ref.read(unreadNotificationsStateProvider.state).state; if (unreadNotificationIds.isNotEmpty) { List> futures = []; for (int i = 0; i < unreadNotificationIds.length - 1; i++) { futures.add(ref .read(notificationsProvider) .markAsRead(unreadNotificationIds.elementAt(i), false)); } // wait for multiple to update if any Future.wait(futures).then((_) { // only notify listeners once ref .read(notificationsProvider) .markAsRead(unreadNotificationIds.last, true); }); } } } @override Widget build(BuildContext context) { return Material( color: Theme.of(context).extension()!.background, child: Background( child: Row( children: [ DesktopMenu( // onSelectionChanged: onMenuSelectionChanged, onSelectionWillChange: onMenuSelectionWillChange, ), Container( width: 1, color: Theme.of(context).extension()!.background, ), Expanded( child: IndexedStack( index: ref .watch(currentDesktopMenuItemProvider.state) .state .index > 0 ? 1 : 0, children: [ myStackViewNav, contentViews[ ref.watch(currentDesktopMenuItemProvider.state).state]!, ], ), ), // Expanded( // child: contentViews[ // ref.watch(currentDesktopMenuItemProvider.state).state]!, // ), ], ), ), ); } }