HelpDropdown.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import type { FC } from 'react';
  2. import { memo } from 'react';
  3. import { useTranslation } from 'next-i18next';
  4. import {
  5. UncontrolledDropdown, DropdownToggle, DropdownMenu, DropdownItem,
  6. } from 'reactstrap';
  7. import { useGrowiVersion } from '~/stores-universal/context';
  8. import { useShortcutsModal } from '~/stores/modal';
  9. import { SkeletonItem } from './SkeletonItem';
  10. import styles from './HelpDropdown.module.scss';
  11. export const HelpDropdown: FC = memo(() => {
  12. const { t } = useTranslation('commons');
  13. const { data: growiVersion } = useGrowiVersion();
  14. const { open: openShortcutsModal } = useShortcutsModal();
  15. if (growiVersion == null) {
  16. return <SkeletonItem />;
  17. }
  18. // add classes to cmd-key by OS
  19. const platform = window.navigator.platform.toLowerCase();
  20. const isMac = (platform.indexOf('mac') > -1);
  21. const os = isMac ? 'mac' : 'win';
  22. return (
  23. <UncontrolledDropdown direction="end" className={styles['help-dropdown']}>
  24. <DropdownToggle
  25. className="btn btn-primary d-flex align-items-center justify-content-center"
  26. data-testid="help-dropdown-button"
  27. >
  28. <span className="material-symbols-outlined">help</span>
  29. </DropdownToggle>
  30. <DropdownMenu
  31. container="body"
  32. data-testid="help-dropdown-menu"
  33. style={{ minWidth: '280px', fontSize: '14px' }}
  34. className={styles['help-dropdown-menu']}
  35. >
  36. <DropdownItem header className="fw-semibold pt-3 pb-3" style={{ fontSize: '16px' }}>
  37. {t('Help')}
  38. </DropdownItem>
  39. <DropdownItem divider />
  40. <DropdownItem
  41. tag="a"
  42. href="https://docs.growi.org"
  43. target="_blank"
  44. rel="noopener noreferrer"
  45. className="my-1"
  46. data-testid="growi-docs-link"
  47. >
  48. <span className="d-flex align-items-center">
  49. <span className="flex-grow-1">GROWI Docs</span>
  50. <span className="material-symbols-outlined ms-1 fs-6 opacity-50">open_in_new</span>
  51. </span>
  52. </DropdownItem>
  53. <DropdownItem
  54. tag="a"
  55. href="https://growi.cloud/help/"
  56. target="_blank"
  57. rel="noopener noreferrer"
  58. className="my-1"
  59. data-testid="growi-cloud-help-link"
  60. >
  61. <span className="d-flex align-items-center">
  62. <span className="flex-grow-1">GROWI.cloud {t('Help')}</span>
  63. <span className="material-symbols-outlined ms-1 fs-6 opacity-50">open_in_new</span>
  64. </span>
  65. </DropdownItem>
  66. <DropdownItem divider className="my-2" />
  67. <DropdownItem
  68. className="my-1"
  69. onClick={() => openShortcutsModal()}
  70. >
  71. <span className="d-flex align-items-center">
  72. <span className="material-symbols-outlined me-2 fs-6">keyboard</span>
  73. <span className="flex-grow-1">{t('Shortcuts')}</span>
  74. <span className={`cmd-key ${os}`}></span>&nbsp;-/
  75. </span>
  76. </DropdownItem>
  77. <DropdownItem divider className="my-2" />
  78. <DropdownItem header className="opacity-75" style={{ fontSize: '12px', paddingTop: '0.5rem', paddingBottom: '0.5rem' }}>
  79. <span>
  80. <a href="https://growi.org" target="_blank" rel="noopener noreferrer" className="text-decoration-none">GROWI</a>
  81. {' '}
  82. {growiVersion}
  83. </span>
  84. </DropdownItem>
  85. </DropdownMenu>
  86. </UncontrolledDropdown>
  87. );
  88. });