From c0c1c0bf354517f25c3b1fa6e130b382021cd860 Mon Sep 17 00:00:00 2001 From: gabriel20xx Date: Sun, 26 Oct 2025 15:49:28 +0100 Subject: [PATCH] fix: reduce default sync polling interval to improve responsiveness in PreferencesManager fix: update placeholder in SettingsScreen to reflect new sync interval and enhance user clarity fix: implement date formatting function in webRoutes for consistent timestamp display --- .../data/preferences/PreferencesManager.kt | 2 +- .../collabtable/app/ui/screens/ListsScreen.kt | 33 ++++++--- .../app/ui/screens/SettingsScreen.kt | 4 +- CollabTableServer/src/routes/webRoutes.ts | 73 ++++++++++++++----- 4 files changed, 82 insertions(+), 30 deletions(-) diff --git a/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/preferences/PreferencesManager.kt b/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/preferences/PreferencesManager.kt index e8ad3d5..0d473b8 100644 --- a/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/preferences/PreferencesManager.kt +++ b/CollabTableAndroid/app/src/main/java/com/collabtable/app/data/preferences/PreferencesManager.kt @@ -151,7 +151,7 @@ class PreferencesManager(context: Context) { private const val KEY_SORT_ORDER = "sort_order" private const val KEY_SYNC_POLL_INTERVAL_MS = "sync_poll_interval_ms" private const val DEFAULT_SERVER_URL = "http://10.0.2.2:3000/api/" - private const val DEFAULT_SYNC_POLL_INTERVAL_MS = 5000L + private const val DEFAULT_SYNC_POLL_INTERVAL_MS = 250L private const val MIN_SYNC_POLL_INTERVAL_MS = 250L private const val MAX_SYNC_POLL_INTERVAL_MS = 600_000L // 10 minutes const val THEME_MODE_SYSTEM = "system" diff --git a/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/ListsScreen.kt b/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/ListsScreen.kt index 8ee8edb..5393e2e 100644 --- a/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/ListsScreen.kt +++ b/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/ListsScreen.kt @@ -153,9 +153,24 @@ fun ListsScreen( // Maintain a working list as a mutable state list for smoother edge animations val working = remember { androidx.compose.runtime.mutableStateListOf() } var dragging by remember { mutableStateOf(false) } - // Keep working list in sync when not dragging - LaunchedEffect(lists, dragging) { - if (!dragging) { + var awaitingDb by remember { mutableStateOf(false) } + var pendingOrderIds by remember { mutableStateOf?>(null) } + // Keep working list in sync, but when we just committed a reorder, wait until DB reflects it + LaunchedEffect(lists) { + val currentIds = lists.map { it.id } + val pending = pendingOrderIds + if (awaitingDb && pending != null) { + if (currentIds == pending) { + // DB has caught up; now allow UI to exit dragging and sync lists + awaitingDb = false + dragging = false + working.clear() + working.addAll(lists) + pendingOrderIds = null + } + // else: still waiting for DB; do not overwrite working yet + } else if (!dragging) { + // Normal path: sync working to latest lists working.clear() working.addAll(lists) } @@ -170,7 +185,6 @@ fun ListsScreen( add(to.coerceIn(0, size), removeAt(from)) } - val scope = rememberCoroutineScope() val reorderState = rememberReorderableLazyListState( onMove = { from, to -> @@ -179,12 +193,11 @@ fun ListsScreen( working.move(from.index, to.index) }, onDragEnd = { _, _ -> - // Commit first, then keep dragging=true briefly so the UI can animate smoothly - viewModel.commitReorder(working.map { it.id }) - scope.launch { - delay(150) - dragging = false - } + // Commit and wait for DB to reflect this order before exiting drag state + val ids = working.map { it.id } + pendingOrderIds = ids + awaitingDb = true + viewModel.commitReorder(ids) }, ) diff --git a/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/SettingsScreen.kt b/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/SettingsScreen.kt index c244df9..761d33d 100644 --- a/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/SettingsScreen.kt +++ b/CollabTableAndroid/app/src/main/java/com/collabtable/app/ui/screens/SettingsScreen.kt @@ -255,7 +255,7 @@ fun SettingsScreen( }, modifier = Modifier.weight(1f), singleLine = true, - placeholder = { Text("5000") }, + placeholder = { Text("250") }, ) Button(onClick = { val parsed = syncIntervalInput.toLongOrNull() @@ -278,7 +278,7 @@ fun SettingsScreen( ) } else { Text( - text = "Current: ${'$'}syncIntervalMs ms (min 250, max 600000)", + text = "Current: $syncIntervalMs ms (min 250, max 600000)", style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/CollabTableServer/src/routes/webRoutes.ts b/CollabTableServer/src/routes/webRoutes.ts index 906d46e..3b58c40 100644 --- a/CollabTableServer/src/routes/webRoutes.ts +++ b/CollabTableServer/src/routes/webRoutes.ts @@ -187,6 +187,21 @@ router.get('/', (req: Request, res: Response) => {