import React from 'react'; import NotFound from '../../src/components/404'; import Layout from '../../src/components/Layout'; import AsideNav from '../../src/components/AsideNav'; import {AlertComponent, ToastComponent} from '../../src/components/index'; import {mapTree} from '../../src/utils/helper'; import {Icon} from '../../src/components/icons'; import '../../src/locale/en'; import { Router, Route, IndexRoute, browserHistory, hashHistory, Link, Redirect, withRouter } from 'react-router'; import Select from '../../src/components/Select'; import DocSearch from './DocSearch'; import {groupBy} from 'lodash'; import classnames from 'classnames'; import Doc, {docs} from './Doc'; import Example, {examples} from './Example'; let ExamplePathPrefix = '/examples'; let DocPathPrefix = '/docs'; let ContextPath = ''; if (process.env.NODE_ENV === 'production') { ExamplePathPrefix = ''; DocPathPrefix = ''; ContextPath = '/amis'; } const themes = [ { label: '默认主题', ns: 'a-', value: 'default' }, { label: '百度云舍', ns: 'cxd-', value: 'cxd' }, { label: 'Dark', ns: 'dark-', value: 'dark' } ]; const locales = [ { label: '中文', value: 'zh-cn' }, { label: 'English', value: 'en' } ]; function getPath(path) { return path ? path[0] === '/' ? ContextPath + path : `${ContextPath}/${path}` : ''; } @withRouter export class App extends React.PureComponent { state = { asideFolded: localStorage.getItem('asideFolded') === 'true', offScreen: false, headerVisible: true, themeIndex: 0, themes: themes, theme: themes[localStorage.getItem('themeIndex') || 0], locale: localStorage.getItem('locale') || '', navigations: [], scrollTop: 0 }; constructor(props) { super(props); this.toggleAside = this.toggleAside.bind(this); this.setAsideFolded = this.setAsideFolded.bind(this); this.setHeaderVisible = this.setHeaderVisible.bind(this); this.setNavigations = this.setNavigations.bind(this); } componentDidMount() { if (this.state.theme.value !== 'default') { document.querySelectorAll('link[title]').forEach(item => { item.disabled = true; }); document.querySelector( `link[title=${this.state.theme.value}]` ).disabled = false; if (this.state.theme.value === 'dark') { document.querySelector('body').classList.add('dark'); } } document.addEventListener('scroll', this.handleScroll.bind(this)); } componentDidUpdate(preProps, preState) { const props = this.props; if (preState.theme.value !== this.state.theme.value) { document.querySelector( `link[title=${preState.theme.value}]` ).disabled = true; document.querySelector( `link[title=${this.state.theme.value}]` ).disabled = false; } if (props.location.pathname !== preProps.location.pathname) { this.setState( { offScreen: false }, () => window.scrollTo(0, 0) ); const pageURL = props.location.pathname; _hmt && _hmt.push(['_trackPageview', pageURL]); } } componentWillUnmount() { document.removeEventListener('scroll', this.handleScroll.bind(this)); } handleScroll(e) { this.setState({ scrollTop: e.target.scrollingElement.scrollTop }); } toggleAside() { this.setAsideFolded(!this.state.asideFolded); } setAsideFolded(folded = false) { localStorage.setItem('asideFolded', JSON.stringify(folded)); this.setState({ asideFolded: folded }); } setHeaderVisible(visible = false) { this.setState({ headerVisible: visible }); } renderAside() { return ( { return null; }} /> ); } setNavigations(items) { this.setState({ navigations: items }); } toggleOpen(e, item) { e.stopPropagation(); e.preventDefault(); const navigations = mapTree(this.state.navigations, i => { const defaultOpen = i.isOpen ?? (Array.isArray(i.children) && i.children.length && !!~i.children.findIndex( item => getPath(item.path) === location.pathname )); return { ...i, isOpen: item.label === i.label ? !defaultOpen : defaultOpen }; }); this.setState({ navigations }); } renderHeader() { const location = this.props.location; const theme = this.state.theme; if (location.pathname === '/edit') { return (
AMis 可视化编辑器
); } return ( <>
{/* */}
{/* */} AMIS
{ this.setState({theme}); localStorage.setItem( 'themeIndex', this.state.themes.indexOf(theme) ); document .querySelector('body') .classList[theme.value === 'dark' ? 'add' : 'remove']('dark'); }} />
); } renderNavigation(navs, parent?: any) { const pathname = location.pathname; return navs.map(nav => { const path = getPath(nav.path); const hasChildren = Array.isArray(nav.children) && nav.children.length; const isOpen = nav.isOpen || (nav.isOpen !== false && hasChildren && !!~nav.children.findIndex(item => getPath(item.path) === pathname)); return (
{ browserHistory.push( `${path || (hasChildren && getPath(nav.children[0].path))}` ); !isOpen && this.toggleOpen(e, nav); }} // to={`${path || (hasChildren && nav.children[0].path)}`} > {nav.label} {hasChildren ? ( this.toggleOpen(e, nav)} > ) : null} {isOpen ? this.renderNavigation(nav.children || [], { ...nav, path }) : null}
); }); } render() { const theme = this.state.theme; const navigations = this.state.navigations; return (
{navigations.map(item => (
{item.label || '其他'}
{this.renderNavigation(item.children)}
))}
{/* 完了加个动画吧 */}
450 ? 'visible' : ''}`} onClick={() => scrollTo({top: 0})} >
{React.cloneElement(this.props.children, { key: theme.value, ...this.props.children.props, setNavigations: this.setNavigations, setAsideFolded: this.setAsideFolded, setHeaderVisible: this.setHeaderVisible, theme: theme.value, classPrefix: theme.ns, locale: this.state.locale, ContextPath })}
); } } function navigations2route(pathPrefix = DocPathPrefix, navigations) { let routes = []; navigations.forEach(root => { root.children && mapTree(root.children, item => { if (item.path && item.component) { routes.push( ); } else if (item.path && item.getComponent) { routes.push( ); } }); }); return routes; } export default function entry({pathPrefix}) { // PathPrefix = pathPrefix || DocPathPrefix; return ( {navigations2route(DocPathPrefix, docs)} {navigations2route(ExamplePathPrefix, examples)} ); }