import React, { useCallback, useEffect, useRef, useState } from "react"; import { Badge, Button, Col, Form, InputGroup, Row } from "react-bootstrap"; import { FormattedMessage, useIntl } from "react-intl"; import * as GQL from "src/core/generated-graphql"; import { Modal, LoadingIndicator, TruncatedText, Icon, } from "src/components/Shared"; import { queryScrapeSceneQuery } from "src/core/StashService"; import useToast from "src/hooks/Toast"; import { faSearch } from "@fortawesome/free-solid-svg-icons"; interface ISceneSearchResultDetailsProps { scene: GQL.ScrapedSceneDataFragment; } const SceneSearchResultDetails: React.FC = ({ scene, }) => { function renderPerformers() { if (scene.performers) { return ( {scene.performers?.map((performer) => ( {performer.name} ))} ); } } function renderTags() { if (scene.tags) { return ( {scene.tags?.map((tag) => ( {tag.name} ))} ); } } function renderImage() { if (scene.image) { return (
); } } return (
{renderImage()}

{scene.title}

{scene.studio?.name} {scene.studio?.name && scene.date && ` • `} {scene.date}
{renderPerformers()} {renderTags()}
); }; export interface ISceneSearchResult { scene: GQL.ScrapedSceneDataFragment; } export const SceneSearchResult: React.FC = ({ scene }) => { return (
); }; interface IProps { scraper: GQL.ScraperSourceInput; onHide: () => void; onSelectScene: (scene: GQL.ScrapedSceneDataFragment) => void; name?: string; } export const SceneQueryModal: React.FC = ({ scraper, name, onHide, onSelectScene, }) => { const CLASSNAME = "SceneScrapeModal"; const CLASSNAME_LIST = `${CLASSNAME}-list`; const CLASSNAME_LIST_CONTAINER = `${CLASSNAME_LIST}-container`; const intl = useIntl(); const Toast = useToast(); const inputRef = useRef(null); const [loading, setLoading] = useState(false); const [scenes, setScenes] = useState(); const [error, setError] = useState(); const doQuery = useCallback( async (input: string) => { if (!input) return; setLoading(true); try { const r = await queryScrapeSceneQuery(scraper, input); setScenes(r.data.scrapeSingleScene); } catch (err) { if (err instanceof Error) setError(err); } finally { setLoading(false); } }, [scraper] ); useEffect(() => inputRef.current?.focus(), []); useEffect(() => { if (error) { Toast.error(error); setError(undefined); } }, [error, Toast]); function renderResults() { if (!scenes) { return; } return (
    {scenes.map((s, i) => ( // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-noninteractive-element-interactions, react/no-array-index-key
  • onSelectScene(s)}>
  • ))}
); } return (
) => e.key === "Enter" && doQuery(inputRef.current?.value ?? "") } /> {loading ? (
) : ( renderResults() )}
); }; export default SceneQueryModal;