import React, { useMemo } from "react"; import * as GQL from "src/core/generated-graphql"; import { ScrapeDialogRow } from "src/components/Shared/ScrapeDialog/ScrapeDialog"; import { PerformerSelect } from "src/components/Performers/PerformerSelect"; import { ObjectScrapeResult, ScrapeResult, } from "src/components/Shared/ScrapeDialog/scrapeResult"; import { TagSelect } from "src/components/Tags/TagSelect"; import { StudioSelect } from "src/components/Studios/StudioSelect"; import { GroupSelect } from "src/components/Movies/MovieSelect"; interface IScrapedStudioRow { title: string; result: ObjectScrapeResult; onChange: (value: ObjectScrapeResult) => void; newStudio?: GQL.ScrapedStudio; onCreateNew?: (value: GQL.ScrapedStudio) => void; } function getObjectName(value: T) { return value.name; } export const ScrapedStudioRow: React.FC = ({ title, result, onChange, newStudio, onCreateNew, }) => { function renderScrapedStudio( scrapeResult: ObjectScrapeResult, isNew?: boolean, onChangeFn?: (value: GQL.ScrapedStudio) => void ) { const resultValue = isNew ? scrapeResult.newValue : scrapeResult.originalValue; const value = resultValue ? [resultValue] : []; const selectValue = value.map((p) => { const aliases: string[] = []; return { id: p.stored_id ?? "", name: p.name ?? "", aliases, }; }); return ( { if (onChangeFn) { const { id, ...data } = items[0]; onChangeFn({ ...data, stored_id: id, }); } }} values={selectValue} /> ); } return ( renderScrapedStudio(result)} renderNewField={() => renderScrapedStudio(result, true, (value) => onChange(result.cloneWithValue(value)) ) } onChange={onChange} newValues={newStudio ? [newStudio] : undefined} onCreateNew={() => { if (onCreateNew && newStudio) onCreateNew(newStudio); }} getName={getObjectName} /> ); }; interface IScrapedObjectsRow { title: string; result: ScrapeResult; onChange: (value: ScrapeResult) => void; newObjects?: T[]; onCreateNew?: (value: T) => void; renderObjects: ( result: ScrapeResult, isNew?: boolean, onChange?: (value: T[]) => void ) => JSX.Element; getName: (value: T) => string; } export const ScrapedObjectsRow = (props: IScrapedObjectsRow) => { const { title, result, onChange, newObjects, onCreateNew, renderObjects, getName, } = props; return ( renderObjects(result)} renderNewField={() => renderObjects(result, true, (value) => onChange(result.cloneWithValue(value)) ) } onChange={onChange} newValues={newObjects} onCreateNew={(i) => { if (onCreateNew) onCreateNew(newObjects![i]); }} getName={getName} /> ); }; type IScrapedObjectRowImpl = Omit< IScrapedObjectsRow, "renderObjects" | "getName" >; export const ScrapedPerformersRow: React.FC< IScrapedObjectRowImpl > = ({ title, result, onChange, newObjects, onCreateNew }) => { const performersCopy = useMemo(() => { return ( newObjects?.map((p) => { const name: string = p.name ?? ""; return { ...p, name }; }) ?? [] ); }, [newObjects]); function renderScrapedPerformers( scrapeResult: ScrapeResult, isNew?: boolean, onChangeFn?: (value: GQL.ScrapedPerformer[]) => void ) { const resultValue = isNew ? scrapeResult.newValue : scrapeResult.originalValue; const value = resultValue ?? []; const selectValue = value.map((p) => { const alias_list: string[] = []; return { id: p.stored_id ?? "", name: p.name ?? "", alias_list, }; }); return ( { if (onChangeFn) { // map the id back to stored_id onChangeFn(items.map((p) => ({ ...p, stored_id: p.id }))); } }} values={selectValue} /> ); } return ( title={title} result={result} renderObjects={renderScrapedPerformers} onChange={onChange} newObjects={performersCopy} onCreateNew={onCreateNew} getName={(value) => value.name ?? ""} /> ); }; export const ScrapedGroupsRow: React.FC< IScrapedObjectRowImpl > = ({ title, result, onChange, newObjects, onCreateNew }) => { const groupsCopy = useMemo(() => { return ( newObjects?.map((p) => { const name: string = p.name ?? ""; return { ...p, name }; }) ?? [] ); }, [newObjects]); function renderScrapedGroups( scrapeResult: ScrapeResult, isNew?: boolean, onChangeFn?: (value: GQL.ScrapedGroup[]) => void ) { const resultValue = isNew ? scrapeResult.newValue : scrapeResult.originalValue; const value = resultValue ?? []; const selectValue = value.map((p) => { const aliases: string = ""; return { id: p.stored_id ?? "", name: p.name ?? "", aliases, }; }); return ( { if (onChangeFn) { // map the id back to stored_id onChangeFn(items.map((p) => ({ ...p, stored_id: p.id }))); } }} values={selectValue} /> ); } return ( title={title} result={result} renderObjects={renderScrapedGroups} onChange={onChange} newObjects={groupsCopy} onCreateNew={onCreateNew} getName={(value) => value.name ?? ""} /> ); }; export const ScrapedTagsRow: React.FC< IScrapedObjectRowImpl > = ({ title, result, onChange, newObjects, onCreateNew }) => { function renderScrapedTags( scrapeResult: ScrapeResult, isNew?: boolean, onChangeFn?: (value: GQL.ScrapedTag[]) => void ) { const resultValue = isNew ? scrapeResult.newValue : scrapeResult.originalValue; const value = resultValue ?? []; const selectValue = value.map((p) => { const aliases: string[] = []; return { id: p.stored_id ?? "", name: p.name ?? "", aliases, }; }); return ( { if (onChangeFn) { // map the id back to stored_id onChangeFn(items.map((p) => ({ ...p, stored_id: p.id }))); } }} values={selectValue} /> ); } return ( title={title} result={result} renderObjects={renderScrapedTags} onChange={onChange} newObjects={newObjects} onCreateNew={onCreateNew} getName={getObjectName} /> ); };