feat(calendar): add ReminderQueueManager for handling reminder queue
This commit is contained in:
@@ -0,0 +1,31 @@
|
|||||||
|
import 'models/reminder_payload.dart';
|
||||||
|
|
||||||
|
class ReminderQueueManager {
|
||||||
|
ReminderPayload? _currentPayload;
|
||||||
|
final List<ReminderPayload> _pending = [];
|
||||||
|
|
||||||
|
void enqueueFromClick(ReminderPayload payload) {
|
||||||
|
_currentPayload = payload;
|
||||||
|
}
|
||||||
|
|
||||||
|
void enqueuePending(List<ReminderPayload> payloads) {
|
||||||
|
payloads.sort((a, b) => a.startAt.compareTo(b.startAt));
|
||||||
|
_pending.addAll(payloads);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReminderPayload? get currentPayload => _currentPayload;
|
||||||
|
|
||||||
|
bool get isEmpty => _currentPayload == null && _pending.isEmpty;
|
||||||
|
|
||||||
|
void dequeueCurrent() {
|
||||||
|
_currentPayload = null;
|
||||||
|
if (_pending.isNotEmpty) {
|
||||||
|
_currentPayload = _pending.removeAt(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clear() {
|
||||||
|
_currentPayload = null;
|
||||||
|
_pending.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:social_app/features/calendar/reminders/reminder_queue_manager.dart';
|
||||||
|
import 'package:social_app/features/calendar/reminders/models/reminder_payload.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
group('ReminderQueueManager', () {
|
||||||
|
test('按点击顺序处理,第一条处理完后处理剩余的按时间排序', () {
|
||||||
|
final manager = ReminderQueueManager();
|
||||||
|
|
||||||
|
final event1 = ReminderPayload(
|
||||||
|
eventId: '1',
|
||||||
|
title: 'Event 1',
|
||||||
|
startAt: DateTime(2026, 3, 20, 10, 1),
|
||||||
|
timezone: 'UTC',
|
||||||
|
mode: ReminderPayloadMode.single,
|
||||||
|
);
|
||||||
|
final event2 = ReminderPayload(
|
||||||
|
eventId: '2',
|
||||||
|
title: 'Event 2',
|
||||||
|
startAt: DateTime(2026, 3, 20, 10, 2),
|
||||||
|
timezone: 'UTC',
|
||||||
|
mode: ReminderPayloadMode.single,
|
||||||
|
);
|
||||||
|
final event3 = ReminderPayload(
|
||||||
|
eventId: '3',
|
||||||
|
title: 'Event 3',
|
||||||
|
startAt: DateTime(2026, 3, 20, 10, 3),
|
||||||
|
timezone: 'UTC',
|
||||||
|
mode: ReminderPayloadMode.single,
|
||||||
|
);
|
||||||
|
|
||||||
|
manager.enqueueFromClick(event2);
|
||||||
|
manager.enqueuePending([event1, event3]);
|
||||||
|
|
||||||
|
expect(manager.currentPayload?.eventId, '2');
|
||||||
|
manager.dequeueCurrent();
|
||||||
|
expect(manager.currentPayload?.eventId, '1');
|
||||||
|
manager.dequeueCurrent();
|
||||||
|
expect(manager.currentPayload?.eventId, '3');
|
||||||
|
manager.dequeueCurrent();
|
||||||
|
expect(manager.isEmpty, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('单条通知处理完直接清空', () {
|
||||||
|
final manager = ReminderQueueManager();
|
||||||
|
final event = ReminderPayload(
|
||||||
|
eventId: '1',
|
||||||
|
title: 'Event 1',
|
||||||
|
startAt: DateTime.now(),
|
||||||
|
timezone: 'UTC',
|
||||||
|
mode: ReminderPayloadMode.single,
|
||||||
|
);
|
||||||
|
|
||||||
|
manager.enqueueFromClick(event);
|
||||||
|
expect(manager.isEmpty, false);
|
||||||
|
manager.dequeueCurrent();
|
||||||
|
expect(manager.isEmpty, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user