diff --git a/App.tsx b/App.tsx index 545ecf6..809b222 100644 --- a/App.tsx +++ b/App.tsx @@ -2,32 +2,37 @@ import ProvideQueryClient from "@components/providers_wrappers/ProvideQueryClien import { LOG } from "@logger"; import { NavigationContainer } from "@react-navigation/native"; import { ThemeProvider } from "@shopify/restyle"; -import { SafeAreaProvider } from "react-native-safe-area-context"; +import { injectStoreIntoAxiosInstance } from "@/axios"; import { ModalsManagerProvider } from "@/contexts/ModalsManagerContext"; import { UserAuthenticationContextProvider } from "@/contexts/UserAuthenticationContext"; import { AppMainStackNavigatorAuthWrapper } from "@/navigations/AppMainStackNavigator"; import theme from "@/themes/Theme"; - import "react-native-gesture-handler"; import "react-native-reanimated"; +import { SafeAreaProvider } from "react-native-safe-area-context"; +import { Provider } from "react-redux"; +import { store } from "./src/redux"; const log = LOG.extend("App"); +injectStoreIntoAxiosInstance(store); export default function App() { log.verbose("App started..."); return ( - - - - - - - - - - - - - + + + + + + + + + + + + + + + ); } diff --git a/src/features/auth/api.ts b/src/features/auth/api.ts new file mode 100644 index 0000000..2239919 --- /dev/null +++ b/src/features/auth/api.ts @@ -0,0 +1,11 @@ +import { axiosInstance } from "@/axios"; +import type { LoginPayload, Token } from "./types"; + +export const login = (data: LoginPayload) => { + return axiosInstance.post("/login/token/", data); +}; + +// On this one you just provide the bear token and its should return the userData. +export const getUserData = () => { + return axiosInstance.get("/login/token/"); +}; diff --git a/src/features/auth/slice.ts b/src/features/auth/slice.ts new file mode 100644 index 0000000..9eceeb4 --- /dev/null +++ b/src/features/auth/slice.ts @@ -0,0 +1,33 @@ +import type { PayloadAction } from "@reduxjs/toolkit"; +import { createSlice } from "@reduxjs/toolkit"; +import type { Token, UserData, UserDataAndToken } from "./types"; + +export interface AuthState { + isAuthenticated: boolean; + user: UserData; + token: Token; +} + +const initialState: AuthState = { + isAuthenticated: false, + user: {} as UserData, + token: {} as Token, +}; + +export const authSlice = createSlice({ + name: "auth", + initialState: initialState, + reducers: { + login: (state, action: PayloadAction) => { + state.isAuthenticated = true; + state.user = action.payload.user; + state.token = action.payload.tokens; + }, + logout: (state) => { + state = initialState; + }, + }, +}); + +export const { login, logout } = authSlice.actions; +export const authReducer = authSlice.reducer; diff --git a/src/features/auth/types.ts b/src/features/auth/types.ts new file mode 100644 index 0000000..9aaa84f --- /dev/null +++ b/src/features/auth/types.ts @@ -0,0 +1,24 @@ +export type UserData = { + id: number; + username: string; + email: string; + first_name: string; + last_name: string; + role: string; + marchand: number; +}; + +export type Token = { + access: string; + refresh: string; +}; + +export type LoginPayload = { + username: string; + password: string; +}; + +export type UserDataAndToken = { + user: UserData; + tokens: Token; +};