frontend/app/DeliverableItem/EmbeddableDMForm.tsx (204 lines of code) (raw):
import React, { useEffect, useState } from "react";
import {
Button,
Dialog,
DialogActions,
DialogContent,
DialogContentText,
DialogTitle,
Grid,
IconButton,
Paper,
Tooltip,
Typography,
} from "@material-ui/core";
import clsx from "clsx";
import { Add, DeleteOutline, Edit } from "@material-ui/icons";
import dailymotionEnabled from "../static/dailymotion_enabled.jpg";
import dailymotionDisabled from "../static/dailymotion_disabled.jpg";
import { useStyles } from "./DeliverableItemStyles";
import { EmbeddableFormProps } from "./EmbeddableForm";
import {
createDailymotionDeliverable,
deleteDailymotionDeliverable,
updateDailymotionDeliverable,
} from "../utils/master-api-service";
import {
SystemNotifcationKind,
SystemNotification,
} from "@guardian/pluto-headers";
import DeleteIcon from "@material-ui/icons/Delete";
import DailyMotionMasterForm from "../Master/DailyMotionMasterForm";
const EmbeddableDMForm: React.FC<EmbeddableFormProps<
DailymotionMaster,
YoutubeMaster
>> = (props) => {
const classes = useStyles();
const [isEditing, setIsEditing] = useState(false);
const [formDirty, setFormDirty] = useState(false);
const [showingForm, setShowingForm] = useState(false);
const [didJustCreate, setDidJustCreate] = useState(false);
const [requestDeleteActive, setRequestDeleteActive] = useState(false);
useEffect(() => {
if (props.content) {
setShowingForm(true);
} else {
setShowingForm(false);
}
setDidJustCreate(false);
}, [props.content]);
const emptyRecord: DailymotionMaster = {
daily_motion_category: "",
daily_motion_contains_adult_content: false,
daily_motion_description: "",
daily_motion_no_mobile_access: false,
daily_motion_tags: [],
daily_motion_title: "",
daily_motion_url: "",
publication_date: "",
upload_status: "",
};
const saveRequested = async (update: DailymotionMaster) => {
try {
const newMaster = didJustCreate
? await createDailymotionDeliverable(
props.bundleId.toString(),
props.deliverableId.toString(),
update
)
: await updateDailymotionDeliverable(
props.bundleId.toString(),
props.deliverableId.toString(),
update
);
setIsEditing(false);
setFormDirty(false);
if (props.didUpdate) props.didUpdate(newMaster);
} catch (err) {
console.error("Could not save update to dailymotion metadata: ", err);
SystemNotification.open(SystemNotifcationKind.Error, err.toString());
}
};
return (
<>
<Paper elevation={3} className={classes.basicMetadataBox}>
<Grid container justifyContent="space-between">
<Grid item>
<Typography variant="h6">
<img
className={clsx(classes.inlineIcon, classes.sizedIcon)}
src={props.content ? dailymotionEnabled : dailymotionDisabled}
/>
Daily Motion
</Typography>
</Grid>
<Grid item>
{showingForm ? (
<Tooltip title="Permanently remove the daily motion metadata from this deliverable">
<IconButton
onClick={() => setRequestDeleteActive(true)}
disabled={isEditing}
>
<DeleteOutline />
</IconButton>
</Tooltip>
) : undefined}
<Tooltip title="Change the daily motion metadata displayed here">
<IconButton
onClick={() => {
if (!props.content) {
setDidJustCreate(true);
}
setShowingForm(true);
setIsEditing(true);
}}
disabled={isEditing}
>
{props.content ? <Edit /> : <Add />}
</IconButton>
</Tooltip>
</Grid>
</Grid>
{showingForm ? (
<DailyMotionMasterForm
isEditing={isEditing}
master={props.content ?? emptyRecord}
isReadOnly={false}
isDirty={formDirty}
saveRequested={saveRequested}
copySource={props.copySource}
editCancelled={() => {
if (didJustCreate) {
setDidJustCreate(false);
setShowingForm(false);
}
setIsEditing(false);
}}
/>
) : (
<Typography variant="caption">
No Daily Motion data available for this item
</Typography>
)}
</Paper>
{requestDeleteActive ? (
<Dialog
open={requestDeleteActive}
onClose={() => setRequestDeleteActive(false)}
aria-labelledby="alert-dialog-title"
aria-describedby="alert-dialog-description"
>
<DialogTitle id="alert-dialog-title">
Remove Daily Motion metadata
</DialogTitle>
<DialogContent>
<DialogContentText id="alert-dialog-description">
Are you sure you want to remove the Daily Motion metadata from
this deliverable? There is no undo.
</DialogContentText>
</DialogContent>
<DialogActions>
<Button
variant="contained"
color="secondary"
startIcon={<DeleteIcon />}
onClick={() => {
setRequestDeleteActive(false);
deleteDailymotionDeliverable(
props.bundleId.toString(),
props.deliverableId.toString()
)
.then(() => {
SystemNotification.open(
SystemNotifcationKind.Info,
"Removed Daily Motion metadata"
);
props.didUpdate(undefined);
})
.catch((err) => {
console.error(
"Could not delete dailymotion metadata: ",
err
);
SystemNotification.open(
SystemNotifcationKind.Error,
err.toString()
);
});
}}
>
Delete
</Button>
<Button
variant="contained"
onClick={() => setRequestDeleteActive(false)}
>
Cancel
</Button>
</DialogActions>
</Dialog>
) : undefined}
</>
);
};
export default EmbeddableDMForm;