@chakra-ui/react APIs
- ChakraProvider
- Flex
- Box
- Button
- Text
- Heading
- Input
- Link
- Stack
- IconButton
- HStack
- Center
- FormLabel
- BoxProps
- useDisclosure
- FormControl
- Image
- extendTheme
- VStack
- PopoverContent
- PopoverTrigger
- Icon
- InputGroup
- ListItem
- Popover
- PopoverBody
- Select
- Grid
- Alert
- Modal
- ModalOverlay
- ModalContent
- ButtonGroup
- PopoverArrow
- Checkbox
- Tag
- Badge
- Tooltip
- SimpleGrid
- Textarea
- ModalBody
- useToast
- Avatar
- PopoverCloseButton
- useColorModeValue
- Menu
- MenuButton
- MenuItem
- MenuList
- Divider
- AlertIcon
- ButtonProps
- ModalHeader
- Spinner
- PopoverHeader
- FormErrorMessage
- Table
- Thead
- Tbody
- Tr
- Th
- Td
- useColorMode
- InputLeftElement
- ColorModeScript
- ModalFooter
- TabList
- Tab
- Drawer
- DrawerContent
- FlexProps
- DrawerOverlay
- DrawerBody
- Switch
- Accordion
- AccordionItem
- AccordionButton
- AccordionPanel
- AccordionIcon
- Slider
- SliderTrack
- SliderFilledTrack
- SliderThumb
- LinkProps
- ModalCloseButton
- Tabs
- TabPanels
- TabPanel
- List
- Container
- UnorderedList
- FormHelperText
- Code
- TagLabel
- Spacer
- GridItem
- DrawerHeader
- theme
- IconButtonProps
- DrawerCloseButton
- Portal
- Skeleton
- NumberInput
- NumberInputField
- NumberInputStepper
- NumberIncrementStepper
- NumberDecrementStepper
- Progress
- Radio
- AlertTitle
- InputLeftAddon
- MenuDivider
- Wrap
- chakra
- StackProps
- useClipboard
- RadioGroup
- Collapse
- AlertDescription
- InputProps
- ListIcon
- PopoverFooter
- InputRightElement
- AlertDialog
- AlertDialogOverlay
- AlertDialogBody
- AlertDialogContent
- AlertDialogFooter
- AlertDialogHeader
- TagCloseButton
- CloseButton
- CircularProgress
- WrapItem
- SlideFade
- createStandaloneToast
- localStorageManager
- Fade
- useMediaQuery
- AspectRatio
- AvatarGroup
- SelectProps
- Breadcrumb
- BreadcrumbItem
- TextProps
- useTheme
- OrderedList
- HeadingProps
- useBoolean
- TableCaption
- ColorModeProvider
- Theme
- BreadcrumbLink
- InputRightAddon
- Tfoot
- TagLeftIcon
- useBreakpointValue
- AccordionPanelProps
- UseToastOptions
- cookieStorageManager
- ContainerProps
- IconProps
- ListProps
- keyframes
- SkeletonText
- LinkBox
- LinkOverlay
- SliderMark
- useOutsideClick
- AlertDialogCloseButton
- CSSReset
- ThemeConfig
- Circle
- forwardRef
- useInterval
- useMultiStyleConfig
- StylesProvider
- CheckboxGroup
- usePrevious
- styled
- useStyles
- IToast
- ComponentStyleConfig
- BackgroundProps
- toast
- PinInput
- PinInputField
- Slide
- useUpdateEffect
- DarkMode
- LightMode
- AvatarBadge
- MenuButtonProps
- AccordionItemProps
- ListItemProps
- Img
- createIcon
- ColorMode
- ComponentWithAs
- VisuallyHidden
- Editable
- EditableInput
- EditablePreview
- DrawerFooter
- useMergeRefs
Other Related APIs
@chakra-ui/react#useOutsideClick TypeScript Examples
The following examples show how to use
@chakra-ui/react#useOutsideClick.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: ContextMenuList.tsx From wiregui with MIT License | 4 votes |
ContextMenuList: React.FC<Props & MotionBoxProps> = ({
children,
menuId,
render,
...boxProps
}) => {
const [contextMenusState, setContextMenusState] =
useRecoilState(contextMenusAtom);
const menuRef: RefObject<HTMLDivElement> = useRef(null);
const menu = useMemo(
() => contextMenusState.menus.find((m) => m.id === menuId),
[contextMenusState]
);
// where should the menu be shown?
// the ContextMenuTrigger sets this
const [position, setPosition] = useState<Position>({
left: -100,
right: 0,
top: -100,
bottom: 0,
});
// TODO: Any less manual way to do this
// figure out where to show the menu
useEffect(() => {
let left: number | undefined;
let right: number | undefined;
let top: number | undefined;
let bottom: number | undefined;
const x = contextMenusState.position.x;
const y = contextMenusState.position.y;
const menuHeight = menuRef?.current?.clientHeight;
const menuWidth = menuRef?.current?.clientWidth;
const windowWidth = window.innerWidth;
const windowHeight = window.innerHeight;
if (!menuHeight || !menuWidth) {
return;
}
if (x + menuWidth > windowWidth) {
right = windowWidth - x;
} else {
left = x;
}
if (y + menuHeight > windowHeight) {
bottom = windowHeight - y;
} else {
top = y;
}
setPosition({
top: `${top}px`,
bottom: `${bottom}px`,
left: `${left}px`,
right: `${right}px`,
});
}, [menuRef, contextMenusState.position.x, contextMenusState.position.y]);
// when clicking outside the menu, close it
useOutsideClick({
ref: menuRef,
handler: () => {
// close all menus
closeContextMenus();
},
});
const bgColor = useColorModeValue("gray.50", "gray.300");
const closeContextMenus = () => {
setContextMenusState((oldState) => {
return {
...oldState,
position: {
x: -100,
y: -100,
},
menus: oldState.menus.map((m) => ({
...m,
isOpen: false,
})),
};
});
};
return (
<MotionBox
variants={motionVariants}
animate={menu && menu.isOpen ? "enter" : "exit"}
ref={menuRef}
borderWidth={1}
position="fixed"
bg={bgColor}
minW={40}
w={52}
// maxW={96}
borderRadius="md"
display="flex"
flexDirection="column"
zIndex="popover"
{...position}
{...boxProps}
>
{/* either use the render prop or the children */}
{render
? render({
menuId,
closeContextMenus,
passData: contextMenusState.passData,
})
: children}
</MotionBox>
);
}