diff --git a/src/components/AppView/AppView.js b/src/components/AppView/AppView.js index bd31b21..acc139a 100644 --- a/src/components/AppView/AppView.js +++ b/src/components/AppView/AppView.js @@ -1,6 +1,6 @@ import React, { useState, useEffect } from "react"; import PropTypes from "prop-types"; -import { Box, makeStyles, Paper, useTheme } from "@material-ui/core"; +import { Box, makeStyles, Paper, Typography, useTheme } from "@material-ui/core"; import { Route } from "react-router-dom"; import clsx from "clsx"; import ItemTableAppBar from "../ItemTableAppBar/"; @@ -9,8 +9,9 @@ import ItemViewAppBar from "../ItemViewAppBar/"; import ItemView from "../ItemView/"; import QueueSelector from "../QueueSelector/"; import { useToken } from "../AuthProvider/"; +import ErrorOutlineIcon from '@material-ui/icons/ErrorOutline'; -export default function AppView({ setDarkMode }){ +export default function AppView({ setDarkMode }) { // Create stateful variables. const [sidebarOpen, setSidebarOpen] = useState(false); const [queues, setQueues] = useState([]); @@ -18,21 +19,23 @@ export default function AppView({ setDarkMode }){ const [selectedQueues, setSelectedQueues] = useState([]); const [queueSelectorOpen, setQueueSelectorOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(false) + const [errorResponse, setErrorResponse] = useState({ code: "", description: "", message: "" }) const access_token = useToken(); // Get Queues from API. - useEffect( _ => { - (async function getQueues(){ - if (access_token === null){ + useEffect(_ => { + (async function getQueues() { + if (access_token === null) { return undefined; } - if (queueSelectorOpen){ + if (queueSelectorOpen) { return undefined; } - if (selectedQueues.length === 0){ + if (selectedQueues.length === 0) { setQueues([]) return undefined; } @@ -40,33 +43,45 @@ export default function AppView({ setDarkMode }){ setIsLoading(true); let queuesToLoad = ""; - if (selectedQueues.length === 1){ + if (selectedQueues.length === 1) { queuesToLoad = selectedQueues[0].name; } else { - selectedQueues.forEach( (queue, index) => ( + selectedQueues.forEach((queue, index) => ( index === 0 ? queuesToLoad += queue.name : queuesToLoad += `+${queue.name}` )); - } + } let myHeaders = new Headers(); myHeaders.append("Authorization", `Bearer ${access_token}`); let requestOptions = { headers: myHeaders }; const apiResponse = await fetch(`${process.env.PUBLIC_URL}/api/data/${queuesToLoad}`, requestOptions); - const queueJson = await apiResponse.json(); + if (!apiResponse.ok) { + console.error(`Fetching queues failed. Got code ${apiResponse.status} (${apiResponse.statusText})`); + const errorMessageJSON = await apiResponse.json(); + setErrorResponse({ + code: apiResponse.status, + description: apiResponse.statusText, + message: errorMessageJSON.message ? errorMessageJSON.message : "" + }) + setError(true); + return undefined; + } + + const queueJson = await apiResponse.json(); setQueues(queueJson); setIsLoading(false) })(); }, [selectedQueues, access_token, queueSelectorOpen]); // Populate items array. - useEffect( _ => { + useEffect(_ => { let tempItems = []; - for (let queue of queues){ + for (let queue of queues) { tempItems = tempItems.concat(queue.items); } setItems(tempItems); @@ -102,20 +117,47 @@ export default function AppView({ setDarkMode }){ width: "40vw", } }, + errorContainer: { + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + marginTop: theme.spacing(6) + }, + errorIcon: { + fontSize: "10rem" + } }); const classes = useStyles(); - return( + const ErrorMessage = _ => { + return ( + + + + {`${errorResponse.message}`} + + + {`Error Code: ${errorResponse.code} (${errorResponse.description})`} + + + ); + } + + return ( - - + { error + ? + : + } {items.length === 0 ? null : @@ -123,13 +165,13 @@ export default function AppView({ setDarkMode }){ path="/:queue/:number" render={({ match }) => ( <> - - )} diff --git a/src/components/ItemTable/ItemTable.js b/src/components/ItemTable/ItemTable.js index e124b19..399afb7 100644 --- a/src/components/ItemTable/ItemTable.js +++ b/src/components/ItemTable/ItemTable.js @@ -68,7 +68,7 @@ export default function ItemTable({ data, rowCanBeSelected, loading }) { { Header: 'Last Updated', accessor: 'last_updated', sortInverted: true }, { Header: 'Department', accessor: 'department' }, { Header: 'Building', accessor: 'building' }, - { Header: 'Date Received', accessor: 'date_received', sortInverted: true , + { Header: 'Date Received', accessor: 'date_received', sortInverted: true , } ], []); const tableInstance = useTable( {