Skip to content

Commit d5a25cd

Browse files
committed
Give us some elm-like loading of remote data
More: http://blog.jenkster.com/2016/06/how-elm-slays-a-ui-antipattern.html
1 parent 0d3baf2 commit d5a25cd

File tree

2 files changed

+197
-166
lines changed

2 files changed

+197
-166
lines changed

components/Meetup.js

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,28 @@ export default class Meetup extends React.Component {
99
state = {
1010
name: '',
1111
time: Date.now(),
12-
venue: {name: ''}
12+
venue: {name: ''},
13+
loading: false,
14+
error: false
1315
}
1416

1517
componentDidMount () {
18+
this.setState({
19+
loading: true,
20+
error: false
21+
})
1622
window.fetch(NEXT_MEETUP_URI)
23+
.then((res) => {
24+
// Gotta love network errors...
25+
if (!res.ok) throw Error(response.statusText)
26+
return response
27+
})
1728
.then((res) => res.json())
18-
.then((json) => this.setState(json))
29+
.then((json) => this.setState({
30+
...json,
31+
loading: false
32+
}))
33+
.catch(_ => this.setState({loading: false, error: true}))
1934
}
2035

2136
render () {
@@ -34,16 +49,33 @@ export default class Meetup extends React.Component {
3449
rsvpButton: {}
3550
}
3651

37-
return (
38-
<div className="next-event">
52+
const MeetupDescription = ({name, time, venue}) => (<div className="next-event">
3953
<div className="next-event-tagline">
4054
<strong>Next Event:</strong>
4155
<div className="event-name">
42-
{this.state.name}
56+
{name}
4357
</div>
44-
<span className="next-event-timestamp">{format(new Date(this.state.time), 'dddd, MMMM Do, YYYY')} at <strong>{ this.state.venue.name }</strong></span>
58+
{
59+
(time && venue && venue.name) &&
60+
(<span className="next-event-timestamp">{format(new Date(time), 'dddd, MMMM Do, YYYY')} at <strong>{ venue.name }</strong></span>)
61+
}
4562
</div>
46-
</div>
47-
)
63+
</div>)
64+
65+
if (this.state.loading)
66+
return (<MeetupDescription
67+
name={'Loading...'}
68+
/>)
69+
70+
if (this.state.error)
71+
return (<MeetupDescription
72+
name={(<a href='https://meetup.com/javascriptmn'>Check Meetup.com for updates</a>)}
73+
/>)
74+
75+
return (<MeetupDescription
76+
name={this.state.name}
77+
time={this.state.time}
78+
venue={this.state.venue}
79+
/>)
4880
}
4981
}

0 commit comments

Comments
 (0)