From 0f32e53e8548e394ce7e0b8c222fa12c524ef654 Mon Sep 17 00:00:00 2001 From: Philip Ye <97428041+philipye314@users.noreply.github.com> Date: Wed, 8 Nov 2023 23:33:32 -0800 Subject: [PATCH] thank you suahard --- .../Cases/QRCodeScanner/AddCase/index.tsx | 35 ++++++++++++-- .../Cases/QRCodeScanner/index.tsx | 48 ++++++++++--------- src/supabase/createClient.ts | 9 ++-- src/supabase/queries/cases.ts | 10 +++- 4 files changed, 70 insertions(+), 32 deletions(-) diff --git a/src/app/(BottomTabNavigation)/Cases/QRCodeScanner/AddCase/index.tsx b/src/app/(BottomTabNavigation)/Cases/QRCodeScanner/AddCase/index.tsx index a092c057..be59d05c 100644 --- a/src/app/(BottomTabNavigation)/Cases/QRCodeScanner/AddCase/index.tsx +++ b/src/app/(BottomTabNavigation)/Cases/QRCodeScanner/AddCase/index.tsx @@ -1,22 +1,47 @@ import { useLocalSearchParams, useRouter } from 'expo-router'; +import { useEffect, useState } from 'react'; import { Image, Text, TouchableOpacity, View } from 'react-native'; -import { uploadCase } from '../../../../../supabase/queries/cases'; -import { CaseUid } from '../../../../../types/types'; + import styles from './styles'; +import { + containsDuplicateCase, + uploadCase, +} from '../../../../../supabase/queries/cases'; +import { CaseUid } from '../../../../../types/types'; function AddCase() { - const { id, title, summary, image } = useLocalSearchParams<{ + const { id, title, image, summary } = useLocalSearchParams() as { id: CaseUid; title: string; - summary: string; image: string; - }>(); + summary: string; + }; const router = useRouter(); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const validateCaseUniqueness = async () => { + const duplicate = await containsDuplicateCase(id); + if (duplicate) { + console.log('DUPLICATES NOT ALLOWED!'); + router.back(); + } + }; + validateCaseUniqueness(); + setLoading(false); + }, []); const addToCases = async () => { uploadCase(id); router.push('/Cases'); }; + if (loading) { + return ( + + LOADING... LOL + + ); + } return ( {title} diff --git a/src/app/(BottomTabNavigation)/Cases/QRCodeScanner/index.tsx b/src/app/(BottomTabNavigation)/Cases/QRCodeScanner/index.tsx index b4edbe0d..62eac3fe 100644 --- a/src/app/(BottomTabNavigation)/Cases/QRCodeScanner/index.tsx +++ b/src/app/(BottomTabNavigation)/Cases/QRCodeScanner/index.tsx @@ -1,13 +1,10 @@ import { BarCodeScanner, BarCodeScannerResult } from 'expo-barcode-scanner'; -import { router } from 'expo-router'; +import { router, useNavigation } from 'expo-router'; import React, { useEffect, useState } from 'react'; import { Text, TouchableOpacity, View } from 'react-native'; -import supabase from '../../../../supabase/createClient'; -import { - containsDuplicateCase, - getCaseById, -} from '../../../../supabase/queries/cases'; + import styles from './styles'; +import { getCaseById, isValidCase } from '../../../../supabase/queries/cases'; enum permissions { UNDETERMINED, @@ -17,8 +14,15 @@ enum permissions { function QRCodeScannerScreen() { const [hasPermission, setHasPermission] = useState(permissions.UNDETERMINED); - const [message, setMessage] = useState(''); - const [scanned, setScanned] = useState(false); + const [scanned, setScanned] = useState(false); + const navigation = useNavigation(); + + useEffect(() => { + const unsubscribe = navigation.addListener('blur', async () => { + setScanned(false); + }); + return unsubscribe; + }, [navigation]); useEffect(() => { const getBarCodeScannerPermissions = async () => { @@ -30,23 +34,22 @@ function QRCodeScannerScreen() { getBarCodeScannerPermissions(); }, []); - const isValidBarcode = (caseId: string) => true; - const handleBarCodeScanned = async (result: BarCodeScannerResult) => { const caseId = result.data; - if (isValidBarcode(caseId)) { - const { id, title, summary, image } = await getCaseById(caseId); - const duplicate = await containsDuplicateCase(id); - if (duplicate) { - console.log('YOU ALREADY HAVE THIS CASE!'); - } else { - router.push({ - pathname: '/Cases/QRCodeScanner/AddCase', - params: { id, title, summary, image }, - }); + if (!scanned) { + setScanned(true); + const valid = await isValidCase(caseId); + if (!valid) { + // TODO: Display error toast message + return; } - } else { - setMessage('INVALID QR CODE!'); + const data = await getCaseById(caseId); + + const { id, title, image, summary } = data; + router.push({ + pathname: '/Cases/QRCodeScanner/AddCase', + params: { id, title, image, summary }, + }); } }; @@ -61,7 +64,6 @@ function QRCodeScannerScreen() { onBarCodeScanned={handleBarCodeScanned} style={[styles.scanner]} /> - Current Scanning: {message} router.back()} style={styles.button}> Go Back diff --git a/src/supabase/createClient.ts b/src/supabase/createClient.ts index 8b5bf219..c9e0158a 100644 --- a/src/supabase/createClient.ts +++ b/src/supabase/createClient.ts @@ -2,12 +2,15 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; import { createClient } from '@supabase/supabase-js'; import 'react-native-url-polyfill/auto'; -if (!process.env.SUPABASE_URL || !process.env.SUPABASE_ANON_KEY) { +if ( + !process.env.EXPO_PUBLIC_SUPABASE_URL || + !process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY +) { throw new Error('Supabase environment variables are not defined.'); } const supabase = createClient( - process.env.SUPABASE_URL, - process.env.SUPABASE_ANON_KEY, + process.env.EXPO_PUBLIC_SUPABASE_URL, + process.env.EXPO_PUBLIC_SUPABASE_ANON_KEY, { auth: { storage: AsyncStorage, diff --git a/src/supabase/queries/cases.ts b/src/supabase/queries/cases.ts index 82a93d1f..78c6aa0e 100644 --- a/src/supabase/queries/cases.ts +++ b/src/supabase/queries/cases.ts @@ -44,6 +44,14 @@ export async function getCaseById(caseId: CaseUid): Promise { } } +export async function isValidCase(caseId: CaseUid): Promise { + const { data } = await supabase.from('cases').select().eq('caseId', caseId); + if (!data) { + return false; + } + return data.length !== 0; +} + /** * Fetch an array of Case objects contained in an array of `CaseId`s. Fetches cases from `cases` table. * @@ -93,7 +101,7 @@ export async function containsDuplicateCase(caseId: CaseUid) { .select() .eq('userId', userId) .eq('caseId', caseId); - return data?.length === 0; + return data?.length !== 0; } catch (error) { throw error; }