SecondaryItems.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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(() => import('./PersonalDropdown').then(mod => mod.PersonalDropdown), {
  10. ssr: false,
  11. loading: () => <SkeletonItem />,
  12. });
  13. type SecondaryItemProps = {
  14. label: string,
  15. href: string,
  16. iconName: string,
  17. isBlank?: boolean,
  18. }
  19. const SecondaryItem: FC<SecondaryItemProps> = (props: SecondaryItemProps) => {
  20. const { iconName, href, isBlank } = props;
  21. return (
  22. <Link
  23. href={href}
  24. className="d-block btn btn-primary d-flex align-items-center justify-content-center"
  25. target={`${isBlank ? '_blank' : ''}`}
  26. prefetch={false}
  27. >
  28. <span className="material-symbols-outlined">{iconName}</span>
  29. </Link>
  30. );
  31. };
  32. export const SecondaryItems: FC = memo(() => {
  33. const [isAdmin] = useIsAdmin();
  34. const [growiCloudUri] = useGrowiCloudUri();
  35. const [isGuestUser] = useIsGuestUser();
  36. return (
  37. <div className={styles['grw-secondary-items']}>
  38. <SecondaryItem label="Help" iconName="help" href={growiCloudUri != null ? 'https://growi.cloud/help/' : 'https://docs.growi.org'} isBlank />
  39. {isAdmin && <SecondaryItem label="Admin" iconName="settings" href="/admin" />}
  40. <SecondaryItem label="Trash" href="/trash" iconName="delete" />
  41. {!isGuestUser && <PersonalDropdown />}
  42. </div>
  43. );
  44. });