import React, { useMemo, useState } from "react"; import { Accordion, Button, Card } from "react-bootstrap"; import { FormattedMessage, FormattedNumber, useIntl } from "react-intl"; import { TruncatedText } from "src/components/Shared"; import DeleteFilesDialog from "src/components/Shared/DeleteFilesDialog"; import * as GQL from "src/core/generated-graphql"; import { mutateSceneSetPrimaryFile } from "src/core/StashService"; import { useToast } from "src/hooks"; import { NavUtils, TextUtils, getStashboxBase } from "src/utils"; import { TextField, URLField } from "src/utils/field"; interface IFileInfoPanelProps { file: GQL.VideoFileDataFragment; primary?: boolean; ofMany?: boolean; onSetPrimaryFile?: () => void; onDeleteFile?: () => void; loading?: boolean; } const FileInfoPanel: React.FC = ( props: IFileInfoPanelProps ) => { const intl = useIntl(); function renderFileSize() { const { size, unit } = TextUtils.fileSize(props.file.size); return ( ); } // TODO - generalise fingerprints const oshash = props.file.fingerprints.find((f) => f.type === "oshash"); const phash = props.file.fingerprints.find((f) => f.type === "phash"); const checksum = props.file.fingerprints.find((f) => f.type === "md5"); return (
{props.primary && ( <>
)} {renderFileSize()}
{props.ofMany && props.onSetPrimaryFile && !props.primary && (
)}
); }; interface ISceneFileInfoPanelProps { scene: GQL.SceneDataFragment; } export const SceneFileInfoPanel: React.FC = ( props: ISceneFileInfoPanelProps ) => { const Toast = useToast(); const [loading, setLoading] = useState(false); const [deletingFile, setDeletingFile] = useState< GQL.VideoFileDataFragment | undefined >(); function renderStashIDs() { if (!props.scene.stash_ids.length) { return; } return ( <>
StashIDs
    {props.scene.stash_ids.map((stashID) => { const base = getStashboxBase(stashID.endpoint); const link = base ? ( {stashID.stash_id} ) : ( stashID.stash_id ); return (
  • {link}
  • ); })}
); } function renderFunscript() { if (props.scene.interactive) { return ( ); } } function renderInteractiveSpeed() { if (props.scene.interactive_speed) { return ( ); } } const filesPanel = useMemo(() => { if (props.scene.files.length === 0) { return; } if (props.scene.files.length === 1) { return ; } async function onSetPrimaryFile(fileID: string) { try { setLoading(true); await mutateSceneSetPrimaryFile(props.scene.id, fileID); } catch (e) { Toast.error(e); } finally { setLoading(false); } } return ( {deletingFile && ( setDeletingFile(undefined)} selected={[deletingFile]} /> )} {props.scene.files.map((file, index) => ( onSetPrimaryFile(file.id)} onDeleteFile={() => setDeletingFile(file)} loading={loading} /> ))} ); }, [props.scene, loading, Toast, deletingFile]); return ( <>
{renderFunscript()} {renderInteractiveSpeed()} {renderStashIDs()}
{filesPanel} ); }; export default SceneFileInfoPanel;