/* * File: hospitalSlice.ts * Description: Redux slice for Hospital state management (non-persisted) * Design & Developed by Tech4Biz Solutions * Copyright (c) Spurrin Innovations. All rights reserved. */ import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'; import { authAPI } from '../services/authAPI'; import { showError } from '../../../shared/utils/toast'; // ============================================================================ // INTERFACES // ============================================================================ /** * Hospital Interface * * Purpose: Defines the structure for hospital data */ interface Hospital { hospital_id: string | null; hospital_name: string | null; } /** * Hospital State Interface * * Purpose: Defines the structure for hospital state */ interface HospitalState { hospitals: Hospital[] | null; loading: boolean; error: string | null; } // ============================================================================ // ASYNC THUNKS // ============================================================================ /** * Fetch Hospitals Async Thunk * * Purpose: Fetch hospital list from API * * Features: * - API integration with error handling * - Loading state management * - Toast notifications for errors * - Automatic state updates */ export const fetchHospitals = createAsyncThunk( 'hospital/fetchHospitals', async (_, { rejectWithValue }) => { try { const response: any = await authAPI.gethospitals(); console.log('hospital response', response); if (response.ok && response.data && response.data.data) { return response.data.data; } else { showError('Error while fetching hospital list'); return rejectWithValue('Failed to fetch hospitals'); } } catch (error: any) { console.log('Hospital fetch error:', error); showError('Error while fetching hospital list'); return rejectWithValue(error.message || 'Network error'); } } ); // ============================================================================ // INITIAL STATE // ============================================================================ const initialState: HospitalState = { hospitals: [], loading: false, error: null, }; // ============================================================================ // HOSPITAL SLICE // ============================================================================ /** * Hospital Slice * * Purpose: Manages hospital-related state * * Features: * - Hospital list management * - Loading states for API calls * - Error handling and display * - Non-persisted state (not stored in AsyncStorage) */ const hospitalSlice = createSlice({ name: 'hospital', initialState, reducers: { /** * Set Hospitals Action * * Purpose: Manually set hospital list */ setHospitals(state, action: PayloadAction) { state.hospitals = action.payload; state.loading = false; state.error = null; }, /** * Clear Hospitals Action * * Purpose: Clear hospital list and reset state */ clearHospitals(state) { state.hospitals = []; state.loading = false; state.error = null; }, /** * Clear Error Action * * Purpose: Clear error state */ clearError(state) { state.error = null; }, }, extraReducers: (builder) => { builder // Fetch Hospitals - Pending .addCase(fetchHospitals.pending, (state) => { state.loading = true; state.error = null; }) // Fetch Hospitals - Fulfilled .addCase(fetchHospitals.fulfilled, (state, action) => { state.loading = false; state.hospitals = action.payload; state.error = null; }) // Fetch Hospitals - Rejected .addCase(fetchHospitals.rejected, (state, action) => { state.loading = false; state.error = action.payload as string || 'Failed to fetch hospitals'; }); }, }); // ============================================================================ // EXPORTS // ============================================================================ export const { setHospitals, clearHospitals, clearError, } = hospitalSlice.actions; export default hospitalSlice.reducer; /* * End of File: hospitalSlice.ts * Design & Developed by Tech4Biz Solutions * Copyright (c) Spurrin Innovations. All rights reserved. */