-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuse-component-self-registration.js
46 lines (39 loc) · 1.31 KB
/
use-component-self-registration.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import * as React from 'react'
export const useComponentSelfRegistration = ({ component, useContext, index: customIndex }) => {
const [registeredComponents, setRegisteredComponents] = useContext()
const naturalIndex = registeredComponents.findIndex((registeredComponent) => {
return component.element === registeredComponent.element;
});
const index = customIndex ?? naturalIndex;
React.useEffect(() => {
const { element } = component
const currentElement = element.current
if (!currentElement) return
setRegisteredComponents((previousRegisteredComponents) => {
const isRegistered = previousRegisteredComponents.some(
(registeredComponent) =>
component.element === registeredComponent.element
);
if (isRegistered) return previousRegisteredComponents;
return [
...previousRegisteredComponents,
{
...component,
index
}
];
});
return () => {
setRegisteredComponents((previousRegisteredComponents) =>
previousRegisteredComponents.filter((registeredComponent) => registeredComponent.element === element)
)
}
}, [
component,
index,
setRegisteredComponents,
// eslint-disable-next-line react-hooks/exhaustive-deps
...Object.values(component),
])
return index
}