import { useEffect, useState } from "react"; import { Modal } from "./Modal"; import { search, type SearchResponse } from "api/api"; import SearchResults from "../SearchResults"; import type { MergeFunc, MergeSearchCleanerFunc, } from "~/routes/MediaItems/MediaLayout"; import { useNavigate } from "react-router"; interface Props { open: boolean; setOpen: Function; type: string; currentId: number; currentTitle: string; mergeFunc: MergeFunc; mergeCleanerFunc: MergeSearchCleanerFunc; } export default function MergeModal(props: Props) { const [query, setQuery] = useState(props.currentTitle); const [data, setData] = useState(); const [debouncedQuery, setDebouncedQuery] = useState(query); const [mergeTarget, setMergeTarget] = useState<{ title: string; id: number }>( { title: "", id: 0 } ); const [mergeOrderReversed, setMergeOrderReversed] = useState(false); const [replaceImage, setReplaceImage] = useState(false); const navigate = useNavigate(); const closeMergeModal = () => { props.setOpen(false); setQuery(""); setData(undefined); setMergeOrderReversed(false); setMergeTarget({ title: "", id: 0 }); }; const toggleSelect = ({ title, id }: { title: string; id: number }) => { setMergeTarget({ title: title, id: id }); }; useEffect(() => { console.log("mergeTarget", mergeTarget); }, [mergeTarget]); const doMerge = () => { let from, to; if (!mergeOrderReversed) { from = mergeTarget; to = { id: props.currentId, title: props.currentTitle }; } else { from = { id: props.currentId, title: props.currentTitle }; to = mergeTarget; } props .mergeFunc(from.id, to.id, replaceImage) .then((r) => { if (r.ok) { if (mergeOrderReversed) { navigate(`/${props.type.toLowerCase()}/${mergeTarget.id}`); closeMergeModal(); } else { window.location.reload(); } } else { // TODO: handle error console.log(r); } }) .catch((err) => console.log(err)); }; useEffect(() => { const handler = setTimeout(() => { setDebouncedQuery(query); if (query === "") { setData(undefined); } }, 300); return () => { clearTimeout(handler); }; }, [query]); useEffect(() => { if (debouncedQuery) { search(debouncedQuery).then((r) => { r = props.mergeCleanerFunc(r, props.currentId); setData(r); }); } }, [debouncedQuery]); return (

Merge {props.type}s

{ setQuery(e.target.value); e.target.select()}} onChange={(e) => setQuery(e.target.value)} /> {mergeTarget.id !== 0 ? ( <> {mergeOrderReversed ? (

{props.currentTitle} will be merged into{" "} {mergeTarget.title}

) : (

{mergeTarget.title} will be merged into{" "} {props.currentTitle}

)}
setMergeOrderReversed(!mergeOrderReversed)} />
{(props.type.toLowerCase() === "album" || props.type.toLowerCase() === "artist") && (
setReplaceImage(!replaceImage)} />
)} ) : ( "" )}
); }