frontend/app/WorkingGroups/WorkingGroup.tsx (159 lines of code) (raw):

import React, { useEffect, useState } from "react"; import { RouteComponentProps } from "react-router-dom"; import { TextField, Paper, Button, Typography, Checkbox, FormControlLabel, Dialog, DialogActions, DialogContent, DialogContentText, } from "@material-ui/core"; import { createWorkingGroup, getWorkingGroup, updateWorkingGroup, } from "./helpers"; import { SystemNotification, SystemNotifcationKind, } from "@guardian/pluto-headers"; import { useGuardianStyles } from "~/misc/utils"; interface WorkingGroupStateTypes { itemid?: string; } type WorkingGroupProps = RouteComponentProps<WorkingGroupStateTypes>; const WorkingGroup: React.FC<WorkingGroupProps> = (props) => { const classes = useGuardianStyles(); const [id, setId] = useState<number>(0); const [hide, setHide] = useState<boolean>(false); const [name, setName] = useState<string>(""); const [commissioner, setCommissioner] = useState<string>(""); const [editing, setEditing] = useState<boolean>(false); const [errorDialog, setErrorDialog] = useState<boolean>(false); useEffect(() => { let isMounted = true; if (props.match.params.itemid !== "new") { const setWorkingGroup = async ( itemid: string | undefined ): Promise<void> => { setEditing(true); const id = Number(itemid); try { const workingGroup = await getWorkingGroup(id); if (isMounted) { setId(workingGroup.id); setName(workingGroup.name); setCommissioner(workingGroup.commissioner); setHide(workingGroup.hide); } } catch (error) { if (error.message == "Request failed with status code 404") { setErrorDialog(true); } } }; setWorkingGroup(props.match.params.itemid); } return () => { isMounted = false; }; }, []); const onNameChanged = (event: React.ChangeEvent<HTMLInputElement>): void => { setName(event.target.value); }; const onCommissionerChanged = ( event: React.ChangeEvent<HTMLInputElement> ): void => { setCommissioner(event.target.value); }; const onHideChanged = (event: React.ChangeEvent<HTMLInputElement>): void => { setHide(event.target.checked); }; const onWorkingGroupSubmit = async ( event: React.FormEvent<HTMLFormElement> ): Promise<void> => { event.preventDefault(); if (name && commissioner) { try { if (editing) { await updateWorkingGroup({ id, name, commissioner, hide, }); } else { await createWorkingGroup({ name, commissioner, }); } SystemNotification.open( SystemNotifcationKind.Success, `Successfully ${ editing ? "updated" : "created" } Working Group: "${name}"` ); props.history.push("/working-group"); } catch { SystemNotification.open( SystemNotifcationKind.Error, `Failed to ${editing ? "update" : "create"} Working Group!` ); } } }; const closeDialog = () => { setErrorDialog(false); props.history.goBack(); }; return ( <> <Paper className={classes.root}> <> <Typography variant="h4" gutterBottom> {editing ? "Edit Working Group" : "Create a Working Group"} </Typography> <form onSubmit={onWorkingGroupSubmit}> <TextField label="Name" value={name} autoFocus onChange={onNameChanged} /> <TextField label="Commissioner" value={commissioner} onChange={onCommissionerChanged} /> <FormControlLabel className={classes.hide_control} control={<Checkbox checked={hide} onChange={onHideChanged} />} label="Discontinued" /> <Button type="submit" variant="outlined"> {editing ? "Save" : "Create"} </Button> </form> </> </Paper> <Dialog open={errorDialog} onClose={closeDialog} aria-labelledby="alert-dialog-title" aria-describedby="alert-dialog-description" > <DialogContent> <DialogContentText id="alert-dialog-description"> The requested working group does not exist. </DialogContentText> </DialogContent> <DialogActions> <Button onClick={closeDialog}>Close</Button> </DialogActions> </Dialog> </> ); }; export default WorkingGroup;