Add initial sync loading screen for new WebDAV workspaces
Show a spinner while the first sync runs after adding a WebDAV workspace so the user doesn't land on an empty task list. The screen transitions to tasks only after sync completes or fails.
This commit is contained in:
parent
ca52ed9fee
commit
2c52afa8d7
|
|
@ -25,6 +25,7 @@ let activeListId = $state<string | null>(null);
|
||||||
let tasks = $state<Task[]>([]);
|
let tasks = $state<Task[]>([]);
|
||||||
let osDark = globalThis.matchMedia?.("(prefers-color-scheme: dark)").matches ?? false;
|
let osDark = globalThis.matchMedia?.("(prefers-color-scheme: dark)").matches ?? false;
|
||||||
let syncing = $state(false);
|
let syncing = $state(false);
|
||||||
|
let initialSync = $state(false);
|
||||||
let syncStatus = $state<"idle" | "synced" | "error" | "offline">("idle");
|
let syncStatus = $state<"idle" | "synced" | "error" | "offline">("idle");
|
||||||
let lastSyncResult = $state<SyncResult | null>(null);
|
let lastSyncResult = $state<SyncResult | null>(null);
|
||||||
let error = $state<string | null>(null);
|
let error = $state<string | null>(null);
|
||||||
|
|
@ -398,15 +399,23 @@ async function addWebdavWorkspace(name: string, webdavUrl: string, webdavPath: s
|
||||||
try {
|
try {
|
||||||
await invoke("add_webdav_workspace", { name, webdavUrl, webdavPath, username, password });
|
await invoke("add_webdav_workspace", { name, webdavUrl, webdavPath, username, password });
|
||||||
config = await invoke<AppConfig>("get_config");
|
config = await invoke<AppConfig>("get_config");
|
||||||
|
screen = "tasks";
|
||||||
|
error = null;
|
||||||
|
// Run initial sync before showing content so the workspace isn't empty
|
||||||
|
initialSync = true;
|
||||||
|
try {
|
||||||
|
await triggerSync();
|
||||||
|
} finally {
|
||||||
|
initialSync = false;
|
||||||
|
}
|
||||||
await loadLists();
|
await loadLists();
|
||||||
if (config?.current_workspace) {
|
if (config?.current_workspace) {
|
||||||
const ws = config.workspaces[config.current_workspace];
|
const ws = config.workspaces[config.current_workspace];
|
||||||
if (ws) invoke("watch_workspace", { path: ws.path }).catch((e) => console.warn("File watcher failed:", e));
|
if (ws) invoke("watch_workspace", { path: ws.path }).catch((e) => console.warn("File watcher failed:", e));
|
||||||
}
|
}
|
||||||
screen = "tasks";
|
|
||||||
error = null;
|
|
||||||
if (isWebdav) startAutoSync();
|
if (isWebdav) startAutoSync();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
initialSync = false;
|
||||||
error = String(e);
|
error = String(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -475,6 +484,9 @@ export const app = {
|
||||||
get syncing() {
|
get syncing() {
|
||||||
return syncing;
|
return syncing;
|
||||||
},
|
},
|
||||||
|
get initialSync() {
|
||||||
|
return initialSync;
|
||||||
|
},
|
||||||
get syncStatus() {
|
get syncStatus() {
|
||||||
return syncStatus;
|
return syncStatus;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue