ToggleCollapseButton.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import { type JSX, memo, useCallback, useMemo } from 'react';
  2. import {
  3. useCollapsedContentsOpened,
  4. useDrawerOpened,
  5. useSetPreferCollapsedMode,
  6. useSidebarMode,
  7. } from '~/states/ui/sidebar';
  8. import styles from './ToggleCollapseButton.module.scss';
  9. export const ToggleCollapseButton = memo((): JSX.Element => {
  10. const { isDrawerMode, isCollapsedMode } = useSidebarMode();
  11. const [isDrawerOpened, setIsDrawerOpened] = useDrawerOpened();
  12. const setPreferCollapsedMode = useSetPreferCollapsedMode();
  13. const [, setCollapsedContentsOpened] = useCollapsedContentsOpened();
  14. const toggleDrawer = useCallback(() => {
  15. setIsDrawerOpened(!isDrawerOpened);
  16. }, [isDrawerOpened, setIsDrawerOpened]);
  17. const toggleCollapsed = useCallback(() => {
  18. setPreferCollapsedMode(!isCollapsedMode());
  19. setCollapsedContentsOpened(false);
  20. }, [isCollapsedMode, setCollapsedContentsOpened, setPreferCollapsedMode]);
  21. const rotationClass = isCollapsedMode() ? 'rotate180' : '';
  22. const icon = useMemo(() => {
  23. if (isCollapsedMode()) {
  24. return 'keyboard_double_arrow_left';
  25. }
  26. return 'first_page';
  27. }, [isCollapsedMode]);
  28. return (
  29. <button
  30. type="button"
  31. className={`btn btn-primary ${styles['btn-toggle-collapse']} p-2`}
  32. onClick={isDrawerMode() ? toggleDrawer : toggleCollapsed}
  33. data-testid="btn-toggle-collapse"
  34. >
  35. <span className={`material-symbols-outlined fs-2 ${rotationClass}`}>
  36. {icon}
  37. </span>
  38. </button>
  39. );
  40. });