feat(flutter): 함께 쓰는 기록을 앱을 보는 동안 다시 읽기

다른 멤버가 남긴 글·일정과 내 코드로 새로 연동한 사람이 앱을 다시 켜지 않아도 보이게 한다.
실시간 알림이 붙기 전까지의 대신이다.
- 앱으로 돌아올 때와 앱을 보는 동안 3분마다 공유 다이어리·연동 상태(연동 중이면 일정도)를 다시 읽는다
- 뒤에서 읽을 때는 실패해도 알림을 띄우지 않는다 (목록 읽기·저장소 fetch 에 quiet)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-11 22:50:19 +09:00
parent 14e2bddb96
commit b10e90fe5c
15 changed files with 170 additions and 26 deletions
+2 -2
View File
@@ -33,7 +33,7 @@ class _FakeSharingRepo implements CalendarSharingRepository {
bool get available => true;
@override
Future<CalendarSharing?> fetch() async => sharing;
Future<CalendarSharing?> fetch({bool quiet = false}) async => sharing;
@override
Future<CalendarInvitation> previewInvitation(String code) async {
@@ -63,7 +63,7 @@ class _FakeScheduleRepo implements ScheduleRepository {
ScheduleBook book;
@override
Future<ScheduleBook> fetch() async => book;
Future<ScheduleBook> fetch({bool quiet = false}) async => book;
@override
Future<List<ScheduleEvent>> createEvents(List<EventDraft> drafts) async => [
+1 -1
View File
@@ -28,7 +28,7 @@ class _RecordingRepository implements ScheduleRepository {
bool failSetDone = false;
@override
Future<ScheduleBook> fetch() => _inner.fetch();
Future<ScheduleBook> fetch({bool quiet = false}) => _inner.fetch();
@override
Future<List<ScheduleEvent>> createEvents(List<EventDraft> drafts) {
+1 -1
View File
@@ -56,7 +56,7 @@ class _FakeSharedRepo implements DiaryRepository {
bool get canShare => true;
@override
Future<DiaryBook> fetch() async => book;
Future<DiaryBook> fetch({bool quiet = false}) async => book;
@override
Future<Diary?> createDiary({
+56
View File
@@ -0,0 +1,56 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:tma_app/features/schedule/data/calendar_sharing_repository.dart';
import 'package:tma_app/features/schedule/domain/calendar_sharing.dart';
import 'package:tma_app/features/shell/presentation/widgets/shared_data_refresher.dart';
import 'support/app_harness.dart';
/// 연동 상태를 몇 번 읽었는지 세는 저장소
class _SharingRepo implements CalendarSharingRepository {
bool linked = false;
int fetches = 0;
@override
bool get available => true;
@override
Future<CalendarSharing?> fetch({bool quiet = false}) async {
fetches++;
return CalendarSharing(
inviteCode: 'RUP-MINE00',
linked: linked,
members: [
const CalendarPerson(id: 'me', isMe: true),
if (linked) const CalendarPerson(id: 'dad', nickname: '콩이아빠'),
],
);
}
@override
Future<CalendarInvitation> previewInvitation(String code) => throw UnimplementedError();
@override
Future<CalendarSharing> join(String code) => throw UnimplementedError();
@override
Future<void> leave() async {}
}
void main() {
testWidgets('앱을 보는 동안 함께 관리 상태를 다시 읽는다', (tester) async {
final sharing = _SharingRepo();
await launchSignedIn(tester, overrides: [calendarSharingRepositoryProvider.overrideWithValue(sharing)]);
// 일정 탭에서 함께 관리 카드가 상태를 읽어 둔다
await tester.tap(find.bySemanticsLabel('일정·기록'));
await settle(tester);
final before = sharing.fetches;
// 다른 사람이 내 코드로 연동했다 — 다음 차례에 읽혀 카드에 나타난다
sharing.linked = true;
await tester.pump(kSharedRefreshInterval);
await settle(tester);
expect(sharing.fetches, greaterThan(before));
expect(find.text('2명이 같은 달력을 함께 써요'), findsOneWidget);
});
}