NavigationPanel.hooks.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { useAppDispatch, useAppSelector } from '../../../stores/store';
  2. import { useNavigate } from 'react-router-dom';
  3. import { IPage } from '../../../stores/reducers/pages/slice';
  4. import { ViewLayoutTypePB } from '../../../../services/backend';
  5. import { MouseEventHandler, useState } from 'react';
  6. import { activePageIdActions } from '../../../stores/reducers/activePageId/slice';
  7. // number of pixels from left side of screen to show hidden navigation panel
  8. const FLOATING_PANEL_SHOW_WIDTH = 10;
  9. const FLOATING_PANEL_HIDE_EXTRA_WIDTH = 10;
  10. export const useNavigationPanelHooks = function () {
  11. const dispatch = useAppDispatch();
  12. const folders = useAppSelector((state) => state.folders);
  13. const pages = useAppSelector((state) => state.pages);
  14. const width = useAppSelector((state) => state.navigationWidth);
  15. const [navigationPanelFixed, setNavigationPanelFixed] = useState(true);
  16. const [slideInFloatingPanel, setSlideInFloatingPanel] = useState(true);
  17. const [menuHidden, setMenuHidden] = useState(false);
  18. const navigate = useNavigate();
  19. const onCollapseNavigationClick = () => {
  20. setSlideInFloatingPanel(true);
  21. setNavigationPanelFixed(false);
  22. };
  23. const onFixNavigationClick = () => {
  24. setNavigationPanelFixed(true);
  25. };
  26. const [floatingPanelWidth, setFloatingPanelWidth] = useState(0);
  27. const onHideMenuClick = () => {
  28. setMenuHidden(true);
  29. };
  30. const onShowMenuClick = () => {
  31. setMenuHidden(false);
  32. };
  33. const onPageClick = (page: IPage) => {
  34. let pageTypeRoute = (() => {
  35. switch (page.pageType) {
  36. case ViewLayoutTypePB.Document:
  37. return 'document';
  38. break;
  39. case ViewLayoutTypePB.Grid:
  40. return 'grid';
  41. case ViewLayoutTypePB.Board:
  42. return 'board';
  43. default:
  44. return 'document';
  45. }
  46. })();
  47. dispatch(activePageIdActions.setActivePageId(page.id));
  48. navigate(`/page/${pageTypeRoute}/${page.id}`);
  49. };
  50. const onScreenMouseMove: MouseEventHandler<HTMLDivElement> = (e) => {
  51. if (e.screenX <= FLOATING_PANEL_SHOW_WIDTH) {
  52. setSlideInFloatingPanel(true);
  53. } else if (e.screenX > floatingPanelWidth + FLOATING_PANEL_HIDE_EXTRA_WIDTH) {
  54. setSlideInFloatingPanel(false);
  55. }
  56. };
  57. return {
  58. width,
  59. folders,
  60. pages,
  61. navigate,
  62. onPageClick,
  63. onCollapseNavigationClick,
  64. onFixNavigationClick,
  65. navigationPanelFixed,
  66. onScreenMouseMove,
  67. slideInFloatingPanel,
  68. setFloatingPanelWidth,
  69. menuHidden,
  70. onHideMenuClick,
  71. onShowMenuClick,
  72. };
  73. };