// external dependencies
import isElement from 'lodash/isElement';
import isPlainObject from 'lodash/isPlainObject';
import PropTypes from 'prop-types';
import React from 'react';
import ReactDOM from 'react-dom';
import {Provider} from 'react-redux';
// components
import {Component} from './Component';
import {createComponent} from './components';
// modules
import createModule, {getCreateReducer} from './state';
// store
import createStore from './store';
// ajax
import ajax, {
del,
get,
head,
patch,
post,
put,
} from './ajax';
// router
import {
IndexLink,
IndexRedirect,
IndexRoute,
Link,
Route,
Router,
RouterContext,
applyRouterMiddleware,
createRoutes,
createHistory,
formatPattern,
locationShape,
match,
routerShape,
syncHistoryWithImmutableStore,
syncHistoryWithStore,
withRouter,
} from './router.js';
// selectors
import createSelector from './selectors';
// utils
import {
isReactElement,
testParameter,
} from './utils';
// constants
import {ERROR_TYPES} from './constants';
/**
* @module index
*/
/**
* @private
*
* @function getAppContainerDiv
*
* @description
* get the div to render into and inject it into the DOM
*
* @returns {Element}
*/
export const getAppContainerDiv = () => {
const div = document.createElement('div');
div.id = 'app-container';
document.body.appendChild(div);
return div;
};
/**
* @function render
*
* @description
* render the passed component with the provided store
*
* @example
* import {
* render
* } from 'arco';
*
* import App from './App';
* import store from './store';
*
* render((
* <App/>
* ), document.querySelector('#app'), store);
*
* @param {ReactElement} component component to render in element
* @param {HTMLElement} element HTML element to render Component inside of
* @param {Object} store redux store to pass to all components
*/
export const render = (component, element, store) => {
testParameter(component, isReactElement, 'Component passed is not a valid React element.', ERROR_TYPES.TYPE);
testParameter(element, isElement, 'Element passed to render into is not a valid HTML element.', ERROR_TYPES.TYPE);
testParameter(store, isPlainObject, 'Store passed is not a valid arco store.', ERROR_TYPES.TYPE);
if (element.tagName.toLowerCase() === 'body') {
element = getAppContainerDiv();
}
ReactDOM.render(<Provider store={store}>{component}</Provider>, element);
};
export {Component};
export {createComponent};
export {PropTypes};
export {createModule};
export {getCreateReducer};
export {createStore};
export {ajax};
export {del};
export {get};
export {head};
export {patch};
export {post};
export {put};
export {IndexLink};
export {IndexRedirect};
export {IndexRoute};
export {Link};
export {Route};
export {Router};
export {RouterContext};
export {applyRouterMiddleware};
export {createRoutes};
export {createHistory};
export {formatPattern};
export {locationShape};
export {match};
export {routerShape};
export {syncHistoryWithImmutableStore};
export {syncHistoryWithStore};
export {withRouter};
export {React};
export {createSelector};
export default createComponent;