-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathComponentComposer.jsx
More file actions
54 lines (43 loc) · 1.25 KB
/
ComponentComposer.jsx
File metadata and controls
54 lines (43 loc) · 1.25 KB
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
47
48
49
50
51
52
53
54
import React from "react";
/**
* @template T
* @typedef {React.PropsWithChildren<React.ComponentProps<React.ComponentProps<T>>>} Props
*/
/**
* @param {React.ComponentType[]} Components
* @returns {function(Props) : React.ReactElement}
*/
export const ComponentComposer = (... Components) => (props) => {
if (Components.length === 0) {
return null;
}
let Composed = props.children ?? null;
let Component;
for (let Index = Components.length - 1; Index > -1 ; Index--) {
Component = Components[Index];
Composed = <Component>{
Composed
}</Component>;
}
return Composed;
};
/**
* @template T
* @param {React.Provider<T>} Provider
* @param {T} Value
* @returns {function(Props) : JSX.Element}
*/
// eslint-disable-next-line react/display-name
export const ProviderComponent = (Provider, Value) => (props) => {
return <Provider value={Value} {...props} />;
};
/**
* @param {React.ComponentType} Component
* @param {React.ComponentProps<React.ComponentType>} ComponentProps
* @returns {function(Props) : JSX.Element}
*/
// eslint-disable-next-line react/display-name
export const PropsComponent = (Component, ComponentProps) => (props) => {
return <Component {... ComponentProps} {... props} />;
};
export default ComponentComposer;