import React, { useState } from "react"; import { Form } from "react-bootstrap"; import { useScenesDestroy } from "src/core/StashService"; import * as GQL from "src/core/generated-graphql"; import { ModalComponent } from "src/components/Shared/Modal"; import { useToast } from "src/hooks/Toast"; import { useConfigurationContext } from "src/hooks/Config"; import { FormattedMessage, useIntl } from "react-intl"; import { faTrashAlt } from "@fortawesome/free-solid-svg-icons"; import { objectPath } from "src/core/files"; interface IDeleteSceneDialogProps { selected: GQL.SlimSceneDataFragment[]; onClose: (confirmed: boolean) => void; } export const DeleteScenesDialog: React.FC = ( props: IDeleteSceneDialogProps ) => { const intl = useIntl(); const singularEntity = intl.formatMessage({ id: "scene" }); const pluralEntity = intl.formatMessage({ id: "scenes" }); const header = intl.formatMessage( { id: "dialogs.delete_entity_title" }, { count: props.selected.length, singularEntity, pluralEntity } ); const toastMessage = intl.formatMessage( { id: "toast.delete_past_tense" }, { count: props.selected.length, singularEntity, pluralEntity } ); const message = intl.formatMessage( { id: "dialogs.delete_entity_desc" }, { count: props.selected.length, singularEntity, pluralEntity } ); const { configuration: config } = useConfigurationContext(); const [deleteFile, setDeleteFile] = useState( config?.defaults.deleteFile ?? false ); const [deleteGenerated, setDeleteGenerated] = useState( config?.defaults.deleteGenerated ?? true ); const Toast = useToast(); const [deleteScene] = useScenesDestroy(getScenesDeleteInput()); // Network state const [isDeleting, setIsDeleting] = useState(false); function getScenesDeleteInput(): GQL.ScenesDestroyInput { return { ids: props.selected.map((scene) => scene.id), delete_file: deleteFile, delete_generated: deleteGenerated, }; } async function onDelete() { setIsDeleting(true); try { await deleteScene(); Toast.success(toastMessage); props.onClose(true); } catch (e) { Toast.error(e); props.onClose(false); } setIsDeleting(false); } function funscriptPath(sp: string) { const extIndex = sp.lastIndexOf("."); if (extIndex !== -1) { return sp.substring(0, extIndex + 1) + "funscript"; } return sp; } function maybeRenderDeleteFileAlert() { if (!deleteFile) { return; } const deletedFiles: string[] = []; props.selected.forEach((s) => { const paths = s.files.map((f) => f.path); deletedFiles.push(...paths); if (s.interactive && s.files.length) { deletedFiles.push(funscriptPath(objectPath(s))); } }); const deleteTrashPath = config?.general.deleteTrashPath; const deleteAlertId = deleteTrashPath ? "dialogs.delete_alert_to_trash" : "dialogs.delete_alert"; return (

    {deletedFiles.slice(0, 5).map((s) => (
  • {s}
  • ))} {deletedFiles.length > 5 && ( )}
); } return ( props.onClose(false), text: intl.formatMessage({ id: "actions.cancel" }), variant: "secondary", }} isRunning={isDeleting} >

{message}

{maybeRenderDeleteFileAlert()}
setDeleteFile(!deleteFile)} /> setDeleteGenerated(!deleteGenerated)} />
); }; export default DeleteScenesDialog;