Guest User

Untitled

a guest
Nov 17th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1. import * as m from 'mithril'
  2. import * as stream from 'mithril/stream'
  3.  
  4. interface State {
  5. error: boolean
  6. counter: number
  7. }
  8.  
  9. // state
  10. const counter = stream(0)
  11. const error = stream(false)
  12. const state: stream.Stream<State> = stream
  13. .merge([counter, error])
  14. .map(([counter, error]: [number, boolean]) => {
  15. return {
  16. counter,
  17. error
  18. }
  19. })
  20.  
  21. const getState = () => state()
  22.  
  23. // action
  24. const updateCounter = (n: number) => counter(n)
  25. const setError = (exists: boolean) => error(exists)
  26.  
  27. // .. usecase, can have Promise or callback for progress update to m.redraw
  28. const updateCounterUseCase = (n: number) => {
  29. if (n >= -10 && n <= 10) {
  30. setError(false)
  31. updateCounter(n)
  32. } else {
  33. setError(true)
  34. }
  35. }
  36.  
  37. const appRoot = document.createElement('div')
  38. appRoot.id = 'app'
  39. document.body.appendChild(appRoot)
  40.  
  41. const Home: m.Component<
  42. {},
  43. {
  44. getState: () => State
  45. updateCounter: (n: number) => void
  46. }
  47. > = {
  48. oninit: vnode => {
  49. vnode.state = {
  50. getState,
  51. updateCounter: updateCounterUseCase
  52. }
  53. },
  54. view: vnode => {
  55. console.log('redraw')
  56. const state = vnode.state.getState()
  57. const { updateCounter } = vnode.state
  58. return m('', [
  59. m('h1', 'Home route. ' + state.counter),
  60. m('div', state.error ? 'You are out of bounds, stop it!' : 'You are OK!'),
  61. m(
  62. 'button',
  63. {
  64. onclick: (e: MouseEvent) => updateCounter(state.counter - 1),
  65. onmousemove: (e: MouseEvent) => {
  66. e.redraw = false
  67. }
  68. },
  69. 'Decrement'
  70. ),
  71. m(
  72. 'button',
  73. { onclick: (e: MouseEvent) => updateCounter(state.counter + 1) },
  74. 'Increment'
  75. )
  76. ])
  77. }
  78. }
  79.  
  80. m.route(appRoot, 'home', {
  81. home: Home
  82. })
Add Comment
Please, Sign In to add comment