Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

menu.tsx 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import * as React from 'react'
  2. import { HamburgerMenuIcon } from '@radix-ui/react-icons'
  3. import { Trigger, Content } from '@radix-ui/react-dropdown-menu'
  4. import { memo } from 'react'
  5. import {
  6. FloatingContainer,
  7. DropdownMenuRoot,
  8. MenuContent,
  9. IconButton,
  10. breakpoints,
  11. DropdownMenuButton,
  12. DropdownMenuSubMenu,
  13. DropdownMenuDivider,
  14. DropdownMenuCheckboxItem,
  15. } from '../shared'
  16. import state, { useSelector } from 'state'
  17. import { commandKey } from 'utils'
  18. const handleNew = () => state.send('CREATED_NEW_PROJECT')
  19. const handleSave = () => state.send('SAVED')
  20. const handleLoad = () => state.send('LOADED_FROM_FILE_STSTEM')
  21. const toggleDarkMode = () => state.send('TOGGLED_DARK_MODE')
  22. function Menu() {
  23. return (
  24. <FloatingContainer>
  25. <DropdownMenuRoot>
  26. <IconButton as={Trigger} bp={breakpoints}>
  27. <HamburgerMenuIcon />
  28. </IconButton>
  29. <Content as={MenuContent} sideOffset={8}>
  30. <DropdownMenuButton onSelect={handleNew} disabled>
  31. <span>New Project</span>
  32. <kbd>
  33. <span>{commandKey()}</span>
  34. <span>N</span>
  35. </kbd>
  36. </DropdownMenuButton>
  37. <DropdownMenuDivider />
  38. <DropdownMenuButton onSelect={handleLoad}>
  39. <span>Open...</span>
  40. <kbd>
  41. <span>{commandKey()}</span>
  42. <span>L</span>
  43. </kbd>
  44. </DropdownMenuButton>
  45. <RecentFiles />
  46. <DropdownMenuDivider />
  47. <DropdownMenuButton onSelect={handleSave}>
  48. <span>Save</span>
  49. <kbd>
  50. <span>{commandKey()}</span>
  51. <span>S</span>
  52. </kbd>
  53. </DropdownMenuButton>
  54. <DropdownMenuButton onSelect={handleSave}>
  55. <span>Save As...</span>
  56. <kbd>
  57. <span>⇧</span>
  58. <span>{commandKey()}</span>
  59. <span>S</span>
  60. </kbd>
  61. </DropdownMenuButton>
  62. <DropdownMenuDivider />
  63. <Preferences />
  64. </Content>
  65. </DropdownMenuRoot>
  66. </FloatingContainer>
  67. )
  68. }
  69. export default memo(Menu)
  70. function RecentFiles() {
  71. return (
  72. <DropdownMenuSubMenu label="Open Recent..." disabled>
  73. <DropdownMenuButton>
  74. <span>Project A</span>
  75. </DropdownMenuButton>
  76. <DropdownMenuButton>
  77. <span>Project B</span>
  78. </DropdownMenuButton>
  79. <DropdownMenuButton>
  80. <span>Project C</span>
  81. </DropdownMenuButton>
  82. </DropdownMenuSubMenu>
  83. )
  84. }
  85. function Preferences() {
  86. const isDarkMode = useSelector((s) => s.data.settings.isDarkMode)
  87. return (
  88. <DropdownMenuSubMenu label="Preferences">
  89. <DropdownMenuCheckboxItem
  90. checked={isDarkMode}
  91. onCheckedChange={toggleDarkMode}
  92. >
  93. <span>Dark Mode</span>
  94. </DropdownMenuCheckboxItem>
  95. </DropdownMenuSubMenu>
  96. )
  97. }