62 lines
1.8 KiB
TypeScript
62 lines
1.8 KiB
TypeScript
import { createReducer } from '@reduxjs/toolkit';
|
|
import { login } from './thunk';
|
|
import { UserData } from '@interfaces';
|
|
import { updateProfile } from '../../../features/editProfile/thunk';
|
|
|
|
|
|
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;
|
|
})
|
|
// Sync auth user_data after a successful profile update
|
|
.addCase(updateProfile.fulfilled, (acc, action) => {
|
|
if (acc.user_data && action.payload.user_data) {
|
|
acc.user_data = { ...acc.user_data, ...action.payload.user_data };
|
|
}
|
|
});
|
|
});
|
|
|
|
export default authReducer;
|
|
|