app/Embeddable/EmbeddablePlayer.tsx (73 lines of code) (raw):
import React, { useContext, useEffect, useState } from "react";
import { RouteComponentProps } from "react-router-dom";
import { VidispineItem } from "../vidispine/item/VidispineItem";
import { CircularProgress, Typography } from "@material-ui/core";
import VidispineContext from "../Context/VidispineContext";
import PlayerContainer from "../ItemView/PlayerContainer";
import { loadItemMeta } from "../ItemView/LoadItem";
import { BreakDownQueryString } from "./QueryString";
const EmbeddablePlayer: React.FC<RouteComponentProps> = (props) => {
const [itemData, setItemData] = useState<VidispineItem | undefined>();
const [lastError, setLastError] = useState<string>("");
const [loading, setLoading] = useState<boolean>(true);
const vidispineContext = useContext(VidispineContext);
//FIXME: should be loaded in from config!
const defaultShapes = ["lowres", "lowimage", "lowaudio"];
console.log("embeddablePlayer");
useEffect(() => {
if (vidispineContext) {
const params = BreakDownQueryString(props.location.search);
console.log("params are ", params);
const maybeId = params.get("onlineId");
if (maybeId) {
console.log(`Loading item with id ${maybeId}`);
loadItemMeta(vidispineContext.baseUrl, maybeId)
.then((newItemData) => {
setItemData(newItemData);
setLastError("");
setLoading(false);
})
.catch((err) => {
setLoading(false);
setLastError(err);
if (err.includes("retrying"))
window.setTimeout(
() => loadItemMeta(vidispineContext.baseUrl, maybeId),
3000
); //try again in 3 seconds
});
} else {
console.error(
"Can't load item because no onlineId was present. Request was ",
params
);
}
} else {
console.log("vidispine context not present");
}
}, [vidispineContext]);
const originalFilename = () => {
if (!itemData) return undefined;
const possibleFilename = itemData.getMetadataString("originalFilename");
if (possibleFilename) {
return `${possibleFilename as string}`;
} else {
return undefined;
}
};
return (
<div id="mediabrowser-embed">
{loading ? <CircularProgress /> : undefined}
{itemData && itemData.shape && itemData.files ? (
<PlayerContainer
shapes={itemData.shape}
defaultShapes={defaultShapes}
uriList={itemData.files.uri}
originalFilename={originalFilename()}
/>
) : (
<Typography variant="caption">No shapes exist on this item</Typography>
)}
{lastError ? (
<Typography variant="caption">{lastError}</Typography>
) : undefined}
</div>
);
};
export default EmbeddablePlayer;