mirror of
https://github.com/stashapp/stash.git
synced 2025-12-18 21:04:37 +03:00
Fix performer input values being lost when failing to create (#1133)
* Fix lost performer input values * Fix unsetting image studio
This commit is contained in:
@@ -27,7 +27,9 @@ export const ImageEditPanel: React.FC<IProps> = ({
|
|||||||
const Toast = useToast();
|
const Toast = useToast();
|
||||||
const [title, setTitle] = useState<string>(image?.title ?? "");
|
const [title, setTitle] = useState<string>(image?.title ?? "");
|
||||||
const [rating, setRating] = useState<number>(image.rating ?? NaN);
|
const [rating, setRating] = useState<number>(image.rating ?? NaN);
|
||||||
const [studioId, setStudioId] = useState<string>(image.studio?.id ?? "");
|
const [studioId, setStudioId] = useState<string | undefined>(
|
||||||
|
image.studio?.id ?? undefined
|
||||||
|
);
|
||||||
const [performerIds, setPerformerIds] = useState<string[]>(
|
const [performerIds, setPerformerIds] = useState<string[]>(
|
||||||
image.performers.map((p) => p.id)
|
image.performers.map((p) => p.id)
|
||||||
);
|
);
|
||||||
@@ -153,7 +155,7 @@ export const ImageEditPanel: React.FC<IProps> = ({
|
|||||||
<Col xs={9}>
|
<Col xs={9}>
|
||||||
<StudioSelect
|
<StudioSelect
|
||||||
onSelect={(items) =>
|
onSelect={(items) =>
|
||||||
setStudioId(items.length > 0 ? items[0]?.id : "")
|
setStudioId(items.length > 0 ? items[0]?.id : undefined)
|
||||||
}
|
}
|
||||||
ids={studioId ? [studioId] : []}
|
ids={studioId ? [studioId] : []}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import * as GQL from "src/core/generated-graphql";
|
|||||||
import {
|
import {
|
||||||
useFindPerformer,
|
useFindPerformer,
|
||||||
usePerformerUpdate,
|
usePerformerUpdate,
|
||||||
usePerformerCreate,
|
|
||||||
usePerformerDestroy,
|
usePerformerDestroy,
|
||||||
} from "src/core/StashService";
|
} from "src/core/StashService";
|
||||||
import {
|
import {
|
||||||
@@ -62,7 +61,6 @@ export const Performer: React.FC = () => {
|
|||||||
const isLoading = performerLoading || loading;
|
const isLoading = performerLoading || loading;
|
||||||
|
|
||||||
const [updatePerformer] = usePerformerUpdate();
|
const [updatePerformer] = usePerformerUpdate();
|
||||||
const [createPerformer] = usePerformerCreate();
|
|
||||||
const [deletePerformer] = usePerformerDestroy();
|
const [deletePerformer] = usePerformerDestroy();
|
||||||
|
|
||||||
const activeTabKey =
|
const activeTabKey =
|
||||||
@@ -107,43 +105,6 @@ export const Performer: React.FC = () => {
|
|||||||
if (!performer.id && !isNew)
|
if (!performer.id && !isNew)
|
||||||
return <ErrorMessage error={`No performer found with id ${id}.`} />;
|
return <ErrorMessage error={`No performer found with id ${id}.`} />;
|
||||||
|
|
||||||
async function onSave(
|
|
||||||
performerInput:
|
|
||||||
| Partial<GQL.PerformerCreateInput>
|
|
||||||
| Partial<GQL.PerformerUpdateInput>
|
|
||||||
) {
|
|
||||||
setIsLoading(true);
|
|
||||||
try {
|
|
||||||
if (!isNew) {
|
|
||||||
await updatePerformer({
|
|
||||||
variables: {
|
|
||||||
input: {
|
|
||||||
...performerInput,
|
|
||||||
stash_ids: performerInput?.stash_ids?.map((s) => ({
|
|
||||||
endpoint: s.endpoint,
|
|
||||||
stash_id: s.stash_id,
|
|
||||||
})),
|
|
||||||
} as GQL.PerformerUpdateInput,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
if (performerInput.image) {
|
|
||||||
// Refetch image to bust browser cache
|
|
||||||
await fetch(`/performer/${id}/image`, { cache: "reload" });
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const result = await createPerformer({
|
|
||||||
variables: performerInput as GQL.PerformerCreateInput,
|
|
||||||
});
|
|
||||||
if (result.data?.performerCreate) {
|
|
||||||
history.push(`/performers/${result.data.performerCreate.id}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
Toast.error(e);
|
|
||||||
}
|
|
||||||
setIsLoading(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function onDelete() {
|
async function onDelete() {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
@@ -187,7 +148,6 @@ export const Performer: React.FC = () => {
|
|||||||
isVisible={activeTabKey === "edit"}
|
isVisible={activeTabKey === "edit"}
|
||||||
isNew={isNew}
|
isNew={isNew}
|
||||||
onDelete={onDelete}
|
onDelete={onDelete}
|
||||||
onSave={onSave}
|
|
||||||
onImageChange={onImageChange}
|
onImageChange={onImageChange}
|
||||||
onImageEncoding={onImageEncoding}
|
onImageEncoding={onImageEncoding}
|
||||||
/>
|
/>
|
||||||
@@ -312,7 +272,6 @@ export const Performer: React.FC = () => {
|
|||||||
isVisible
|
isVisible
|
||||||
isNew={isNew}
|
isNew={isNew}
|
||||||
onDelete={onDelete}
|
onDelete={onDelete}
|
||||||
onSave={onSave}
|
|
||||||
onImageChange={onImageChange}
|
onImageChange={onImageChange}
|
||||||
onImageEncoding={onImageEncoding}
|
onImageEncoding={onImageEncoding}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import {
|
|||||||
queryScrapePerformer,
|
queryScrapePerformer,
|
||||||
queryScrapePerformerURL,
|
queryScrapePerformerURL,
|
||||||
mutateReloadScrapers,
|
mutateReloadScrapers,
|
||||||
|
usePerformerUpdate,
|
||||||
|
usePerformerCreate,
|
||||||
} from "src/core/StashService";
|
} from "src/core/StashService";
|
||||||
import {
|
import {
|
||||||
Icon,
|
Icon,
|
||||||
@@ -26,6 +28,7 @@ import {
|
|||||||
EditableTextUtils,
|
EditableTextUtils,
|
||||||
} from "src/utils";
|
} from "src/utils";
|
||||||
import { useToast } from "src/hooks";
|
import { useToast } from "src/hooks";
|
||||||
|
import { useHistory } from "react-router-dom";
|
||||||
import { PerformerScrapeDialog } from "./PerformerScrapeDialog";
|
import { PerformerScrapeDialog } from "./PerformerScrapeDialog";
|
||||||
|
|
||||||
interface IPerformerDetails {
|
interface IPerformerDetails {
|
||||||
@@ -33,11 +36,6 @@ interface IPerformerDetails {
|
|||||||
isNew?: boolean;
|
isNew?: boolean;
|
||||||
isEditing?: boolean;
|
isEditing?: boolean;
|
||||||
isVisible: boolean;
|
isVisible: boolean;
|
||||||
onSave?: (
|
|
||||||
performer:
|
|
||||||
| Partial<GQL.PerformerCreateInput>
|
|
||||||
| Partial<GQL.PerformerUpdateInput>
|
|
||||||
) => void;
|
|
||||||
onDelete?: () => void;
|
onDelete?: () => void;
|
||||||
onImageChange?: (image?: string | null) => void;
|
onImageChange?: (image?: string | null) => void;
|
||||||
onImageEncoding?: (loading?: boolean) => void;
|
onImageEncoding?: (loading?: boolean) => void;
|
||||||
@@ -48,12 +46,12 @@ export const PerformerDetailsPanel: React.FC<IPerformerDetails> = ({
|
|||||||
isNew,
|
isNew,
|
||||||
isEditing,
|
isEditing,
|
||||||
isVisible,
|
isVisible,
|
||||||
onSave,
|
|
||||||
onDelete,
|
onDelete,
|
||||||
onImageChange,
|
onImageChange,
|
||||||
onImageEncoding,
|
onImageEncoding,
|
||||||
}) => {
|
}) => {
|
||||||
const Toast = useToast();
|
const Toast = useToast();
|
||||||
|
const history = useHistory();
|
||||||
|
|
||||||
// Editing state
|
// Editing state
|
||||||
const [
|
const [
|
||||||
@@ -100,6 +98,9 @@ export const PerformerDetailsPanel: React.FC<IPerformerDetails> = ({
|
|||||||
|
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
|
|
||||||
|
const [updatePerformer] = usePerformerUpdate();
|
||||||
|
const [createPerformer] = usePerformerCreate();
|
||||||
|
|
||||||
const Scrapers = useListPerformerScrapers();
|
const Scrapers = useListPerformerScrapers();
|
||||||
const [queryableScrapers, setQueryableScrapers] = useState<GQL.Scraper[]>([]);
|
const [queryableScrapers, setQueryableScrapers] = useState<GQL.Scraper[]>([]);
|
||||||
|
|
||||||
@@ -201,6 +202,43 @@ export const PerformerDetailsPanel: React.FC<IPerformerDetails> = ({
|
|||||||
setImage(imageData);
|
setImage(imageData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function onSave(
|
||||||
|
performerInput:
|
||||||
|
| Partial<GQL.PerformerCreateInput>
|
||||||
|
| Partial<GQL.PerformerUpdateInput>
|
||||||
|
) {
|
||||||
|
setIsLoading(true);
|
||||||
|
try {
|
||||||
|
if (!isNew) {
|
||||||
|
await updatePerformer({
|
||||||
|
variables: {
|
||||||
|
input: {
|
||||||
|
...performerInput,
|
||||||
|
stash_ids: performerInput?.stash_ids?.map((s) => ({
|
||||||
|
endpoint: s.endpoint,
|
||||||
|
stash_id: s.stash_id,
|
||||||
|
})),
|
||||||
|
} as GQL.PerformerUpdateInput,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (performerInput.image) {
|
||||||
|
// Refetch image to bust browser cache
|
||||||
|
await fetch(`/performer/${performer.id}/image`, { cache: "reload" });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const result = await createPerformer({
|
||||||
|
variables: performerInput as GQL.PerformerCreateInput,
|
||||||
|
});
|
||||||
|
if (result.data?.performerCreate) {
|
||||||
|
history.push(`/performers/${result.data.performerCreate.id}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
Toast.error(e);
|
||||||
|
}
|
||||||
|
setIsLoading(false);
|
||||||
|
}
|
||||||
|
|
||||||
// set up hotkeys
|
// set up hotkeys
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isEditing && isVisible) {
|
if (isEditing && isVisible) {
|
||||||
|
|||||||
Reference in New Issue
Block a user