mirror of
https://github.com/stashapp/stash.git
synced 2025-12-24 17:23:27 +01:00
* Fix the fix for displayed performer image sticking after save * Refactor for consistency * Fully extract entity create/update logic from edit pages * Fix submit hotkeys * Refactor scene cover preview * Fix atoi error on new scene page
98 lines
2.8 KiB
TypeScript
98 lines
2.8 KiB
TypeScript
import React, { useEffect, useMemo, useState } from "react";
|
|
import { FormattedMessage, useIntl } from "react-intl";
|
|
import { useHistory, useLocation } from "react-router-dom";
|
|
import { SceneEditPanel } from "./SceneEditPanel";
|
|
import * as GQL from "src/core/generated-graphql";
|
|
import { mutateCreateScene, useFindScene } from "src/core/StashService";
|
|
import ImageUtils from "src/utils/image";
|
|
import { LoadingIndicator } from "src/components/Shared/LoadingIndicator";
|
|
import { useToast } from "src/hooks/Toast";
|
|
|
|
const SceneCreate: React.FC = () => {
|
|
const history = useHistory();
|
|
const intl = useIntl();
|
|
const Toast = useToast();
|
|
|
|
const location = useLocation();
|
|
const query = useMemo(() => new URLSearchParams(location.search), [location]);
|
|
|
|
// create scene from provided scene id if applicable
|
|
const { data, loading } = useFindScene(query.get("from_scene_id") ?? "new");
|
|
const [loadingCoverImage, setLoadingCoverImage] = useState(false);
|
|
const [coverImage, setCoverImage] = useState<string>();
|
|
|
|
const scene = useMemo(() => {
|
|
if (data?.findScene) {
|
|
return {
|
|
...data.findScene,
|
|
paths: undefined,
|
|
id: undefined,
|
|
};
|
|
}
|
|
|
|
return {
|
|
title: query.get("q") ?? undefined,
|
|
};
|
|
}, [data?.findScene, query]);
|
|
|
|
useEffect(() => {
|
|
async function fetchCoverImage() {
|
|
const srcScene = data?.findScene;
|
|
if (srcScene?.paths.screenshot) {
|
|
setLoadingCoverImage(true);
|
|
const imageData = await ImageUtils.imageToDataURL(
|
|
srcScene.paths.screenshot
|
|
);
|
|
setCoverImage(imageData);
|
|
setLoadingCoverImage(false);
|
|
} else {
|
|
setCoverImage(undefined);
|
|
}
|
|
}
|
|
|
|
fetchCoverImage();
|
|
}, [data?.findScene]);
|
|
|
|
if (loading || loadingCoverImage) {
|
|
return <LoadingIndicator />;
|
|
}
|
|
|
|
async function onSave(input: GQL.SceneCreateInput) {
|
|
const fileID = query.get("file_id") ?? undefined;
|
|
const result = await mutateCreateScene({
|
|
...input,
|
|
file_ids: fileID ? [fileID] : undefined,
|
|
});
|
|
if (result.data?.sceneCreate?.id) {
|
|
history.push(`/scenes/${result.data.sceneCreate.id}`);
|
|
Toast.success({
|
|
content: intl.formatMessage(
|
|
{ id: "toast.created_entity" },
|
|
{ entity: intl.formatMessage({ id: "scene" }).toLocaleLowerCase() }
|
|
),
|
|
});
|
|
}
|
|
}
|
|
|
|
return (
|
|
<div className="row new-view justify-content-center" id="create-scene-page">
|
|
<div className="col-md-8">
|
|
<h2>
|
|
<FormattedMessage
|
|
id="actions.create_entity"
|
|
values={{ entityType: intl.formatMessage({ id: "scene" }) }}
|
|
/>
|
|
</h2>
|
|
<SceneEditPanel
|
|
scene={scene}
|
|
initialCoverImage={coverImage}
|
|
isVisible
|
|
isNew
|
|
onSubmit={onSave}
|
|
/>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default SceneCreate;
|