From e4f274034e94798c99bd5c0bbe3ad1392071d3a2 Mon Sep 17 00:00:00 2001 From: Timothy Cardoza Date: Wed, 25 Mar 2026 10:23:25 -0500 Subject: [PATCH] collapse realtime subsciption --- src/store/index.ts | 83 +++++++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/src/store/index.ts b/src/store/index.ts index 29991be..557936d 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -357,6 +357,39 @@ const writeScopedPrefs = (rawPrefs: any, scopedPrefs: ScopedTaskgridPrefs) => ({ } }); +const applyScopedPrefsToStore = (prefs: ScopedTaskgridPrefs) => { + const currentUserId = pb.authStore.model?.id; + const personalContext = currentUserId ? getPersonalContext(currentUserId) : null; + + setStore({ + pWeight: prefs.pWeight || 1.0, + uWeight: prefs.uWeight || 1.0, + matrixScaleDays: prefs.matrixScaleDays || 30, + prefId: currentUserId, + subscribedBuckets: prefs.subscribedBuckets || [], + personalContextSupervisorIds: personalContext?.supervisorUserIds || prefs.supervisorUserIds || [], + tagDefinitions: (prefs.tagDefinitions || []).filter((def: TagDefinition) => !def.name.startsWith("@")), + filterTemplates: prefs.filterTemplates || [], + quickloadTasks: prefs.quickloadTasks || [], + dismissedTaskUpdateIndicators: prefs.dismissedTaskUpdateIndicators || {}, + collapsedUntilUpdatedTasks: prefs.collapsedUntilUpdatedTasks || {}, + noteFilter: prefs.noteFilter || { + query: "", + tags: [], + priorityMin: 1, + priorityMax: 10, + urgencyMin: 1, + urgencyMax: 10, + editedToday: false, + ownedByMe: false, + starred: false, + jobStatus: [], + jobDivision: [] + }, + filter: prefs.filter || store.filter + }); +}; + const unwrapRelationId = (value: unknown): string | null => { if (typeof value === "string") { return value || null; @@ -1763,6 +1796,8 @@ const shouldTaskBeVisible = (task: any, currentUserId: string): boolean => { }; export const subscribeToRealtime = async () => { + const currentUserId = pb.authStore.model?.id; + // Unsubscribe first to avoid duplicates await pb.collection(TASGRID_COLLECTION).unsubscribe('*'); @@ -1919,6 +1954,19 @@ export const subscribeToRealtime = async () => { } void syncSupervisedContexts(); }); + + if (currentUserId) { + await pb.collection('users').unsubscribe(currentUserId); + pb.collection('users').subscribe(currentUserId, (e) => { + if (e.action !== 'update') return; + + const prefs = readScopedPrefs(e.record?.Taskgrid_pref || {}); + applyScopedPrefsToStore({ + ...prefs, + subscribedBuckets: prefs.subscribedBuckets || e.record?.subscribedBuckets || [] + }); + }); + } }; const runLegacyTagMigration = async (force = false) => { @@ -2278,36 +2326,11 @@ export const initStore = async () => { try { const userId = pb.authStore.model?.id; if (userId) { - const user = await pb.collection('users').getOne(userId, { requestKey: null }); - const prefs = readScopedPrefs(user.Taskgrid_pref || {}); - const personalContext = getPersonalContext(userId); - - setStore({ - pWeight: prefs.pWeight || 1.0, - uWeight: prefs.uWeight || 1.0, - matrixScaleDays: prefs.matrixScaleDays || 30, - prefId: userId, - subscribedBuckets: prefs.subscribedBuckets || user.subscribedBuckets || [], - personalContextSupervisorIds: personalContext?.supervisorUserIds || prefs.supervisorUserIds || [], - tagDefinitions: (prefs.tagDefinitions || []).filter((def: TagDefinition) => !def.name.startsWith("@")), - filterTemplates: prefs.filterTemplates || [], - quickloadTasks: prefs.quickloadTasks || [], - dismissedTaskUpdateIndicators: prefs.dismissedTaskUpdateIndicators || {}, - collapsedUntilUpdatedTasks: prefs.collapsedUntilUpdatedTasks || {}, - noteFilter: prefs.noteFilter || { - query: "", - tags: [], - priorityMin: 1, - priorityMax: 10, - urgencyMin: 1, - urgencyMax: 10, - editedToday: false, - ownedByMe: false, - starred: false, - jobStatus: [], - jobDivision: [] - }, - filter: prefs.filter || store.filter + const user = await pb.collection('users').getOne(userId, { requestKey: null }); + const prefs = readScopedPrefs(user.Taskgrid_pref || {}); + applyScopedPrefsToStore({ + ...prefs, + subscribedBuckets: prefs.subscribedBuckets || user.subscribedBuckets || [] }); } } catch (prefErr) {