import React, { useState } from "react"; import * as GQL from "src/core/generated-graphql"; import { ScrapeDialog, ScrapedInputGroupRow, ScrapedTextAreaRow, ScrapedImageRow, ScrapedStringListRow, } from "src/components/Shared/ScrapeDialog/ScrapeDialog"; import { useIntl } from "react-intl"; import { uniq } from "lodash-es"; import { Performer } from "src/components/Performers/PerformerSelect"; import { sortStoredIdObjects } from "src/utils/data"; import { ObjectListScrapeResult, ObjectScrapeResult, ScrapeResult, } from "src/components/Shared/ScrapeDialog/scrapeResult"; import { ScrapedMoviesRow, ScrapedPerformersRow, ScrapedStudioRow, ScrapedTagsRow, } from "src/components/Shared/ScrapeDialog/ScrapedObjectsRow"; import { useCreateScrapedMovie, useCreateScrapedPerformer, useCreateScrapedStudio, useCreateScrapedTag, } from "src/components/Shared/ScrapeDialog/createObjects"; import { Tag } from "src/components/Tags/TagSelect"; import { Studio } from "src/components/Studios/StudioSelect"; import { Movie } from "src/components/Movies/MovieSelect"; interface ISceneScrapeDialogProps { scene: Partial; sceneStudio: Studio | null; scenePerformers: Performer[]; sceneTags: Tag[]; sceneMovies: Movie[]; scraped: GQL.ScrapedScene; endpoint?: string; onClose: (scrapedScene?: GQL.ScrapedScene) => void; } export const SceneScrapeDialog: React.FC = ({ scene, sceneStudio, scenePerformers, sceneTags, sceneMovies, scraped, onClose, endpoint, }) => { const [title, setTitle] = useState>( new ScrapeResult(scene.title, scraped.title) ); const [code, setCode] = useState>( new ScrapeResult(scene.code, scraped.code) ); const [urls, setURLs] = useState>( new ScrapeResult( scene.urls, scraped.urls ? uniq((scene.urls ?? []).concat(scraped.urls ?? [])) : undefined ) ); const [date, setDate] = useState>( new ScrapeResult(scene.date, scraped.date) ); const [director, setDirector] = useState>( new ScrapeResult(scene.director, scraped.director) ); const [studio, setStudio] = useState>( new ObjectScrapeResult( sceneStudio ? { stored_id: sceneStudio.id, name: sceneStudio.name, } : undefined, scraped.studio?.stored_id ? scraped.studio : undefined ) ); const [newStudio, setNewStudio] = useState( scraped.studio && !scraped.studio.stored_id ? scraped.studio : undefined ); const [stashID, setStashID] = useState( new ScrapeResult( scene.stash_ids?.find((s) => s.endpoint === endpoint)?.stash_id, scraped.remote_site_id ) ); const [performers, setPerformers] = useState< ObjectListScrapeResult >( new ObjectListScrapeResult( sortStoredIdObjects( scenePerformers.map((p) => ({ stored_id: p.id, name: p.name, })) ), sortStoredIdObjects(scraped.performers ?? undefined) ) ); const [newPerformers, setNewPerformers] = useState( scraped.performers?.filter((t) => !t.stored_id) ?? [] ); const [movies, setMovies] = useState< ObjectListScrapeResult >( new ObjectListScrapeResult( sortStoredIdObjects( sceneMovies.map((p) => ({ stored_id: p.id, name: p.name, })) ), sortStoredIdObjects(scraped.movies ?? undefined) ) ); const [newMovies, setNewMovies] = useState( scraped.movies?.filter((t) => !t.stored_id) ?? [] ); const [tags, setTags] = useState>( new ObjectListScrapeResult( sortStoredIdObjects( sceneTags.map((t) => ({ stored_id: t.id, name: t.name, })) ), sortStoredIdObjects(scraped.tags ?? undefined) ) ); const [newTags, setNewTags] = useState( scraped.tags?.filter((t) => !t.stored_id) ?? [] ); const [details, setDetails] = useState>( new ScrapeResult(scene.details, scraped.details) ); const [image, setImage] = useState>( new ScrapeResult(scene.cover_image, scraped.image) ); const createNewStudio = useCreateScrapedStudio({ scrapeResult: studio, setScrapeResult: setStudio, setNewObject: setNewStudio, }); const createNewPerformer = useCreateScrapedPerformer({ scrapeResult: performers, setScrapeResult: setPerformers, newObjects: newPerformers, setNewObjects: setNewPerformers, }); const createNewMovie = useCreateScrapedMovie({ scrapeResult: movies, setScrapeResult: setMovies, newObjects: newMovies, setNewObjects: setNewMovies, }); const createNewTag = useCreateScrapedTag({ scrapeResult: tags, setScrapeResult: setTags, newObjects: newTags, setNewObjects: setNewTags, }); const intl = useIntl(); // don't show the dialog if nothing was scraped if ( [ title, code, urls, date, director, studio, performers, movies, tags, details, image, stashID, ].every((r) => !r.scraped) && newTags.length === 0 && newPerformers.length === 0 && newMovies.length === 0 && !newStudio ) { onClose(); return <>; } function makeNewScrapedItem(): GQL.ScrapedSceneDataFragment { const newStudioValue = studio.getNewValue(); return { title: title.getNewValue(), code: code.getNewValue(), urls: urls.getNewValue(), date: date.getNewValue(), director: director.getNewValue(), studio: newStudioValue, performers: performers.getNewValue(), movies: movies.getNewValue(), tags: tags.getNewValue(), details: details.getNewValue(), image: image.getNewValue(), remote_site_id: stashID.getNewValue(), }; } function renderScrapeRows() { return ( <> setTitle(value)} /> setCode(value)} /> setURLs(value)} /> setDate(value)} /> setDirector(value)} /> setStudio(value)} newStudio={newStudio} onCreateNew={createNewStudio} /> setPerformers(value)} newObjects={newPerformers} onCreateNew={createNewPerformer} /> setMovies(value)} newObjects={newMovies} onCreateNew={createNewMovie} /> setTags(value)} newObjects={newTags} onCreateNew={createNewTag} /> setDetails(value)} /> setStashID(value)} /> setImage(value)} /> ); } return ( { onClose(apply ? makeNewScrapedItem() : undefined); }} /> ); }; export default SceneScrapeDialog;