frontend/app/searchnbrowse/VaultSelector.jsx (72 lines of code) (raw):
import React from "react";
import PropTypes from "prop-types";
import { authenticatedFetch } from "../auth";
class VaultSelector extends React.Component {
static propTypes = {
currentvault: PropTypes.string.isRequired,
vaultWasChanged: PropTypes.func.isRequired,
};
constructor(props) {
super(props);
this.state = {
loading: false,
lastError: null,
knownVaults: [],
};
}
async refresh() {
const response = await authenticatedFetch("/api/vault");
switch (response.status) {
case 200:
const content = await response.json();
if (Array.isArray(content)) {
const reversed = content.reverse();
this.setState({
loading: false,
lastError: null,
knownVaults: reversed,
});
if (this.props.currentvault === "")
this.props.vaultWasChanged(reversed[0].vaultId);
} else {
console.error(
"Expected server response to be an array, got ",
content
);
this.setState({ lastError: "Could not understand server response" });
}
break;
default:
const errorContent = await response.text();
console.error(errorContent);
this.setState({ lastError: `Server error ${response.status}` });
break;
}
}
componentDidMount() {
this.refresh();
}
render() {
return (
<span className="form-spacing">
{this.state.lastError ? (
<p className="error">{this.state.lastError}</p>
) : (
<>
<label htmlFor="vaultsDropdown">Select vault: </label>
<select
id="vaultsDropdown"
value={this.props.currentvault}
onChange={(evt) => this.props.vaultWasChanged(evt.target.value)}
>
{this.state.knownVaults.map((entry) => (
<option value={entry.vaultId}>{entry.name}</option>
))}
</select>
</>
)}
</span>
);
}
}
export default VaultSelector;