From 20ab5d9d211ffb0a39f7e0d31c763e6149985580 Mon Sep 17 00:00:00 2001 From: yashwin-foxy Date: Fri, 18 Jul 2025 18:40:19 +0530 Subject: [PATCH] code generated for dashboard case view ,profile and auth section --- .cursor/rules/folderstructure.mdc | 3 + README.md | 734 +----- .../Auth/__tests__/BiometricLogin.test.tsx | 30 + app/modules/Auth/__tests__/authAPI.test.ts | 26 + app/modules/Auth/__tests__/authSlice.test.ts | 40 + .../Auth/components/BiometricLogin.tsx | 32 + .../Auth/components/EmergencyAccess.tsx | 28 + app/modules/Auth/components/PinInput.tsx | 69 + app/modules/Auth/components/index.ts | 16 + app/modules/Auth/hooks/index.ts | 15 + app/modules/Auth/hooks/useAuth.ts | 24 + app/modules/Auth/hooks/useBiometric.ts | 29 + app/modules/Auth/navigation/AuthNavigator.tsx | 51 + app/modules/Auth/navigation/index.ts | 14 + app/modules/Auth/redux/authActions.ts | 38 + app/modules/Auth/redux/authSelectors.ts | 19 + app/modules/Auth/redux/authSlice.ts | 73 + app/modules/Auth/redux/index.ts | 16 + app/modules/Auth/screens/LoginScreen.tsx | 79 + .../Auth/screens/SetupBiometricScreen.tsx | 66 + app/modules/Auth/screens/index.ts | 15 + app/modules/Auth/services/authAPI.ts | 27 + app/modules/Auth/services/biometricService.ts | 23 + app/modules/Auth/services/index.ts | 15 + .../CaseReview/__tests__/DICOMViewer.test.tsx | 26 + .../__tests__/caseReviewSlice.test.ts | 34 + .../CaseReview/__tests__/dicomAPI.test.ts | 26 + .../CaseReview/components/AIOverlay.tsx | 54 + .../CaseReview/components/AnnotationTools.tsx | 56 + .../CaseReview/components/CaseMetadata.tsx | 52 + .../CaseReview/components/DICOMViewer.tsx | 53 + .../components/MeasurementTools.tsx | 56 + .../components/PriorStudyComparison.tsx | 56 + app/modules/CaseReview/components/index.ts | 19 + app/modules/CaseReview/hooks/index.ts | 17 + app/modules/CaseReview/hooks/useAIOverlay.ts | 24 + .../CaseReview/hooks/useAnnotations.ts | 23 + .../CaseReview/hooks/useDICOMViewer.ts | 24 + .../CaseReview/hooks/useMeasurements.ts | 23 + .../navigation/CaseReviewNavigator.tsx | 57 + app/modules/CaseReview/navigation/index.ts | 14 + .../CaseReview/redux/aiAnalysisSlice.ts | 58 + .../CaseReview/redux/caseReviewActions.ts | 53 + .../CaseReview/redux/caseReviewSelectors.ts | 21 + .../CaseReview/redux/caseReviewSlice.ts | 66 + app/modules/CaseReview/redux/dicomSlice.ts | 59 + app/modules/CaseReview/redux/index.ts | 18 + .../CaseReview/screens/CaseDetailsScreen.tsx | 83 + .../CaseReview/screens/ComparisonScreen.tsx | 63 + .../CaseReview/screens/DICOMViewerScreen.tsx | 66 + app/modules/CaseReview/screens/index.ts | 16 + .../CaseReview/services/aiAnalysisAPI.ts | 27 + app/modules/CaseReview/services/dicomAPI.ts | 27 + .../CaseReview/services/dicomParser.ts | 22 + .../CaseReview/services/imageProcessor.ts | 22 + app/modules/CaseReview/services/index.ts | 17 + .../Dashboard/__tests__/CaseQueue.test.tsx | 34 + .../Dashboard/__tests__/caseAPI.test.ts | 26 + .../__tests__/dashboardSlice.test.ts | 37 + app/modules/Dashboard/components/CaseCard.tsx | 78 + .../Dashboard/components/CaseQueue.tsx | 95 + .../Dashboard/components/FilterBar.tsx | 70 + .../components/PriorityIndicator.tsx | 61 + .../Dashboard/components/StatsPanel.tsx | 70 + app/modules/Dashboard/components/index.ts | 18 + app/modules/Dashboard/hooks/index.ts | 16 + app/modules/Dashboard/hooks/useCaseQueue.ts | 22 + app/modules/Dashboard/hooks/useFilterCases.ts | 22 + .../Dashboard/hooks/useRealTimeUpdates.ts | 27 + .../navigation/DashboardNavigator.tsx | 47 + app/modules/Dashboard/navigation/index.ts | 14 + app/modules/Dashboard/redux/caseQueueSlice.ts | 61 + .../Dashboard/redux/dashboardActions.ts | 38 + .../Dashboard/redux/dashboardSelectors.ts | 18 + app/modules/Dashboard/redux/dashboardSlice.ts | 70 + app/modules/Dashboard/redux/index.ts | 16 + .../Dashboard/screens/DashboardScreen.tsx | 175 ++ app/modules/Dashboard/screens/index.ts | 14 + app/modules/Dashboard/services/caseAPI.ts | 27 + app/modules/Dashboard/services/index.ts | 16 + .../Dashboard/services/notificationService.ts | 20 + .../Dashboard/services/websocketService.ts | 25 + .../Profile/__tests__/ProfileHeader.test.tsx | 25 + .../Profile/__tests__/profileAPI.test.ts | 26 + .../Profile/__tests__/profileSlice.test.ts | 37 + .../Profile/components/PreferencesForm.tsx | 55 + .../Profile/components/ProfileHeader.tsx | 50 + .../Profile/components/SecuritySettings.tsx | 55 + .../Profile/components/SettingsPanel.tsx | 75 + app/modules/Profile/components/index.ts | 17 + app/modules/Profile/hooks/index.ts | 15 + app/modules/Profile/hooks/useProfile.ts | 22 + app/modules/Profile/hooks/useSettings.ts | 22 + .../Profile/navigation/ProfileNavigator.tsx | 57 + app/modules/Profile/navigation/index.ts | 14 + app/modules/Profile/redux/index.ts | 17 + app/modules/Profile/redux/profileActions.ts | 38 + app/modules/Profile/redux/profileSelectors.ts | 19 + app/modules/Profile/redux/profileSlice.ts | 76 + app/modules/Profile/redux/settingsSlice.ts | 63 + .../Profile/screens/PreferencesScreen.tsx | 56 + app/modules/Profile/screens/ProfileScreen.tsx | 77 + .../Profile/screens/SettingsScreen.tsx | 79 + app/modules/Profile/screens/index.ts | 16 + app/modules/Profile/services/index.ts | 15 + app/modules/Profile/services/profileAPI.ts | 27 + app/modules/Profile/services/settingsAPI.ts | 27 + app/navigation/AppNavigator.tsx | 34 + app/navigation/AuthNavigator.tsx | 14 + app/navigation/TabNavigator.tsx | 56 + package-lock.json | 2151 ++++++++++++++++- package.json | 32 +- shared/src/components/Button/Button.tsx | 75 + shared/src/components/Button/index.ts | 14 + shared/src/components/Card/Card.styles.ts | 34 + shared/src/components/Card/Card.tsx | 1 + shared/src/components/Card/Card.types.ts | 27 + shared/src/components/Card/InfoCard.tsx | 31 + shared/src/components/Card/index.ts | 14 + shared/src/components/Icons/CustomIcon.tsx | 33 + shared/src/components/Icons/IconButton.tsx | 56 + shared/src/components/Icons/index.ts | 15 + shared/src/components/Input/Input.styles.ts | 39 + shared/src/components/Input/Input.types.ts | 24 + shared/src/components/Input/SearchInput.tsx | 53 + shared/src/components/Input/TextInput.tsx | 57 + shared/src/components/Input/index.ts | 15 + .../src/components/Loading/Loading.styles.ts | 28 + .../src/components/Loading/LoadingOverlay.tsx | 44 + shared/src/components/Loading/Spinner.tsx | 42 + shared/src/components/Loading/index.ts | 15 + shared/src/components/Modal/AlertModal.tsx | 69 + shared/src/components/Modal/ConfirmModal.tsx | 71 + shared/src/components/Modal/Modal.tsx | 76 + shared/src/components/Modal/index.ts | 16 + shared/src/theme/animations.ts | 29 + shared/src/theme/borderRadius.ts | 23 + shared/src/theme/colors.ts | 39 + shared/src/theme/index.ts | 20 + shared/src/theme/shadows.ts | 26 + shared/src/theme/spacing.ts | 25 + shared/src/theme/typography.ts | 37 + 142 files changed, 7392 insertions(+), 754 deletions(-) create mode 100644 .cursor/rules/folderstructure.mdc create mode 100644 app/modules/Auth/__tests__/BiometricLogin.test.tsx create mode 100644 app/modules/Auth/__tests__/authAPI.test.ts create mode 100644 app/modules/Auth/__tests__/authSlice.test.ts create mode 100644 app/modules/Auth/components/BiometricLogin.tsx create mode 100644 app/modules/Auth/components/EmergencyAccess.tsx create mode 100644 app/modules/Auth/components/PinInput.tsx create mode 100644 app/modules/Auth/components/index.ts create mode 100644 app/modules/Auth/hooks/index.ts create mode 100644 app/modules/Auth/hooks/useAuth.ts create mode 100644 app/modules/Auth/hooks/useBiometric.ts create mode 100644 app/modules/Auth/navigation/AuthNavigator.tsx create mode 100644 app/modules/Auth/navigation/index.ts create mode 100644 app/modules/Auth/redux/authActions.ts create mode 100644 app/modules/Auth/redux/authSelectors.ts create mode 100644 app/modules/Auth/redux/authSlice.ts create mode 100644 app/modules/Auth/redux/index.ts create mode 100644 app/modules/Auth/screens/LoginScreen.tsx create mode 100644 app/modules/Auth/screens/SetupBiometricScreen.tsx create mode 100644 app/modules/Auth/screens/index.ts create mode 100644 app/modules/Auth/services/authAPI.ts create mode 100644 app/modules/Auth/services/biometricService.ts create mode 100644 app/modules/Auth/services/index.ts create mode 100644 app/modules/CaseReview/__tests__/DICOMViewer.test.tsx create mode 100644 app/modules/CaseReview/__tests__/caseReviewSlice.test.ts create mode 100644 app/modules/CaseReview/__tests__/dicomAPI.test.ts create mode 100644 app/modules/CaseReview/components/AIOverlay.tsx create mode 100644 app/modules/CaseReview/components/AnnotationTools.tsx create mode 100644 app/modules/CaseReview/components/CaseMetadata.tsx create mode 100644 app/modules/CaseReview/components/DICOMViewer.tsx create mode 100644 app/modules/CaseReview/components/MeasurementTools.tsx create mode 100644 app/modules/CaseReview/components/PriorStudyComparison.tsx create mode 100644 app/modules/CaseReview/components/index.ts create mode 100644 app/modules/CaseReview/hooks/index.ts create mode 100644 app/modules/CaseReview/hooks/useAIOverlay.ts create mode 100644 app/modules/CaseReview/hooks/useAnnotations.ts create mode 100644 app/modules/CaseReview/hooks/useDICOMViewer.ts create mode 100644 app/modules/CaseReview/hooks/useMeasurements.ts create mode 100644 app/modules/CaseReview/navigation/CaseReviewNavigator.tsx create mode 100644 app/modules/CaseReview/navigation/index.ts create mode 100644 app/modules/CaseReview/redux/aiAnalysisSlice.ts create mode 100644 app/modules/CaseReview/redux/caseReviewActions.ts create mode 100644 app/modules/CaseReview/redux/caseReviewSelectors.ts create mode 100644 app/modules/CaseReview/redux/caseReviewSlice.ts create mode 100644 app/modules/CaseReview/redux/dicomSlice.ts create mode 100644 app/modules/CaseReview/redux/index.ts create mode 100644 app/modules/CaseReview/screens/CaseDetailsScreen.tsx create mode 100644 app/modules/CaseReview/screens/ComparisonScreen.tsx create mode 100644 app/modules/CaseReview/screens/DICOMViewerScreen.tsx create mode 100644 app/modules/CaseReview/screens/index.ts create mode 100644 app/modules/CaseReview/services/aiAnalysisAPI.ts create mode 100644 app/modules/CaseReview/services/dicomAPI.ts create mode 100644 app/modules/CaseReview/services/dicomParser.ts create mode 100644 app/modules/CaseReview/services/imageProcessor.ts create mode 100644 app/modules/CaseReview/services/index.ts create mode 100644 app/modules/Dashboard/__tests__/CaseQueue.test.tsx create mode 100644 app/modules/Dashboard/__tests__/caseAPI.test.ts create mode 100644 app/modules/Dashboard/__tests__/dashboardSlice.test.ts create mode 100644 app/modules/Dashboard/components/CaseCard.tsx create mode 100644 app/modules/Dashboard/components/CaseQueue.tsx create mode 100644 app/modules/Dashboard/components/FilterBar.tsx create mode 100644 app/modules/Dashboard/components/PriorityIndicator.tsx create mode 100644 app/modules/Dashboard/components/StatsPanel.tsx create mode 100644 app/modules/Dashboard/components/index.ts create mode 100644 app/modules/Dashboard/hooks/index.ts create mode 100644 app/modules/Dashboard/hooks/useCaseQueue.ts create mode 100644 app/modules/Dashboard/hooks/useFilterCases.ts create mode 100644 app/modules/Dashboard/hooks/useRealTimeUpdates.ts create mode 100644 app/modules/Dashboard/navigation/DashboardNavigator.tsx create mode 100644 app/modules/Dashboard/navigation/index.ts create mode 100644 app/modules/Dashboard/redux/caseQueueSlice.ts create mode 100644 app/modules/Dashboard/redux/dashboardActions.ts create mode 100644 app/modules/Dashboard/redux/dashboardSelectors.ts create mode 100644 app/modules/Dashboard/redux/dashboardSlice.ts create mode 100644 app/modules/Dashboard/redux/index.ts create mode 100644 app/modules/Dashboard/screens/DashboardScreen.tsx create mode 100644 app/modules/Dashboard/screens/index.ts create mode 100644 app/modules/Dashboard/services/caseAPI.ts create mode 100644 app/modules/Dashboard/services/index.ts create mode 100644 app/modules/Dashboard/services/notificationService.ts create mode 100644 app/modules/Dashboard/services/websocketService.ts create mode 100644 app/modules/Profile/__tests__/ProfileHeader.test.tsx create mode 100644 app/modules/Profile/__tests__/profileAPI.test.ts create mode 100644 app/modules/Profile/__tests__/profileSlice.test.ts create mode 100644 app/modules/Profile/components/PreferencesForm.tsx create mode 100644 app/modules/Profile/components/ProfileHeader.tsx create mode 100644 app/modules/Profile/components/SecuritySettings.tsx create mode 100644 app/modules/Profile/components/SettingsPanel.tsx create mode 100644 app/modules/Profile/components/index.ts create mode 100644 app/modules/Profile/hooks/index.ts create mode 100644 app/modules/Profile/hooks/useProfile.ts create mode 100644 app/modules/Profile/hooks/useSettings.ts create mode 100644 app/modules/Profile/navigation/ProfileNavigator.tsx create mode 100644 app/modules/Profile/navigation/index.ts create mode 100644 app/modules/Profile/redux/index.ts create mode 100644 app/modules/Profile/redux/profileActions.ts create mode 100644 app/modules/Profile/redux/profileSelectors.ts create mode 100644 app/modules/Profile/redux/profileSlice.ts create mode 100644 app/modules/Profile/redux/settingsSlice.ts create mode 100644 app/modules/Profile/screens/PreferencesScreen.tsx create mode 100644 app/modules/Profile/screens/ProfileScreen.tsx create mode 100644 app/modules/Profile/screens/SettingsScreen.tsx create mode 100644 app/modules/Profile/screens/index.ts create mode 100644 app/modules/Profile/services/index.ts create mode 100644 app/modules/Profile/services/profileAPI.ts create mode 100644 app/modules/Profile/services/settingsAPI.ts create mode 100644 app/navigation/AppNavigator.tsx create mode 100644 app/navigation/AuthNavigator.tsx create mode 100644 app/navigation/TabNavigator.tsx create mode 100644 shared/src/components/Button/Button.tsx create mode 100644 shared/src/components/Button/index.ts create mode 100644 shared/src/components/Card/Card.styles.ts create mode 100644 shared/src/components/Card/Card.tsx create mode 100644 shared/src/components/Card/Card.types.ts create mode 100644 shared/src/components/Card/InfoCard.tsx create mode 100644 shared/src/components/Card/index.ts create mode 100644 shared/src/components/Icons/CustomIcon.tsx create mode 100644 shared/src/components/Icons/IconButton.tsx create mode 100644 shared/src/components/Icons/index.ts create mode 100644 shared/src/components/Input/Input.styles.ts create mode 100644 shared/src/components/Input/Input.types.ts create mode 100644 shared/src/components/Input/SearchInput.tsx create mode 100644 shared/src/components/Input/TextInput.tsx create mode 100644 shared/src/components/Input/index.ts create mode 100644 shared/src/components/Loading/Loading.styles.ts create mode 100644 shared/src/components/Loading/LoadingOverlay.tsx create mode 100644 shared/src/components/Loading/Spinner.tsx create mode 100644 shared/src/components/Loading/index.ts create mode 100644 shared/src/components/Modal/AlertModal.tsx create mode 100644 shared/src/components/Modal/ConfirmModal.tsx create mode 100644 shared/src/components/Modal/Modal.tsx create mode 100644 shared/src/components/Modal/index.ts create mode 100644 shared/src/theme/animations.ts create mode 100644 shared/src/theme/borderRadius.ts create mode 100644 shared/src/theme/colors.ts create mode 100644 shared/src/theme/index.ts create mode 100644 shared/src/theme/shadows.ts create mode 100644 shared/src/theme/spacing.ts create mode 100644 shared/src/theme/typography.ts diff --git a/.cursor/rules/folderstructure.mdc b/.cursor/rules/folderstructure.mdc new file mode 100644 index 0000000..3dca909 --- /dev/null +++ b/.cursor/rules/folderstructure.mdc @@ -0,0 +1,3 @@ +--- +alwaysApply: true +--- diff --git a/README.md b/README.md index 9541a03..e2c434a 100644 --- a/README.md +++ b/README.md @@ -1,698 +1,52 @@ -1. RADIOLOGIST APP - DETAILED WORKFLOW -1.1 App Launch & Authentication -App Launch → Biometric Auth → Dashboard Loading - ↓ -Load Case Queue → Priority Sort → Display Cases - ↓ -Critical (RED) → Urgent (ORANGE) → Routine (GREEN) -1.2 Critical Finding Workflow (Acute Subdural Hemorrhage) -STEP 1: Alert Reception -Push Notification → "CRITICAL - Acute Subdural Hemorrhage" - ↓ -Tap Notification → App Opens → Case Preview - ↓ -Patient: John Doe, Age 45, Head Trauma -AI Confidence: 93% -Midline Shift: 7mm +# NeoScan Radiologist App -STEP 2: Full Case Review -Case Preview → Open DICOM Viewer - ↓ -AI Overlay ON → Hemorrhage Highlighted - ↓ -Review Images → Confirm Finding → Add Observations - ↓ -"Large acute subdural hemorrhage with mass effect" +A next-generation radiology workflow app designed for rapid, AI-assisted case review and reporting. Built with a modular architecture and a Clinical Blue Interface theme. -STEP 3: Report Generation -Voice-to-Text → "Acute subdural hemorrhage..." - ↓ -Review Text → Edit if needed → Submit Report - ↓ -Preliminary Report Sent (< 5 minutes) +## Features +- Modular structure: Auth, Dashboard, Case Review, Reporting, Notifications, Analytics, Profile +- Clinical Blue Interface theme +- Biometric and PIN authentication +- Real-time case queue with priority sorting +- DICOM viewer with AI overlays +- Voice-to-text reporting +- Push notifications for critical findings +- Redux state management -STEP 4: System Learning -System Logs → Radiologist Confirmation - ↓ -Time Metrics Recorded → Model Improvement Data -1.3 Routine Scan Workflow (Negative Finding) -STEP 1: Queue Processing -Dashboard → Routine Queue → Select Case - ↓ -Patient: Jane Smith, Age 30, Headache -AI: No acute abnormalities (99% confidence) - -STEP 2: Confirmation Review -DICOM Viewer → Quick Review → Confirm Negative - ↓ -"No acute intracranial abnormality" - -STEP 3: Report & Documentation -Submit Report → System Logs Concordance - ↓ -Next Case in Queue -1.4 System Uncertainty Protocol -AI Confidence 70-85% → "REVIEW RECOMMENDED" - ↓ -Special Yellow Flag → Enhanced Attention Required - ↓ -Detailed Review → Feedback to System - -3. RADIOLOGIST APP WIREFRAMES -3.1 Login Screen -+------------------------+ -| [HOSPITAL LOGO] | -| | -| Radiologist Portal | -| | -| [👤 Dr. Smith] | -| [🔒 Biometric Login] | -| | -| [Face ID Icon] | -| Touch to Login | -| | -| OR | -| | -| PIN: [****] | -| [LOGIN] | -| | -| Emergency Access | -+------------------------+ -3.2 Dashboard - Case Queue -+------------------------+ -| Dr. Smith [🔔3][⚙️] | -| On-Call Status: ACTIVE | -| | -| CRITICAL CASES | -| 🔴 Bed 3 - Hemorrhage | -| 📱 2 min ago | -| AI: 93% confidence | -| [REVIEW NOW] | -| | -| 🔴 Bed 7 - Stroke | -| 📱 5 min ago | -| AI: 87% confidence | -| [REVIEW NOW] | -| | -| URGENT CASES (4) | -| 🟡 Show All | -| | -| ROUTINE CASES (12) | -| 🟢 Show All | -+------------------------+ -3.3 Critical Case Details -+------------------------+ -| ← CRITICAL CASE | -| | -| Patient: John Doe, 45M | -| Bed: 3 | Time: 14:35 | -| Clinical: Head trauma | -| | -| AI ANALYSIS: | -| 🔴 Acute Subdural | -| Confidence: 93% | -| Midline Shift: 7mm | -| Mass Effect: Present | -| | -| [VIEW DICOM IMAGES] | -| [VOICE REPORT] | -| [QUICK REPORT] | -| | -| Status: PENDING REVIEW | -+------------------------+ -3.4 DICOM Viewer -+------------------------+ -| ← John Doe - CT Brain | -| | -| [ CT SCAN IMAGE ]| -| [ WITH AI OVERLAY ]| -| [ HEMORRHAGE ]| -| [ HIGHLIGHTED ]| -| | -| Tools: [🔍][📏][✏️] | -| AI: [ON] Conf: 93% | -| | -| Measurements: | -| • Hemorrhage: 3.2cm | -| • Midline: 7mm shift | -| | -| [🎤 START REPORT] | -+------------------------+ -3.5 Voice Report Interface -+------------------------+ -| ← Voice Report | -| | -| [🎤 RECORDING 01:23] | -| | -| "There is a large | -| acute subdural | -| hemorrhage in the | -| right frontoparietal | -| region..." | -| | -| [PAUSE] [STOP] [PLAY] | -| | -| [SAVE DRAFT] | -| [SUBMIT REPORT] | -| | -| Estimated: 2 min left | -+------------------------+ - -5.1 React Native Project Structure -🏥 RADIOLOGIST APP STRUCTURE -NeoScan_Radiologist/ -│ -├── app/ -│ ├── modules/ # 🌐 Feature-wise modular architecture -│ │ ├── Auth/ # 🔐 Authentication Module -│ │ │ ├── components/ -│ │ │ │ ├── BiometricLogin.tsx -│ │ │ │ ├── PinInput.tsx -│ │ │ │ ├── EmergencyAccess.tsx -│ │ │ │ └── index.ts -│ │ │ ├── screens/ -│ │ │ │ ├── LoginScreen.tsx -│ │ │ │ ├── SetupBiometricScreen.tsx -│ │ │ │ └── index.ts -│ │ │ ├── hooks/ -│ │ │ │ ├── useAuth.ts -│ │ │ │ ├── useBiometric.ts -│ │ │ │ └── index.ts -│ │ │ ├── redux/ -│ │ │ │ ├── authSlice.ts -│ │ │ │ ├── authActions.ts -│ │ │ │ ├── authSelectors.ts -│ │ │ │ └── index.ts -│ │ │ ├── services/ -│ │ │ │ ├── authAPI.ts -│ │ │ │ ├── biometricService.ts -│ │ │ │ └── index.ts -│ │ │ ├── __tests__/ -│ │ │ │ ├── AuthService.test.ts -│ │ │ │ ├── LoginScreen.test.tsx -│ │ │ │ └── authSlice.test.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── Dashboard/ # 📊 Dashboard Module -│ │ │ ├── components/ -│ │ │ │ ├── CaseQueue.tsx -│ │ │ │ ├── CaseCard.tsx -│ │ │ │ ├── PriorityIndicator.tsx -│ │ │ │ ├── StatsPanel.tsx -│ │ │ │ ├── FilterBar.tsx -│ │ │ │ └── index.ts -│ │ │ ├── screens/ -│ │ │ │ ├── DashboardScreen.tsx -│ │ │ │ ├── CaseListScreen.tsx -│ │ │ │ └── index.ts -│ │ │ ├── hooks/ -│ │ │ │ ├── useCaseQueue.ts -│ │ │ │ ├── useRealTimeUpdates.ts -│ │ │ │ ├── useFilterCases.ts -│ │ │ │ └── index.ts -│ │ │ ├── redux/ -│ │ │ │ ├── dashboardSlice.ts -│ │ │ │ ├── caseQueueSlice.ts -│ │ │ │ ├── dashboardActions.ts -│ │ │ │ ├── dashboardSelectors.ts -│ │ │ │ └── index.ts -│ │ │ ├── services/ -│ │ │ │ ├── caseAPI.ts -│ │ │ │ ├── websocketService.ts -│ │ │ │ ├── notificationService.ts -│ │ │ │ └── index.ts -│ │ │ ├── __tests__/ -│ │ │ │ ├── CaseQueue.test.tsx -│ │ │ │ ├── dashboardSlice.test.ts -│ │ │ │ └── caseAPI.test.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── CaseReview/ # 🔍 Case Review Module -│ │ │ ├── components/ -│ │ │ │ ├── DICOMViewer.tsx -│ │ │ │ ├── AIOverlay.tsx -│ │ │ │ ├── MeasurementTools.tsx -│ │ │ │ ├── AnnotationTools.tsx -│ │ │ │ ├── CaseMetadata.tsx -│ │ │ │ ├── PriorStudyComparison.tsx -│ │ │ │ └── index.ts -│ │ │ ├── screens/ -│ │ │ │ ├── CaseDetailsScreen.tsx -│ │ │ │ ├── DICOMViewerScreen.tsx -│ │ │ │ ├── ComparisonScreen.tsx -│ │ │ │ └── index.ts -│ │ │ ├── hooks/ -│ │ │ │ ├── useDICOMViewer.ts -│ │ │ │ ├── useAIOverlay.ts -│ │ │ │ ├── useMeasurements.ts -│ │ │ │ ├── useAnnotations.ts -│ │ │ │ └── index.ts -│ │ │ ├── redux/ -│ │ │ │ ├── caseReviewSlice.ts -│ │ │ │ ├── dicomSlice.ts -│ │ │ │ ├── aiAnalysisSlice.ts -│ │ │ │ ├── caseReviewActions.ts -│ │ │ │ ├── caseReviewSelectors.ts -│ │ │ │ └── index.ts -│ │ │ ├── services/ -│ │ │ │ ├── dicomAPI.ts -│ │ │ │ ├── aiAnalysisAPI.ts -│ │ │ │ ├── dicomParser.ts -│ │ │ │ ├── imageProcessor.ts -│ │ │ │ └── index.ts -│ │ │ ├── __tests__/ -│ │ │ │ ├── DICOMViewer.test.tsx -│ │ │ │ ├── AIOverlay.test.tsx -│ │ │ │ ├── dicomParser.test.ts -│ │ │ │ └── caseReviewSlice.test.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── Reporting/ # 📝 Reporting Module -│ │ │ ├── components/ -│ │ │ │ ├── VoiceRecorder.tsx -│ │ │ │ ├── ReportEditor.tsx -│ │ │ │ ├── ReportTemplate.tsx -│ │ │ │ ├── QuickReportButtons.tsx -│ │ │ │ ├── ReportPreview.tsx -│ │ │ │ └── index.ts -│ │ │ ├── screens/ -│ │ │ │ ├── ReportingScreen.tsx -│ │ │ │ ├── VoiceReportScreen.tsx -│ │ │ │ ├── ReportHistoryScreen.tsx -│ │ │ │ └── index.ts -│ │ │ ├── hooks/ -│ │ │ │ ├── useVoiceRecording.ts -│ │ │ │ ├── useReportGeneration.ts -│ │ │ │ ├── useSpeechToText.ts -│ │ │ │ └── index.ts -│ │ │ ├── redux/ -│ │ │ │ ├── reportingSlice.ts -│ │ │ │ ├── voiceRecordingSlice.ts -│ │ │ │ ├── reportingActions.ts -│ │ │ │ ├── reportingSelectors.ts -│ │ │ │ └── index.ts -│ │ │ ├── services/ -│ │ │ │ ├── reportAPI.ts -│ │ │ │ ├── voiceToTextAPI.ts -│ │ │ │ ├── reportTemplateService.ts -│ │ │ │ └── index.ts -│ │ │ ├── __tests__/ -│ │ │ │ ├── VoiceRecorder.test.tsx -│ │ │ │ ├── reportingSlice.test.ts -│ │ │ │ └── voiceToTextAPI.test.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── Notifications/ # 🔔 Notifications Module -│ │ │ ├── components/ -│ │ │ │ ├── NotificationPanel.tsx -│ │ │ │ ├── AlertBanner.tsx -│ │ │ │ ├── CriticalAlert.tsx -│ │ │ │ ├── NotificationSettings.tsx -│ │ │ │ └── index.ts -│ │ │ ├── screens/ -│ │ │ │ ├── NotificationsScreen.tsx -│ │ │ │ ├── AlertDetailsScreen.tsx -│ │ │ │ └── index.ts -│ │ │ ├── hooks/ -│ │ │ │ ├── useNotifications.ts -│ │ │ │ ├── usePushNotifications.ts -│ │ │ │ ├── useAlertHandling.ts -│ │ │ │ └── index.ts -│ │ │ ├── redux/ -│ │ │ │ ├── notificationsSlice.ts -│ │ │ │ ├── alertsSlice.ts -│ │ │ │ ├── notificationActions.ts -│ │ │ │ ├── notificationSelectors.ts -│ │ │ │ └── index.ts -│ │ │ ├── services/ -│ │ │ │ ├── pushNotificationService.ts -│ │ │ │ ├── alertService.ts -│ │ │ │ ├── notificationAPI.ts -│ │ │ │ └── index.ts -│ │ │ ├── __tests__/ -│ │ │ │ ├── NotificationPanel.test.tsx -│ │ │ │ ├── alertService.test.ts -│ │ │ │ └── notificationsSlice.test.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── Analytics/ # 📈 Analytics Module -│ │ │ ├── components/ -│ │ │ │ ├── PerformanceMetrics.tsx -│ │ │ │ ├── ResponseTimeChart.tsx -│ │ │ │ ├── ConcordanceStats.tsx -│ │ │ │ ├── WorkloadAnalysis.tsx -│ │ │ │ └── index.ts -│ │ │ ├── screens/ -│ │ │ │ ├── AnalyticsScreen.tsx -│ │ │ │ ├── PerformanceScreen.tsx -│ │ │ │ └── index.ts -│ │ │ ├── hooks/ -│ │ │ │ ├── useAnalytics.ts -│ │ │ │ ├── usePerformanceMetrics.ts -│ │ │ │ └── index.ts -│ │ │ ├── redux/ -│ │ │ │ ├── analyticsSlice.ts -│ │ │ │ ├── analyticsActions.ts -│ │ │ │ ├── analyticsSelectors.ts -│ │ │ │ └── index.ts -│ │ │ ├── services/ -│ │ │ │ ├── analyticsAPI.ts -│ │ │ │ ├── metricsCollector.ts -│ │ │ │ └── index.ts -│ │ │ ├── __tests__/ -│ │ │ │ ├── PerformanceMetrics.test.tsx -│ │ │ │ ├── analyticsSlice.test.ts -│ │ │ │ └── metricsCollector.test.ts -│ │ │ └── index.ts -│ │ │ -│ │ └── Profile/ # 👤 User Profile Module -│ │ ├── components/ -│ │ │ ├── ProfileHeader.tsx -│ │ │ ├── SettingsPanel.tsx -│ │ │ ├── PreferencesForm.tsx -│ │ │ ├── SecuritySettings.tsx -│ │ │ └── index.ts -│ │ ├── screens/ -│ │ │ ├── ProfileScreen.tsx -│ │ │ ├── SettingsScreen.tsx -│ │ │ ├── PreferencesScreen.tsx -│ │ │ └── index.ts -│ │ ├── hooks/ -│ │ │ ├── useProfile.ts -│ │ │ ├── useSettings.ts -│ │ │ └── index.ts -│ │ ├── redux/ -│ │ │ ├── profileSlice.ts -│ │ │ ├── settingsSlice.ts -│ │ │ ├── profileActions.ts -│ │ │ ├── profileSelectors.ts -│ │ │ └── index.ts -│ │ ├── services/ -│ │ │ ├── profileAPI.ts -│ │ │ ├── settingsAPI.ts -│ │ │ └── index.ts -│ │ ├── __tests__/ -│ │ │ ├── ProfileHeader.test.tsx -│ │ │ ├── profileSlice.test.ts -│ │ │ └── profileAPI.test.ts -│ │ └── index.ts -│ │ -│ ├── navigation/ # 🧭 Navigation Setup -│ │ ├── AppNavigator.tsx -│ │ ├── AuthNavigator.tsx -│ │ ├── MainNavigator.tsx -│ │ ├── TabNavigator.tsx -│ │ ├── ModalNavigator.tsx -│ │ ├── navigationTypes.ts -│ │ └── index.ts -│ │ -│ ├── redux/ # 🗃️ Redux Store Setup -│ │ ├── store.ts -│ │ ├── rootReducer.ts -│ │ ├── middleware.ts -│ │ ├── persistConfig.ts -│ │ └── index.ts -│ │ -│ ├── constants/ # 📋 Global Constants -│ │ ├── apiEndpoints.ts -│ │ ├── appConstants.ts -│ │ ├── errorMessages.ts -│ │ ├── notificationTypes.ts -│ │ ├── priorityLevels.ts -│ │ └── index.ts -│ │ -│ ├── App.tsx # 🎯 Root Component -│ └── index.ts # 🚀 App Bootstrap -│ -├── shared/ # ✅ Shared Components & Utilities -│ ├── src/ -│ │ ├── components/ # 🎨 Global UI Components -│ │ │ ├── Button/ -│ │ │ │ ├── Button.tsx -│ │ │ │ ├── Button.styles.ts -│ │ │ │ ├── Button.types.ts -│ │ │ │ └── index.ts -│ │ │ ├── Input/ -│ │ │ │ ├── TextInput.tsx -│ │ │ │ ├── SearchInput.tsx -│ │ │ │ ├── Input.styles.ts -│ │ │ │ ├── Input.types.ts -│ │ │ │ └── index.ts -│ │ │ ├── Modal/ -│ │ │ │ ├── Modal.tsx -│ │ │ │ ├── ConfirmModal.tsx -│ │ │ │ ├── AlertModal.tsx -│ │ │ │ ├── Modal.styles.ts -│ │ │ │ ├── Modal.types.ts -│ │ │ │ └── index.ts -│ │ │ ├── Card/ -│ │ │ │ ├── Card.tsx -│ │ │ │ ├── InfoCard.tsx -│ │ │ │ ├── Card.styles.ts -│ │ │ │ ├── Card.types.ts -│ │ │ │ └── index.ts -│ │ │ ├── Loading/ -│ │ │ │ ├── Spinner.tsx -│ │ │ │ ├── LoadingOverlay.tsx -│ │ │ │ ├── Loading.styles.ts -│ │ │ │ └── index.ts -│ │ │ ├── Icons/ -│ │ │ │ ├── CustomIcon.tsx -│ │ │ │ ├── IconButton.tsx -│ │ │ │ ├── Icons.types.ts -│ │ │ │ └── index.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── theme/ # 🎨 Design System -│ │ │ ├── colors.ts -│ │ │ ├── spacing.ts -│ │ │ ├── typography.ts -│ │ │ ├── shadows.ts -│ │ │ ├── borderRadius.ts -│ │ │ ├── animations.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── assets/ # 📁 Static Assets -│ │ │ ├── icons/ -│ │ │ │ ├── critical-alert.svg -│ │ │ │ ├── urgent-alert.svg -│ │ │ │ ├── routine-alert.svg -│ │ │ │ └── index.ts -│ │ │ ├── images/ -│ │ │ │ ├── logo.png -│ │ │ │ ├── placeholder.png -│ │ │ │ └── index.ts -│ │ │ ├── fonts/ -│ │ │ │ ├── Roboto-Regular.ttf -│ │ │ │ ├── Roboto-Bold.ttf -│ │ │ │ └── index.ts -│ │ │ └── sounds/ -│ │ │ ├── critical-alert.wav -│ │ │ ├── urgent-alert.wav -│ │ │ └── routine-alert.wav -│ │ │ -│ │ ├── utils/ # 🛠️ Utility Functions -│ │ │ ├── dateTime/ -│ │ │ │ ├── formatDate.ts -│ │ │ │ ├── timeAgo.ts -│ │ │ │ └── index.ts -│ │ │ ├── validation/ -│ │ │ │ ├── validators.ts -│ │ │ │ ├── schemas.ts -│ │ │ │ └── index.ts -│ │ │ ├── helpers/ -│ │ │ │ ├── debounce.ts -│ │ │ │ ├── throttle.ts -│ │ │ │ ├── formatters.ts -│ │ │ │ └── index.ts -│ │ │ ├── constants/ -│ │ │ │ ├── regex.ts -│ │ │ │ ├── formats.ts -│ │ │ │ └── index.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── hooks/ # 🎣 Shared Custom Hooks -│ │ │ ├── useTheme.ts -│ │ │ ├── useDebounce.ts -│ │ │ ├── useKeyboard.ts -│ │ │ ├── useNetworkStatus.ts -│ │ │ ├── useOrientation.ts -│ │ │ └── index.ts -│ │ │ -│ │ ├── types/ # 📝 TypeScript Types -│ │ │ ├── common.ts -│ │ │ ├── api.ts -│ │ │ ├── navigation.ts -│ │ │ ├── theme.ts -│ │ │ └── index.ts -│ │ │ -│ │ └── index.ts # 📦 Barrel Export -│ │ -│ ├── package.json # 📦 Shared Package Config -│ └── tsconfig.json # ⚙️ TypeScript Config -│ -├── __tests__/ # 🧪 Global Tests -│ ├── App.test.tsx -│ ├── Navigation.test.tsx -│ ├── Redux.test.tsx -│ └── Integration.test.tsx -│ -├── assets/ # 🖼️ App-wide Assets -│ ├── images/ -│ ├── videos/ -│ └── audio/ -│ -├── android/ # 🤖 Android Native -├── ios/ # 🍎 iOS Native -├── index.js # 🎯 RN Entry Point -├── package.json # 📦 Root Dependencies -├── tsconfig.json # ⚙️ Base TypeScript Config -├── metro.config.js # 📦 Metro Bundler Config -├── babel.config.js # 🔄 Babel Config -└── .eslintrc.js # 📏 ESLint Config - - -Key Features: - -Real-time WebSocket connections -Offline caching for critical cases -Biometric authentication for radiologists -Performance monitoring with timing metrics - -Radiologist App Options -Option 1: "Clinical Gray Spectrum" - -Primary: #2C3E50 (Dark Blue-Gray) -Secondary: #34495E (Medium Blue-Gray) -Tertiary: #95A5A6 (Light Gray) -Text Primary: #2C3E50 (Dark Blue-Gray) -Text Secondary: #7F8C8D (Medium Gray) -Text Muted: #BDC3C7 (Light Gray) -Background: #F8F9FA (Light Gray) -Background Alt: #E9ECEF (Darker Light Gray) -Success: #27AE60 (Green) -Warning: #F39C12 (Orange) -Error: #E74C3C (Red) -Info: #3498DB (Blue) - -Option 2: "Deep Tech Purple" - -Primary: #6C5CE7 (Modern Purple) -Secondary: #A29BFE (Light Purple) -Tertiary: #DDD6FE (Very Light Purple) -Text Primary: #2D3436 (Charcoal) -Text Secondary: #636E72 (Gray) -Text Muted: #B2BEC3 (Light Gray) -Background: #FFFFFF (White) -Background Alt: #F8F7FF (Very Light Purple) -Success: #00B894 (Teal) -Warning: #FDCB6E (Yellow) -Error: #FD79A8 (Pink) -Info: #74B9FF (Light Blue) - -Option 3: "Dark Professional" - -Primary: #1A365D (Navy Blue) -Secondary: #2D3748 (Dark Gray) -Tertiary: #4A5568 (Medium Gray) -Text Primary: #1A202C (Very Dark Gray) -Text Secondary: #4A5568 (Medium Gray) -Text Muted: #718096 (Light Gray) -Background: #FFFFFF (White) -Background Alt: #F7FAFC (Off White) -Success: #38A169 (Green) -Warning: #DD6B20 (Orange) -Error: #E53E3E (Red) -Info: #3182CE (Blue) - -Option 4: "Sophisticated Slate" - -Primary: #475569 (Slate Gray) -Secondary: #64748B (Medium Slate) -Tertiary: #CBD5E1 (Light Slate) -Text Primary: #0F172A (Almost Black) -Text Secondary: #475569 (Slate Gray) -Text Muted: #94A3B8 (Light Slate) -Background: #FFFFFF (White) -Background Alt: #F8FAFC (Very Light Slate) -Success: #059669 (Emerald) -Warning: #D97706 (Amber) -Error: #DC2626 (Red) -Info: #0284C7 (Sky Blue) - -Radiologist App - "Clinical Blue Interface" -Primary: #5B7CE6 (Blue Purple - from the selected buttons) -Secondary: #7B94F0 (Light Blue Purple) -Tertiary: #E8EFFF (Very Light Blue) -Quaternary: #3B5998 (Deep Blue) -Text Primary: #1A1D29 (Almost Black) -Text Secondary: #4A5568 (Medium Gray) -Text Muted: #9CA3AF (Light Gray) -Background: #FFFFFF (White) -Background Alt: #F8FAFF (Very Light Blue Tint) -Background Accent: #F1F5FF (Soft Blue) -Card Background: #FFFFFF (White with shadow) -Success: #10B981 (Green - from the security icon) -Warning: #F59E0B (Amber) -Error: #EF4444 (Red) -Info: #3B82F6 (Blue) -Border: #E5E7EB (Light Gray) -Selected State: #5B7CE6 (Same as Primary) -Inactive State: #F3F4F6 (Light Gray) -Shadow: rgba(91, 124, 230, 0.1) (Blue Shadow) -Gradient Background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) - -Dark professional Prefered - -```sh -# Using npm -npm start - -# OR using Yarn -yarn start +## Project Structure +``` +app/ + modules/ # Feature modules (Auth, Dashboard, CaseReview, ...) + navigation/ # Navigation setup + redux/ # Redux store setup + constants/ # Global constants +shared/ + src/ + components/ # Shared UI components + theme/ # Design system (colors, typography, ...) + utils/ # Utility functions + hooks/ # Shared hooks + types/ # TypeScript types +assets/ # App-wide assets ``` -## Step 2: Build and run your app +## Theme +- Primary: #5B7CE6 +- Secondary: #7B94F0 +- Tertiary: #E8EFFF +- Quaternary: #3B5998 +- ... (see `shared/src/theme/colors.ts`) -With Metro running, open a new terminal window/pane from the root of your React Native project, and use one of the following commands to build and run your Android or iOS app: +## Setup +1. Install dependencies: + ```sh + npm install + ``` +2. Run the app: + ```sh + npm run android # or npm run ios + ``` -### Android - -```sh -# Using npm -npm run android - -# OR using Yarn -yarn android -``` - -### iOS - -For iOS, remember to install CocoaPods dependencies (this only needs to be run on first clone or after updating native deps). - -The first time you create a new project, run the Ruby bundler to install CocoaPods itself: - -```sh -bundle install -``` - -Then, and every time you update your native dependencies, run: - -```sh -bundle exec pod install -``` - -For more information, please visit [CocoaPods Getting Started guide](https://guides.cocoapods.org/using/getting-started.html). - -```sh -# Using npm -npm run ios - -# OR using Yarn -yarn ios -``` - -If everything is set up correctly, you should see your new app running in the Android Emulator, iOS Simulator, or your connected device. - -This is one way to run your app — you can also build it directly from Android Studio or Xcode. +## Copyright +Design & Developed by Tech4Biz Solutions +Copyright (c) Spurrin Innovations. All rights reserved. diff --git a/app/modules/Auth/__tests__/BiometricLogin.test.tsx b/app/modules/Auth/__tests__/BiometricLogin.test.tsx new file mode 100644 index 0000000..1887a8e --- /dev/null +++ b/app/modules/Auth/__tests__/BiometricLogin.test.tsx @@ -0,0 +1,30 @@ +/* + * File: BiometricLogin.test.tsx + * Description: Test for BiometricLogin component + * Design & Developed by Tech4Biz Solutions + * Copyright (c) Spurrin Innovations. All rights reserved. + */ + +import React from 'react'; +import { render, fireEvent } from '@testing-library/react-native'; +import BiometricLogin from '../components/BiometricLogin'; + +jest.mock('../hooks/useBiometric', () => ({ + useBiometric: () => ({ authenticate: jest.fn() }) +})); + +describe('BiometricLogin', () => { + it('renders button and triggers handler', () => { + const { getByText } = render(); + const button = getByText('Login with Biometric'); + expect(button).toBeTruthy(); + fireEvent.press(button); + // No error means handler is called + }); +}); + +/* + * End of File: BiometricLogin.test.tsx + * Design & Developed by Tech4Biz Solutions + * Copyright (c) Spurrin Innovations. All rights reserved. + */ \ No newline at end of file diff --git a/app/modules/Auth/__tests__/authAPI.test.ts b/app/modules/Auth/__tests__/authAPI.test.ts new file mode 100644 index 0000000..8738ab0 --- /dev/null +++ b/app/modules/Auth/__tests__/authAPI.test.ts @@ -0,0 +1,26 @@ +/* + * File: authAPI.test.ts + * Description: Test for authAPI service + * Design & Developed by Tech4Biz Solutions + * Copyright (c) Spurrin Innovations. All rights reserved. + */ + +import { authAPI } from '../services/authAPI'; + +jest.mock('apisauce', () => ({ + create: () => ({ post: jest.fn(() => Promise.resolve({ ok: true, data: { id: '1', name: 'Dr. Smith', email: 'dr@hospital.com' } })) }) +})); + +describe('authAPI', () => { + it('calls login and returns data', async () => { + const response = await authAPI.login('dr@hospital.com', 'password'); + expect(response.ok).toBe(true); + expect(response.data).toHaveProperty('email', 'dr@hospital.com'); + }); +}); + +/* + * End of File: authAPI.test.ts + * Design & Developed by Tech4Biz Solutions + * Copyright (c) Spurrin Innovations. All rights reserved. + */ \ No newline at end of file diff --git a/app/modules/Auth/__tests__/authSlice.test.ts b/app/modules/Auth/__tests__/authSlice.test.ts new file mode 100644 index 0000000..5244e11 --- /dev/null +++ b/app/modules/Auth/__tests__/authSlice.test.ts @@ -0,0 +1,40 @@ +/* + * File: authSlice.test.ts + * Description: Test for authSlice reducer + * Design & Developed by Tech4Biz Solutions + * Copyright (c) Spurrin Innovations. All rights reserved. + */ + +import reducer, { loginSuccess, loginFailure } from '../redux/authSlice'; + +const initialState = { + user: null, + loading: false, + error: null, + isAuthenticated: false, +}; + +describe('authSlice', () => { + it('handles loginSuccess', () => { + const user = { id: '1', name: 'Dr. Smith', email: 'dr@hospital.com' }; + const state = reducer(initialState, loginSuccess(user)); + expect(state.user).toEqual(user); + expect(state.isAuthenticated).toBe(true); + expect(state.loading).toBe(false); + expect(state.error).toBeNull(); + }); + + it('handles loginFailure', () => { + const error = 'Invalid credentials'; + const state = reducer(initialState, loginFailure(error)); + expect(state.loading).toBe(false); + expect(state.error).toBe(error); + expect(state.isAuthenticated).toBe(false); + }); +}); + +/* + * End of File: authSlice.test.ts + * Design & Developed by Tech4Biz Solutions + * Copyright (c) Spurrin Innovations. All rights reserved. + */ \ No newline at end of file diff --git a/app/modules/Auth/components/BiometricLogin.tsx b/app/modules/Auth/components/BiometricLogin.tsx new file mode 100644 index 0000000..8f9d6de --- /dev/null +++ b/app/modules/Auth/components/BiometricLogin.tsx @@ -0,0 +1,32 @@ +/* + * File: BiometricLogin.tsx + * Description: Component for biometric login button + * Design & Developed by Tech4Biz Solutions + * Copyright (c) Spurrin Innovations. All rights reserved. + */ + +import React from 'react'; +import { Button } from 'shared/src/components/Button'; +import { useBiometric } from '../hooks/useBiometric'; + +/** + * BiometricLogin - button to trigger biometric authentication + */ +const BiometricLogin: React.FC = () => { + const { authenticate } = useBiometric(); + + const handleBiometric = async () => { + await authenticate(); + // TODO: Handle result and login + }; + + return