use-tree-features.ts 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { useMemo } from 'react';
  2. import type { FeatureImplementation } from '@headless-tree/core';
  3. import {
  4. asyncDataLoaderFeature,
  5. checkboxesFeature,
  6. dragAndDropFeature,
  7. hotkeysCoreFeature,
  8. renamingFeature,
  9. selectionFeature,
  10. } from '@headless-tree/core';
  11. import type { UsePageDndProperties } from '../use-page-dnd';
  12. import { usePageDnd } from '../use-page-dnd';
  13. import type { UseCheckboxProperties } from './use-checkbox';
  14. import { useCheckbox } from './use-checkbox';
  15. export type UseTreeFeaturesOptions = {
  16. enableRenaming?: boolean;
  17. enableCheckboxes?: boolean;
  18. enableDragAndDrop?: boolean;
  19. initialCheckedItems?: string[];
  20. };
  21. export type UseTreeFeaturesResult = {
  22. features: FeatureImplementation<unknown>[];
  23. checkboxProperties: UseCheckboxProperties;
  24. dndProperties: UsePageDndProperties;
  25. };
  26. /**
  27. * Hook to configure tree features based on options.
  28. * Returns a stable array of features for use with headless-tree,
  29. * along with checkbox state and page D&D handlers.
  30. */
  31. export const useTreeFeatures = (
  32. options: UseTreeFeaturesOptions = {},
  33. ): UseTreeFeaturesResult => {
  34. const {
  35. enableRenaming = true,
  36. enableCheckboxes = false,
  37. enableDragAndDrop = false,
  38. initialCheckedItems = [],
  39. } = options;
  40. // Get checkbox properties
  41. const checkboxProperties = useCheckbox({
  42. enabled: enableCheckboxes,
  43. initialCheckedItems,
  44. });
  45. // Get page D&D handlers
  46. const dndProperties = usePageDnd(enableDragAndDrop);
  47. const features = useMemo(() => {
  48. const featureList: FeatureImplementation<unknown>[] = [
  49. asyncDataLoaderFeature,
  50. selectionFeature,
  51. hotkeysCoreFeature,
  52. ];
  53. if (enableRenaming) {
  54. featureList.push(renamingFeature);
  55. }
  56. if (enableCheckboxes) {
  57. featureList.push(checkboxesFeature);
  58. }
  59. if (enableDragAndDrop) {
  60. featureList.push(dragAndDropFeature);
  61. }
  62. return featureList;
  63. }, [enableRenaming, enableCheckboxes, enableDragAndDrop]);
  64. return useMemo(
  65. () => ({
  66. features,
  67. checkboxProperties,
  68. dndProperties,
  69. }),
  70. [features, checkboxProperties, dndProperties],
  71. );
  72. };