68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
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) });
|
|
}
|
|
},
|
|
}));
|