@altano/use-element-observer 1.0.5 → 1.0.7

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.
@@ -1,14 +1,12 @@
1
1
  # use-element-observer
2
2
 
3
- ![Typed with TypeScript](https://flat.badgen.net/badge/icon/Typed?icon=typescript&label&labelColor=blue&color=555555)
3
+ [![npm](https://badgen.net/npm/v/@altano/use-element-observer)](https://www.npmjs.com/package/@altano/use-element-observer) ![Typed with TypeScript](https://badgen.net/npm/types/@altano/use-element-observer) ![ESM only](https://badgen.net/badge/module/esm%20only?icon=js)
4
4
 
5
5
  React hook to faciliate observing the mount of elements in a React tree, by selector.
6
6
 
7
7
  ## Installation
8
8
 
9
- `npm i --save @altano/use-element-observer`
10
-
11
- <https://www.npmjs.com/package/@altano/use-element-observer>
9
+ `npm install @altano/use-element-observer`
12
10
 
13
11
  ## Example
14
12
 
@@ -0,0 +1,2 @@
1
+ export * from "./useElementObserver";
2
+ //# sourceMappingURL=index.d.ts.map
package/dist/index.js ADDED
@@ -0,0 +1,72 @@
1
+ // src/useElementObserver.tsx
2
+ import React, { useCallback, useContext, useEffect, useRef } from "react";
3
+ import { useSet } from "@uidotdev/usehooks";
4
+ import { jsx } from "react/jsx-runtime";
5
+ var ElementObserverContext = React.createContext(null);
6
+ function useMountRef({ onMount, onUnmount }) {
7
+ const newRef = useRef(null);
8
+ useEffect(() => {
9
+ const ref = newRef.current;
10
+ if (ref == null) {
11
+ return () => {
12
+ };
13
+ }
14
+ onMount(ref);
15
+ return () => onUnmount(ref);
16
+ }, [newRef, onMount, onUnmount]);
17
+ return newRef;
18
+ }
19
+ function ObserveChildWithWrapperDiv({
20
+ children,
21
+ onMount,
22
+ onUnmount
23
+ }) {
24
+ const ref = useMountRef({ onMount, onUnmount });
25
+ return /* @__PURE__ */ jsx("div", { style: { display: "inherit" }, ref, children });
26
+ }
27
+ function ObserveChild({
28
+ children,
29
+ onMount,
30
+ onUnmount
31
+ }) {
32
+ const newRef = useMountRef({ onMount, onUnmount });
33
+ const child = React.Children.only(children);
34
+ return React.cloneElement(child, { ref: newRef });
35
+ }
36
+ function Observer({
37
+ children,
38
+ selector,
39
+ useWrapperDiv
40
+ }) {
41
+ const context = useContext(ElementObserverContext);
42
+ if (context == null) {
43
+ throw new Error("Observer context was null");
44
+ }
45
+ const { mountedElements } = context;
46
+ const onMount = useCallback(
47
+ (ref) => {
48
+ Array.from(ref.querySelectorAll(selector)).forEach(
49
+ (e) => mountedElements.add(e)
50
+ );
51
+ },
52
+ [selector, mountedElements]
53
+ );
54
+ const onUnmount = useCallback(
55
+ () => mountedElements.clear(),
56
+ [mountedElements]
57
+ );
58
+ const Component = useWrapperDiv ? ObserveChildWithWrapperDiv : ObserveChild;
59
+ return /* @__PURE__ */ jsx(Component, { onMount, onUnmount, children });
60
+ }
61
+ function useElementObserver({
62
+ tree,
63
+ selector,
64
+ useWrapperDiv = true
65
+ }) {
66
+ const mountedElements = useSet();
67
+ const observedTree = /* @__PURE__ */ jsx(ElementObserverContext.Provider, { value: { mountedElements }, children: /* @__PURE__ */ jsx(Observer, { selector, useWrapperDiv, children: tree }) });
68
+ return [mountedElements, observedTree];
69
+ }
70
+ export {
71
+ useElementObserver
72
+ };
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import React from "react";
3
2
  interface Options {
4
3
  selector: string;
@@ -20,8 +19,9 @@ interface Options {
20
19
  * @param useWrapperDiv If `true`, a 'div' will wrap the observed children. If
21
20
  * `false`, `children` must be a single child element that can take a ref (which
22
21
  * will be overwritten).
23
- * @returns A tuple of: (1) array of elements and (2) the observed tree to be
22
+ * @returns A tuple of: (1) set of elements and (2) the observed tree to be
24
23
  * rendered.
25
24
  */
26
- declare function useElementObserver({ tree, selector, useWrapperDiv, }: Options): [Set<Element>, React.ReactElement];
27
- export { useElementObserver };
25
+ export declare function useElementObserver({ tree, selector, useWrapperDiv, }: Options): [Set<Element>, React.ReactElement];
26
+ export {};
27
+ //# sourceMappingURL=useElementObserver.d.ts.map
package/package.json CHANGED
@@ -1,17 +1,15 @@
1
1
  {
2
2
  "name": "@altano/use-element-observer",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "Intersection-Observer-based Scroll Spy React Hook",
5
- "main": "dist/useElementObserver.js",
6
- "types": "dist/useElementObserver.d.ts",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "exports": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
7
9
  "files": [
8
- "dist/**/*"
10
+ "dist/**/*.js",
11
+ "dist/**/*.d.ts"
9
12
  ],
10
- "scripts": {
11
- "build": "rollup -c",
12
- "lint": "eslint . --ext .js,.jsx,.ts,.tsx",
13
- "start": "rollup -c --watch"
14
- },
15
13
  "author": {
16
14
  "name": "Alan Norbauer",
17
15
  "email": "altano@gmail.com",
@@ -20,32 +18,39 @@
20
18
  "license": "UNLICENSED",
21
19
  "repository": {
22
20
  "type": "git",
23
- "url": "https://github.com/altano/npm-packages/tree/master/packages/use-element-observer"
21
+ "url": "https://github.com/altano/npm-packages",
22
+ "directory": "packages/use-element-observer"
23
+ },
24
+ "homepage": "https://github.com/altano/npm-packages/tree/main/packages/use-element-observer",
25
+ "dependencies": {
26
+ "@uidotdev/usehooks": "^2.4.1"
27
+ },
28
+ "peerDependencies": {
29
+ "react": "^18"
24
30
  },
25
31
  "devDependencies": {
26
- "@rollup/plugin-commonjs": "^11.0.2",
27
- "@rollup/plugin-node-resolve": "^7.1.1",
28
- "@rollup/plugin-typescript": "^3.0.0",
29
- "@types/react": "^16.9.19",
30
- "@typescript-eslint/eslint-plugin": "^2.25.0",
31
- "@typescript-eslint/parser": "^2.25.0",
32
- "@wessberg/rollup-plugin-ts": "^1.2.16",
33
- "eslint": "^6.8.0",
34
- "eslint-config-airbnb": "^18.1.0",
35
- "eslint-config-prettier": "^6.10.1",
36
- "eslint-import-resolver-typescript": "^2.0.0",
37
- "eslint-plugin-import": "^2.20.1",
38
- "eslint-plugin-json": "^2.1.1",
39
- "eslint-plugin-jsx-a11y": "^6.2.3",
40
- "eslint-plugin-prettier": "^3.1.2",
41
- "eslint-plugin-react": "^7.19.0",
42
- "eslint-plugin-react-hooks": "^2.5.1",
43
- "prettier": "^2.0.2",
44
- "react": "^16",
45
- "react-dom": "^16",
46
- "react-use": "^13.27.0",
47
- "rollup": "^1.31.0",
48
- "tslib": "^1.11.1",
49
- "typescript": "^3.8.3"
32
+ "@types/react": "^18.2.64",
33
+ "@types/react-dom": "^18.2.21",
34
+ "eslint": "^8.57.0",
35
+ "prettier": "^3.2.5",
36
+ "react": "^18.2.0",
37
+ "tsup": "^8.0.2",
38
+ "typescript": "^5.4.2",
39
+ "@altano/tsconfig": "0.0.0",
40
+ "eslint-config-altano": "0.0.1"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "scripts": {
46
+ "build": "tsup src/index.tsx --format esm --onSuccess \"pnpm build:types\"",
47
+ "build:types": "tsc --emitDeclarationOnly --declaration",
48
+ "dev": "tsup src/index.tsx --watch --format esm",
49
+ "lint": "eslint src/**/*.ts*",
50
+ "lint:timing": "TIMING=1 eslint src/**/*.ts*",
51
+ "lint:fix": "TIMING=1 eslint src/**/*.ts* --fix",
52
+ "format": "prettier --check src",
53
+ "format:fix": "prettier --write src",
54
+ "clean": "rm -rf .turbo && rm -rf .tsbuildinfo && rm -rf node_modules && rm -rf dist"
50
55
  }
51
- }
56
+ }
@@ -1,436 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
-
7
- var React = require('react');
8
- var React__default = _interopDefault(React);
9
-
10
- function unwrapExports (x) {
11
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
12
- }
13
-
14
- function createCommonjsModule(fn, module) {
15
- return module = { exports: {} }, fn(module, module.exports), module.exports;
16
- }
17
-
18
- /*! *****************************************************************************
19
- Copyright (c) Microsoft Corporation. All rights reserved.
20
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
21
- this file except in compliance with the License. You may obtain a copy of the
22
- License at http://www.apache.org/licenses/LICENSE-2.0
23
-
24
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
25
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
26
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
27
- MERCHANTABLITY OR NON-INFRINGEMENT.
28
-
29
- See the Apache Version 2.0 License for specific language governing permissions
30
- and limitations under the License.
31
- ***************************************************************************** */
32
- /* global Reflect, Promise */
33
- var extendStatics = function (d, b) {
34
- extendStatics = Object.setPrototypeOf ||
35
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
36
- function (d, b) {
37
- for (var p in b)
38
- if (b.hasOwnProperty(p))
39
- d[p] = b[p];
40
- };
41
- return extendStatics(d, b);
42
- };
43
- function __extends(d, b) {
44
- extendStatics(d, b);
45
- function __() { this.constructor = d; }
46
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
47
- }
48
- var __assign = function () {
49
- __assign = Object.assign || function __assign(t) {
50
- for (var s, i = 1, n = arguments.length; i < n; i++) {
51
- s = arguments[i];
52
- for (var p in s)
53
- if (Object.prototype.hasOwnProperty.call(s, p))
54
- t[p] = s[p];
55
- }
56
- return t;
57
- };
58
- return __assign.apply(this, arguments);
59
- };
60
- function __rest(s, e) {
61
- var t = {};
62
- for (var p in s)
63
- if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
64
- t[p] = s[p];
65
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
66
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
67
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
68
- t[p[i]] = s[p[i]];
69
- }
70
- return t;
71
- }
72
- function __decorate(decorators, target, key, desc) {
73
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
74
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
75
- r = Reflect.decorate(decorators, target, key, desc);
76
- else
77
- for (var i = decorators.length - 1; i >= 0; i--)
78
- if (d = decorators[i])
79
- r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
80
- return c > 3 && r && Object.defineProperty(target, key, r), r;
81
- }
82
- function __param(paramIndex, decorator) {
83
- return function (target, key) { decorator(target, key, paramIndex); };
84
- }
85
- function __metadata(metadataKey, metadataValue) {
86
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
87
- return Reflect.metadata(metadataKey, metadataValue);
88
- }
89
- function __awaiter(thisArg, _arguments, P, generator) {
90
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
91
- return new (P || (P = Promise))(function (resolve, reject) {
92
- function fulfilled(value) {
93
- try {
94
- step(generator.next(value));
95
- }
96
- catch (e) {
97
- reject(e);
98
- }
99
- }
100
- function rejected(value) {
101
- try {
102
- step(generator["throw"](value));
103
- }
104
- catch (e) {
105
- reject(e);
106
- }
107
- }
108
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
109
- step((generator = generator.apply(thisArg, _arguments || [])).next());
110
- });
111
- }
112
- function __generator(thisArg, body) {
113
- var _ = { label: 0, sent: function () {
114
- if (t[0] & 1)
115
- throw t[1];
116
- return t[1];
117
- }, trys: [], ops: [] }, f, y, t, g;
118
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
119
- function verb(n) { return function (v) { return step([n, v]); }; }
120
- function step(op) {
121
- if (f)
122
- throw new TypeError("Generator is already executing.");
123
- while (_)
124
- try {
125
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
126
- return t;
127
- if (y = 0, t)
128
- op = [op[0] & 2, t.value];
129
- switch (op[0]) {
130
- case 0:
131
- case 1:
132
- t = op;
133
- break;
134
- case 4:
135
- _.label++;
136
- return { value: op[1], done: false };
137
- case 5:
138
- _.label++;
139
- y = op[1];
140
- op = [0];
141
- continue;
142
- case 7:
143
- op = _.ops.pop();
144
- _.trys.pop();
145
- continue;
146
- default:
147
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
148
- _ = 0;
149
- continue;
150
- }
151
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
152
- _.label = op[1];
153
- break;
154
- }
155
- if (op[0] === 6 && _.label < t[1]) {
156
- _.label = t[1];
157
- t = op;
158
- break;
159
- }
160
- if (t && _.label < t[2]) {
161
- _.label = t[2];
162
- _.ops.push(op);
163
- break;
164
- }
165
- if (t[2])
166
- _.ops.pop();
167
- _.trys.pop();
168
- continue;
169
- }
170
- op = body.call(thisArg, _);
171
- }
172
- catch (e) {
173
- op = [6, e];
174
- y = 0;
175
- }
176
- finally {
177
- f = t = 0;
178
- }
179
- if (op[0] & 5)
180
- throw op[1];
181
- return { value: op[0] ? op[1] : void 0, done: true };
182
- }
183
- }
184
- function __exportStar(m, exports) {
185
- for (var p in m)
186
- if (!exports.hasOwnProperty(p))
187
- exports[p] = m[p];
188
- }
189
- function __values(o) {
190
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
191
- if (m)
192
- return m.call(o);
193
- if (o && typeof o.length === "number")
194
- return {
195
- next: function () {
196
- if (o && i >= o.length)
197
- o = void 0;
198
- return { value: o && o[i++], done: !o };
199
- }
200
- };
201
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
202
- }
203
- function __read(o, n) {
204
- var m = typeof Symbol === "function" && o[Symbol.iterator];
205
- if (!m)
206
- return o;
207
- var i = m.call(o), r, ar = [], e;
208
- try {
209
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
210
- ar.push(r.value);
211
- }
212
- catch (error) {
213
- e = { error: error };
214
- }
215
- finally {
216
- try {
217
- if (r && !r.done && (m = i["return"]))
218
- m.call(i);
219
- }
220
- finally {
221
- if (e)
222
- throw e.error;
223
- }
224
- }
225
- return ar;
226
- }
227
- function __spread() {
228
- for (var ar = [], i = 0; i < arguments.length; i++)
229
- ar = ar.concat(__read(arguments[i]));
230
- return ar;
231
- }
232
- function __spreadArrays() {
233
- for (var s = 0, i = 0, il = arguments.length; i < il; i++)
234
- s += arguments[i].length;
235
- for (var r = Array(s), k = 0, i = 0; i < il; i++)
236
- for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
237
- r[k] = a[j];
238
- return r;
239
- }
240
- function __await(v) {
241
- return this instanceof __await ? (this.v = v, this) : new __await(v);
242
- }
243
- function __asyncGenerator(thisArg, _arguments, generator) {
244
- if (!Symbol.asyncIterator)
245
- throw new TypeError("Symbol.asyncIterator is not defined.");
246
- var g = generator.apply(thisArg, _arguments || []), i, q = [];
247
- return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
248
- function verb(n) {
249
- if (g[n])
250
- i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); };
251
- }
252
- function resume(n, v) {
253
- try {
254
- step(g[n](v));
255
- }
256
- catch (e) {
257
- settle(q[0][3], e);
258
- }
259
- }
260
- function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
261
- function fulfill(value) { resume("next", value); }
262
- function reject(value) { resume("throw", value); }
263
- function settle(f, v) {
264
- if (f(v), q.shift(), q.length)
265
- resume(q[0][0], q[0][1]);
266
- }
267
- }
268
- function __asyncDelegator(o) {
269
- var i, p;
270
- return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
271
- function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
272
- }
273
- function __asyncValues(o) {
274
- if (!Symbol.asyncIterator)
275
- throw new TypeError("Symbol.asyncIterator is not defined.");
276
- var m = o[Symbol.asyncIterator], i;
277
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
278
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
279
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
280
- }
281
- function __makeTemplateObject(cooked, raw) {
282
- if (Object.defineProperty) {
283
- Object.defineProperty(cooked, "raw", { value: raw });
284
- }
285
- else {
286
- cooked.raw = raw;
287
- }
288
- return cooked;
289
- }
290
- function __importStar(mod) {
291
- if (mod && mod.__esModule)
292
- return mod;
293
- var result = {};
294
- if (mod != null)
295
- for (var k in mod)
296
- if (Object.hasOwnProperty.call(mod, k))
297
- result[k] = mod[k];
298
- result.default = mod;
299
- return result;
300
- }
301
- function __importDefault(mod) {
302
- return (mod && mod.__esModule) ? mod : { default: mod };
303
- }
304
- function __classPrivateFieldGet(receiver, privateMap) {
305
- if (!privateMap.has(receiver)) {
306
- throw new TypeError("attempted to get private field on non-instance");
307
- }
308
- return privateMap.get(receiver);
309
- }
310
- function __classPrivateFieldSet(receiver, privateMap, value) {
311
- if (!privateMap.has(receiver)) {
312
- throw new TypeError("attempted to set private field on non-instance");
313
- }
314
- privateMap.set(receiver, value);
315
- return value;
316
- }
317
-
318
- var tslib_es6 = /*#__PURE__*/Object.freeze({
319
- __proto__: null,
320
- __extends: __extends,
321
- get __assign () { return __assign; },
322
- __rest: __rest,
323
- __decorate: __decorate,
324
- __param: __param,
325
- __metadata: __metadata,
326
- __awaiter: __awaiter,
327
- __generator: __generator,
328
- __exportStar: __exportStar,
329
- __values: __values,
330
- __read: __read,
331
- __spread: __spread,
332
- __spreadArrays: __spreadArrays,
333
- __await: __await,
334
- __asyncGenerator: __asyncGenerator,
335
- __asyncDelegator: __asyncDelegator,
336
- __asyncValues: __asyncValues,
337
- __makeTemplateObject: __makeTemplateObject,
338
- __importStar: __importStar,
339
- __importDefault: __importDefault,
340
- __classPrivateFieldGet: __classPrivateFieldGet,
341
- __classPrivateFieldSet: __classPrivateFieldSet
342
- });
343
-
344
- var useSet_1 = createCommonjsModule(function (module, exports) {
345
- Object.defineProperty(exports, "__esModule", { value: true });
346
-
347
- /* eslint-disable */
348
-
349
- var useSet = function (initialSet) {
350
- if (initialSet === void 0) {
351
- initialSet = new Set();
352
- }
353
- var _a = React__default.useState(initialSet), set = _a[0], setSet = _a[1];
354
- var stableActions = React__default.useMemo(function () {
355
- var add = function (item) { return setSet(function (prevSet) { return new Set(tslib_es6.__spreadArrays(Array.from(prevSet), [item])); }); };
356
- var remove = function (item) { return setSet(function (prevSet) { return new Set(Array.from(prevSet).filter(function (i) { return i !== item; })); }); };
357
- var toggle = function (item) {
358
- return setSet(function (prevSet) {
359
- return prevSet.has(item)
360
- ? new Set(Array.from(prevSet).filter(function (i) { return i !== item; }))
361
- : new Set(tslib_es6.__spreadArrays(Array.from(prevSet), [item]));
362
- });
363
- };
364
- return { add: add, remove: remove, toggle: toggle, reset: function () { return setSet(initialSet); } };
365
- }, [setSet]);
366
- var utils = tslib_es6.__assign({ has: React__default.useCallback(function (item) { return set.has(item); }, [set]) }, stableActions);
367
- return [set, utils];
368
- };
369
- exports.default = useSet;
370
- });
371
-
372
- var useSet = unwrapExports(useSet_1);
373
-
374
- const ElementObserverContext = React__default.createContext(null);
375
- function useMountRef({ onMount, onUnmount }) {
376
- const newRef = React.useRef(null);
377
- React.useEffect(() => {
378
- const ref = newRef.current;
379
- if (ref == null) {
380
- return () => { };
381
- }
382
- onMount(ref);
383
- return () => onUnmount(ref);
384
- }, [newRef, onMount, onUnmount]);
385
- return newRef;
386
- }
387
- function ObserveChildWithWrapperDiv({ children, onMount, onUnmount, }) {
388
- const ref = useMountRef({ onMount, onUnmount });
389
- return (React__default.createElement("div", { style: { display: "inherit" }, ref: ref }, children));
390
- }
391
- function ObserveChild({ children, onMount, onUnmount, }) {
392
- const newRef = useMountRef({ onMount, onUnmount });
393
- const child = React__default.Children.only(children);
394
- return React__default.cloneElement(child, { ref: newRef });
395
- }
396
- function Observer({ children, selector, useWrapperDiv, }) {
397
- const context = React.useContext(ElementObserverContext);
398
- if (context == null) {
399
- throw new Error("Observer context was null");
400
- }
401
- const { methods } = context;
402
- const { add, reset } = methods;
403
- const onMount = React.useCallback((ref) => {
404
- Array.from(ref.querySelectorAll(selector)).forEach(add);
405
- }, [selector, add]);
406
- const onUnmount = React.useCallback(() => reset, [reset]);
407
- const Component = useWrapperDiv ? ObserveChildWithWrapperDiv : ObserveChild;
408
- return (React__default.createElement(Component, { onMount: onMount, onUnmount: onUnmount }, children));
409
- }
410
- /**
411
- * Allows observing mount/unmount of elements that match a given selector in the
412
- * given React tree. Tree must be static: only the mounting of the tree itself
413
- * is monitored. If the tree's DOM is dynamically changed those mounts and
414
- * unmounts will not be detected.
415
- *
416
- * @param tree The React tree to observe.
417
- * @param onMount The callback that will be passed any elements in the tree that
418
- * match the given selector, as they mount.
419
- * @param onUnmount The callback that will be passed any elements in the tree
420
- * that match the given selector, as they unmount.
421
- * @param selector The css selector used to select which elements are observed.
422
- * @param useWrapperDiv If `true`, a 'div' will wrap the observed children. If
423
- * `false`, `children` must be a single child element that can take a ref (which
424
- * will be overwritten).
425
- * @returns A tuple of: (1) array of elements and (2) the observed tree to be
426
- * rendered.
427
- */
428
- function useElementObserver({ tree, selector, useWrapperDiv = true, }) {
429
- // @TODO Add mutation observer to catch changes to grandchildren?
430
- const [mountedElements, methods] = useSet();
431
- const observedTree = (React__default.createElement(ElementObserverContext.Provider, { value: { mountedElements, methods } },
432
- React__default.createElement(Observer, { selector: selector, useWrapperDiv: useWrapperDiv }, tree)));
433
- return [mountedElements, observedTree];
434
- }
435
-
436
- exports.useElementObserver = useElementObserver;