import { useContext, useEffect, useState } from "react"; import { TorrentId, ErrorDetails as ApiErrorDetails } from "./api-types"; import { AppContext, APIContext } from "./context"; import { RootContent } from "./components/RootContent"; import { customSetInterval } from "./helper/customSetInterval"; import { IconButton } from "./components/buttons/IconButton"; import { BsBodyText } from "react-icons/bs"; import { LogStreamModal } from "./components/modal/LogStreamModal"; import { Header } from "./components/Header"; export interface ErrorWithLabel { text: string; details?: ApiErrorDetails; } export interface ContextType { setCloseableError: (error: ErrorWithLabel | null) => void; refreshTorrents: () => void; } export const RqbitWebUI = (props: { title: string; menuButtons?: JSX.Element[]; }) => { const [closeableError, setCloseableError] = useState( null ); const [otherError, setOtherError] = useState(null); const [torrents, setTorrents] = useState | null>(null); const [torrentsLoading, setTorrentsLoading] = useState(false); let [logsOpened, setLogsOpened] = useState(false); const API = useContext(APIContext); const refreshTorrents = async () => { setTorrentsLoading(true); let torrents = await API.listTorrents().finally(() => setTorrentsLoading(false) ); setTorrents(torrents.torrents); }; useEffect(() => { return customSetInterval( async () => refreshTorrents().then( () => { setOtherError(null); return 5000; }, (e) => { setOtherError({ text: "Error refreshing torrents", details: e }); console.error(e); return 5000; } ), 0 ); }, []); const context: ContextType = { setCloseableError, refreshTorrents, }; return (
{/* Menu buttons */}
{props.menuButtons && props.menuButtons.map((b, i) => {b})} setLogsOpened(true)}>
setLogsOpened(false)} /> ); };