Skip to content

Commit b6068d5

Browse files
fix: sync status not updating correctly (#69)
1 parent 0f0b750 commit b6068d5

File tree

3 files changed

+56
-33
lines changed

3 files changed

+56
-33
lines changed

core/src/commonMain/kotlin/com/powersync/sync/SyncStatus.kt

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -98,26 +98,26 @@ public data class SyncStatus internal constructor(
9898
* Updates the internal sync status indicators and emits Flow updates
9999
*/
100100
internal fun update(
101-
connected: Boolean = data.connected,
102-
connecting: Boolean = data.connecting,
103-
downloading: Boolean = data.downloading,
104-
uploading: Boolean = data.uploading,
105-
hasSynced: Boolean? = data.hasSynced,
106-
lastSyncedAt: Instant? = data.lastSyncedAt,
107-
uploadError: Any? = data.uploadError,
108-
downloadError: Any? = data.downloadError,
109-
clearUploadError: Boolean? = false,
110-
clearDownloadError: Boolean? = false,
101+
connected: Boolean? = null,
102+
connecting: Boolean? = null,
103+
downloading: Boolean? = null,
104+
uploading: Boolean? = null,
105+
hasSynced: Boolean? = null,
106+
lastSyncedAt: Instant? = null,
107+
uploadError: Any? = null,
108+
downloadError: Any? = null,
109+
clearUploadError: Boolean = false,
110+
clearDownloadError: Boolean = false,
111111
) {
112112
data = data.copy(
113-
connected = connected,
114-
connecting = connecting,
115-
downloading = downloading,
116-
uploading = uploading,
117-
lastSyncedAt = lastSyncedAt,
118-
hasSynced = hasSynced,
119-
uploadError = if (clearUploadError == true) null else uploadError,
120-
downloadError = if (clearDownloadError == true) null else downloadError,
113+
connected = connected ?: data.connected,
114+
connecting = connecting ?: data.connecting,
115+
downloading = downloading ?: data.downloading,
116+
uploading = uploading ?: data.uploading,
117+
lastSyncedAt = lastSyncedAt ?: data.lastSyncedAt,
118+
hasSynced = hasSynced ?: data.hasSynced,
119+
uploadError = if (clearUploadError) null else uploadError,
120+
downloadError = if (clearDownloadError) null else downloadError,
121121
)
122122
stateFlow.value = data
123123
}

demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/App.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.compose.material.MaterialTheme
55
import androidx.compose.runtime.Composable
66
import androidx.compose.runtime.LaunchedEffect
77
import androidx.compose.runtime.collectAsState
8+
import androidx.compose.runtime.derivedStateOf
89
import androidx.compose.runtime.getValue
910
import androidx.compose.runtime.mutableStateOf
1011
import androidx.compose.runtime.remember
@@ -35,8 +36,9 @@ fun App(factory: DatabaseDriverFactory, modifier: Modifier = Modifier) {
3536
)
3637
}
3738
val db = remember { PowerSyncDatabase(factory, schema) }
38-
val syncStatus = db.currentStatus
39-
val status = syncStatus.asFlow().collectAsState(initial = null)
39+
val status = db.currentStatus.asFlow().collectAsState(initial = null)
40+
val hasSynced by remember { derivedStateOf { status.value?.hasSynced } }
41+
4042

4143
val navController = remember { NavController(Screen.Home) }
4244
val authViewModel = remember {
@@ -91,6 +93,7 @@ fun App(factory: DatabaseDriverFactory, modifier: Modifier = Modifier) {
9193
onItemDeleteClicked = lists.value::onItemDeleteClicked,
9294
onAddItemClicked = lists.value::onAddItemClicked,
9395
onInputTextChanged = lists.value::onInputTextChanged,
96+
hasSynced = hasSynced
9497
)
9598
}
9699

demos/supabase-todolist/shared/src/commonMain/kotlin/com/powersync/demos/screens/HomeScreen.kt

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
package com.powersync.demos.screens
22

3+
import androidx.compose.foundation.background
34
import androidx.compose.foundation.layout.Box
45
import androidx.compose.foundation.layout.Column
56
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.fillMaxSize
68
import androidx.compose.foundation.layout.fillMaxWidth
79
import androidx.compose.foundation.layout.padding
810
import androidx.compose.foundation.layout.width
11+
import androidx.compose.material.MaterialTheme
912
import androidx.compose.material.Text
1013
import androidx.compose.material.TopAppBar
1114
import androidx.compose.runtime.Composable
15+
import androidx.compose.ui.Alignment
1216
import androidx.compose.ui.Modifier
1317
import androidx.compose.ui.text.style.TextAlign
1418
import androidx.compose.ui.unit.dp
@@ -25,13 +29,13 @@ internal fun HomeScreen(
2529
items: List<ListItem>,
2630
inputText: String,
2731
isConnected: Boolean?,
32+
hasSynced: Boolean?,
2833
onSignOutSelected: () -> Unit,
2934
onItemClicked: (item: ListItem) -> Unit,
3035
onItemDeleteClicked: (item: ListItem) -> Unit,
3136
onAddItemClicked: () -> Unit,
3237
onInputTextChanged: (value: String) -> Unit,
3338
) {
34-
3539
Column(modifier) {
3640
TopAppBar(
3741
title = {
@@ -50,19 +54,35 @@ internal fun HomeScreen(
5054
}
5155
)
5256

53-
Input(
54-
text = inputText,
55-
onAddClicked = onAddItemClicked,
56-
onTextChanged = onInputTextChanged,
57-
screen = Screen.Home
58-
)
57+
when {
58+
hasSynced == null || hasSynced == false -> {
59+
Box(
60+
modifier = Modifier.fillMaxSize().background(MaterialTheme.colors.background),
61+
contentAlignment = Alignment.Center
62+
) {
63+
Text(
64+
text = "Busy with initial sync...",
65+
style = MaterialTheme.typography.h6
66+
)
67+
}
68+
}
69+
else -> {
5970

60-
Box(Modifier.weight(1F)) {
61-
ListContent(
62-
items = items,
63-
onItemClicked = onItemClicked,
64-
onItemDeleteClicked = onItemDeleteClicked
65-
)
71+
Input(
72+
text = inputText,
73+
onAddClicked = onAddItemClicked,
74+
onTextChanged = onInputTextChanged,
75+
screen = Screen.Home
76+
)
77+
78+
Box(Modifier.weight(1F)) {
79+
ListContent(
80+
items = items,
81+
onItemClicked = onItemClicked,
82+
onItemDeleteClicked = onItemDeleteClicked
83+
)
84+
}
85+
}
6686
}
6787
}
6888
}

0 commit comments

Comments
 (0)