ToggleCollapseButton.tsx 1.4 KB

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