import styled from 'styles' import * as ContextMenu from '@radix-ui/react-context-menu' import * as DropdownMenu from '@radix-ui/react-dropdown-menu' import * as Dialog from '@radix-ui/react-dialog' import { IconWrapper, RowButton } from 'components/shared' import { CheckIcon, ChevronDownIcon, PlusIcon } from '@radix-ui/react-icons' import * as Panel from '../panel' import state, { useSelector } from 'state' import { useEffect, useRef, useState } from 'react' export default function PagePanel() { const rIsOpen = useRef(false) const [isOpen, setIsOpen] = useState(false) useEffect(() => { if (rIsOpen.current !== isOpen) { rIsOpen.current = isOpen } }, [isOpen]) const documentPages = useSelector((s) => s.data.document.pages) const currentPageId = useSelector((s) => s.data.currentPageId) if (!documentPages[currentPageId]) return null const sorted = Object.values(documentPages).sort( (a, b) => a.childIndex - b.childIndex ) return ( { if (rIsOpen.current !== isOpen) { setIsOpen(isOpen) } }} > {documentPages[currentPageId].name} { setIsOpen(false) state.send('CHANGED_PAGE', { id }) }} > {sorted.map(({ id, name }) => ( {name} state.send('RENAMED_PAGE', { id })} > Rename { setIsOpen(false) state.send('DELETED_PAGE', { id }) }} > Delete ))} { setIsOpen(false) state.send('CREATED_PAGE') }} > Create Page ) } const PanelRoot = styled('div', { marginLeft: 8, zIndex: 200, overflow: 'hidden', position: 'relative', display: 'flex', flexDirection: 'column', alignItems: 'center', pointerEvents: 'all', padding: '2px', borderRadius: '4px', backgroundColor: '$panel', border: '1px solid $panel', boxShadow: '0px 2px 4px rgba(0,0,0,.2)', userSelect: 'none', }) const Content = styled(Panel.Content, { width: '100%', minWidth: 128, }) const StyledRadioItem = styled(DropdownMenu.RadioItem, { height: 32, width: 'auto', display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '0 6px 0 12px', cursor: 'pointer', borderRadius: '4px', fontSize: '$1', fontFamily: '$ui', backgroundColor: 'transparent', outline: 'none', variants: { bp: { mobile: {}, small: { '&:hover': { backgroundColor: '$hover', }, '&:focus-within': { backgroundColor: '$hover', }, }, }, }, }) const StyledContextMenuContent = styled(ContextMenu.Content, { padding: '2px', borderRadius: '4px', backgroundColor: '$panel', border: '1px solid $panel', boxShadow: '0px 2px 4px rgba(0,0,0,.2)', }) const StyledContextMenuItem = styled(ContextMenu.Item, { height: 32, width: '100%', display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '0 12px 0 12px', cursor: 'pointer', borderRadius: '4px', fontSize: '$1', fontFamily: '$ui', backgroundColor: 'transparent', outline: 'none', bp: { mobile: {}, small: { '&:hover:not(:disabled)': { backgroundColor: '$hover', }, }, }, }) const StyledOverlay = styled(Dialog.Overlay, { backgroundColor: 'rgba(0, 0, 0, .15)', position: 'fixed', top: 0, right: 0, bottom: 0, left: 0, }) const StyledContent = styled(Dialog.Content, { position: 'fixed', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', minWidth: 200, maxWidth: 'fit-content', maxHeight: '85vh', padding: 20, marginTop: '-5vh', backgroundColor: 'white', borderRadius: 6, '&:focus': { outline: 'none', }, })