diff --git a/src/components/AppView/AppView.js b/src/components/AppView/AppView.js
index a00abbe..9ba85ef 100644
--- a/src/components/AppView/AppView.js
+++ b/src/components/AppView/AppView.js
@@ -16,14 +16,18 @@ export default function AppView({ setDarkMode }){
const [queues, setQueues] = useState([]);
const [items, setItems] = useState([]);
const [selectedQueues, setSelectedQueues] = useState([]);
- const [queueCounts, setQueueCounts] = useState([]);
+ const [queueSelectorOpen, setQueueSelectorOpen] = useState(false);
const access_token = useToken();
useEffect( _ => {
async function getQueues(){
if (access_token === null){
- return
+ return undefined
+ }
+
+ if (queueSelectorOpen){
+ return undefined
}
if (selectedQueues.length > 0){
@@ -45,7 +49,7 @@ export default function AppView({ setDarkMode }){
}
}
getQueues();
- }, [selectedQueues, access_token]);
+ }, [selectedQueues, access_token, queueSelectorOpen]);
useEffect( _ => {
let tempItems = [];
@@ -55,24 +59,6 @@ export default function AppView({ setDarkMode }){
setItems(tempItems);
}, [queues]);
- useEffect( _ => {
- async function getQueueCounts(){
- if (access_token === null){
- return
- }
-
- let myHeaders = new Headers();
- myHeaders.append("Authorization", `Bearer ${access_token}`);
- let requestOptions = { headers: myHeaders };
-
- const apiResponse = await fetch(`/api/get_queues`, requestOptions);
- const queueCountJson = await apiResponse.json();
- setQueueCounts(queueCountJson);
- };
- getQueueCounts();
- return _ => setQueueCounts([]);
- }, [selectedQueues, access_token]);
-
const theme = useTheme();
const transitionWidth = theme.transitions.create(["width"], {
duration: theme.transitions.duration.enteringScreen,
@@ -111,7 +97,12 @@ export default function AppView({ setDarkMode }){
-
+
diff --git a/src/components/QueueSelector/QueueSelector.js b/src/components/QueueSelector/QueueSelector.js
index f4d8c4a..4395d02 100644
--- a/src/components/QueueSelector/QueueSelector.js
+++ b/src/components/QueueSelector/QueueSelector.js
@@ -1,57 +1,124 @@
-import React from "react";
+import React, { useState, useEffect } from "react";
import PropTypes from "prop-types";
-import { TextField, Checkbox} from "@material-ui/core";
+import { TextField, Checkbox, InputAdornment, Box, useTheme } from "@material-ui/core";
import { Autocomplete } from "@material-ui/lab";
import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';
import CheckBoxIcon from '@material-ui/icons/CheckBox';
+import CircularProgress from '@material-ui/core/CircularProgress';
+import { useToken } from "../AuthProvider/";
+
+export default function QueueSelector({ queueSelectorOpen, setQueueSelectorOpen, selectedQueues, setSelectedQueues }) {
+ const open = queueSelectorOpen;
+ const setOpen = setQueueSelectorOpen;
+ const [queueCounts, setQueueCounts] = useState([]);
+ const access_token = useToken();
+ const loading = open && queueCounts.length === 0;
+
+ useEffect( _ => {
+ const getQueueCounts = async _ => {
+ if (access_token === null){
+ return undefined
+ }
+
+ let myHeaders = new Headers();
+ myHeaders.append("Authorization", `Bearer ${access_token}`);
+ let requestOptions = { headers: myHeaders };
+
+ const apiResponse = await fetch(`/api/get_queues`, requestOptions);
+ const queueCountJson = await apiResponse.json();
+ setQueueCounts(queueCountJson);
+ };
+
+ if (loading) {
+ getQueueCounts();
+ }
+
+ }, [loading, access_token]);
+
+ useEffect(() => {
+ if (!open) {
+ setQueueCounts([]);
+ }
+ }, [open]);
+
+ const theme = useTheme();
+
+ const handleChange = (event, newValue) => {
+ setSelectedQueues(newValue)
+ };
+
+ const optionRenderer = (option, { selected }) => (
+ <>
+ }
+ checkedIcon={}
+ style={{ marginRight: 8 }}
+ checked={selected}
+ />
+ {`${option.name} (${option.number_of_items})`}
+ >
+ );
-export default function QueueSelector({ queues, selectedQueues, setSelectedQueues }) {
return(
- {
- setSelectedQueues(newValue)
- }}
- renderInput={(params) => {
- return(
+
+ (
+
+ Active Queues:
+
+ {params.InputProps.startAdornment}
+ >
+ ),
+ endAdornment: (
+ <>
+ {loading ? : null}
+ {params.InputProps.endAdornment}
+ >
+ )
+ }}
/>
- );
- }}
- getOptionLabel={(option) => `${option.name} (${option.number_of_items})`}
- renderOption={(option, { selected }) => (
- <>
- }
- checkedIcon={}
- style={{ marginRight: 8 }}
- checked={selected}
- />
- {`${option.name} (${option.number_of_items})`}
- >
- )}
- getOptionSelected={ (option, value) => option.name === value.name }
- disableCloseOnSelect
- autoComplete
- disableListWrap
- openOnFocus
- fullWidth
- multiple
- />
+ )}
+
+ options={queueCounts}
+ value={selectedQueues}
+ onChange={handleChange}
+ getOptionLabel={(option) => `${option.name} (${option.number_of_items})`}
+ renderOption={optionRenderer}
+ getOptionSelected={ (option, value) => option.name === value.name }
+ size="small"
+ open={open}
+ onOpen={_ => setOpen(true)}
+ onClose={_ => setOpen(false)}
+ loading={true}
+ disableCloseOnSelect
+ disableListWrap
+ fullWidth
+ multiple
+ autoHighlight
+ />
+
);
};
QueueSelector.propTypes = {
- /** An array of objects with keys of name and number of items for each queue. */
- "queues": PropTypes.array,
+ /** State variable to manage open status. */
+ "queueSelectorOpen": PropTypes.bool.isRequired,
+ /** Function to update state variable that manages open status. */
+ "setQueueSelectorOpen": PropTypes.func.isRequired,
/** State variable to manage selected queues. */
"selectedQueues": PropTypes.array.isRequired,
/** Function to update state variable that manages selected queues. */
- "setSelectedQueues": PropTypes.func.isRequired
-};
-
-QueueSelector.defaultProps = {
- "queues": []
+ "setSelectedQueues": PropTypes.func.isRequired,
};
\ No newline at end of file