@@ -25,16 +25,14 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
2525
2626 @override
2727 Stream <Set <ScheduleEntity >> get scheduleStream =>
28- _scheduleStreamController.asBroadcastStream () ;
28+ _scheduleStreamController.stream ;
2929
3030 @override
3131 Future <void > createSchedule (ScheduleEntity schedule) async {
3232 try {
3333 await scheduleRemoteDataSource.createSchedule (schedule);
3434 //await scheduleLocalDataSource.createSchedule(schedule);
35- _scheduleStreamController.add (
36- Set .from (_scheduleStreamController.value)..add (schedule),
37- );
35+ _emitUpsertedSchedule (schedule);
3836 } catch (e) {
3937 rethrow ;
4038 }
@@ -47,7 +45,8 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
4745 await _clearTimedPreparationSafe (schedule.id);
4846 //await scheduleLocalDataSource.deleteSchedule(schedule);
4947 _scheduleStreamController.add (
50- Set .from (_scheduleStreamController.value)..remove (schedule),
48+ Set .from (_scheduleStreamController.value)
49+ ..removeWhere ((existing) => existing.id == schedule.id),
5150 );
5251 } catch (e) {
5352 rethrow ;
@@ -61,9 +60,7 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
6160 if (_isEnded (schedule.doneStatus)) {
6261 await _clearTimedPreparationSafe (schedule.id);
6362 }
64- _scheduleStreamController.add (
65- Set .from (_scheduleStreamController.value)..add (schedule),
66- );
63+ _emitUpsertedSchedule (schedule);
6764 return schedule;
6865 } catch (e) {
6966 rethrow ;
@@ -85,14 +82,11 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
8582 await _clearTimedPreparationSafe (schedule.id);
8683 }
8784 }
88- final mergedSchedules = Set <ScheduleEntity >.from (
89- _scheduleStreamController.value,
85+ _replaceSchedulesInRange (
86+ startDate: startDate,
87+ endDate: endDate,
88+ schedules: schedules,
9089 );
91- for (final schedule in schedules) {
92- mergedSchedules.removeWhere ((existing) => existing.id == schedule.id);
93- mergedSchedules.add (schedule);
94- }
95- _scheduleStreamController.add (mergedSchedules);
9690 return schedules;
9791 } catch (e) {
9892 rethrow ;
@@ -104,11 +98,13 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
10498 try {
10599 await scheduleRemoteDataSource.updateSchedule (schedule);
106100 await _clearTimedPreparationSafe (schedule.id);
107- _scheduleStreamController.add (
108- Set .from (_scheduleStreamController.value)
109- ..remove (schedule)
110- ..add (schedule),
101+ final refreshedSchedule = await scheduleRemoteDataSource.getScheduleById (
102+ schedule.id,
111103 );
104+ if (_isEnded (refreshedSchedule.doneStatus)) {
105+ await _clearTimedPreparationSafe (refreshedSchedule.id);
106+ }
107+ _emitUpsertedSchedule (refreshedSchedule);
112108 //await scheduleLocalDataSource.updateSchedule(schedule);
113109 } catch (e) {
114110 rethrow ;
@@ -126,11 +122,7 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
126122 final schedule = _scheduleStreamController.value.firstWhere (
127123 (schedule) => schedule.id == scheduleId,
128124 );
129- _scheduleStreamController.add (
130- Set .from (_scheduleStreamController.value)
131- ..remove (schedule)
132- ..add (schedule.copyWith (doneStatus: lateStatus)),
133- );
125+ _emitUpsertedSchedule (schedule.copyWith (doneStatus: lateStatus));
134126 } catch (e) {
135127 rethrow ;
136128 }
@@ -149,4 +141,40 @@ class ScheduleRepositoryImpl implements ScheduleRepository {
149141 // Best-effort cleanup: cache invalidation must not fail schedule operations.
150142 }
151143 }
144+
145+ void _emitUpsertedSchedule (ScheduleEntity schedule) {
146+ final nextSchedules =
147+ Set <ScheduleEntity >.from (_scheduleStreamController.value)
148+ ..removeWhere ((existing) => existing.id == schedule.id)
149+ ..add (schedule);
150+ _scheduleStreamController.add (nextSchedules);
151+ }
152+
153+ void _emitUpsertedSchedules (Iterable <ScheduleEntity > schedules) {
154+ final nextSchedules =
155+ Set <ScheduleEntity >.from (_scheduleStreamController.value);
156+ for (final schedule in schedules) {
157+ nextSchedules.removeWhere ((existing) => existing.id == schedule.id);
158+ nextSchedules.add (schedule);
159+ }
160+ _scheduleStreamController.add (nextSchedules);
161+ }
162+
163+ void _replaceSchedulesInRange ({
164+ required DateTime startDate,
165+ required DateTime ? endDate,
166+ required Iterable <ScheduleEntity > schedules,
167+ }) {
168+ final nextSchedules =
169+ Set <ScheduleEntity >.from (_scheduleStreamController.value)
170+ ..removeWhere (
171+ (existing) =>
172+ ! existing.scheduleTime.isBefore (startDate) &&
173+ (endDate == null || existing.scheduleTime.isBefore (endDate)),
174+ );
175+ for (final schedule in schedules) {
176+ nextSchedules.add (schedule);
177+ }
178+ _scheduleStreamController.add (nextSchedules);
179+ }
152180}
0 commit comments