Realtime updates when viewing workspaces
This commit is contained in:
@@ -165,6 +165,68 @@ export interface Filter {
|
|||||||
editedToday: boolean;
|
editedToday: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Background sync for Context Switcher (polling fallback for realtime)
|
||||||
|
let contextSyncInterval: number | undefined;
|
||||||
|
|
||||||
|
export const startContextPolling = () => {
|
||||||
|
if (contextSyncInterval) {
|
||||||
|
clearInterval(contextSyncInterval);
|
||||||
|
contextSyncInterval = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ctx = currentTaskContext();
|
||||||
|
if (typeof ctx === 'object' && 'userId' in ctx) {
|
||||||
|
contextSyncInterval = window.setInterval(async () => {
|
||||||
|
if (!pb.authStore.isValid) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fetch only recent updates (last 30s) to minimize payload
|
||||||
|
const timeStr = new Date(Date.now() - 30000).toISOString();
|
||||||
|
const records = await pb.collection(TASGRID_COLLECTION).getFullList({
|
||||||
|
filter: `user = "${ctx.userId}" && updated >= "${timeStr}"`,
|
||||||
|
sort: '-updated',
|
||||||
|
fields: LIST_FIELDS,
|
||||||
|
requestKey: 'context-poll'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (records.length === 0) return;
|
||||||
|
|
||||||
|
setStore("tasks", (currentTasks) => {
|
||||||
|
const taskMap = new Map(currentTasks.map(t => [t.id, t]));
|
||||||
|
let changed = false;
|
||||||
|
|
||||||
|
records.forEach((r: any) => {
|
||||||
|
if (r.tags?.includes("__template__")) return;
|
||||||
|
|
||||||
|
const existing = taskMap.get(r.id);
|
||||||
|
if (existing && existing.updated === r.updated) return;
|
||||||
|
|
||||||
|
const newTask = mapRecordToTask(r);
|
||||||
|
if (existing && existing.content) {
|
||||||
|
newTask.content = existing.content;
|
||||||
|
}
|
||||||
|
taskMap.set(r.id, newTask);
|
||||||
|
changed = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (changed) return Array.from(taskMap.values());
|
||||||
|
return currentTasks;
|
||||||
|
});
|
||||||
|
} catch (err: any) {
|
||||||
|
if (!err.isAbort) {
|
||||||
|
console.warn("Context poll failed:", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 5000); // 5 seconds
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
createEffect(() => {
|
||||||
|
// Re-run whenever ctx changes
|
||||||
|
currentTaskContext();
|
||||||
|
startContextPolling();
|
||||||
|
});
|
||||||
|
|
||||||
export interface FilterTemplate {
|
export interface FilterTemplate {
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
|
|||||||
Reference in New Issue
Block a user