From 456b717c488f0cf5e9181e0f6dd0a3f73c0c5c04 Mon Sep 17 00:00:00 2001 From: ElektrikSpark Date: Thu, 28 Dec 2023 20:38:48 -0600 Subject: [PATCH 1/2] user can log out --- apps/expo/src/app/_layout.tsx | 9 ++- apps/expo/src/app/index.tsx | 3 +- .../src/app/portal/(tabs)/account/index.tsx | 71 ++++++++++++++----- apps/expo/src/lib/constants.ts | 2 + apps/expo/src/utils/atom-with-mmkv.ts | 8 ++- 5 files changed, 71 insertions(+), 22 deletions(-) diff --git a/apps/expo/src/app/_layout.tsx b/apps/expo/src/app/_layout.tsx index a0cd1a23..b0c5381f 100644 --- a/apps/expo/src/app/_layout.tsx +++ b/apps/expo/src/app/_layout.tsx @@ -12,11 +12,13 @@ import { BottomSheetModalProvider } from "@gorhom/bottom-sheet"; import AsyncStorage from "@react-native-async-storage/async-storage"; import type { Theme } from "@react-navigation/native"; import { ThemeProvider } from "@react-navigation/native"; +import { atom, Provider, useAtom } from "jotai"; import { useColorScheme } from "nativewind"; import { ToastProvider } from "~/components/ui/rn-ui/components/ui/toast"; import { setAndroidNavigationBar } from "~/components/ui/rn-ui/lib/android-navigation-bar"; import { NAV_THEME } from "~/components/ui/rn-ui/lib/constants"; +import { USE_PROVIDER_KEY_TO_RESET_ATOMS } from "~/lib/constants"; import { TRPCProvider } from "~/utils/api"; const LIGHT_THEME: Theme = { @@ -28,6 +30,8 @@ const DARK_THEME: Theme = { colors: NAV_THEME.dark, }; +export const providerKeyAtom = atom(1); + async function onFetchUpdateAsync() { if (process.env.NODE_ENV === "development") { return; @@ -55,6 +59,7 @@ export default function RootLayout() { const { colorScheme, toggleColorScheme } = useColorScheme(); useAppForground(onFetchUpdateAsync, true); const [loaded, error] = useFonts(FontAwesome.font); + const [providerKey] = useAtom(providerKeyAtom); // Expo Router uses Error Boundaries to catch errors in the navigation tree. useEffect(() => { @@ -89,7 +94,9 @@ export default function RootLayout() { return ( - + + + ); } diff --git a/apps/expo/src/app/index.tsx b/apps/expo/src/app/index.tsx index 8ef51cb2..bc3edb11 100644 --- a/apps/expo/src/app/index.tsx +++ b/apps/expo/src/app/index.tsx @@ -8,7 +8,7 @@ import SvgComponent from "~/components/ui/home-svg"; import { Button } from "~/components/ui/rn-ui/components/ui/button"; const Index = () => { - const [, setPatientId] = useAtom(patientIdAtom); + const [patientId, setPatientId] = useAtom(patientIdAtom); const router = useRouter(); return ( @@ -20,6 +20,7 @@ const Index = () => { Hello there! + {patientId} Ready to get your life back? diff --git a/apps/expo/src/app/portal/(tabs)/account/index.tsx b/apps/expo/src/app/portal/(tabs)/account/index.tsx index 68df9a2e..ddb18bf6 100644 --- a/apps/expo/src/app/portal/(tabs)/account/index.tsx +++ b/apps/expo/src/app/portal/(tabs)/account/index.tsx @@ -1,9 +1,13 @@ -import { View } from "react-native"; +import { Text, View } from "react-native"; import { router } from "expo-router"; import { FlashList } from "@shopify/flash-list"; +import { useSetAtom } from "jotai"; import { Receipt } from "lucide-react-native"; +import { providerKeyAtom } from "~/app/_layout"; import { RecordCategoryCard } from "~/components/ui/cards/record-category-card"; +import { Button } from "~/components/ui/rn-ui/components/ui/button"; +import { logOut } from "~/utils/atom-with-mmkv"; const items = [ { @@ -14,25 +18,54 @@ const items = [ ]; export default function Account() { + const setProviderKey = useSetAtom(providerKeyAtom); + return ( - - ( - - )} - estimatedItemSize={100} - keyExtractor={(item, index) => index.toString()} - contentContainerStyle={{ - paddingBottom: 16, - paddingTop: 16, - paddingHorizontal: 16, - }} - /> + + + + + + DL + + + + Donna Lewis + + + ( + + )} + estimatedItemSize={200} + keyExtractor={(item, index) => index.toString()} + contentContainerStyle={{ + paddingBottom: 16, + paddingTop: 16, + paddingHorizontal: 16, + }} + /> + + + + ); } diff --git a/apps/expo/src/lib/constants.ts b/apps/expo/src/lib/constants.ts index eba854fa..15522016 100644 --- a/apps/expo/src/lib/constants.ts +++ b/apps/expo/src/lib/constants.ts @@ -1,3 +1,5 @@ +export const USE_PROVIDER_KEY_TO_RESET_ATOMS = true; + export const US_STATES = [ { label: "Alabama", value: "AL", inputLabel: "AL" }, { label: "Alaska", value: "AK", inputLabel: "AK" }, diff --git a/apps/expo/src/utils/atom-with-mmkv.ts b/apps/expo/src/utils/atom-with-mmkv.ts index ea5f5703..de441b54 100644 --- a/apps/expo/src/utils/atom-with-mmkv.ts +++ b/apps/expo/src/utils/atom-with-mmkv.ts @@ -19,7 +19,7 @@ function removeItem(key: string): void { storage.delete(key); } -export function clearAll(): void { +function clearAll(): void { storage.clearAll(); } @@ -34,3 +34,9 @@ export const atomWithMMKV = (key: string, initialValue: T) => clearAll, })), ); + +// "Log out" +export function logOut(resetState: () => void) { + clearAll(); + resetState(); +} From bc2b68fb8a59af2fb8ebd46efeab8b04a3244700 Mon Sep 17 00:00:00 2001 From: ElektrikSpark Date: Thu, 28 Dec 2023 23:46:48 -0600 Subject: [PATCH 2/2] fixed welcome form layout bug and refactored patientIdAtom and name --- apps/expo/src/app/index.tsx | 11 +- apps/expo/src/app/onboarding/(modals)/pdf.tsx | 6 +- apps/expo/src/app/onboarding/overview.tsx | 6 +- apps/expo/src/app/portal/(messages)/index.tsx | 5 +- apps/expo/src/app/portal/(modals)/pdf.tsx | 8 +- .../src/app/portal/(tabs)/account/billing.tsx | 4 +- .../src/app/portal/(tabs)/account/index.tsx | 25 +- .../portal/(tabs)/health-record/allergies.tsx | 2 +- .../(tabs)/health-record/conditions.tsx | 2 +- .../health-record/forms/clinical-notes.tsx | 2 +- .../health-record/forms/consents/index.tsx | 2 +- .../(tabs)/health-record/forms/goals.tsx | 2 +- .../forms/questionnaires/index.tsx | 2 +- .../(tabs)/health-record/immunizations.tsx | 2 +- .../(tabs)/health-record/medications.tsx | 2 +- .../health-record/test-results/[testId].tsx | 2 +- .../health-record/test-results/index.tsx | 2 +- apps/expo/src/app/portal/(tabs)/index.tsx | 42 +- .../src/components/completed-appointments.tsx | 2 +- .../src/components/forms/allergies-form.tsx | 10 +- .../src/components/forms/conditions-form.tsx | 11 +- .../src/components/forms/coverage-form.tsx | 7 +- .../src/components/forms/medications-form.tsx | 10 +- .../components/forms/questionnaire-form.tsx | 4 +- .../expo/src/components/forms/upload-test.tsx | 3 +- .../src/components/forms/welcome-form.tsx | 371 +++++++++--------- apps/expo/src/components/next-appointment.tsx | 2 +- .../src/components/schedule-appointment.tsx | 17 +- apps/expo/src/components/tasks.tsx | 2 +- .../src/components/ui/cards/alert-card.tsx | 5 +- .../components/ui/cards/chat-preview-card.tsx | 5 +- .../expo/src/components/ui/forms/checkbox.tsx | 5 +- .../src/components/ui/forms/date-picker.tsx | 2 +- .../expo/src/components/ui/forms/dropdown.tsx | 5 +- .../ui/health-record/condition-item.tsx | 5 +- .../ui/health-record/consent-item.tsx | 5 +- .../components/ui/health-record/goal-item.tsx | 5 +- .../ui/health-record/immunization-item.tsx | 5 +- .../ui/health-record/medication-item.tsx | 5 +- .../ui/health-record/question-item.tsx | 5 +- .../src/components/upcoming-appointments.tsx | 9 +- apps/expo/src/utils/session-store.ts | 7 - .../onboarding/_components/allergies-form.tsx | 2 - .../_components/conditions-form.tsx | 1 - packages/api/src/router/patient.ts | 2 +- 45 files changed, 335 insertions(+), 304 deletions(-) diff --git a/apps/expo/src/app/index.tsx b/apps/expo/src/app/index.tsx index bc3edb11..2d724b9a 100644 --- a/apps/expo/src/app/index.tsx +++ b/apps/expo/src/app/index.tsx @@ -3,12 +3,18 @@ import { SafeAreaView } from "react-native-safe-area-context"; import { Stack, useRouter } from "expo-router"; import { useAtom } from "jotai"; -import { patientIdAtom } from "~/components/forms/welcome-form"; import SvgComponent from "~/components/ui/home-svg"; import { Button } from "~/components/ui/rn-ui/components/ui/button"; +import { atomWithMMKV } from "~/utils/atom-with-mmkv"; + +export const patientIdAtom = atomWithMMKV("patient_id", ""); +export const patientNameAtom = atomWithMMKV("patient_name", { + firstName: "", + lastName: "", +}); const Index = () => { - const [patientId, setPatientId] = useAtom(patientIdAtom); + const [, setPatientId] = useAtom(patientIdAtom); const router = useRouter(); return ( @@ -20,7 +26,6 @@ const Index = () => { Hello there! - {patientId} Ready to get your life back? diff --git a/apps/expo/src/app/onboarding/(modals)/pdf.tsx b/apps/expo/src/app/onboarding/(modals)/pdf.tsx index 70476bad..1fbebcc6 100644 --- a/apps/expo/src/app/onboarding/(modals)/pdf.tsx +++ b/apps/expo/src/app/onboarding/(modals)/pdf.tsx @@ -26,16 +26,16 @@ export default function PDFPage() { { - console.log(`Number of pages: ${numberOfPages}`); + // console.log(`Number of pages: ${numberOfPages}`); }} onPageChanged={(page, numberOfPages) => { - console.log(`Current page: ${page}`); + // console.log(`Current page: ${page}`); }} onError={(error) => { console.log(error); }} onPressLink={(uri) => { - console.log(`Link pressed: ${uri}`); + // console.log(`Link pressed: ${uri}`); }} style={{ flex: 1, width, height }} trustAllCerts={false} diff --git a/apps/expo/src/app/onboarding/overview.tsx b/apps/expo/src/app/onboarding/overview.tsx index 1c649735..e26d68a0 100644 --- a/apps/expo/src/app/onboarding/overview.tsx +++ b/apps/expo/src/app/onboarding/overview.tsx @@ -1,15 +1,19 @@ import { SafeAreaView, Text, View } from "react-native"; +import { useAtom } from "jotai"; +import { patientNameAtom } from "~/app"; import Steps from "~/components/ui/steps"; export default function OverviewPage() { + const [patientName] = useAtom(patientNameAtom); + return ( <> - {`Hi Donna, let's get you onboarded`} + {`Hi ${patientName.firstName}, let's get you onboarded`} diff --git a/apps/expo/src/app/portal/(messages)/index.tsx b/apps/expo/src/app/portal/(messages)/index.tsx index 31c5425d..c7a36276 100644 --- a/apps/expo/src/app/portal/(messages)/index.tsx +++ b/apps/expo/src/app/portal/(messages)/index.tsx @@ -2,7 +2,9 @@ import { useEffect, useState } from "react"; import { View } from "react-native"; import { router } from "expo-router"; import { FlashList } from "@shopify/flash-list"; +import { useAtom } from "jotai"; +import { patientIdAtom } from "~/app"; import ChatPreviewCard from "~/components/ui/cards/chat-preview-card"; import { api } from "~/utils/api"; @@ -13,11 +15,12 @@ interface Chat { } export default function MessagesPage() { + const [patientId] = useAtom(patientIdAtom); const [chats, setChats] = useState([]); const patientQuery = api.patient.getPatient.useQuery({ path: { - patient_id: "e7836251cbed4bd5bb2d792bc02893fd", + patient_id: patientId, }, }); diff --git a/apps/expo/src/app/portal/(modals)/pdf.tsx b/apps/expo/src/app/portal/(modals)/pdf.tsx index 6c58f651..5b5f4af6 100644 --- a/apps/expo/src/app/portal/(modals)/pdf.tsx +++ b/apps/expo/src/app/portal/(modals)/pdf.tsx @@ -12,8 +12,6 @@ export default function PDFPage() { const { url } = useLocalSearchParams<{ url: string }>(); const { width, height } = useWindowDimensions(); - console.log(url); - const source = { uri: url, cache: true }; return ( @@ -28,16 +26,16 @@ export default function PDFPage() { { - console.log(`Number of pages: ${numberOfPages}`); + // console.log(`Number of pages: ${numberOfPages}`); }} onPageChanged={(page, numberOfPages) => { - console.log(`Current page: ${page}`); + // console.log(`Current page: ${page}`); }} onError={(error) => { console.log(error); }} onPressLink={(uri) => { - console.log(`Link pressed: ${uri}`); + // console.log(`Link pressed: ${uri}`); }} style={{ flex: 1, width, height }} trustAllCerts={false} diff --git a/apps/expo/src/app/portal/(tabs)/account/billing.tsx b/apps/expo/src/app/portal/(tabs)/account/billing.tsx index 1ea476a2..831d4c8e 100644 --- a/apps/expo/src/app/portal/(tabs)/account/billing.tsx +++ b/apps/expo/src/app/portal/(tabs)/account/billing.tsx @@ -1,13 +1,15 @@ import { Text, TouchableOpacity, View } from "react-native"; import { useRouter } from "expo-router"; +import { useAtom } from "jotai"; import { ChevronRight, Loader2 } from "lucide-react-native"; +import { patientIdAtom } from "~/app"; import { api } from "~/utils/api"; import { formatDateTime } from "~/utils/dates"; export default function Billing() { + const [patientId] = useAtom(patientIdAtom); const router = useRouter(); - const patientId = "e7836251cbed4bd5bb2d792bc02893fd"; const billingQuery = api.document.searchBillDocument.useQuery({ query: { diff --git a/apps/expo/src/app/portal/(tabs)/account/index.tsx b/apps/expo/src/app/portal/(tabs)/account/index.tsx index ddb18bf6..2961d47e 100644 --- a/apps/expo/src/app/portal/(tabs)/account/index.tsx +++ b/apps/expo/src/app/portal/(tabs)/account/index.tsx @@ -1,9 +1,10 @@ import { Text, View } from "react-native"; import { router } from "expo-router"; import { FlashList } from "@shopify/flash-list"; -import { useSetAtom } from "jotai"; +import { useAtom, useSetAtom } from "jotai"; import { Receipt } from "lucide-react-native"; +import { patientNameAtom } from "~/app"; import { providerKeyAtom } from "~/app/_layout"; import { RecordCategoryCard } from "~/components/ui/cards/record-category-card"; import { Button } from "~/components/ui/rn-ui/components/ui/button"; @@ -19,18 +20,25 @@ const items = [ export default function Account() { const setProviderKey = useSetAtom(providerKeyAtom); + const [patientName] = useAtom(patientNameAtom); + + // Construct initials from the first letters of the first and last names + const initials = `${patientName.firstName[0] ?? ""}${ + patientName.lastName[0] ?? "" + }`; return ( - - + + - DL + {initials.toUpperCase()} {/* Display initials */} - - Donna Lewis + + {`${patientName.firstName} ${patientName.lastName}`}{" "} + {/* Display full name */} diff --git a/apps/expo/src/app/portal/(tabs)/health-record/allergies.tsx b/apps/expo/src/app/portal/(tabs)/health-record/allergies.tsx index 27086525..d276febe 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/allergies.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/allergies.tsx @@ -3,7 +3,7 @@ import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; import { Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import AllergyItem from "~/components/ui/health-record/allergy-item"; import { api } from "~/utils/api"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/conditions.tsx b/apps/expo/src/app/portal/(tabs)/health-record/conditions.tsx index 64b86279..273be587 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/conditions.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/conditions.tsx @@ -3,7 +3,7 @@ import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; import { Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import ConditionItem from "~/components/ui/health-record/condition-item"; import { api } from "~/utils/api"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/forms/clinical-notes.tsx b/apps/expo/src/app/portal/(tabs)/health-record/forms/clinical-notes.tsx index 82c9dfe5..a9eee467 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/forms/clinical-notes.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/forms/clinical-notes.tsx @@ -3,7 +3,7 @@ import { useRouter } from "expo-router"; import { useAtom } from "jotai"; import { ChevronRight, Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import { api } from "~/utils/api"; import { formatDateTime } from "~/utils/dates"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/forms/consents/index.tsx b/apps/expo/src/app/portal/(tabs)/health-record/forms/consents/index.tsx index 89ef0855..c0290b9a 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/forms/consents/index.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/forms/consents/index.tsx @@ -3,7 +3,7 @@ import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; import { Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import ConsentItem from "~/components/ui/health-record/consent-item"; import { api } from "~/utils/api"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/forms/goals.tsx b/apps/expo/src/app/portal/(tabs)/health-record/forms/goals.tsx index ffce6af2..d56e7c71 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/forms/goals.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/forms/goals.tsx @@ -3,7 +3,7 @@ import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; import { Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import GoalItem from "~/components/ui/health-record/goal-item"; import { api } from "~/utils/api"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/forms/questionnaires/index.tsx b/apps/expo/src/app/portal/(tabs)/health-record/forms/questionnaires/index.tsx index aa0b44b0..0d061fa9 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/forms/questionnaires/index.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/forms/questionnaires/index.tsx @@ -4,7 +4,7 @@ import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; import { Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import QuestionnaireItem from "~/components/ui/health-record/questionnaire-item"; import { api } from "~/utils/api"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/immunizations.tsx b/apps/expo/src/app/portal/(tabs)/health-record/immunizations.tsx index 79178015..4cdf189b 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/immunizations.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/immunizations.tsx @@ -3,7 +3,7 @@ import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; import { Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import ImmunizationItem from "~/components/ui/health-record/immunization-item"; import { api } from "~/utils/api"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/medications.tsx b/apps/expo/src/app/portal/(tabs)/health-record/medications.tsx index 45cee145..43e639b6 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/medications.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/medications.tsx @@ -3,7 +3,7 @@ import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; import { Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import MedicationItem from "~/components/ui/health-record/medication-item"; import { api } from "~/utils/api"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/test-results/[testId].tsx b/apps/expo/src/app/portal/(tabs)/health-record/test-results/[testId].tsx index 514df085..af23c800 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/test-results/[testId].tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/test-results/[testId].tsx @@ -4,7 +4,7 @@ import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; import { ChevronRight, Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import ObservationItem from "~/components/ui/health-record/observation-item"; import { api } from "~/utils/api"; import { formatDateTime } from "~/utils/dates"; diff --git a/apps/expo/src/app/portal/(tabs)/health-record/test-results/index.tsx b/apps/expo/src/app/portal/(tabs)/health-record/test-results/index.tsx index fa0fb23c..ee5af2c5 100644 --- a/apps/expo/src/app/portal/(tabs)/health-record/test-results/index.tsx +++ b/apps/expo/src/app/portal/(tabs)/health-record/test-results/index.tsx @@ -3,7 +3,7 @@ import { useRouter } from "expo-router"; import { FlashList } from "@shopify/flash-list"; import { useAtom } from "jotai"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom } from "~/app"; import TestItem from "~/components/ui/health-record/test-item"; import { api } from "~/utils/api"; diff --git a/apps/expo/src/app/portal/(tabs)/index.tsx b/apps/expo/src/app/portal/(tabs)/index.tsx index 462863bc..e2b17fd4 100644 --- a/apps/expo/src/app/portal/(tabs)/index.tsx +++ b/apps/expo/src/app/portal/(tabs)/index.tsx @@ -1,25 +1,55 @@ import { Text, View } from "react-native"; import { useAtom } from "jotai"; +import { Loader2 } from "lucide-react-native"; -import { patientIdAtom } from "~/components/forms/welcome-form"; +import { patientIdAtom, patientNameAtom } from "~/app"; import NextAppointment from "~/components/next-appointment"; import Tasks from "~/components/tasks"; import { api } from "~/utils/api"; export default function Home() { const [patientId] = useAtom(patientIdAtom); + const [patientName, setPatientName] = useAtom(patientNameAtom); - const patientQuery = api.patient.getPatient.useQuery({ - path: { - patient_id: patientId, + const patientQuery = api.patient.getPatient.useQuery( + { + path: { + patient_id: patientId, + }, }, - }); + { + enabled: !!patientId, + }, + ); + + if (patientQuery.isLoading) { + return ( + + + + ); + } + + // Update patient name if not already set and if data is available + if ( + patientQuery.data?.name?.[0] && + (!patientName.firstName || !patientName.lastName) + ) { + const firstName = patientQuery.data.name[0].given?.[0] ?? ""; + const lastName = patientQuery.data.name[0].family ?? ""; + setPatientName({ firstName, lastName }); + } return ( {/* Welcome message */} - Good Morning, {patientQuery.data?.name?.[0]?.given?.[0] ?? "User"} + Good Morning, {patientName.firstName || "User"} {/* Next appointment */} diff --git a/apps/expo/src/components/completed-appointments.tsx b/apps/expo/src/components/completed-appointments.tsx index 1fff71fd..613075a2 100644 --- a/apps/expo/src/components/completed-appointments.tsx +++ b/apps/expo/src/components/completed-appointments.tsx @@ -6,6 +6,7 @@ import { Calendar, Clock, Loader2 } from "lucide-react-native"; import type { CareTeamBundle } from "@acme/shared/src/validators/care-team"; +import { patientIdAtom } from "~/app"; import { Card, CardContent, @@ -16,7 +17,6 @@ import { } from "~/components/ui/rn-ui/components/ui/card"; import { api } from "~/utils/api"; import { formatDayDate, formatTime } from "~/utils/dates"; -import { patientIdAtom } from "./forms/welcome-form"; export default function CompletedAppointments() { const [patientId] = useAtom(patientIdAtom); diff --git a/apps/expo/src/components/forms/allergies-form.tsx b/apps/expo/src/components/forms/allergies-form.tsx index aaef62b1..955ceec7 100644 --- a/apps/expo/src/components/forms/allergies-form.tsx +++ b/apps/expo/src/components/forms/allergies-form.tsx @@ -1,5 +1,4 @@ import { - Alert, KeyboardAvoidingView, Platform, SafeAreaView, @@ -21,11 +20,11 @@ import { import type { AllergiesFormData } from "@acme/shared/src/validators/forms"; import { allergiesFormSchema } from "@acme/shared/src/validators/forms"; +import { patientIdAtom } from "~/app"; import { Button } from "~/components/ui/rn-ui/components/ui/button"; import { api } from "~/utils/api"; import { Dropdown } from "../ui/forms/dropdown"; import AllergenSelector from "./allergen-selector"; -import { patientIdAtom } from "./welcome-form"; export const AllergiesForm = (props: { onSuccess?: () => void }) => { const [patientId] = useAtom(patientIdAtom); @@ -37,9 +36,6 @@ export const AllergiesForm = (props: { onSuccess?: () => void }) => { props.onSuccess(); } }, - onError: (error) => { - Alert.alert("Warning", JSON.stringify(error)); - }, }); const form = useForm({ @@ -124,7 +120,7 @@ export const AllergiesForm = (props: { onSuccess?: () => void }) => { }, ], }; - console.log(JSON.stringify(requestBody), "requestBody"); + // Submit each allergy intolerance entry mutation.mutate( { body: requestBody }, @@ -145,7 +141,7 @@ export const AllergiesForm = (props: { onSuccess?: () => void }) => { } return ( - + void }) => { const [patientId] = useAtom(patientIdAtom); const mutation = api.condition.submitCondition.useMutation({ onSuccess: (data) => { - console.log(data, "data"); - // Call the passed onSuccess prop if it exists if (props.onSuccess) { props.onSuccess(); } }, - onError: (error) => { - Alert.alert("Warning", JSON.stringify(error)); - }, }); const form = useForm({ @@ -142,7 +137,7 @@ export const ConditionsForm = (props: { onSuccess?: () => void }) => { const watchedConditions = form.watch("conditions"); return ( - + void }) => { const [patientId] = useAtom(patientIdAtom); @@ -35,14 +35,12 @@ export const CoverageForm = (props: { onSuccess?: () => void }) => { const coverageMutation = api.coverage.submitCoverage.useMutation({ onSuccess: (data) => { - console.log(data, "data"); + // console.log(data, "data"); }, }); const consentMutation = api.consent.submitConsent.useMutation({ onSuccess: (data) => { - console.log(data, "data"); - // Update the coverage step as complete updater.updateStepStatus("coverage", "complete"); @@ -55,7 +53,6 @@ export const CoverageForm = (props: { onSuccess?: () => void }) => { async function onSubmit(data: CoverageFormType) { const { subscriberId, payorId, insuranceConsent } = data; - console.log(JSON.stringify(data)); // Calculate start and end dates const startDate = new Date(); diff --git a/apps/expo/src/components/forms/medications-form.tsx b/apps/expo/src/components/forms/medications-form.tsx index 5ed2643c..111dfae3 100644 --- a/apps/expo/src/components/forms/medications-form.tsx +++ b/apps/expo/src/components/forms/medications-form.tsx @@ -1,5 +1,4 @@ import { - Alert, KeyboardAvoidingView, Platform, SafeAreaView, @@ -16,12 +15,12 @@ import { useForm } from "react-hook-form"; import type { MedicationsFormData } from "@acme/shared/src/validators/forms"; import { medicationsFormSchema } from "@acme/shared/src/validators/forms"; +import { patientIdAtom } from "~/app"; import { Button } from "~/components/ui/rn-ui/components/ui/button"; import { api } from "~/utils/api"; import MedicationSelector, { selectedMedicationsAtom, } from "./medication-selector"; -import { patientIdAtom } from "./welcome-form"; export const MedicationsForm = (props: { onSuccess?: () => void }) => { const [patientId] = useAtom(patientIdAtom); @@ -31,16 +30,11 @@ export const MedicationsForm = (props: { onSuccess?: () => void }) => { const mutation = api.medication.submitMedicationStatement.useMutation({ onSuccess: (data) => { - console.log(data, "data"); - // Call the passed onSuccess prop if it exists if (props.onSuccess) { props.onSuccess(); } }, - onError: (error) => { - Alert.alert("Warning", JSON.stringify(error)); - }, }); const form = useForm({ @@ -103,7 +97,7 @@ export const MedicationsForm = (props: { onSuccess?: () => void }) => { } return ( - + ; @@ -128,7 +128,7 @@ export const QuestionnaireForm = (props: QuestionnaireProps) => { return ( - + {dynamicSchema && ( diff --git a/apps/expo/src/components/forms/upload-test.tsx b/apps/expo/src/components/forms/upload-test.tsx index ffbb0803..d128f0c1 100644 --- a/apps/expo/src/components/forms/upload-test.tsx +++ b/apps/expo/src/components/forms/upload-test.tsx @@ -1,2 +1 @@ -export const uploadTestPdf = - "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1znv7kzJafWfxqCWEKhtvk+umQoai78n9M4nV37ft5d0YgplbmRzdHJlYW0KZW5kb2JqCgo5IDAgb2JqCjw8L1R5cGUvRm9udC9TdWJ0eXBlL1RydWVUeXBlL0Jhc2VGb250L0JBQUFBQStMaWJlcmF0aW9uU2VyaWYKL0ZpcnN0Q2hhciAwCi9MYXN0Q2hhciA0Ci9XaWR0aHNbNzc3IDYxMCA0NDMgMzg5IDI3NyBdCi9Gb250RGVzY3JpcHRvciA3IDAgUgovVG9Vbmljb2RlIDggMCBSCj4+CmVuZG9iagoKMTAgMCBvYmoKPDwvRjEgOSAwIFIKPj4KZW5kb2JqCgoxMSAwIG9iago8PC9Gb250IDEwIDAgUgovUHJvY1NldFsvUERGL1RleHRdCj4+CmVuZG9iagoKMSAwIG9iago8PC9UeXBlL1BhZ2UvUGFyZW50IDQgMCBSL1Jlc291cmNlcyAxMSAwIFIvTWVkaWFCb3hbMCAwIDYxMiA3OTJdL0dyb3VwPDwvUy9UcmFuc3BhcmVuY3kvQ1MvRGV2aWNlUkdCL0kgdHJ1ZT4+L0NvbnRlbnRzIDIgMCBSPj4KZW5kb2JqCgo0IDAgb2JqCjw8L1R5cGUvUGFnZXMKL1Jlc291cmNlcyAxMSAwIFIKL01lZGlhQm94WyAwIDAgNjEyIDc5MiBdCi9LaWRzWyAxIDAgUiBdCi9Db3VudCAxPj4KZW5kb2JqCgoxMiAwIG9iago8PC9UeXBlL0NhdGFsb2cvUGFnZXMgNCAwIFIKL09wZW5BY3Rpb25bMSAwIFIgL1hZWiBudWxsIG51bGwgMF0KL0xhbmcoZW4tVVMpCj4+CmVuZG9iagoKMTMgMCBvYmoKPDwvQ3JlYXRvcjxGRUZGMDA1NzAwNzIwMDY5MDA3NDAwNjUwMDcyPgovUHJvZHVjZXI8RkVGRjAwNEMwMDY5MDA2MjAwNzIwMDY1MDA0RjAwNjYwMDY2MDA2OTAwNjMwMDY1MDAyMDAwMzcwMDJFMDAzMj4KL0NyZWF0aW9uRGF0ZShEOjIwMjIwNTIzMDczODM3LTA3JzAwJyk+PgplbmRvYmoKCnhyZWYKMCAxNAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDU3MTUgMDAwMDAgbiAKMDAwMDAwMDAxOSAwMDAwMCBuIAowMDAwMDAwMTk2IDAwMDAwIG4gCjAwMDAwMDU4NTggMDAwMDAgbiAKMDAwMDAwMDIxNiAwMDAwMCBuIAowMDAwMDA0OTI4IDAwMDAwIG4gCjAwMDAwMDQ5NDkgMDAwMDAgbiAKMDAwMDAwNTE0NCAwMDAwMCBuIAowMDAwMDA1NDUzIDAwMDAwIG4gCjAwMDAwMDU2MjggMDAwMDAgbiAKMDAwMDAwNTY2MCAwMDAwMCBuIAowMDAwMDA1OTU3IDAwMDAwIG4gCjAwMDAwMDYwNTQgMDAwMDAgbiAKdHJhaWxlcgo8PC9TaXplIDE0L1Jvb3QgMTIgMCBSCi9JbmZvIDEzIDAgUgovSUQgWyA8ODREQjY2QjEwREU5OTRGNzA1ODlCQTNCRjUzODE4RDg+Cjw4NERCNjZCMTBERTk5NEY3MDU4OUJBM0JGNTM4MThEOD4gXQovRG9jQ2hlY2tzdW0gLzg3MTVEQTJGQzEyOEM2RUY4NzlFREY4RUZGMjRBQTc0Cj4+CnN0YXJ0eHJlZgo2MjI5CiUlRU9GCg=="; +export const uploadTestPdf = `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wZqM5BSkowuxOqCey39c5n0bkrw4F+aDjwIHs4xEG7i9GzvaRbXsP2apqNMKZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqCjw8L1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUwCi9CYXNlRm9udCAvQkFBQUFBK0FyaWFsTVQKL0VuY29kaW5nIC9JZGVudGl0eS1ICi9EZXNjZW5kYW50Rm9udHMgWzE2IDAgUl0KL1RvVW5pY29kZSAxNyAwIFI+PgplbmRvYmoKeHJlZgowIDE4CjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAyNTk4IDAwMDAwIG4gCjAwMDAwMDAxMTIgMDAwMDAgbiAKMDAwMDAxNTkwMyAwMDAwMCBuIAowMDAwMDM2OTYyIDAwMDAwIG4gCjAwMDAwMDAxNDkgMDAwMDAgbiAKMDAwMDAwMjgxNiAwMDAwMCBuIAowMDAwMDAyODcxIDAwMDAwIG4gCjAwMDAwMDI5MjggMDAwMDAgbiAKMDAwMDAwMjk4OCAwMDAwMCBuIAowMDAwMDE0OTM4IDAwMDAwIG4gCjAwMDAwMTUxNzkgMDAwMDAgbiAKMDAwMDAxNTU0MSAwMDAwMCBuIAowMDAwMDE2MDQ3IDAwMDAwIG4gCjAwMDAwMzU3ODUgMDAwMDAgbiAKMDAwMDAzNjAyMSAwMDAwMCBuIAowMDAwMDM2NTY3IDAwMDAwIG4gCnRyYWlsZXIKPDwvU2l6ZSAxOAovUm9vdCA5IDAgUgovSW5mbyAxIDAgUj4+CnN0YXJ0eHJlZgozNzEwMQolJUVPRgo=`; diff --git a/apps/expo/src/components/forms/welcome-form.tsx b/apps/expo/src/components/forms/welcome-form.tsx index 72ceada5..1048c4f9 100644 --- a/apps/expo/src/components/forms/welcome-form.tsx +++ b/apps/expo/src/components/forms/welcome-form.tsx @@ -5,11 +5,16 @@ import Animated, { FadeInDown, FadeOutUp } from "react-native-reanimated"; import { Link } from "expo-router"; import { zodResolver } from "@hookform/resolvers/zod"; import { useAtom } from "jotai"; +import { Loader2 } from "lucide-react-native"; import { Controller, FormProvider, useForm } from "react-hook-form"; import type { PatientIntake } from "@acme/shared/src/validators/forms"; import { patientIntakeSchema } from "@acme/shared/src/validators/forms"; +import { patientIdAtom, patientNameAtom } from "~/app"; +import { uploadTestPdf } from "~/components/forms/upload-test"; +import { DatePicker } from "~/components/ui/forms/date-picker"; +import { Dropdown } from "~/components/ui/forms/dropdown"; import { Button } from "~/components/ui/rn-ui/components/ui/button"; import { Checkbox } from "~/components/ui/rn-ui/components/ui/checkbox"; import { Input } from "~/components/ui/rn-ui/components/ui/input"; @@ -17,15 +22,10 @@ import { Label } from "~/components/ui/rn-ui/components/ui/label"; import { cn } from "~/components/ui/rn-ui/lib/utils"; import { US_STATES } from "~/lib/constants"; import { api } from "~/utils/api"; -import { atomWithMMKV } from "~/utils/atom-with-mmkv"; -import { DatePicker } from "../ui/forms/date-picker"; -import { Dropdown } from "../ui/forms/dropdown"; -import { uploadTestPdf } from "./upload-test"; - -export const patientIdAtom = atomWithMMKV("patient_id", ""); export const WelcomeForm = (props: { onSuccess?: () => void }) => { const [, setPatientId] = useAtom(patientIdAtom); + const [, setPatientName] = useAtom(patientNameAtom); const [consentsCompleted, setConsentsCompleted] = useState(0); const form = useForm({ @@ -45,29 +45,19 @@ export const WelcomeForm = (props: { onSuccess?: () => void }) => { const patientMutation = api.patient.createPatient.useMutation({ onSuccess: (data) => { - console.log(data, "data"); - }, - onError: (error) => { - console.log(error, "error"); - console.log(JSON.stringify(error)); - Alert.alert("Warning", JSON.stringify(error)); + // console.log(data, "data"); }, }); const consentMutation = api.consent.submitConsent.useMutation({ onSuccess: (data) => { - console.log(data, "data"); - // Increment consentsCompleted setConsentsCompleted((count) => count + 1); }, - onError: (error) => { - console.log(error, "error"); - console.log(JSON.stringify(error)); - Alert.alert("Warning", JSON.stringify(error)); - }, }); + const isLoading = patientMutation.isLoading || consentMutation.isLoading; + // function to map gender to birthsex valueCode for extension on request body function mapGenderToBirthSex(gender: string) { switch (gender.toLowerCase()) { @@ -96,8 +86,6 @@ export const WelcomeForm = (props: { onSuccess?: () => void }) => { phoneNumber, genericConsent, } = data; - console.log(JSON.stringify(data)); - // Calculate start and end dates const startDate = new Date(); const endDate = new Date(startDate); @@ -157,6 +145,11 @@ export const WelcomeForm = (props: { onSuccess?: () => void }) => { if (patientDataId) { // Set patientId in MMKV setPatientId(patientDataId); + // Set patientName in MMKV + setPatientName({ + firstName: givenName[0] ?? "", + lastName: familyName ?? "", + }); // Prepare consent request bodies const genericConsentRequestBody = { @@ -219,101 +212,107 @@ export const WelcomeForm = (props: { onSuccess?: () => void }) => { - { - return ( - - - - {error && ( - - {error?.message} - - )} - - ); - }} - /> - - - { - return ( - - { - onChange(date); - }} - errorMessage={error?.message} - /> - - ); - }} - /> - + { return ( - + Name + + console.log(value)} - items={[ - { label: "male", value: "male" }, - { label: "female", value: "female" }, - { label: "other", value: "other" }, - { label: "unknown", value: "unknown" }, - ]} - placeholder={{ - label: "Select...", - value: null, - color: "#9EA0A4", - }} - errorMessage={error?.message} + onChangeText={onChange} + onBlur={onBlur} + accessibilityLabel="name" + accessibilityLabelledBy="nameLabel" /> + {error && ( + + {error?.message} + + )} ); }} /> - + + + { + return ( + + { + onChange(date); + }} + errorMessage={error?.message} + /> + + ); + }} + /> + + + + { + return ( + + + + ); + }} + /> + + + + void }) => { /> + + ( + + + + {error && ( + + {error?.message} + + )} + + )} + /> + + + + ( + + + + )} + /> + + + + ( - + {error && ( void }) => { )} /> - - ( - - { - // return ; - // }} - errorMessage={error?.message} - /> - - )} - /> - - ( - - - - {error && ( - - {error?.message} - - )} - - )} - /> - + void }) => { fieldState: { error }, }) => { return ( - + - + void }) => { - + ); diff --git a/apps/expo/src/components/next-appointment.tsx b/apps/expo/src/components/next-appointment.tsx index 712df273..90d2afb3 100644 --- a/apps/expo/src/components/next-appointment.tsx +++ b/apps/expo/src/components/next-appointment.tsx @@ -5,6 +5,7 @@ import { Calendar, Clock, Loader2 } from "lucide-react-native"; import type { CareTeamBundle } from "@acme/shared/src/validators/care-team"; +import { patientIdAtom } from "~/app"; import { Card, CardContent, @@ -14,7 +15,6 @@ import { } from "~/components/ui/rn-ui/components/ui/card"; import { api } from "~/utils/api"; import { formatDayDate, formatTime } from "~/utils/dates"; -import { patientIdAtom } from "./forms/welcome-form"; export default function NextAppointment() { const [patientId] = useAtom(patientIdAtom); diff --git a/apps/expo/src/components/schedule-appointment.tsx b/apps/expo/src/components/schedule-appointment.tsx index 8068cf32..9b0ea681 100644 --- a/apps/expo/src/components/schedule-appointment.tsx +++ b/apps/expo/src/components/schedule-appointment.tsx @@ -6,8 +6,8 @@ import { Loader2 } from "lucide-react-native"; import type { SlotResource } from "@acme/shared/src/validators/slot"; +import { patientIdAtom } from "~/app"; import { onboardingDateAtom } from "~/app/onboarding/confirmation"; -import { patientIdAtom } from "~/components/forms/welcome-form"; import { ScheduleHeader, selectedDateAtom, @@ -79,8 +79,6 @@ export default function ScheduleAppointment(props: { const mutation = api.scheduling.createAppointment.useMutation({ onSuccess: (data) => { - console.log(data, "data"); - // Set onboarding date for confirmation page if onboarding if (props.onboarding) { setOnboardingDate(selectedSlot?.start ?? ""); @@ -91,27 +89,15 @@ export default function ScheduleAppointment(props: { props.onSuccess(); } }, - onError: (error) => { - console.log(error, "error"); - console.log(JSON.stringify(error)); - Alert.alert("Warning", JSON.stringify(error)); - }, }); const updateMutation = api.scheduling.updateAppointment.useMutation({ onSuccess: (data) => { - console.log(data, "data"); - // Navigate to confirmation page if (props.onSuccess) { props.onSuccess(); } }, - onError: (error) => { - console.log(error, "error"); - console.log(JSON.stringify(error)); - Alert.alert("Warning", JSON.stringify(error)); - }, }); function extractLocationId(reference: string) { @@ -131,7 +117,6 @@ export default function ScheduleAppointment(props: { function onBook(slot: SlotResource | null) { if (!slot) { - console.log("No slot selected"); return; } diff --git a/apps/expo/src/components/tasks.tsx b/apps/expo/src/components/tasks.tsx index c22ce19b..fedb9f9c 100644 --- a/apps/expo/src/components/tasks.tsx +++ b/apps/expo/src/components/tasks.tsx @@ -3,9 +3,9 @@ import { Button, FlatList, Text, TouchableOpacity, View } from "react-native"; import { useAtom } from "jotai"; import { FileCheck, FileText, FileX } from "lucide-react-native"; +import { patientIdAtom } from "~/app"; import { api } from "~/utils/api"; import { formatDateTime } from "~/utils/dates"; -import { patientIdAtom } from "./forms/welcome-form"; export default function Tasks() { const [patientId] = useAtom(patientIdAtom); diff --git a/apps/expo/src/components/ui/cards/alert-card.tsx b/apps/expo/src/components/ui/cards/alert-card.tsx index 7ce75ceb..6b5f1dee 100644 --- a/apps/expo/src/components/ui/cards/alert-card.tsx +++ b/apps/expo/src/components/ui/cards/alert-card.tsx @@ -1,7 +1,8 @@ import { Text, TouchableOpacity, View } from "react-native"; -import { clsx } from "clsx"; import { ChevronRight } from "lucide-react-native"; +import { cn } from "~/components/ui/rn-ui/lib/utils"; + export default function AlertCard({ title, preview, @@ -18,7 +19,7 @@ export default function AlertCard({ return ( ( ({ value, onValueChange, label, errorMessage, className }, ref) => { return ( - + ( onPress={showDatePicker} className={cn( "h-12 flex-row items-center justify-between rounded-xl border bg-white px-3", - errorMessage ? "border-red-500" : "border-gray-200", + errorMessage ? "border-gray-200" : "border-gray-200", className, )} > diff --git a/apps/expo/src/components/ui/forms/dropdown.tsx b/apps/expo/src/components/ui/forms/dropdown.tsx index f5e03252..8077882a 100644 --- a/apps/expo/src/components/ui/forms/dropdown.tsx +++ b/apps/expo/src/components/ui/forms/dropdown.tsx @@ -2,9 +2,10 @@ import React from "react"; import { Text, View } from "react-native"; import RNPickerSelect from "react-native-picker-select"; import type { PickerSelectProps } from "react-native-picker-select"; -import clsx from "clsx"; import { ChevronDown } from "lucide-react-native"; +import { cn } from "~/components/ui/rn-ui/lib/utils"; + interface Props extends PickerSelectProps { label?: string; className?: string; @@ -15,7 +16,7 @@ interface Props extends PickerSelectProps { const Dropdown = React.forwardRef( ({ label, className, items, errorMessage, ...props }, ref) => { return ( - + {label && ( {label} diff --git a/apps/expo/src/components/ui/health-record/condition-item.tsx b/apps/expo/src/components/ui/health-record/condition-item.tsx index 13e8da4d..1bdb4602 100644 --- a/apps/expo/src/components/ui/health-record/condition-item.tsx +++ b/apps/expo/src/components/ui/health-record/condition-item.tsx @@ -1,5 +1,6 @@ import { Text, View } from "react-native"; -import { clsx } from "clsx"; + +import { cn } from "~/components/ui/rn-ui/lib/utils"; export default function ConditionItem({ condition, @@ -18,7 +19,7 @@ export default function ConditionItem({ }) { return ( { - console.log(data, "data"); - // Invalidate the query cache await queryClient.invalidateQueries(); }, - onError: (error) => { - console.log(error, "error"); - console.log(JSON.stringify(error)); - Alert.alert("Warning", JSON.stringify(error)); - }, }); function mapPractitionerIdsToNames(careTeamData: CareTeamBundle) { diff --git a/apps/expo/src/utils/session-store.ts b/apps/expo/src/utils/session-store.ts index 1dc874ed..027986ee 100644 --- a/apps/expo/src/utils/session-store.ts +++ b/apps/expo/src/utils/session-store.ts @@ -4,10 +4,3 @@ const key = "session_token"; export const getToken = () => SecureStore.getItemAsync(key); export const deleteToken = () => SecureStore.deleteItemAsync(key); export const setToken = (v: string) => SecureStore.setItemAsync(key, v); - -// store patientId -const patientIdKey = "patient_id"; -export const getPatientId = () => SecureStore.getItemAsync(patientIdKey); -export const deletePatientId = () => SecureStore.deleteItemAsync(patientIdKey); -export const setPatientId = (v: string) => - SecureStore.setItemAsync(patientIdKey, v); diff --git a/apps/nextjs/src/app/(authenticated)/onboarding/_components/allergies-form.tsx b/apps/nextjs/src/app/(authenticated)/onboarding/_components/allergies-form.tsx index b3bfc9f9..3b28578d 100644 --- a/apps/nextjs/src/app/(authenticated)/onboarding/_components/allergies-form.tsx +++ b/apps/nextjs/src/app/(authenticated)/onboarding/_components/allergies-form.tsx @@ -138,8 +138,6 @@ export function AllergiesForm(props: { onSuccess?: () => void }) { ], }; - console.log(JSON.stringify(requestBody), "requestBody"); - // Submit each allergy intolerance entry mutation.mutate( { body: requestBody }, diff --git a/apps/nextjs/src/app/(authenticated)/onboarding/_components/conditions-form.tsx b/apps/nextjs/src/app/(authenticated)/onboarding/_components/conditions-form.tsx index 09dad9a3..bfdc0eb6 100644 --- a/apps/nextjs/src/app/(authenticated)/onboarding/_components/conditions-form.tsx +++ b/apps/nextjs/src/app/(authenticated)/onboarding/_components/conditions-form.tsx @@ -131,7 +131,6 @@ export function ConditionsForm(props: { onSuccess?: () => void }) { }; // Submit each medication statement entry - // console.log(requestBody); mutation.mutate( { body: requestBody }, { diff --git a/packages/api/src/router/patient.ts b/packages/api/src/router/patient.ts index adafe249..dcb0afb6 100644 --- a/packages/api/src/router/patient.ts +++ b/packages/api/src/router/patient.ts @@ -61,7 +61,7 @@ export const patientRouter = createTRPCRouter({ const { canvasToken } = ctx; const { body } = input; - // using fetch directly because it is the only procedure that returns a Location header. otherwise will refactor canvas-api.ts to return responseBody, headers, status, and ok. + // using fetch directly because it is the only procedure that needs to return a Location header. otherwise will refactor canvas-api.ts to return responseBody, headers, status, and ok. // Setup headers for the fetch call const headers = {