Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
  2. import styled from 'styles'
  3. import {
  4. breakpoints,
  5. DropdownMenuButton,
  6. DropdownMenuDivider,
  7. RowButton,
  8. MenuContent,
  9. FloatingContainer,
  10. IconWrapper,
  11. } from 'components/shared'
  12. import PageOptions from './page-options'
  13. import { PlusIcon, CheckIcon } from '@radix-ui/react-icons'
  14. import state, { useSelector } from 'state'
  15. import { useEffect, useRef, useState } from 'react'
  16. function handleCreatePage() {
  17. state.send('CREATED_PAGE')
  18. }
  19. export default function PagePanel(): JSX.Element {
  20. const rIsOpen = useRef(false)
  21. const [isOpen, setIsOpen] = useState(false)
  22. useEffect(() => {
  23. if (rIsOpen.current !== isOpen) {
  24. rIsOpen.current = isOpen
  25. }
  26. }, [isOpen])
  27. const documentPages = useSelector((s) => s.data.document.pages)
  28. const currentPageId = useSelector((s) => s.data.currentPageId)
  29. if (!documentPages[currentPageId]) return null
  30. const sorted = Object.values(documentPages).sort(
  31. (a, b) => a.childIndex - b.childIndex
  32. )
  33. return (
  34. <DropdownMenu.Root
  35. dir="ltr"
  36. open={isOpen}
  37. onOpenChange={(isOpen) => {
  38. if (rIsOpen.current !== isOpen) {
  39. setIsOpen(isOpen)
  40. }
  41. }}
  42. >
  43. <FloatingContainer>
  44. <RowButton as={DropdownMenu.Trigger} bp={breakpoints} variant="noIcon">
  45. <span>{documentPages[currentPageId].name}</span>
  46. </RowButton>
  47. </FloatingContainer>
  48. <MenuContent as={DropdownMenu.Content} sideOffset={8} align="start">
  49. <DropdownMenu.RadioGroup
  50. value={currentPageId}
  51. onValueChange={(id) => {
  52. setIsOpen(false)
  53. state.send('CHANGED_PAGE', { id })
  54. }}
  55. >
  56. {sorted.map((page) => (
  57. <ButtonWithOptions key={page.id}>
  58. <DropdownMenu.RadioItem
  59. as={RowButton}
  60. bp={breakpoints}
  61. value={page.id}
  62. variant="pageButton"
  63. >
  64. <span>{page.name}</span>
  65. <DropdownMenu.ItemIndicator>
  66. <IconWrapper size="small">
  67. <CheckIcon />
  68. </IconWrapper>
  69. </DropdownMenu.ItemIndicator>
  70. </DropdownMenu.RadioItem>
  71. <PageOptions page={page} />
  72. </ButtonWithOptions>
  73. ))}
  74. </DropdownMenu.RadioGroup>
  75. <DropdownMenuDivider />
  76. <DropdownMenuButton onSelect={handleCreatePage}>
  77. <span>Create Page</span>
  78. <IconWrapper size="small">
  79. <PlusIcon />
  80. </IconWrapper>
  81. </DropdownMenuButton>
  82. </MenuContent>
  83. </DropdownMenu.Root>
  84. )
  85. }
  86. const ButtonWithOptions = styled('div', {
  87. display: 'grid',
  88. gridTemplateColumns: '1fr auto',
  89. gridAutoFlow: 'column',
  90. '& > *[data-shy="true"]': {
  91. opacity: 0,
  92. },
  93. '&:hover > *[data-shy="true"]': {
  94. opacity: 1,
  95. },
  96. })