1+ import React , { PropTypes , Component } from 'react'
2+ import classnames from 'classnames'
3+ import { createObserver } from 'dop'
4+ import state from '../state'
5+ import { clearCompleted , changeFilter } from '../actions'
6+ import { SHOW_ALL , SHOW_COMPLETED , SHOW_ACTIVE } from '../constants'
7+
8+ const FILTER_TITLES = {
9+ [ SHOW_ALL ] : 'All' ,
10+ [ SHOW_ACTIVE ] : 'Active' ,
11+ [ SHOW_COMPLETED ] : 'Completed'
12+ }
13+
14+ export default class Footer extends Component {
15+
16+ componentWillMount ( ) {
17+ const observer = createObserver ( mutations => {
18+ this . forceUpdate ( )
19+ } )
20+ observer . observe ( state , 'itemsLeftCount' )
21+ observer . observe ( state , 'selectedFilter' )
22+ observer . observe ( state , 'completedCount' )
23+ }
24+
25+
26+ shouldComponentUpdate ( ) {
27+ return false
28+ }
29+
30+
31+ render ( ) {
32+ return < FooterTemplate
33+ activeCount = { state . itemsLeftCount }
34+ completedCount = { state . completedCount }
35+ selectedFilter = { state . selectedFilter }
36+ onChangeFilter = { changeFilter }
37+ onClearCompleted = { clearCompleted } />
38+ }
39+ }
40+
41+
42+
43+
44+
45+ function FooterTemplate ( { activeCount, completedCount, selectedFilter, onChangeFilter, onClearCompleted } ) {
46+
47+ const itemWord = activeCount === 1 ? 'item' : 'items'
48+
49+ return (
50+ < footer className = "footer" >
51+ < span className = "todo-count" >
52+ < strong > { activeCount || 'No' } </ strong > { itemWord } left
53+ </ span >
54+ < ul className = "filters" >
55+ { [ SHOW_ALL , SHOW_ACTIVE , SHOW_COMPLETED ] . map ( filter =>
56+ < li key = { filter } >
57+ < a className = { classnames ( { selected : filter === selectedFilter } ) }
58+ style = { { cursor : 'pointer' } }
59+ onClick = { ( ) => onChangeFilter ( filter ) } >
60+ { FILTER_TITLES [ filter ] }
61+ </ a >
62+ </ li >
63+ ) }
64+ </ ul >
65+ { completedCount === 0 ? null : < button
66+ className = "clear-completed"
67+ onClick = { onClearCompleted } >
68+ Clear completed
69+ </ button >
70+ }
71+ </ footer >
72+ )
73+ }
0 commit comments