diff --git a/tranga-website/src/Components/Search.tsx b/tranga-website/src/Components/Search.tsx index 2825d3e..c10ce01 100644 --- a/tranga-website/src/Components/Search.tsx +++ b/tranga-website/src/Components/Search.tsx @@ -21,7 +21,7 @@ import {useCallback, useContext, useEffect, useState} from "react"; import {ApiUriContext} from "../api/fetchApi.tsx"; import {GetAllConnectors} from "../api/MangaConnector.tsx"; import IManga from "../api/types/IManga.ts"; -import {SearchNameOnConnector} from "../api/Search.tsx"; +import {SearchNameOnConnector, SearchUrl} from "../api/Search.tsx"; import {Manga} from "./Manga.tsx"; import Add from "@mui/icons-material/Add"; import React from "react"; @@ -32,7 +32,7 @@ import { LibraryBooks } from "@mui/icons-material"; export default function Search({open, setOpen}:{open:boolean, setOpen:React.Dispatch>}){ - const [step, setStep] = useState(1); + const [step, setStep] = useState(2); const apiUri = useContext(ApiUriContext); const [mangaConnectors, setMangaConnectors] = useState(); @@ -48,14 +48,28 @@ export default function Search({open, setOpen}:{open:boolean, setOpen:React.Disp const [resultsLoading, setResultsLoading] = useState(false); const StartSearch = useCallback((mangaConnector : IMangaConnector | undefined, value: string)=>{ - setStep(3); - if(mangaConnector === undefined) + if(mangaConnector === undefined && !IsValidUrl(value)) return; - setResults([]); + setResults(undefined); setResultsLoading(true); - SearchNameOnConnector(apiUri, mangaConnector.name, value).then(setResults).finally(() => setResultsLoading(false)); + setStep(3); + if (IsValidUrl(value)){ + SearchUrl(apiUri, value).then((r) => setResults([r])).finally(() => setResultsLoading(false)); + }else if (mangaConnector != undefined){ + SearchNameOnConnector(apiUri, mangaConnector.name, value).then(setResults).finally(() => setResultsLoading(false)); + } },[apiUri]) + function IsValidUrl(str : string) : boolean { + const pattern = new RegExp('^(https?:\\/\\/)?'+ // protocol + '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // domain name + '((\\d{1,3}\\.){3}\\d{1,3}))'+ // OR ip (v4) address + '(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // port and path + '(\\?[;&a-z\\d%_.~+=-]*)?'+ // query string + '(\\#[-a-z\\d_]*)?$','i'); // fragment locator + return !!pattern.test(str); + } + const [localLibraries, setLocalLibraries] = useState(); const [localLibrariesLoading, setLocalLibrariesLoading] = useState(true); const [selectedLibraryId, setSelectedLibraryId] = useState(); @@ -101,12 +115,12 @@ export default function Search({open, setOpen}:{open:boolean, setOpen:React.Disp + 1 }> { + { setStep(2); - setResults([]); + setResults(undefined); if(e.key === "Enter") { StartSearch(selectedMangaConnector, e.currentTarget.value); } @@ -143,7 +158,7 @@ export default function Search({open, setOpen}:{open:boolean, setOpen:React.Disp 3 }> - {results?.length}}>Results + {results?.length??"-"}}>Results {results?.map((result) =>