app/ItemView/RawMetadataView.tsx (76 lines of code) (raw):

import React, { createRef, useContext, useEffect, useRef, useState, } from "react"; import { Grid, IconButton, Paper, Typography } from "@material-ui/core"; import VidispineContext from "../Context/VidispineContext"; import { ArrowDownward, ArrowUpward, Drafts, Replay } from "@material-ui/icons"; import axios from "axios"; import { SystemNotifcationKind, SystemNotification, } from "@guardian/pluto-headers"; // @ts-ignore import CodeMirror from "codemirror/lib/codemirror"; //see https://github.com/codemirror/CodeMirror/issues/5484 import "codemirror/lib/codemirror.css"; import "codemirror/theme/material-darker.css"; import "codemirror/mode/xml/xml"; import { metadataStylesHook } from "./MetadataGroupView"; import formatXML from "xml-formatter"; import { makeStyles } from "@material-ui/core/styles"; import CodeMirrorContainer from "./CodeMirrorContainer"; interface RawMetadataViewProps { itemId: string; elevation: number; } const RawMetadataView: React.FC<RawMetadataViewProps> = (props) => { const [rawMetadataString, setRawMetadataString] = useState( "<!-- XML content will be shown here -->" ); const [updateCounter, setUpdateCounter] = useState(0); const vidispineContext = useContext(VidispineContext); const classes = metadataStylesHook(); const loadMetadata = async () => { if (vidispineContext) { try { const response = await axios.get( `${vidispineContext.baseUrl}/API/item/${props.itemId}/metadata`, { headers: { Accept: "application/xml" } } ); setRawMetadataString(response.data as string); } catch (err) { console.error("Could not download raw metadata: ", err); SystemNotification.open( SystemNotifcationKind.Error, "Could not download raw metadata, see console for details" ); } } else { SystemNotification.open( SystemNotifcationKind.Error, "Unable to get vidispine config, try reloading the page" ); } }; useEffect(() => { loadMetadata(); }, [updateCounter]); return ( <Paper elevation={props.elevation} className={classes.metagroup}> <Grid container direction="row" justifyContent="space-between"> <Grid item> <Typography variant="h3">Raw metadata view</Typography> </Grid> <Grid item> <IconButton onClick={() => setUpdateCounter((prev) => prev + 1)}> <Replay /> </IconButton> </Grid> </Grid> <CodeMirrorContainer value={rawMetadataString} /> </Paper> ); }; export default RawMetadataView;