SecondaryItems.tsx 1.4 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 { useIsAdmin, useIsGuestUser } from '~/states/context';
  6. import { HelpDropdown } from './HelpDropdown';
  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 isGuestUser = useIsGuestUser();
  35. return (
  36. <div className={styles['grw-secondary-items']}>
  37. <HelpDropdown />
  38. {isAdmin && <SecondaryItem label="Admin" iconName="settings" href="/admin" />}
  39. <SecondaryItem label="Trash" href="/trash" iconName="delete" />
  40. {!isGuestUser && <PersonalDropdown />}
  41. </div>
  42. );
  43. });