aboutsummaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/components/TTDDialog/TTDDialogTabs.tsx
diff options
context:
space:
mode:
authorkj_sh6042026-03-15 16:19:35 -0400
committerkj_sh6042026-03-15 16:19:35 -0400
commit6ec259a0e71174651bae95d4628138bf6fd68742 (patch)
tree5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/components/TTDDialog/TTDDialogTabs.tsx
parent16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff)
refactor: packages/
Diffstat (limited to 'packages/excalidraw/components/TTDDialog/TTDDialogTabs.tsx')
-rw-r--r--packages/excalidraw/components/TTDDialog/TTDDialogTabs.tsx55
1 files changed, 55 insertions, 0 deletions
diff --git a/packages/excalidraw/components/TTDDialog/TTDDialogTabs.tsx b/packages/excalidraw/components/TTDDialog/TTDDialogTabs.tsx
new file mode 100644
index 0000000..439f928
--- /dev/null
+++ b/packages/excalidraw/components/TTDDialog/TTDDialogTabs.tsx
@@ -0,0 +1,55 @@
+import * as RadixTabs from "@radix-ui/react-tabs";
+import type { ReactNode } from "react";
+import { useRef } from "react";
+import { useExcalidrawSetAppState } from "../App";
+import { isMemberOf } from "../../utils";
+
+const TTDDialogTabs = (
+ props: {
+ children: ReactNode;
+ } & { dialog: "ttd"; tab: "text-to-diagram" | "mermaid" },
+) => {
+ const setAppState = useExcalidrawSetAppState();
+
+ const rootRef = useRef<HTMLDivElement>(null);
+ const minHeightRef = useRef<number>(0);
+
+ return (
+ <RadixTabs.Root
+ ref={rootRef}
+ className="ttd-dialog-tabs-root"
+ value={props.tab}
+ onValueChange={(
+ // at least in test enviros, `tab` can be `undefined`
+ tab: string | undefined,
+ ) => {
+ if (!tab) {
+ return;
+ }
+ const modalContentNode =
+ rootRef.current?.closest<HTMLElement>(".Modal__content");
+ if (modalContentNode) {
+ const currHeight = modalContentNode.offsetHeight || 0;
+ if (currHeight > minHeightRef.current) {
+ minHeightRef.current = currHeight;
+ modalContentNode.style.minHeight = `min(${minHeightRef.current}px, 100%)`;
+ }
+ }
+ if (
+ props.dialog === "ttd" &&
+ isMemberOf(["text-to-diagram", "mermaid"], tab)
+ ) {
+ setAppState({
+ openDialog: { name: props.dialog, tab },
+ });
+ }
+ }}
+ >
+ {props.children}
+ </RadixTabs.Root>
+ );
+};
+
+TTDDialogTabs.displayName = "TTDDialogTabs";
+
+export default TTDDialogTabs;