diff --git a/lib/database/drift_db.dart b/lib/database/drift_db.dart index 60885842..7d061bae 100644 --- a/lib/database/drift_db.dart +++ b/lib/database/drift_db.dart @@ -360,21 +360,41 @@ class AppDatabase extends _$AppDatabase { } Future saveChatRooms(List rooms) async { - await batch((batch) { - for (final room in rooms) { - batch.insert( - chatRooms, - companionFromRoom(room), - mode: InsertMode.insertOrReplace, - ); - for (final member in room.members ?? []) { + await transaction(() async { + // 1. Identify rooms to remove + final remoteRoomIds = rooms.map((r) => r.id).toSet(); + final currentRooms = await select(chatRooms).get(); + final currentRoomIds = currentRooms.map((r) => r.id).toSet(); + final idsToRemove = currentRoomIds.difference(remoteRoomIds); + + if (idsToRemove.isNotEmpty) { + final idsList = idsToRemove.toList(); + // Remove messages + await (delete(chatMessages)..where((t) => t.roomId.isIn(idsList))).go(); + // Remove members + await (delete(chatMembers) + ..where((t) => t.chatRoomId.isIn(idsList))).go(); + // Remove rooms + await (delete(chatRooms)..where((t) => t.id.isIn(idsList))).go(); + } + + // 2. Upsert remote rooms + await batch((batch) { + for (final room in rooms) { batch.insert( - chatMembers, - companionFromMember(member), + chatRooms, + companionFromRoom(room), mode: InsertMode.insertOrReplace, ); + for (final member in room.members ?? []) { + batch.insert( + chatMembers, + companionFromMember(member), + mode: InsertMode.insertOrReplace, + ); + } } - } + }); }); } diff --git a/lib/screens/creators/hub.dart b/lib/screens/creators/hub.dart index 270e2416..79af2e49 100644 --- a/lib/screens/creators/hub.dart +++ b/lib/screens/creators/hub.dart @@ -846,7 +846,7 @@ class _PublisherMemberListSheet extends HookConsumerWidget { try { final apiClient = ref.watch(apiClientProvider); await apiClient.post( - '/sphere/publishers/$publisherUname/invites', + '/sphere/publishers/invites/$publisherUname', data: {'related_user_id': result.id, 'role': 0}, ); // Refresh both providers @@ -1134,7 +1134,7 @@ class _PublisherInviteSheet extends HookConsumerWidget { try { final client = ref.read(apiClientProvider); await client.post( - '/publishers/invites/${invite.publisher!.name}/accept', + '/sphere/publishers/invites/${invite.publisher!.name}/accept', ); ref.invalidate(publisherInvitesProvider); ref.invalidate(publishersManagedProvider); @@ -1147,7 +1147,7 @@ class _PublisherInviteSheet extends HookConsumerWidget { try { final client = ref.read(apiClientProvider); await client.post( - '/publishers/invites/${invite.publisher!.name}/decline', + '/sphere/publishers/invites/${invite.publisher!.name}/decline', ); ref.invalidate(publisherInvitesProvider); } catch (err) { diff --git a/lib/widgets/activity_heatmap.dart b/lib/widgets/activity_heatmap.dart index 8f4e7fd2..c40feb77 100644 --- a/lib/widgets/activity_heatmap.dart +++ b/lib/widgets/activity_heatmap.dart @@ -206,7 +206,7 @@ class ActivityHeatmapWidget extends HookConsumerWidget { }, child: Container( height: 12, - margin: const EdgeInsets.all(0.5), + margin: const EdgeInsets.all(1), decoration: BoxDecoration( color: getActivityColor(value), borderRadius: BorderRadius.circular(2),