Revert "Merge branch 'devKA' into devka (resolve conflicts)"
Some checks are pending
ci/woodpecker/push/bump_version Pipeline is pending
ci/woodpecker/push/fx_oracle Pipeline is pending
ci/woodpecker/push/ledger Pipeline is pending
ci/woodpecker/push/nats Pipeline is pending
ci/woodpecker/push/notification Pipeline is pending
ci/woodpecker/push/payments_orchestrator Pipeline is pending
ci/woodpecker/push/billing_fees Pipeline was successful
ci/woodpecker/push/bff Pipeline was successful
ci/woodpecker/push/db Pipeline was successful
ci/woodpecker/push/frontend Pipeline is running
ci/woodpecker/push/chain_gateway Pipeline was successful
ci/woodpecker/push/fx_ingestor Pipeline is running

This reverts commit 5f4184760d, reversing
changes made to 5e1da9617f.

Reverting changes on main
This commit is contained in:
Arseni
2025-12-04 15:38:01 +03:00
parent 5f4184760d
commit 3b04753f4e
7 changed files with 126 additions and 308 deletions

View File

@@ -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<MapEntry<PayoutDestination, String>> _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)),
];

View File

@@ -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<PageSelectorProvider>();
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<PageSelectorProvider>();
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<PageSelectorProvider>();
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<PageSelectorProvider>();
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<PageSelectorProvider>();
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<PageSelectorProvider>();
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));
},
),
);
},
),
],
);

View File

@@ -1,11 +1,13 @@
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:pweb/app/router/pages.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/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/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( GoRouter createRouter() => GoRouter(
@@ -21,29 +23,31 @@ GoRouter createRouter() => GoRouter(
path: routerPage(Pages.login), path: routerPage(Pages.login),
builder: (_, _) => const LoginPage(), builder: (_, _) => const LoginPage(),
), ),
GoRoute(
name: Pages.dashboard.name,
path: routerPage(Pages.dashboard),
builder: (_, _) => const PageSelector(),
),
GoRoute( GoRoute(
name: Pages.sfactor.name, name: Pages.sfactor.name,
path: routerPage(Pages.sfactor), path: routerPage(Pages.sfactor),
builder: (context, state) { builder: (context, _) => TwoFactorCodePage(
final isFromSignup = state.uri.queryParameters['from'] == 'signup'; onVerificationSuccess: () {
// trigger organization load
return TwoFactorCodePage( context.goNamed(Pages.dashboard.name);
onVerificationSuccess: () { },
if (isFromSignup) { ),
context.goNamed(Pages.login.name);
} else {
context.goNamed(Pages.dashboard.name);
}
},
);
},
), ),
GoRoute( GoRoute(
name: Pages.signup.name, name: Pages.signup.name,
path: routerPage(Pages.signup), path: routerPage(Pages.signup),
builder: (_, _) => const SignUpPage(), 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]!),
),
], ],
), ),
], ],

View File

@@ -49,8 +49,7 @@ class _WalletFormState extends State<WalletForm> {
return; return;
} }
if (newData != null && if (newData != null && newData != oldData) {
newData.walletId != _walletIdController.text) {
_walletIdController.text = newData.walletId; _walletIdController.text = newData.walletId;
} }
} }
@@ -68,4 +67,4 @@ class _WalletFormState extends State<WalletForm> {
validator: (val) => (val?.isEmpty ?? true) ? l10n.enterWalletId : null, validator: (val) => (val?.isEmpty ?? true) ? l10n.enterWalletId : null,
); );
} }
} }

View File

@@ -1,13 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.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/page_selector.dart';
import 'package:pweb/providers/wallets.dart'; import 'package:pweb/providers/wallets.dart';
import 'package:pweb/widgets/sidebar/destinations.dart';
import 'package:pweb/generated/i18n/app_localizations.dart'; import 'package:pweb/generated/i18n/app_localizations.dart';
@@ -30,7 +26,6 @@ class SendPayoutButton extends StatelessWidget {
if (wallet != null) { if (wallet != null) {
pageSelectorProvider.startPaymentFromWallet(wallet); pageSelectorProvider.startPaymentFromWallet(wallet);
context.go(payoutPath(PayoutDestination.payment));
} }
}, },
child: Text(loc.payoutNavSendPayout), child: Text(loc.payoutNavSendPayout),

View File

@@ -45,7 +45,6 @@ class PageSelectorProvider extends ChangeNotifier {
} }
void selectPage(PayoutDestination dest) { void selectPage(PayoutDestination dest) {
if (_selected == dest) return;
_selected = dest; _selected = dest;
notifyListeners(); notifyListeners();
} }
@@ -96,7 +95,7 @@ class PageSelectorProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
PayoutDestination goBackFromPayment() { void goBackFromPayment() {
_selected = _previousDestination ?? _selected = _previousDestination ??
(_cameFromRecipientList (_cameFromRecipientList
? PayoutDestination.recipients ? PayoutDestination.recipients
@@ -105,7 +104,6 @@ class PageSelectorProvider extends ChangeNotifier {
_previousDestination = null; _previousDestination = null;
_cameFromRecipientList = false; _cameFromRecipientList = false;
notifyListeners(); notifyListeners();
return _selected;
} }
void goBackFromWalletEdit() { void goBackFromWalletEdit() {
@@ -188,4 +186,4 @@ class PageSelectorProvider extends ChangeNotifier {
Recipient? get selectedRecipient => recipientProvider?.selectedRecipient; Recipient? get selectedRecipient => recipientProvider?.selectedRecipient;
Wallet? get selectedWallet => walletsProvider?.selectedWallet; Wallet? get selectedWallet => walletsProvider?.selectedWallet;
} }

View File

@@ -1,88 +1,122 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:pweb/app/router/pages.dart'; import 'package:pshared/models/resources.dart';
import 'package:pweb/app/router/payout_routes.dart'; import 'package:pshared/provider/permissions.dart';
import 'package:pweb/providers/account.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/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/appbar/app_bar.dart';
import 'package:pweb/widgets/sidebar/destinations.dart'; import 'package:pweb/widgets/sidebar/destinations.dart';
import 'package:pweb/widgets/sidebar/sidebar.dart'; import 'package:pweb/widgets/sidebar/sidebar.dart';
import 'package:pweb/generated/i18n/app_localizations.dart';
class PageSelector extends StatelessWidget { class PageSelector extends StatelessWidget {
final PayoutDestination selected; const PageSelector({super.key});
final Widget child;
const PageSelector({
super.key,
required this.selected,
required this.child,
});
void _handleLogout(BuildContext context) {
context.read<AccountProvider>().logout();
context.read<PermissionsProvider>().clear();
navigateAndReplace(context, Pages.login);
}
void _goToDestination(BuildContext context, PayoutDestination destination) {
context.go(payoutPath(destination));
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) => PageViewLoader(
final provider = context.watch<PageSelectorProvider>(); child: Builder(builder: (BuildContext context) {
final permissions = context.watch<PermissionsProvider>(); final permissions = context.watch<PermissionsProvider>();
final account = context.watch<AccountProvider>().account; if (!permissions.isReady) return Center(child: CircularProgressIndicator());
final allowedDestinations = permissions.isRecipient final provider = context.watch<PageSelectorProvider>();
? <PayoutDestination>{
PayoutDestination.settings,
PayoutDestination.methods,
PayoutDestination.editwallet,
}
: PayoutDestination.values.toSet();
final safeSelected = allowedDestinations.contains(selected) final loc = AppLocalizations.of(context)!;
? selected
: (permissions.isRecipient ? PayoutDestination.settings : PayoutDestination.dashboard);
if (safeSelected != selected) { final bool restrictedAccess = !permissions.canRead(ResourceType.chainWallets);
WidgetsBinding.instance.addPostFrameCallback((_) => _goToDestination(context, safeSelected)); final allowedDestinations = restrictedAccess
} ? <PayoutDestination>{
PayoutDestination.settings,
PayoutDestination.methods,
PayoutDestination.editwallet,
}
: PayoutDestination.values.toSet();
if (provider.selected != safeSelected) { final selected = allowedDestinations.contains(provider.selected)
WidgetsBinding.instance.addPostFrameCallback((_) => provider.selectPage(safeSelected)); ? provider.selected
} : (restrictedAccess ? PayoutDestination.settings : PayoutDestination.dashboard);
return Scaffold( if (selected != provider.selected) {
appBar: PayoutAppBar( WidgetsBinding.instance.addPostFrameCallback((_) => provider.selectPage(selected));
title: Text(safeSelected.localizedLabel(context)), }
onAddFundsPressed: () {},
onLogout: () => _handleLogout(context), Widget content;
), switch (selected) {
body: Padding( case PayoutDestination.dashboard:
padding: const EdgeInsets.only(left: 200, top: 40, right: 200), content = DashboardPage(
child: Row( onRecipientSelected: (recipient) => provider.selectRecipient(recipient),
spacing: 40, onGoToPaymentWithoutRecipient: provider.startPaymentWithoutRecipient,
crossAxisAlignment: CrossAxisAlignment.start, );
children: [ break;
PayoutSidebar(
selected: safeSelected, case PayoutDestination.recipients:
onSelected: (destination) => _goToDestination(context, destination), content = RecipientAddressBookPage(
onLogout: () => _handleLogout(context), onRecipientSelected: (recipient) =>
userName: account?.name, provider.selectRecipient(recipient, fromList: true),
items: permissions.isRecipient onAddRecipient: provider.goToAddRecipient,
? const [PayoutDestination.settings, PayoutDestination.methods] onEditRecipient: provider.editRecipient,
: null, );
), break;
Expanded(child: child),
], 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( body: Padding(
padding: const EdgeInsets.only(left: 200, top: 40, right: 200), padding: const EdgeInsets.only(left: 200, top: 40, right: 200),