62 lines
1.7 KiB
TypeScript

import { createAction, createReducer } from '@reduxjs/toolkit';
import { login } from './thunk';
import { UserData } from '@interfaces';
// Patch user_data in auth state after a successful profile update
export const updateUserData = createAction<Partial<UserData>>('auth/updateUserData');
export interface LoginState {
loginSuccess: boolean;
loginLoading: boolean;
status: boolean;
is_twofactor: boolean;
user_data: UserData | null;
token: string | null;
loginError: string | null;
loginMessage: string | null;
}
const initialState: LoginState = {
loginSuccess: false,
loginLoading: false,
status: false,
is_twofactor: false,
user_data: null,
token: null,
loginError: null,
loginMessage: null,
};
export const authReducer = createReducer(initialState, builder => {
builder
.addCase(login.pending, acc => {
acc.loginLoading = true;
acc.loginError = null;
acc.loginMessage = null;
})
.addCase(login.fulfilled, (acc, action) => {
acc.loginLoading = false;
acc.status = action.payload.status;
acc.is_twofactor = action.payload.is_twofactor;
acc.user_data = action.payload.user_data;
acc.token = action.payload.token;
acc.loginSuccess = true;
acc.loginError = null;
acc.loginMessage = null;
})
.addCase(login.rejected, (acc, { error, payload }) => {
acc.loginLoading = false;
acc.loginError = (payload as string) ?? error.message ?? 'Login failed';
acc.loginMessage = (payload as string) ?? error.message ?? 'Login failed';
acc.loginSuccess = false;
})
.addCase(updateUserData, (acc, action) => {
if (acc.user_data) {
acc.user_data = { ...acc.user_data, ...action.payload };
}
});
});
export default authReducer;