From 3d2e00458db4c528fc68d4e135d19cde3d8019f7 Mon Sep 17 00:00:00 2001 From: Tanish Manku Date: Mon, 24 Feb 2025 23:21:44 -0800 Subject: [PATCH] Copy Paint mode's color picker into its own file --- .../features/ToolbarMain/ToolbarMain.tsx | 3 +- .../ui/ToolbarMain/PaintModeMenu.tsx | 174 ++++++++++++++++++ 2 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 frontend/realtime/src/components/ui/ToolbarMain/PaintModeMenu.tsx diff --git a/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx b/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx index 8bae9131af..386003f2fb 100644 --- a/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx +++ b/frontend/realtime/src/components/features/ToolbarMain/ToolbarMain.tsx @@ -25,6 +25,7 @@ import { ToolbarMainButtonNames } from "./enum"; import { dispatchUiEvents, uiEvents } from "~/signals/uiEvents"; import { paintColor } from "~/signals/uiEvents/toolbarMain/paintMode"; import { ColorPicker } from "~/components/ui/TextEditor/ColorPicker"; +import { PaintModeMenu } from "~/components/ui/ToolbarMain/PaintModeMenu"; export const ToolbarMain = ({ disabled = false, @@ -157,7 +158,7 @@ export const ToolbarMain = ({
{buttonProps.PAINT.active ? (
- void; + faIcon?: IconDefinition; + borderStyle?: string; + showBar?: boolean; + anchor?: "top" | "right" | "bottom" | "left"; + anchorGap?: number; + fillBg?: boolean; + staticIconColor?: string; + streamChanges?: boolean; + defaultOpen?: boolean; + closeOnMouseLeave?: boolean; +}) => { + const [isOpen, setIsOpen] = useState(defaultOpen); + const [{ currColor, textInput }, setStates] = useState<{ + currColor: string; + textInput: string; + }>({ + currColor: prevColor, + textInput: prevColor.substring(1), + }); + + useEffect(() => { + setIsOpen(defaultOpen); + }, [defaultOpen]); + + const handleMouseLeave = (close: () => void) => { + if (closeOnMouseLeave) { + onChange(currColor); + setIsOpen(false); + close(); + } + }; + + const handleTextInput = (e: ChangeEvent) => { + if (isHexColorCode(e.target.value)) { + setStates({ + currColor: `#${e.target.value}`, + textInput: e.target.value, + }); + } else { + setStates((curr) => ({ + ...curr, + textInput: e.target.value, + })); + } + }; + + const isHexColorCode = (color: string) => { + const hexColorRegex = /^(?:[0-9a-fA-F]{3}){1,2}$/; + return hexColorRegex.test(color); + }; + + return ( + + {({ open, close }) => ( + <> + defaultOpen && setIsOpen(true)} + > + + {showBar && ( + + )} + + {(open || isOpen) && ( +
handleMouseLeave(close)}> + + { + setStates({ + currColor: color, + textInput: color.substring(1), + }); + if (streamChanges) { + onChange(color); + } + }} + /> + + {!closeOnMouseLeave && ( +
+ + +
+ )} +
+
+ )} + + )} +
+ ); +};