@@ -4,22 +4,21 @@ import invariant from 'invariant'
44import uuid from 'uuid-v4'
55
66const use = ( hook , context ) => ( props ) => {
7-
87 const HookHarness = ( props ) => {
98 context . result = hook ( props )
109 return < div data-testid = { context . id } />
1110 }
1211
13- const { queryByTestId, rerender } = render ( context . resolveComponent ( { children : < HookHarness { ...props } /> } ) )
12+ const { queryByTestId, rerender } = render ( context . resolveComponent ( < HookHarness { ...props } /> ) )
1413
1514 const container = queryByTestId ( context . id )
1615
17- invariant ( container !== null , 'You must render children when wrapping the hook ' )
16+ invariant ( container !== null , 'Failed to render wrapper component ' )
1817
19- context . rerender = ( newProps ) => rerender ( context . resolveComponent ( { children : < HookHarness { ...newProps } /> } ) )
18+ context . rerender = ( newProps ) => rerender ( context . resolveComponent ( < HookHarness { ...newProps } /> ) )
2019 context . flushEffects = ( ) => context . rerender ( props )
2120
22- return context . result
21+ return context . result
2322}
2423
2524const update = ( context ) => ( props ) => {
@@ -38,25 +37,29 @@ const flushEffects = (context) => () => {
3837 return context . result
3938}
4039
41- const wrap = ( hook , context ) => ( wrap ) => {
42- invariant ( typeof wrap === 'function' , 'wrap must be provided a function' )
40+ const withContextProvider = ( hook , context ) => ( ContextProvider , props ) => {
4341 const { resolveComponent } = context
44- return useHookAdvanced ( hook , { ...context , resolveComponent : ( props ) => wrap ( { children : resolveComponent ( props ) } ) } )
42+ return useHookAdvanced ( hook , {
43+ ...context ,
44+ resolveComponent : ( Component ) => (
45+ < ContextProvider { ...props } > { resolveComponent ( Component ) } </ ContextProvider >
46+ )
47+ } )
4548}
4649
4750const useHookAdvanced = ( hook , context ) => {
4851 return {
4952 use : use ( hook , context ) ,
53+ withContextProvider : withContextProvider ( hook , context ) ,
5054 update : update ( context ) ,
51- flushEffects : flushEffects ( context ) ,
52- wrap : wrap ( hook , context )
55+ flushEffects : flushEffects ( context )
5356 }
5457}
5558
5659export const useHook = ( hook ) => {
5760 const context = {
5861 id : uuid ( ) ,
59- resolveComponent : ( { children } ) => children
62+ resolveComponent : ( Component ) => Component
6063 }
6164 return useHookAdvanced ( hook , context )
6265}
0 commit comments