129 lines
3.4 KiB
TypeScript
129 lines
3.4 KiB
TypeScript
/*
|
|
* File: hospitalSelectors.ts
|
|
* Description: Redux selectors for Hospital state
|
|
* Design & Developed by Tech4Biz Solutions
|
|
* Copyright (c) Spurrin Innovations. All rights reserved.
|
|
*/
|
|
|
|
import { createSelector } from '@reduxjs/toolkit';
|
|
import { RootState } from '../../../store';
|
|
|
|
// ============================================================================
|
|
// BASE SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Hospital State
|
|
*
|
|
* Purpose: Get the entire hospital state from Redux store
|
|
*/
|
|
export const selectHospitalState = (state: RootState) => state.hospital;
|
|
|
|
/**
|
|
* Select Hospitals List
|
|
*
|
|
* Purpose: Get the list of hospitals
|
|
*/
|
|
export const selectHospitals = (state: RootState) => state.hospital.hospitals;
|
|
|
|
/**
|
|
* Select Hospital Loading State
|
|
*
|
|
* Purpose: Get the loading state for hospital operations
|
|
*/
|
|
export const selectHospitalLoading = (state: RootState) => state.hospital.loading;
|
|
|
|
/**
|
|
* Select Hospital Error
|
|
*
|
|
* Purpose: Get any error from hospital operations
|
|
*/
|
|
export const selectHospitalError = (state: RootState) => state.hospital.error;
|
|
|
|
// ============================================================================
|
|
// DERIVED SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Hospitals Count
|
|
*
|
|
* Purpose: Get the total number of hospitals
|
|
*/
|
|
export const selectHospitalsCount = createSelector(
|
|
[selectHospitals],
|
|
(hospitals) => hospitals?.length || 0
|
|
);
|
|
|
|
/**
|
|
* Select Hospital by ID
|
|
*
|
|
* Purpose: Get a specific hospital by its ID
|
|
*/
|
|
export const selectHospitalById = createSelector(
|
|
[selectHospitals, (_state: RootState, hospitalId: string) => hospitalId],
|
|
(hospitals, hospitalId) =>
|
|
hospitals?.find(hospital => hospital.hospital_id === hospitalId) || null
|
|
);
|
|
|
|
/**
|
|
* Select Hospital Names
|
|
*
|
|
* Purpose: Get an array of hospital names for display
|
|
*/
|
|
export const selectHospitalNames = createSelector(
|
|
[selectHospitals],
|
|
(hospitals) =>
|
|
hospitals?.map(hospital => hospital.hospital_name).filter(Boolean) || []
|
|
);
|
|
|
|
/**
|
|
* Select Hospitals for Dropdown
|
|
*
|
|
* Purpose: Get hospitals formatted for dropdown/select components
|
|
*/
|
|
export const selectHospitalsForDropdown = createSelector(
|
|
[selectHospitals],
|
|
(hospitals) =>
|
|
hospitals?.map(hospital => ({
|
|
label: hospital.hospital_name || 'Unknown Hospital',
|
|
value: hospital.hospital_id || '',
|
|
})).filter(item => item.value) || []
|
|
);
|
|
|
|
/**
|
|
* Select Filtered Hospitals
|
|
*
|
|
* Purpose: Get hospitals filtered by search term
|
|
*/
|
|
export const selectFilteredHospitals = createSelector(
|
|
[selectHospitals, (_state: RootState, searchTerm: string) => searchTerm],
|
|
(hospitals, searchTerm) => {
|
|
if (!searchTerm.trim()) return hospitals || [];
|
|
|
|
const term = searchTerm.toLowerCase();
|
|
return hospitals?.filter(hospital =>
|
|
hospital.hospital_name?.toLowerCase().includes(term)
|
|
) || [];
|
|
}
|
|
);
|
|
|
|
/**
|
|
* Select Hospital Loading Status
|
|
*
|
|
* Purpose: Get comprehensive loading status for hospital operations
|
|
*/
|
|
export const selectHospitalStatus = createSelector(
|
|
[selectHospitalLoading, selectHospitalError, selectHospitalsCount],
|
|
(loading, error, count) => ({
|
|
loading,
|
|
error,
|
|
hasData: count > 0,
|
|
isEmpty: count === 0,
|
|
})
|
|
);
|
|
|
|
/*
|
|
* End of File: hospitalSelectors.ts
|
|
* Design & Developed by Tech4Biz Solutions
|
|
* Copyright (c) Spurrin Innovations. All rights reserved.
|
|
*/
|