Makelore 2.0 initial clean snapshot
This commit is contained in:
67
src/stores/user-sync.ts
Normal file
67
src/stores/user-sync.ts
Normal file
@@ -0,0 +1,67 @@
|
||||
import { create } from 'zustand';
|
||||
import {
|
||||
fetchUserSyncBootstrap,
|
||||
pushUserSyncPartner,
|
||||
pushUserSyncPreferences,
|
||||
} from '@/lib/user-sync';
|
||||
import { useAuthStore } from '@/stores/auth';
|
||||
import { usePartnerProfilesStore } from '@/stores/partner-profiles';
|
||||
import { useProviderStore } from '@/stores/providers';
|
||||
import { useSettingsStore } from '@/stores/settings';
|
||||
import type { UserSyncPartner, UserSyncPreferences } from '../../shared/user-sync';
|
||||
|
||||
type UserSyncState = {
|
||||
loading: boolean;
|
||||
error: string | null;
|
||||
lastSyncedAt: string | null;
|
||||
bootstrap: () => Promise<void>;
|
||||
pushPreferences: (preferences: UserSyncPreferences) => Promise<void>;
|
||||
pushPartner: (partner: UserSyncPartner) => Promise<void>;
|
||||
};
|
||||
|
||||
export const useUserSyncStore = create<UserSyncState>((set) => ({
|
||||
loading: false,
|
||||
error: null,
|
||||
lastSyncedAt: null,
|
||||
|
||||
bootstrap: async () => {
|
||||
const accessToken = await useAuthStore.getState().getValidAccessToken();
|
||||
if (!accessToken) return;
|
||||
|
||||
set({ loading: true, error: null });
|
||||
try {
|
||||
const bootstrap = await fetchUserSyncBootstrap(accessToken);
|
||||
useSettingsStore.getState().applySyncedPreferences(bootstrap.preferences);
|
||||
usePartnerProfilesStore.getState().applySyncedPartners(bootstrap.partners);
|
||||
await useProviderStore.getState().refreshProviderSnapshot();
|
||||
set({ loading: false, lastSyncedAt: new Date().toISOString(), error: null });
|
||||
} catch (error) {
|
||||
set({
|
||||
loading: false,
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
pushPreferences: async (preferences) => {
|
||||
const accessToken = await useAuthStore.getState().getValidAccessToken();
|
||||
if (!accessToken) return;
|
||||
try {
|
||||
await pushUserSyncPreferences(accessToken, preferences);
|
||||
set({ lastSyncedAt: new Date().toISOString(), error: null });
|
||||
} catch (error) {
|
||||
set({ error: error instanceof Error ? error.message : String(error) });
|
||||
}
|
||||
},
|
||||
|
||||
pushPartner: async (partner) => {
|
||||
const accessToken = await useAuthStore.getState().getValidAccessToken();
|
||||
if (!accessToken) return;
|
||||
try {
|
||||
await pushUserSyncPartner(accessToken, partner);
|
||||
set({ lastSyncedAt: new Date().toISOString(), error: null });
|
||||
} catch (error) {
|
||||
set({ error: error instanceof Error ? error.message : String(error) });
|
||||
}
|
||||
},
|
||||
}));
|
||||
Reference in New Issue
Block a user