Embed Komo content in your React Native applications.
Installation
npm install @komo-tech/react-native-widgets
NOTE: This package has a peer dependency on react-native-webview, and recommends the latest major version, 13.x.
Basic Usage
- The quickest way to get started with embedding Komo content in react native is by using the
KomoCardWidget component. - This component combines metadata fetching, card cover display, and modal handling for the card content (i.e. experience).
- The only required prop is
embedMetaUrl. To find this in the Komo portal:- Navigate to the settings of the card to be embedded.
- Select the
Embed tab and click on React Native code in the right sidebar. - Copy the
Card embed meta URL and use it as the value of the embedMetaUrl prop.
import { KomoCardWidget } from '@komo-tech/react-native-widgets';
// ...
<KomoCardWidget
embedMetaUrl={KomoCardNativeEmbedUrl}
containerStyle={{ maxWidth: '80%' }}
/>;
Prefilling form details
- You can pass information through to the Komo experience that will be pre-filled in any forms that the user may encounter.
- Pass a plain
Record<string,string> object of keys and values through to the formPrefillValues prop on KomoCardWidget or ExperienceModal. - The object keys must match the Unique ID of the form field or contact property from the Komo Platform that you want to prefill.
<KomoCardWidget
embedMetaUrl={KomoCardNativeEmbedUrl}
containerStyle={{ maxWidth: '80%' }}
formPrefillValues={{
email: 'email@domain.com',
first_name: 'Person',
last_name: 'Doe',
}}
/>;
Advanced usage
Metadata fetching
- The first step to using embedded Komo content involves fetching the card metadata.
- Use the
useFetchCardMetadata hook and the Native embed URL copied from the platform to fetch the CardEmbedMetadata. - The CardEmbedMetadata has the information required to render the cover image (
imageUrl) and the URL (embedUrl) that the ExperienceModal needs to render the embedded experience. - Note: you can use your own data-fetching patterns if you require more advanced data fetching handling. So long as it produces a CardEmbedMetadata, you can pass that to the other components that you want to use.
import { useFetchCardMetadata } from '@komo-tech/react-native-widgets';
// ... rest of your component
const {data, isLoading, isError} = useFetchCardMetadata({embedMetaUrl: KomoCardNativeEmbedUrl});
// ... use the data.
Render a Card Cover
- The
CardCover component is used to display the cover image of a Komo card. - It handles loading states, error states, and button display.
- The component requires an
onClick handler and isLoading state. - The
imageUrl and imageAspectRatio props are typically obtained from the CardEmbedMetadata.
import { CardCover } from '@komo-tech/react-native-widgets';
// ... rest of your component
<CardCover
imageUrl={metadata?.imageUrl}
imageAspectRatio={metadata?.imageAspectRatio}
isLoading={isLoading}
isError={isError}
onClick={() => doSomethingOnCoverClicked()}
metaButtonStyle={metadata?.buttonStyle}
containerStyle={{ borderRadius: 8 }}
/>
Using the Experience Modal
- The
ExperienceModal component is used to display the full Komo experience in a modal overlay. - It handles loading states, error states, and communication with the embedded experience.
- The component requires an
isOpen state and onClose handler. - A valid
embedUrl prop is required for the experience modal to function, and this is typically obtained from the CardEmbedMetadata.
import { ExperienceModal } from '@komo-tech/react-native-widgets';
// ... rest of your component
<ExperienceModal
isOpen={isModalOpen}
onClose={() => setIsModalOpen(false)}
embedUrl={metadata?.embedUrl}
loadingTimeoutMs={15000} // Optional: customize loading timeout
appId="my-app" // Optional: identify where the content is embedded
/>
Experience Modal example without Card Cover
- You can use whichever components you want to build your desired experience.
- For example, you can trigger the
ExperienceModal without rendering our CardCover.
// ... rest of your component
const { data, isLoading } = useFetchCardMetadata({
isEnabled,
embedMetaUrl: EmbedMetaUrlFromKomoPortal,
});
const [modalOpen, setModalOpen] = useState(false);
// other code, e.g. some element that calls setModalOpen(true) after isLoading returns false
<ExperienceModal
isOpen={modalOpen}
onClose={() => {
setModalOpen(false);
}}
embedUrl={data?.embedUrl}
/>
Metadata model
CardEmbedMetadata
| Property | Type | Description |
|---|
title | string? | The title of the card |
imageUrl | string? | URL of the card's cover image |
imageHeight | number? | Height of the cover image in pixels |
imageWidth | number? | Width of the cover image in pixels |
imageAspectRatio | number? | Aspect ratio of the cover image |
embedUrl | string? | URL for the embedded experience |
buttonStyle | ButtonStyle? | Styling for the card's button |
ButtonStyle
| Property | Type | Description |
|---|
text | string? | Text to display on the button |
backgroundColor | string? | Background color of the button |
color | string? | Text color of the button |
Hooks
useFetchCardMetadata
A hook for fetching card metadata from the Komo platform.
Options
| Property | Type | Required | Description |
|---|
embedMetaUrl | string | Yes | The URL of the embed metadata for the card, copied from the Komo Portal |
isEnabled | boolean | No | Whether the embed metadata query is enabled. Defaults to true |
onError | (e: any) => void | No | Callback for when an error occurs during querying the embed metadata endpoint |
Result
| Property | Type | Description |
|---|
data | CardEmbedMetadata? | The embed metadata for the card |
isLoading | boolean | Whether the embed metadata is loading |
isError | boolean | Whether the embed metadata query failed |
isSuccess | boolean | Whether the embed metadata query succeeded |
refetchAsync | () => Promise | Function to refetch the embed metadata |
Components
CardCover Props
| Property | Type | Required | Description |
|---|
onClick | () => void | Yes | The callback for when the cover is clicked |
isLoading | boolean | Yes | Whether the cover is loading |
isError | boolean? | No | Whether the cover is in an error state |
loader | ReactNode? | No | Override the default skeleton loader |
errorDisplay | ReactNode? | No | Override the default error display |
metaButtonStyle | ButtonStyle? | No | The button style returned from the embed metadata endpoint |
overrideButtonStyle | StyleProp? | No | Override the button style |
overrideButtonTextStyle | StyleProp? | No | Override the button text style |
containerStyle | StyleProp? | No | Override the container style |
coverImageStyle | StyleProp? | No | Override the cover image style |
hideCoverButton | boolean? | No | Whether to hide the cover button |
imageUrl | string? | No | The url of the cover image |
imageAspectRatio | number? | No | The aspect ratio of the cover image |
ExperienceModal Props
| Property | Type | Required | Description |
|---|
isOpen | boolean | Yes | Whether the modal is open |
onClose | () => void | Yes | Callback for when close is requested |
embedUrl | string | Yes | The URL of the embedded card experience |
modalHeader | ReactNode | No | Override the default modal header |
shareClickUrl | string | No | Override the url that redirects a user when clicking on a share link |
appId | string | No | An identifier for the embedded Komo content |
formPrefillValues | Record<string, string> | No | Prefill values for the form within the experience |
loadingIndicator | ReactNode | No | Override the default loading indicator |
modalProps | ModalProps | No | Override the default modal props |
loadingTimeoutMs | number | No | Timeout in milliseconds before showing error state. Defaults to 15000ms |
errorDisplay | ({ onRetry }: { onRetry: () => void }) => ReactNode | No | Override the default error display |
onFileDownload | WebViewProps'onFileDownload' | No | Callback for when a file download is requested. Only applies to iOS. See react-native-webview docs for more details |
KomoCardWidget Props
| Property | Type | Required | Description |
|---|
embedMetaUrl | string | Yes | The URL of the embed metadata for the card, copied from the Komo Portal |
appId | string | No | An identifier for the embedded Komo content |
containerStyle | StyleProp | No | Override the container style |
coverImageStyle | StyleProp | No | Override the cover image style |
buttonStyle | StyleProp | No | Override the button style |
buttonTextStyle | StyleProp | No | Override the button text style |
coverLoader | ReactNode | No | Override the default loader for the cover |
coverErrorDisplay | ReactNode | No | Override the default error display for the cover |
hideCoverButton | boolean | No | Whether to hide the cover button. Defaults to false |
modalHeader | ReactNode | No | Override the default modal header |
onError | (e: any) => void | No | Callback for when an error occurs during querying the embed metadata endpoint |
onModalClose | () => void | No | Callback for when the modal is closed |
onModalOpen | () => void | No | Callback for when the modal is opened |
shareClickUrl | string | No | Override the url that redirects a user when clicking on a share link |
formPrefillValues | Record<string, string> | No | Prefill values for the form within the experience |
onFileDownload | WebViewProps'onFileDownload' | No | Callback for when a file download is requested. Only applies to iOS. See react-native-webview docs for more details |