UNPKG

1.54 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.default = exports.ObservableSet = void 0;
5var _useForceUpdate = _interopRequireDefault(require("./useForceUpdate"));
6var _useStableMemo = _interopRequireDefault(require("./useStableMemo"));
7function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8class ObservableSet extends Set {
9 constructor(listener, init) {
10 super(init);
11 this.listener = listener;
12 }
13 add(value) {
14 super.add(value);
15 // When initializing the Set, the base Set calls this.add() before the
16 // listener is assigned so it will be undefined
17 if (this.listener) this.listener(this);
18 return this;
19 }
20 delete(value) {
21 const result = super.delete(value);
22 this.listener(this);
23 return result;
24 }
25 clear() {
26 super.clear();
27 this.listener(this);
28 }
29}
30
31/**
32 * Create and return a [Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) that triggers rerenders when it's updated.
33 *
34 * ```ts
35 * const ids = useSet<number>([1,2,3,4]);
36 *
37 * return (
38 * <>
39 * {Array.from(ids, id => (
40 * <div>
41 * id: {id}. <button onClick={() => ids.delete(id)}>X</button>
42 * </div>
43 * )}
44 * </>
45 * )
46 * ```
47 *
48 * @param init initial Set values
49 */
50exports.ObservableSet = ObservableSet;
51function useSet(init) {
52 const forceUpdate = (0, _useForceUpdate.default)();
53 return (0, _useStableMemo.default)(() => new ObservableSet(forceUpdate, init), []);
54}
55var _default = useSet;
56exports.default = _default;
\No newline at end of file