BaaS_Driver_Android_App/store/userSlice.ts

114 lines
2.8 KiB
TypeScript

// src/store/userSlice.ts
import { createSlice, createAsyncThunk, PayloadAction } from "@reduxjs/toolkit";
import api from "../services/axiosClient";
import { BASE_URL } from "@/constants/config";
interface Vehicle {
vehicle_id: number;
model: string;
chasis_number: string;
}
interface UserData {
user_id: number;
name: string;
mobile: string;
email: string | null;
profile_url: string | null;
vehicles: Vehicle[];
batteries: Battery[];
}
interface Battery {
battery_id: string;
warranty_status: boolean;
battery_model: string;
bms_id: string;
warranty_start_date: string;
warranty_end_date: string;
vim_id: string;
serial_no: string;
charger_uid: string;
}
interface UserState {
data: UserData | null;
loading: boolean;
error: string | null;
}
const initialState: UserState = {
data: null,
loading: false,
error: null,
};
// 🔁 Thunk to get user details
export const getUserDetails = createAsyncThunk<UserData>(
"user/getUserDetails",
async (_, { rejectWithValue }) => {
try {
console.log("Fetching user details from API...");
const response = await api.get(`${BASE_URL}/api/v1/get-user-details`);
if (response.data.success) {
console.log("User details fetched successfully:", response.data.data);
return response.data.data;
} else {
console.error("Failed to fetch user data:", response.data.message);
return rejectWithValue("Failed to fetch user data");
}
} catch (error: any) {
const message =
error.response?.data?.message ||
error.message ||
"Something went wrong";
console.log("Error fetching user details:", message);
return rejectWithValue(message);
}
}
);
const userSlice = createSlice({
name: "user",
initialState,
reducers: {
clearUser: (state) => {
state.data = null;
state.error = null;
state.loading = false;
},
setUserData: (state, action: PayloadAction<Partial<UserData>>) => {
if (state.data) {
state.data = {
...state.data,
...action.payload,
};
} else {
console.warn("Cannot update user data, user data is not loaded");
}
},
},
extraReducers: (builder) => {
builder
.addCase(getUserDetails.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(
getUserDetails.fulfilled,
(state, action: PayloadAction<UserData>) => {
state.loading = false;
state.data = action.payload;
}
)
.addCase(getUserDetails.rejected, (state, action) => {
state.loading = false;
state.error = action.payload as string;
});
},
});
export const { clearUser, setUserData } = userSlice.actions;
export default userSlice.reducer;