Skip to content

Commit 33bd0c3

Browse files
authored
Merge pull request #1654 from appwrite/sync-preferences
Sync preferences for cross device
2 parents 9c38e89 + c6bd014 commit 33bd0c3

File tree

2 files changed

+58
-8
lines changed

2 files changed

+58
-8
lines changed

src/lib/stores/preferences.ts

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { sdk } from './sdk';
66
import type { Models } from '@appwrite.io/console';
77
import { organization } from './organization';
88
import { page } from '$app/state';
9+
import { user } from '$lib/stores/user';
10+
import deepEqual from 'deep-equal';
911

1012
type Preferences = {
1113
limit?: number;
@@ -27,12 +29,39 @@ type PreferencesStore = {
2729
};
2830
} & { hideAiDisclaimer?: boolean };
2931

32+
async function updateConsolePreferences(store: PreferencesStore): Promise<void> {
33+
const currentPreferences = get(user).prefs ?? (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+
3046
function createPreferences() {
3147
const { subscribe, set, update } = writable<PreferencesStore>({});
3248
let preferences: PreferencesStore = {};
3349

3450
if (browser) {
35-
set(JSON.parse(globalThis.localStorage.getItem('preferences') ?? '{}'));
51+
// fresh fetch.
52+
sdk.forConsole.account
53+
.getPrefs()
54+
.then((userPreferences) => {
55+
if (!userPreferences?.console || Array.isArray(userPreferences.console)) {
56+
userPreferences.console = {};
57+
}
58+
59+
set(userPreferences.console);
60+
})
61+
.catch(() => {
62+
// exception is thrown if there's no session; in that case - fallback!
63+
set(JSON.parse(globalThis.localStorage.getItem('preferences') ?? '{}'));
64+
});
3665
}
3766

3867
subscribe((v) => {
@@ -42,6 +71,28 @@ function createPreferences() {
4271
}
4372
});
4473

74+
/**
75+
* Update the local store and then synchronizes them on user prefs.
76+
*/
77+
function updateAndSync(callback: (prefs: PreferencesStore) => void): Promise<void> {
78+
let oldPrefsSnapshot: PreferencesStore;
79+
let newPrefsSnapshot: PreferencesStore;
80+
81+
update((currentPrefs) => {
82+
oldPrefsSnapshot = currentPrefs;
83+
callback(currentPrefs);
84+
newPrefsSnapshot = currentPrefs;
85+
return currentPrefs;
86+
});
87+
88+
if (deepEqual(oldPrefsSnapshot, newPrefsSnapshot)) {
89+
return;
90+
}
91+
92+
// sync the preferences.
93+
return updateConsolePreferences(newPrefsSnapshot);
94+
}
95+
4596
return {
4697
subscribe,
4798
set,
@@ -61,7 +112,7 @@ function createPreferences() {
61112
return preferences?.collections?.[collectionId] ?? [];
62113
},
63114
setLimit: (limit: Preferences['limit']) =>
64-
update((n) => {
115+
updateAndSync((n) => {
65116
const path = page.route.id;
66117

67118
if (!n?.[path]) {
@@ -74,7 +125,7 @@ function createPreferences() {
74125
return n;
75126
}),
76127
setView: (view: Preferences['view']) =>
77-
update((n) => {
128+
updateAndSync((n) => {
78129
const path = page.route.id;
79130

80131
if (!n?.[path]) {
@@ -87,7 +138,7 @@ function createPreferences() {
87138
return n;
88139
}),
89140
setColumns: (columns: Preferences['columns']) =>
90-
update((n) => {
141+
updateAndSync((n) => {
91142
const path = page.route.id;
92143

93144
if (!n?.[path]) {
@@ -100,10 +151,8 @@ function createPreferences() {
100151
return n;
101152
}),
102153
setCustomCollectionColumns: (columns: Preferences['columns']) =>
103-
update((n) => {
104-
const current = page;
105-
106-
const collection = current.params.collection;
154+
updateAndSync((n) => {
155+
const collection = page.params.collection;
107156
if (!n?.collections?.[collection]) {
108157
n ??= {};
109158
n.collections ??= {};

src/lib/stores/user.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { NotificationPrefItem } from '$lib/helpers/notifications';
77
export type Account = Models.User<
88
{
99
organization?: string;
10+
console: Models.Preferences;
1011
notificationPrefs: Record<string, NotificationPrefItem>;
1112
} & Record<string, string>
1213
>;

0 commit comments

Comments
 (0)