use-selected-pages.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
  2. import type { SelectablePage } from '../../interfaces/selectable-page';
  3. import { useAiAssistantManagementModal } from '../stores/ai-assistant';
  4. type UseSelectedPages = {
  5. selectedPages: Map<string, SelectablePage>;
  6. selectedPagesRef: React.RefObject<Map<string, SelectablePage>>;
  7. selectedPagesArray: SelectablePage[];
  8. addPage: (page: SelectablePage) => void;
  9. removePage: (page: SelectablePage) => void;
  10. };
  11. export const useSelectedPages = (
  12. initialPages?: SelectablePage[],
  13. ): UseSelectedPages => {
  14. const [selectedPages, setSelectedPages] = useState<
  15. Map<string, SelectablePage>
  16. >(new Map());
  17. const { data: aiAssistantManagementModalData } =
  18. useAiAssistantManagementModal();
  19. const selectedPagesRef = useRef(selectedPages);
  20. const selectedPagesArray = useMemo(() => {
  21. return Array.from(selectedPages.values());
  22. }, [selectedPages]);
  23. useEffect(() => {
  24. selectedPagesRef.current = selectedPages;
  25. }, [selectedPages]);
  26. useEffect(() => {
  27. // Initialize each time PageMode is changed
  28. if (
  29. initialPages != null &&
  30. aiAssistantManagementModalData?.pageMode != null
  31. ) {
  32. const initialMap = new Map<string, SelectablePage>();
  33. initialPages.forEach((page) => {
  34. if (page.path != null) {
  35. initialMap.set(page.path, page);
  36. }
  37. });
  38. setSelectedPages(initialMap);
  39. }
  40. }, [aiAssistantManagementModalData?.pageMode, initialPages]);
  41. const addPage = useCallback((page: SelectablePage) => {
  42. setSelectedPages((prev) => {
  43. const newMap = new Map(prev);
  44. if (page.path != null) {
  45. newMap.set(page.path, page);
  46. }
  47. return newMap;
  48. });
  49. }, []);
  50. const removePage = useCallback((page: SelectablePage) => {
  51. setSelectedPages((prev) => {
  52. const newMap = new Map(prev);
  53. if (page.path != null) {
  54. newMap.delete(page.path);
  55. }
  56. return newMap;
  57. });
  58. }, []);
  59. return {
  60. selectedPages,
  61. selectedPagesRef,
  62. selectedPagesArray,
  63. addPage,
  64. removePage,
  65. };
  66. };