NeoScan_Physician/app/modules/Dashboard/hooks/usePredictions.ts
2025-08-22 00:24:24 +05:30

183 lines
4.9 KiB
TypeScript

/*
* File: usePredictions.ts
* Description: Custom hook for managing AI predictions state and actions
* Design & Developed by Tech4Biz Solutions
* Copyright (c) Spurrin Innovations. All rights reserved.
*/
import { useEffect, useCallback } from 'react';
import { useAppDispatch, useAppSelector } from '../../../store/hooks';
import {
fetchAllPredictions,
setActiveTab,
setSearchQuery,
clearErrors,
clearSearch,
selectActiveTab,
selectSearchQuery,
selectPredictionsWithFeedback,
selectPredictionsWithoutFeedback,
selectIsLoading,
selectError,
selectCurrentPredictions,
selectCurrentLoadingState,
selectCurrentError,
} from '../redux/predictionsSlice';
import { selectUser } from '../../Auth/redux';
import type { PredictionTabType } from '../types/predictions';
// ============================================================================
// USE PREDICTIONS HOOK
// ============================================================================
/**
* usePredictions Hook
*
* Purpose: Manage AI predictions state and provide actions
*
* Features:
* - Fetch all predictions from single API call
* - Frontend filtering for feedback status
* - Manage active tab state
* - Handle search functionality
* - Provide loading and error states
* - Auto-fetch data when needed
*/
export const usePredictions = () => {
const dispatch = useAppDispatch();
// ============================================================================
// SELECTORS
// ============================================================================
const activeTab = useAppSelector(selectActiveTab);
const searchQuery = useAppSelector(selectSearchQuery);
const predictionsWithFeedback = useAppSelector(selectPredictionsWithFeedback);
const predictionsWithoutFeedback = useAppSelector(selectPredictionsWithoutFeedback);
const isLoading = useAppSelector(selectIsLoading);
const error = useAppSelector(selectError);
const currentPredictions = useAppSelector(selectCurrentPredictions);
const currentLoadingState = useAppSelector(selectCurrentLoadingState);
const currentError = useAppSelector(selectCurrentError);
// Get authentication token from auth store
const authToken = useAppSelector(selectUser)?.access_token;
// ============================================================================
// ACTIONS
// ============================================================================
/**
* Switch Active Tab
*
* Purpose: Change between feedback tabs
*/
const switchTab = useCallback((tab: PredictionTabType) => {
dispatch(setActiveTab(tab));
}, [dispatch]);
/**
* Update Search Query
*
* Purpose: Update search query for filtering predictions
*/
const updateSearchQuery = useCallback((query: string) => {
dispatch(setSearchQuery(query));
}, [dispatch]);
/**
* Clear Search
*
* Purpose: Clear search query
*/
const clearSearchQuery = useCallback(() => {
dispatch(clearSearch());
}, [dispatch]);
/**
* Clear Errors
*
* Purpose: Clear error states
*/
const clearErrorStates = useCallback(() => {
dispatch(clearErrors());
}, [dispatch]);
/**
* Refresh Predictions
*
* Purpose: Refresh all predictions data
*/
const refreshPredictions = useCallback(() => {
if (!authToken) return;
dispatch(fetchAllPredictions(authToken));
}, [dispatch, authToken]);
/**
* Fetch All Predictions
*
* Purpose: Fetch all predictions from API
*/
const fetchPredictions = useCallback(() => {
if (!authToken) return;
dispatch(fetchAllPredictions(authToken));
}, [dispatch, authToken]);
// ============================================================================
// EFFECTS
// ============================================================================
/**
* Auto-fetch data when component mounts or token changes
*/
useEffect(() => {
if (!authToken) return;
// Only fetch if we don't have any predictions yet
if (predictionsWithFeedback.length === 0 && predictionsWithoutFeedback.length === 0) {
dispatch(fetchAllPredictions(authToken));
}
}, [authToken, predictionsWithFeedback.length, predictionsWithoutFeedback.length, dispatch]);
// ============================================================================
// RETURN VALUES
// ============================================================================
return {
// State
activeTab,
searchQuery,
predictionsWithFeedback,
predictionsWithoutFeedback,
currentPredictions,
// Loading states
isLoading,
currentLoadingState,
// Error states
error,
currentError,
// Actions
switchTab,
updateSearchQuery,
clearSearchQuery,
clearErrorStates,
refreshPredictions,
fetchPredictions,
// Constants
authToken
};
};
/*
* End of File: usePredictions.ts
* Design & Developed by Tech4Biz Solutions
* Copyright (c) Spurrin Innovations. All rights reserved.
*/