6410bc8a75
* feat: nocobase build * chore: update build scripts * chore: update build scripts * chore(versions): 😊 publish v0.7.0-alpha.33 * chore: independent version * chore: nocobase build * chore(versions): 😊 publish v0.7.0-alpha.34 * feat: nocobase-cli * feat: nocobase-cli * chore: update dependencies * feat: improve code * refactor: create-nocobase-app * chore(versions): 😊 publish v0.7.0-alpha.35 * feat: @nocobase/devtools * chore(versions): 😊 publish v0.7.0-alpha.36 * chore: update dependencies * chore(versions): 😊 publish v0.7.0-alpha.37 * feat: improve code * chore(versions): 😊 publish v0.7.0-alpha.38 * feat: improve code * chore(versions): 😊 publish v0.7.0-alpha.39 * feat: update deps * chore(versions): 😊 publish v0.7.0-alpha.40 * chore: update devDependencies * chore(versions): 😊 publish v0.7.0-alpha.41 * fix: postinstall * chore(versions): 😊 publish v0.7.0-alpha.42 * chore: improve code * chore(versions): 😊 publish v0.7.0-alpha.43 * chore: execa * chore(versions): 😊 publish v0.7.0-alpha.44 * chore(cli): allow unknown option * chore(versions): 😊 publish v0.7.0-alpha.45 * fix: default envs * chore(versions): 😊 publish v0.7.0-alpha.45 * fix: package argument for build command * chore(versions): 😊 publish v0.7.0-alpha.46 * fix: improve code * chore(versions): 😊 publish v0.7.0-alpha.48 * feat: clean & doc * chore(versions): 😊 publish v0.7.0-alpha.49 * feat: compilation tips * feat: upgrade command * chore(versions): 😊 publish v0.7.0-alpha.50 * fix: unexpected token ] in JSON * chore(versions): 😊 publish v0.7.0-alpha.51 * fix: upgrade command * chore(versions): 😊 publish v0.7.0-alpha.52 * fix: remove export action from available action * fix: db sync after upgrade * chore(versions): 😊 publish v0.7.0-alpha.53 * feat: upgrade log * chore(versions): 😊 publish v0.7.0-alpha.54 * docs: updates * feat: updates * docs(cli): update usage description * feat: updates * docs: updates * docs: updates * docs: toc * feat: sdk * docs: updates * docs: updates * docs: updates * Update index.md * docs: updates * Update release-notes.md * Update roadmap.md * Update index.md * Update contributing.md * Update contributing.md * Update index.md * Update index.md * Update nocobase-cli.md * Update nocobase-cli.md * fix: user plugin initialization data * Update env.md * Update env.md * Update directory-structure.md * Update index.md * Update action-api.md * Update filter-operators.md * docs: update thanks.md * Update index.md * Update javascript-sdk.md * Update rest-api.md * Update installation.md * Update installation.md * Update upgrading.md * Update upgrading.md * Update upgrading.md * Update installation.md * Update installation.md * Create release-notes.md * Update release-notes.md * feat: updates * feat: update docs * feat: update release-notes.md * feat: switch language * feat: updates * Add files via upload * Add files via upload * Update important-features.md * Update thanks.md * feat: nocobase postinstall * Update index.md * Create why-different.md * Update why-different.md * Create who-is-for.md * Rename who-is-for.md to who.md * feat: update docs * Rename why-different.md to why.md * Update why.md * Update menus.ts * Update why-nocobase.md * Create who.md * Create why.md * feat: updates * chore(versions): 😊 publish v0.7.0-alpha.55 * feat: tips * Update who.md * Update who.md * feat: update docs * feat: update doc menus * fix: plugin client dist * docs: update contributing.md * docs: update readme.md * docs: update readme.md * docs: update readme.md * Update functional-zoning.md * fix: br Co-authored-by: Zhou <zhou.working@gmail.com>
144 lines
4.6 KiB
TypeScript
Executable File
144 lines
4.6 KiB
TypeScript
Executable File
import type { IRouteComponentProps } from '@umijs/types';
|
|
import { context, Link } from 'dumi/theme';
|
|
import React, { useContext, useState } from 'react';
|
|
import Dark from './components/Dark';
|
|
import Navbar from './components/Navbar';
|
|
import SearchBar from './components/SearchBar';
|
|
import SideMenu from './components/SideMenu';
|
|
import SlugList from './components/SlugList';
|
|
import './style/layout.less';
|
|
|
|
const Hero = hero => (
|
|
<>
|
|
<div className="__dumi-default-layout-hero">
|
|
{hero.image && <img src={hero.image} />}
|
|
<h1>{hero.title}</h1>
|
|
<div dangerouslySetInnerHTML={{ __html: hero.desc }} />
|
|
{hero.actions &&
|
|
hero.actions.map(action => (
|
|
<Link to={action.link} key={action.text}>
|
|
<button type="button">{action.text}</button>
|
|
</Link>
|
|
))}
|
|
</div>
|
|
</>
|
|
);
|
|
|
|
const Features = features => (
|
|
<div className="__dumi-default-layout-features">
|
|
{features.map(feat => (
|
|
<dl key={feat.title} style={{ backgroundImage: feat.icon ? `url(${feat.icon})` : undefined }}>
|
|
{feat.link ? (
|
|
<Link to={feat.link}>
|
|
<dt>{feat.title}</dt>
|
|
</Link>
|
|
) : (
|
|
<dt>{feat.title}</dt>
|
|
)}
|
|
<dd dangerouslySetInnerHTML={{ __html: feat.desc }} />
|
|
</dl>
|
|
))}
|
|
</div>
|
|
);
|
|
|
|
const Layout: React.FC<IRouteComponentProps> = ({ children, location }) => {
|
|
const {
|
|
config: { mode, repository },
|
|
nav: navItems,
|
|
meta,
|
|
locale,
|
|
} = useContext(context);
|
|
console.log(useContext(context));
|
|
const { url: repoUrl, branch, platform } = repository;
|
|
const [menuCollapsed, setMenuCollapsed] = useState<boolean>(true);
|
|
const [darkSwitch, setDarkSwitch] = useState<boolean>(false);
|
|
const isSiteMode = mode === 'site';
|
|
const showHero = isSiteMode && meta.hero;
|
|
const showFeatures = isSiteMode && meta.features;
|
|
const showSideMenu = meta.sidemenu !== false && !showHero && !showFeatures && !meta.gapless;
|
|
const showSlugs =
|
|
!showHero &&
|
|
!showFeatures &&
|
|
Boolean(meta.slugs?.length) &&
|
|
(meta.toc === 'content' || meta.toc === undefined) &&
|
|
!meta.gapless;
|
|
const isCN = /^zh|cn$/i.test(locale);
|
|
const updatedTimeIns = new Date(meta.updatedTime);
|
|
const updatedTime: any = `${updatedTimeIns.toLocaleDateString([], { hour12: false })} ${updatedTimeIns.toLocaleTimeString([], { hour12: false })}`;
|
|
const repoPlatform =
|
|
{ github: 'GitHub', gitlab: 'GitLab' }[
|
|
(repoUrl || '').match(/(github|gitlab)/)?.[1] || 'nothing'
|
|
] || platform;
|
|
|
|
return (
|
|
<div
|
|
className="__dumi-default-layout"
|
|
data-route={location.pathname}
|
|
data-show-sidemenu={String(showSideMenu)}
|
|
data-show-slugs={String(showSlugs)}
|
|
data-site-mode={isSiteMode}
|
|
data-gapless={String(!!meta.gapless)}
|
|
onClick={() => {
|
|
setDarkSwitch(false);
|
|
if (menuCollapsed) return;
|
|
setMenuCollapsed(true);
|
|
}}
|
|
>
|
|
<Navbar
|
|
location={location}
|
|
navPrefix={<SearchBar />}
|
|
darkPrefix={
|
|
<Dark
|
|
location={location}
|
|
darkSwitch={darkSwitch}
|
|
onDarkSwitchClick={ev => {
|
|
setDarkSwitch(val => !val);
|
|
ev.stopPropagation();
|
|
}}
|
|
isSideMenu={false}
|
|
/>
|
|
}
|
|
onMobileMenuClick={ev => {
|
|
setMenuCollapsed(val => !val);
|
|
ev.stopPropagation();
|
|
}}
|
|
/>
|
|
<SideMenu
|
|
theme={darkSwitch ? 'dark' : 'light'}
|
|
darkPrefix={
|
|
<Dark
|
|
darkSwitch={darkSwitch}
|
|
isSideMenu={true}
|
|
/>
|
|
}
|
|
mobileMenuCollapsed={menuCollapsed}
|
|
location={location}
|
|
/>
|
|
{showSlugs && <SlugList slugs={meta.slugs} className="__dumi-default-layout-toc" />}
|
|
{showHero && Hero(meta.hero)}
|
|
{showFeatures && Features(meta.features)}
|
|
<div className="__dumi-default-layout-content">
|
|
{children}
|
|
{!showHero && !showFeatures && meta.filePath && !meta.gapless && (
|
|
<div className="__dumi-default-layout-footer-meta">
|
|
{repoPlatform && (
|
|
<Link to={`${repoUrl}/edit/${branch}/${meta.filePath}`}>
|
|
{isCN ? `在 ${repoPlatform} 上编辑此页` : `Edit this doc on ${repoPlatform}`}
|
|
</Link>
|
|
)}
|
|
<span data-updated-text={isCN ? '最后更新时间:' : 'Last update: '}>{updatedTime}</span>
|
|
</div>
|
|
)}
|
|
{(showHero || showFeatures) && meta.footer && (
|
|
<div
|
|
className="__dumi-default-layout-footer"
|
|
dangerouslySetInnerHTML={{ __html: meta.footer }}
|
|
/>
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Layout;
|