import React, { ComponentType, PureComponent } from 'react';
import { IntlProvider } from 'react-intl';
import _get from 'lodash/get';
import _isEmpty from 'lodash/isEmpty';
import { LocaleContext } from '../contexts';
import { IntlConnector } from './IntlConnector';
/**
* its an higher order component to provide selected local language messages
* it will get messages from translator.js to widget or component
* (comp with check then from props.intl.messages).
* const FooterContainer = LocalizeConnector(FooterWidget, Translator);
* after this statement, messages can be directly provided by just passing ID
*
* @param {*} Component
* @param {*} messagesObj
* @param {} mapStateToProps
* @param {} mapDispatchToProps
* @param {} preloadData
*/
export const IntlStoreConnector = (Component: ComponentType, messagesObj: object, appStore: any = null, mapStateToProps: any = null, mapDispatchToProps: any = null, preloadData: any = {}) => (
class extends PureComponent{
getSliceName() {
const availLanguages = Object.keys(messagesObj);
const firstLanguage = availLanguages[0];
return messagesObj[firstLanguage].slice_name.id;
}
getDefaultMessages() {
if (appStore && typeof appStore === 'function') {
const { store } = appStore();
const { getState } = store;
const sliceName = this.getSliceName();
const translator = _get(getState(), 'translator', {});
const isEmptyTranslator = _isEmpty(translator) || translator.error;
return isEmptyTranslator ? messagesObj : translator[sliceName];
}
return messagesObj;
}
render() {
const InjectedComponent = IntlConnector(Component, mapStateToProps, mapDispatchToProps, preloadData);
return (
{({ locale }) => (
)}
);
}
}
);