From cd0a9a1d627285ff9d1a7dcb243262b4d5aa6030 Mon Sep 17 00:00:00 2001 From: InfiniteTF Date: Sat, 17 Apr 2021 00:52:18 +0200 Subject: [PATCH] Fix performer scraping (#1314) --- .../PerformerDetails/PerformerEditPanel.tsx | 56 +++++++++++-------- .../Scenes/SceneDetails/SceneScrapeDialog.tsx | 35 ++++++++++-- ui/v2.5/src/core/StashService.ts | 7 ++- ui/v2.5/src/utils/data.ts | 2 + ui/v2.5/src/utils/index.ts | 1 + 5 files changed, 71 insertions(+), 30 deletions(-) create mode 100644 ui/v2.5/src/utils/data.ts diff --git a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerEditPanel.tsx b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerEditPanel.tsx index db57daa88..dce51dd37 100644 --- a/ui/v2.5/src/components/Performers/PerformerDetails/PerformerEditPanel.tsx +++ b/ui/v2.5/src/components/Performers/PerformerDetails/PerformerEditPanel.tsx @@ -146,7 +146,7 @@ export const PerformerEditPanel: React.FC = ({ const formik = useFormik({ initialValues, validationSchema: schema, - onSubmit: (values) => onSave(getPerformerInput(values)), + onSubmit: (values) => onSave(values), }); function translateScrapedGender(scrapedGender?: string) { @@ -158,7 +158,7 @@ export const PerformerEditPanel: React.FC = ({ // try to translate from enum values first const upperGender = scrapedGender?.toUpperCase(); - const asEnum = genderToString(upperGender as GQL.GenderEnum); + const asEnum = genderToString(upperGender); if (asEnum) { retEnum = stringToGender(asEnum); } else { @@ -214,9 +214,14 @@ export const PerformerEditPanel: React.FC = ({ variables: tagInput, }); + if (!result.data?.tagCreate) { + Toast.error(new Error("Failed to create tag")); + return; + } + // add the new tag to the new tags value const newTagIds = formik.values.tag_ids.concat([ - result.data!.tagCreate!.id, + result.data.tagCreate.id, ]); formik.setFieldValue("tag_ids", newTagIds); @@ -298,7 +303,7 @@ export const PerformerEditPanel: React.FC = ({ if (state.tags) { // map tags to their ids and filter out those not found const newTagIds = state.tags.map((t) => t.stored_id).filter((t) => t); - formik.setFieldValue("tag_ids", newTagIds as string[]); + formik.setFieldValue("tag_ids", newTagIds); setNewTags(state.tags.filter((t) => !t.stored_id)); } @@ -309,9 +314,9 @@ export const PerformerEditPanel: React.FC = ({ // otherwise follow existing behaviour if ( (!isNew || formik.values.image === undefined) && - (state as GQL.ScrapedPerformerDataFragment).image !== undefined + state.image !== undefined ) { - const imageStr = (state as GQL.ScrapedPerformerDataFragment).image; + const imageStr = state.image; formik.setFieldValue("image", imageStr ?? undefined); } if (state.details) { @@ -332,29 +337,30 @@ export const PerformerEditPanel: React.FC = ({ formik.setFieldValue("image", imageData); } - async function onSave( - performerInput: - | Partial - | Partial - ) { + async function onSave(performerInput: InputValues) { setIsLoading(true); try { if (!isNew) { + const input = getUpdateValues(performerInput); + await updatePerformer({ variables: { input: { - ...performerInput, + ...input, stash_ids: performerInput?.stash_ids?.map((s) => ({ endpoint: s.endpoint, stash_id: s.stash_id, })), - } as GQL.PerformerUpdateInput, + }, }, }); history.push(`/performers/${performer.id}`); } else { + const input = getCreateValues(performerInput); const result = await createPerformer({ - variables: { input: performerInput as GQL.PerformerCreateInput }, + variables: { + input, + }, }); if (result.data?.performerCreate) { history.push(`/performers/${result.data.performerCreate.id}`); @@ -370,7 +376,7 @@ export const PerformerEditPanel: React.FC = ({ useEffect(() => { if (isVisible) { Mousetrap.bind("s s", () => { - onSave?.(getPerformerInput(formik.values)); + onSave?.(formik.values); }); if (!isNew) { @@ -413,19 +419,21 @@ export const PerformerEditPanel: React.FC = ({ if (isLoading) return ; - function getPerformerInput(values: InputValues) { - const performerInput: Partial< - GQL.PerformerCreateInput | GQL.PerformerUpdateInput - > = { + function getUpdateValues(values: InputValues): GQL.PerformerUpdateInput { + return { + ...values, + gender: stringToGender(values.gender), + weight: Number(values.weight), + id: performer.id ?? "", + }; + } + + function getCreateValues(values: InputValues): GQL.PerformerCreateInput { + return { ...values, gender: stringToGender(values.gender), weight: Number(values.weight), }; - - if (!isNew) { - (performerInput as GQL.PerformerUpdateInput).id = performer.id!; - } - return performerInput; } function onImageChangeHandler(event: React.FormEvent) { diff --git a/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx b/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx index 70b5db8d5..f05267d04 100644 --- a/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx +++ b/ui/v2.5/src/components/Scenes/SceneDetails/SceneScrapeDialog.tsx @@ -16,9 +16,10 @@ import { usePerformerCreate, useMovieCreate, useTagCreate, + stringToGender, } from "src/core/StashService"; import { useToast } from "src/hooks"; -import { DurationUtils } from "src/utils"; +import { DurationUtils, filterData } from "src/utils"; function renderScrapedStudio( result: ScrapeResult, @@ -360,11 +361,37 @@ export const SceneScrapeDialog: React.FC = ( } async function createNewPerformer(toCreate: GQL.ScrapedScenePerformer) { - let performerInput: GQL.PerformerCreateInput = { name: "" }; + const input: GQL.PerformerCreateInput = { + name: toCreate.name, + url: toCreate.url, + gender: stringToGender(toCreate.gender), + birthdate: toCreate.birthdate, + ethnicity: toCreate.ethnicity, + country: toCreate.country, + eye_color: toCreate.eye_color, + height: toCreate.height, + measurements: toCreate.measurements, + fake_tits: toCreate.fake_tits, + career_length: toCreate.career_length, + tattoos: toCreate.tattoos, + piercings: toCreate.piercings, + aliases: toCreate.aliases, + twitter: toCreate.twitter, + instagram: toCreate.instagram, + tag_ids: filterData((toCreate.tags ?? []).map((t) => t.stored_id)), + image: + (toCreate.images ?? []).length > 0 + ? (toCreate.images ?? [])[0] + : undefined, + details: toCreate.details, + death_date: toCreate.death_date, + hair_color: toCreate.hair_color, + weight: toCreate.weight ? Number(toCreate.weight) : undefined, + }; + try { - performerInput = Object.assign(performerInput, toCreate); const result = await createPerformer({ - variables: { input: performerInput }, + variables: { input }, }); // add the new performer to the new performers value diff --git a/ui/v2.5/src/core/StashService.ts b/ui/v2.5/src/core/StashService.ts index 2016da8e6..546824921 100644 --- a/ui/v2.5/src/core/StashService.ts +++ b/ui/v2.5/src/core/StashService.ts @@ -933,7 +933,7 @@ export const stringGenderMap = new Map([ ["Non-Binary", GQL.GenderEnum.NonBinary], ]); -export const genderToString = (value?: GQL.GenderEnum) => { +export const genderToString = (value?: GQL.GenderEnum | string) => { if (!value) { return undefined; } @@ -947,7 +947,10 @@ export const genderToString = (value?: GQL.GenderEnum) => { } }; -export const stringToGender = (value?: string, caseInsensitive?: boolean) => { +export const stringToGender = ( + value?: string | null, + caseInsensitive?: boolean +) => { if (!value) { return undefined; } diff --git a/ui/v2.5/src/utils/data.ts b/ui/v2.5/src/utils/data.ts new file mode 100644 index 000000000..b6b12ca0e --- /dev/null +++ b/ui/v2.5/src/utils/data.ts @@ -0,0 +1,2 @@ +export const filterData = (data?: (T | null | undefined)[] | null) => + data ? (data.filter((item) => item) as T[]) : []; diff --git a/ui/v2.5/src/utils/index.ts b/ui/v2.5/src/utils/index.ts index d9561cbfd..102c092dd 100644 --- a/ui/v2.5/src/utils/index.ts +++ b/ui/v2.5/src/utils/index.ts @@ -11,3 +11,4 @@ export { default as flattenMessages } from "./flattenMessages"; export { default as getISOCountry } from "./country"; export { default as useFocus } from "./focus"; export { default as downloadFile } from "./download"; +export * from "./data";