SecondaryItems.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import type { FC } from 'react';
  2. import { memo } from 'react';
  3. import dynamic from 'next/dynamic';
  4. import Link from 'next/link';
  5. import { useIsAdmin, useIsGuestUser } from '~/states/context';
  6. import { useGrowiCloudUri } from '~/states/global';
  7. import { SkeletonItem } from './SkeletonItem';
  8. import styles from './SecondaryItems.module.scss';
  9. const PersonalDropdown = dynamic(
  10. () => import('./PersonalDropdown').then((mod) => mod.PersonalDropdown),
  11. {
  12. ssr: false,
  13. loading: () => <SkeletonItem />,
  14. },
  15. );
  16. type SecondaryItemProps = {
  17. label: string;
  18. href: string;
  19. iconName: string;
  20. isBlank?: boolean;
  21. };
  22. const SecondaryItem: FC<SecondaryItemProps> = (props: SecondaryItemProps) => {
  23. const { iconName, href, isBlank } = props;
  24. return (
  25. <Link
  26. href={href}
  27. className="d-block btn btn-primary d-flex align-items-center justify-content-center"
  28. target={`${isBlank ? '_blank' : ''}`}
  29. prefetch={false}
  30. >
  31. <span className="material-symbols-outlined">{iconName}</span>
  32. </Link>
  33. );
  34. };
  35. export const SecondaryItems: FC = memo(() => {
  36. const isAdmin = useIsAdmin();
  37. const growiCloudUri = useGrowiCloudUri();
  38. const isGuestUser = useIsGuestUser();
  39. return (
  40. <div className={styles['grw-secondary-items']}>
  41. <SecondaryItem
  42. label="Help"
  43. iconName="help"
  44. href={
  45. growiCloudUri != null
  46. ? 'https://growi.cloud/help/'
  47. : 'https://docs.growi.org'
  48. }
  49. isBlank
  50. />
  51. {isAdmin && (
  52. <SecondaryItem label="Admin" iconName="settings" href="/admin" />
  53. )}
  54. <SecondaryItem label="Trash" href="/trash" iconName="delete" />
  55. {!isGuestUser && <PersonalDropdown />}
  56. </div>
  57. );
  58. });