Skip to content

Commit 1a98325

Browse files
committed
feat(preparation-edit): implement PreparationEditDraftCubit for managing draft state in preparation editing flow
1 parent 7c11a3f commit 1a98325

4 files changed

Lines changed: 50 additions & 20 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'package:flutter_bloc/flutter_bloc.dart';
2+
import 'package:injectable/injectable.dart';
3+
import 'package:on_time_front/domain/entities/preparation_entity.dart';
4+
5+
/// Shared draft state for the `/preparationEdit` flow.
6+
///
7+
/// The caller sets a draft before navigating. The editor overwrites it on Save.
8+
/// The caller reads it after pop and then clears it.
9+
@LazySingleton()
10+
class PreparationEditDraftCubit extends Cubit<PreparationEntity?> {
11+
PreparationEditDraftCubit() : super(null);
12+
13+
void setDraft(PreparationEntity draft) => emit(draft);
14+
15+
void clear() => emit(null);
16+
}
17+
18+

lib/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/screens/preparation_edit_form.dart

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ import 'package:go_router/go_router.dart';
44
import 'package:on_time_front/core/di/di_setup.dart';
55
import 'package:on_time_front/domain/entities/preparation_entity.dart';
66
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/bloc/preparation_form_bloc.dart';
7+
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/cubit/preparation_edit_draft_cubit.dart';
78
import 'package:on_time_front/presentation/schedule_create/components/top_bar.dart';
89
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/components/preparation_form_create_list.dart';
910

1011
class PreparationEditForm extends StatefulWidget {
11-
const PreparationEditForm({super.key, required this.preparationEntity});
12-
13-
final PreparationEntity preparationEntity;
12+
const PreparationEditForm({super.key});
1413

1514
@override
1615
State<PreparationEditForm> createState() => _PreparationEditFormState();
@@ -24,20 +23,25 @@ class _PreparationEditFormState extends State<PreparationEditForm> {
2423

2524
@override
2625
Widget build(BuildContext context) {
26+
final draft = getIt.get<PreparationEditDraftCubit>().state ??
27+
const PreparationEntity(preparationStepList: []);
28+
2729
return Scaffold(
2830
body: SafeArea(
2931
child: BlocProvider<PreparationFormBloc>(
3032
create: (context) => getIt.get<PreparationFormBloc>()
31-
..add(PreparationFormEditRequested(
32-
preparationEntity: widget.preparationEntity)),
33+
..add(PreparationFormEditRequested(preparationEntity: draft)),
3334
child: BlocBuilder<PreparationFormBloc, PreparationFormState>(
3435
builder: (context, state) {
3536
return Column(
3637
children: [
3738
TopBar(
3839
onNextPageButtonClicked: state.isValid
3940
? () {
40-
context.pop(state.toPreparationEntity());
41+
getIt
42+
.get<PreparationEditDraftCubit>()
43+
.setDraft(state.toPreparationEntity());
44+
context.pop();
4145
}
4246
: null,
4347
onPreviousPageButtonClicked: context.pop,

lib/presentation/schedule_create/schedule_spare_and_preparing_time/screens/schedule_spare_and_preparing_time_form.dart

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
33
import 'package:go_router/go_router.dart';
44
import 'package:on_time_front/domain/entities/preparation_entity.dart';
5+
import 'package:on_time_front/core/di/di_setup.dart';
56
import 'package:on_time_front/presentation/app/bloc/auth/auth_bloc.dart';
67
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/cubit/schedule_form_spare_time_cubit.dart';
8+
import 'package:on_time_front/presentation/schedule_create/schedule_spare_and_preparing_time/preparation_form/cubit/preparation_edit_draft_cubit.dart';
79
import 'package:on_time_front/presentation/shared/components/cupertino_picker_modal.dart';
810
import 'package:on_time_front/l10n/app_localizations.dart';
911
import 'package:on_time_front/presentation/shared/utils/duration_format.dart';
@@ -46,15 +48,25 @@ class _ScheduleSpareAndPreparingTimeFormState
4648
controller: TextEditingController(
4749
text: formatDuration(
4850
context, state.totalPreparationTime)),
49-
onTap: () async {
50-
final PreparationEntity? updatedPreparation =
51-
await context.push('/preparationEdit',
52-
extra: state.preparation);
53-
if (updatedPreparation != null) {
54-
context
55-
.read<ScheduleFormSpareTimeCubit>()
56-
.preparationChanged(updatedPreparation);
57-
}
51+
onTap: () {
52+
final draftCubit = getIt.get<PreparationEditDraftCubit>();
53+
final scheduleSpareTimeCubit =
54+
context.read<ScheduleFormSpareTimeCubit>();
55+
final before = state.preparation ??
56+
const PreparationEntity(preparationStepList: []);
57+
58+
draftCubit.setDraft(before);
59+
context.push('/preparationEdit').then((_) {
60+
if (!mounted) return;
61+
62+
final after = draftCubit.state;
63+
if (after != null && after != before) {
64+
scheduleSpareTimeCubit.preparationChanged(after);
65+
}
66+
67+
// Avoid stale drafts leaking into the next edit session.
68+
draftCubit.clear();
69+
});
5870
},
5971
),
6072
onSaved: (value) {},

lib/presentation/shared/router/go_router.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import 'package:go_router/go_router.dart';
55
import 'package:on_time_front/core/di/di_setup.dart';
66
import 'package:on_time_front/core/services/navigation_service.dart';
77
import 'package:on_time_front/core/services/notification_service.dart';
8-
import 'package:on_time_front/domain/entities/preparation_entity.dart';
9-
import 'package:on_time_front/domain/entities/schedule_entity.dart';
108
import 'package:on_time_front/presentation/alarm/screens/alarm_screen.dart';
119
import 'package:on_time_front/presentation/alarm/screens/schedule_start_screen.dart';
1210
import 'package:on_time_front/presentation/app/bloc/auth/auth_bloc.dart';
@@ -112,9 +110,7 @@ GoRouter goRouterConfig(AuthBloc authBloc, ScheduleBloc scheduleBloc) {
112110
scheduleId: state.pathParameters['scheduleId']!)),
113111
GoRoute(
114112
path: '/preparationEdit',
115-
builder: (context, state) => PreparationEditForm(
116-
preparationEntity: (state.extra as PreparationEntity?) ??
117-
const PreparationEntity(preparationStepList: []))),
113+
builder: (context, state) => const PreparationEditForm()),
118114
GoRoute(
119115
path: '/scheduleStart',
120116
name: 'scheduleStart',

0 commit comments

Comments
 (0)