@aloudata/aloudata-design 3.1.6 → 3.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/ConfigProvider/getUserList.d.ts +47 -0
  2. package/dist/ConfigProvider/getUserList.js.map +1 -1
  3. package/dist/ConfigProvider/hooks/useGetUserList.d.ts +7 -0
  4. package/dist/ConfigProvider/hooks/useGetUserList.js +5 -1
  5. package/dist/ConfigProvider/hooks/useGetUserList.js.map +1 -1
  6. package/dist/ConfigProvider/index.d.ts +5 -1
  7. package/dist/ConfigProvider/index.js +6 -2
  8. package/dist/ConfigProvider/index.js.map +1 -1
  9. package/dist/Dropdown/index.d.ts +7 -2
  10. package/dist/Dropdown/index.js +52 -18
  11. package/dist/Dropdown/index.js.map +1 -1
  12. package/dist/MemberPicker/components/MultipleOption.d.ts +1 -0
  13. package/dist/MemberPicker/components/MultipleOption.js +3 -1
  14. package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
  15. package/dist/MemberPicker/components/NickLabel.d.ts +5 -0
  16. package/dist/MemberPicker/components/NickLabel.js +14 -4
  17. package/dist/MemberPicker/components/NickLabel.js.map +1 -1
  18. package/dist/MemberPicker/components/Panel.d.ts +6 -1
  19. package/dist/MemberPicker/components/Panel.js +17 -5
  20. package/dist/MemberPicker/components/Panel.js.map +1 -1
  21. package/dist/MemberPicker/components/PanelWrapper.d.ts +3 -2
  22. package/dist/MemberPicker/components/PanelWrapper.js +27 -25
  23. package/dist/MemberPicker/components/PanelWrapper.js.map +1 -1
  24. package/dist/MemberPicker/components/SearchFeedback.d.ts +7 -0
  25. package/dist/MemberPicker/components/SearchFeedback.js +27 -0
  26. package/dist/MemberPicker/components/SearchFeedback.js.map +1 -0
  27. package/dist/MemberPicker/components/SingleOption.d.ts +1 -0
  28. package/dist/MemberPicker/components/SingleOption.js +3 -1
  29. package/dist/MemberPicker/components/SingleOption.js.map +1 -1
  30. package/dist/MemberPicker/components/UserGroupSelection.d.ts +6 -1
  31. package/dist/MemberPicker/components/UserGroupSelection.js +30 -23
  32. package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
  33. package/dist/MemberPicker/dialog/DialogColumns.d.ts +5 -0
  34. package/dist/MemberPicker/dialog/DialogColumns.js +59 -0
  35. package/dist/MemberPicker/dialog/DialogColumns.js.map +1 -0
  36. package/dist/MemberPicker/dialog/DialogContent.d.ts +3 -0
  37. package/dist/MemberPicker/dialog/DialogContent.js +109 -0
  38. package/dist/MemberPicker/dialog/DialogContent.js.map +1 -0
  39. package/dist/MemberPicker/dialog/MemberOption.d.ts +16 -0
  40. package/dist/MemberPicker/dialog/MemberOption.js +101 -0
  41. package/dist/MemberPicker/dialog/MemberOption.js.map +1 -0
  42. package/dist/MemberPicker/dialog/MemberPickerDialog.d.ts +11 -0
  43. package/dist/MemberPicker/dialog/MemberPickerDialog.js +11 -0
  44. package/dist/MemberPicker/dialog/MemberPickerDialog.js.map +1 -0
  45. package/dist/MemberPicker/dialog/SelectedMemberPanel.d.ts +12 -0
  46. package/dist/MemberPicker/dialog/SelectedMemberPanel.js +37 -0
  47. package/dist/MemberPicker/dialog/SelectedMemberPanel.js.map +1 -0
  48. package/dist/MemberPicker/dialog/UserCandidatePanel.d.ts +13 -0
  49. package/dist/MemberPicker/dialog/UserCandidatePanel.js +168 -0
  50. package/dist/MemberPicker/dialog/UserCandidatePanel.js.map +1 -0
  51. package/dist/MemberPicker/dialog/UserGroupCandidatePanel.d.ts +14 -0
  52. package/dist/MemberPicker/dialog/UserGroupCandidatePanel.js +134 -0
  53. package/dist/MemberPicker/dialog/UserGroupCandidatePanel.js.map +1 -0
  54. package/dist/MemberPicker/dialog/helper.d.ts +20 -0
  55. package/dist/MemberPicker/dialog/helper.js +61 -0
  56. package/dist/MemberPicker/dialog/helper.js.map +1 -0
  57. package/dist/MemberPicker/dialog/types.d.ts +41 -0
  58. package/dist/MemberPicker/dialog/types.js +7 -0
  59. package/dist/MemberPicker/dialog/types.js.map +1 -0
  60. package/dist/MemberPicker/dialog/useDialogLocale.d.ts +103 -0
  61. package/dist/MemberPicker/dialog/useDialogLocale.js +12 -0
  62. package/dist/MemberPicker/dialog/useDialogLocale.js.map +1 -0
  63. package/dist/MemberPicker/dialog/useMemberPickerDraft.d.ts +27 -0
  64. package/dist/MemberPicker/dialog/useMemberPickerDraft.js +95 -0
  65. package/dist/MemberPicker/dialog/useMemberPickerDraft.js.map +1 -0
  66. package/dist/MemberPicker/dialog/useUserGroupCandidates.d.ts +29 -0
  67. package/dist/MemberPicker/dialog/useUserGroupCandidates.js +443 -0
  68. package/dist/MemberPicker/dialog/useUserGroupCandidates.js.map +1 -0
  69. package/dist/MemberPicker/index.d.ts +2 -0
  70. package/dist/MemberPicker/index.js +61 -35
  71. package/dist/MemberPicker/index.js.map +1 -1
  72. package/dist/MemberPicker/interface.d.ts +6 -0
  73. package/dist/MemberPicker/interface.js.map +1 -1
  74. package/dist/MemberPicker/useMemberSearch.d.ts +8 -0
  75. package/dist/MemberPicker/useMemberSearch.js +51 -0
  76. package/dist/MemberPicker/useMemberSearch.js.map +1 -0
  77. package/dist/Menu/index.d.ts +6 -0
  78. package/dist/Menu/index.js +21 -9
  79. package/dist/Menu/index.js.map +1 -1
  80. package/dist/Modal/index.js +1 -1
  81. package/dist/Modal/index.js.map +1 -1
  82. package/dist/aloudata-design.css +1 -1
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.js +2 -2
  85. package/dist/locale/default.d.ts +29 -0
  86. package/dist/locale/en_US.d.ts +29 -0
  87. package/dist/locale/en_US.js +29 -0
  88. package/dist/locale/en_US.js.map +1 -1
  89. package/dist/locale/zh_CN.d.ts +29 -0
  90. package/dist/locale/zh_CN.js +29 -0
  91. package/dist/locale/zh_CN.js.map +1 -1
  92. package/package.json +2 -1
@@ -0,0 +1,27 @@
1
+ import { EMemberPicker, TMemberPickerValue as MemberPickerValue } from '../interface';
2
+ import { TUserGroupValue, TUserValue, TUser } from '../../ConfigProvider/getUserList';
3
+ import { TMember, TMemberKey, TMemberPickerTab } from './types.js';
4
+ export interface IUseMemberPickerDraftOptions {
5
+ value?: MemberPickerValue;
6
+ type?: EMemberPicker;
7
+ lockedIds?: Array<TUserValue | TUserGroupValue>;
8
+ onChange?: (members: TUser) => void;
9
+ }
10
+ export interface IMemberPickerDraftResult {
11
+ activeTab: TMemberPickerTab;
12
+ selectedMembers: TUser;
13
+ selectedByKey: Map<TMemberKey, TMember>;
14
+ hydrating: boolean;
15
+ setActiveTab: (tab: TMemberPickerTab) => void;
16
+ toggleMember: (member: TMember) => void;
17
+ toggleMembers: (members: readonly TMember[], selected: boolean) => void;
18
+ removeMember: (member: TMember) => void;
19
+ confirm: () => void;
20
+ }
21
+ /**
22
+ * 管理单次弹窗内的成员选择草稿。
23
+ *
24
+ * 外部 value 仅用于初始化,增删不会提前触发 onChange;弹窗取消时卸载本 hook,
25
+ * 只有 confirm 会按 Map 的稳定插入顺序一次性提交。
26
+ */
27
+ export declare function useMemberPickerDraft({ value, type, lockedIds, onChange, }: IUseMemberPickerDraftOptions): IMemberPickerDraftResult;
@@ -0,0 +1,95 @@
1
+ import { EUserType } from "../../ConfigProvider/getUserList.js";
2
+ import AldCustomConfigProvider from "../../ConfigProvider/index.js";
3
+ import { EMemberPicker } from "../interface.js";
4
+ import { addSelectedMember, createSelectedByKey, getMemberKey, isMemberLocked, removeSelectedMember, setMembersSelected } from "./helper.js";
5
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
6
+ //#region src/MemberPicker/dialog/useMemberPickerDraft.ts
7
+ var EMPTY_LOCKED_IDS = [];
8
+ var toValueArray = (value) => {
9
+ if (!value) return [];
10
+ return Array.isArray(value) ? [...value] : [value];
11
+ };
12
+ /** 历史值可能只有 ID;占位名称保证不可见对象不会被静默丢弃。 */
13
+ var toMemberPlaceholder = (value) => {
14
+ if (value.type === EUserType.USER) return {
15
+ ...value,
16
+ type: EUserType.USER,
17
+ name: value.name ?? value.nickname ?? value.account ?? value.userId
18
+ };
19
+ return {
20
+ ...value,
21
+ type: EUserType.USER_GROUP,
22
+ name: value.name ?? value.groupId,
23
+ parentId: value.parentId ?? null,
24
+ frontId: value.frontId ?? null
25
+ };
26
+ };
27
+ var needsHydration = (value) => {
28
+ if (value.type === EUserType.USER) return !value.name && !value.nickname && !value.account;
29
+ return !value.name;
30
+ };
31
+ /**
32
+ * 管理单次弹窗内的成员选择草稿。
33
+ *
34
+ * 外部 value 仅用于初始化,增删不会提前触发 onChange;弹窗取消时卸载本 hook,
35
+ * 只有 confirm 会按 Map 的稳定插入顺序一次性提交。
36
+ */
37
+ function useMemberPickerDraft({ value, type = EMemberPicker.BOTH, lockedIds = EMPTY_LOCKED_IDS, onChange }) {
38
+ const { getUsersByIds } = AldCustomConfigProvider.useGetUserList();
39
+ const initialValuesRef = useRef(toValueArray(value));
40
+ const missingValuesRef = useRef(initialValuesRef.current.filter(needsHydration));
41
+ const [selectedByKey, setSelectedByKey] = useState(() => createSelectedByKey(initialValuesRef.current.map(toMemberPlaceholder)));
42
+ const [hydrating, setHydrating] = useState(missingValuesRef.current.length > 0 && Boolean(getUsersByIds));
43
+ const [activeTab, setActiveTabState] = useState(type === EMemberPicker.GROUP ? EMemberPicker.GROUP : EMemberPicker.USER);
44
+ useEffect(() => {
45
+ const missingValues = missingValuesRef.current;
46
+ if (!missingValues.length || !getUsersByIds) {
47
+ setHydrating(false);
48
+ return;
49
+ }
50
+ let active = true;
51
+ getUsersByIds(missingValues).then((hydratedMembers) => {
52
+ if (!active) return;
53
+ const hydratedByKey = createSelectedByKey(hydratedMembers.map((member) => toMemberPlaceholder(member)));
54
+ setSelectedByKey((currentSelected) => new Map(Array.from(currentSelected).map(([key, member]) => [key, hydratedByKey.get(key) ?? member])));
55
+ }).catch(() => void 0).finally(() => {
56
+ if (active) setHydrating(false);
57
+ });
58
+ return () => {
59
+ active = false;
60
+ };
61
+ }, [getUsersByIds]);
62
+ const setActiveTab = useCallback((tab) => {
63
+ if (type === EMemberPicker.BOTH) setActiveTabState(tab);
64
+ }, [type]);
65
+ const removeMember = useCallback((member) => {
66
+ setSelectedByKey((currentSelected) => removeSelectedMember(currentSelected, member, lockedIds));
67
+ }, [lockedIds]);
68
+ const toggleMember = useCallback((member) => {
69
+ if (isMemberLocked(member, lockedIds)) return;
70
+ setSelectedByKey((currentSelected) => {
71
+ const key = getMemberKey(member);
72
+ return currentSelected.has(key) ? removeSelectedMember(currentSelected, member, lockedIds) : addSelectedMember(currentSelected, member);
73
+ });
74
+ }, [lockedIds]);
75
+ const toggleMembers = useCallback((members, selected) => {
76
+ setSelectedByKey((currentSelected) => setMembersSelected(currentSelected, members, selected, lockedIds));
77
+ }, [lockedIds]);
78
+ return {
79
+ activeTab,
80
+ selectedMembers: useMemo(() => Array.from(selectedByKey.values()), [selectedByKey]),
81
+ selectedByKey,
82
+ hydrating,
83
+ setActiveTab,
84
+ toggleMember,
85
+ toggleMembers,
86
+ removeMember,
87
+ confirm: useCallback(() => {
88
+ onChange?.(Array.from(selectedByKey.values()));
89
+ }, [onChange, selectedByKey])
90
+ };
91
+ }
92
+ //#endregion
93
+ export { useMemberPickerDraft };
94
+
95
+ //# sourceMappingURL=useMemberPickerDraft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMemberPickerDraft.js","names":[],"sources":["../../../src/MemberPicker/dialog/useMemberPickerDraft.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport ConfigProvider from '../../ConfigProvider';\nimport { EMemberPicker } from '../interface';\nimport { EUserType } from '../../ConfigProvider/getUserList';\nimport type { TMemberPickerValue as MemberPickerValue } from '../interface';\nimport type {\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport type { TUser } from '../../ConfigProvider/getUserList';\nimport {\n addSelectedMember,\n createSelectedByKey,\n getMemberKey,\n isMemberLocked,\n removeSelectedMember,\n setMembersSelected,\n} from './helper';\nimport type { TMember, TMemberKey, TMemberPickerTab } from './types';\n\nconst EMPTY_LOCKED_IDS: Array<TUserValue | TUserGroupValue> = [];\n\nconst toValueArray = (\n value?: MemberPickerValue,\n): Array<TUserValue | TUserGroupValue> => {\n if (!value) {\n return [];\n }\n return Array.isArray(value) ? [...value] : [value];\n};\n\n/** 历史值可能只有 ID;占位名称保证不可见对象不会被静默丢弃。 */\nconst toMemberPlaceholder = (value: TUserValue | TUserGroupValue): TMember => {\n if (value.type === EUserType.USER) {\n return {\n ...value,\n type: EUserType.USER,\n name: value.name ?? value.nickname ?? value.account ?? value.userId,\n };\n }\n return {\n ...value,\n type: EUserType.USER_GROUP,\n name: value.name ?? value.groupId,\n parentId: value.parentId ?? null,\n frontId: value.frontId ?? null,\n };\n};\n\nconst needsHydration = (value: TUserValue | TUserGroupValue): boolean => {\n if (value.type === EUserType.USER) {\n return !value.name && !value.nickname && !value.account;\n }\n return !value.name;\n};\n\nexport interface IUseMemberPickerDraftOptions {\n value?: MemberPickerValue;\n type?: EMemberPicker;\n lockedIds?: Array<TUserValue | TUserGroupValue>;\n onChange?: (members: TUser) => void;\n}\n\nexport interface IMemberPickerDraftResult {\n activeTab: TMemberPickerTab;\n selectedMembers: TUser;\n selectedByKey: Map<TMemberKey, TMember>;\n hydrating: boolean;\n setActiveTab: (tab: TMemberPickerTab) => void;\n toggleMember: (member: TMember) => void;\n toggleMembers: (members: readonly TMember[], selected: boolean) => void;\n removeMember: (member: TMember) => void;\n confirm: () => void;\n}\n\n/**\n * 管理单次弹窗内的成员选择草稿。\n *\n * 外部 value 仅用于初始化,增删不会提前触发 onChange;弹窗取消时卸载本 hook,\n * 只有 confirm 会按 Map 的稳定插入顺序一次性提交。\n */\nexport function useMemberPickerDraft({\n value,\n type = EMemberPicker.BOTH,\n lockedIds = EMPTY_LOCKED_IDS,\n onChange,\n}: IUseMemberPickerDraftOptions): IMemberPickerDraftResult {\n const { getUsersByIds } = ConfigProvider.useGetUserList();\n const initialValuesRef = useRef(toValueArray(value));\n const missingValuesRef = useRef(\n initialValuesRef.current.filter(needsHydration),\n );\n const [selectedByKey, setSelectedByKey] = useState(() =>\n createSelectedByKey(initialValuesRef.current.map(toMemberPlaceholder)),\n );\n const [hydrating, setHydrating] = useState(\n missingValuesRef.current.length > 0 && Boolean(getUsersByIds),\n );\n const [activeTab, setActiveTabState] = useState<TMemberPickerTab>(\n type === EMemberPicker.GROUP ? EMemberPicker.GROUP : EMemberPicker.USER,\n );\n\n useEffect(() => {\n const missingValues = missingValuesRef.current;\n if (!missingValues.length || !getUsersByIds) {\n setHydrating(false);\n return undefined;\n }\n\n let active = true;\n getUsersByIds(missingValues)\n .then((hydratedMembers) => {\n if (!active) {\n return;\n }\n const hydratedByKey = createSelectedByKey(\n hydratedMembers.map((member) => toMemberPlaceholder(member)),\n );\n setSelectedByKey(\n (currentSelected) =>\n new Map(\n Array.from(currentSelected).map(([key, member]) => [\n key,\n hydratedByKey.get(key) ?? member,\n ]),\n ),\n );\n })\n .catch(() => undefined)\n .finally(() => {\n if (active) {\n setHydrating(false);\n }\n });\n\n return () => {\n active = false;\n };\n }, [getUsersByIds]);\n\n const setActiveTab = useCallback(\n (tab: TMemberPickerTab) => {\n if (type === EMemberPicker.BOTH) {\n setActiveTabState(tab);\n }\n },\n [type],\n );\n\n const removeMember = useCallback(\n (member: TMember) => {\n setSelectedByKey((currentSelected) =>\n removeSelectedMember(currentSelected, member, lockedIds),\n );\n },\n [lockedIds],\n );\n\n const toggleMember = useCallback(\n (member: TMember) => {\n if (isMemberLocked(member, lockedIds)) {\n return;\n }\n setSelectedByKey((currentSelected) => {\n const key = getMemberKey(member);\n return currentSelected.has(key)\n ? removeSelectedMember(currentSelected, member, lockedIds)\n : addSelectedMember(currentSelected, member);\n });\n },\n [lockedIds],\n );\n\n const toggleMembers = useCallback(\n (members: readonly TMember[], selected: boolean) => {\n setSelectedByKey((currentSelected) =>\n setMembersSelected(currentSelected, members, selected, lockedIds),\n );\n },\n [lockedIds],\n );\n\n const selectedMembers = useMemo<TUser>(\n () => Array.from(selectedByKey.values()),\n [selectedByKey],\n );\n\n const confirm = useCallback(() => {\n onChange?.(Array.from(selectedByKey.values()));\n }, [onChange, selectedByKey]);\n\n return {\n activeTab,\n selectedMembers,\n selectedByKey,\n hydrating,\n setActiveTab,\n toggleMember,\n toggleMembers,\n removeMember,\n confirm,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { IUserGroup } from '../../ConfigProvider/getUserList';
2
+ export interface IUserGroupCandidatesResult {
3
+ breadcrumbPath: IUserGroup[];
4
+ items: IUserGroup[];
5
+ keyword: string;
6
+ pathWarningCode?: string | null;
7
+ truncated?: boolean;
8
+ loading: boolean;
9
+ loadingMore: boolean;
10
+ error: boolean;
11
+ loadMoreError: boolean;
12
+ hasMore: boolean;
13
+ /** 当前层已保存的滚动位置,供候选面板在层级切换后恢复。 */
14
+ scrollTop: number;
15
+ setKeyword: (keyword: string) => void;
16
+ enterGroup: (group: IUserGroup, scrollTop: number) => void;
17
+ returnToBreadcrumb: (index: number, scrollTop: number) => void;
18
+ loadMore: () => void;
19
+ retry: () => void;
20
+ retryLoadMore: () => void;
21
+ updateScrollTop: (scrollTop: number) => void;
22
+ }
23
+ /**
24
+ * 管理受限用户组树与跨层搜索。
25
+ *
26
+ * 树层级缓存和搜索结果分别持有;所有异步响应都受版本号保护,关闭弹窗、
27
+ * 换词、清空或切换层级后,旧响应只能结束自身,不能覆盖当前界面。
28
+ */
29
+ export declare function useUserGroupCandidates(): IUserGroupCandidatesResult;
@@ -0,0 +1,443 @@
1
+ import AldCustomConfigProvider from "../../ConfigProvider/index.js";
2
+ import useDialogLocale from "./useDialogLocale.js";
3
+ import { hasMoreGroupPages, mergeGroupPages } from "./helper.js";
4
+ import "./types.js";
5
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
6
+ //#region src/MemberPicker/dialog/useUserGroupCandidates.ts
7
+ var GROUP_PAGE_SIZE = 100;
8
+ var SEARCH_DEBOUNCE_MS = 300;
9
+ var ROOT_BREADCRUMB_INDEX = -1;
10
+ var createEmptyLevel = (parentGroupId) => ({
11
+ parentGroupId,
12
+ items: [],
13
+ pageNumber: 0,
14
+ hasMore: false,
15
+ scrollTop: 0,
16
+ loadingMore: false,
17
+ loadMoreError: false
18
+ });
19
+ var createEmptySearchState = (keyword = "") => ({
20
+ keyword,
21
+ items: [],
22
+ pageNumber: 0,
23
+ hasMore: false,
24
+ loading: false,
25
+ loadingMore: false,
26
+ error: false,
27
+ loadMoreError: false
28
+ });
29
+ var getLevelKey = (parentGroupId) => parentGroupId ?? "__ROOT_GROUP__";
30
+ /**
31
+ * 管理受限用户组树与跨层搜索。
32
+ *
33
+ * 树层级缓存和搜索结果分别持有;所有异步响应都受版本号保护,关闭弹窗、
34
+ * 换词、清空或切换层级后,旧响应只能结束自身,不能覆盖当前界面。
35
+ */
36
+ function useUserGroupCandidates() {
37
+ const t = useDialogLocale();
38
+ const { getMemberPickerGroupPage, getNextLevelGroup, getNextLevelGroupWithMeta } = AldCustomConfigProvider.useGetUserList();
39
+ const queryUserGroupsPage = useCallback(async (request) => {
40
+ if (getMemberPickerGroupPage) return getMemberPickerGroupPage(request);
41
+ const params = {
42
+ parentGroupId: request.parentGroupId,
43
+ keyword: request.keyword ?? ""
44
+ };
45
+ if (getNextLevelGroupWithMeta) {
46
+ const result = await getNextLevelGroupWithMeta(params);
47
+ return {
48
+ data: result.items,
49
+ pageNumber: request.pager.pageNumber,
50
+ hasMore: false,
51
+ pathWarningCode: result.pathWarningCode,
52
+ truncated: result.hasMore
53
+ };
54
+ }
55
+ if (getNextLevelGroup) return {
56
+ data: await getNextLevelGroup(params),
57
+ pageNumber: request.pager.pageNumber,
58
+ hasMore: false
59
+ };
60
+ throw new Error(t.MemberPickerDialog.missingGroupSource);
61
+ }, [
62
+ getMemberPickerGroupPage,
63
+ getNextLevelGroup,
64
+ getNextLevelGroupWithMeta,
65
+ t.MemberPickerDialog.missingGroupSource
66
+ ]);
67
+ const [breadcrumbPath, setBreadcrumbPath] = useState([]);
68
+ const breadcrumbPathRef = useRef([]);
69
+ const [levelsByParent, setLevelsByParent] = useState(/* @__PURE__ */ new Map());
70
+ const levelsByParentRef = useRef(levelsByParent);
71
+ const activeParentGroupIdRef = useRef();
72
+ const [treeLoading, setTreeLoading] = useState(true);
73
+ const [treeError, setTreeError] = useState(false);
74
+ const [keyword, setKeywordState] = useState("");
75
+ const keywordRef = useRef("");
76
+ const [searchState, setSearchState] = useState(() => createEmptySearchState());
77
+ const searchStateRef = useRef(searchState);
78
+ const requestVersionRef = useRef(0);
79
+ const mountedRef = useRef(true);
80
+ const searchEffectInitializedRef = useRef(false);
81
+ const updateLevels = useCallback((updater) => {
82
+ setLevelsByParent((currentLevels) => {
83
+ const nextLevels = updater(currentLevels);
84
+ levelsByParentRef.current = nextLevels;
85
+ return nextLevels;
86
+ });
87
+ }, []);
88
+ const cancelTreePagination = useCallback(() => {
89
+ updateLevels((levels) => new Map(Array.from(levels, ([key, level]) => [key, level.loadingMore ? {
90
+ ...level,
91
+ loadingMore: false
92
+ } : level])));
93
+ }, [updateLevels]);
94
+ const updateSearchState = useCallback((updater) => {
95
+ setSearchState((currentState) => {
96
+ const nextState = updater(currentState);
97
+ searchStateRef.current = nextState;
98
+ return nextState;
99
+ });
100
+ }, []);
101
+ const isCurrentRequest = useCallback((version) => mountedRef.current && requestVersionRef.current === version, []);
102
+ const loadTreeFirstPage = useCallback((parentGroupId) => {
103
+ const version = requestVersionRef.current + 1;
104
+ requestVersionRef.current = version;
105
+ setTreeLoading(true);
106
+ setTreeError(false);
107
+ queryUserGroupsPage({
108
+ parentGroupId,
109
+ keyword: void 0,
110
+ pager: {
111
+ pageNumber: 1,
112
+ pageSize: GROUP_PAGE_SIZE
113
+ }
114
+ }).then((page) => {
115
+ if (!isCurrentRequest(version)) return;
116
+ updateLevels((currentLevels) => {
117
+ const key = getLevelKey(parentGroupId);
118
+ const previousLevel = currentLevels.get(key);
119
+ return new Map(currentLevels).set(key, {
120
+ parentGroupId,
121
+ items: [...page.data],
122
+ pageNumber: page.pageNumber,
123
+ hasMore: hasMoreGroupPages(page),
124
+ pathWarningCode: page.pathWarningCode,
125
+ truncated: page.truncated,
126
+ scrollTop: previousLevel?.scrollTop ?? 0,
127
+ loadingMore: false,
128
+ loadMoreError: false
129
+ });
130
+ });
131
+ setTreeLoading(false);
132
+ }).catch(() => {
133
+ if (!isCurrentRequest(version)) return;
134
+ setTreeLoading(false);
135
+ setTreeError(true);
136
+ });
137
+ }, [
138
+ isCurrentRequest,
139
+ queryUserGroupsPage,
140
+ updateLevels
141
+ ]);
142
+ useEffect(() => {
143
+ mountedRef.current = true;
144
+ loadTreeFirstPage();
145
+ return () => {
146
+ mountedRef.current = false;
147
+ requestVersionRef.current += 1;
148
+ };
149
+ }, [loadTreeFirstPage]);
150
+ useEffect(() => {
151
+ if (!searchEffectInitializedRef.current) {
152
+ searchEffectInitializedRef.current = true;
153
+ return;
154
+ }
155
+ const normalizedKeyword = keyword.trim();
156
+ cancelTreePagination();
157
+ const version = requestVersionRef.current + 1;
158
+ requestVersionRef.current = version;
159
+ if (!normalizedKeyword) {
160
+ updateSearchState(() => createEmptySearchState(keyword));
161
+ const activeKey = getLevelKey(activeParentGroupIdRef.current);
162
+ if (!levelsByParentRef.current.has(activeKey)) loadTreeFirstPage(activeParentGroupIdRef.current);
163
+ else {
164
+ setTreeLoading(false);
165
+ setTreeError(false);
166
+ }
167
+ return;
168
+ }
169
+ updateSearchState(() => ({
170
+ ...createEmptySearchState(normalizedKeyword),
171
+ loading: true
172
+ }));
173
+ const timer = window.setTimeout(() => {
174
+ queryUserGroupsPage({
175
+ parentGroupId: void 0,
176
+ keyword: normalizedKeyword,
177
+ pager: {
178
+ pageNumber: 1,
179
+ pageSize: GROUP_PAGE_SIZE
180
+ }
181
+ }).then((page) => {
182
+ if (!isCurrentRequest(version)) return;
183
+ updateSearchState((currentState) => ({
184
+ ...currentState,
185
+ keyword: normalizedKeyword,
186
+ items: [...page.data],
187
+ pageNumber: page.pageNumber,
188
+ hasMore: hasMoreGroupPages(page),
189
+ pathWarningCode: page.pathWarningCode,
190
+ truncated: page.truncated,
191
+ loading: false,
192
+ error: false
193
+ }));
194
+ }).catch(() => {
195
+ if (!isCurrentRequest(version)) return;
196
+ updateSearchState((currentState) => ({
197
+ ...currentState,
198
+ loading: false,
199
+ error: true
200
+ }));
201
+ });
202
+ }, SEARCH_DEBOUNCE_MS);
203
+ return () => window.clearTimeout(timer);
204
+ }, [
205
+ cancelTreePagination,
206
+ isCurrentRequest,
207
+ keyword,
208
+ loadTreeFirstPage,
209
+ queryUserGroupsPage,
210
+ updateSearchState
211
+ ]);
212
+ const updateCurrentLevel = useCallback((updater) => {
213
+ const parentGroupId = activeParentGroupIdRef.current;
214
+ const key = getLevelKey(parentGroupId);
215
+ updateLevels((currentLevels) => {
216
+ const level = currentLevels.get(key) ?? createEmptyLevel(parentGroupId);
217
+ return new Map(currentLevels).set(key, updater(level));
218
+ });
219
+ }, [updateLevels]);
220
+ const updateScrollTop = useCallback((scrollTop) => {
221
+ updateCurrentLevel((level) => ({
222
+ ...level,
223
+ scrollTop
224
+ }));
225
+ }, [updateCurrentLevel]);
226
+ const enterGroup = useCallback((group, scrollTop) => {
227
+ updateScrollTop(scrollTop);
228
+ cancelTreePagination();
229
+ const nextBreadcrumbPath = [...breadcrumbPathRef.current, group];
230
+ breadcrumbPathRef.current = nextBreadcrumbPath;
231
+ setBreadcrumbPath(nextBreadcrumbPath);
232
+ activeParentGroupIdRef.current = group.groupId;
233
+ const nextKey = getLevelKey(group.groupId);
234
+ requestVersionRef.current += 1;
235
+ if (levelsByParentRef.current.has(nextKey)) {
236
+ setTreeLoading(false);
237
+ setTreeError(false);
238
+ return;
239
+ }
240
+ loadTreeFirstPage(group.groupId);
241
+ }, [
242
+ cancelTreePagination,
243
+ loadTreeFirstPage,
244
+ updateScrollTop
245
+ ]);
246
+ const returnToBreadcrumb = useCallback((index, scrollTop) => {
247
+ updateScrollTop(scrollTop);
248
+ cancelTreePagination();
249
+ const currentPath = breadcrumbPathRef.current;
250
+ const nextPath = index === ROOT_BREADCRUMB_INDEX ? [] : currentPath.slice(0, index + 1);
251
+ const parentGroupId = nextPath[nextPath.length - 1]?.groupId;
252
+ breadcrumbPathRef.current = nextPath;
253
+ setBreadcrumbPath(nextPath);
254
+ activeParentGroupIdRef.current = parentGroupId;
255
+ requestVersionRef.current += 1;
256
+ const targetKey = getLevelKey(parentGroupId);
257
+ if (levelsByParentRef.current.has(targetKey)) {
258
+ setTreeLoading(false);
259
+ setTreeError(false);
260
+ return;
261
+ }
262
+ loadTreeFirstPage(parentGroupId);
263
+ }, [
264
+ cancelTreePagination,
265
+ loadTreeFirstPage,
266
+ updateScrollTop
267
+ ]);
268
+ const loadTreeMore = useCallback(() => {
269
+ const parentGroupId = activeParentGroupIdRef.current;
270
+ const key = getLevelKey(parentGroupId);
271
+ const level = levelsByParentRef.current.get(key);
272
+ if (!level || !level.hasMore || level.loadingMore) return;
273
+ const nextPageNumber = level.pageNumber + 1;
274
+ const version = requestVersionRef.current + 1;
275
+ requestVersionRef.current = version;
276
+ updateCurrentLevel((currentLevel) => ({
277
+ ...currentLevel,
278
+ loadingMore: true,
279
+ loadMoreError: false
280
+ }));
281
+ queryUserGroupsPage({
282
+ parentGroupId,
283
+ keyword: void 0,
284
+ pager: {
285
+ pageNumber: nextPageNumber,
286
+ pageSize: GROUP_PAGE_SIZE
287
+ }
288
+ }).then((page) => {
289
+ if (!isCurrentRequest(version)) return;
290
+ updateCurrentLevel((currentLevel) => ({
291
+ ...currentLevel,
292
+ items: mergeGroupPages(currentLevel.items, page.data),
293
+ pageNumber: page.pageNumber,
294
+ hasMore: hasMoreGroupPages(page),
295
+ pathWarningCode: currentLevel.pathWarningCode || page.pathWarningCode,
296
+ truncated: currentLevel.truncated || page.truncated,
297
+ loadingMore: false,
298
+ loadMoreError: false
299
+ }));
300
+ }).catch(() => {
301
+ if (!isCurrentRequest(version)) return;
302
+ updateCurrentLevel((currentLevel) => ({
303
+ ...currentLevel,
304
+ loadingMore: false,
305
+ loadMoreError: true
306
+ }));
307
+ });
308
+ }, [
309
+ isCurrentRequest,
310
+ queryUserGroupsPage,
311
+ updateCurrentLevel
312
+ ]);
313
+ const loadSearchMore = useCallback(() => {
314
+ const currentSearch = searchStateRef.current;
315
+ const normalizedKeyword = keywordRef.current.trim();
316
+ if (!normalizedKeyword || currentSearch.loading || !currentSearch.hasMore || currentSearch.loadingMore) return;
317
+ const nextPageNumber = currentSearch.pageNumber + 1;
318
+ const version = requestVersionRef.current + 1;
319
+ requestVersionRef.current = version;
320
+ updateSearchState((state) => ({
321
+ ...state,
322
+ loadingMore: true,
323
+ loadMoreError: false
324
+ }));
325
+ queryUserGroupsPage({
326
+ parentGroupId: void 0,
327
+ keyword: normalizedKeyword,
328
+ pager: {
329
+ pageNumber: nextPageNumber,
330
+ pageSize: GROUP_PAGE_SIZE
331
+ }
332
+ }).then((page) => {
333
+ if (!isCurrentRequest(version)) return;
334
+ updateSearchState((state) => ({
335
+ ...state,
336
+ items: mergeGroupPages(state.items, page.data),
337
+ pageNumber: page.pageNumber,
338
+ hasMore: hasMoreGroupPages(page),
339
+ pathWarningCode: state.pathWarningCode || page.pathWarningCode,
340
+ truncated: state.truncated || page.truncated,
341
+ loadingMore: false,
342
+ loadMoreError: false
343
+ }));
344
+ }).catch(() => {
345
+ if (!isCurrentRequest(version)) return;
346
+ updateSearchState((state) => ({
347
+ ...state,
348
+ loadingMore: false,
349
+ loadMoreError: true
350
+ }));
351
+ });
352
+ }, [
353
+ isCurrentRequest,
354
+ queryUserGroupsPage,
355
+ updateSearchState
356
+ ]);
357
+ const setKeyword = useCallback((nextKeyword) => {
358
+ keywordRef.current = nextKeyword;
359
+ setKeywordState(nextKeyword);
360
+ }, []);
361
+ const isSearching = keyword.trim().length > 0;
362
+ const loadMore = useCallback(() => {
363
+ if (keywordRef.current.trim()) {
364
+ loadSearchMore();
365
+ return;
366
+ }
367
+ loadTreeMore();
368
+ }, [loadSearchMore, loadTreeMore]);
369
+ const retry = useCallback(() => {
370
+ const normalizedKeyword = keywordRef.current.trim();
371
+ if (normalizedKeyword) {
372
+ const version = requestVersionRef.current + 1;
373
+ requestVersionRef.current = version;
374
+ updateSearchState((state) => ({
375
+ ...state,
376
+ loading: true,
377
+ loadingMore: false,
378
+ loadMoreError: false,
379
+ hasMore: false,
380
+ error: false
381
+ }));
382
+ queryUserGroupsPage({
383
+ parentGroupId: void 0,
384
+ keyword: normalizedKeyword,
385
+ pager: {
386
+ pageNumber: 1,
387
+ pageSize: GROUP_PAGE_SIZE
388
+ }
389
+ }).then((page) => {
390
+ if (!isCurrentRequest(version)) return;
391
+ updateSearchState((state) => ({
392
+ ...state,
393
+ items: [...page.data],
394
+ pageNumber: page.pageNumber,
395
+ hasMore: hasMoreGroupPages(page),
396
+ pathWarningCode: page.pathWarningCode,
397
+ truncated: page.truncated,
398
+ loading: false,
399
+ error: false
400
+ }));
401
+ }).catch(() => {
402
+ if (!isCurrentRequest(version)) return;
403
+ updateSearchState((state) => ({
404
+ ...state,
405
+ loading: false,
406
+ error: true
407
+ }));
408
+ });
409
+ return;
410
+ }
411
+ loadTreeFirstPage(activeParentGroupIdRef.current);
412
+ }, [
413
+ isCurrentRequest,
414
+ loadTreeFirstPage,
415
+ queryUserGroupsPage,
416
+ updateSearchState
417
+ ]);
418
+ const currentLevel = useMemo(() => levelsByParent.get(getLevelKey(activeParentGroupIdRef.current)), [levelsByParent]);
419
+ return {
420
+ breadcrumbPath,
421
+ pathWarningCode: isSearching ? searchState.pathWarningCode : currentLevel?.pathWarningCode,
422
+ truncated: isSearching ? searchState.truncated : currentLevel?.truncated,
423
+ items: isSearching ? searchState.items : currentLevel?.items ?? [],
424
+ keyword,
425
+ loading: isSearching ? searchState.loading : treeLoading,
426
+ loadingMore: isSearching ? searchState.loadingMore : currentLevel?.loadingMore ?? false,
427
+ error: isSearching ? searchState.error : treeError,
428
+ loadMoreError: isSearching ? searchState.loadMoreError : currentLevel?.loadMoreError ?? false,
429
+ hasMore: isSearching ? searchState.hasMore : currentLevel?.hasMore ?? false,
430
+ scrollTop: currentLevel?.scrollTop ?? 0,
431
+ setKeyword,
432
+ enterGroup,
433
+ returnToBreadcrumb,
434
+ loadMore,
435
+ retry,
436
+ retryLoadMore: loadMore,
437
+ updateScrollTop
438
+ };
439
+ }
440
+ //#endregion
441
+ export { useUserGroupCandidates };
442
+
443
+ //# sourceMappingURL=useUserGroupCandidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUserGroupCandidates.js","names":[],"sources":["../../../src/MemberPicker/dialog/useUserGroupCandidates.ts"],"sourcesContent":["import useDialogLocale from './useDialogLocale';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport ConfigProvider from '../../ConfigProvider';\nimport type {\n IUserGroup,\n MemberGroupPageRequest,\n MemberGroupPage,\n} from '../../ConfigProvider/getUserList';\nimport { hasMoreGroupPages, mergeGroupPages } from './helper';\nimport {\n ROOT_GROUP_CACHE_KEY,\n type IGroupLevelCache,\n type IGroupSearchState,\n} from './types';\n\nconst GROUP_PAGE_SIZE = 100;\nconst SEARCH_DEBOUNCE_MS = 300;\nconst ROOT_BREADCRUMB_INDEX = -1;\n\nconst createEmptyLevel = (parentGroupId?: string): IGroupLevelCache => ({\n parentGroupId,\n items: [],\n pageNumber: 0,\n hasMore: false,\n scrollTop: 0,\n loadingMore: false,\n loadMoreError: false,\n});\n\nconst createEmptySearchState = (keyword = ''): IGroupSearchState => ({\n keyword,\n items: [],\n pageNumber: 0,\n hasMore: false,\n loading: false,\n loadingMore: false,\n error: false,\n loadMoreError: false,\n});\n\nconst getLevelKey = (parentGroupId?: string): string =>\n parentGroupId ?? ROOT_GROUP_CACHE_KEY;\n\nexport interface IUserGroupCandidatesResult {\n breadcrumbPath: IUserGroup[];\n items: IUserGroup[];\n keyword: string;\n pathWarningCode?: string | null;\n truncated?: boolean;\n loading: boolean;\n loadingMore: boolean;\n error: boolean;\n loadMoreError: boolean;\n hasMore: boolean;\n /** 当前层已保存的滚动位置,供候选面板在层级切换后恢复。 */\n scrollTop: number;\n setKeyword: (keyword: string) => void;\n enterGroup: (group: IUserGroup, scrollTop: number) => void;\n returnToBreadcrumb: (index: number, scrollTop: number) => void;\n loadMore: () => void;\n retry: () => void;\n retryLoadMore: () => void;\n updateScrollTop: (scrollTop: number) => void;\n}\n\n/**\n * 管理受限用户组树与跨层搜索。\n *\n * 树层级缓存和搜索结果分别持有;所有异步响应都受版本号保护,关闭弹窗、\n * 换词、清空或切换层级后,旧响应只能结束自身,不能覆盖当前界面。\n */\nexport function useUserGroupCandidates(): IUserGroupCandidatesResult {\n const t = useDialogLocale();\n const {\n getMemberPickerGroupPage,\n getNextLevelGroup,\n getNextLevelGroupWithMeta,\n } = ConfigProvider.useGetUserList();\n const queryUserGroupsPage = useCallback(\n async (request: MemberGroupPageRequest): Promise<MemberGroupPage> => {\n if (getMemberPickerGroupPage) return getMemberPickerGroupPage(request);\n const params = {\n parentGroupId: request.parentGroupId,\n keyword: request.keyword ?? '',\n };\n if (getNextLevelGroupWithMeta) {\n const result = await getNextLevelGroupWithMeta(params);\n // 旧接口没有页码能力:保留截断提示,不反复获取同一页。\n return {\n data: result.items,\n pageNumber: request.pager.pageNumber,\n hasMore: false,\n pathWarningCode: result.pathWarningCode,\n truncated: result.hasMore,\n };\n }\n if (getNextLevelGroup)\n return {\n data: await getNextLevelGroup(params),\n pageNumber: request.pager.pageNumber,\n hasMore: false,\n };\n throw new Error(t.MemberPickerDialog.missingGroupSource);\n },\n [\n getMemberPickerGroupPage,\n getNextLevelGroup,\n getNextLevelGroupWithMeta,\n t.MemberPickerDialog.missingGroupSource,\n ],\n );\n const [breadcrumbPath, setBreadcrumbPath] = useState<IUserGroup[]>([]);\n const breadcrumbPathRef = useRef<IUserGroup[]>([]);\n const [levelsByParent, setLevelsByParent] = useState<\n Map<string, IGroupLevelCache>\n >(new Map());\n const levelsByParentRef = useRef(levelsByParent);\n const activeParentGroupIdRef = useRef<string>();\n const [treeLoading, setTreeLoading] = useState(true);\n const [treeError, setTreeError] = useState(false);\n const [keyword, setKeywordState] = useState('');\n const keywordRef = useRef('');\n const [searchState, setSearchState] = useState<IGroupSearchState>(() =>\n createEmptySearchState(),\n );\n const searchStateRef = useRef(searchState);\n const requestVersionRef = useRef(0);\n const mountedRef = useRef(true);\n const searchEffectInitializedRef = useRef(false);\n\n const updateLevels = useCallback(\n (\n updater: (\n levels: Map<string, IGroupLevelCache>,\n ) => Map<string, IGroupLevelCache>,\n ) => {\n setLevelsByParent((currentLevels) => {\n const nextLevels = updater(currentLevels);\n levelsByParentRef.current = nextLevels;\n return nextLevels;\n });\n },\n [],\n );\n\n // 切层或转搜索会废弃当前请求,同时释放缓存层的分页锁,返回该层仍可继续加载。\n const cancelTreePagination = useCallback(() => {\n updateLevels(\n (levels) =>\n new Map(\n Array.from(levels, ([key, level]) => [\n key,\n level.loadingMore ? { ...level, loadingMore: false } : level,\n ]),\n ),\n );\n }, [updateLevels]);\n\n const updateSearchState = useCallback(\n (updater: (state: IGroupSearchState) => IGroupSearchState) => {\n setSearchState((currentState) => {\n const nextState = updater(currentState);\n searchStateRef.current = nextState;\n return nextState;\n });\n },\n [],\n );\n\n const isCurrentRequest = useCallback(\n (version: number): boolean =>\n mountedRef.current && requestVersionRef.current === version,\n [],\n );\n\n const loadTreeFirstPage = useCallback(\n (parentGroupId?: string) => {\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n setTreeLoading(true);\n setTreeError(false);\n queryUserGroupsPage({\n parentGroupId,\n keyword: undefined,\n pager: { pageNumber: 1, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateLevels((currentLevels) => {\n const key = getLevelKey(parentGroupId);\n const previousLevel = currentLevels.get(key);\n return new Map(currentLevels).set(key, {\n parentGroupId,\n items: [...page.data],\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: page.pathWarningCode,\n truncated: page.truncated,\n scrollTop: previousLevel?.scrollTop ?? 0,\n loadingMore: false,\n loadMoreError: false,\n });\n });\n setTreeLoading(false);\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n setTreeLoading(false);\n setTreeError(true);\n });\n },\n [isCurrentRequest, queryUserGroupsPage, updateLevels],\n );\n\n useEffect(() => {\n mountedRef.current = true;\n loadTreeFirstPage();\n return () => {\n mountedRef.current = false;\n requestVersionRef.current += 1;\n };\n }, [loadTreeFirstPage]);\n\n useEffect(() => {\n if (!searchEffectInitializedRef.current) {\n searchEffectInitializedRef.current = true;\n return undefined;\n }\n\n const normalizedKeyword = keyword.trim();\n cancelTreePagination();\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n if (!normalizedKeyword) {\n updateSearchState(() => createEmptySearchState(keyword));\n const activeKey = getLevelKey(activeParentGroupIdRef.current);\n if (!levelsByParentRef.current.has(activeKey)) {\n loadTreeFirstPage(activeParentGroupIdRef.current);\n } else {\n setTreeLoading(false);\n setTreeError(false);\n }\n return undefined;\n }\n\n updateSearchState(() => ({\n ...createEmptySearchState(normalizedKeyword),\n loading: true,\n }));\n const timer = window.setTimeout(() => {\n queryUserGroupsPage({\n parentGroupId: undefined,\n keyword: normalizedKeyword,\n pager: { pageNumber: 1, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((currentState) => ({\n ...currentState,\n keyword: normalizedKeyword,\n items: [...page.data],\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: page.pathWarningCode,\n truncated: page.truncated,\n loading: false,\n error: false,\n }));\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((currentState) => ({\n ...currentState,\n loading: false,\n error: true,\n }));\n });\n }, SEARCH_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timer);\n }, [\n cancelTreePagination,\n isCurrentRequest,\n keyword,\n loadTreeFirstPage,\n queryUserGroupsPage,\n updateSearchState,\n ]);\n\n const updateCurrentLevel = useCallback(\n (updater: (level: IGroupLevelCache) => IGroupLevelCache) => {\n const parentGroupId = activeParentGroupIdRef.current;\n const key = getLevelKey(parentGroupId);\n updateLevels((currentLevels) => {\n const level = currentLevels.get(key) ?? createEmptyLevel(parentGroupId);\n return new Map(currentLevels).set(key, updater(level));\n });\n },\n [updateLevels],\n );\n\n const updateScrollTop = useCallback(\n (scrollTop: number) => {\n updateCurrentLevel((level) => ({ ...level, scrollTop }));\n },\n [updateCurrentLevel],\n );\n\n const enterGroup = useCallback(\n (group: IUserGroup, scrollTop: number) => {\n updateScrollTop(scrollTop);\n cancelTreePagination();\n const nextBreadcrumbPath = [...breadcrumbPathRef.current, group];\n breadcrumbPathRef.current = nextBreadcrumbPath;\n setBreadcrumbPath(nextBreadcrumbPath);\n activeParentGroupIdRef.current = group.groupId;\n const nextKey = getLevelKey(group.groupId);\n requestVersionRef.current += 1;\n if (levelsByParentRef.current.has(nextKey)) {\n setTreeLoading(false);\n setTreeError(false);\n return;\n }\n loadTreeFirstPage(group.groupId);\n },\n [cancelTreePagination, loadTreeFirstPage, updateScrollTop],\n );\n\n const returnToBreadcrumb = useCallback(\n (index: number, scrollTop: number) => {\n updateScrollTop(scrollTop);\n cancelTreePagination();\n const currentPath = breadcrumbPathRef.current;\n const nextPath =\n index === ROOT_BREADCRUMB_INDEX ? [] : currentPath.slice(0, index + 1);\n const parentGroupId = nextPath[nextPath.length - 1]?.groupId;\n breadcrumbPathRef.current = nextPath;\n setBreadcrumbPath(nextPath);\n activeParentGroupIdRef.current = parentGroupId;\n requestVersionRef.current += 1;\n const targetKey = getLevelKey(parentGroupId);\n if (levelsByParentRef.current.has(targetKey)) {\n setTreeLoading(false);\n setTreeError(false);\n return;\n }\n loadTreeFirstPage(parentGroupId);\n },\n [cancelTreePagination, loadTreeFirstPage, updateScrollTop],\n );\n\n const loadTreeMore = useCallback(() => {\n const parentGroupId = activeParentGroupIdRef.current;\n const key = getLevelKey(parentGroupId);\n const level = levelsByParentRef.current.get(key);\n if (!level || !level.hasMore || level.loadingMore) {\n return;\n }\n const nextPageNumber = level.pageNumber + 1;\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n updateCurrentLevel((currentLevel) => ({\n ...currentLevel,\n loadingMore: true,\n loadMoreError: false,\n }));\n queryUserGroupsPage({\n parentGroupId,\n keyword: undefined,\n pager: { pageNumber: nextPageNumber, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateCurrentLevel((currentLevel) => ({\n ...currentLevel,\n items: mergeGroupPages(currentLevel.items, page.data),\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: currentLevel.pathWarningCode || page.pathWarningCode,\n truncated: currentLevel.truncated || page.truncated,\n loadingMore: false,\n loadMoreError: false,\n }));\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateCurrentLevel((currentLevel) => ({\n ...currentLevel,\n loadingMore: false,\n loadMoreError: true,\n }));\n });\n }, [isCurrentRequest, queryUserGroupsPage, updateCurrentLevel]);\n\n const loadSearchMore = useCallback(() => {\n const currentSearch = searchStateRef.current;\n const normalizedKeyword = keywordRef.current.trim();\n if (\n !normalizedKeyword ||\n currentSearch.loading ||\n !currentSearch.hasMore ||\n currentSearch.loadingMore\n ) {\n return;\n }\n const nextPageNumber = currentSearch.pageNumber + 1;\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n updateSearchState((state) => ({\n ...state,\n loadingMore: true,\n loadMoreError: false,\n }));\n queryUserGroupsPage({\n parentGroupId: undefined,\n keyword: normalizedKeyword,\n pager: { pageNumber: nextPageNumber, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((state) => ({\n ...state,\n items: mergeGroupPages(state.items, page.data),\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: state.pathWarningCode || page.pathWarningCode,\n truncated: state.truncated || page.truncated,\n loadingMore: false,\n loadMoreError: false,\n }));\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((state) => ({\n ...state,\n loadingMore: false,\n loadMoreError: true,\n }));\n });\n }, [isCurrentRequest, queryUserGroupsPage, updateSearchState]);\n\n const setKeyword = useCallback((nextKeyword: string) => {\n keywordRef.current = nextKeyword;\n setKeywordState(nextKeyword);\n }, []);\n\n const isSearching = keyword.trim().length > 0;\n const loadMore = useCallback(() => {\n if (keywordRef.current.trim()) {\n loadSearchMore();\n return;\n }\n loadTreeMore();\n }, [loadSearchMore, loadTreeMore]);\n\n const retry = useCallback(() => {\n const normalizedKeyword = keywordRef.current.trim();\n if (normalizedKeyword) {\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n updateSearchState((state) => ({\n ...state,\n loading: true,\n loadingMore: false,\n loadMoreError: false,\n hasMore: false,\n error: false,\n }));\n queryUserGroupsPage({\n parentGroupId: undefined,\n keyword: normalizedKeyword,\n pager: { pageNumber: 1, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((state) => ({\n ...state,\n items: [...page.data],\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: page.pathWarningCode,\n truncated: page.truncated,\n loading: false,\n error: false,\n }));\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((state) => ({\n ...state,\n loading: false,\n error: true,\n }));\n });\n return;\n }\n loadTreeFirstPage(activeParentGroupIdRef.current);\n }, [\n isCurrentRequest,\n loadTreeFirstPage,\n queryUserGroupsPage,\n updateSearchState,\n ]);\n\n const currentLevel = useMemo(\n () => levelsByParent.get(getLevelKey(activeParentGroupIdRef.current)),\n [levelsByParent],\n );\n\n return {\n breadcrumbPath,\n pathWarningCode: isSearching\n ? searchState.pathWarningCode\n : currentLevel?.pathWarningCode,\n truncated: isSearching ? searchState.truncated : currentLevel?.truncated,\n items: isSearching ? searchState.items : currentLevel?.items ?? [],\n keyword,\n loading: isSearching ? searchState.loading : treeLoading,\n loadingMore: isSearching\n ? searchState.loadingMore\n : currentLevel?.loadingMore ?? false,\n error: isSearching ? searchState.error : treeError,\n loadMoreError: isSearching\n ? searchState.loadMoreError\n : currentLevel?.loadMoreError ?? false,\n hasMore: isSearching ? searchState.hasMore : currentLevel?.hasMore ?? false,\n scrollTop: currentLevel?.scrollTop ?? 0,\n setKeyword,\n enterGroup,\n returnToBreadcrumb,\n loadMore,\n retry,\n retryLoadMore: loadMore,\n updateScrollTop,\n };\n}\n"],"mappings":";;;;;;AAeA,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAC3B,IAAM,wBAAwB;AAE9B,IAAM,oBAAoB,mBAA8C;CACtE;CACA,OAAO,EAAE;CACT,YAAY;CACZ,SAAS;CACT,WAAW;CACX,aAAa;CACb,eAAe;CAChB;AAED,IAAM,0BAA0B,UAAU,QAA2B;CACnE;CACA,OAAO,EAAE;CACT,YAAY;CACZ,SAAS;CACT,SAAS;CACT,aAAa;CACb,OAAO;CACP,eAAe;CAChB;AAED,IAAM,eAAe,kBACnB,iBAAA;;;;;;;AA8BF,SAAgB,yBAAqD;CACnE,MAAM,IAAI,iBAAiB;CAC3B,MAAM,EACJ,0BACA,mBACA,8BACE,wBAAe,gBAAgB;CACnC,MAAM,sBAAsB,YAC1B,OAAO,YAA8D;AACnE,MAAI,yBAA0B,QAAO,yBAAyB,QAAQ;EACtE,MAAM,SAAS;GACb,eAAe,QAAQ;GACvB,SAAS,QAAQ,WAAW;GAC7B;AACD,MAAI,2BAA2B;GAC7B,MAAM,SAAS,MAAM,0BAA0B,OAAO;AAEtD,UAAO;IACL,MAAM,OAAO;IACb,YAAY,QAAQ,MAAM;IAC1B,SAAS;IACT,iBAAiB,OAAO;IACxB,WAAW,OAAO;IACnB;;AAEH,MAAI,kBACF,QAAO;GACL,MAAM,MAAM,kBAAkB,OAAO;GACrC,YAAY,QAAQ,MAAM;GAC1B,SAAS;GACV;AACH,QAAM,IAAI,MAAM,EAAE,mBAAmB,mBAAmB;IAE1D;EACE;EACA;EACA;EACA,EAAE,mBAAmB;EACtB,CACF;CACD,MAAM,CAAC,gBAAgB,qBAAqB,SAAuB,EAAE,CAAC;CACtE,MAAM,oBAAoB,OAAqB,EAAE,CAAC;CAClD,MAAM,CAAC,gBAAgB,qBAAqB,yBAE1C,IAAI,KAAK,CAAC;CACZ,MAAM,oBAAoB,OAAO,eAAe;CAChD,MAAM,yBAAyB,QAAgB;CAC/C,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;CACpD,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CACjD,MAAM,CAAC,SAAS,mBAAmB,SAAS,GAAG;CAC/C,MAAM,aAAa,OAAO,GAAG;CAC7B,MAAM,CAAC,aAAa,kBAAkB,eACpC,wBAAwB,CACzB;CACD,MAAM,iBAAiB,OAAO,YAAY;CAC1C,MAAM,oBAAoB,OAAO,EAAE;CACnC,MAAM,aAAa,OAAO,KAAK;CAC/B,MAAM,6BAA6B,OAAO,MAAM;CAEhD,MAAM,eAAe,aAEjB,YAGG;AACH,qBAAmB,kBAAkB;GACnC,MAAM,aAAa,QAAQ,cAAc;AACzC,qBAAkB,UAAU;AAC5B,UAAO;IACP;IAEJ,EAAE,CACH;CAGD,MAAM,uBAAuB,kBAAkB;AAC7C,gBACG,WACC,IAAI,IACF,MAAM,KAAK,SAAS,CAAC,KAAK,WAAW,CACnC,KACA,MAAM,cAAc;GAAE,GAAG;GAAO,aAAa;GAAO,GAAG,MACxD,CAAC,CACH,CACJ;IACA,CAAC,aAAa,CAAC;CAElB,MAAM,oBAAoB,aACvB,YAA6D;AAC5D,kBAAgB,iBAAiB;GAC/B,MAAM,YAAY,QAAQ,aAAa;AACvC,kBAAe,UAAU;AACzB,UAAO;IACP;IAEJ,EAAE,CACH;CAED,MAAM,mBAAmB,aACtB,YACC,WAAW,WAAW,kBAAkB,YAAY,SACtD,EAAE,CACH;CAED,MAAM,oBAAoB,aACvB,kBAA2B;EAC1B,MAAM,UAAU,kBAAkB,UAAU;AAC5C,oBAAkB,UAAU;AAC5B,iBAAe,KAAK;AACpB,eAAa,MAAM;AACnB,sBAAoB;GAClB;GACA,SAAS;GACT,OAAO;IAAE,YAAY;IAAG,UAAU;IAAiB;GACpD,CAAC,CACC,MAAM,SAAS;AACd,OAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,iBAAc,kBAAkB;IAC9B,MAAM,MAAM,YAAY,cAAc;IACtC,MAAM,gBAAgB,cAAc,IAAI,IAAI;AAC5C,WAAO,IAAI,IAAI,cAAc,CAAC,IAAI,KAAK;KACrC;KACA,OAAO,CAAC,GAAG,KAAK,KAAK;KACrB,YAAY,KAAK;KACjB,SAAS,kBAAkB,KAAK;KAChC,iBAAiB,KAAK;KACtB,WAAW,KAAK;KAChB,WAAW,eAAe,aAAa;KACvC,aAAa;KACb,eAAe;KAChB,CAAC;KACF;AACF,kBAAe,MAAM;IACrB,CACD,YAAY;AACX,OAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,kBAAe,MAAM;AACrB,gBAAa,KAAK;IAClB;IAEN;EAAC;EAAkB;EAAqB;EAAa,CACtD;AAED,iBAAgB;AACd,aAAW,UAAU;AACrB,qBAAmB;AACnB,eAAa;AACX,cAAW,UAAU;AACrB,qBAAkB,WAAW;;IAE9B,CAAC,kBAAkB,CAAC;AAEvB,iBAAgB;AACd,MAAI,CAAC,2BAA2B,SAAS;AACvC,8BAA2B,UAAU;AACrC;;EAGF,MAAM,oBAAoB,QAAQ,MAAM;AACxC,wBAAsB;EACtB,MAAM,UAAU,kBAAkB,UAAU;AAC5C,oBAAkB,UAAU;AAC5B,MAAI,CAAC,mBAAmB;AACtB,2BAAwB,uBAAuB,QAAQ,CAAC;GACxD,MAAM,YAAY,YAAY,uBAAuB,QAAQ;AAC7D,OAAI,CAAC,kBAAkB,QAAQ,IAAI,UAAU,CAC3C,mBAAkB,uBAAuB,QAAQ;QAC5C;AACL,mBAAe,MAAM;AACrB,iBAAa,MAAM;;AAErB;;AAGF,2BAAyB;GACvB,GAAG,uBAAuB,kBAAkB;GAC5C,SAAS;GACV,EAAE;EACH,MAAM,QAAQ,OAAO,iBAAiB;AACpC,uBAAoB;IAClB,eAAe;IACf,SAAS;IACT,OAAO;KAAE,YAAY;KAAG,UAAU;KAAiB;IACpD,CAAC,CACC,MAAM,SAAS;AACd,QAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,uBAAmB,kBAAkB;KACnC,GAAG;KACH,SAAS;KACT,OAAO,CAAC,GAAG,KAAK,KAAK;KACrB,YAAY,KAAK;KACjB,SAAS,kBAAkB,KAAK;KAChC,iBAAiB,KAAK;KACtB,WAAW,KAAK;KAChB,SAAS;KACT,OAAO;KACR,EAAE;KACH,CACD,YAAY;AACX,QAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,uBAAmB,kBAAkB;KACnC,GAAG;KACH,SAAS;KACT,OAAO;KACR,EAAE;KACH;KACH,mBAAmB;AAEtB,eAAa,OAAO,aAAa,MAAM;IACtC;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,qBAAqB,aACxB,YAA2D;EAC1D,MAAM,gBAAgB,uBAAuB;EAC7C,MAAM,MAAM,YAAY,cAAc;AACtC,gBAAc,kBAAkB;GAC9B,MAAM,QAAQ,cAAc,IAAI,IAAI,IAAI,iBAAiB,cAAc;AACvE,UAAO,IAAI,IAAI,cAAc,CAAC,IAAI,KAAK,QAAQ,MAAM,CAAC;IACtD;IAEJ,CAAC,aAAa,CACf;CAED,MAAM,kBAAkB,aACrB,cAAsB;AACrB,sBAAoB,WAAW;GAAE,GAAG;GAAO;GAAW,EAAE;IAE1D,CAAC,mBAAmB,CACrB;CAED,MAAM,aAAa,aAChB,OAAmB,cAAsB;AACxC,kBAAgB,UAAU;AAC1B,wBAAsB;EACtB,MAAM,qBAAqB,CAAC,GAAG,kBAAkB,SAAS,MAAM;AAChE,oBAAkB,UAAU;AAC5B,oBAAkB,mBAAmB;AACrC,yBAAuB,UAAU,MAAM;EACvC,MAAM,UAAU,YAAY,MAAM,QAAQ;AAC1C,oBAAkB,WAAW;AAC7B,MAAI,kBAAkB,QAAQ,IAAI,QAAQ,EAAE;AAC1C,kBAAe,MAAM;AACrB,gBAAa,MAAM;AACnB;;AAEF,oBAAkB,MAAM,QAAQ;IAElC;EAAC;EAAsB;EAAmB;EAAgB,CAC3D;CAED,MAAM,qBAAqB,aACxB,OAAe,cAAsB;AACpC,kBAAgB,UAAU;AAC1B,wBAAsB;EACtB,MAAM,cAAc,kBAAkB;EACtC,MAAM,WACJ,UAAU,wBAAwB,EAAE,GAAG,YAAY,MAAM,GAAG,QAAQ,EAAE;EACxE,MAAM,gBAAgB,SAAS,SAAS,SAAS,IAAI;AACrD,oBAAkB,UAAU;AAC5B,oBAAkB,SAAS;AAC3B,yBAAuB,UAAU;AACjC,oBAAkB,WAAW;EAC7B,MAAM,YAAY,YAAY,cAAc;AAC5C,MAAI,kBAAkB,QAAQ,IAAI,UAAU,EAAE;AAC5C,kBAAe,MAAM;AACrB,gBAAa,MAAM;AACnB;;AAEF,oBAAkB,cAAc;IAElC;EAAC;EAAsB;EAAmB;EAAgB,CAC3D;CAED,MAAM,eAAe,kBAAkB;EACrC,MAAM,gBAAgB,uBAAuB;EAC7C,MAAM,MAAM,YAAY,cAAc;EACtC,MAAM,QAAQ,kBAAkB,QAAQ,IAAI,IAAI;AAChD,MAAI,CAAC,SAAS,CAAC,MAAM,WAAW,MAAM,YACpC;EAEF,MAAM,iBAAiB,MAAM,aAAa;EAC1C,MAAM,UAAU,kBAAkB,UAAU;AAC5C,oBAAkB,UAAU;AAC5B,sBAAoB,kBAAkB;GACpC,GAAG;GACH,aAAa;GACb,eAAe;GAChB,EAAE;AACH,sBAAoB;GAClB;GACA,SAAS;GACT,OAAO;IAAE,YAAY;IAAgB,UAAU;IAAiB;GACjE,CAAC,CACC,MAAM,SAAS;AACd,OAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,uBAAoB,kBAAkB;IACpC,GAAG;IACH,OAAO,gBAAgB,aAAa,OAAO,KAAK,KAAK;IACrD,YAAY,KAAK;IACjB,SAAS,kBAAkB,KAAK;IAChC,iBAAiB,aAAa,mBAAmB,KAAK;IACtD,WAAW,aAAa,aAAa,KAAK;IAC1C,aAAa;IACb,eAAe;IAChB,EAAE;IACH,CACD,YAAY;AACX,OAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,uBAAoB,kBAAkB;IACpC,GAAG;IACH,aAAa;IACb,eAAe;IAChB,EAAE;IACH;IACH;EAAC;EAAkB;EAAqB;EAAmB,CAAC;CAE/D,MAAM,iBAAiB,kBAAkB;EACvC,MAAM,gBAAgB,eAAe;EACrC,MAAM,oBAAoB,WAAW,QAAQ,MAAM;AACnD,MACE,CAAC,qBACD,cAAc,WACd,CAAC,cAAc,WACf,cAAc,YAEd;EAEF,MAAM,iBAAiB,cAAc,aAAa;EAClD,MAAM,UAAU,kBAAkB,UAAU;AAC5C,oBAAkB,UAAU;AAC5B,qBAAmB,WAAW;GAC5B,GAAG;GACH,aAAa;GACb,eAAe;GAChB,EAAE;AACH,sBAAoB;GAClB,eAAe;GACf,SAAS;GACT,OAAO;IAAE,YAAY;IAAgB,UAAU;IAAiB;GACjE,CAAC,CACC,MAAM,SAAS;AACd,OAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,sBAAmB,WAAW;IAC5B,GAAG;IACH,OAAO,gBAAgB,MAAM,OAAO,KAAK,KAAK;IAC9C,YAAY,KAAK;IACjB,SAAS,kBAAkB,KAAK;IAChC,iBAAiB,MAAM,mBAAmB,KAAK;IAC/C,WAAW,MAAM,aAAa,KAAK;IACnC,aAAa;IACb,eAAe;IAChB,EAAE;IACH,CACD,YAAY;AACX,OAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,sBAAmB,WAAW;IAC5B,GAAG;IACH,aAAa;IACb,eAAe;IAChB,EAAE;IACH;IACH;EAAC;EAAkB;EAAqB;EAAkB,CAAC;CAE9D,MAAM,aAAa,aAAa,gBAAwB;AACtD,aAAW,UAAU;AACrB,kBAAgB,YAAY;IAC3B,EAAE,CAAC;CAEN,MAAM,cAAc,QAAQ,MAAM,CAAC,SAAS;CAC5C,MAAM,WAAW,kBAAkB;AACjC,MAAI,WAAW,QAAQ,MAAM,EAAE;AAC7B,mBAAgB;AAChB;;AAEF,gBAAc;IACb,CAAC,gBAAgB,aAAa,CAAC;CAElC,MAAM,QAAQ,kBAAkB;EAC9B,MAAM,oBAAoB,WAAW,QAAQ,MAAM;AACnD,MAAI,mBAAmB;GACrB,MAAM,UAAU,kBAAkB,UAAU;AAC5C,qBAAkB,UAAU;AAC5B,sBAAmB,WAAW;IAC5B,GAAG;IACH,SAAS;IACT,aAAa;IACb,eAAe;IACf,SAAS;IACT,OAAO;IACR,EAAE;AACH,uBAAoB;IAClB,eAAe;IACf,SAAS;IACT,OAAO;KAAE,YAAY;KAAG,UAAU;KAAiB;IACpD,CAAC,CACC,MAAM,SAAS;AACd,QAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,uBAAmB,WAAW;KAC5B,GAAG;KACH,OAAO,CAAC,GAAG,KAAK,KAAK;KACrB,YAAY,KAAK;KACjB,SAAS,kBAAkB,KAAK;KAChC,iBAAiB,KAAK;KACtB,WAAW,KAAK;KAChB,SAAS;KACT,OAAO;KACR,EAAE;KACH,CACD,YAAY;AACX,QAAI,CAAC,iBAAiB,QAAQ,CAC5B;AAEF,uBAAmB,WAAW;KAC5B,GAAG;KACH,SAAS;KACT,OAAO;KACR,EAAE;KACH;AACJ;;AAEF,oBAAkB,uBAAuB,QAAQ;IAChD;EACD;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,eAAe,cACb,eAAe,IAAI,YAAY,uBAAuB,QAAQ,CAAC,EACrE,CAAC,eAAe,CACjB;AAED,QAAO;EACL;EACA,iBAAiB,cACb,YAAY,kBACZ,cAAc;EAClB,WAAW,cAAc,YAAY,YAAY,cAAc;EAC/D,OAAO,cAAc,YAAY,QAAQ,cAAc,SAAS,EAAE;EAClE;EACA,SAAS,cAAc,YAAY,UAAU;EAC7C,aAAa,cACT,YAAY,cACZ,cAAc,eAAe;EACjC,OAAO,cAAc,YAAY,QAAQ;EACzC,eAAe,cACX,YAAY,gBACZ,cAAc,iBAAiB;EACnC,SAAS,cAAc,YAAY,UAAU,cAAc,WAAW;EACtE,WAAW,cAAc,aAAa;EACtC;EACA;EACA;EACA;EACA;EACA,eAAe;EACf;EACD"}
@@ -1,7 +1,9 @@
1
+ import { default as MemberPickerDialog } from './dialog/MemberPickerDialog.js';
1
2
  import { default as React } from 'react';
2
3
  import { default as MemberPanel } from './components/PanelWrapper.js';
3
4
  import { IMemberPickerProps } from './interface.js';
4
5
  declare const MemberSelector: React.FC<IMemberPickerProps> & {
5
6
  MemberPanel: typeof MemberPanel;
7
+ Dialog: typeof MemberPickerDialog;
6
8
  };
7
9
  export default MemberSelector;