Files
makelore/src/stores/user-sync.ts
2026-07-29 17:22:35 +08:00

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) });
}
},
}));