core-app-worona
Version:
Core Package of Worona App
70 lines (62 loc) • 2 kB
JSX
/* eslint-disable no-undef, no-underscore-dangle */
import React from 'react';
import { connect } from 'react-redux';
import * as deps from '../../deps';
class LinkCssClass extends React.Component {
componentDidMount() {
this.linkElement.addEventListener('load', this.props.assetsFileDownloaded);
this.linkElement.addEventListener('error', this.props.assetsFileDontDownloaded);
}
render() {
return (
<link
rel="stylesheet"
ref={linkElement => {
this.linkElement = linkElement;
}}
type="text/css"
href={`${this.props.cdn}${this.props.path}`}
/>
);
}
}
LinkCssClass.propTypes = {
cdn: React.PropTypes.string.isRequired,
path: React.PropTypes.string.isRequired,
assetsFileDownloaded: React.PropTypes.func.isRequired,
assetsFileDontDownloaded: React.PropTypes.func.isRequired,
};
const mapDispatchToProps = (dispatch, { path, pkgName }) => ({
assetsFileDownloaded: () =>
dispatch(deps.actions.packageAssetFileDownloaded({ path, pkgName, assetType: 'css' })),
assetsFileDontDownloaded: error =>
dispatch(
deps.actions.packageAssetFileDontDownloaded({ path, pkgName, assetType: 'css', error })
),
});
const LinkCss = connect(null, mapDispatchToProps)(LinkCssClass);
const CssLoader = ({ cssAssets, cdn }) => (
<div>
{cssAssets.map(asset => (
<LinkCss
pkgName={asset.pkgName}
cdn={`https://${cdn}.worona.io/packages/`}
path={asset.path}
key={asset.path}
/>
))}
</div>
);
CssLoader.propTypes = {
cssAssets: React.PropTypes.arrayOf(React.PropTypes.object).isRequired,
cdn: React.PropTypes.string.isRequired,
};
export const mapStateToProps = state => ({
cssAssets: deps.selectors.getCssAssets(state),
cdn: window.location.host.startsWith('preapp.worona.org') ||
window.location.host.startsWith('localhost') ||
window.__worona__.pre
? 'precdn'
: 'cdn',
});
export default connect(mapStateToProps)(CssLoader);