SecondaryItems.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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 { useIsGuestUser, useGrowiCloudUri, useIsAdmin } from '~/stores/context';
  6. import { SkeletonItem } from './SkeletonItem';
  7. import styles from './SecondaryItems.module.scss';
  8. const PersonalDropdown = dynamic(() => import('./PersonalDropdown').then(mod => mod.PersonalDropdown), {
  9. ssr: false,
  10. loading: () => <SkeletonItem />,
  11. });
  12. type SecondaryItemProps = {
  13. label: string,
  14. href: string,
  15. iconName: string,
  16. isBlank?: boolean,
  17. }
  18. const SecondaryItem: FC<SecondaryItemProps> = (props: SecondaryItemProps) => {
  19. const { iconName, href, isBlank } = props;
  20. return (
  21. <Link
  22. href={href}
  23. className="d-block btn btn-primary d-flex align-items-center justify-content-center"
  24. target={`${isBlank ? '_blank' : ''}`}
  25. prefetch={false}
  26. >
  27. <span className="material-symbols-outlined">{iconName}</span>
  28. </Link>
  29. );
  30. };
  31. export const SecondaryItems: FC = memo(() => {
  32. const { data: isAdmin } = useIsAdmin();
  33. const { data: growiCloudUri } = useGrowiCloudUri();
  34. const { data: isGuestUser } = useIsGuestUser();
  35. return (
  36. <div className={styles['grw-secondary-items']}>
  37. {!isGuestUser && <PersonalDropdown />}
  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. </div>
  42. );
  43. });