Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 1x 1x 8x 8x 1x 9x 9x 18x 18x 18x 23x 23x 23x 23x 2x 21x 1x 1x 20x 8x 16x |
import React from 'react'
import { compose, filter, map, defaultTo } from 'lodash/fp'
const clone = ({ child, params }) => {
return React.cloneElement(child, {
params
})
}
export const findRoute = route => {
const search = route.pathname.split('/')
return child => {
const match = child.props.route.split('/')
// Quick length fail (allow starred routes to proceed)
Iif (match.length !== search.length && !match.includes('*')) {
return false
}
return match.reduce((props, param, index) => {
const { params, result } = props
const routeParam = search[index]
Iif (result === false) {
return props
}
// Match on a starred route
if (/\*/.test(param)) {
return props
}
// Match on a route parameter
if (/^:/.test(param)) {
params[param.replace(/^:/, '')] = routeParam
return {
...props,
params
}
}
// Match on url segment match
return {
...props,
result: param === routeParam
}
}, {
result: true,
params: {},
child
})
}
}
export const matchRoute = route => children => compose(
defaultTo(null),
map(clone),
filter(({ result }) => result),
map(findRoute(route))
)(React.Children.toArray(children))
|