返回 AiToEarn
index.ts
根目录 / project / aitoearn-web / src / store / user / index.ts
1 import i18next from 'i18next'
2 import lodash from 'lodash'
3 import { getUserInfoApi } from '@/api/auth/auth.api'
4 import { createPersistStore } from '@/utils/storage/createPersistStore'
5 import { useAccountStore } from '../account'
6
7 export interface UserInfo {
8 createdAt: string
9 id: string
10 name: string
11 password: string
12 phone?: string
13 mail: string
14 salt: string
15 status: number
16 updateTime: string
17 _id: string
18 avatar?: string
19 score?: number
20 income?: number
21 popularizeCode?: string
22 placeId?: string
23 }
24
25 export interface IUserStore {
26 token?: string
27 userInfo?: Partial<UserInfo>
28 isAddAccountPorxy: boolean
29 lang: string
30 creditsBalance: number
31 creditsLoading: boolean
32 creditsInitialized: boolean
33 seedanceCreditsBalance: number
34 seedanceCreditsAvailableBalance: number
35 seedanceCreditsLoading: boolean
36 seedanceCreditsInitialized: boolean
37 sidebarCollapsed: boolean
38 defaultPlanId?: string
39 hasEverLoggedIn: boolean
40 }
41
42 const state: IUserStore = {
43 token: undefined,
44 userInfo: {},
45 isAddAccountPorxy: false,
46 lang: i18next.language || 'en',
47 creditsBalance: 0,
48 creditsLoading: false,
49 creditsInitialized: false,
50 seedanceCreditsBalance: 0,
51 seedanceCreditsAvailableBalance: 0,
52 seedanceCreditsLoading: false,
53 seedanceCreditsInitialized: false,
54 sidebarCollapsed: false,
55 defaultPlanId: undefined,
56 hasEverLoggedIn: false,
57 }
58
59 function getState(): IUserStore {
60 return lodash.cloneDeep(state)
61 }
62
63 export const useUserStore = createPersistStore(
64 {
65 ...getState(),
66 },
67 (set, _get) => {
68 const methods = {
69 setLang(lang: string) {
70 set({ lang })
71 },
72 setIsAddAccountPorxy(isAddAccountPorxy: boolean) {
73 set({ isAddAccountPorxy })
74 },
75 setToken(token: string) {
76 set({
77 token,
78 hasEverLoggedIn: true,
79 creditsInitialized: false,
80 seedanceCreditsInitialized: false,
81 })
82 },
83 setUserInfo(userInfo: UserInfo) {
84 set({ userInfo })
85 },
86 appInit(autoLoginToken?: string) {
87 if (!_get().token && autoLoginToken) {
88 methods.setToken(autoLoginToken)
89 }
90 methods.getUserInfo()
91 useAccountStore.getState().accountInit()
92 },
93 async getUserInfo() {
94 const res = await getUserInfoApi()
95 if (res?.code === 0 && res.data) {
96 set({ userInfo: res.data })
97 return res.data
98 }
99 },
100 async fetchCreditsBalance() {
101 set({ creditsInitialized: true })
102 },
103 setCreditsBalance(balance: number) {
104 set({ creditsBalance: balance, creditsInitialized: true })
105 },
106 fetchSeedanceCreditsBalance() {
107 const balance = _get().creditsBalance
108 set({
109 seedanceCreditsBalance: balance,
110 seedanceCreditsAvailableBalance: balance,
111 seedanceCreditsInitialized: true,
112 })
113 },
114 setSeedanceCreditsBalance(balance: number) {
115 set({
116 seedanceCreditsBalance: balance,
117 seedanceCreditsAvailableBalance: balance,
118 seedanceCreditsInitialized: true,
119 })
120 },
121 setSidebarCollapsed(collapsed: boolean) {
122 set({ sidebarCollapsed: collapsed })
123 },
124 setDefaultPlanId(planId: string | undefined) {
125 set({ defaultPlanId: planId })
126 },
127 }
128
129 return methods
130 },
131 {
132 name: 'User',
133 partialize: (storeState) => {
134 const {
135 creditsInitialized,
136 creditsLoading,
137 seedanceCreditsInitialized,
138 seedanceCreditsLoading,
139 ...rest
140 } = storeState
141 return rest as typeof storeState
142 },
143 },
144 'localStorage',
145 )
146
146 lines TYPESCRIPT