mirror of
https://github.com/facebook/docusaurus.git
synced 2025-05-19 20:17:06 +02:00
refactor(v2): use react hooks on root app (#1095)
* refactor(v2): use functional component + react hooks for App * docusaurus/link * nits * review
This commit is contained in:
parent
72d1fa2d2a
commit
8695ed89a6
23 changed files with 65 additions and 58 deletions
|
@ -5,7 +5,7 @@
|
||||||
* LICENSE file in the root directory of this source tree.
|
* LICENSE file in the root directory of this source tree.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React, {useState} from 'react';
|
||||||
import {renderRoutes} from 'react-router-config';
|
import {renderRoutes} from 'react-router-config';
|
||||||
|
|
||||||
import routes from '@generated/routes'; // eslint-disable-line
|
import routes from '@generated/routes'; // eslint-disable-line
|
||||||
|
@ -27,23 +27,13 @@ const data = {
|
||||||
siteConfig,
|
siteConfig,
|
||||||
};
|
};
|
||||||
|
|
||||||
class App extends React.Component {
|
function App() {
|
||||||
constructor(props) {
|
const [context, setContext] = useState({});
|
||||||
super(props);
|
|
||||||
this.state = {
|
|
||||||
setContext: context => {
|
|
||||||
this.setState(context);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
return (
|
return (
|
||||||
<DocusaurusContext.Provider value={{...data, ...this.state}}>
|
<DocusaurusContext.Provider value={{...data, ...context, setContext}}>
|
||||||
{renderRoutes(routes)}
|
{renderRoutes(routes)}
|
||||||
</DocusaurusContext.Provider>
|
</DocusaurusContext.Provider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
|
25
v2/lib/docusaurus/Link.js
Normal file
25
v2/lib/docusaurus/Link.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2017-present, Facebook, Inc.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import React from 'react';
|
||||||
|
import {NavLink} from 'react-router-dom';
|
||||||
|
|
||||||
|
const externalRegex = /^(https?:|\/\/)/;
|
||||||
|
|
||||||
|
function Link(props) {
|
||||||
|
const {to, href} = props;
|
||||||
|
const targetLink = to || href;
|
||||||
|
const isExternal = externalRegex.test(targetLink);
|
||||||
|
return !targetLink || isExternal ? (
|
||||||
|
// eslint-disable-next-line jsx-a11y/anchor-has-content
|
||||||
|
<a {...props} href={targetLink} />
|
||||||
|
) : (
|
||||||
|
<NavLink {...props} to={targetLink} />
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Link;
|
|
@ -6,8 +6,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, {useContext} from 'react';
|
import React, {useContext} from 'react';
|
||||||
import {Link} from 'react-router-dom';
|
import Link from '@docusaurus/Link';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
import Layout from '@theme/Layout'; // eslint-disable-line
|
import Layout from '@theme/Layout'; // eslint-disable-line
|
||||||
import BlogPost from '@theme/BlogPost'; // eslint-disable-line
|
import BlogPost from '@theme/BlogPost'; // eslint-disable-line
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {Link} from 'react-router-dom';
|
import Link from '@docusaurus/Link';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
import Layout from '@theme/Layout'; // eslint-disable-line
|
import Layout from '@theme/Layout'; // eslint-disable-line
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import React, {useContext} from 'react';
|
import React, {useContext} from 'react';
|
||||||
import {renderRoutes} from 'react-router-config';
|
import {renderRoutes} from 'react-router-config';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
import Footer from '@theme/Footer'; // eslint-disable-line
|
import Footer from '@theme/Footer'; // eslint-disable-line
|
||||||
import Navbar from '@theme/Navbar'; // eslint-disable-line
|
import Navbar from '@theme/Navbar'; // eslint-disable-line
|
||||||
|
|
|
@ -16,9 +16,7 @@ function DocBody(props) {
|
||||||
const {children, metadata} = props;
|
const {children, metadata} = props;
|
||||||
const context = useContext(DocusaurusContext);
|
const context = useContext(DocusaurusContext);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
context.setContext({
|
context.setContext({metadata});
|
||||||
metadata,
|
|
||||||
});
|
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, {useContext} from 'react';
|
import React, {useContext} from 'react';
|
||||||
import {Link} from 'react-router-dom';
|
import Link from '@docusaurus/Link';
|
||||||
|
|
||||||
import DocusaurusContext from '@docusaurus/context';
|
import DocusaurusContext from '@docusaurus/context';
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, {useContext} from 'react';
|
import React, {useContext} from 'react';
|
||||||
import {Link} from 'react-router-dom';
|
import Link from '@docusaurus/Link';
|
||||||
|
|
||||||
import DocusaurusContext from '@docusaurus/context';
|
import DocusaurusContext from '@docusaurus/context';
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, {useContext} from 'react';
|
import React, {useContext} from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
import DocusaurusContext from '@docusaurus/context';
|
import DocusaurusContext from '@docusaurus/context';
|
||||||
|
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, {useContext} from 'react';
|
import React, {useContext} from 'react';
|
||||||
import {NavLink} from 'react-router-dom';
|
|
||||||
|
|
||||||
|
import Link from '@docusaurus/Link';
|
||||||
import Search from '@theme/Search';
|
import Search from '@theme/Search';
|
||||||
import DocusaurusContext from '@docusaurus/context';
|
import DocusaurusContext from '@docusaurus/context';
|
||||||
import styles from './styles.module.css';
|
import styles from './styles.module.css';
|
||||||
|
@ -54,12 +54,12 @@ function Navbar(props) {
|
||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<li key={link.doc} className={styles.navListItem}>
|
<li key={link.doc} className={styles.navListItem}>
|
||||||
<NavLink
|
<Link
|
||||||
activeClassName={styles.navLinkActive}
|
activeClassName={styles.navLinkActive}
|
||||||
className={styles.navLink}
|
className={styles.navLink}
|
||||||
to={docsMetadatas[id].permalink}>
|
to={docsMetadatas[id].permalink}>
|
||||||
{link.label}
|
{link.label}
|
||||||
</NavLink>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -70,12 +70,12 @@ function Navbar(props) {
|
||||||
}`;
|
}`;
|
||||||
return (
|
return (
|
||||||
<li key={link.page} className={styles.navListItem}>
|
<li key={link.page} className={styles.navListItem}>
|
||||||
<NavLink
|
<Link
|
||||||
activeClassName={styles.navLinkActive}
|
activeClassName={styles.navLinkActive}
|
||||||
className={styles.navLink}
|
className={styles.navLink}
|
||||||
to={pageHref}>
|
to={pageHref}>
|
||||||
{link.label}
|
{link.label}
|
||||||
</NavLink>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -83,9 +83,9 @@ function Navbar(props) {
|
||||||
// set link to specified href
|
// set link to specified href
|
||||||
return (
|
return (
|
||||||
<li key={link.label} className={styles.navListItem}>
|
<li key={link.label} className={styles.navListItem}>
|
||||||
<a href={link.href} className={styles.navLink}>
|
<Link to={link.href} className={styles.navLink}>
|
||||||
{link.label}
|
{link.label}
|
||||||
</a>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -94,12 +94,12 @@ function Navbar(props) {
|
||||||
const blogUrl = `${baseUrl}blog`;
|
const blogUrl = `${baseUrl}blog`;
|
||||||
return (
|
return (
|
||||||
<li key="Blog" className={styles.navListItem}>
|
<li key="Blog" className={styles.navListItem}>
|
||||||
<NavLink
|
<Link
|
||||||
activeClassName={styles.navLinkActive}
|
activeClassName={styles.navLinkActive}
|
||||||
className={styles.navLink}
|
className={styles.navLink}
|
||||||
to={blogUrl}>
|
to={blogUrl}>
|
||||||
Blog
|
Blog
|
||||||
</NavLink>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -111,14 +111,14 @@ function Navbar(props) {
|
||||||
<div className={styles.navbarInner}>
|
<div className={styles.navbarInner}>
|
||||||
<ul className={styles.navList}>
|
<ul className={styles.navList}>
|
||||||
<li key="logo" className={styles.navListItem}>
|
<li key="logo" className={styles.navListItem}>
|
||||||
<NavLink className={styles.navBrand} to="/">
|
<Link className={styles.navBrand} to="/">
|
||||||
<img
|
<img
|
||||||
alt="Docusaurus Logo"
|
alt="Docusaurus Logo"
|
||||||
className={styles.navLogo}
|
className={styles.navLogo}
|
||||||
src={baseUrl + headerIcon}
|
src={baseUrl + headerIcon}
|
||||||
/>
|
/>
|
||||||
<strong>Docusaurus</strong>
|
<strong>Docusaurus</strong>
|
||||||
</NavLink>
|
</Link>
|
||||||
</li>
|
</li>
|
||||||
{headerLinks.map(makeLinks)}
|
{headerLinks.map(makeLinks)}
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, {useContext} from 'react';
|
import React, {useContext} from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
import Layout from '@theme/Layout'; // eslint-disable-line
|
import Layout from '@theme/Layout'; // eslint-disable-line
|
||||||
|
|
||||||
import DocusaurusContext from '@docusaurus/context';
|
import DocusaurusContext from '@docusaurus/context';
|
||||||
|
|
|
@ -6,18 +6,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import {NavLink} from 'react-router-dom';
|
import Link from '@docusaurus/Link';
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
|
|
||||||
import styles from './styles.module.css';
|
import styles from './styles.module.css';
|
||||||
|
|
||||||
export default function SidebarLink({href, label}) {
|
export default function SidebarLink({href, label}) {
|
||||||
const isExternal = /^(https?:|\/\/)/.test(href);
|
|
||||||
const Link = isExternal
|
|
||||||
? // eslint-disable-next-line jsx-a11y/anchor-has-content
|
|
||||||
({to, activeClassName, ...linkProps}) => <a {...linkProps} href={to} />
|
|
||||||
: NavLink;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li className={styles.sidebarListItem}>
|
<li className={styles.sidebarListItem}>
|
||||||
<Link
|
<Link
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
export default class World extends React.Component {
|
export default class World extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
export default class Home extends React.Component {
|
export default class Home extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
export default class World extends React.Component {
|
export default class World extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
export default class Home extends React.Component {
|
export default class Home extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
export default class World extends React.Component {
|
export default class World extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
export default class Home extends React.Component {
|
export default class Home extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
export default class World extends React.Component {
|
export default class World extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
export default class Home extends React.Component {
|
export default class Home extends React.Component {
|
||||||
render() {
|
render() {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, {useEffect, useState} from 'react';
|
import React, {useEffect, useState} from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
|
|
||||||
import classnames from 'classnames';
|
import classnames from 'classnames';
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
*/
|
*/
|
||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Head from '@docusaurus/head';
|
import Head from '@docusaurus/Head';
|
||||||
import YouTube from 'react-youtube';
|
import YouTube from 'react-youtube';
|
||||||
|
|
||||||
export default class Player extends React.Component {
|
export default class Player extends React.Component {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue