You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import * as React from 'react'
  2. import { ExitIcon, HamburgerMenuIcon } from '@radix-ui/react-icons'
  3. import * as DropdownMenu 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. IconWrapper,
  16. Kbd,
  17. } from '../shared'
  18. import state, { useSelector } from 'state'
  19. import { commandKey } from 'utils'
  20. import { signOut } from 'next-auth/client'
  21. import { useTheme } from 'next-themes'
  22. const handleNew = () => state.send('CREATED_NEW_PROJECT')
  23. const handleSave = () => state.send('SAVED')
  24. const handleLoad = () => state.send('LOADED_FROM_FILE_STSTEM')
  25. const toggleDebugMode = () => state.send('TOGGLED_DEBUG_MODE')
  26. function Menu() {
  27. return (
  28. <FloatingContainer>
  29. <DropdownMenuRoot>
  30. <DropdownMenu.Trigger as={IconButton} bp={breakpoints}>
  31. <HamburgerMenuIcon />
  32. </DropdownMenu.Trigger>
  33. <DropdownMenu.Content as={MenuContent} sideOffset={8} align="end">
  34. <DropdownMenuButton onSelect={handleNew} disabled={true}>
  35. <span>New Project</span>
  36. <Kbd>
  37. <span>{commandKey()}</span>
  38. <span>N</span>
  39. </Kbd>
  40. </DropdownMenuButton>
  41. <DropdownMenuDivider />
  42. <DropdownMenuButton onSelect={handleLoad}>
  43. <span>Open...</span>
  44. <Kbd>
  45. <span>{commandKey()}</span>
  46. <span>L</span>
  47. </Kbd>
  48. </DropdownMenuButton>
  49. <RecentFiles />
  50. <DropdownMenuDivider />
  51. <DropdownMenuButton onSelect={handleSave}>
  52. <span>Save</span>
  53. <Kbd>
  54. <span>{commandKey()}</span>
  55. <span>S</span>
  56. </Kbd>
  57. </DropdownMenuButton>
  58. <DropdownMenuButton onSelect={handleSave}>
  59. <span>Save As...</span>
  60. <Kbd>
  61. <span>⇧</span>
  62. <span>{commandKey()}</span>
  63. <span>S</span>
  64. </Kbd>
  65. </DropdownMenuButton>
  66. <DropdownMenuDivider />
  67. <Preferences />
  68. <DropdownMenuDivider />
  69. <DropdownMenuButton onSelect={signOut}>
  70. <span>Sign Out</span>
  71. <IconWrapper size="small">
  72. <ExitIcon />
  73. </IconWrapper>
  74. </DropdownMenuButton>
  75. </DropdownMenu.Content>
  76. </DropdownMenuRoot>
  77. </FloatingContainer>
  78. )
  79. }
  80. export default memo(Menu)
  81. function RecentFiles() {
  82. return (
  83. <DropdownMenuSubMenu label="Open Recent..." disabled={true}>
  84. <DropdownMenuButton>
  85. <span>Project A</span>
  86. </DropdownMenuButton>
  87. <DropdownMenuButton>
  88. <span>Project B</span>
  89. </DropdownMenuButton>
  90. <DropdownMenuButton>
  91. <span>Project C</span>
  92. </DropdownMenuButton>
  93. </DropdownMenuSubMenu>
  94. )
  95. }
  96. function Preferences() {
  97. const { theme, setTheme } = useTheme()
  98. const isDebugMode = useSelector((s) => s.data.settings.isDebugMode)
  99. const isDarkMode = theme === 'dark'
  100. return (
  101. <DropdownMenuSubMenu label="Preferences">
  102. <DropdownMenuCheckboxItem
  103. checked={isDarkMode}
  104. onCheckedChange={() => setTheme(isDarkMode ? 'light' : 'dark')}
  105. >
  106. <span>Dark Mode</span>
  107. </DropdownMenuCheckboxItem>
  108. <DropdownMenuCheckboxItem
  109. checked={isDebugMode}
  110. onCheckedChange={toggleDebugMode}
  111. >
  112. <span>Debug Mode</span>
  113. </DropdownMenuCheckboxItem>
  114. </DropdownMenuSubMenu>
  115. )
  116. }