import { router } from "expo-router"; import { useMemo, useState } from "react"; import { Alert, ScrollView, View } from "react-native"; import { RxImagePager, RxStatusStepper } from "@/components/prescription"; import { Badge } from "@/components/ui/Badge"; import { Button } from "@/components/ui/Button"; import { Card } from "@/components/ui/Card"; import { Chip } from "@/components/ui/Chip"; import { Field } from "@/components/ui/Field"; import { AppHeader } from "@/components/ui/Header"; import { Screen } from "@/components/ui/Screen"; import { Text } from "@/components/ui/Text"; import { products } from "@/lib/data/products"; import { routes } from "@/lib/routes"; import { useAuthStore } from "@/lib/stores/authStore"; import { useCartStore } from "@/lib/stores/cartStore"; import { useFamilyStore } from "@/lib/stores/familyStore"; import { useLocationStore } from "@/lib/stores/locationStore"; import { useNotificationStore } from "@/lib/stores/notificationStore"; import { usePrescriptionStore } from "@/lib/stores/prescriptionStore"; import { colors, gutter } from "@/lib/theme"; function matchStatus(name: string): "ready" | "review" | "unavailable" { const hit = products.find((p) => p.name.toLowerCase().includes(name.trim().toLowerCase()) ); if (!hit) return "review"; if (!hit.inStock) return "unavailable"; return "ready"; } export default function RxReviewScreen() { const draftImages = usePrescriptionStore((s) => s.draftImages); const setDraftImages = usePrescriptionStore((s) => s.setDraftImages); const addPrescription = usePrescriptionStore((s) => s.addPrescription); const addProduct = useCartStore((s) => s.addProduct); const setFulfillment = useLocationStore((s) => s.setFulfillment); const pushNotification = useNotificationStore((s) => s.push); const user = useAuthStore((s) => s.user); const members = useFamilyStore((s) => s.members); const activeMemberId = useFamilyStore((s) => s.activeMemberId); const activeMember = members.find((m) => m.id === activeMemberId); const [patientName, setPatientName] = useState( activeMember?.name || user?.name || "" ); const [memberId, setMemberId] = useState(activeMemberId); const [medicineName, setMedicineName] = useState("Metformin 500mg"); const [daysSupply, setDaysSupply] = useState("30"); const [list, setList] = useState("Metformin 500mg, Vitamin B12"); const [notes, setNotes] = useState(""); const medicines = useMemo(() => { return list .split(",") .map((s) => s.trim()) .filter(Boolean) .map((name) => ({ name, status: matchStatus(name) })); }, [list]); const save = (toCart: boolean) => { if (!draftImages.length) { Alert.alert("Image required", "Scan or upload at least one prescription photo first."); return; } if (!patientName.trim() || !medicineName.trim()) { Alert.alert("Missing", "Patient and primary medicine are required."); return; } const meds = medicines.length > 0 ? medicines : [{ name: medicineName, status: matchStatus(medicineName) }]; const rx = addPrescription({ patientName: patientName.trim(), memberId, medicineName: medicineName.trim(), medicines: meds, imageUris: draftImages, daysSupply: Number(daysSupply) || 30, lastFilledAt: null, notes: notes.trim(), }); if (toCart) { meds .filter((m) => m.status === "ready") .forEach((m) => { const p = products.find((x) => x.name.toLowerCase().includes(m.name.toLowerCase().split(" ")[0]) ); if (p) addProduct(p); }); setFulfillment("pickup"); } setDraftImages([]); pushNotification({ kind: "rx", title: "Prescription submitted", body: "A pharmacist will review your script shortly.", href: routes.rxDetail(rx.id), }); Alert.alert("Submitted", "Your prescription is under review.", [ { text: "Track status", onPress: () => router.replace(routes.rxDetail(rx.id)) }, { text: "Reminders", onPress: () => router.replace(routes.rxCalendar(rx.id)) }, ...(toCart ? [{ text: "Cart", onPress: () => router.replace(routes.cart) }] : [{ text: "List", onPress: () => router.replace(routes.rxList) }]), ]); }; return ( After submit Prescription pages ({draftImages.length}) {draftImages.length ? ( { Alert.alert("Remove page?", `Page ${index + 1}`, [ { text: "Cancel", style: "cancel" }, { text: "Remove", style: "destructive", onPress: () => setDraftImages(draftImages.filter((_, i) => i !== index)), }, ]); }} /> ) : ( <> Go back to scan or upload a prescription photo.