<!DOCTYPE html>
<html>
<head>
  <title>React Transact Counter Example</title>
  <link rel="stylesheet" href="./style.css"/>
</head>
<body>
<div id="app"></div>
<script src="https://npmcdn.com/react@15.0.2/dist/react.js"></script>
<script src="https://npmcdn.com/react-dom@15.0.2/dist/react-dom.js"></script>
<script src="https://npmcdn.com/react-transact@0.2.0/umd/ReactTransact.js"></script>
<script src="./script.js"></script>
</body>
</html>
const Task = ReactTransact.Task
const taskCreator = ReactTransact.taskCreator
const transact = ReactTransact.transact
const RunContext = ReactTransact.RunContext
const h = React.createElement

// Tasks
const inc = Task.resolve({ type: 'INCREMENT' })
const dec = Task.resolve({ type: 'DECREMENT' })

// Create a HOC with transact.
const Container = transact()(
  // The state and transact props are coming from RunContext.
  ({ transact }) => h('div', {},
    h('div', { className: 'container', children: [
      h('button', { onClick: () => transact.run(dec) }, ['-']),
      h('p', {}, [transact.store.getState().counter]),
      h('button', { onClick: () => transact.run(inc) }, ['+'])
    ]})
  )
)

const stateReducer = (state, action) => {
  switch (action.type) {
    case 'INCREMENT': return { counter: state.counter + 1 }
    case 'DECREMENT': return { counter: state.counter - 1 }
    default: return (state || { counter: 0 })
  }
}

// Render the application with state reducer and starting props.
ReactDOM.render(
  h(RunContext, { stateReducer },
    h(Container)
  ),
  document.getElementById('app')
)
html, body, h1 {
  padding: 0;
  margin: 0;
  font-size: 10vh;
  line-height: 1;
}
.container {
  width: 100vw;
  height: 100vh;
  font-size: 1.4rem;
  display: flex;
  justify-content: center;
  align-items: center;
}
button {
  font-size: 1.4rem;
  padding: 0.3em 0.5em;
}
p {
  width: 2.5em;
  text-align: center;
}