dev
dart 173 lines 7.01 KB
Raw
1 import 'package:cake_wallet/di.dart';
2 import 'package:cake_wallet/routes.dart';
3 import 'package:cake_wallet/src/screens/auth/auth_page.dart';
4 import 'package:cake_wallet/src/screens/base_page.dart';
5 import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_dashboard_navbar.dart';
6 import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu.dart';
7 import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar/side_menu_item.dart';
8 import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart';
9 import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
10 import 'package:cake_wallet/src/screens/wallet_connect/widgets/bottom_sheet/bottom_sheet_listener_widget.dart';
11 import 'package:cake_wallet/src/screens/wallet_connect/services/bottom_sheet_service.dart';
12 import 'package:cake_wallet/src/widgets/services_updates_widget.dart';
13 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
14 import 'package:cake_wallet/view_model/dashboard/desktop_sidebar_view_model.dart';
15 import 'package:flutter/cupertino.dart';
16 import 'package:flutter/material.dart';
17 import 'package:flutter_mobx/flutter_mobx.dart';
18 import 'package:cake_wallet/router.dart' as Router;
19 import 'package:mobx/mobx.dart';
20
21 class DesktopSidebarWrapper extends BasePage {
22 final BottomSheetService bottomSheetService;
23 final Widget child;
24 final DesktopSidebarViewModel desktopSidebarViewModel;
25 final DashboardViewModel dashboardViewModel;
26 final GlobalKey<NavigatorState> desktopNavigatorKey;
27
28 DesktopSidebarWrapper({
29 required this.child,
30 required this.bottomSheetService,
31 required this.desktopSidebarViewModel,
32 required this.dashboardViewModel,
33 required this.desktopNavigatorKey,
34 });
35
36 @override
37 ObstructingPreferredSizeWidget appBar(BuildContext context) => DesktopDashboardNavbar(
38 leading: Padding(
39 padding: EdgeInsets.only(left: sideMenuWidth),
40 child: getIt<DesktopWalletSelectionDropDown>(),
41 ),
42 middle: SyncIndicator(
43 dashboardViewModel: dashboardViewModel,
44 onTap: () => Navigator.of(context, rootNavigator: true).pushNamed(Routes.connectionSync),
45 ),
46 trailing: InkWell(
47 onTap: () {
48 Navigator.of(context).pushNamed(
49 Routes.unlock,
50 arguments: (bool isAuthenticatedSuccessfully, AuthPageState auth) {
51 if (isAuthenticatedSuccessfully) {
52 auth.close();
53 }
54 },
55 );
56 },
57 child: Icon(Icons.lock_outline),
58 ),
59 );
60
61 @override
62 bool get resizeToAvoidBottomInset => false;
63
64 final pageController = PageController();
65
66 double get sideMenuWidth => 76.0;
67
68 @override
69 Widget body(BuildContext context) {
70 _setEffects();
71
72 return BottomSheetListener(
73 bottomSheetService: bottomSheetService,
74 child: Row(
75 crossAxisAlignment: CrossAxisAlignment.start,
76 children: [
77 Observer(builder: (_) {
78 return SideMenu(
79 width: sideMenuWidth,
80 topItems: [
81 SideMenuItem(
82 // imagePath: 'assets/images/wallet_outline.png',
83 icon: Icons.home,
84 isSelected: desktopSidebarViewModel.currentPage == SidebarItem.dashboard,
85 onTap: () {
86 desktopSidebarViewModel.onPageChange(SidebarItem.dashboard);
87 desktopNavigatorKey.currentState
88 ?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
89 },
90 ),
91 SideMenuItem(
92 onTap: () {
93 if (desktopSidebarViewModel.currentPage == SidebarItem.transactions) {
94 desktopNavigatorKey.currentState
95 ?.pushNamedAndRemoveUntil(Routes.desktop_actions, (route) => false);
96 desktopSidebarViewModel.resetSidebar();
97 } else {
98 desktopSidebarViewModel.onPageChange(SidebarItem.transactions);
99 desktopNavigatorKey.currentState?.pushNamed(Routes.transactionsPage);
100 }
101 },
102 isSelected: desktopSidebarViewModel.currentPage == SidebarItem.transactions,
103 imagePath: 'assets/images/history.svg',
104 ),
105 SideMenuItem(
106 widget: ServicesUpdatesWidget(
107 dashboardViewModel.getServicesStatus(),
108 enabled: dashboardViewModel.isEnabledBulletinAction,
109 ),
110 isSelected: desktopSidebarViewModel.currentPage == SidebarItem.status,
111 onTap: () {},
112 ),
113 ],
114 bottomItems: [
115 SideMenuItem(
116 imagePath: 'assets/images/support_icon.png',
117 isSelected: desktopSidebarViewModel.currentPage == SidebarItem.support,
118 onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.support),
119 ),
120 SideMenuItem(
121 imagePath: 'assets/images/settings_outline.png',
122 isSelected: desktopSidebarViewModel.currentPage == SidebarItem.settings,
123 onTap: () => desktopSidebarViewModel.onPageChange(SidebarItem.settings),
124 ),
125 ],
126 );
127 }),
128 Expanded(
129 child: PageView(
130 controller: pageController,
131 physics: NeverScrollableScrollPhysics(),
132 children: [
133 child,
134 Container(
135 color: Theme.of(context).colorScheme.surface,
136 padding: EdgeInsets.all(20),
137 child: Navigator(
138 initialRoute: Routes.support,
139 onGenerateRoute: (settings) => Router.createRoute(settings),
140 onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
141 return [
142 navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
143 ];
144 },
145 ),
146 ),
147 Navigator(
148 initialRoute: Routes.desktop_settings_page,
149 onGenerateRoute: (settings) => Router.createRoute(settings),
150 onGenerateInitialRoutes: (NavigatorState navigator, String initialRouteName) {
151 return [
152 navigator.widget.onGenerateRoute!(RouteSettings(name: initialRouteName))!
153 ];
154 },
155 ),
156 ],
157 ),
158 ),
159 ],
160 ),
161 );
162 }
163
164 void _setEffects() async {
165 reaction<SidebarItem>((_) => desktopSidebarViewModel.currentPage, (page) {
166 if (page == SidebarItem.dashboard) {
167 pageController.jumpToPage(0);
168 return;
169 }
170 pageController.jumpToPage(page.index - 1);
171 });
172 }
173 }