succes message after reorder creation

This commit is contained in:
José Salazar
2026-01-28 15:27:25 -05:00
parent 74fc3afa1f
commit d488f542b5
2 changed files with 115 additions and 8 deletions

View File

@@ -34,10 +34,7 @@ class ClientHomeSheets {
builder: (BuildContext context) {
return ShiftOrderFormSheet(
initialData: initialData,
onSubmit: (Map<String, dynamic> data) {
Navigator.pop(context);
onSubmit(data);
},
onSubmit: onSubmit,
);
},
);

View File

@@ -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<ShiftOrderFormSheet> {
List<_VendorOption> _vendors = const <_VendorOption>[];
List<_RoleOption> _roles = const <_RoleOption>[];
String? _selectedVendorId;
bool _showSuccess = false;
Map<String, dynamic>? _submitData;
@override
void initState() {
@@ -189,7 +192,8 @@ class _ShiftOrderFormSheetState extends State<ShiftOrderFormSheet> {
}
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<ShiftOrderFormSheet> {
.shifts(fdc.AnyValue(<String>[shiftId]))
.execute();
widget.onSubmit(<String, dynamic>{
'orderId': orderId,
if (!mounted) return;
setState(() {
_submitData = <String, dynamic>{'orderId': orderId};
_showSuccess = true;
});
}
@@ -472,7 +478,17 @@ class _ShiftOrderFormSheetState extends State<ShiftOrderFormSheet> {
}
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<ShiftOrderFormSheet> {
@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<ShiftOrderFormSheet> {
);
}
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: <Color>[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>[
BoxShadow(
color: Colors.black.withValues(alpha: 0.2),
blurRadius: 20,
offset: const Offset(0, 10),
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
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 ?? <String, dynamic>{});
Navigator.pop(context);
},
size: UiButtonSize.large,
),
),
],
),
),
),
),
);
}
Widget _buildInlineTimeInput({
required String label,
required String value,