427 lines
11 KiB
TypeScript
427 lines
11 KiB
TypeScript
/*
|
|
* File: aiDashboardSelectors.ts
|
|
* Description: Selectors for AI dashboard state management
|
|
* Design & Developed by Tech4Biz Solutions
|
|
* Copyright (c) Spurrin Innovations. All rights reserved.
|
|
*/
|
|
|
|
import { createSelector } from '@reduxjs/toolkit';
|
|
import { RootState } from '../../../store';
|
|
|
|
// ============================================================================
|
|
// BASE SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select AI Dashboard State
|
|
*
|
|
* Purpose: Get the entire AI dashboard state from root state
|
|
*/
|
|
const selectAIDashboardState = (state: RootState) => state.aiDashboard;
|
|
|
|
/**
|
|
* Select AI Dashboard Data
|
|
*
|
|
* Purpose: Get the AI dashboard data from state
|
|
*/
|
|
export const selectAIDashboardData = createSelector(
|
|
[selectAIDashboardState],
|
|
(aiDashboard) => aiDashboard.dashboardData
|
|
);
|
|
|
|
/**
|
|
* Select AI Dashboard Statistics
|
|
*
|
|
* Purpose: Get the AI dashboard statistics data
|
|
*/
|
|
export const selectAIDashboardStats = createSelector(
|
|
[selectAIDashboardData],
|
|
(dashboardData) => dashboardData?.data
|
|
);
|
|
|
|
/**
|
|
* Select AI Dashboard Summary
|
|
*
|
|
* Purpose: Get the AI dashboard summary data
|
|
*/
|
|
export const selectAIDashboardSummary = createSelector(
|
|
[selectAIDashboardData],
|
|
(dashboardData) => dashboardData?.summary
|
|
);
|
|
|
|
// ============================================================================
|
|
// LOADING STATE SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select AI Dashboard Loading State
|
|
*
|
|
* Purpose: Get the loading state for AI dashboard
|
|
*/
|
|
export const selectAIDashboardLoading = createSelector(
|
|
[selectAIDashboardState],
|
|
(aiDashboard) => aiDashboard.isLoading
|
|
);
|
|
|
|
/**
|
|
* Select AI Dashboard Refreshing State
|
|
*
|
|
* Purpose: Get the refreshing state for AI dashboard
|
|
*/
|
|
export const selectAIDashboardRefreshing = createSelector(
|
|
[selectAIDashboardState],
|
|
(aiDashboard) => aiDashboard.isRefreshing
|
|
);
|
|
|
|
// ============================================================================
|
|
// ERROR STATE SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select AI Dashboard Error
|
|
*
|
|
* Purpose: Get the error state for AI dashboard
|
|
*/
|
|
export const selectAIDashboardError = createSelector(
|
|
[selectAIDashboardState],
|
|
(aiDashboard) => aiDashboard.error
|
|
);
|
|
|
|
// ============================================================================
|
|
// FILTER STATE SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Selected Time Range
|
|
*
|
|
* Purpose: Get the currently selected time range filter
|
|
*/
|
|
export const selectSelectedTimeRange = createSelector(
|
|
[selectAIDashboardState],
|
|
(aiDashboard) => aiDashboard.selectedTimeRange
|
|
);
|
|
|
|
/**
|
|
* Select Selected Hospital
|
|
*
|
|
* Purpose: Get the currently selected hospital filter
|
|
*/
|
|
export const selectSelectedHospital = createSelector(
|
|
[selectAIDashboardState],
|
|
(aiDashboard) => aiDashboard.selectedHospital
|
|
);
|
|
|
|
/**
|
|
* Select Selected Department
|
|
*
|
|
* Purpose: Get the currently selected department filter
|
|
*/
|
|
export const selectSelectedDepartment = createSelector(
|
|
[selectAIDashboardState],
|
|
(aiDashboard) => aiDashboard.selectedDepartment
|
|
);
|
|
|
|
// ============================================================================
|
|
// DERIVED DATA SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Total Predictions Count
|
|
*
|
|
* Purpose: Get the total number of AI predictions
|
|
*/
|
|
export const selectTotalPredictions = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.total_predictions || 0
|
|
);
|
|
|
|
/**
|
|
* Select Total Patients Count
|
|
*
|
|
* Purpose: Get the total number of unique patients
|
|
*/
|
|
export const selectTotalPatients = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.total_patients || 0
|
|
);
|
|
|
|
/**
|
|
* Select Total Feedbacks Count
|
|
*
|
|
* Purpose: Get the total number of feedbacks received
|
|
*/
|
|
export const selectTotalFeedbacks = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.total_feedbacks || 0
|
|
);
|
|
|
|
/**
|
|
* Select Feedback Rate Percentage
|
|
*
|
|
* Purpose: Get the feedback rate as a percentage
|
|
*/
|
|
export const selectFeedbackRatePercentage = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.feedback_rate_percentage || 0
|
|
);
|
|
|
|
/**
|
|
* Select Average Confidence Score
|
|
*
|
|
* Purpose: Get the average confidence score for AI predictions
|
|
*/
|
|
export const selectAverageConfidenceScore = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.average_confidence_score || 0
|
|
);
|
|
|
|
/**
|
|
* Select Critical Case Percentage
|
|
*
|
|
* Purpose: Get the percentage of critical cases
|
|
*/
|
|
export const selectCriticalCasePercentage = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.critical_case_percentage || 0
|
|
);
|
|
|
|
// ============================================================================
|
|
// CONFIDENCE SCORE SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Confidence Score Distribution
|
|
*
|
|
* Purpose: Get the distribution of confidence scores
|
|
*/
|
|
export const selectConfidenceScores = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.confidence_scores || { high: 0, medium: 0, low: 0 }
|
|
);
|
|
|
|
/**
|
|
* Select High Confidence Count
|
|
*
|
|
* Purpose: Get the count of high confidence predictions
|
|
*/
|
|
export const selectHighConfidenceCount = createSelector(
|
|
[selectConfidenceScores],
|
|
(confidenceScores) => confidenceScores.high
|
|
);
|
|
|
|
/**
|
|
* Select Medium Confidence Count
|
|
*
|
|
* Purpose: Get the count of medium confidence predictions
|
|
*/
|
|
export const selectMediumConfidenceCount = createSelector(
|
|
[selectConfidenceScores],
|
|
(confidenceScores) => confidenceScores.medium
|
|
);
|
|
|
|
/**
|
|
* Select Low Confidence Count
|
|
*
|
|
* Purpose: Get the count of low confidence predictions
|
|
*/
|
|
export const selectLowConfidenceCount = createSelector(
|
|
[selectConfidenceScores],
|
|
(confidenceScores) => confidenceScores.low
|
|
);
|
|
|
|
// ============================================================================
|
|
// URGENCY LEVEL SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Urgency Level Distribution
|
|
*
|
|
* Purpose: Get the distribution of urgency levels
|
|
*/
|
|
export const selectUrgencyLevels = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.urgency_levels || { critical: 0, urgent: 0, routine: 0 }
|
|
);
|
|
|
|
/**
|
|
* Select Critical Urgency Count
|
|
*
|
|
* Purpose: Get the count of critical urgency cases
|
|
*/
|
|
export const selectCriticalUrgencyCount = createSelector(
|
|
[selectUrgencyLevels],
|
|
(urgencyLevels) => urgencyLevels.critical
|
|
);
|
|
|
|
/**
|
|
* Select Urgent Urgency Count
|
|
*
|
|
* Purpose: Get the count of urgent cases
|
|
*/
|
|
export const selectUrgentUrgencyCount = createSelector(
|
|
[selectUrgencyLevels],
|
|
(urgencyLevels) => urgencyLevels.urgent
|
|
);
|
|
|
|
/**
|
|
* Select Routine Urgency Count
|
|
*
|
|
* Purpose: Get the count of routine cases
|
|
*/
|
|
export const selectRoutineUrgencyCount = createSelector(
|
|
[selectUrgencyLevels],
|
|
(urgencyLevels) => urgencyLevels.routine
|
|
);
|
|
|
|
// ============================================================================
|
|
// FEEDBACK ANALYSIS SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Feedback Analysis Data
|
|
*
|
|
* Purpose: Get the feedback analysis data
|
|
*/
|
|
export const selectFeedbackAnalysis = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.feedback_analysis || { positive: 0, negative: 0, total: 0 }
|
|
);
|
|
|
|
/**
|
|
* Select Positive Feedback Count
|
|
*
|
|
* Purpose: Get the count of positive feedbacks
|
|
*/
|
|
export const selectPositiveFeedbackCount = createSelector(
|
|
[selectFeedbackAnalysis],
|
|
(feedbackAnalysis) => feedbackAnalysis.positive
|
|
);
|
|
|
|
/**
|
|
* Select Negative Feedback Count
|
|
*
|
|
* Purpose: Get the count of negative feedbacks
|
|
*/
|
|
export const selectNegativeFeedbackCount = createSelector(
|
|
[selectFeedbackAnalysis],
|
|
(feedbackAnalysis) => feedbackAnalysis.negative
|
|
);
|
|
|
|
/**
|
|
* Select Total Feedback Count
|
|
*
|
|
* Purpose: Get the total count of feedbacks
|
|
*/
|
|
export const selectTotalFeedbackCount = createSelector(
|
|
[selectFeedbackAnalysis],
|
|
(feedbackAnalysis) => feedbackAnalysis.total
|
|
);
|
|
|
|
// ============================================================================
|
|
// TIME ANALYSIS SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Time Analysis Data
|
|
*
|
|
* Purpose: Get the time-based analysis data
|
|
*/
|
|
export const selectTimeAnalysis = createSelector(
|
|
[selectAIDashboardStats],
|
|
(stats) => stats?.time_analysis || { today: 0, this_week: 0, this_month: 0, this_year: 0 }
|
|
);
|
|
|
|
/**
|
|
* Select Today's Count
|
|
*
|
|
* Purpose: Get the count for today
|
|
*/
|
|
export const selectTodayCount = createSelector(
|
|
[selectTimeAnalysis],
|
|
(timeAnalysis) => timeAnalysis.today
|
|
);
|
|
|
|
/**
|
|
* Select This Week's Count
|
|
*
|
|
* Purpose: Get the count for this week
|
|
*/
|
|
export const selectThisWeekCount = createSelector(
|
|
[selectTimeAnalysis],
|
|
(timeAnalysis) => timeAnalysis.this_week
|
|
);
|
|
|
|
/**
|
|
* Select This Month's Count
|
|
*
|
|
* Purpose: Get the count for this month
|
|
*/
|
|
export const selectThisMonthCount = createSelector(
|
|
[selectTimeAnalysis],
|
|
(timeAnalysis) => timeAnalysis.this_month
|
|
);
|
|
|
|
/**
|
|
* Select This Year's Count
|
|
*
|
|
* Purpose: Get the count for this year
|
|
*/
|
|
export const selectThisYearCount = createSelector(
|
|
[selectTimeAnalysis],
|
|
(timeAnalysis) => timeAnalysis.this_year
|
|
);
|
|
|
|
// ============================================================================
|
|
// LAST UPDATED SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Last Updated Timestamp
|
|
*
|
|
* Purpose: Get the last updated timestamp
|
|
*/
|
|
export const selectLastUpdated = createSelector(
|
|
[selectAIDashboardState],
|
|
(aiDashboard) => aiDashboard.lastUpdated
|
|
);
|
|
|
|
// ============================================================================
|
|
// COMPUTED SELECTORS
|
|
// ============================================================================
|
|
|
|
/**
|
|
* Select Dashboard Message
|
|
*
|
|
* Purpose: Get the dashboard message or default message
|
|
*/
|
|
export const selectDashboardMessage = createSelector(
|
|
[selectAIDashboardData],
|
|
(dashboardData) => dashboardData?.message || 'Loading statistics...'
|
|
);
|
|
|
|
/**
|
|
* Select Is Dashboard Empty
|
|
*
|
|
* Purpose: Check if dashboard has no data
|
|
*/
|
|
export const selectIsDashboardEmpty = createSelector(
|
|
[selectAIDashboardData],
|
|
(dashboardData) => !dashboardData || !dashboardData.data
|
|
);
|
|
|
|
/**
|
|
* Select Has Dashboard Data
|
|
*
|
|
* Purpose: Check if dashboard has data
|
|
*/
|
|
export const selectHasDashboardData = createSelector(
|
|
[selectIsDashboardEmpty],
|
|
(isEmpty) => !isEmpty
|
|
);
|
|
|
|
/*
|
|
* End of File: aiDashboardSelectors.ts
|
|
* Design & Developed by Tech4Biz Solutions
|
|
* Copyright (c) Spurrin Innovations. All rights reserved.
|
|
*/
|