react-native-web
Version:
React Native for Web
73 lines (65 loc) • 1.87 kB
JavaScript
/**
* Copyright (c) Nicolas Gallagher.
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
import type { ComponentType, Node } from 'react';
import AppContainer from './AppContainer';
import invariant from 'fbjs/lib/invariant';
import render, { hydrate } from '../render';
import StyleSheet from '../StyleSheet';
import React from 'react';
export type Application = {
unmount: () => void
};
export default function renderApplication<Props: Object>(
RootComponent: ComponentType<Props>,
WrapperComponent?: ?ComponentType<*>,
callback?: () => void,
options: {
hydrate: boolean,
initialProps: Props,
rootTag: any
}
): Application {
const { hydrate: shouldHydrate, initialProps, rootTag } = options;
const renderFn = shouldHydrate ? hydrate : render;
invariant(rootTag, 'Expect to have a valid rootTag, instead got ', rootTag);
return renderFn(
<AppContainer
WrapperComponent={WrapperComponent}
ref={callback}
rootTag={rootTag}
>
<RootComponent {...initialProps} />
</AppContainer>,
rootTag
);
}
export function getApplication(
RootComponent: ComponentType<Object>,
initialProps: Object,
WrapperComponent?: ?ComponentType<*>
): {| element: Node, getStyleElement: (Object) => Node |} {
const element = (
<AppContainer WrapperComponent={WrapperComponent} rootTag={{}}>
<RootComponent {...initialProps} />
</AppContainer>
);
// Don't escape CSS text
const getStyleElement = (props) => {
const sheet = StyleSheet.getSheet();
return (
<style
{...props}
dangerouslySetInnerHTML={{ __html: sheet.textContent }}
id={sheet.id}
/>
);
};
return { element, getStyleElement };
}