Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 50994
1
###
2
3
# Flummox using CoffeeScript --
4
5
# build:
6
7
cjsx -b -c flummox.cjsx && browserify --exports=require flummox.js -o flummox0.js
8
9
###
10
11
log = (s...) -> console.log(s...)
12
log("flummox.cjsx")
13
14
{Actions, Store, Flux} = require('flummox')
15
16
class MessageActions extends Actions
17
createMessage: (messageContent) ->
18
content : messageContent
19
date : Date.now()
20
clearMessages: () ->
21
log "clearMessages"
22
return {}
23
24
class MessageStore extends Store
25
constructor: (flux) ->
26
super()
27
messageActionIds = flux.getActionIds('messages')
28
@register(messageActionIds.createMessage, @handleNewMessage)
29
@register(messageActionIds.clearMessages, @clearMessages)
30
@state =
31
messages: []
32
33
handleNewMessage: (message) ->
34
log("appending new message")
35
@setState
36
messages: @state.messages.concat([message])
37
log("now state=",@state)
38
39
clearMessages: ->
40
log("clearing messages")
41
@setState
42
messages: []
43
44
class AppFlux extends Flux
45
constructor: () ->
46
log("AppFlux constructor")
47
super()
48
49
flux = new AppFlux()
50
flux.createActions('messages', MessageActions)
51
flux.createStore('messages', MessageStore, flux)
52
53
# for debugging
54
flux.addListener 'dispatch', (payload) ->
55
log('Dispatch: ', payload)
56
57
# for debugging
58
window.flux = flux
59
window.React = React = require('react')
60
rtypes = React.PropTypes
61
62
class App extends React.Component
63
propTypes:
64
title : rtypes.string
65
66
message_list: ->
67
if @props.messages?
68
for m, i in @props.messages
69
<div key={i}>{m}</div>
70
71
render : ->
72
#log("App render with props=", @props)
73
<div>
74
<h1>{@props.title}</h1>
75
<form onSubmit={@submit_handler}>
76
<button type="submit">Send a new message</button>
77
{@message_list()}
78
</form>
79
<form onSubmit={@clear_handler}>
80
<button type="submit">Clear messages</button>
81
</form>
82
</div>
83
84
submit_handler : (event) ->
85
event.preventDefault()
86
log("new message button pushed")
87
# send a message action
88
flux.getActions('messages').createMessage("the button was pushed -- #{Math.random()}")
89
90
clear_handler: (event) ->
91
event.preventDefault()
92
log("clear button pushed")
93
flux.getActions('messages').clearMessages()
94
95
96
FluxComponent = require('flummox/component')
97
window.FluxComponent = FluxComponent
98
log("FluxComponent=", FluxComponent)
99
100
page = () ->
101
<FluxComponent flux={flux} connectToStores={['messages']}>
102
<App title="Demo"/>
103
</FluxComponent>
104
105
log("render")
106
React.render page(), document.getElementById('app')
107
108