diff --git a/app/components/IconPicker.tsx b/app/components/IconPicker.tsx index c64239969..4b4d22b7c 100644 --- a/app/components/IconPicker.tsx +++ b/app/components/IconPicker.tsx @@ -7,6 +7,7 @@ import { colorPalette } from "@shared/utils/collections"; import Flex from "~/components/Flex"; import NudeButton from "~/components/NudeButton"; import Text from "~/components/Text"; +import useOnClickOutside from "~/hooks/useOnClickOutside"; import lazyWithRetry from "~/utils/lazyWithRetry"; import DelayedMount from "./DelayedMount"; import { IconLibrary } from "./Icons/IconLibrary"; @@ -41,7 +42,7 @@ function IconPicker({ const theme = useTheme(); const popover = usePopoverState({ gutter: 0, - placement: "bottom-end", + placement: "bottom", modal: true, }); @@ -77,6 +78,20 @@ function IconPicker({ [theme] ); + // Custom click outside handling rather than using `hideOnClickOutside` from reakit so that we can + // prevent event bubbling. + useOnClickOutside( + popover.unstable_popoverRef, + (event) => { + if (popover.visible) { + event.stopPropagation(); + event.preventDefault(); + popover.hide(); + } + }, + { capture: true } + ); + return ( <> @@ -95,7 +110,12 @@ function IconPicker({ )} - + {Object.keys(icons).map((name, index) => ( onChange(color, name)}>