diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/bloc/clock_in/clock_in_bloc.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/bloc/clock_in/clock_in_bloc.dart index 748509d1..b5532656 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/bloc/clock_in/clock_in_bloc.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/bloc/clock_in/clock_in_bloc.dart @@ -133,6 +133,11 @@ class ClockInBloc extends Bloc CheckInRequested event, Emitter emit, ) async { + // Clear previous error so repeated failures are always emitted as new states. + if (state.errorMessage != null) { + emit(state.copyWith(errorMessage: null)); + } + final Shift? shift = state.selectedShift; final GeofenceState geofenceState = _geofenceBloc.state; diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart index 8aacb8ff..279749a0 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/pages/clock_in_page.dart @@ -39,7 +39,9 @@ class ClockInPage extends StatelessWidget { child: BlocListener( listenWhen: (ClockInState previous, ClockInState current) => current.status == ClockInStatus.failure && - current.errorMessage != null, + current.errorMessage != null && + (previous.status != current.status || + previous.errorMessage != current.errorMessage), listener: (BuildContext context, ClockInState state) { UiSnackbar.show( context, diff --git a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart index 8c0bc42e..906cca30 100644 --- a/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart +++ b/apps/mobile/packages/features/staff/clock_in/lib/src/presentation/widgets/swipe_to_check_in.dart @@ -47,12 +47,21 @@ class _SwipeToCheckInState extends State @override void didUpdateWidget(SwipeToCheckIn oldWidget) { super.didUpdateWidget(oldWidget); + // Reset on check-in state change (successful action). if (widget.isCheckedIn != oldWidget.isCheckedIn) { setState(() { _isComplete = false; _dragValue = 0.0; }); } + // Reset on error: loading finished but check-in state didn't change. + if (oldWidget.isLoading && !widget.isLoading && + widget.isCheckedIn == oldWidget.isCheckedIn && _isComplete) { + setState(() { + _isComplete = false; + _dragValue = 0.0; + }); + } } void _onDragUpdate(DragUpdateDetails details, double maxWidth) {