v-dict 2.0.4 → 2.0.6

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.
@@ -177,7 +177,7 @@ function createDictManager(createDictManagerOptions = {}) {
177
177
  );
178
178
  defineDictOptionsMap.set(code, cloneDeep(_defineDictOptions));
179
179
  const { data, remote, fetch, extra, transformer, itemTransformer } = _defineDictOptions;
180
- let globalLoadPromise = null;
180
+ let globalLoadPromise = createPromise();
181
181
  let init = false;
182
182
  async function loadDict(options, map = /* @__PURE__ */ new Map()) {
183
183
  var _a;
@@ -224,10 +224,14 @@ function createDictManager(createDictManagerOptions = {}) {
224
224
  return [key, (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key];
225
225
  })
226
226
  );
227
+ const getItem = (value) => {
228
+ return value !== null && value !== void 0 ? newObj[value] : null;
229
+ };
227
230
  return {
228
231
  map: newObj,
229
232
  list: newList,
230
- E: newE
233
+ E: newE,
234
+ getItem
231
235
  };
232
236
  };
233
237
  function useDict(useDictOptions = {}) {
@@ -238,86 +242,77 @@ function createDictManager(createDictManagerOptions = {}) {
238
242
  ...useDictOptions
239
243
  };
240
244
  const { clone, immediate, refresh } = mergedOptions;
241
- const loadPromiseRef = react.useRef(
242
- !clone ? globalLoadPromise : createPromise()
243
- );
245
+ const stateRef = react.useRef(createStateFromMap());
246
+ const clonedLoadPromiseRef = react.useRef(null);
244
247
  const globalMap = react.useSyncExternalStore(subscribeMap, getMapSnapshot);
245
248
  const [clonedMap, setClonedMap] = react.useState(/* @__PURE__ */ new Map());
249
+ const loadPromise = !clone ? globalLoadPromise : clonedLoadPromiseRef.current;
246
250
  const map = !clone ? globalMap : clonedMap;
247
- const state = react.useMemo(
248
- () => createStateFromMap(map),
249
- [map]
250
- );
251
+ const state = react.useMemo(() => createStateFromMap(map), [map]);
251
252
  const load = react.useCallback((options) => {
252
- const oldLoadPromise = loadPromiseRef.current;
253
- loadPromiseRef.current = createPromise();
253
+ const oldLoadPromise = loadPromise;
254
+ if (!clone) {
255
+ globalLoadPromise = createPromise();
256
+ } else {
257
+ clonedLoadPromiseRef.current = createPromise();
258
+ }
254
259
  loadDict({ ...mergedOptions, ...options }).then((map2) => {
260
+ var _a;
255
261
  if (!clone) {
256
262
  maps[code] = map2;
257
263
  emitChange(code);
258
264
  } else {
259
265
  setClonedMap(map2);
260
266
  }
267
+ stateRef.current = createStateFromMap(map2);
261
268
  oldLoadPromise == null ? void 0 : oldLoadPromise.resolve(void 0);
262
- loadPromiseRef.current.resolve(void 0);
269
+ if (!clone) {
270
+ globalLoadPromise.resolve(void 0);
271
+ } else {
272
+ (_a = clonedLoadPromiseRef.current) == null ? void 0 : _a.resolve(void 0);
273
+ }
263
274
  });
264
- return loadPromiseRef.current;
275
+ return !clone ? globalLoadPromise : clonedLoadPromiseRef.current;
265
276
  }, []);
266
- const clear2 = react.useCallback(() => {
277
+ const clear2 = () => {
267
278
  if (!clone) {
268
279
  maps[code] = /* @__PURE__ */ new Map();
269
280
  emitChange(code);
270
281
  return;
271
282
  }
272
283
  setClonedMap(/* @__PURE__ */ new Map());
273
- }, []);
274
- const getItem = react.useCallback((value) => {
275
- return value !== null && value !== void 0 ? state.map[value] : null;
276
- }, [state]);
284
+ };
277
285
  react.useEffect(() => {
278
- if (!remote || immediate) {
279
- if (clone) {
280
- load();
281
- } else {
282
- if (!globalLoadPromise) {
283
- globalLoadPromise = createPromise();
284
- load();
285
- } else {
286
- globalLoadPromise.then(() => {
287
- if (!init) {
288
- init = true;
289
- load();
290
- } else if (refresh) {
291
- load();
292
- }
293
- });
294
- }
295
- }
286
+ if (remote && !immediate) {
287
+ return;
288
+ }
289
+ if (clone) {
290
+ load();
296
291
  } else {
297
- if (!globalLoadPromise) {
298
- globalLoadPromise = createPromise();
299
- globalLoadPromise.resolve(void 0);
292
+ if (!init) {
293
+ init = true;
294
+ load();
295
+ } else if (refresh) {
296
+ load();
300
297
  }
301
298
  }
302
299
  }, []);
303
300
  const ctx = react.useMemo(() => {
304
- const _ctx = {
305
- map: state.map,
306
- list: state.list,
307
- E: state.E,
308
- loadPromise: loadPromiseRef.current,
301
+ const value = {
302
+ ...state,
303
+ loadPromise,
309
304
  load,
310
- getItem,
311
305
  clear: clear2
312
306
  };
313
307
  return {
314
- ..._ctx,
308
+ ...value,
315
309
  // @ts-ignore
316
- ...managerExtra == null ? void 0 : managerExtra(_ctx),
310
+ ...managerExtra == null ? void 0 : managerExtra(value),
317
311
  // @ts-ignore
318
- ...extra == null ? void 0 : extra(_ctx)
312
+ ...extra == null ? void 0 : extra(value),
313
+ stateRef
319
314
  };
320
- }, [state, loadPromiseRef.current]);
315
+ }, [state, loadPromise]);
321
316
  return ctx;
322
317
  }
323
318
  useDict.extend = (extendCode2, extendOptions) => {
@@ -48,7 +48,7 @@ function createDictManager(createDictManagerOptions = {}) {
48
48
  );
49
49
  defineDictOptionsMap.set(code, cloneDeep(_defineDictOptions));
50
50
  const { data, remote, fetch, extra, transformer, itemTransformer } = _defineDictOptions;
51
- let globalLoadPromise = null;
51
+ let globalLoadPromise = createPromise();
52
52
  let init = false;
53
53
  async function loadDict(options, map = /* @__PURE__ */ new Map()) {
54
54
  var _a;
@@ -95,10 +95,14 @@ function createDictManager(createDictManagerOptions = {}) {
95
95
  return [key, (_a = transformer == null ? void 0 : transformer(key)) != null ? _a : key];
96
96
  })
97
97
  );
98
+ const getItem = (value) => {
99
+ return value !== null && value !== void 0 ? newObj[value] : null;
100
+ };
98
101
  return {
99
102
  map: newObj,
100
103
  list: newList,
101
- E: newE
104
+ E: newE,
105
+ getItem
102
106
  };
103
107
  };
104
108
  function useDict(useDictOptions = {}) {
@@ -109,86 +113,77 @@ function createDictManager(createDictManagerOptions = {}) {
109
113
  ...useDictOptions
110
114
  };
111
115
  const { clone, immediate, refresh } = mergedOptions;
112
- const loadPromiseRef = useRef(
113
- !clone ? globalLoadPromise : createPromise()
114
- );
116
+ const stateRef = useRef(createStateFromMap());
117
+ const clonedLoadPromiseRef = useRef(null);
115
118
  const globalMap = useSyncExternalStore(subscribeMap, getMapSnapshot);
116
119
  const [clonedMap, setClonedMap] = useState(/* @__PURE__ */ new Map());
120
+ const loadPromise = !clone ? globalLoadPromise : clonedLoadPromiseRef.current;
117
121
  const map = !clone ? globalMap : clonedMap;
118
- const state = useMemo(
119
- () => createStateFromMap(map),
120
- [map]
121
- );
122
+ const state = useMemo(() => createStateFromMap(map), [map]);
122
123
  const load = useCallback((options) => {
123
- const oldLoadPromise = loadPromiseRef.current;
124
- loadPromiseRef.current = createPromise();
124
+ const oldLoadPromise = loadPromise;
125
+ if (!clone) {
126
+ globalLoadPromise = createPromise();
127
+ } else {
128
+ clonedLoadPromiseRef.current = createPromise();
129
+ }
125
130
  loadDict({ ...mergedOptions, ...options }).then((map2) => {
131
+ var _a;
126
132
  if (!clone) {
127
133
  maps[code] = map2;
128
134
  emitChange(code);
129
135
  } else {
130
136
  setClonedMap(map2);
131
137
  }
138
+ stateRef.current = createStateFromMap(map2);
132
139
  oldLoadPromise == null ? void 0 : oldLoadPromise.resolve(void 0);
133
- loadPromiseRef.current.resolve(void 0);
140
+ if (!clone) {
141
+ globalLoadPromise.resolve(void 0);
142
+ } else {
143
+ (_a = clonedLoadPromiseRef.current) == null ? void 0 : _a.resolve(void 0);
144
+ }
134
145
  });
135
- return loadPromiseRef.current;
146
+ return !clone ? globalLoadPromise : clonedLoadPromiseRef.current;
136
147
  }, []);
137
- const clear2 = useCallback(() => {
148
+ const clear2 = () => {
138
149
  if (!clone) {
139
150
  maps[code] = /* @__PURE__ */ new Map();
140
151
  emitChange(code);
141
152
  return;
142
153
  }
143
154
  setClonedMap(/* @__PURE__ */ new Map());
144
- }, []);
145
- const getItem = useCallback((value) => {
146
- return value !== null && value !== void 0 ? state.map[value] : null;
147
- }, [state]);
155
+ };
148
156
  useEffect(() => {
149
- if (!remote || immediate) {
150
- if (clone) {
151
- load();
152
- } else {
153
- if (!globalLoadPromise) {
154
- globalLoadPromise = createPromise();
155
- load();
156
- } else {
157
- globalLoadPromise.then(() => {
158
- if (!init) {
159
- init = true;
160
- load();
161
- } else if (refresh) {
162
- load();
163
- }
164
- });
165
- }
166
- }
157
+ if (remote && !immediate) {
158
+ return;
159
+ }
160
+ if (clone) {
161
+ load();
167
162
  } else {
168
- if (!globalLoadPromise) {
169
- globalLoadPromise = createPromise();
170
- globalLoadPromise.resolve(void 0);
163
+ if (!init) {
164
+ init = true;
165
+ load();
166
+ } else if (refresh) {
167
+ load();
171
168
  }
172
169
  }
173
170
  }, []);
174
171
  const ctx = useMemo(() => {
175
- const _ctx = {
176
- map: state.map,
177
- list: state.list,
178
- E: state.E,
179
- loadPromise: loadPromiseRef.current,
172
+ const value = {
173
+ ...state,
174
+ loadPromise,
180
175
  load,
181
- getItem,
182
176
  clear: clear2
183
177
  };
184
178
  return {
185
- ..._ctx,
179
+ ...value,
186
180
  // @ts-ignore
187
- ...managerExtra == null ? void 0 : managerExtra(_ctx),
181
+ ...managerExtra == null ? void 0 : managerExtra(value),
188
182
  // @ts-ignore
189
- ...extra == null ? void 0 : extra(_ctx)
183
+ ...extra == null ? void 0 : extra(value),
184
+ stateRef
190
185
  };
191
- }, [state, loadPromiseRef.current]);
186
+ }, [state, loadPromise]);
192
187
  return ctx;
193
188
  }
194
189
  useDict.extend = (extendCode2, extendOptions) => {
@@ -21,6 +21,17 @@ export type Dict<K extends PropertyKey = PropertyKey, I extends Recordable = Dic
21
21
  load: (options?: O) => LoadPromise;
22
22
  clear: () => void;
23
23
  getItem: (value?: I['value'] | Nil) => I | Nil;
24
+ stateRef?: {
25
+ current: {
26
+ list: I[];
27
+ E: {
28
+ [X in K]: X;
29
+ };
30
+ map: {
31
+ [X in K]: I;
32
+ };
33
+ };
34
+ };
24
35
  };
25
36
  export type Fetch = (code: string, options: Recordable) => MaybePromise<DictItemRecord[]>;
26
37
  type FetchOptions<F extends Fetch> = Parameters<F>[1] extends infer T ? T extends Nil ? {} : T : {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "v-dict",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "type": "module",
5
5
  "description": "Vue3 & React Dict Manager",
6
6
  "repository": {