frontend/app/ProjectEntryList/AssetFolderBackupEntry.tsx (67 lines of code) (raw):

import React, { useEffect, useState } from "react"; import { ListItem, ListItemIcon, ListItemText, Typography, } from "@material-ui/core"; import { FileCopy } from "@material-ui/icons"; import { getAssetFolderFileStorageMetadata } from "./helpers"; import { format, parseISO } from "date-fns"; import { DEFAULT_DATE_FORMAT } from "../../types/constants"; import SizeFormatter from "../common/SizeFormatter"; import { useGuardianStyles } from "~/misc/utils"; interface AssetFolderBackupEntryProps { fileId: number; filepath: string; version: number; } const AssetFolderBackupEntry: React.FC<AssetFolderBackupEntryProps> = ( props ) => { const classes = useGuardianStyles(); const [fileMeta, setFileMeta] = useState<Map<string, string>>(new Map()); const [loadError, setLoadError] = useState(false); useEffect(() => { getAssetFolderFileStorageMetadata(props.fileId) .then((info) => { const maybeISOTime = info.get("lastModified"); if (maybeISOTime) { try { const d = parseISO(maybeISOTime); info.set("lastModified", format(d, DEFAULT_DATE_FORMAT)); } catch (err) { console.log(`Could not parse date value ${maybeISOTime}: ${err}`); } } setFileMeta(info); }) .catch((err) => { console.error("Could not load file information: ", err); setLoadError(true); }); }, [props.fileId]); return ( <ListItem> <ListItemIcon> <FileCopy /> </ListItemIcon> <ListItemText disableTypography={true}> <> <Typography className={classes.emphasis}>{props.filepath}</Typography> <Typography>Version {props.version}</Typography> {loadError ? ( <Typography variant="caption"> Could not load file information, see console for details </Typography> ) : ( <> <Typography variant="caption"> File size is <SizeFormatter bytes={fileMeta.get("size")} /> and was backed up at {fileMeta.get("lastModified")} </Typography> </> )} </> </ListItemText> </ListItem> ); }; export default AssetFolderBackupEntry;