source: chapterx-frontend/src/store/authStore.ts@ b62cefc

main
Last change on this file since b62cefc was b62cefc, checked in by kikisrbinoska <srbinoskakristina07@…>, 4 months ago

Added frontend and imporoved AI Suggestions service

  • Property mode set to 100644
File size: 3.9 KB
RevLine 
[b62cefc]1import { create } from 'zustand'
2import { persist } from 'zustand/middleware'
3import { User, UserRole } from '../types'
4import { mockUsers } from '../data/mockData'
5import axios from 'axios'
6
7const API_BASE = 'https://localhost:7125/api'
8
9interface AuthStore {
10 currentUser: User | null
11 token: string | null
12 showMatureContent: boolean
13 allUsers: User[]
14 login: (emailOrUsername: string, password: string) => Promise<void>
15 logout: () => void
16 register: (data: { username: string; email: string; name: string; surname: string; password: string }, role: 'regular' | 'writer') => Promise<void>
17 switchUser: (userId: number) => void
18 setShowMatureContent: (show: boolean) => void
19 updateUserRole: (userId: number, role: UserRole) => void
20 addUser: (user: User) => void
21}
22
23export const useAuthStore = create<AuthStore>()(
24 persist(
25 (set, get) => ({
26 currentUser: null,
27 token: null,
28 showMatureContent: true,
29 allUsers: [...mockUsers],
30
31 login: async (emailOrUsername, password) => {
32 // Try backend first
33 try {
34 const email = emailOrUsername.includes('@')
35 ? emailOrUsername
36 : get().allUsers.find(u => u.username === emailOrUsername)?.email || emailOrUsername
37 const res = await axios.post(`${API_BASE}/auth/login`, { email, password }, { timeout: 3000 })
38 const { token, userId, username } = res.data
39 const user = get().allUsers.find(u => u.user_id === userId) ||
40 get().allUsers.find(u => u.username === username) || {
41 user_id: userId,
42 username,
43 email,
44 name: username,
45 surname: '',
46 role: 'regular' as const,
47 created_at: new Date().toISOString(),
48 follower_count: 0,
49 following_count: 0,
50 }
51 set({ currentUser: user, token })
52 return
53 } catch {
54 // Fall through to mock login
55 }
56
57 // Fallback to mock
58 const user = get().allUsers.find(
59 u => u.username === emailOrUsername || u.email === emailOrUsername
60 )
61 if (!user) throw new Error('User not found. Try using a quick-login option.')
62 set({ currentUser: user, token: 'mock-token' })
63 },
64
65 logout: () => set({ currentUser: null, token: null }),
66
67 register: async (data, role) => {
68 // Try backend first
69 try {
70 await axios.post(`${API_BASE}/auth/register`, data, { timeout: 3000 })
71 } catch {
72 // Fall through to mock register
73 }
74
75 const newUser: User = {
76 user_id: Date.now(),
77 ...data,
78 role,
79 created_at: new Date().toISOString(),
80 follower_count: 0,
81 following_count: 0,
82 }
83 set(state => ({
84 allUsers: [...state.allUsers, newUser],
85 currentUser: newUser,
86 token: 'mock-token',
87 }))
88 },
89
90 switchUser: (userId: number) => {
91 if (userId === 0) {
92 set({ currentUser: null, token: null })
93 return
94 }
95 const user = get().allUsers.find(u => u.user_id === userId)
96 if (user) set({ currentUser: user, token: 'mock-token' })
97 },
98
99 setShowMatureContent: (show: boolean) => set({ showMatureContent: show }),
100
101 updateUserRole: (userId: number, role: UserRole) =>
102 set(state => ({
103 allUsers: state.allUsers.map(u => (u.user_id === userId ? { ...u, role } : u)),
104 currentUser:
105 state.currentUser?.user_id === userId
106 ? { ...state.currentUser, role }
107 : state.currentUser,
108 })),
109
110 addUser: (user: User) =>
111 set(state => ({ allUsers: [...state.allUsers, user] })),
112 }),
113 {
114 name: 'chapterx-auth',
115 partialize: s => ({
116 currentUser: s.currentUser,
117 token: s.token,
118 showMatureContent: s.showMatureContent,
119 }),
120 }
121 )
122)
Note: See TracBrowser for help on using the repository browser.