cyclejs/cycle-core

View on GitHub
examples/advanced/routing-view/src/main.js

Summary

Maintainability
A
0 mins
Test Coverage
import xs from 'xstream';
import dropRepeats from 'xstream/extra/dropRepeats';
import {run} from '@cycle/run';
import {makeHashHistoryDriver} from '@cycle/history';
import {div, h1, h3, br, p, nav, span, makeDOMDriver} from '@cycle/dom';
import placeholderText from 'lorem-ipsum';

function navigation(pathname) {
  return nav([
    span({
      dataset: {page: 'home'},
      class: {'active': pathname === '/home'}
    }, 'Home'),
    span({
      dataset: {page: 'about'},
      class: {'active': pathname === '/about'}
    }, 'About'),
    span({
      dataset: {page: 'contacts'},
      class: {'active': pathname === '/contacts'}
    }, 'Contacts')
  ])
}

function homePageView() {
  return div([
    h1('Welcome to History Examples!'),
    p(placeholderText())
  ])
}

function aboutPageView() {
  return div([
    h1('About me'),
    p(placeholderText())
  ])
}

function contactsPageView() {
  return div([
    h1('Contact me'),
    p(placeholderText())
  ])
}

function view(history$) {
  return history$.map(history => {
    const {pathname} = history;
    let page = h1('404 not found');
    if (pathname === '/home') {
      page = homePageView();
    } else if (pathname === '/about') {
      page = aboutPageView();
    } else if (pathname === '/contacts') {
      page = contactsPageView();
    }

    return div([
      navigation(pathname),
      page,
      br(),
      h3('History object'),
      p(JSON.stringify(history))
    ]);
  });
}

function main(sources) {
  const history$ = sources.DOM.select('nav').events('click')
    .map(e => e.target.dataset.page)
    .compose(dropRepeats())

  const vdom$ = view(sources.history);

  return {
    DOM: vdom$,
    history: history$,
  };
}

run(main, {
  DOM: makeDOMDriver('#app'),
  history: makeHashHistoryDriver()
});