import React, {ChangeEventHandler, EventHandler, useEffect, useState} from 'react'; import {MangaConnectorFunctions} from "./MangaConnectorFunctions"; import IMangaConnector from "./interfaces/IMangaConnector"; import {isValidUri} from "../App"; import IManga, {MangaItem} from "./interfaces/IManga"; import '../styles/search.css'; import SearchFunctions from "./SearchFunctions"; import JobFunctions from "./JobFunctions"; import ILocalLibrary from "./interfaces/ILocalLibrary"; import LocalLibraryFunctions from "./LocalLibraryFunctions"; import Loader from "./Loader"; export default function Search({apiUri, jobInterval, closeSearch} : {apiUri: string, jobInterval: Date, closeSearch(): void}) { let [loading, setLoading] = useState(true); const [mangaConnectors, setConnectors] = useState(); const [selectedConnector, setSelectedConnector] = useState(); const [selectedLanguage, setSelectedLanguage] = useState(); const [searchBoxValue, setSearchBoxValue] = useState(""); const [searchResults, setSearchResults] = useState(); const pattern = /https:\/\/([a-z0-9.]+\.[a-z0-9]{2,})(?:\/.*)?/i useEffect(() => { MangaConnectorFunctions.GetAllConnectors(apiUri).then((connectors)=> { return connectors.filter(c => c.enabled); }).then(setConnectors).then(() => setLoading(false)); }, []); useEffect(() => { setSelectedConnector(mangaConnectors?.find(c => c.name == "Global")); setSelectedLanguage(mangaConnectors?.find(c => c.name == "Global")?.supportedLanguages[0]) }, [mangaConnectors]); const selectedConnectorChanged : ChangeEventHandler = (event) => { event.preventDefault(); if(mangaConnectors === undefined) return; const selectedConnector = mangaConnectors.find((con: IMangaConnector) => con.name == event.target.value); if(selectedConnector === undefined) return; setSelectedConnector(selectedConnector); setSelectedLanguage(selectedConnector.supportedLanguages[0]); } const searchBoxValueChanged : ChangeEventHandler = (event) => { event.currentTarget.style.width = event.target.value.length + "ch"; if(mangaConnectors === undefined) return; var str : string = event.target.value; setSearchBoxValue(str); if(isValidUri(str)) setSelectedConnector(undefined); const match = str.match(pattern); if(match === null) return; let baseUri = match[1]; const selectCon = mangaConnectors.find((con: IMangaConnector) => { return con.baseUris.find(uri => uri == baseUri); }); if(selectCon != undefined){ setSelectedConnector(selectCon); setSelectedLanguage(selectCon.supportedLanguages[0]); } } const ExecuteSearch : EventHandler = () => { if(searchBoxValue.length < 1 || selectedConnector === undefined || selectedLanguage === ""){ console.error("Tried initiating search while not all fields where submitted.") return; } //console.info(`Searching Name: ${searchBoxValue} Connector: ${selectedConnector.name} Language: ${selectedLanguage}`); if(isValidUri(searchBoxValue) && !selectedConnector.baseUris.find((uri: string) => { const match = searchBoxValue.match(pattern); if(match === null) return false; return match[1] == uri })) { console.error("URL in Searchbox detected, but does not match selected connector."); return; } setLoading(true); if(!isValidUri(searchBoxValue)){ SearchFunctions.SearchNameOnConnector(apiUri, selectedConnector.name, searchBoxValue) .then((mangas: IManga[]) => { setSearchResults(mangas); }) .finally(()=>setLoading(false)); }else{ SearchFunctions.SearchUrl(apiUri, searchBoxValue) .then((manga: IManga) => { setSearchResults([manga]); }) .finally(()=>setLoading(false)); } } const changeSelectedLanguage : ChangeEventHandler = (event) => setSelectedLanguage(event.target.value); let [selectedLibrary, setSelectedLibrary] = useState(null); let [libraries, setLibraries] = useState(null); useEffect(() => { LocalLibraryFunctions.GetLibraries(apiUri).then(setLibraries); }, []); useEffect(() => { if(libraries === null || libraries.length < 1) setSelectedLibrary(null); else setSelectedLibrary(libraries[0]); }, [libraries]); const selectedLibraryChanged : ChangeEventHandler = (event) => { event.preventDefault(); if(libraries === null) return; const selectedLibrary = libraries.find((lib:ILocalLibrary) => lib.localLibraryId == event.target.value); if(selectedLibrary === undefined) return; setSelectedLibrary(selectedLibrary); } return (); }