55import {
66 AfterViewInit ,
77 ChangeDetectorRef ,
8- ComponentFactoryResolver ,
9- ComponentRef ,
108 ElementRef ,
11- Injector ,
129 Input ,
1310 NgZone ,
1411 OnChanges ,
1512 Renderer2 ,
1613 SimpleChanges ,
17- TemplateRef ,
18- Type ,
1914 AfterContentInit ,
2015} from '@angular/core' ;
2116import classnames from 'classnames' ;
2217import toStyle from 'css-to-style' ;
2318import stylenames , { StyleObject } from 'stylenames' ;
19+
2420import { Many } from '../declarations/many' ;
2521import { ReactContentProps } from '../renderer/react-content' ;
2622import { isReactNode } from '../renderer/react-node' ;
2723import { isReactRendererData } from '../renderer/renderer' ;
28- import { createComponentRenderer , createHtmlRenderer , createTemplateRenderer } from '../renderer/renderprop-helpers' ;
2924import { toObject } from '../utils/object/to-object' ;
3025import { afterRenderFinished } from '../utils/render/render-delay' ;
31- import { unreachable } from '../utils/types/unreachable ' ;
26+ import { InputRendererOptions , JsxRenderFunc , createInputJsxRenderer , createRenderPropHandler } from './render-props ' ;
3227
3328// Forbidden attributes are still ignored, since they may be set from the wrapper components themselves (forbidden is only applied for users of the wrapper components)
3429const ignoredAttributeMatchers = [ / ^ _ ? n g - ? .* / , / ^ s t y l e $ / , / ^ c l a s s $ / ] ;
3530
3631const ngClassRegExp = / ^ n g - / ;
3732
38- export interface RenderComponentOptions < TContext extends object > {
39- readonly componentType : Type < TContext > ;
40- readonly factoryResolver : ComponentFactoryResolver ;
41- readonly injector : Injector ;
42- }
43-
44- export type InputRendererOptions < TContext extends object > =
45- | TemplateRef < TContext >
46- | ( ( context : TContext ) => HTMLElement )
47- | ComponentRef < TContext >
48- | RenderComponentOptions < TContext > ;
49-
50- export type JsxRenderFunc < TContext > = ( context : TContext ) => JSX . Element ;
51-
5233export type ContentClassValue = string [ ] | Set < string > | { [ klass : string ] : any } ;
5334export type ContentStyleValue = string | StyleObject ;
5435
@@ -186,7 +167,7 @@ export abstract class ReactWrapperComponent<TProps extends {}> implements AfterC
186167
187168 /**
188169 * Create an JSX renderer for an `@Input` property.
189- * @param input The input property
170+ * @param input The input property.
190171 * @param additionalProps optional additional props to pass to the `ReactContent` object that will render the content.
191172 */
192173 protected createInputJsxRenderer < TContext extends object > (
@@ -201,31 +182,7 @@ export abstract class ReactWrapperComponent<TProps extends {}> implements AfterC
201182 throw new Error ( 'To create an input JSX renderer you must pass an NgZone to the constructor.' ) ;
202183 }
203184
204- if ( input instanceof TemplateRef ) {
205- const templateRenderer = createTemplateRenderer ( input , this . _ngZone , additionalProps ) ;
206- return ( context : TContext ) => templateRenderer . render ( context ) ;
207- }
208-
209- if ( input instanceof ComponentRef ) {
210- const componentRenderer = createComponentRenderer ( input , additionalProps ) ;
211- return ( context : TContext ) => componentRenderer . render ( context ) ;
212- }
213-
214- if ( input instanceof Function ) {
215- const htmlRenderer = createHtmlRenderer ( input , additionalProps ) ;
216- return ( context : TContext ) => htmlRenderer . render ( context ) ;
217- }
218-
219- if ( typeof input === 'object' ) {
220- const { componentType, factoryResolver, injector } = input ;
221- const componentFactory = factoryResolver . resolveComponentFactory ( componentType ) ;
222- const componentRef = componentFactory . create ( injector ) ;
223-
224- // Call the function again with the created ComponentRef<TContext>
225- return this . createInputJsxRenderer ( componentRef , additionalProps ) ;
226- }
227-
228- unreachable ( input ) ;
185+ return createInputJsxRenderer ( input , this . _ngZone , additionalProps ) ;
229186 }
230187
231188 /**
@@ -234,24 +191,14 @@ export abstract class ReactWrapperComponent<TProps extends {}> implements AfterC
234191 * @param jsxRenderer an optional renderer to use.
235192 * @param additionalProps optional additional props to pass to the `ReactContent` object that will render the content.
236193 */
237- protected createRenderPropHandler < TProps extends object > (
238- renderInputValue : InputRendererOptions < TProps > ,
194+ protected createRenderPropHandler < TRenderProps extends object > (
195+ renderInputValue : InputRendererOptions < TRenderProps > ,
239196 options ?: {
240- jsxRenderer ?: JsxRenderFunc < TProps > ;
197+ jsxRenderer ?: JsxRenderFunc < TRenderProps > ;
241198 additionalProps ?: ReactContentProps ;
242199 }
243- ) : ( props ?: TProps , defaultRender ?: JsxRenderFunc < TProps > ) => JSX . Element | null {
244- const renderer =
245- ( options && options . jsxRenderer ) ||
246- this . createInputJsxRenderer ( renderInputValue , options && options . additionalProps ) ;
247-
248- return ( props ?: TProps , defaultRender ?: JsxRenderFunc < TProps > ) => {
249- if ( ! renderInputValue ) {
250- return typeof defaultRender === 'function' ? defaultRender ( props ) : null ;
251- }
252-
253- return renderer ( props ) ;
254- } ;
200+ ) : ( props ?: TRenderProps , defaultRender ?: JsxRenderFunc < TRenderProps > ) => JSX . Element | null {
201+ return createRenderPropHandler ( renderInputValue , this . _ngZone , options ) ;
255202 }
256203
257204 private _passAttributesAsProps ( ) {
@@ -300,7 +247,7 @@ export abstract class ReactWrapperComponent<TProps extends {}> implements AfterC
300247 }
301248
302249 private _setHostDisplay ( ) {
303- const nativeElement : HTMLElement = this . elementRef . nativeElement ;
250+ const nativeElement = this . elementRef . nativeElement ;
304251
305252 // We want to wait until child elements are rendered
306253 afterRenderFinished ( ( ) => {
0 commit comments