88 tea "github.com/charmbracelet/bubbletea"
99 "github.com/charmbracelet/lipgloss"
1010 "github.com/maniac-en/req/internal/tui/keybinds"
11+ "github.com/maniac-en/req/internal/tui/messages"
1112)
1213
1314type focusedComp string
@@ -17,13 +18,15 @@ const (
1718 textComponent = "text"
1819)
1920
20- type OptionsProvider struct {
21+ type OptionsProvider [ T , U any ] struct {
2122 list list.Model
2223 input OptionsInput
2324 onSelectAction tea.Msg
2425 width int
2526 height int
2627 focused focusedComp
28+ getItems func (context.Context ) ([]T , error )
29+ itemMapper func ([]T ) []list.Item
2730}
2831
2932type Option struct {
@@ -37,11 +40,11 @@ func (o Option) Description() string { return o.Subtext }
3740func (o Option ) Value () int64 { return o .ID }
3841func (o Option ) FilterValue () string { return o .Name }
3942
40- func (o OptionsProvider ) Init () tea.Cmd {
43+ func (o OptionsProvider [ T , U ] ) Init () tea.Cmd {
4144 return nil
4245}
4346
44- func (o OptionsProvider ) Update (msg tea.Msg ) (OptionsProvider , tea.Cmd ) {
47+ func (o OptionsProvider [ T , U ] ) Update (msg tea.Msg ) (OptionsProvider [ T , U ] , tea.Cmd ) {
4548 var cmd tea.Cmd
4649 var cmds []tea.Cmd
4750 switch msg := msg .(type ) {
@@ -62,6 +65,15 @@ func (o OptionsProvider) Update(msg tea.Msg) (OptionsProvider, tea.Cmd) {
6265 }
6366 }
6467 }
68+ case messages.ItemAdded :
69+ o .input .OnBlur ()
70+ o .focused = listComponent
71+ o .list .SetSize (o .list .Width (), o .height )
72+ newItems , err := o .getItems (context .Background ())
73+ if err != nil {
74+
75+ }
76+ o .list .SetItems (o .itemMapper (newItems ))
6577
6678 }
6779 switch o .focused {
@@ -74,31 +86,31 @@ func (o OptionsProvider) Update(msg tea.Msg) (OptionsProvider, tea.Cmd) {
7486 return o , tea .Batch (cmds ... )
7587}
7688
77- func (o OptionsProvider ) View () string {
89+ func (o OptionsProvider [ T , U ] ) View () string {
7890 if o .focused == textComponent {
7991 return lipgloss .JoinVertical (lipgloss .Left , o .list .View (), o .input .View ())
8092 }
8193 return o .list .View ()
8294}
8395
84- func (o * OptionsProvider ) OnFocus () {
96+ func (o * OptionsProvider [ T , U ] ) OnFocus () {
8597}
8698
87- func (o OptionsProvider ) OnBlur () {
99+ func (o OptionsProvider [ T , U ] ) OnBlur () {
88100
89101}
90102
91- func (o OptionsProvider ) GetSelected () Option {
103+ func (o OptionsProvider [ T , U ] ) GetSelected () Option {
92104 return o .list .SelectedItem ().(Option )
93105}
94106
95- func (o OptionsProvider ) IsFiltering () bool {
107+ func (o OptionsProvider [ T , U ] ) IsFiltering () bool {
96108 return o .list .FilterState () == list .Filtering
97109}
98110
99111func initList [T , U any ](config * ListConfig [T , U ]) list.Model {
100112
101- rawItems , err := config .CrudOps . List (context .Background ())
113+ rawItems , err := config .GetItemsFunc (context .Background ())
102114
103115 if err != nil {
104116 rawItems = []T {}
@@ -120,11 +132,21 @@ func initList[T, U any](config *ListConfig[T, U]) list.Model {
120132 return list
121133}
122134
123- func NewOptionsProvider [T , U any ](config * ListConfig [T , U ]) OptionsProvider {
124- return OptionsProvider {
125- list : initList (config ),
126- focused : listComponent ,
127- input : NewOptionsInput (),
135+ func NewOptionsProvider [T , U any ](config * ListConfig [T , U ]) OptionsProvider [T , U ] {
136+
137+ inputConfig := InputConfig {
138+ CharLimit : 100 ,
139+ Placeholder : "Add A New Collection..." ,
140+ Width : 22 ,
141+ Prompt : "" ,
142+ }
143+
144+ return OptionsProvider [T , U ]{
145+ list : initList (config ),
146+ focused : listComponent ,
147+ input : NewOptionsInput (& inputConfig ),
148+ getItems : config .GetItemsFunc ,
149+ itemMapper : config .ItemMapper ,
128150 // onSelectAction: config.OnSelectAction,
129151 }
130152}
0 commit comments