@oxyhq/services
Version:
Reusable OxyHQ module to handle authentication, user management, karma system, device-based session management and more 🚀
89 lines (87 loc) • 2.36 kB
JavaScript
;
import { create } from 'zustand';
export const useAuthStore = create((set, get) => ({
user: null,
isAuthenticated: false,
isLoading: false,
error: null,
lastUserFetch: null,
loginSuccess: user => set({
isLoading: false,
isAuthenticated: true,
user,
lastUserFetch: Date.now()
}),
loginFailure: error => set({
isLoading: false,
error
}),
logout: () => set({
user: null,
isAuthenticated: false,
lastUserFetch: null
}),
setUser: user => set({
user,
lastUserFetch: Date.now()
}),
fetchUser: async (oxyServices, forceRefresh = false) => {
const state = get();
const now = Date.now();
const cacheAge = state.lastUserFetch ? now - state.lastUserFetch : Number.POSITIVE_INFINITY;
const cacheValid = cacheAge < 5 * 60 * 1000; // 5 minutes cache
// Use cached data if available and not forcing refresh
if (!forceRefresh && state.user && cacheValid) {
if (__DEV__) {
console.log('AuthStore: Using cached user data (age:', cacheAge, 'ms)');
}
return;
}
set({
isLoading: true,
error: null
});
try {
const user = await oxyServices.getCurrentUser();
set({
user,
isLoading: false,
isAuthenticated: true,
lastUserFetch: now
});
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Failed to fetch user';
if (__DEV__) {
console.error('AuthStore: Error fetching user:', error);
}
set({
error: errorMessage,
isLoading: false
});
}
},
updateUser: async (updates, oxyServices) => {
set({
isLoading: true,
error: null
});
try {
await oxyServices.updateProfile(updates);
// Immediately fetch the latest user data after update
// Use arrow function to preserve 'this' context
await useAuthStore.getState().fetchUser({
getCurrentUser: () => oxyServices.getCurrentUser()
}, true);
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Failed to update user';
if (__DEV__) {
console.error('AuthStore: Error updating user:', error);
}
set({
error: errorMessage,
isLoading: false
});
}
}
}));
//# sourceMappingURL=authStore.js.map