# Render This package contains modules directly related to rendering an MWP React+Redux application. Although the Meetup Web Platform is built on the principle of Universal Javascript with a shared app codebase used for server and browser rendering, consumer applications will still need to bundle the browser app and the server app separately. The browser application will be instantiated in an entry point script that calls `ReactDOM.render()`, while the server application will be called from a route handler on the server. ## Browser rendering The root application component in the browser is `BrowserApp`. ```jsx ``` Although consumer applications can supply the `props` directly, the platform provides a helper function, `resolveAppProps` that should typically be used to correctly instantiate the `store`, resolve the `basename` from the app data provided by the server, and populate any asynchronous route components. ### Example The browser entry script would typically have the following structure: ```jsx import { resolveAppProps } from 'meetup-web-platform/lib/renderers/browser-render'; import makeRootReducer from 'meetup-web-platform/lib/store/reducer'; const appReducers = require('./reducers'); // map of reducer keys to reducer functions const reducer = makeRootReducer(appReducers); // create the root reducer function resolveAppProps(routes, reducer, middleware).then(props => ReactDOM.render(, document.getElementById('outlet')) ); ``` Notes: 1. Consumer apps _must_ render the application at the element with an `id` of `'outlet'` - this div is provided by the platform server renderer. 2. If you need direct access to the `store`, it can be read from `props.store` in the resolved value from `resolveAppProps`. # Server config values - AppContext The server has access to the original browser HTTP request and passes information about it into the React application through the `AppContext` React Context provider. The available properties are documented in the [`type AppContext`](https://github.com/meetup/meetup-web-platform/blob/main/flow-typed/platform.js#L10) To access these properties, import the `AppContext` component and use the [React Context Consumer API](https://reactjs.org/docs/context.html#contextconsumer) to expose the `appContext` object to child components. Example: ```jsx import { AppContext } from 'mwp-app-render/lib/components/shared/PlatformApp'; const MyComponent = props => ( {appContext =>

My language is {appContext.requestLanguage}

}
); ``` ## Components The React components in `components/` are application-general wrappers of app- specific UIs that provide the necessary React component lifecycle behavior to enable navigation-related data fetching, and shared document structure like `` content and the icon SVG sprite. - The app wrapper components: `` and `` These components provide the top-level entry point for the React application tree. They should be used with `ReactDOM.render` and `ReactDOMServer.renderToString`, respectively - `` The top-level _rendering_ component for the React application - this should generally be used at root-level route in the passed in routes. _This could be phased out as a public component, and instead built into `` and ``_ The code for `PageWrap` is organized in a directory as a standalone 'package' because the relevant code is organized into a few separate 'internal' modules. - `` A React component used on the server to get a full `` document string from `ReactDOMServer.renderToString()`. The actual application markup must be supplied as a raw HTML string in the `appMarkup` prop.