frontend/app/searchnbrowse/NewVaultSelector.tsx (68 lines of code) (raw):

import React, { useState, useEffect } from "react"; import { authenticatedFetch } from "../auth"; import { makeStyles, MenuItem, Select } from "@material-ui/core"; interface VaultSelectorProps { currentvault: string; vaultWasChanged: (newVault: string) => void; } const useStyles = makeStyles({ vaultSelectorDropdown: { width: "70%", }, }); const VaultSelector: React.FC<VaultSelectorProps> = (props) => { const [loading, setLoading] = useState<boolean>(false); const [lastError, setLastError] = useState<string | undefined>(undefined); const [knownVaults, setKnownVaults] = useState<Array<VaultDescription>>([]); const styles = useStyles(); const refresh = async () => { const response = await authenticatedFetch("/api/vault", {}); switch (response.status) { case 200: const content = (await response.json()) as Array<VaultDescription>; if (Array.isArray(content)) { const reversed = content.reverse(); //this.setState({loading: false, lastError: null, knownVaults: reversed}); setLoading(false); setLastError(undefined); setKnownVaults(reversed); if (props.currentvault === "") props.vaultWasChanged(reversed[0].vaultId); } else { console.error( "Expected server response to be an array, got ", content ); setLastError("Could not understand server response"); setLoading(false); } break; default: const errorContent = await response.text(); console.error(errorContent); setLoading(false); setLastError(`Server error ${response.status}`); break; } }; useEffect(() => { refresh(); }, []); return lastError ? ( <p className="error">{lastError}</p> ) : ( <> <label htmlFor="vaultsDropdown">Select vault: </label> <Select labelId="vaults-dropdown-label" id="vaultsDropdown" className={styles.vaultSelectorDropdown} value={props.currentvault} onChange={(evt) => props.vaultWasChanged(evt.target.value as string)} > {knownVaults.map((entry, idx) => ( <MenuItem value={entry.vaultId} key={idx}> {entry.name} </MenuItem> ))} </Select> </> ); }; export default VaultSelector;