UNPKG

@uifabric/utilities

Version:

Fluent UI React utilities for building components.

1 lines 3.07 kB
{"version":3,"file":"composeComponentAs.js","sourceRoot":"../src/","sources":["componentAs/composeComponentAs.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM5C,SAAS,uBAAuB,CAC9B,KAA2B;IAE3B,IAAM,KAAK,GAAG,KAAK,CAAC;IAEpB,IAAM,aAAa,GAAG,cAAc,CAAC,UAAC,KAA2B;QAC/D,IAAI,KAAK,KAAK,KAAK,EAAE;YACnB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAClE;QAED,IAAM,KAAK,GAAG,KAAK,CAAC;QAEpB,IAAM,aAAa,GAAG,cAAc,CAAC,UAAC,aAAmC;YACvE,IAAM,sBAAsB,GAAmD,UAC7E,UAAqC;gBAErC,OAAO,oBAAC,KAAK,eAAK,UAAU,IAAE,aAAa,EAAE,aAAa,IAAI,CAAC;YACjE,CAAC,CAAC;YAEF,OAAO,sBAAsB,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,IAAM,sBAAsB,GAAmD,UAC7E,UAAqC;YAE7B,IAAA,wCAAa,CAAgB;YAErC,OAAO,oBAAC,KAAK,eAAK,UAAU,IAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACxG,CAAC,CAAC;QAEF,OAAO,sBAAsB,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,IAAM,mBAAmB,GAAG,cAAc,CAAsB,uBAAuB,CAAC,CAAC;AAEzF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA2B,EAC3B,KAA2B;IAE3B,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import * as React from 'react';\nimport { IComponentAs, IComponentAsProps } from '../IComponentAs';\nimport { createMemoizer } from '../memoize';\n\ninterface IComposeComponentAs {\n <TProps>(outer: IComponentAs<TProps>): (inner: IComponentAs<TProps>) => IComponentAs<TProps>;\n}\n\nfunction createComposedComponent<TProps>(\n outer: IComponentAs<TProps>,\n): (inner: IComponentAs<TProps>) => IComponentAs<TProps> {\n const Outer = outer;\n\n const outerMemoizer = createMemoizer((inner: IComponentAs<TProps>) => {\n if (outer === inner) {\n throw new Error('Attempted to compose a component with itself.');\n }\n\n const Inner = inner;\n\n const innerMemoizer = createMemoizer((defaultRender: IComponentAs<TProps>) => {\n const InnerWithDefaultRender: React.ComponentType<IComponentAsProps<TProps>> = (\n innerProps: IComponentAsProps<TProps>,\n ): JSX.Element => {\n return <Inner {...innerProps} defaultRender={defaultRender} />;\n };\n\n return InnerWithDefaultRender;\n });\n\n const OuterWithDefaultRender: React.ComponentType<IComponentAsProps<TProps>> = (\n outerProps: IComponentAsProps<TProps>,\n ): JSX.Element => {\n const { defaultRender } = outerProps;\n\n return <Outer {...outerProps} defaultRender={defaultRender ? innerMemoizer(defaultRender) : Inner} />;\n };\n\n return OuterWithDefaultRender;\n });\n\n return outerMemoizer;\n}\n\nconst componentAsMemoizer = createMemoizer<IComposeComponentAs>(createComposedComponent);\n\n/**\n * Composes two components which conform to the `IComponentAs` specification; that is, two\n * components which accept a `defaultRender` prop, which is a 'default' implementation of\n * a component which accepts the same overall props.\n *\n * @public\n */\nexport function composeComponentAs<TProps>(\n outer: IComponentAs<TProps>,\n inner: IComponentAs<TProps>,\n): IComponentAs<TProps> {\n return componentAsMemoizer(outer)(inner);\n}\n"]}