UNPKG

react-garden

Version:

React + TypeScript + ThreeJS app using Material UI on NextJS, Apollo Client, GraphQL + WordPress REST APIs, for ThreeD web development.. a part of the threed.ai code family.

114 lines (102 loc) 3.26 kB
// ** React Imports import { useEffect, useRef, useState } from 'react' // ** MUI Imports import Grow from '@mui/material/Grow' import Paper from '@mui/material/Paper' import Button from '@mui/material/Button' import Popper from '@mui/material/Popper' import MenuList from '@mui/material/MenuList' import MenuItem from '@mui/material/MenuItem' import ClickAwayListener from '@mui/material/ClickAwayListener' // ** Hook Import import { useSettings } from '~/@core/hooks/useSettings' const MenuComposition = () => { // ** States const [open, setOpen] = useState(false) // ** Hook & Var const { settings } = useSettings() const { skin } = settings // ** Ref const anchorRef = useRef(null) const handleToggle = () => { setOpen(prevOpen => !prevOpen) } const handleClose = event => { if (anchorRef.current && anchorRef.current.contains(event.target)) { return } setOpen(false) } const handleListKeyDown = event => { if (event.key === 'Tab') { event.preventDefault() setOpen(false) } else if (event.key === 'Escape') { setOpen(false) } } // return focus to the button when we transitioned from !open -> open const prevOpen = useRef(open) useEffect(() => { if (prevOpen.current === true && open === false) { anchorRef.current.focus() } prevOpen.current = open }, [open]) return ( <div> <Button ref={anchorRef} variant='outlined' aria-haspopup='true' onClick={handleToggle} id='composition-button' aria-expanded={open ? 'true' : undefined} aria-controls={open ? 'composition-menu' : undefined} sx={{ '& + div': { zIndex: theme => theme.zIndex.modal } }} > Open Menu </Button> <Popper transition open={open} disablePortal role={undefined} placement='bottom-start' anchorEl={anchorRef.current} popperOptions={{ modifiers: [ { name: 'flip', options: { enabled: true, boundary: 'window' } } ] }} > {({ TransitionProps, placement }) => ( <Grow {...TransitionProps} style={{ transformOrigin: placement === 'bottom-start' ? 'left top' : 'left bottom' }} > <Paper elevation={skin === 'bordered' ? 0 : 6} sx={skin === 'bordered' ? { border: theme => `1px solid ${theme.palette.divider}` } : {}} > <ClickAwayListener onClickAway={() => setOpen(false)}> <MenuList autoFocusItem={open} id='composition-menu' onKeyDown={handleListKeyDown}> <MenuItem onClick={handleClose}>Profile</MenuItem> <MenuItem onClick={handleClose}>My account</MenuItem> <MenuItem onClick={handleClose}>Logout</MenuItem> </MenuList> </ClickAwayListener> </Paper> </Grow> )} </Popper> </div> ) } export default MenuComposition