feat(nav): Add a Nav to news and update www nav links
This commit is contained in:
committed by
mrugesh mohapatra
parent
40eacff588
commit
2c633e70da
@ -7,5 +7,9 @@
|
|||||||
"content": "Forum",
|
"content": "Forum",
|
||||||
"link": "https://forum.freecodecamp.org/",
|
"link": "https://forum.freecodecamp.org/",
|
||||||
"target": "_blank"
|
"target": "_blank"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"content": "News",
|
||||||
|
"link": "https://www.freecodecamp.org/news"
|
||||||
}
|
}
|
||||||
]
|
]
|
@ -1,10 +1,20 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import { Grid } from 'react-bootstrap';
|
||||||
|
|
||||||
|
import { FullWidthRow } from '../common/app/helperComponents';
|
||||||
|
import Nav from './components/Nav';
|
||||||
|
import { routes } from './routes';
|
||||||
|
|
||||||
const propTypes = {};
|
const propTypes = {};
|
||||||
|
|
||||||
function NewsApp() {
|
function NewsApp() {
|
||||||
return (
|
return (
|
||||||
<h1>This is the news!</h1>
|
<div>
|
||||||
|
<Nav />
|
||||||
|
<Grid fluid={true}>
|
||||||
|
<FullWidthRow>{routes}</FullWidthRow>
|
||||||
|
</Grid>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,19 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
import {BrowserRouter} from 'react-router-dom';
|
||||||
import { render } from 'react-dom';
|
import { render } from 'react-dom';
|
||||||
|
|
||||||
import NewsApp from './NewsApp';
|
import NewsApp from './NewsApp';
|
||||||
|
|
||||||
const newsMountPoint = document.getElementById('news-app-mount');
|
const newsMountPoint = document.getElementById('news-app-mount');
|
||||||
|
|
||||||
|
const App = (
|
||||||
|
<BrowserRouter basename='/news'>
|
||||||
|
<NewsApp />
|
||||||
|
</BrowserRouter>
|
||||||
|
);
|
||||||
|
|
||||||
render(
|
render(
|
||||||
<NewsApp/>,
|
App,
|
||||||
newsMountPoint,
|
newsMountPoint,
|
||||||
() => console.log('react has rendered and is ready to go go go go go go!!')
|
() => console.log('react has rendered and is ready to go go go go go go!!')
|
||||||
);
|
);
|
38
news/components/Nav/LargeNav.js
Normal file
38
news/components/Nav/LargeNav.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Media from 'react-media';
|
||||||
|
import { Col, Navbar, Row } from 'react-bootstrap';
|
||||||
|
import FCCSearchBar from 'react-freecodecamp-search';
|
||||||
|
import NavLogo from './components/NavLogo';
|
||||||
|
import NavLinks from './components/NavLinks';
|
||||||
|
|
||||||
|
import propTypes from './navPropTypes';
|
||||||
|
|
||||||
|
function LargeNav({ clickOnLogo }) {
|
||||||
|
return (
|
||||||
|
<Media
|
||||||
|
query='(min-width: 956px)'
|
||||||
|
render={
|
||||||
|
() => (
|
||||||
|
<Row>
|
||||||
|
<Col className='nav-component' sm={ 7 } xs={ 12 }>
|
||||||
|
<Navbar.Header>
|
||||||
|
<NavLogo clickOnLogo={ clickOnLogo } />
|
||||||
|
<FCCSearchBar />
|
||||||
|
</Navbar.Header>
|
||||||
|
</Col>
|
||||||
|
<Col className='nav-component nav-links' sm={ 5 } xs={ 0 }>
|
||||||
|
<Navbar.Collapse>
|
||||||
|
<NavLinks />
|
||||||
|
</Navbar.Collapse>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
LargeNav.displayName = 'LargeNav';
|
||||||
|
LargeNav.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default LargeNav;
|
42
news/components/Nav/MediumNav.js
Normal file
42
news/components/Nav/MediumNav.js
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Media from 'react-media';
|
||||||
|
import { Navbar, Row } from 'react-bootstrap';
|
||||||
|
import FCCSearchBar from 'react-freecodecamp-search';
|
||||||
|
import NavLogo from './components/NavLogo';
|
||||||
|
import NavLinks from './components/NavLinks';
|
||||||
|
import propTypes from './navPropTypes';
|
||||||
|
|
||||||
|
function MediumNav({ clickOnLogo }) {
|
||||||
|
return (
|
||||||
|
<Media
|
||||||
|
query={{ maxWidth: 955, minWidth: 751 }}
|
||||||
|
>
|
||||||
|
{
|
||||||
|
matches => matches && typeof window !== 'undefined' && (
|
||||||
|
<div>
|
||||||
|
<Row>
|
||||||
|
<Navbar.Header className='medium-nav'>
|
||||||
|
<div className='nav-component header'>
|
||||||
|
<Navbar.Toggle />
|
||||||
|
<NavLogo clickOnLogo={ clickOnLogo } />
|
||||||
|
<FCCSearchBar />
|
||||||
|
</div>
|
||||||
|
<div className='nav-component bins'/>
|
||||||
|
</Navbar.Header>
|
||||||
|
</Row>
|
||||||
|
<Row className='collapse-row'>
|
||||||
|
<Navbar.Collapse>
|
||||||
|
<NavLinks />
|
||||||
|
</Navbar.Collapse>
|
||||||
|
</Row>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</Media>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
MediumNav.displayName = 'MediumNav';
|
||||||
|
MediumNav.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default MediumNav;
|
31
news/components/Nav/Nav.js
Normal file
31
news/components/Nav/Nav.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { Navbar } from 'react-bootstrap';
|
||||||
|
|
||||||
|
import LargeNav from './LargeNav';
|
||||||
|
import MediumNav from './MediumNav';
|
||||||
|
import SmallNav from './SmallNav';
|
||||||
|
|
||||||
|
const allNavs = [
|
||||||
|
LargeNav,
|
||||||
|
MediumNav,
|
||||||
|
SmallNav
|
||||||
|
];
|
||||||
|
|
||||||
|
export default function FCCNav() {
|
||||||
|
const withNavProps = Component => (
|
||||||
|
<Component
|
||||||
|
key={ Component.displayName }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
return (
|
||||||
|
<Navbar
|
||||||
|
className='nav-height'
|
||||||
|
id='navbar'
|
||||||
|
staticTop={ true }
|
||||||
|
>
|
||||||
|
{
|
||||||
|
allNavs.map(withNavProps)
|
||||||
|
}
|
||||||
|
</Navbar>
|
||||||
|
);
|
||||||
|
}
|
44
news/components/Nav/SmallNav.js
Normal file
44
news/components/Nav/SmallNav.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import Media from 'react-media';
|
||||||
|
import { Navbar, Row } from 'react-bootstrap';
|
||||||
|
import FCCSearchBar from 'react-freecodecamp-search';
|
||||||
|
import NavLogo from './components/NavLogo';
|
||||||
|
import NavLinks from './components/NavLinks';
|
||||||
|
|
||||||
|
import propTypes from './navPropTypes';
|
||||||
|
|
||||||
|
function SmallNav({ clickOnLogo }) {
|
||||||
|
return (
|
||||||
|
<Media
|
||||||
|
query='(max-width: 750px)'
|
||||||
|
>
|
||||||
|
{
|
||||||
|
matches => matches && typeof window !== 'undefined' && (
|
||||||
|
<div>
|
||||||
|
<Row>
|
||||||
|
<Navbar.Header className='small-nav'>
|
||||||
|
<div className='nav-component header'>
|
||||||
|
<Navbar.Toggle />
|
||||||
|
<NavLogo clickOnLogo={ clickOnLogo } />
|
||||||
|
</div>
|
||||||
|
<div className='nav-component bins'/>
|
||||||
|
</Navbar.Header>
|
||||||
|
</Row>
|
||||||
|
<Row className='collapse-row'>
|
||||||
|
<Navbar.Collapse>
|
||||||
|
<NavLinks>
|
||||||
|
<FCCSearchBar />
|
||||||
|
</NavLinks>
|
||||||
|
</Navbar.Collapse>
|
||||||
|
</Row>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</Media>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
SmallNav.displayName = 'SmallNav';
|
||||||
|
SmallNav.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default SmallNav;
|
38
news/components/Nav/components/NavLinks.js
Normal file
38
news/components/Nav/components/NavLinks.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { NavItem, Nav } from 'react-bootstrap';
|
||||||
|
import { startCase } from 'lodash';
|
||||||
|
|
||||||
|
const urls = {
|
||||||
|
curriculum: 'https://learn.freecodecamp.org',
|
||||||
|
forum: 'https://forum.freecodecamp.org',
|
||||||
|
news: 'https://freecodecamp.org/news'
|
||||||
|
};
|
||||||
|
|
||||||
|
const Links = Object.keys(urls).map(key => (
|
||||||
|
<NavItem href={urls[key]} key={key} target='_blank'>
|
||||||
|
{startCase(key)}
|
||||||
|
</NavItem>
|
||||||
|
));
|
||||||
|
const propTypes = {};
|
||||||
|
|
||||||
|
function NavLinks() {
|
||||||
|
return (
|
||||||
|
<Nav id='nav-links' navbar={true} pullRight={true}>
|
||||||
|
{Links}
|
||||||
|
<NavItem href='/settings'>Settings</NavItem>
|
||||||
|
</Nav>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
NavLinks.displayName = 'NavLinks';
|
||||||
|
NavLinks.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default NavLinks;
|
||||||
|
|
||||||
|
/*
|
||||||
|
<SignUp
|
||||||
|
isInDropDown={ !isInNav }
|
||||||
|
showLoading={ showLoading }
|
||||||
|
showSignUp={ !isSignedIn }
|
||||||
|
/>
|
||||||
|
*/
|
41
news/components/Nav/components/NavLogo.js
Normal file
41
news/components/Nav/components/NavLogo.js
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { NavbarBrand } from 'react-bootstrap';
|
||||||
|
import Media from 'react-media';
|
||||||
|
|
||||||
|
const fCClogo = 'https://s3.amazonaws.com/freecodecamp/freecodecamp_logo.svg';
|
||||||
|
const fCCglyph = 'https://s3.amazonaws.com/freecodecamp/FFCFire.png';
|
||||||
|
|
||||||
|
const propTypes = {};
|
||||||
|
|
||||||
|
function NavLogo() {
|
||||||
|
return (
|
||||||
|
<NavbarBrand>
|
||||||
|
<a
|
||||||
|
href='/'
|
||||||
|
>
|
||||||
|
<Media query='(min-width: 350px)'>
|
||||||
|
{
|
||||||
|
matches => matches ? (
|
||||||
|
<img
|
||||||
|
alt='learn to code javascript at freeCodeCamp logo'
|
||||||
|
className='nav-logo logo'
|
||||||
|
src={ fCClogo }
|
||||||
|
/>
|
||||||
|
) : (
|
||||||
|
<img
|
||||||
|
alt='learn to code javascript at freeCodeCamp logo'
|
||||||
|
className='nav-logo logo'
|
||||||
|
src={ fCCglyph }
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</Media>
|
||||||
|
</a>
|
||||||
|
</NavbarBrand>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
NavLogo.displayName = 'NavLogo';
|
||||||
|
NavLogo.propTypes = propTypes;
|
||||||
|
|
||||||
|
export default NavLogo;
|
1
news/components/Nav/index.js
Normal file
1
news/components/Nav/index.js
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { default } from './Nav';
|
3
news/components/Nav/navPropTypes.js
Normal file
3
news/components/Nav/navPropTypes.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// import PropTypes from 'prop-types';
|
||||||
|
|
||||||
|
export default {};
|
@ -1,15 +1,24 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { renderToString } from 'react-dom/server';
|
import { renderToString } from 'react-dom/server';
|
||||||
|
import { StaticRouter } from 'react-router-dom';
|
||||||
|
|
||||||
import NewsApp from '../../news/NewsApp';
|
import NewsApp from '../../news/NewsApp';
|
||||||
|
|
||||||
|
function serveNewsApp(req, res) {
|
||||||
|
const context = {};
|
||||||
|
const markup = renderToString(
|
||||||
|
<StaticRouter basename='/news' context={context} location={req.url}>
|
||||||
|
<NewsApp />
|
||||||
|
</StaticRouter>
|
||||||
|
);
|
||||||
|
return res.render('layout-news', { title: 'News | freeCodeCamp', markup });
|
||||||
|
}
|
||||||
|
|
||||||
export default function newsBoot(app) {
|
export default function newsBoot(app) {
|
||||||
const router = app.loopback.Router();
|
const router = app.loopback.Router();
|
||||||
|
|
||||||
router.get('/', (req, res) => {
|
router.get('/news', serveNewsApp);
|
||||||
const markup = renderToString(<NewsApp />);
|
router.get('/news/*', serveNewsApp);
|
||||||
return res.render('layout-news', {title: 'Hello News?', markup});
|
|
||||||
});
|
|
||||||
|
|
||||||
app.use('/news', router);
|
app.use(router);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user