github.com/jgarto/itcv@v0.0.0-20180826224514-4eea09c1aa0d/examples/sites/globalstate/person_chooser.go (about) 1 package main 2 3 import ( 4 "myitcv.io/react" 5 "myitcv.io/react/components/imm" 6 "myitcv.io/react/examples/sites/globalstate/model" 7 "myitcv.io/react/examples/sites/globalstate/state" 8 "myitcv.io/sorter" 9 ) 10 11 //go:generate sortGen 12 13 type PersonState interface { 14 Get() *model.Person 15 Set(p *model.Person) 16 Subscribe(cb func()) *state.Sub 17 } 18 19 type PersonChooserDef struct { 20 react.ComponentDef 21 } 22 23 type PersonChooserProps struct { 24 PersonState 25 } 26 27 type PersonChooserState struct { 28 currPerson *model.Person 29 currPersonSub *state.Sub 30 } 31 32 func PersonChooser(props PersonChooserProps) *PersonChooserElem { 33 return buildPersonChooserElem(props) 34 } 35 36 func (p PersonChooserDef) ComponentWillMount() { 37 sub := p.Props().PersonState.Subscribe(p.personStateChanged) 38 st := p.State() 39 st.currPersonSub = sub 40 st.currPerson = p.Props().PersonState.Get() 41 p.SetState(st) 42 } 43 44 func (p PersonChooserDef) ComponentWillUnmount() { 45 p.State().currPersonSub.Clear() 46 } 47 48 func (p PersonChooserDef) Render() react.Element { 49 50 ppl := sortPeopleKeysByName(state.State.Root().People().Get()) 51 52 ps := []imm.Label{personLabel{nil}} 53 54 for _, v := range ppl.Range() { 55 ps = append(ps, personLabel{v}) 56 } 57 58 return imm.Select( 59 imm.SelectProps{ 60 Entry: personLabel{p.State().currPerson}, 61 Entries: imm.NewLabelEntries(ps...), 62 OnSelect: personSelected{p}, 63 }, 64 ) 65 } 66 67 func (p PersonChooserDef) personStateChanged() { 68 s := p.State() 69 s.currPerson = p.Props().PersonState.Get() 70 p.SetState(s) 71 } 72 73 func orderPeopleKeysByName(ppl *model.People, i, j int) sorter.Ordered { 74 lhs := ppl.Get(i) 75 rhs := ppl.Get(j) 76 77 return lhs.Name() < rhs.Name() 78 } 79 80 type personLabel struct{ *model.Person } 81 82 func (p personLabel) Label() string { 83 if p.Person == nil { 84 return "" 85 } 86 87 return p.Person.Name() 88 } 89 90 type personSelected struct{ PersonChooserDef } 91 92 func (p personSelected) OnSelect(l imm.Label) { 93 pl := l.(personLabel) 94 s := p.PersonChooserDef.State() 95 s.currPerson = pl.Person 96 p.PersonChooserDef.SetState(s) 97 98 p.PersonChooserDef.Props().Set(pl.Person) 99 }