HelpDropdown.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import type { FC } from 'react';
  2. import { memo } from 'react';
  3. import { useTranslation } from 'next-i18next';
  4. import {
  5. DropdownItem,
  6. DropdownMenu,
  7. DropdownToggle,
  8. UncontrolledDropdown,
  9. } from 'reactstrap';
  10. import { useGrowiCloudUri, useGrowiVersion } from '~/states/global';
  11. import { useShortcutsModalActions } from '~/states/ui/modal/shortcuts';
  12. import { SkeletonItem } from './SkeletonItem';
  13. import styles from './HelpDropdown.module.scss';
  14. export const HelpDropdown: FC = memo(() => {
  15. const { t } = useTranslation();
  16. const growiVersion = useGrowiVersion();
  17. const { open: openShortcutsModal } = useShortcutsModalActions();
  18. const growiCloudUri = useGrowiCloudUri();
  19. if (growiVersion == null) {
  20. return <SkeletonItem />;
  21. }
  22. // add classes to cmd-key by OS
  23. const userAgent = window.navigator.userAgent.toLowerCase();
  24. const isMac = userAgent.indexOf('mac') > -1;
  25. const os = isMac ? 'mac' : 'win';
  26. // Cloud users see Help, others see Docs
  27. const isCloudUser = growiCloudUri != null;
  28. const helpUrl = isCloudUser
  29. ? 'https://growi.cloud/help/'
  30. : 'https://docs.growi.org';
  31. const helpLabel = isCloudUser ? t('Help') : 'GROWI Docs';
  32. return (
  33. <UncontrolledDropdown direction="end" className={styles['help-dropdown']}>
  34. <DropdownToggle
  35. className="btn btn-primary d-flex align-items-center justify-content-center"
  36. data-testid="help-dropdown-button"
  37. >
  38. <span className="material-symbols-outlined">help</span>
  39. </DropdownToggle>
  40. <DropdownMenu
  41. container="body"
  42. data-testid="help-dropdown-menu"
  43. className={styles['help-dropdown-menu']}
  44. >
  45. <DropdownItem header className="text-secondary py-1">
  46. {t('Help')}
  47. </DropdownItem>
  48. <DropdownItem
  49. tag="a"
  50. href={helpUrl}
  51. target="_blank"
  52. rel="noopener noreferrer"
  53. className="my-1"
  54. data-testid="help-link"
  55. >
  56. <span className="d-flex align-items-center">
  57. {helpLabel}
  58. <span className="growi-custom-icons ms-1 small">external_link</span>
  59. </span>
  60. </DropdownItem>
  61. <DropdownItem className="my-1" onClick={() => openShortcutsModal()}>
  62. <span className="d-flex align-items-center">
  63. <span className="flex-grow-1">
  64. {t('help_dropdown.show_shortcuts')}
  65. </span>
  66. <span className="text-secondary">
  67. <span className={`cmd-key ${os}`} />
  68. &nbsp;+ /
  69. </span>
  70. </span>
  71. </DropdownItem>
  72. <DropdownItem divider className="my-2" />
  73. <DropdownItem header className="py-1">
  74. <span className="d-flex text-secondary">
  75. <span className="flex-grow-1">
  76. {' '}
  77. {t('help_dropdown.growi_version')}
  78. </span>
  79. {growiVersion}
  80. </span>
  81. </DropdownItem>
  82. </DropdownMenu>
  83. </UncontrolledDropdown>
  84. );
  85. });