74 lines
1.4 KiB
TypeScript
74 lines
1.4 KiB
TypeScript
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
import { create } from "zustand";
|
|
import { createJSONStorage, persist } from "zustand/middleware";
|
|
|
|
interface UserState {
|
|
userInfo: UserInfo;
|
|
|
|
isLogged: () => boolean;
|
|
|
|
getUserId: () => number;
|
|
|
|
setUserInfo: (userInfo: UserInfo) => void;
|
|
|
|
clear: () => void;
|
|
|
|
authExpired: boolean;
|
|
setAuthExpired: (v: boolean) => void;
|
|
|
|
updateToken: (token: string) => void;
|
|
}
|
|
|
|
const defaultUserInfo: UserInfo = {
|
|
id: 0,
|
|
token: "",
|
|
nickname: "",
|
|
avatar: "",
|
|
};
|
|
|
|
export const useUserStore = create<UserState>()(
|
|
persist(
|
|
(set, get) => ({
|
|
userInfo: defaultUserInfo,
|
|
|
|
authExpired: false,
|
|
|
|
isLogged: () => !!get().userInfo?.token,
|
|
|
|
getUserId: () => get().userInfo.id,
|
|
|
|
setUserInfo: (userInfo) =>
|
|
set({
|
|
userInfo,
|
|
}),
|
|
|
|
clear: () => {
|
|
set({
|
|
userInfo: defaultUserInfo,
|
|
});
|
|
},
|
|
|
|
setAuthExpired: (v: boolean) =>
|
|
set({
|
|
authExpired: v,
|
|
}),
|
|
|
|
updateToken: (token: string) =>
|
|
set((state) => ({
|
|
userInfo: {
|
|
...state.userInfo,
|
|
token,
|
|
},
|
|
})),
|
|
}),
|
|
{
|
|
name: "user-storage",
|
|
storage: createJSONStorage(() => AsyncStorage),
|
|
|
|
partialize: (state) => ({
|
|
userInfo: state.userInfo,
|
|
}),
|
|
},
|
|
),
|
|
);
|