90 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 (phone: string, { rejectWithValue }) => {
try {
const response = await loginApi(phone);
console.log(response);
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 (
{ phone, code, role }: { phone: string; code: string; role: string },
{ rejectWithValue },
) => {
try {
const response = await verifyOtpApi(phone, code, role);
// 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);
}
},
);