diff --git a/tranga-website/src/App.tsx b/tranga-website/src/App.tsx index fb9fb4e..68c4a0f 100644 --- a/tranga-website/src/App.tsx +++ b/tranga-website/src/App.tsx @@ -7,6 +7,7 @@ import {V2} from "./apiClient/V2.ts"; import { ApiContext } from './apiClient/ApiContext.tsx'; import MangaList from "./Components/Mangas/MangaList.tsx"; import {FileLibrary, Manga, MangaConnector} from "./apiClient/data-contracts.ts"; +import Search from "./Components/Search.tsx"; export const MangaConnectorContext = createContext([]); export const MangaContext = createContext([]); @@ -63,7 +64,9 @@ export default function App () { - + + + diff --git a/tranga-website/src/Components/Mangas/MangaList.tsx b/tranga-website/src/Components/Mangas/MangaList.tsx index 5e80681..742901b 100644 --- a/tranga-website/src/Components/Mangas/MangaList.tsx +++ b/tranga-website/src/Components/Mangas/MangaList.tsx @@ -1,14 +1,14 @@ -import {useContext} from "react"; +import {ReactNode} from "react"; import {MangaCard} from "./MangaCard.tsx"; import {Stack} from "@mui/joy"; import "./MangaList.css"; -import {MangaContext} from "../../App.tsx"; +import {Manga} from "../../apiClient/data-contracts.ts"; -export default function MangaList (){ - const mangas = useContext(MangaContext); - +export default function MangaList ({mangas, children} : {mangas: Manga[], children?: ReactNode}) { + return ( + {children} {mangas?.map(manga => )} ); diff --git a/tranga-website/src/Components/Search.tsx b/tranga-website/src/Components/Search.tsx new file mode 100644 index 0000000..065dc9a --- /dev/null +++ b/tranga-website/src/Components/Search.tsx @@ -0,0 +1,115 @@ +import {Dispatch, KeyboardEventHandler, ReactNode, useContext, useState} from "react"; +import { + Badge, Button, + Card, + CardContent, + CardCover, + Input, + Modal, + ModalDialog, Option, Select, + Step, + StepIndicator, + Stepper, + Typography +} from "@mui/joy"; +import ModalClose from "@mui/joy/ModalClose"; +import {MangaConnectorContext} from "../App.tsx"; +import {Manga, MangaConnector} from "../apiClient/data-contracts.ts"; +import MangaList from "./Mangas/MangaList.tsx"; +import {ApiContext} from "../apiClient/ApiContext.tsx"; + +export default function () : ReactNode { + const [open, setOpen] = useState(false); + + return ( + + {if (!open) setOpen(true)}} className={"manga-card"}> + + + + + + Add + + + + + + + ); +} + +function SearchDialog ({open, setOpen} : {open: boolean, setOpen: Dispatch}) : ReactNode { + const mangaConnectors = useContext(MangaConnectorContext); + const Api = useContext(ApiContext); + + const [selectedMangaConnector, setSelectedMangaConnector] = useState(undefined); + const [searchTerm, setSearchTerm] = useState(); + const [searchResults, setSearchResults] = useState([]); + + const doTheSearch = () => { + if (searchTerm === undefined || searchTerm.length < 1) + return; + if (!isUrl(searchTerm) && selectedMangaConnector === undefined) + return; + + if (isUrl(searchTerm)) + Api.searchUrlCreate(searchTerm) + .then(response => { + if (response.ok) + setSearchResults([response.data]); + }); + else + Api.searchDetail(selectedMangaConnector!.name, searchTerm) + .then(response => { + if(response.ok) + setSearchResults(response.data); + }); + } + + const isUrl = (url: string) => { + try{ + new URL(url); + return true; + }catch (Error){ + return false; + } + } + + const keyDownCheck : KeyboardEventHandler = (e) => { + if (e.key === "Enter") { + doTheSearch(); + } + } + + return ( + setOpen(false)}> + + + + 1}> + Connector + + + 2}> + Search + setSearchTerm(e.currentTarget.value)} + endDecorator={} + /> + + 3}> + Result + + + + + + ); +} \ No newline at end of file