/
index.js
35 lines (28 loc) · 1.02 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import dropRepeats from 'xstream/extra/dropRepeats'
import isolate from '@cycle/isolate'
import {div} from '@cycle/dom'
import {eqProps} from 'ramda'
import {requireSources, mergeFlatten} from 'util/index'
const equalPaths = eqProps('path')
const loading = div('.loading', 'Loading...')
const callComponent = sources => ({path, value}) => {
const component = value({...sources, router: sources.router.path(path)})
return {
...component,
DOM: component.DOM.startWith(loading)
}
}
function ComponentRouter (sources) {
requireSources('ComponentRouter', sources, 'routes$')
const component$ = sources.routes$
.map(routes => sources.router.define(routes)).flatten()
.compose(dropRepeats(equalPaths)) // dont render the same page twice in a row
.map(callComponent(sources))
.remember()
return {
pluck: key => mergeFlatten(key, [component$]),
DOM: mergeFlatten('DOM', [component$]),
route$: mergeFlatten('route$', [component$])
}
}
export default sources => isolate(ComponentRouter)(sources)