From 3b04753f4ea465edfad94a028b0f5933222fbb64 Mon Sep 17 00:00:00 2001 From: Arseni Date: Thu, 4 Dec 2025 15:38:01 +0300 Subject: [PATCH] Revert "Merge branch 'devKA' into devka (resolve conflicts)" This reverts commit 5f4184760d097f1f17573ef62d3f4a65ae1f0dc7, reversing changes made to 5e1da9617fb8883bc9fe5152ce5eb62fd6e97611. Reverting changes on main --- .../pweb/lib/app/router/payout_routes.dart | 53 ------ .../pweb/lib/app/router/payout_shell.dart | 159 ----------------- frontend/pweb/lib/app/router/router.dart | 38 ++-- .../lib/pages/payment_methods/add/wallet.dart | 5 +- .../payout_page/wallet/edit/buttons/send.dart | 5 - .../pweb/lib/providers/page_selector.dart | 6 +- frontend/pweb/lib/widgets/sidebar/page.dart | 168 +++++++++++------- 7 files changed, 126 insertions(+), 308 deletions(-) delete mode 100644 frontend/pweb/lib/app/router/payout_routes.dart delete mode 100644 frontend/pweb/lib/app/router/payout_shell.dart diff --git a/frontend/pweb/lib/app/router/payout_routes.dart b/frontend/pweb/lib/app/router/payout_routes.dart deleted file mode 100644 index 3c2bb09..0000000 --- a/frontend/pweb/lib/app/router/payout_routes.dart +++ /dev/null @@ -1,53 +0,0 @@ -import 'package:pweb/app/router/pages.dart'; - -import 'package:pweb/widgets/sidebar/destinations.dart'; - - -const _payoutBasePath = Pages.dashboard; - -String payoutPath(PayoutDestination destination) { - final base = routerPage(_payoutBasePath); - switch (destination) { - case PayoutDestination.dashboard: - return base; - case PayoutDestination.recipients: - return '$base/recipients'; - case PayoutDestination.addrecipient: - return '$base/recipients/add'; - case PayoutDestination.payment: - return '$base/payment'; - case PayoutDestination.settings: - return '$base/settings'; - case PayoutDestination.reports: - return '$base/reports'; - case PayoutDestination.methods: - return '$base/methods'; - case PayoutDestination.editwallet: - return '$base/methods/edit'; - case PayoutDestination.sendPayout: - return '$base/send'; - } -} - -PayoutDestination payoutDestinationFromLocation(String location) { - final path = Uri.parse(location).path; - - // Check longer paths first to avoid prefix collisions. - for (final entry in _orderedRoutes) { - if (path.startsWith(entry.value)) return entry.key; - } - - return PayoutDestination.dashboard; -} - -final List> _orderedRoutes = [ - MapEntry(PayoutDestination.editwallet, payoutPath(PayoutDestination.editwallet)), - MapEntry(PayoutDestination.addrecipient, payoutPath(PayoutDestination.addrecipient)), - MapEntry(PayoutDestination.payment, payoutPath(PayoutDestination.payment)), - MapEntry(PayoutDestination.recipients, payoutPath(PayoutDestination.recipients)), - MapEntry(PayoutDestination.methods, payoutPath(PayoutDestination.methods)), - MapEntry(PayoutDestination.reports, payoutPath(PayoutDestination.reports)), - MapEntry(PayoutDestination.settings, payoutPath(PayoutDestination.settings)), - MapEntry(PayoutDestination.sendPayout, payoutPath(PayoutDestination.sendPayout)), - MapEntry(PayoutDestination.dashboard, payoutPath(PayoutDestination.dashboard)), -]; diff --git a/frontend/pweb/lib/app/router/payout_shell.dart b/frontend/pweb/lib/app/router/payout_shell.dart deleted file mode 100644 index de960b9..0000000 --- a/frontend/pweb/lib/app/router/payout_shell.dart +++ /dev/null @@ -1,159 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:go_router/go_router.dart'; - -import 'package:provider/provider.dart'; - -import 'package:pweb/app/router/pages.dart'; -import 'package:pweb/app/router/payout_routes.dart'; -import 'package:pweb/pages/address_book/form/page.dart'; -import 'package:pweb/pages/address_book/page/page.dart'; -import 'package:pweb/pages/dashboard/dashboard.dart'; -import 'package:pweb/pages/payout_page/page.dart'; -import 'package:pweb/pages/payout_page/wallet/edit/page.dart'; -import 'package:pweb/pages/payment_methods/page.dart'; -import 'package:pweb/pages/report/page.dart'; -import 'package:pweb/pages/settings/profile/page.dart'; -import 'package:pweb/providers/page_selector.dart'; -import 'package:pweb/widgets/sidebar/destinations.dart'; -import 'package:pweb/widgets/sidebar/page.dart'; - -import 'package:pweb/generated/i18n/app_localizations.dart'; - - -RouteBase payoutShellRoute() => ShellRoute( - pageBuilder: (context, state, child) => NoTransitionPage( - child: PageSelector( - selected: payoutDestinationFromLocation(state.uri.toString()), - child: child, - ), - ), - routes: [ - GoRoute( - name: Pages.dashboard.name, - path: routerPage(Pages.dashboard), - pageBuilder: (context, state) { - final selector = context.read(); - return NoTransitionPage( - child: DashboardPage( - onRecipientSelected: (recipient) { - selector.selectRecipient(recipient); - context.go(payoutPath(PayoutDestination.payment)); - }, - onGoToPaymentWithoutRecipient: (type) { - selector.startPaymentWithoutRecipient(type); - context.go(payoutPath(PayoutDestination.payment)); - }, - ), - ); - }, - ), - GoRoute( - name: 'payoutRecipients', - path: payoutPath(PayoutDestination.recipients), - pageBuilder: (context, state) { - final selector = context.read(); - return NoTransitionPage( - child: RecipientAddressBookPage( - onRecipientSelected: (recipient) { - selector.selectRecipient(recipient, fromList: true); - context.go(payoutPath(PayoutDestination.payment)); - }, - onAddRecipient: () { - selector.goToAddRecipient(); - context.go(payoutPath(PayoutDestination.addrecipient)); - }, - onEditRecipient: (recipient) { - selector.editRecipient(recipient, fromList: true); - context.go(payoutPath(PayoutDestination.addrecipient)); - }, - ), - ); - }, - ), - GoRoute( - name: 'payoutAddRecipient', - path: payoutPath(PayoutDestination.addrecipient), - pageBuilder: (context, state) { - final selector = context.read(); - final recipient = selector.recipientProvider?.selectedRecipient; - return NoTransitionPage( - child: AdressBookRecipientForm( - recipient: recipient, - onSaved: (_) { - selector.selectPage(PayoutDestination.recipients); - context.go(payoutPath(PayoutDestination.recipients)); - }, - ), - ); - }, - ), - GoRoute( - name: 'payoutPayment', - path: payoutPath(PayoutDestination.payment), - pageBuilder: (context, state) { - final selector = context.read(); - return NoTransitionPage( - child: PaymentPage( - onBack: (_) { - final destination = selector.goBackFromPayment(); - context.go(payoutPath(destination)); - }, - ), - ); - }, - ), - GoRoute( - name: 'payoutSettings', - path: payoutPath(PayoutDestination.settings), - pageBuilder: (context, state) => NoTransitionPage( - child: const ProfileSettingsPage(), - ), - ), - GoRoute( - name: 'payoutReports', - path: payoutPath(PayoutDestination.reports), - pageBuilder: (context, state) => NoTransitionPage( - child: const OperationHistoryPage(), - ), - ), - GoRoute( - name: 'payoutMethods', - path: payoutPath(PayoutDestination.methods), - pageBuilder: (context, state) { - final selector = context.read(); - return NoTransitionPage( - child: PaymentConfigPage( - onWalletTap: (wallet) { - selector.selectWallet(wallet); - context.go(payoutPath(PayoutDestination.editwallet)); - }, - ), - ); - }, - ), - GoRoute( - name: 'payoutEditWallet', - path: payoutPath(PayoutDestination.editwallet), - pageBuilder: (context, state) { - final selector = context.read(); - final wallet = selector.walletsProvider?.selectedWallet; - if (wallet == null) { - final loc = AppLocalizations.of(context)!; - return NoTransitionPage( - child: Center(child: Text(loc.noWalletSelected)), - ); - } - - return NoTransitionPage( - child: WalletEditPage( - onBack: () { - selector.goBackFromWalletEdit(); - context.go(payoutPath(PayoutDestination.methods)); - }, - ), - ); - }, - ), - ], -); diff --git a/frontend/pweb/lib/app/router/router.dart b/frontend/pweb/lib/app/router/router.dart index add8568..1b2fdce 100644 --- a/frontend/pweb/lib/app/router/router.dart +++ b/frontend/pweb/lib/app/router/router.dart @@ -1,11 +1,13 @@ import 'package:go_router/go_router.dart'; import 'package:pweb/app/router/pages.dart'; +import 'package:pweb/app/router/page_params.dart'; import 'package:pweb/pages/2fa/page.dart'; -import 'package:pweb/pages/errors/not_found.dart'; -import 'package:pweb/pages/login/page.dart'; import 'package:pweb/pages/signup/page.dart'; -import 'package:pweb/app/router/payout_shell.dart'; +import 'package:pweb/pages/verification/page.dart'; +import 'package:pweb/widgets/sidebar/page.dart'; +import 'package:pweb/pages/login/page.dart'; +import 'package:pweb/pages/errors/not_found.dart'; GoRouter createRouter() => GoRouter( @@ -21,29 +23,31 @@ GoRouter createRouter() => GoRouter( path: routerPage(Pages.login), builder: (_, _) => const LoginPage(), ), + GoRoute( + name: Pages.dashboard.name, + path: routerPage(Pages.dashboard), + builder: (_, _) => const PageSelector(), + ), GoRoute( name: Pages.sfactor.name, path: routerPage(Pages.sfactor), - builder: (context, state) { - final isFromSignup = state.uri.queryParameters['from'] == 'signup'; - - return TwoFactorCodePage( - onVerificationSuccess: () { - if (isFromSignup) { - context.goNamed(Pages.login.name); - } else { - context.goNamed(Pages.dashboard.name); - } - }, - ); - }, + builder: (context, _) => TwoFactorCodePage( + onVerificationSuccess: () { + // trigger organization load + context.goNamed(Pages.dashboard.name); + }, + ), ), GoRoute( name: Pages.signup.name, path: routerPage(Pages.signup), builder: (_, _) => const SignUpPage(), ), - payoutShellRoute(), + GoRoute( + name: Pages.verify.name, + path: '${routerPage(Pages.verify)}${routerAddParam(PageParams.token)}', + builder: (_, state) => AccountVerificationPage(token: state.pathParameters[PageParams.token.name]!), + ), ], ), ], diff --git a/frontend/pweb/lib/pages/payment_methods/add/wallet.dart b/frontend/pweb/lib/pages/payment_methods/add/wallet.dart index b872cc2..ad25650 100644 --- a/frontend/pweb/lib/pages/payment_methods/add/wallet.dart +++ b/frontend/pweb/lib/pages/payment_methods/add/wallet.dart @@ -49,8 +49,7 @@ class _WalletFormState extends State { return; } - if (newData != null && - newData.walletId != _walletIdController.text) { + if (newData != null && newData != oldData) { _walletIdController.text = newData.walletId; } } @@ -68,4 +67,4 @@ class _WalletFormState extends State { validator: (val) => (val?.isEmpty ?? true) ? l10n.enterWalletId : null, ); } -} \ No newline at end of file +} diff --git a/frontend/pweb/lib/pages/payout_page/wallet/edit/buttons/send.dart b/frontend/pweb/lib/pages/payout_page/wallet/edit/buttons/send.dart index b875087..4232719 100644 --- a/frontend/pweb/lib/pages/payout_page/wallet/edit/buttons/send.dart +++ b/frontend/pweb/lib/pages/payout_page/wallet/edit/buttons/send.dart @@ -1,13 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - import 'package:provider/provider.dart'; -import 'package:pweb/app/router/payout_routes.dart'; import 'package:pweb/providers/page_selector.dart'; import 'package:pweb/providers/wallets.dart'; -import 'package:pweb/widgets/sidebar/destinations.dart'; import 'package:pweb/generated/i18n/app_localizations.dart'; @@ -30,7 +26,6 @@ class SendPayoutButton extends StatelessWidget { if (wallet != null) { pageSelectorProvider.startPaymentFromWallet(wallet); - context.go(payoutPath(PayoutDestination.payment)); } }, child: Text(loc.payoutNavSendPayout), diff --git a/frontend/pweb/lib/providers/page_selector.dart b/frontend/pweb/lib/providers/page_selector.dart index 473675f..c113eff 100644 --- a/frontend/pweb/lib/providers/page_selector.dart +++ b/frontend/pweb/lib/providers/page_selector.dart @@ -45,7 +45,6 @@ class PageSelectorProvider extends ChangeNotifier { } void selectPage(PayoutDestination dest) { - if (_selected == dest) return; _selected = dest; notifyListeners(); } @@ -96,7 +95,7 @@ class PageSelectorProvider extends ChangeNotifier { notifyListeners(); } - PayoutDestination goBackFromPayment() { + void goBackFromPayment() { _selected = _previousDestination ?? (_cameFromRecipientList ? PayoutDestination.recipients @@ -105,7 +104,6 @@ class PageSelectorProvider extends ChangeNotifier { _previousDestination = null; _cameFromRecipientList = false; notifyListeners(); - return _selected; } void goBackFromWalletEdit() { @@ -188,4 +186,4 @@ class PageSelectorProvider extends ChangeNotifier { Recipient? get selectedRecipient => recipientProvider?.selectedRecipient; Wallet? get selectedWallet => walletsProvider?.selectedWallet; -} \ No newline at end of file +} diff --git a/frontend/pweb/lib/widgets/sidebar/page.dart b/frontend/pweb/lib/widgets/sidebar/page.dart index 27f5851..fdba1e7 100644 --- a/frontend/pweb/lib/widgets/sidebar/page.dart +++ b/frontend/pweb/lib/widgets/sidebar/page.dart @@ -1,88 +1,122 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; - import 'package:provider/provider.dart'; -import 'package:pweb/app/router/pages.dart'; -import 'package:pweb/app/router/payout_routes.dart'; -import 'package:pweb/providers/account.dart'; +import 'package:pshared/models/resources.dart'; +import 'package:pshared/provider/permissions.dart'; + +import 'package:pweb/pages/address_book/form/page.dart'; +import 'package:pweb/pages/address_book/page/page.dart'; +import 'package:pweb/pages/loader.dart'; +import 'package:pweb/pages/payment_methods/page.dart'; +import 'package:pweb/pages/payout_page/page.dart'; +import 'package:pweb/pages/payout_page/wallet/edit/page.dart'; +import 'package:pweb/pages/report/page.dart'; +import 'package:pweb/pages/settings/profile/page.dart'; +import 'package:pweb/pages/dashboard/dashboard.dart'; import 'package:pweb/providers/page_selector.dart'; -import 'package:pweb/providers/permissions.dart'; +import 'package:pweb/utils/logout.dart'; import 'package:pweb/widgets/appbar/app_bar.dart'; import 'package:pweb/widgets/sidebar/destinations.dart'; import 'package:pweb/widgets/sidebar/sidebar.dart'; +import 'package:pweb/generated/i18n/app_localizations.dart'; + class PageSelector extends StatelessWidget { - final PayoutDestination selected; - final Widget child; - - const PageSelector({ - super.key, - required this.selected, - required this.child, - }); - - void _handleLogout(BuildContext context) { - context.read().logout(); - context.read().clear(); - navigateAndReplace(context, Pages.login); - } - - void _goToDestination(BuildContext context, PayoutDestination destination) { - context.go(payoutPath(destination)); - } + const PageSelector({super.key}); @override - Widget build(BuildContext context) { - final provider = context.watch(); - final permissions = context.watch(); - final account = context.watch().account; + Widget build(BuildContext context) => PageViewLoader( + child: Builder(builder: (BuildContext context) { + final permissions = context.watch(); + if (!permissions.isReady) return Center(child: CircularProgressIndicator()); - final allowedDestinations = permissions.isRecipient - ? { - PayoutDestination.settings, - PayoutDestination.methods, - PayoutDestination.editwallet, - } - : PayoutDestination.values.toSet(); + final provider = context.watch(); - final safeSelected = allowedDestinations.contains(selected) - ? selected - : (permissions.isRecipient ? PayoutDestination.settings : PayoutDestination.dashboard); + final loc = AppLocalizations.of(context)!; - if (safeSelected != selected) { - WidgetsBinding.instance.addPostFrameCallback((_) => _goToDestination(context, safeSelected)); - } + final bool restrictedAccess = !permissions.canRead(ResourceType.chainWallets); + final allowedDestinations = restrictedAccess + ? { + PayoutDestination.settings, + PayoutDestination.methods, + PayoutDestination.editwallet, + } + : PayoutDestination.values.toSet(); - if (provider.selected != safeSelected) { - WidgetsBinding.instance.addPostFrameCallback((_) => provider.selectPage(safeSelected)); - } + final selected = allowedDestinations.contains(provider.selected) + ? provider.selected + : (restrictedAccess ? PayoutDestination.settings : PayoutDestination.dashboard); - return Scaffold( - appBar: PayoutAppBar( - title: Text(safeSelected.localizedLabel(context)), - onAddFundsPressed: () {}, - onLogout: () => _handleLogout(context), - ), - body: Padding( - padding: const EdgeInsets.only(left: 200, top: 40, right: 200), - child: Row( - spacing: 40, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - PayoutSidebar( - selected: safeSelected, - onSelected: (destination) => _goToDestination(context, destination), - onLogout: () => _handleLogout(context), - userName: account?.name, - items: permissions.isRecipient - ? const [PayoutDestination.settings, PayoutDestination.methods] - : null, - ), - Expanded(child: child), - ], + if (selected != provider.selected) { + WidgetsBinding.instance.addPostFrameCallback((_) => provider.selectPage(selected)); + } + + Widget content; + switch (selected) { + case PayoutDestination.dashboard: + content = DashboardPage( + onRecipientSelected: (recipient) => provider.selectRecipient(recipient), + onGoToPaymentWithoutRecipient: provider.startPaymentWithoutRecipient, + ); + break; + + case PayoutDestination.recipients: + content = RecipientAddressBookPage( + onRecipientSelected: (recipient) => + provider.selectRecipient(recipient, fromList: true), + onAddRecipient: provider.goToAddRecipient, + onEditRecipient: provider.editRecipient, + ); + break; + + case PayoutDestination.addrecipient: + final recipient = provider.recipientProvider?.selectedRecipient; + content = AdressBookRecipientForm( + recipient: recipient, + onSaved: (_) => provider.selectPage(PayoutDestination.recipients), + ); + break; + + case PayoutDestination.payment: + content = PaymentPage( + onBack: (_) => provider.goBackFromPayment(), + ); + break; + + case PayoutDestination.settings: + content = ProfileSettingsPage(); + break; + + case PayoutDestination.reports: + content = OperationHistoryPage(); + break; + + case PayoutDestination.methods: + content = PaymentConfigPage( + onWalletTap: provider.selectWallet, + ); + break; + + case PayoutDestination.editwallet: + final wallet = provider.walletsProvider?.selectedWallet; + content = wallet != null + ? WalletEditPage( + onBack: provider.goBackFromWalletEdit, + ) + : Center(child: Text(loc.noWalletSelected)); + break; + + default: + content = Text(selected.name); + } + + return Scaffold( + appBar: PayoutAppBar( + title: Text(selected.localizedLabel(context)), + onAddFundsPressed: () {}, + onLogout: () => logoutUtil(context), ), body: Padding( padding: const EdgeInsets.only(left: 200, top: 40, right: 200),