auth-store.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { authService } from '@/services/auth.service'
  2. import { type AdminUser } from '@/types/auth.types'
  3. import { create } from 'zustand'
  4. import { persist } from 'zustand/middleware'
  5. interface AuthState {
  6. user: AdminUser | null
  7. token: string | null
  8. isAuthenticated: boolean
  9. isHydrated: boolean
  10. profileFetched: boolean
  11. setToken: (token: string | null) => void
  12. setUser: (user: AdminUser | null) => void
  13. setHydrated: (state: boolean) => void
  14. setProfileFetched: (state: boolean) => void
  15. clearAuth: () => void
  16. logout: () => Promise<void>
  17. }
  18. export const useAuthStore = create<AuthState>()(
  19. persist(
  20. (set) => ({
  21. token: null,
  22. user: null,
  23. isAuthenticated: false,
  24. isHydrated: false,
  25. profileFetched: false,
  26. setToken: (token) =>
  27. set({
  28. token,
  29. isAuthenticated: !!token,
  30. }),
  31. setUser: (user) =>
  32. set({
  33. user,
  34. }),
  35. setHydrated: (state) =>
  36. set({
  37. isHydrated: state,
  38. }),
  39. setProfileFetched: (state) =>
  40. set({
  41. profileFetched: state,
  42. }),
  43. clearAuth: () =>
  44. set({
  45. user: null,
  46. token: null,
  47. isAuthenticated: false,
  48. profileFetched: false,
  49. }),
  50. logout: async () => {
  51. try {
  52. await authService.logout()
  53. } finally {
  54. set({
  55. user: null,
  56. token: null,
  57. isAuthenticated: false,
  58. profileFetched: false,
  59. })
  60. }
  61. },
  62. }),
  63. {
  64. name: 'auth-storage',
  65. partialize: (state) => ({
  66. user: state.user,
  67. token: state.token,
  68. isAuthenticated: state.isAuthenticated,
  69. }),
  70. onRehydrateStorage: () => (state) => {
  71. state?.setHydrated(true)
  72. },
  73. }
  74. )
  75. )