Files
antd-admin/src/layouts/BaseLayout.js
T

100 lines
2.3 KiB
JavaScript

import React, { PureComponent, Fragment } from 'react'
import pathToRegexp from 'path-to-regexp'
import PropTypes from 'prop-types'
import { connect } from 'dva'
import { Helmet } from 'react-helmet'
import { Loader } from 'components'
import NProgress from 'nprogress'
import config from 'utils/config'
import withRouter from 'umi/withRouter'
import PublicLayout from './PublicLayout'
import PrimaryLayout from './PrimaryLayout'
import './BaseLayout.less'
const LayoutMap = {
primary: PrimaryLayout,
public: PublicLayout,
}
/**
* Query which layout should be used for the current path based on the configuration.
* @param {layouts} layouts Layout configuration.
* @param {pathname} pathname Path name to be queried.
* @return {string} Return frist object when query success.
*/
const queryLayout = (layouts, pathname) => {
let result = 'public'
const isMatch = regepx => {
return regepx instanceof RegExp
? regepx.test(pathname)
: pathToRegexp(regepx).exec(pathname)
}
for (const item of layouts) {
let include = false
let exlude = false
if (item.include) {
for (const regepx of item.include) {
if (isMatch(regepx)) {
include = true
break
}
}
}
if (include && item.exlude) {
for (const regepx of item.exlude) {
if (isMatch(regepx)) {
exlude = true
break
}
}
}
if (include && !exlude) {
result = item.name
break
}
}
return result
}
@withRouter
@connect(({ loading }) => ({ loading }))
class BaseLayout extends PureComponent {
previousPath = ''
render() {
const { loading, children, location } = this.props
const Container = LayoutMap[queryLayout(config.layouts, location.pathname)]
const currentPath = location.pathname + location.search
if (currentPath !== this.previousPath) {
NProgress.start()
if (!loading.global) {
NProgress.done()
this.previousPath = currentPath
}
}
return (
<Fragment>
<Helmet>
<title>{config.siteName}</title>
</Helmet>
<Loader fullScreen spinning={loading.effects['app/query']} />
<Container>{children}</Container>
</Fragment>
)
}
}
BaseLayout.propTypes = {
loading: PropTypes.object,
}
export default BaseLayout