first commit

This commit is contained in:
TuanVT
2026-05-23 09:48:07 +07:00
parent 03b9101bd5
commit b6ccde2c74
134 changed files with 7178 additions and 110 deletions
+45
View File
@@ -0,0 +1,45 @@
import { PayloadAction, createSlice } from "@reduxjs/toolkit";
export interface IDataLoginStorage {
usernameStorage: string;
passwordStorage: string;
}
export interface AuthState {
token: string | null;
isLogin: boolean;
dataLoginStorage: IDataLoginStorage | null;
}
const initialState: AuthState = {
token: null,
isLogin: false,
dataLoginStorage: null,
};
export const authSlice = createSlice({
name: "auth",
initialState,
reducers: {
setToken: (state, action: PayloadAction<string | null>) => {
state.token = action?.payload;
},
setStateLogin: (state, action: { payload: boolean }) => {
state.isLogin = action?.payload;
},
logout: (state) => {
state.isLogin = false;
state.token = null;
},
setDataLoginStorage: (
state,
action: PayloadAction<IDataLoginStorage | null>,
) => {
state.dataLoginStorage = action?.payload;
},
},
});
export const { setToken, setStateLogin, logout, setDataLoginStorage } =
authSlice.actions;
export default authSlice.reducer;
+28
View File
@@ -0,0 +1,28 @@
import { PayloadAction, createSlice } from "@reduxjs/toolkit";
export interface SiteState {
loading: boolean;
isRememberPassword: boolean;
}
const initialState: SiteState = {
loading: true,
isRememberPassword: false,
};
export const siteSlice = createSlice({
name: "site",
initialState,
reducers: {
setLoading: (state, action: PayloadAction<boolean>) => {
state.loading = action?.payload;
},
setRememberPassword: (state, action: PayloadAction<boolean>) => {
state.isRememberPassword = action.payload;
},
},
});
export const { setLoading, setRememberPassword } = siteSlice.actions;
// Action creators are generated for each case reducer function
export default siteSlice.reducer;
+31
View File
@@ -0,0 +1,31 @@
import { PayloadAction, createSlice } from "@reduxjs/toolkit";
interface IUser {
accessToken: string;
refreshToken: string;
accessExpiresAt: string;
refreshExpiresAt: string;
avatar: string;
fullname: string;
}
export interface UserState {
infoUser: IUser | null;
}
const initialState: UserState = {
infoUser: null,
};
export const userSlice = createSlice({
name: "user",
initialState,
reducers: {
setInfoUser: (state, action: PayloadAction<IUser | null>) => {
state.infoUser = action?.payload;
},
},
});
export const { setInfoUser } = userSlice.actions;
export default userSlice.reducer;
+21
View File
@@ -0,0 +1,21 @@
import { combineReducers } from "redux";
import { configureStore } from "@reduxjs/toolkit";
import siteReducer from "./reducer/site";
import authReducer from "./reducer/auth";
import userReducer from "./reducer/user";
const reducers = combineReducers({
site: siteReducer,
auth: authReducer,
user: userReducer,
});
export const store = configureStore({
reducer: reducers,
devTools: process.env.NODE_ENV !== "production",
middleware: (getDefaultMiddleware) => getDefaultMiddleware(),
});
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;