diff --git a/apps/mobile/packages/features/client/home/lib/src/presentation/navigation/client_home_navigator.dart b/apps/mobile/packages/features/client/home/lib/src/presentation/navigation/client_home_navigator.dart index 1c421a36..afb166e3 100644 --- a/apps/mobile/packages/features/client/home/lib/src/presentation/navigation/client_home_navigator.dart +++ b/apps/mobile/packages/features/client/home/lib/src/presentation/navigation/client_home_navigator.dart @@ -34,10 +34,7 @@ class ClientHomeSheets { builder: (BuildContext context) { return ShiftOrderFormSheet( initialData: initialData, - onSubmit: (Map data) { - Navigator.pop(context); - onSubmit(data); - }, + onSubmit: onSubmit, ); }, ); diff --git a/apps/mobile/packages/features/client/home/lib/src/presentation/widgets/shift_order_form_sheet.dart b/apps/mobile/packages/features/client/home/lib/src/presentation/widgets/shift_order_form_sheet.dart index 7df94dfd..79bb6d9f 100644 --- a/apps/mobile/packages/features/client/home/lib/src/presentation/widgets/shift_order_form_sheet.dart +++ b/apps/mobile/packages/features/client/home/lib/src/presentation/widgets/shift_order_form_sheet.dart @@ -1,3 +1,4 @@ +import 'package:core_localization/core_localization.dart'; import 'package:design_system/design_system.dart'; import 'package:firebase_data_connect/firebase_data_connect.dart' as fdc; import 'package:flutter/material.dart'; @@ -59,6 +60,8 @@ class _ShiftOrderFormSheetState extends State { List<_VendorOption> _vendors = const <_VendorOption>[]; List<_RoleOption> _roles = const <_RoleOption>[]; String? _selectedVendorId; + bool _showSuccess = false; + Map? _submitData; @override void initState() { @@ -189,7 +192,8 @@ class _ShiftOrderFormSheetState extends State { } final DateTime date = DateTime.parse(_dateController.text); - final fdc.Timestamp orderTimestamp = _toTimestamp(date); + final DateTime dateOnly = DateTime.utc(date.year, date.month, date.day); + final fdc.Timestamp orderTimestamp = _toTimestamp(dateOnly); final dc.OrderType orderType = _orderTypeFromValue(widget.initialData?['type']?.toString()); @@ -270,8 +274,10 @@ class _ShiftOrderFormSheetState extends State { .shifts(fdc.AnyValue([shiftId])) .execute(); - widget.onSubmit({ - 'orderId': orderId, + if (!mounted) return; + setState(() { + _submitData = {'orderId': orderId}; + _showSuccess = true; }); } @@ -472,7 +478,17 @@ class _ShiftOrderFormSheetState extends State { } fdc.Timestamp _toTimestamp(DateTime date) { - final int millis = date.millisecondsSinceEpoch; + final DateTime utc = DateTime.utc( + date.year, + date.month, + date.day, + date.hour, + date.minute, + date.second, + date.millisecond, + date.microsecond, + ); + final int millis = utc.millisecondsSinceEpoch; final int seconds = millis ~/ 1000; final int nanos = (millis % 1000) * 1000000; return fdc.Timestamp(nanos, seconds); @@ -480,6 +496,16 @@ class _ShiftOrderFormSheetState extends State { @override Widget build(BuildContext context) { + if (_showSuccess) { + final TranslationsClientCreateOrderOneTimeEn labels = + t.client_create_order.one_time; + return _buildSuccessView( + title: labels.success_title, + message: labels.success_message, + buttonLabel: labels.back_to_orders, + ); + } + return Container( height: MediaQuery.of(context).size.height * 0.95, decoration: const BoxDecoration( @@ -1109,6 +1135,90 @@ class _ShiftOrderFormSheetState extends State { ); } + Widget _buildSuccessView({ + required String title, + required String message, + required String buttonLabel, + }) { + return Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.95, + decoration: const BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [UiColors.primary, UiColors.buttonPrimaryHover], + ), + borderRadius: BorderRadius.vertical(top: Radius.circular(24)), + ), + child: SafeArea( + child: Center( + child: Container( + margin: const EdgeInsets.symmetric(horizontal: 40), + padding: const EdgeInsets.all(UiConstants.space8), + decoration: BoxDecoration( + color: UiColors.white, + borderRadius: UiConstants.radiusLg * 1.5, + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.2), + blurRadius: 20, + offset: const Offset(0, 10), + ), + ], + ), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 64, + height: 64, + decoration: const BoxDecoration( + color: UiColors.accent, + shape: BoxShape.circle, + ), + child: const Center( + child: Icon( + UiIcons.check, + color: UiColors.black, + size: 32, + ), + ), + ), + const SizedBox(height: UiConstants.space6), + Text( + title, + style: UiTypography.headline2m.textPrimary, + textAlign: TextAlign.center, + ), + const SizedBox(height: UiConstants.space3), + Text( + message, + textAlign: TextAlign.center, + style: UiTypography.body2r.textSecondary.copyWith( + height: 1.5, + ), + ), + const SizedBox(height: UiConstants.space8), + SizedBox( + width: double.infinity, + child: UiButton.primary( + text: buttonLabel, + onPressed: () { + widget.onSubmit(_submitData ?? {}); + Navigator.pop(context); + }, + size: UiButtonSize.large, + ), + ), + ], + ), + ), + ), + ), + ); + } + Widget _buildInlineTimeInput({ required String label, required String value,