Skip to content

Commit fe8113e

Browse files
committed
update: sync preferences from local to users.
1 parent 3123fca commit fe8113e

File tree

1 file changed

+50
-5
lines changed

1 file changed

+50
-5
lines changed

src/lib/stores/preferences.ts

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,33 @@ type PreferencesStore = {
2929
};
3030
} & { hideAiDisclaimer?: boolean };
3131

32+
async function updateConsolePreferences(store: PreferencesStore): Promise<void> {
33+
const currentPreferences = await sdk.forConsole.account.getPrefs();
34+
if (!currentPreferences?.console || Array.isArray(currentPreferences.console)) {
35+
currentPreferences.console = {};
36+
}
37+
38+
currentPreferences.console = {
39+
...(currentPreferences['console'] ?? {}),
40+
...store
41+
};
42+
43+
await sdk.forConsole.account.updatePrefs(currentPreferences);
44+
}
45+
3246
function createPreferences() {
3347
const { subscribe, set, update } = writable<PreferencesStore>({});
3448
let preferences: PreferencesStore = {};
3549

3650
if (browser) {
37-
set(JSON.parse(globalThis.localStorage.getItem('preferences') ?? '{}'));
51+
// fresh fetch.
52+
sdk.forConsole.account.getPrefs().then((userPreferences) => {
53+
if (!userPreferences?.console || Array.isArray(userPreferences.console)) {
54+
userPreferences.console = {};
55+
}
56+
57+
set(userPreferences.console);
58+
});
3859
}
3960

4061
subscribe((v) => {
@@ -44,6 +65,30 @@ function createPreferences() {
4465
}
4566
});
4667

68+
/**
69+
* Update the local store and then synchronizes them on user prefs.
70+
*/
71+
function updateAndSync(callback: (prefs: PreferencesStore) => void) {
72+
let oldPrefsSnapshot: string;
73+
let newPrefsSnapshot: PreferencesStore;
74+
75+
update((currentPrefs) => {
76+
oldPrefsSnapshot = JSON.stringify(currentPrefs);
77+
callback(currentPrefs);
78+
newPrefsSnapshot = currentPrefs;
79+
return currentPrefs;
80+
});
81+
82+
// Skip API if no changes (sufficient for simple objects).
83+
// The key order seemed to be maintained during local tests.
84+
if (oldPrefsSnapshot === JSON.stringify(newPrefsSnapshot)) {
85+
return;
86+
}
87+
88+
// sync the preferences.
89+
updateConsolePreferences(newPrefsSnapshot).then();
90+
}
91+
4792
return {
4893
subscribe,
4994
set,
@@ -65,7 +110,7 @@ function createPreferences() {
65110
);
66111
},
67112
setLimit: (limit: Preferences['limit']) =>
68-
update((n) => {
113+
updateAndSync((n) => {
69114
const path = get(page).route.id;
70115
const project = sdk.forProject.client.config.project;
71116
if (!n[project]?.[path]) {
@@ -78,7 +123,7 @@ function createPreferences() {
78123
return n;
79124
}),
80125
setView: (view: Preferences['view']) =>
81-
update((n) => {
126+
updateAndSync((n) => {
82127
const path = get(page).route.id;
83128
const project = sdk.forProject.client.config.project;
84129
if (!n[project]?.[path]) {
@@ -91,7 +136,7 @@ function createPreferences() {
91136
return n;
92137
}),
93138
setColumns: (columns: Preferences['columns']) =>
94-
update((n) => {
139+
updateAndSync((n) => {
95140
const path = get(page).route.id;
96141
const project = sdk.forProject.client.config.project;
97142
if (!n[project]?.[path]) {
@@ -104,7 +149,7 @@ function createPreferences() {
104149
return n;
105150
}),
106151
setCustomCollectionColumns: (columns: Preferences['columns']) =>
107-
update((n) => {
152+
updateAndSync((n) => {
108153
const current = get(page);
109154
const project = sdk.forProject.client.config.project;
110155
const collection = current.params.collection;

0 commit comments

Comments
 (0)