fix(ui): More shopinbit stuff, navigation fixes, styling, etc etc. Probably still a WIP
What changed, and why it matters
This commit is a routine user-interface refactor for a third-party shopping feature called ShopinBit. It replaces some desktop-specific popup dialog code with a shared navigation system, tweaks button layouts, and fixes styling. There is no clear security bug being patched, and no sensitive data handling or cryptographic code is changed.
No security action required. Treat as normal UI refactor; review for navigation regressions during QA if desired.
Security signals we found
No changes to cryptography, key storage, authentication, or network requests
No input validation or sanitization changes
No privilege checks or permission changes
No references to CVEs, security advisories, or bug bounty reports
Commit title and message describe UI/styling/navigation work only
Evidence from the diff
The diff refactors several ShopinBit Dart views to use a new SDialog/NestedNavigatorDialog wrapper on desktop instead of the older DesktopDialog plus rootNavigator pop/showDialog pattern. It registers new ShopinBit routes in the nested navigator route generator, adds type-checked argument validation, and makes minor layout adjustments (mainAxisSize, borderColor, button heights). The only functional change visible is unifying mobile and desktop navigation paths. No security-sensitive APIs, wallet logic, or network calls are modified.
Changed components
lib/pages/shopinbit/shopinbit_car_fee_view.dartlib/pages/shopinbit/shopinbit_car_research_payment_view.dartlib/pages/shopinbit/shopinbit_order_created.dartlib/pages/shopinbit/shopinbit_tickets_view.dartlib/pages/shopinbit/step_4_components/shopinbit_car_research_form.dartlib/pages/shopinbit/step_4_components/shopinbit_step4_submit.dartlib/widgets/dialogs/nested_navigator_dialog/nested_navigator_dialog_route_generator.dartlib/widgets/stack_dialog.dartInspect captured patch +400 / −379
diff --git a/lib/pages/shopinbit/shopinbit_car_fee_view.dart b/lib/pages/shopinbit/shopinbit_car_fee_view.dart
index 8692e3e..8186a66 100644
--- a/lib/pages/shopinbit/shopinbit_car_fee_view.dart
+++ b/lib/pages/shopinbit/shopinbit_car_fee_view.dart
@@ -20,9 +20,10 @@ import '../../utilities/text_styles.dart';
import '../../utilities/util.dart';
import '../../widgets/background.dart';
import '../../widgets/custom_buttons/app_bar_icon_button.dart';
-import '../../widgets/desktop/desktop_dialog.dart';
import '../../widgets/desktop/desktop_dialog_close_button.dart';
import '../../widgets/desktop/primary_button.dart';
+import '../../widgets/dialogs/nested_navigator_dialog/nested_navigator_dialog.dart';
+import '../../widgets/dialogs/s_dialog.dart';
import '../../widgets/rounded_white_container.dart';
import '../../widgets/textfields/adaptive_text_field.dart';
import '../more_view/services_view.dart';
@@ -286,25 +287,12 @@ class _ShopInBitCarFeeViewState extends ConsumerState<ShopInBitCarFeeView> {
if (!mounted) return;
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- unawaited(
- showDialog<void>(
- context: context,
- builder: (_) => ShopInBitCarResearchPaymentView(
- model: widget.model,
- invoice: invoice,
- ),
- ),
- );
- } else {
- unawaited(
- Navigator.of(context).pushNamed(
- ShopInBitCarResearchPaymentView.routeName,
- arguments: (widget.model, invoice),
- ),
- );
- }
+ unawaited(
+ Navigator.of(context).pushNamed(
+ ShopInBitCarResearchPaymentView.routeName,
+ arguments: (widget.model, invoice),
+ ),
+ );
} catch (e) {
if (mounted) {
setState(() => _submitting = false);
@@ -504,6 +492,7 @@ class _ShopInBitCarFeeViewState extends ConsumerState<ShopInBitCarFeeView> {
final spacing = SizedBox(height: isDesktop ? 16 : 12);
final content = Column(
+ mainAxisSize: .min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
@@ -514,6 +503,9 @@ class _ShopInBitCarFeeViewState extends ConsumerState<ShopInBitCarFeeView> {
),
SizedBox(height: isDesktop ? 16 : 8),
RoundedWhiteContainer(
+ borderColor: isDesktop
+ ? Theme.of(context).extension<StackColors>()!.textFieldDefaultBG
+ : null,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@@ -705,34 +697,41 @@ class _ShopInBitCarFeeViewState extends ConsumerState<ShopInBitCarFeeView> {
);
if (isDesktop) {
- return DesktopDialog(
- maxWidth: 580,
- maxHeight: 750,
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Padding(
- padding: const EdgeInsets.only(left: 32),
- child: Text(
- "ShopinBit",
- style: STextStyles.desktopH3(context),
+ return SDialog(
+ child: SizedBox(
+ width: 580,
+ child: Column(
+ mainAxisSize: .min,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Padding(
+ padding: const EdgeInsets.only(left: 32),
+ child: Text(
+ "ShopinBit",
+ style: STextStyles.desktopH3(context),
+ ),
),
+ DesktopDialogCloseButton(
+ onPressedOverride: () =>
+ NestedNavigatorDialog.of(context).close(),
+ ),
+ ],
+ ),
+ Flexible(
+ child: Padding(
+ padding: const .only(
+ left: 32,
+ right: 32,
+ bottom: 32,
+ top: 16,
+ ),
+ child: content,
),
- const DesktopDialogCloseButton(),
- ],
- ),
- Expanded(
- child: Padding(
- padding: const EdgeInsets.symmetric(
- horizontal: 32,
- vertical: 16,
- ),
- child: SingleChildScrollView(child: content),
),
- ),
- ],
+ ],
+ ),
),
);
}
diff --git a/lib/pages/shopinbit/shopinbit_car_research_payment_view.dart b/lib/pages/shopinbit/shopinbit_car_research_payment_view.dart
index 8ef075b..0d3d3a1 100644
--- a/lib/pages/shopinbit/shopinbit_car_research_payment_view.dart
+++ b/lib/pages/shopinbit/shopinbit_car_research_payment_view.dart
@@ -23,10 +23,10 @@ import '../../utilities/util.dart';
import '../../wallets/crypto_currency/crypto_currency.dart';
import '../../widgets/background.dart';
import '../../widgets/custom_buttons/app_bar_icon_button.dart';
-import '../../widgets/desktop/desktop_dialog.dart';
import '../../widgets/desktop/desktop_dialog_close_button.dart';
import '../../widgets/desktop/primary_button.dart';
import '../../widgets/desktop/secondary_button.dart';
+import '../../widgets/dialogs/s_dialog.dart';
import '../../widgets/qr.dart';
import '../../widgets/rounded_white_container.dart';
import '../../widgets/stack_dialog.dart';
@@ -407,22 +407,13 @@ class _ShopInBitCarResearchPaymentViewState
// Both steps already done: navigate to success directly.
if (!mounted) return;
setState(() => _flowState = _PaymentFlowState.complete);
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- unawaited(
- showDialog<void>(
- context: context,
- builder: (_) => ShopInBitOrderCreated(model: widget.model),
- ),
- );
- } else {
- unawaited(
- Navigator.of(context).pushNamed(
- ShopInBitOrderCreated.routeName,
- arguments: widget.model,
- ),
- );
- }
+
+ unawaited(
+ Navigator.of(
+ context,
+ ).pushNamed(ShopInBitOrderCreated.routeName, arguments: widget.model),
+ );
+
return;
}
// Fee logged; skip to createRequest.
@@ -495,22 +486,12 @@ class _ShopInBitCarResearchPaymentViewState
}
if (!mounted) return;
setState(() => _flowState = _PaymentFlowState.complete);
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- unawaited(
- showDialog<void>(
- context: context,
- builder: (_) => ShopInBitOrderCreated(model: widget.model),
- ),
- );
- } else {
- unawaited(
- Navigator.of(context).pushNamed(
- ShopInBitOrderCreated.routeName,
- arguments: widget.model,
- ),
- );
- }
+
+ unawaited(
+ Navigator.of(
+ context,
+ ).pushNamed(ShopInBitOrderCreated.routeName, arguments: widget.model),
+ );
} catch (e) {
if (mounted) {
setState(() => _flowState = _PaymentFlowState.error);
@@ -630,21 +611,11 @@ class _ShopInBitCarResearchPaymentViewState
if (!mounted) return;
setState(() => _flowState = _PaymentFlowState.complete);
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- unawaited(
- showDialog<void>(
- context: context,
- builder: (_) => ShopInBitOrderCreated(model: widget.model),
- ),
- );
- } else {
- unawaited(
- Navigator.of(
- context,
- ).pushNamed(ShopInBitOrderCreated.routeName, arguments: widget.model),
- );
- }
+ unawaited(
+ Navigator.of(
+ context,
+ ).pushNamed(ShopInBitOrderCreated.routeName, arguments: widget.model),
+ );
} catch (e) {
if (mounted) {
setState(() => _flowState = _PaymentFlowState.error);
@@ -719,21 +690,11 @@ class _ShopInBitCarResearchPaymentViewState
if (!mounted) return;
setState(() => _flowState = _PaymentFlowState.complete);
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- unawaited(
- showDialog<void>(
- context: context,
- builder: (_) => ShopInBitOrderCreated(model: widget.model),
- ),
- );
- } else {
- unawaited(
- Navigator.of(
- context,
- ).pushNamed(ShopInBitOrderCreated.routeName, arguments: widget.model),
- );
- }
+ unawaited(
+ Navigator.of(
+ context,
+ ).pushNamed(ShopInBitOrderCreated.routeName, arguments: widget.model),
+ );
} catch (e) {
if (mounted) {
setState(() => _flowState = _PaymentFlowState.error);
@@ -848,6 +809,7 @@ class _ShopInBitCarResearchPaymentViewState
final content = Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
+ mainAxisSize: .min,
children: [
Text(
"Car research payment",
@@ -987,34 +949,38 @@ class _ShopInBitCarResearchPaymentViewState
);
if (isDesktop) {
- return DesktopDialog(
- maxWidth: 580,
- maxHeight: 750,
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Padding(
- padding: const EdgeInsets.only(left: 32),
- child: Text(
- "ShopinBit",
- style: STextStyles.desktopH3(context),
+ return SDialog(
+ child: SizedBox(
+ width: 580,
+ child: Column(
+ mainAxisSize: .min,
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Padding(
+ padding: const EdgeInsets.only(left: 32),
+ child: Text(
+ "ShopinBit",
+ style: STextStyles.desktopH3(context),
+ ),
),
+ const DesktopDialogCloseButton(),
+ ],
+ ),
+ Flexible(
+ child: Padding(
+ padding: const .only(
+ left: 32,
+ right: 32,
+ bottom: 32,
+ top: 16,
+ ),
+ child: content,
),
- const DesktopDialogCloseButton(),
- ],
- ),
- Expanded(
- child: Padding(
- padding: const EdgeInsets.symmetric(
- horizontal: 32,
- vertical: 16,
- ),
- child: SingleChildScrollView(child: content),
),
- ),
- ],
+ ],
+ ),
),
);
}
diff --git a/lib/pages/shopinbit/shopinbit_order_created.dart b/lib/pages/shopinbit/shopinbit_order_created.dart
index e522e88..0f7f6f9 100644
--- a/lib/pages/shopinbit/shopinbit_order_created.dart
+++ b/lib/pages/shopinbit/shopinbit_order_created.dart
@@ -7,11 +7,13 @@ import '../../utilities/assets.dart';
import '../../utilities/text_styles.dart';
import '../../utilities/util.dart';
import '../../widgets/background.dart';
+import '../../widgets/conditional_parent.dart';
import '../../widgets/custom_buttons/app_bar_icon_button.dart';
-import '../../widgets/desktop/desktop_dialog.dart';
import '../../widgets/desktop/desktop_dialog_close_button.dart';
import '../../widgets/desktop/primary_button.dart';
import '../../widgets/desktop/secondary_button.dart';
+import '../../widgets/dialogs/nested_navigator_dialog/nested_navigator_dialog.dart';
+import '../../widgets/dialogs/s_dialog.dart';
import '../../widgets/rounded_white_container.dart';
import '../more_view/services_view.dart';
import 'shopinbit_ticket_detail.dart';
@@ -39,171 +41,204 @@ class ShopInBitOrderCreated extends StatelessWidget {
Widget build(BuildContext context) {
final isDesktop = Util.isDesktop;
- final content = Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- const Spacer(),
- SvgPicture.asset(
- Assets.svg.checkCircle,
- width: isDesktop ? 64 : 48,
- height: isDesktop ? 64 : 48,
- color: Theme.of(context).extension<StackColors>()!.accentColorGreen,
- ),
- SizedBox(height: isDesktop ? 24 : 16),
- Text(
- "Request created!",
- style: isDesktop
- ? STextStyles.desktopH2(context)
- : STextStyles.pageTitleH1(context),
- ),
- SizedBox(height: isDesktop ? 16 : 8),
- Text(
- "Your request has been submitted.",
- style: isDesktop
- ? STextStyles.desktopTextSmall(context)
- : STextStyles.itemSubtitle(context),
- textAlign: TextAlign.center,
- ),
- SizedBox(height: isDesktop ? 32 : 24),
- RoundedWhiteContainer(
+ return ConditionalParent(
+ condition: isDesktop,
+ builder: (child) => SDialog(
+ child: SizedBox(
+ width: 580,
child: Column(
+ mainAxisSize: .min,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
- Text(
- "Request ID",
- style: isDesktop
- ? STextStyles.desktopTextExtraExtraSmall(context)
- : STextStyles.itemSubtitle12(context),
+ Padding(
+ padding: const EdgeInsets.only(left: 32),
+ child: Text(
+ "ShopinBit",
+ style: STextStyles.desktopH3(context),
+ ),
),
- Text(
- model.ticketId ?? "N/A",
- style: isDesktop
- ? STextStyles.desktopTextSmall(context)
- : STextStyles.titleBold12(context),
+ DesktopDialogCloseButton(
+ onPressedOverride: () => NestedNavigatorDialog.of(
+ context,
+ ).close(args: const .noWarning()),
),
],
),
- SizedBox(height: isDesktop ? 12 : 8),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Text(
- "Status",
- style: isDesktop
- ? STextStyles.desktopTextExtraExtraSmall(context)
- : STextStyles.itemSubtitle12(context),
+ Flexible(
+ child: Padding(
+ padding: const EdgeInsets.only(
+ left: 32,
+ right: 32,
+ bottom: 32,
+ top: 16,
),
- Text(
- "Pending review",
- style: isDesktop
- ? STextStyles.desktopTextSmall(context)
- : STextStyles.titleBold12(context),
- ),
- ],
+ child: child,
+ ),
),
],
),
),
- const Spacer(),
- PrimaryButton(
- label: "View request",
- onPressed: () {
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- showDialog<void>(
- context: context,
+ ),
- builder: (_) => ShopInBitTicketDetail(model: model),
- );
- } else {
- Navigator.of(
+ child: ConditionalParent(
+ condition: !isDesktop,
+ builder: (child) => Background(
+ child: PopScope(
+ canPop: false,
+ onPopInvokedWithResult: (bool didPop, dynamic result) {
+ if (!didPop) {
+ _popToServices(context);
+ }
+ },
+ child: Scaffold(
+ backgroundColor: Theme.of(
context,
- ).pushNamed(ShopInBitTicketDetail.routeName, arguments: model);
- }
- },
- ),
- SizedBox(height: isDesktop ? 16 : 12),
- SecondaryButton(
- label: "Back to services",
- onPressed: () {
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- } else {
- _popToServices(context);
- }
- },
- ),
- ],
- );
-
- if (isDesktop) {
- return DesktopDialog(
- maxWidth: 580,
- maxHeight: 550,
- child: Column(
- children: [
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Padding(
- padding: const EdgeInsets.only(left: 32),
- child: Text(
- "ShopinBit",
- style: STextStyles.desktopH3(context),
- ),
+ ).extension<StackColors>()!.background,
+ appBar: AppBar(
+ leading: AppBarBackButton(
+ onPressed: () => _popToServices(context),
),
- const DesktopDialogCloseButton(),
- ],
- ),
- Expanded(
- child: Padding(
- padding: const EdgeInsets.symmetric(
- horizontal: 32,
- vertical: 16,
+ title: Text(
+ "ShopinBit",
+ style: STextStyles.navBarTitle(context),
+ ),
+ ),
+ body: SafeArea(
+ child: LayoutBuilder(
+ builder: (context, constraints) {
+ return Padding(
+ padding: const EdgeInsets.all(16),
+ child: SingleChildScrollView(
+ child: ConstrainedBox(
+ constraints: BoxConstraints(
+ minHeight: constraints.maxHeight - 32,
+ ),
+ child: IntrinsicHeight(child: child),
+ ),
+ ),
+ );
+ },
),
- child: content,
),
),
- ],
- ),
- );
- }
-
- return Background(
- child: PopScope(
- canPop: false,
- onPopInvokedWithResult: (bool didPop, dynamic result) {
- if (!didPop) {
- _popToServices(context);
- }
- },
- child: Scaffold(
- backgroundColor: Theme.of(
- context,
- ).extension<StackColors>()!.background,
- appBar: AppBar(
- leading: AppBarBackButton(onPressed: () => _popToServices(context)),
- title: Text("ShopinBit", style: STextStyles.navBarTitle(context)),
),
- body: SafeArea(
- child: LayoutBuilder(
- builder: (context, constraints) {
- return Padding(
- padding: const EdgeInsets.all(16),
- child: SingleChildScrollView(
- child: ConstrainedBox(
- constraints: BoxConstraints(
- minHeight: constraints.maxHeight - 32,
+ ),
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ if (!isDesktop) const Spacer(),
+ SvgPicture.asset(
+ Assets.svg.checkCircle,
+ width: isDesktop ? 64 : 48,
+ height: isDesktop ? 64 : 48,
+ color: Theme.of(
+ context,
+ ).extension<StackColors>()!.accentColorGreen,
+ ),
+ SizedBox(height: isDesktop ? 24 : 16),
+ Text(
+ "Request created!",
+ style: isDesktop
+ ? STextStyles.desktopH2(context)
+ : STextStyles.pageTitleH1(context),
+ ),
+ SizedBox(height: isDesktop ? 16 : 8),
+ Text(
+ "Your request has been submitted.",
+ style: isDesktop
+ ? STextStyles.desktopTextSmall(context)
+ : STextStyles.itemSubtitle(context),
+ textAlign: TextAlign.center,
+ ),
+ SizedBox(height: isDesktop ? 32 : 24),
+ RoundedWhiteContainer(
+ child: Column(
+ children: [
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ "Request ID",
+ style: isDesktop
+ ? STextStyles.desktopTextExtraExtraSmall(context)
+ : STextStyles.itemSubtitle12(context),
),
- child: IntrinsicHeight(child: content),
- ),
+ Text(
+ model.ticketId ?? "N/A",
+ style: isDesktop
+ ? STextStyles.desktopTextSmall(context)
+ : STextStyles.titleBold12(context),
+ ),
+ ],
+ ),
+ SizedBox(height: isDesktop ? 12 : 8),
+ Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ "Status",
+ style: isDesktop
+ ? STextStyles.desktopTextExtraExtraSmall(context)
+ : STextStyles.itemSubtitle12(context),
+ ),
+ Text(
+ "Pending review",
+ style: isDesktop
+ ? STextStyles.desktopTextSmall(context)
+ : STextStyles.titleBold12(context),
+ ),
+ ],
),
- );
- },
+ ],
+ ),
),
- ),
+ isDesktop ? const SizedBox(height: 40) : const Spacer(),
+ BranchedParent(
+ condition: isDesktop,
+ conditionBranchBuilder: (children) => Row(
+ children: [
+ Expanded(child: children[2]),
+ children[1],
+ Expanded(child: children[0]),
+ ],
+ ),
+ otherBranchBuilder: (children) => Column(
+ crossAxisAlignment: .stretch,
+ mainAxisSize: .min,
+ children: children,
+ ),
+ children: [
+ PrimaryButton(
+ label: "View request",
+ buttonHeight: isDesktop ? .l : null,
+ onPressed: () {
+ Navigator.of(context).pushNamed(
+ ShopInBitTicketDetail.routeName,
+ arguments: model,
+ );
+ },
+ ),
+ const SizedBox(height: 16, width: 24),
+ SecondaryButton(
+ label: "Back to services",
+ buttonHeight: isDesktop ? .l : null,
+ onPressed: () {
+ if (Util.isDesktop) {
+ DesktopDialogCloseButton(
+ onPressedOverride: () => NestedNavigatorDialog.of(
+ context,
+ ).close(args: const .noWarning()),
+ );
+ } else {
+ _popToServices(context);
+ }
+ },
+ ),
+ ],
+ ),
+ ],
),
),
);
diff --git a/lib/pages/shopinbit/shopinbit_tickets_view.dart b/lib/pages/shopinbit/shopinbit_tickets_view.dart
index 3b4daa7..71445ae 100644
--- a/lib/pages/shopinbit/shopinbit_tickets_view.dart
+++ b/lib/pages/shopinbit/shopinbit_tickets_view.dart
@@ -92,32 +92,16 @@ class _ShopInBitTicketsViewState extends ConsumerState<ShopInBitTicketsView> {
expiresAt: expiresAt,
paymentLinks: links,
);
- if (isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- showDialog<void>(
- context: context,
- builder: (_) =>
- ShopInBitCarResearchPaymentView(model: model, invoice: invoice),
- );
- } else {
- Navigator.of(context).pushNamed(
- ShopInBitCarResearchPaymentView.routeName,
- arguments: (model, invoice),
- );
- }
+
+ Navigator.of(context).pushNamed(
+ ShopInBitCarResearchPaymentView.routeName,
+ arguments: (model, invoice),
+ );
} else {
// Invoice expired: navigate to fee view.
- if (isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- showDialog<void>(
- context: context,
- builder: (_) => ShopInBitCarFeeView(model: model),
- );
- } else {
- Navigator.of(
- context,
- ).pushNamed(ShopInBitCarFeeView.routeName, arguments: model);
- }
+ Navigator.of(
+ context,
+ ).pushNamed(ShopInBitCarFeeView.routeName, arguments: model);
}
}
diff --git a/lib/pages/shopinbit/step_4_components/shopinbit_car_research_form.dart b/lib/pages/shopinbit/step_4_components/shopinbit_car_research_form.dart
index 2648696..0cb6511 100644
--- a/lib/pages/shopinbit/step_4_components/shopinbit_car_research_form.dart
+++ b/lib/pages/shopinbit/step_4_components/shopinbit_car_research_form.dart
@@ -11,7 +11,10 @@ import "../../../themes/stack_colors.dart";
import "../../../utilities/assets.dart";
import "../../../utilities/text_styles.dart";
import "../../../utilities/util.dart";
+import "../../../widgets/desktop/primary_button.dart";
+import "../../../widgets/desktop/secondary_button.dart";
import "../../../widgets/rounded_white_container.dart";
+import "../../../widgets/stack_dialog.dart";
import "../../../widgets/textfields/adaptive_text_field.dart";
import "../shopinbit_car_fee_view.dart";
import "../shopinbit_tickets_view.dart";
@@ -136,22 +139,22 @@ class _ShopInBitCarResearchFormState
final bool? resumePrevious = await showDialog<bool>(
context: context,
barrierDismissible: false,
- builder: (ctx) => AlertDialog(
- title: const Text("In-Progress Car Research"),
- content: const Text(
- "You have an unfinished car research payment. "
- "Would you like to resume it or start a new search?",
+ builder: (context) => StackDialog(
+ width: Util.isDesktop ? 500 : null,
+ title: "In-Progress Car Research",
+ message:
+ "You have an unfinished car research payment. "
+ "Would you like to resume it or start a new search?",
+ leftButton: SecondaryButton(
+ label: "New",
+ buttonHeight: Util.isDesktop ? .l : null,
+ onPressed: Navigator.of(context).pop,
+ ),
+ rightButton: PrimaryButton(
+ label: "Resume",
+ buttonHeight: Util.isDesktop ? .l : null,
+ onPressed: () => Navigator.of(context).pop(true),
),
- actions: [
- TextButton(
- onPressed: () => Navigator.of(ctx).pop(true),
- child: const Text("Resume Previous"),
- ),
- TextButton(
- onPressed: () => Navigator.of(ctx).pop(false),
- child: const Text("Start New"),
- ),
- ],
),
);
@@ -168,21 +171,11 @@ class _ShopInBitCarResearchFormState
if (!mounted) return;
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- unawaited(
- showDialog<void>(
- context: context,
- builder: (_) => ShopInBitCarFeeView(model: widget.model),
- ),
- );
- } else {
- unawaited(
- Navigator.of(
- context,
- ).pushNamed(ShopInBitCarFeeView.routeName, arguments: widget.model),
- );
- }
+ unawaited(
+ Navigator.of(
+ context,
+ ).pushNamed(ShopInBitCarFeeView.routeName, arguments: widget.model),
+ );
} finally {
if (mounted) setState(() => _submitting = false);
}
diff --git a/lib/pages/shopinbit/step_4_components/shopinbit_step4_submit.dart b/lib/pages/shopinbit/step_4_components/shopinbit_step4_submit.dart
index 567a5c5..9e0eeda 100644
--- a/lib/pages/shopinbit/step_4_components/shopinbit_step4_submit.dart
+++ b/lib/pages/shopinbit/step_4_components/shopinbit_step4_submit.dart
@@ -6,7 +6,6 @@ import "../../../db/drift/shared_db/shared_database.dart";
import "../../../models/shopinbit/shopinbit_order_model.dart";
import "../../../notifications/show_flush_bar.dart";
import "../../../services/shopinbit/shopinbit_service.dart";
-import "../../../utilities/util.dart";
import "../shopinbit_order_created.dart";
/// Submits a ShopinBit request to the API and navigates to the order-created
@@ -70,21 +69,12 @@ Future<void> submitShopInBitRequest(
.insertOnConflictUpdate(model.toCompanion());
if (!context.mounted) return;
- if (Util.isDesktop) {
- Navigator.of(context, rootNavigator: true).pop();
- unawaited(
- showDialog<void>(
- context: context,
- builder: (_) => ShopInBitOrderCreated(model: model),
- ),
- );
- } else {
- unawaited(
- Navigator.of(
- context,
- ).pushNamed(ShopInBitOrderCreated.routeName, arguments: model),
- );
- }
+
+ unawaited(
+ Navigator.of(
+ context,
+ ).pushNamed(ShopInBitOrderCreated.routeName, arguments: model),
+ );
} catch (e) {
if (context.mounted) {
unawaited(
diff --git a/lib/widgets/dialogs/nested_navigator_dialog/nested_navigator_dialog_route_generator.dart b/lib/widgets/dialogs/nested_navigator_dialog/nested_navigator_dialog_route_generator.dart
index 1b7567c..235aca4 100644
--- a/lib/widgets/dialogs/nested_navigator_dialog/nested_navigator_dialog_route_generator.dart
+++ b/lib/widgets/dialogs/nested_navigator_dialog/nested_navigator_dialog_route_generator.dart
@@ -7,6 +7,9 @@ import '../../../pages/cakepay/cakepay_card_detail_view.dart';
import '../../../pages/cakepay/cakepay_order_view.dart';
import '../../../pages/cakepay/cakepay_orders_view.dart';
import '../../../pages/cakepay/cakepay_vendors_view.dart';
+import '../../../pages/shopinbit/shopinbit_car_fee_view.dart';
+import '../../../pages/shopinbit/shopinbit_car_research_payment_view.dart';
+import '../../../pages/shopinbit/shopinbit_order_created.dart';
import '../../../pages/shopinbit/shopinbit_step_1.dart';
import '../../../pages/shopinbit/shopinbit_step_2.dart';
import '../../../pages/shopinbit/shopinbit_step_3.dart';
@@ -16,6 +19,7 @@ import '../../../pages/shopinbit/shopinbit_tickets_view.dart';
import '../../../pages_desktop_specific/services/shopin_bit/sub_widgets/desktop_shopin_bit_first_run.dart';
import '../../../services/cakepay/src/models/card.dart';
import '../../../services/cakepay/src/models/order.dart';
+import '../../../services/shopinbit/src/models/models.dart';
import '../../../utilities/text_styles.dart';
import '../../../utilities/util.dart';
import '../../conditional_parent.dart';
@@ -107,6 +111,48 @@ abstract final class NestedNavigatorDialogRouteGenerator {
settings: RouteSettings(name: settings.name),
);
+ case ShopInBitOrderCreated.routeName:
+ if (args is ShopInBitOrderModel) {
+ return getRoute(
+ builder: (_) => ShopInBitOrderCreated(model: args),
+ settings: RouteSettings(name: settings.name),
+ );
+ }
+ return _routeError(
+ "${settings.name} invalid args\n"
+ "Got ${args.runtimeType}\n"
+ "Expected ShopInBitOrderModel",
+ );
+
+ case ShopInBitCarFeeView.routeName:
+ if (args is ShopInBitOrderModel) {
+ return getRoute(
+ builder: (_) => ShopInBitCarFeeView(model: args),
+ settings: RouteSettings(name: settings.name),
+ );
+ }
+ return _routeError(
+ "${settings.name} invalid args\n"
+ "Got ${args.runtimeType}\n"
+ "Expected ShopInBitOrderModel",
+ );
+
+ case ShopInBitCarResearchPaymentView.routeName:
+ if (args is (ShopInBitOrderModel, CarResearchInvoice)) {
+ return getRoute(
+ builder: (_) => ShopInBitCarResearchPaymentView(
+ model: args.$1,
+ invoice: args.$2,
+ ),
+ settings: RouteSettings(name: settings.name),
+ );
+ }
+ return _routeError(
+ "${settings.name} invalid args\n"
+ "Got ${args.runtimeType}\n"
+ "Expected ({ShopInBitOrderModel model, CarResearchInvoice invoice})",
+ );
+
case ShopInBitTicketDetail.routeName:
if (args is ShopInBitOrderModel) {
return getRoute(
@@ -223,7 +269,7 @@ abstract final class NestedNavigatorDialogRouteGenerator {
],
),
),
- child: Text(
+ child: SelectableText(
"Error handling route, this is not supposed to happen. "
"Contact developers.\n$message",
),
diff --git a/lib/widgets/stack_dialog.dart b/lib/widgets/stack_dialog.dart
index 2c56aa7..d4ee9a7 100644
--- a/lib/widgets/stack_dialog.dart
+++ b/lib/widgets/stack_dialog.dart
@@ -20,12 +20,15 @@ class StackDialogBase extends StatelessWidget {
this.child,
this.padding = const EdgeInsets.all(24),
this.keyboardPaddingAmount = 0,
+ this.width,
});
final EdgeInsets padding;
final Widget? child;
final double keyboardPaddingAmount;
+ final double? width;
+
@override
Widget build(BuildContext context) {
return SafeArea(
@@ -37,22 +40,25 @@ class StackDialogBase extends StatelessWidget {
bottom: 16 + keyboardPaddingAmount,
),
child: Column(
- mainAxisAlignment:
- !Util.isDesktop
- ? MainAxisAlignment.end
- : MainAxisAlignment.center,
+ mainAxisAlignment: !Util.isDesktop
+ ? MainAxisAlignment.end
+ : MainAxisAlignment.center,
children: [
Flexible(
- child: SingleChildScrollView(
- child: Material(
- borderRadius: BorderRadius.circular(20),
- child: Container(
- decoration: BoxDecoration(
- color:
- Theme.of(context).extension<StackColors>()!.popupBG,
- borderRadius: BorderRadius.circular(20),
+ child: SizedBox(
+ width: width,
+ child: SingleChildScrollView(
+ child: Material(
+ borderRadius: BorderRadius.circular(20),
+ child: Container(
+ decoration: BoxDecoration(
+ color: Theme.of(
+ context,
+ ).extension<StackColors>()!.popupBG,
+ borderRadius: BorderRadius.circular(20),
+ ),
+ child: Padding(padding: padding, child: child),
),
- child: Padding(padding: padding, child: child),
),
),
),
@@ -72,6 +78,7 @@ class StackDialog extends StatelessWidget {
this.icon,
required this.title,
this.message,
+ this.width,
});
final Widget? leftButton;
@@ -82,9 +89,12 @@ class StackDialog extends StatelessWidget {
final String title;
final String? message;
+ final double? width;
+
@override
Widget build(BuildContext context) {
return StackDialogBase(
+ width: width,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -119,7 +129,9 @@ class StackDialog extends StatelessWidget {
leftButton == null
? const Spacer()
: Expanded(child: leftButton!),
- const SizedBox(width: 8),
+ Util.isDesktop
+ ? const SizedBox(width: 16)
+ : const SizedBox(width: 8),
rightButton == null
? const Spacer()
: Expanded(child: rightButton!),
@@ -199,26 +211,22 @@ class StackOkDialog extends StatelessWidget {
const SizedBox(width: 8),
Expanded(
child: TextButton(
- onPressed:
- !Util.isDesktop
- ? () {
- Navigator.of(context).pop();
- onOkPressed?.call("OK");
+ onPressed: !Util.isDesktop
+ ? () {
+ Navigator.of(context).pop();
+ onOkPressed?.call("OK");
+ }
+ : () {
+ if (desktopPopRootNavigator) {
+ Navigator.of(context, rootNavigator: true).pop();
+ } else {
+ int count = 0;
+ Navigator.of(
+ context,
+ ).popUntil((_) => count++ >= 2);
+ // onOkPressed?.call("OK");
}
- : () {
- if (desktopPopRootNavigator) {
- Navigator.of(
- context,
- rootNavigator: true,
- ).pop();
- } else {
- int count = 0;
- Navigator.of(
- context,
- ).popUntil((_) => count++ >= 2);
- // onOkPressed?.call("OK");
- }
- },
+ },
style: Theme.of(context)
.extension<StackColors>()!
.getPrimaryEnabledButtonStyle(context),
Why this scored 18/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.