From db5840e0b79aecb81a3c9d697146d53fafe94bc1 Mon Sep 17 00:00:00 2001 From: alij Date: Sun, 16 Jun 2024 01:24:40 +0430 Subject: [PATCH] feat : add redux --- src/redux/slices/token.ts | 26 +++++++++++++++++ src/redux/store.ts | 61 +++++++++++++++++++++++++++++++++++++++ src/types/props.d.ts | 12 ++++++++ src/types/type.d.ts | 0 src/utils/auth.ts | 19 ++++++++++-- 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 src/redux/slices/token.ts create mode 100644 src/redux/store.ts create mode 100644 src/types/type.d.ts diff --git a/src/redux/slices/token.ts b/src/redux/slices/token.ts new file mode 100644 index 0000000..58e547c --- /dev/null +++ b/src/redux/slices/token.ts @@ -0,0 +1,26 @@ +// src/slices/token.ts +import { createSlice, PayloadAction } from "@reduxjs/toolkit"; + +// Initial type for the token state +interface TokenState { + token: string; +} + +// Initial value for the token state +const initialState: TokenState = { + token: "", +}; + +const tokenSlice = createSlice({ + name: "token", + initialState, + reducers: { + setToken: (state, action: PayloadAction) => { + state.token = action.payload; + }, + }, +}); + +export const { setToken } = tokenSlice.actions; + +export default tokenSlice.reducer; diff --git a/src/redux/store.ts b/src/redux/store.ts new file mode 100644 index 0000000..8b780aa --- /dev/null +++ b/src/redux/store.ts @@ -0,0 +1,61 @@ +// src/store.ts +import { configureStore } from "@reduxjs/toolkit"; +import { encryptTransform } from "redux-persist-transform-encrypt"; +import storage from "redux-persist/lib/storage"; +import { + persistStore, + persistReducer, + PersistConfig, + FLUSH, + REHYDRATE, + PAUSE, + PERSIST, + PURGE, + REGISTER, +} from "redux-persist"; +import tokenReducer from "./slices/token"; + +// Encryption settings +const secretKey = "token-encrypt-api"; +const encryptor = encryptTransform({ + secretKey, + onError: (error) => { + console.log(error); + }, +}); + +// Type definition for the token state +interface TokenState { + token: string; +} + +// Persist configuration for the token +const persistConfigToken: PersistConfig = { + key: "token", + storage, + transforms: [encryptor], // Correct the typo (transform -> transforms) +}; + +// Use persistReducer with the configuration and token reducer +const persistedTokenReducer = persistReducer(persistConfigToken, tokenReducer); + +// Store configuration +const store = configureStore({ + reducer: { + token: persistedTokenReducer, + }, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware({ + serializableCheck: { + ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER], + }, + }), +}); + +// Types for AppDispatch and RootState +export type AppDispatch = typeof store.dispatch; +export type RootState = ReturnType; + +export const persistor = persistStore(store); + +export default store; diff --git a/src/types/props.d.ts b/src/types/props.d.ts index 0ac74ef..3b68506 100644 --- a/src/types/props.d.ts +++ b/src/types/props.d.ts @@ -57,6 +57,7 @@ import React, { ReactNode, SetStateAction, } from "react"; +import { FormikProps } from "formik"; export type TutorialList = { id: number; name: string }[]; @@ -135,3 +136,14 @@ export interface ProgressSpaceProps { startSpace: number; endSpace: number | "ultimate"; } + +export interface LoginFormValues { + mobile: string; + email: string; + mobileCode: string; + emailPassword: string; +} + +export interface LoginFromikProps { + formik: FormikProps; +} diff --git a/src/types/type.d.ts b/src/types/type.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/auth.ts b/src/utils/auth.ts index d10c8b7..df34fa4 100644 --- a/src/utils/auth.ts +++ b/src/utils/auth.ts @@ -1,3 +1,18 @@ -export const isAuthenticated = () => { - return false; +import { useSelector } from "react-redux"; +import { RootState } from "../redux/store"; + +const isTokenValid = (token: string): boolean => { + try { + if (!token) return false; + + return !!token; + } catch (error) { + console.error("Token validation error:", error); + return false; + } +}; + +export const isAuthenticated = () : boolean => { + const {token} = useSelector((state : RootState) => state.token) + return isTokenValid(token); };