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  }