aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/components/dialog/DialogProvider.tsx
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2023-09-21 15:35:27 +0800
committercrupest <crupest@outlook.com>2023-09-21 15:35:27 +0800
commitc7d2545ec7bbcdba30b775453d53df5a359410bd (patch)
tree768668b9d1b2cd835212c3a3567dd8f54700a7fa /FrontEnd/src/components/dialog/DialogProvider.tsx
parentf836d77e73f3ea0af45c5f71dae7268143d6d86f (diff)
downloadtimeline-c7d2545ec7bbcdba30b775453d53df5a359410bd.tar.gz
timeline-c7d2545ec7bbcdba30b775453d53df5a359410bd.tar.bz2
timeline-c7d2545ec7bbcdba30b775453d53df5a359410bd.zip
Revert dialog.
Diffstat (limited to 'FrontEnd/src/components/dialog/DialogProvider.tsx')
-rw-r--r--FrontEnd/src/components/dialog/DialogProvider.tsx95
1 files changed, 0 insertions, 95 deletions
diff --git a/FrontEnd/src/components/dialog/DialogProvider.tsx b/FrontEnd/src/components/dialog/DialogProvider.tsx
deleted file mode 100644
index bb85e4cf..00000000
--- a/FrontEnd/src/components/dialog/DialogProvider.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-import { useState, useContext, createContext, ReactNode } from "react";
-
-import { UiLogicError } from "../common";
-
-type DialogMap<D extends string> = {
- [K in D]: ReactNode;
-};
-
-interface DialogController<D extends string> {
- currentDialog: D | null;
- currentDialogReactNode: ReactNode;
- canSwitchDialog: boolean;
- switchDialog: (newDialog: D | null) => void;
- setCanSwitchDialog: (enable: boolean) => void;
- closeDialog: () => void;
- forceSwitchDialog: (newDialog: D | null) => void;
- forceCloseDialog: () => void;
-}
-
-export function useDialog<D extends string>(
- dialogs: DialogMap<D>,
- options?: {
- initDialog?: D | null;
- onClose?: {
- [K in D]?: () => void;
- };
- },
-): {
- controller: DialogController<D>;
- switchDialog: (newDialog: D | null) => void;
- forceSwitchDialog: (newDialog: D | null) => void;
- createDialogSwitch: (newDialog: D | null) => () => void;
-} {
- const [canSwitchDialog, setCanSwitchDialog] = useState<boolean>(true);
- const [dialog, setDialog] = useState<D | null>(options?.initDialog ?? null);
-
- const forceSwitchDialog = (newDialog: D | null) => {
- if (dialog != null) {
- options?.onClose?.[dialog]?.();
- }
- setDialog(newDialog);
- setCanSwitchDialog(true);
- };
-
- const switchDialog = (newDialog: D | null) => {
- if (canSwitchDialog) {
- forceSwitchDialog(newDialog);
- }
- };
-
- const controller: DialogController<D> = {
- currentDialog: dialog,
- currentDialogReactNode: dialog == null ? null : dialogs[dialog],
- canSwitchDialog,
- switchDialog,
- setCanSwitchDialog,
- closeDialog: () => switchDialog(null),
- forceSwitchDialog,
- forceCloseDialog: () => forceSwitchDialog(null),
- };
-
- return {
- controller,
- switchDialog,
- forceSwitchDialog,
- createDialogSwitch: (newDialog: D | null) => () => switchDialog(newDialog),
- };
-}
-
-const DialogControllerContext = createContext<DialogController<string> | null>(
- null,
-);
-
-export function useDialogController(): DialogController<string> {
- const controller = useContext(DialogControllerContext);
- if (controller == null) throw new UiLogicError("not in dialog provider");
- return controller;
-}
-
-export function useCloseDialog(): () => void {
- const controller = useDialogController();
- return controller.closeDialog;
-}
-
-export function DialogProvider<D extends string>({
- controller,
-}: {
- controller: DialogController<D>;
-}) {
- return (
- <DialogControllerContext.Provider value={controller as never}>
- {controller.currentDialogReactNode}
- </DialogControllerContext.Provider>
- );
-}