useSelection.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
  9. var React = _interopRequireWildcard(require("react"));
  10. var _rcUtil = require("rc-util");
  11. const EMPTY_KEYS = [];
  12. function filterKeys(keys, dataKeys) {
  13. const filteredKeys = keys.filter(key => dataKeys.has(key));
  14. return keys.length === filteredKeys.length ? keys : filteredKeys;
  15. }
  16. function flattenKeys(keys) {
  17. return Array.from(keys).join(';');
  18. }
  19. function useSelection(leftDataSource, rightDataSource, selectedKeys) {
  20. // Prepare `dataSource` keys
  21. const [leftKeys, rightKeys] = React.useMemo(() => [new Set(leftDataSource.map(src => src === null || src === void 0 ? void 0 : src.key)), new Set(rightDataSource.map(src => src === null || src === void 0 ? void 0 : src.key))], [leftDataSource, rightDataSource]);
  22. // Selected Keys
  23. const [mergedSelectedKeys, setMergedSelectedKeys] = (0, _rcUtil.useMergedState)(EMPTY_KEYS, {
  24. value: selectedKeys
  25. });
  26. const sourceSelectedKeys = React.useMemo(() => filterKeys(mergedSelectedKeys, leftKeys), [mergedSelectedKeys, leftKeys]);
  27. const targetSelectedKeys = React.useMemo(() => filterKeys(mergedSelectedKeys, rightKeys), [mergedSelectedKeys, rightKeys]);
  28. // // Reset when data changed
  29. React.useEffect(() => {
  30. setMergedSelectedKeys([].concat((0, _toConsumableArray2.default)(filterKeys(mergedSelectedKeys, leftKeys)), (0, _toConsumableArray2.default)(filterKeys(mergedSelectedKeys, rightKeys))));
  31. }, [flattenKeys(leftKeys), flattenKeys(rightKeys)]);
  32. // Update keys
  33. const setSourceSelectedKeys = (0, _rcUtil.useEvent)(nextSrcKeys => {
  34. setMergedSelectedKeys([].concat((0, _toConsumableArray2.default)(nextSrcKeys), (0, _toConsumableArray2.default)(targetSelectedKeys)));
  35. });
  36. const setTargetSelectedKeys = (0, _rcUtil.useEvent)(nextTargetKeys => {
  37. setMergedSelectedKeys([].concat((0, _toConsumableArray2.default)(sourceSelectedKeys), (0, _toConsumableArray2.default)(nextTargetKeys)));
  38. });
  39. return [
  40. // Keys
  41. sourceSelectedKeys, targetSelectedKeys,
  42. // Updater
  43. setSourceSelectedKeys, setTargetSelectedKeys];
  44. }
  45. var _default = exports.default = useSelection;