pstream is dead; long live pstream
taciturnaxolotl.github.io/pstream-ng/
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}