68 lines
2.1 KiB
TypeScript

import { createReducer } from '@reduxjs/toolkit';
import { LoginResponse, VerifyOtpResponse } from '../../../interfaces';
import { loginWithPhone, verifyOtp } from './thunk';
import { User } from '@interfaces/auth';
// ─── State ───────────────────────────────────────────────────────────────────
export interface AuthState {
loginData: LoginResponse | null;
user: User | null;
accessToken: string | null;
refreshToken: string | null;
isNewUser: boolean | null;
error: string | null;
isLoading: boolean;
}
const initialState: AuthState = {
loginData: null,
user: null,
accessToken: null,
refreshToken: null,
isNewUser: null,
isLoading: false,
error: null,
};
// ─── Reducer ─────────────────────────────────────────────────────────────────
const authReducer = createReducer(initialState, builder => {
builder
// Login
.addCase(loginWithPhone.pending, state => {
state.isLoading = true;
state.error = null;
})
.addCase(loginWithPhone.fulfilled, (state, action) => {
state.loginData = action.payload;
state.isLoading = false;
state.error = null;
})
.addCase(loginWithPhone.rejected, (state, action) => {
state.isLoading = false;
state.error = action.payload as string;
})
// Verify OTP
.addCase(verifyOtp.pending, state => {
state.isLoading = true;
state.error = null;
})
.addCase(verifyOtp.fulfilled, (state, action) => {
const { user, accessToken, refreshToken, isNewUser } = action.payload;
state.user = user;
state.accessToken = accessToken;
state.refreshToken = refreshToken;
state.isNewUser = isNewUser;
state.isLoading = false;
state.error = null;
})
.addCase(verifyOtp.rejected, (state, action) => {
state.isLoading = false;
state.error = action.payload as string;
});
});
export default authReducer;