Created
May 14, 2020 07:52
-
-
Save dontwork/6c20aa5dcb5d6555c3c00285058d9601 to your computer and use it in GitHub Desktop.
solid meiosis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { createState } from 'solid-js' | |
import meiosis from 'meiosis-setup/mergerino' | |
import simpleStream from 'meiosis-setup/simple-stream' | |
import { createRouteSegments, Routing, Actions } from 'meiosis-routing/state' | |
import merge from 'mergerino' | |
import createRouteMatcher from 'feather-route-matcher' | |
import { createFeatherRouter } from 'meiosis-routing/router-helper' | |
import qs from 'qs' | |
import { render } from 'solid-js/dom' | |
import h from 'solid-js/h' | |
const Route = createRouteSegments([ | |
'Home', | |
'Login' | |
]) | |
const routeConfig = { | |
Home: '/', | |
Login: '/login' | |
} | |
const router = createFeatherRouter({ | |
createRouteMatcher, | |
queryString: qs, | |
routeConfig, | |
defaultRoute: [Route.Home()] | |
}) | |
const meiosisSolid = ({ h, createState, Root }) => { | |
return ({ states, update, actions }) => { | |
const [state, setState] = createState(states()) | |
console.log(states()) | |
states.map(val => { | |
setState(val) | |
}) | |
return () => h(Root, { state, update, actions }) | |
} | |
} | |
const Home = ({ state, actions }) => { | |
return [ | |
h('div', () => state.count), | |
h('button', { | |
onclick: actions.increment | |
}, 'Click'), | |
h('a', { | |
href: router.toPath(Route.Login()) | |
}, 'login') | |
] | |
} | |
const Login = () => { | |
return [ | |
h('div', 'Login hi ') | |
// h('a', { | |
// href: router.toPath(Route.Home()) | |
// }, 'home') | |
] | |
} | |
const componentMap = { Home, Login } | |
const Root = ({ state, update, actions }) => { | |
const ComponentFn = () => { | |
const routing = Routing(state.route) | |
return componentMap[routing.localSegment.id] | |
} | |
return () => h(ComponentFn(), { state, actions }) | |
} | |
const App = meiosisSolid({ h, createState, Root }) | |
export const createApp = initialRoute => { | |
return { | |
initial: { | |
route: initialRoute, | |
count: 0 | |
}, | |
Actions: update => { | |
return { | |
...Actions(update), | |
increment: () => { | |
update({ | |
count: x => x + 1 | |
}) | |
} | |
} | |
} | |
} | |
} | |
const app = createApp(router.initialRoute) | |
const { update, states, actions } = | |
meiosis({ stream: simpleStream, merge, app }) | |
router.start({ navigateTo: actions.navigateTo }) | |
states.map(state => { | |
router.locationBarSync(state.route) | |
}) | |
const element = document.getElementById('app') | |
// If you only use update or actions, you can omit the other | |
render(App({ | |
states, | |
update, | |
actions | |
}), element) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment