diff --git a/cmd/dynamo-browse/main.go b/cmd/dynamo-browse/main.go index dd06a8c..9035221 100644 --- a/cmd/dynamo-browse/main.go +++ b/cmd/dynamo-browse/main.go @@ -24,6 +24,7 @@ import ( "github.com/lmika/gopkgs/cli" "log" "os" + "time" ) func main() { @@ -135,9 +136,18 @@ func newTestModel(descr string) tea.Model { OnKeyPressed: func(k string) tea.Cmd { log.Println("got key press: " + k) if k == "enter" { - return tableselect.ShowTableSelect(func(n string) tea.Cmd { - return statusandprompt.SetStatus("New table = " + n) - }) + return tea.Batch( + tableselect.IndicateLoadingTables(), + tea.Sequentially( + func() tea.Msg { + <-time.After(2 * time.Second) + return nil + }, + tableselect.ShowTableSelect(func(n string) tea.Cmd { + return statusandprompt.SetStatus("New table = " + n) + }), + ), + ) } else if k == "k" { return modal.PopMode } diff --git a/internal/dynamo-browse/ui/teamodels/tableselect/events.go b/internal/dynamo-browse/ui/teamodels/tableselect/events.go index dade419..a51d187 100644 --- a/internal/dynamo-browse/ui/teamodels/tableselect/events.go +++ b/internal/dynamo-browse/ui/teamodels/tableselect/events.go @@ -2,6 +2,11 @@ package tableselect import tea "github.com/charmbracelet/bubbletea" +func IndicateLoadingTables() tea.Cmd { + return func() tea.Msg { + return indicateLoadingTablesMsg{} + } +} func ShowTableSelect(onSelected func(n string) tea.Cmd) tea.Cmd { return func() tea.Msg { return showTableSelectMsg{ @@ -10,6 +15,8 @@ func ShowTableSelect(onSelected func(n string) tea.Cmd) tea.Cmd { } } +type indicateLoadingTablesMsg struct{} + type showTableSelectMsg struct { onSelected func(n string) tea.Cmd } diff --git a/internal/dynamo-browse/ui/teamodels/tableselect/model.go b/internal/dynamo-browse/ui/teamodels/tableselect/model.go index 481ee41..331198e 100644 --- a/internal/dynamo-browse/ui/teamodels/tableselect/model.go +++ b/internal/dynamo-browse/ui/teamodels/tableselect/model.go @@ -3,54 +3,70 @@ package tableselect import ( tea "github.com/charmbracelet/bubbletea" "github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/layout" - "github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/modal" + "github.com/lmika/awstools/internal/dynamo-browse/ui/teamodels/utils" ) type Model struct { + submodel tea.Model pendingSelection *showTableSelectMsg - modal modal.Modal + listController listController + isLoading bool w, h int } func New(submodel tea.Model) Model { - return Model{modal: modal.New(submodel)} + return Model{submodel: submodel} } func (m Model) Init() tea.Cmd { - return m.modal.Init() + return m.submodel.Init() } func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + var cc utils.CmdCollector switch msg := msg.(type) { case showTableSelectMsg: + m.isLoading = false m.pendingSelection = &msg - m.modal.Push(newListController(m.w, m.h)) + m.listController = newListController(m.w, m.h) + return m, nil + case indicateLoadingTablesMsg: + m.isLoading = true return m, nil case tea.KeyMsg: - if m.modal.Len() > 0 { + if m.pendingSelection != nil { switch msg.String() { case "enter": - listController := m.modal.Pop().(listController) - var sel showTableSelectMsg sel, m.pendingSelection = *m.pendingSelection, nil - return m, sel.onSelected(listController.list.SelectedItem().(tableItem).name) + return m, sel.onSelected(m.listController.list.SelectedItem().(tableItem).name) + default: + m.listController = cc.Collect(m.listController.Update(msg)).(listController) + return m, cc.Cmd() } } } - newModal, cmd := m.modal.Update(msg) - m.modal = newModal.(modal.Modal) - return m, cmd + m.submodel = cc.Collect(m.submodel.Update(msg)) + return m, cc.Cmd() } func (m Model) View() string { - return m.modal.View() + if m.pendingSelection != nil { + return m.listController.View() + } else if m.isLoading { + return "Loading tables" + } + + return m.submodel.View() } func (m Model) Resize(w, h int) layout.ResizingModel { m.w, m.h = w, h - m.modal = layout.Resize(m.modal, w, h).(modal.Modal) + m.submodel = layout.Resize(m.submodel, w, h) + if m.pendingSelection != nil { + m.listController = m.listController.Resize(w, h).(listController) + } return m }