diff --git a/src/App.js b/src/App.js index 05f10dd..1946186 100644 --- a/src/App.js +++ b/src/App.js @@ -7,6 +7,7 @@ import Success from './screens/SuccessScreen'; import './App.css'; import Verify from './screens/VerifyScreen'; import Scanner from './screens/ScannerScreen'; +import Lockout from './screens/LockoutScreen'; function App() { return ( @@ -25,6 +26,9 @@ function App() { + + + diff --git a/src/app/store.js b/src/app/store.js index 1457d32..0220126 100644 --- a/src/app/store.js +++ b/src/app/store.js @@ -1,8 +1,10 @@ import { configureStore } from '@reduxjs/toolkit'; import authSlice from '../features/auth/authSlice'; +import covidSlice from '../features/auth/covidSlice'; export const store = configureStore({ reducer: { auth: authSlice, + covid: covidSlice, }, }); diff --git a/src/features/auth/covidSlice.js b/src/features/auth/covidSlice.js new file mode 100644 index 0000000..14691c8 --- /dev/null +++ b/src/features/auth/covidSlice.js @@ -0,0 +1,25 @@ +import { createSlice } from '@reduxjs/toolkit'; +import Cookies from 'js-cookie'; + +const initialState = { + isCovidPositive: Cookies.get('covidPositive') === 'true' ? true : false, +}; + +export const covidSlice = createSlice({ + name: 'covid', + initialState, + reducers: { + setCovidPositive: state => { + state.isCovidPositive = true; + Cookies.set('covidPositive', true); + }, + setCovidNegative: state => { + state.isCovidPositive = false; + Cookies.set('covidPositive', false); + } + }, +}); + +export const { setCovidPositive, setCovidNegative } = covidSlice.actions; + +export default covidSlice.reducer; diff --git a/src/screens/HomeScreen.js b/src/screens/HomeScreen.js index 1d19593..30d948c 100644 --- a/src/screens/HomeScreen.js +++ b/src/screens/HomeScreen.js @@ -1,4 +1,10 @@ import { + AlertDialog, + AlertDialogBody, + AlertDialogContent, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogOverlay, Button, Divider, Flex, @@ -6,12 +12,14 @@ import { Link, Spinner, Text, + useToast, } from '@chakra-ui/react'; import axios from 'axios'; -import { Fragment, React, useEffect, useState } from 'react'; +import { Fragment, React, useEffect, useRef, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { Redirect, useHistory } from 'react-router-dom'; import { authLogout } from '../features/auth/authSlice'; +import { setCovidPositive } from '../features/auth/covidSlice'; function QRCode() { const [url, setURL] = useState(null); @@ -41,6 +49,92 @@ function QRCode() { } } +function ConfirmCOVIDPositiveAlertDialog() { + + const [isOpen, setOpen] = useState(false); + const toast = useToast(); + const history = useHistory(); + const dispatch = useDispatch(); + const onClose = () => { setOpen(false) } + const showErrorToast = (errorMessage = "An error has occured.") => { + toast.closeAll(); + toast({ + title: 'Error!', + description: errorMessage, + status: 'error', + duration: 5000 + }); + } + const onConfirm = () => { + toast({ + title: 'Confirming', + description: 'Hold on while we confirm with our servers.', + status: 'info', + duration: 10000 + }); + axios.post(`${process.env.REACT_APP_API_URL}/covid`,{ + setPositive: true, + },{withCredentials:true}) + .then(res => { + if(res.data.covidPositive){ + dispatch(setCovidPositive()); + toast({ + title: "Confirmed!", + status: 'info', + duration: 500, + }); + }else{ + showErrorToast(); + } + }) + .catch(err => { + console.log(err); + try{ + if(err.response.status === 401){ + showErrorToast("You are not logged in!"); + history.push("/login"); + }else{ + showErrorToast(); + } + }catch(e){ + showErrorToast(); + } + }); + setOpen(false); + } + const cancelRef = useRef(); + + return ( + <> + + + + + + Confirm Tested COVID19 Positive + + + Please confirm that you have been tested POSITIVE with + COVID19. Upon confirmation, this app will inform the people + you have come in contact with in the last 7 days. + + + + + + + + + + ); +} + function Home() { const history = useHistory(); const dispatch = useDispatch(); @@ -51,7 +145,9 @@ function Home() { }; const isAuthenticated = useSelector(state => state.auth.isAuthenticated); + const isCovidPositive = useSelector(state => state.covid.isCovidPositive); if (!isAuthenticated) return ; + if (isCovidPositive) return ; return ( )} - diff --git a/src/screens/LockoutScreen.js b/src/screens/LockoutScreen.js new file mode 100644 index 0000000..30e6013 --- /dev/null +++ b/src/screens/LockoutScreen.js @@ -0,0 +1,52 @@ +import { Flex, Heading, Text } from "@chakra-ui/react"; +import axios from "axios"; +import { useEffect } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { Redirect } from "react-router-dom"; +import { setCovidPositive } from "../features/auth/covidSlice"; + +function Lockout(){ + const isAuthenticated = useSelector(state => state.auth.isAuthenticated); + const isCovidPositive = useSelector(state => state.covid.isCovidPositive); + const dispatch = useDispatch(); + + useEffect( ()=>{ + + axios.post(`${process.env.REACT_APP_API_URL}/covid`,{},{withCredentials:true}) + .then(res=>{ + if(res.body.positivity){ + dispatch(setCovidPositive()); + } + }) + .catch(err=>{ + + }); + + }, [dispatch]); + + if (!isAuthenticated) return ; + if (!isCovidPositive) return ; + + return ( + + + Lockout + + You have reported that you have been tested POSITIVE with COVID19. + This lockout is to remind you to quarantine yourself according to local + COVID19 health policies. This lockout will automatically be lifted after + 14 days. +

+ Please avoid contact with other people for the duration of this lockout! +
+
+
+ ); +} + +export default Lockout; \ No newline at end of file