86 lines
3.0 KiB
TypeScript
86 lines
3.0 KiB
TypeScript
import { createAsyncThunk } from '@reduxjs/toolkit';
|
|
import { loginApi, verifyOtpApi, updateProfileApi, logoutApi } from '../../../api/authApi';
|
|
import { tokenManager } from '../../../services/apiClient';
|
|
|
|
// ─── Login ───────────────────────────────────────────────────────────────────
|
|
|
|
export const loginWithPhone = createAsyncThunk(
|
|
'auth/loginWithPhone',
|
|
async (mobileNumber: string, { rejectWithValue }) => {
|
|
try {
|
|
const response = await loginApi(mobileNumber);
|
|
return response;
|
|
} catch (error: unknown) {
|
|
const message =
|
|
error instanceof Error ? error.message : 'Login failed';
|
|
return rejectWithValue(message);
|
|
}
|
|
},
|
|
);
|
|
|
|
// ─── Verify OTP ──────────────────────────────────────────────────────────────
|
|
|
|
export const verifyOtp = createAsyncThunk(
|
|
'auth/verifyOtp',
|
|
async (
|
|
{ mobileNumber, otp }: { mobileNumber: string; otp: string },
|
|
{ rejectWithValue },
|
|
) => {
|
|
try {
|
|
const response = await verifyOtpApi(mobileNumber, otp);
|
|
|
|
// Persist tokens on successful verification
|
|
if (response.accessToken && response.refreshToken) {
|
|
await tokenManager.setTokens(
|
|
response.accessToken,
|
|
response.refreshToken,
|
|
);
|
|
}
|
|
|
|
return response;
|
|
} catch (error: unknown) {
|
|
const message =
|
|
error instanceof Error ? error.message : 'OTP verification failed';
|
|
return rejectWithValue(message);
|
|
}
|
|
},
|
|
);
|
|
|
|
// ─── Update Profile ──────────────────────────────────────────────────────────
|
|
|
|
export const updateProfile = createAsyncThunk(
|
|
'auth/updateProfile',
|
|
async (
|
|
data: { name: string; email: string; locationLabels: string[] },
|
|
{ rejectWithValue },
|
|
) => {
|
|
try {
|
|
const response = await updateProfileApi(data);
|
|
return response;
|
|
} catch (error: unknown) {
|
|
const message =
|
|
error instanceof Error ? error.message : 'Profile update failed';
|
|
return rejectWithValue(message);
|
|
}
|
|
},
|
|
);
|
|
|
|
// ─── Logout ──────────────────────────────────────────────────────────────────
|
|
|
|
export const logoutUser = createAsyncThunk(
|
|
'auth/logoutUser',
|
|
async (_, { rejectWithValue }) => {
|
|
try {
|
|
const response = await logoutApi();
|
|
await tokenManager.clearTokens();
|
|
return response;
|
|
} catch (error: unknown) {
|
|
// Clear tokens even if API call fails
|
|
await tokenManager.clearTokens();
|
|
const message =
|
|
error instanceof Error ? error.message : 'Logout failed';
|
|
return rejectWithValue(message);
|
|
}
|
|
},
|
|
);
|