router-view.js 3.83 KB
import React, { useState, useEffect } from 'react'
import { Switch, Route, useHistory, Redirect } from 'react-router-dom'
import { Guards } from './guards'
import connect from '../store/modules/route/connect'
import { getAllRouter } from '../libs/utilts'
import { getToken } from 'xbd-cookie'
import Layout from '@/components/Layout'
import http from '@/libs/fetch'
import { getMenu } from '@/api/user'
import { Modal, Spin } from 'antd'
import Ifram from '../components/iframe'

import error401 from "@/view/error/401"
import fullScreenRoute from './modules/fullScreenRoute'

/** 路由视图 */
const RouterView = ({
    basisRoute = [],
    serviceRoute = [],
    userRoute = [],
    userSatatus,
    SYSTEM_LOGIN,
    openRoute = [],
    SYSTEM_SAVE_OPEN_ROUTE,
    baseConfig
}) => {

    const history = useHistory()
    const [loading, setLoading] = useState(true)

    useEffect(() => {
        // 二级路由转一级路由
        const allRoute = getAllRouter(userRoute)

        const newRoutes = allRoute.map(e => {
            const index = serviceRoute.findIndex(service => e.url === service.url || e.url === service.alias)
            if (index !== -1)
                return { ...e, ...serviceRoute[index], component: serviceRoute[index].component }
            else
                return { ...e, ...serviceRoute[index], component: () => (<Ifram url={e.url} />) }

        })

        const parentRoute = serviceRoute.map(e => {
            const index = newRoutes.findIndex(service => e?.parentName?.includes(service.url))
            if (index !== -1)
                return e
            else
                return null
        }).filter(e => e)

        SYSTEM_SAVE_OPEN_ROUTE([...newRoutes, ...parentRoute])
    }, [userRoute, serviceRoute, SYSTEM_SAVE_OPEN_ROUTE])

    // 校验权限
    useEffect(() => {
        const token = getToken()
        const isFullScreenRoute = fullScreenRoute.find(e => e.url === history.location.pathname)
        setLoading(true)

        if (baseConfig.operationChannel === undefined) return

        if (userSatatus)
            setLoading(false)

        else if (token) {
            http.setHeader('Sessionid', token)
            getMenu()
                .then(res => {
                    SYSTEM_LOGIN(res)
                    setLoading(false)
                    if (isFullScreenRoute) history.replace(res.menu.length ? res.menu[0].childMenus[0].url : '/')
                })
                .catch(err => {
                    setLoading(false)
                    Modal.error({ title: '错误', content: err, onOk: () => history.replace('/login') })
                })
        }
        else if (!isFullScreenRoute) {
            setLoading(false)
            history.replace('/login')
        } else
            setLoading(false)
    }, [serviceRoute, openRoute, baseConfig, userSatatus, SYSTEM_LOGIN, history])


    if (loading && !userSatatus && openRoute.length === 0) {
        return (
            <div className="loading-page">
                <Spin tip="启动应用中..." size="large" />
            </div>
        )
    }
    else if (userSatatus) {
        return (
            <Layout>
                <Switch>
                    {basisRoute.map(e => e && <Route path={e.url} exact={e.exact} component={Guards(e.component)} key={e.url} />)}
                    {openRoute.map(e => e && <Route path={e.url} exact={e.exact} component={Guards(e.component)} key={e.url} />)}
                    <Route component={Guards(error401)} />
                </Switch>
            </Layout>
        )
    }
    else if (!userSatatus) {
        return (
            <Switch>
                {fullScreenRoute.map(e => <Route path={e.url} exact={e.exact} component={Guards(e.component)} key={e.url} />)}
                <Redirect path="/" to="/login" />
            </Switch>
        )
    }
    else return null
}

export default connect(RouterView)