hooks.tsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import {getUserBasicMenu} from '@apis';
  2. import {MAIN_PATH} from '@routes';
  3. import {menuStore, tabStore} from '@stores';
  4. import {useQuery} from '@tanstack/react-query';
  5. import {MENU_COLLAPSED_STORAGE, sortMenu} from '@utils';
  6. import {useBoolean, useLocalStorageState} from 'ahooks';
  7. import {useEffect, useState} from 'react';
  8. import {useStore} from 'zustand';
  9. export function useMenu() {
  10. const setMenus = useStore(menuStore, state => state.setMenu);
  11. const dispatch = useStore(tabStore, state => state.dispatch);
  12. const {data} = useQuery({
  13. queryKey: [getUserBasicMenu.name],
  14. async queryFn() {
  15. const data = await getUserBasicMenu();
  16. if (data.msg === '200') {
  17. const finalMenu = [
  18. {
  19. id: '-1',
  20. name: '首页',
  21. url: MAIN_PATH,
  22. pId: '0',
  23. page: 1,
  24. limit: 0,
  25. orderBy: '0',
  26. img: 'menu-shouye',
  27. },
  28. ...data.data,
  29. ];
  30. setMenus(finalMenu);
  31. dispatch({
  32. type: 'ADD',
  33. payload: {key: '-1', url: MAIN_PATH, label: '首页'},
  34. });
  35. return sortMenu(finalMenu);
  36. }
  37. throw new Error(data.errMsg);
  38. },
  39. suspense: true,
  40. cacheTime: Infinity,
  41. staleTime: Infinity,
  42. });
  43. return data;
  44. }
  45. export function useMenuState() {
  46. const [openKeys, setOpenKey] = useState<string[]>(['-1']);
  47. function onOpenChange(keys: string[]) {
  48. setOpenKey([keys[keys.length - 1]]);
  49. }
  50. const pages = useStore(menuStore, state => state.menus);
  51. const activeKey = useStore(tabStore, state => state.activeKey);
  52. const dispatch = useStore(tabStore, state => state.dispatch);
  53. function onClick(e: {key: string; keyPath: string[]}) {
  54. setOpenKey(e.keyPath);
  55. const data = pages.find(val => val.id === e.key);
  56. if (!data || data.url === '.')
  57. return;
  58. dispatch({
  59. type: 'ADD',
  60. payload: {key: data.id, url: data.url, label: data.name},
  61. });
  62. }
  63. const [selectKey, setSelectKey] = useState(['-1']);
  64. useEffect(
  65. function() {
  66. const menu = pages.find(val => val.id === activeKey);
  67. menu && menu.pId !== '0' ? setOpenKey([menu.pId]) : setOpenKey([]);
  68. setSelectKey([activeKey]);
  69. },
  70. [activeKey, pages],
  71. );
  72. return [
  73. {openKeys, selectKey},
  74. {onOpenChange, onClick},
  75. ] as const;
  76. }
  77. export function useCollapsedMenu() {
  78. const [storage, setStorage] = useLocalStorageState<'0' | '1' | undefined>(
  79. MENU_COLLAPSED_STORAGE,
  80. );
  81. const [state, {set}] = useBoolean(
  82. storage ? storage === '1' : window.innerWidth <= 1200,
  83. );
  84. function toggle() {
  85. setStorage(state ? '0' : '1');
  86. set(!state);
  87. }
  88. return [state, toggle] as const;
  89. }