pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
at main 82 lines 2.9 kB view raw
1import { useCallback, useState } from "react"; 2import { useTranslation } from "react-i18next"; 3 4import { Button } from "@/components/buttons/Button"; 5import { ThinContainer } from "@/components/layout/ThinContainer"; 6import { Heading1, Paragraph } from "@/components/utils/Text"; 7import { Transition } from "@/components/utils/Transition"; 8import { useEmbedOrderState } from "@/hooks/useEmbedOrderState"; 9import { SubPageLayout } from "@/pages/layouts/SubPageLayout"; 10import { ConfigValuesPart } from "@/pages/parts/admin/ConfigValuesPart"; 11import { M3U8TestPart } from "@/pages/parts/admin/M3U8TestPart"; 12import { TMDBTestPart } from "@/pages/parts/admin/TMDBTestPart"; 13import { WorkerTestPart } from "@/pages/parts/admin/WorkerTestPart"; 14 15import { BackendTestPart } from "../parts/admin/BackendTestPart"; 16import { EmbedOrderPart } from "../parts/admin/EmbedOrderPart"; 17 18export function AdminPage() { 19 const { t } = useTranslation(); 20 const [isSaving, setIsSaving] = useState(false); 21 const embedOrderState = useEmbedOrderState(); 22 23 const handleSaveChanges = useCallback(async () => { 24 setIsSaving(true); 25 try { 26 await embedOrderState.saveChanges(); 27 } catch (error) { 28 console.error("Failed to save embed order changes:", error); 29 } finally { 30 setIsSaving(false); 31 } 32 }, [embedOrderState]); 33 34 return ( 35 <SubPageLayout> 36 <ThinContainer> 37 <Heading1>Admin tools</Heading1> 38 <Paragraph> 39 Silly tools used to test pstream-ng! ´˶ . 40 </Paragraph> 41 42 <ConfigValuesPart /> 43 <BackendTestPart /> 44 <WorkerTestPart /> 45 <TMDBTestPart /> 46 <M3U8TestPart /> 47 <EmbedOrderPart 48 embedOrder={embedOrderState.embedOrder} 49 setEmbedOrder={embedOrderState.setEmbedOrder} 50 enableEmbedOrder={embedOrderState.enableEmbedOrder} 51 setEnableEmbedOrder={embedOrderState.setEnableEmbedOrder} 52 /> 53 {/* <ProgressCleanupPart /> */} 54 </ThinContainer> 55 56 <Transition 57 animation="fade" 58 show={embedOrderState.hasChanges} 59 className="bg-settings-saveBar-background border-t border-settings-card-border/50 py-4 transition-opacity w-full fixed bottom-0 flex justify-between flex-col md:flex-row px-8 items-start md:items-center gap-3 z-[999]" 60 > 61 <p className="text-type-danger">{t("settings.unsaved")}</p> 62 <div className="space-x-3 w-full md:w-auto flex"> 63 <Button 64 className="w-full md:w-auto" 65 theme="secondary" 66 onClick={embedOrderState.reset} 67 > 68 {t("settings.reset")} 69 </Button> 70 <Button 71 className="w-full md:w-auto" 72 theme="purple" 73 loading={isSaving} 74 onClick={handleSaveChanges} 75 > 76 {t("settings.save")} 77 </Button> 78 </div> 79 </Transition> 80 </SubPageLayout> 81 ); 82}