feat: rebuild email platform and operations console

This commit is contained in:
2026-07-25 23:06:15 +08:00
parent c109abc6f5
commit 32e0969ca1
443 changed files with 56446 additions and 1585 deletions
+91
View File
@@ -0,0 +1,91 @@
import { create } from 'zustand'
import { getCookie, removeCookie, setCookie } from '@/lib/cookies'
const AUTH_SESSION = 'email_unlimit_admin_session'
export interface AuthUser {
id: string
email: string
role: string
status: string
}
interface StoredSession {
user: AuthUser | null
accessToken: string
refreshToken: string
}
interface AuthState {
auth: StoredSession & {
setSession: (
user: AuthUser,
accessToken: string,
refreshToken: string
) => void
setTokens: (accessToken: string, refreshToken: string) => void
reset: () => void
}
}
function readSession(): StoredSession {
const raw = getCookie(AUTH_SESSION)
if (!raw) {
return { user: null, accessToken: '', refreshToken: '' }
}
try {
const value = JSON.parse(decodeURIComponent(raw)) as Partial<StoredSession>
return {
user: value.user ?? null,
accessToken: value.accessToken ?? '',
refreshToken: value.refreshToken ?? '',
}
} catch {
removeCookie(AUTH_SESSION)
return { user: null, accessToken: '', refreshToken: '' }
}
}
function persistSession(session: StoredSession) {
setCookie(AUTH_SESSION, encodeURIComponent(JSON.stringify(session)))
}
export const useAuthStore = create<AuthState>()((set) => {
const initial = readSession()
return {
auth: {
...initial,
setSession: (user, accessToken, refreshToken) =>
set((state) => {
const session = { user, accessToken, refreshToken }
persistSession(session)
return { ...state, auth: { ...state.auth, ...session } }
}),
setTokens: (accessToken, refreshToken) =>
set((state) => {
const session = { ...state.auth, accessToken, refreshToken }
persistSession({
user: session.user,
accessToken,
refreshToken,
})
return { ...state, auth: session }
}),
reset: () =>
set((state) => {
removeCookie(AUTH_SESSION)
return {
...state,
auth: {
...state.auth,
user: null,
accessToken: '',
refreshToken: '',
},
}
}),
},
}
})