frontend/app/Entry/ReconnectDialog.tsx (101 lines of code) (raw):
import React, {useEffect, useState} from "react";
import {ProxyLocation} from "../types";
import {
Button, CircularProgress,
Dialog,
DialogContent,
DialogTitle,
Divider,
Grid,
makeStyles,
Radio,
Typography
} from "@material-ui/core";
import axios from "axios";
import {formatError} from "../common/ErrorViewComponent";
interface ReconnectDialogProps {
potentialProxies: ProxyLocation[];
itemName: string;
itemId: string;
onDialogClose: (saved:boolean)=>void;
onError?: (err:string)=>void;
}
const useStyles = makeStyles({
mainlist: {
listStyle: "none",
padding: 0
},
selectorText: {
paddingTop: "0.5em"
},
spinner: {width: "26px", height: "26px", display:"inline", marginRight: "0.4em"}
});
const ReconnectDialog:React.FC<ReconnectDialogProps> = (props)=>{
const [selectedProxyId, setSelectedProxyId] = useState<string>(props.potentialProxies.length>0 ? props.potentialProxies[0].proxyId : "");
const [actionMessage, setActionMessage] = useState<string|undefined>(undefined);
const [inProgress, setInProgress] = useState(false);
const classes = useStyles();
const saveSelection = async ()=> {
try {
setInProgress(true);
setActionMessage("Saving...");
await axios.put(`/api/proxy/${encodeURIComponent(selectedProxyId)}/associate?fileId=${encodeURIComponent(props.itemId)}`);
setInProgress(false);
setActionMessage("Proxy associated");
props.onDialogClose(true);
} catch(err) {
setInProgress(false);
setActionMessage(formatError(err, true));
if(props.onError) props.onError(formatError(err, false));
}
}
return <Dialog open={true} onClose={props.onDialogClose} aria-labelledby="reconnect-title">
<DialogTitle id="reconnect-title">
Reconnect {props.itemName}
</DialogTitle>
<DialogContent dividers>
<ul className={classes.mainlist}>
{
props.potentialProxies.map((entry,idx)=><li className={classes.mainlist} key={idx}>
<Grid container direction="row" spacing={3}>
<Grid item>
<Radio
checked={selectedProxyId===entry.proxyId}
onChange={()=>setSelectedProxyId(entry.proxyId)}
/>
</Grid>
<Grid item>
<Typography className={classes.selectorText}>{entry.proxyType}</Typography>
</Grid>
<Grid item>
<Typography className={classes.selectorText}>{entry.bucketName}</Typography>
</Grid>
<Grid item>
<Typography className={classes.selectorText}>{entry.region}</Typography>
</Grid>
<Grid item>
<Typography className={classes.selectorText}>{entry.bucketPath}</Typography>
</Grid>
</Grid>
</li>)
}
</ul>
<Divider/>
<Grid container direction="row" justify="space-between">
<Grid item>
<Button variant="contained" onClick={()=>props.onDialogClose(false)} disabled={inProgress}>Cancel</Button>
</Grid>
<Grid item>
<>
{inProgress ? <CircularProgress className={classes.spinner}/> : null}
{actionMessage ? <Typography>{actionMessage}</Typography>: null}
</>
</Grid>
<Grid item>
<Button variant="contained" onClick={saveSelection} disabled={inProgress}>Link selected</Button>
</Grid>
</Grid>
</DialogContent>
</Dialog>
}
export default ReconnectDialog;