import React, { useState } from "react"; import { StudioSelect, PerformerSelect } from "src/components/Shared"; import * as GQL from "src/core/generated-graphql"; import { MovieSelect, TagSelect } from "src/components/Shared/Select"; import { ScrapeDialog, ScrapeDialogRow, ScrapeResult, ScrapedInputGroupRow, ScrapedTextAreaRow, ScrapedImageRow, } from "src/components/Shared/ScrapeDialog"; import _ from "lodash"; function renderScrapedStudio( result: ScrapeResult, isNew?: boolean, onChange?: (value: string) => void ) { const resultValue = isNew ? result.newValue : result.originalValue; const value = resultValue ? [resultValue] : []; return ( { if (onChange) { onChange(items[0]?.id); } }} ids={value} /> ); } function renderScrapedStudioRow( result: ScrapeResult, onChange: (value: ScrapeResult) => void ) { return ( renderScrapedStudio(result)} renderNewField={() => renderScrapedStudio(result, true, (value) => onChange(result.cloneWithValue(value)) ) } onChange={onChange} /> ); } function renderScrapedPerformers( result: ScrapeResult, isNew?: boolean, onChange?: (value: string[]) => void ) { const resultValue = isNew ? result.newValue : result.originalValue; const value = resultValue ?? []; return ( { if (onChange) { onChange(items.map((i) => i.id)); } }} ids={value} /> ); } function renderScrapedPerformersRow( result: ScrapeResult, onChange: (value: ScrapeResult) => void ) { return ( renderScrapedPerformers(result)} renderNewField={() => renderScrapedPerformers(result, true, (value) => onChange(result.cloneWithValue(value)) ) } onChange={onChange} /> ); } function renderScrapedMovies( result: ScrapeResult, isNew?: boolean, onChange?: (value: string[]) => void ) { const resultValue = isNew ? result.newValue : result.originalValue; const value = resultValue ?? []; return ( { if (onChange) { onChange(items.map((i) => i.id)); } }} ids={value} /> ); } function renderScrapedMoviesRow( result: ScrapeResult, onChange: (value: ScrapeResult) => void ) { return ( renderScrapedMovies(result)} renderNewField={() => renderScrapedMovies(result, true, (value) => onChange(result.cloneWithValue(value)) ) } onChange={onChange} /> ); } function renderScrapedTags( result: ScrapeResult, isNew?: boolean, onChange?: (value: string[]) => void ) { const resultValue = isNew ? result.newValue : result.originalValue; const value = resultValue ?? []; return ( { if (onChange) { onChange(items.map((i) => i.id)); } }} ids={value} /> ); } function renderScrapedTagsRow( result: ScrapeResult, onChange: (value: ScrapeResult) => void ) { return ( renderScrapedTags(result)} renderNewField={() => renderScrapedTags(result, true, (value) => onChange(result.cloneWithValue(value)) ) } onChange={onChange} /> ); } interface ISceneScrapeDialogProps { scene: Partial; scraped: GQL.ScrapedScene; onClose: (scrapedScene?: GQL.ScrapedScene) => void; } interface IHasID { id?: string | null; } export const SceneScrapeDialog: React.FC = ( props: ISceneScrapeDialogProps ) => { const [title, setTitle] = useState>( new ScrapeResult(props.scene.title, props.scraped.title) ); const [url, setURL] = useState>( new ScrapeResult(props.scene.url, props.scraped.url) ); const [date, setDate] = useState>( new ScrapeResult(props.scene.date, props.scraped.date) ); const [studio, setStudio] = useState>( new ScrapeResult(props.scene.studio_id, props.scraped.studio?.id) ); function mapIdObjects(scrapedObjects?: IHasID[]): string[] | undefined { if (!scrapedObjects) { return undefined; } const ret = scrapedObjects .map((p) => p.id) .filter((p) => { return p !== undefined && p !== null; }) as string[]; if (ret.length === 0) { return undefined; } // sort by id numerically ret.sort((a, b) => { return parseInt(a) - parseInt(b); }); return ret; } function sortIdList(idList?: string[] | null) { if (!idList) { return; } const ret = _.clone(idList); // sort by id numerically ret.sort((a, b) => { return parseInt(a) - parseInt(b); }); return ret; } const [performers, setPerformers] = useState>( new ScrapeResult( sortIdList(props.scene.performer_ids), mapIdObjects(props.scraped.performers ?? undefined) ) ); const [movies, setMovies] = useState>( new ScrapeResult( sortIdList(props.scene.movies?.map((p) => p.movie_id)), mapIdObjects(props.scraped.movies ?? undefined) ) ); const [tags, setTags] = useState>( new ScrapeResult( sortIdList(props.scene.tag_ids), mapIdObjects(props.scraped.tags ?? undefined) ) ); const [details, setDetails] = useState>( new ScrapeResult(props.scene.details, props.scraped.details) ); const [image, setImage] = useState>( new ScrapeResult(props.scene.cover_image, props.scraped.image) ); // don't show the dialog if nothing was scraped if ( [title, url, date, studio, performers, movies, tags, details, image].every( (r) => !r.scraped ) ) { props.onClose(); return <>; } function makeNewScrapedItem() { const newStudio = studio.getNewValue(); return { title: title.getNewValue(), url: url.getNewValue(), date: date.getNewValue(), studio: newStudio ? { id: newStudio, name: "", } : undefined, performers: performers.getNewValue()?.map((p) => { return { id: p, name: "", }; }), movies: movies.getNewValue()?.map((m) => { return { id: m, name: "", }; }), tags: tags.getNewValue()?.map((m) => { return { id: m, name: "", }; }), details: details.getNewValue(), image: image.getNewValue(), }; } function renderScrapeRows() { return ( <> setTitle(value)} /> setURL(value)} /> setDate(value)} /> {renderScrapedStudioRow(studio, (value) => setStudio(value))} {renderScrapedPerformersRow(performers, (value) => setPerformers(value) )} {renderScrapedMoviesRow(movies, (value) => setMovies(value))} {renderScrapedTagsRow(tags, (value) => setTags(value))} setDetails(value)} /> setImage(value)} /> ); } return ( { props.onClose(apply ? makeNewScrapedItem() : undefined); }} /> ); };