diff --git a/apps/web/components/Embed.tsx b/apps/web/components/Embed.tsx index 503e50b8da..462a8cb7da 100644 --- a/apps/web/components/Embed.tsx +++ b/apps/web/components/Embed.tsx @@ -20,10 +20,10 @@ import { Switch, TextArea, TextField, + ColorPicker, } from "@calcom/ui"; import { FiCode, FiTrello, FiSun, FiArrowLeft, FiChevronRight } from "@calcom/ui/components/icon"; -import ColorPicker from "@components/ui/colorpicker"; import Select from "@components/ui/form/Select"; type EmbedType = "inline" | "floating-popup" | "element-click"; diff --git a/apps/web/components/ui/colorpicker.tsx b/apps/web/components/ui/colorpicker.tsx deleted file mode 100644 index 214ed6a6f8..0000000000 --- a/apps/web/components/ui/colorpicker.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { useCallback, useRef, useState } from "react"; -import { useEffect } from "react"; -import { HexColorInput, HexColorPicker } from "react-colorful"; - -import { isValidHexCode, fallBackHex } from "@calcom/lib/CustomBranding"; -import { Swatch } from "@calcom/ui"; - -type Handler = (event: MouseEvent | Event) => void; -function useEventListener< - KW extends keyof WindowEventMap, - KH extends keyof HTMLElementEventMap, - T extends HTMLElement | void = void ->( - eventName: KW | KH, - handler: (event: WindowEventMap[KW] | HTMLElementEventMap[KH] | Event) => void, - element?: React.RefObject -) { - // Create a ref that stores handler - const savedHandler = useRef(); - useEffect(() => { - // Define the listening target - const targetElement: T | Window = element?.current || window; - if (!(targetElement && targetElement.addEventListener)) { - return; - } - // Update saved handler if necessary - if (savedHandler.current !== handler) { - savedHandler.current = handler; - } - // Create event listener that calls handler function stored in ref - const eventListener: typeof handler = (event) => { - // eslint-disable-next-line no-extra-boolean-cast - if (!!savedHandler?.current) { - savedHandler.current(event); - } - }; - targetElement.addEventListener(eventName, eventListener); - // Remove event listener on cleanup - return () => { - targetElement.removeEventListener(eventName, eventListener); - }; - }, [eventName, element, handler]); -} - -function useOnClickOutside( - ref: React.RefObject, - handler: Handler, - mouseEvent: "mousedown" | "mouseup" = "mousedown" -): void { - useEventListener(mouseEvent, (event) => { - const el = ref?.current; - // Do nothing if clicking ref's element or descendent elements - if (!el || el.contains(event.target as Node)) { - return; - } - handler(event); - }); -} -export type ColorPickerProps = { - defaultValue: string; - onChange: (text: string) => void; -}; - -const ColorPicker = (props: ColorPickerProps) => { - const init = !isValidHexCode(props.defaultValue) - ? fallBackHex(props.defaultValue, false) - : props.defaultValue; - const [color, setColor] = useState(init); - const [isOpen, toggle] = useState(false); - const popover = useRef() as React.MutableRefObject; - const close = useCallback(() => toggle(false), []); - useOnClickOutside(popover, close); - return ( -
- toggle(!isOpen)} /> - - {isOpen && ( -
- { - setColor(val); - props.onChange(val); - }} - /> -
- )} - { - setColor(val); - props.onChange(val); - }} - type="text" - /> -
- ); -}; - -export default ColorPicker; diff --git a/packages/ui/components/form/color-picker/colorpicker.tsx b/packages/ui/components/form/color-picker/colorpicker.tsx index 93ef5da340..e12da54ce8 100644 --- a/packages/ui/components/form/color-picker/colorpicker.tsx +++ b/packages/ui/components/form/color-picker/colorpicker.tsx @@ -1,61 +1,9 @@ -import { useCallback, useEffect, useRef, useState } from "react"; +import * as Popover from "@radix-ui/react-popover"; +import { useState } from "react"; import { HexColorInput, HexColorPicker } from "react-colorful"; import { fallBackHex, isValidHexCode } from "@calcom/lib/CustomBranding"; -import { Swatch } from "../../.."; - -type Handler = (event: MouseEvent | Event) => void; -function useEventListener< - KW extends keyof WindowEventMap, - KH extends keyof HTMLElementEventMap, - T extends HTMLElement | void = void ->( - eventName: KW | KH, - handler: (event: WindowEventMap[KW] | HTMLElementEventMap[KH] | Event) => void, - element?: React.RefObject -) { - // Create a ref that stores handler - const savedHandler = useRef(); - useEffect(() => { - // Define the listening target - const targetElement: T | Window = element?.current || window; - if (!(targetElement && targetElement.addEventListener)) { - return; - } - // Update saved handler if necessary - if (savedHandler.current !== handler) { - savedHandler.current = handler; - } - // Create event listener that calls handler function stored in ref - const eventListener: typeof handler = (event) => { - // eslint-disable-next-line no-extra-boolean-cast - if (!!savedHandler?.current) { - savedHandler.current(event); - } - }; - targetElement.addEventListener(eventName, eventListener); - // Remove event listener on cleanup - return () => { - targetElement.removeEventListener(eventName, eventListener); - }; - }, [eventName, element, handler]); -} - -function useOnClickOutside( - ref: React.RefObject, - handler: Handler, - mouseEvent: "mousedown" | "mouseup" = "mousedown" -): void { - useEventListener(mouseEvent, (event) => { - const el = ref?.current; - // Do nothing if clicking ref's element or descendent elements - if (!el || el.contains(event.target as Node)) { - return; - } - handler(event); - }); -} export type ColorPickerProps = { defaultValue: string; onChange: (text: string) => void; @@ -66,27 +14,35 @@ const ColorPicker = (props: ColorPickerProps) => { ? fallBackHex(props.defaultValue, false) : props.defaultValue; const [color, setColor] = useState(init); - const [isOpen, toggle] = useState(false); - const popover = useRef() as React.MutableRefObject; - const close = useCallback(() => toggle(false), []); - useOnClickOutside(popover, close); + return ( -
- toggle(!isOpen)} /> - {isOpen && ( -
- { - setColor(val); - props.onChange(val); - }} - /> +
+ +
+ +
- )} + + + { + setColor(val); + props.onChange(val); + }} + /> + + +
+ { setColor(val); diff --git a/packages/ui/components/swatch/Swatch.tsx b/packages/ui/components/swatch/Swatch.tsx deleted file mode 100644 index 79f2beb1cb..0000000000 --- a/packages/ui/components/swatch/Swatch.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import classNames from "@calcom/lib/classNames"; - -export type SwatchProps = { - size?: "base" | "sm" | "lg"; - backgroundColor: string; - onClick: () => void; -}; - -const Swatch = (props: SwatchProps) => { - const { size, backgroundColor, onClick } = props; - return ( -
-
-
- ); -}; - -export default Swatch; diff --git a/packages/ui/components/swatch/index.ts b/packages/ui/components/swatch/index.ts deleted file mode 100644 index c7ce1e2c10..0000000000 --- a/packages/ui/components/swatch/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as Swatch } from "./Swatch"; diff --git a/packages/ui/index.tsx b/packages/ui/index.tsx index 7f4ab4d00b..95d1d42934 100644 --- a/packages/ui/index.tsx +++ b/packages/ui/index.tsx @@ -109,7 +109,6 @@ export { export type { DialogProps, ConfirmationDialogContentProps } from "./components/dialog"; export { showToast } from "./components/toast"; // We don't export the toast components as they are only used in local storybook file export { Meta, MetaProvider, useMeta } from "./components/meta"; -export { Swatch } from "./components/swatch"; export { ShellSubHeading } from "./components/layout"; /** ⬇️ TODO - Move these to components */