From de11888584e141063bf4c0980b5eeaf62f5c4873 Mon Sep 17 00:00:00 2001 From: Danny Olson Date: Wed, 3 Apr 2024 14:49:07 -0700 Subject: [PATCH 1/2] Can go back to choose SDK page from show SDK instructions --- internal/quickstart/choose_sdk.go | 23 +++++++++---- internal/quickstart/container.go | 57 ++++++++++++++++++++++++------- internal/quickstart/messages.go | 20 ++++++----- 3 files changed, 72 insertions(+), 28 deletions(-) diff --git a/internal/quickstart/choose_sdk.go b/internal/quickstart/choose_sdk.go index 72f0d908..19cabb46 100644 --- a/internal/quickstart/choose_sdk.go +++ b/internal/quickstart/choose_sdk.go @@ -22,11 +22,12 @@ const ( ) type chooseSDKModel struct { - list list.Model - selectedSDK sdkDetail + list list.Model + selectedIndex int + selectedSDK sdkDetail } -func NewChooseSDKModel() tea.Model { +func NewChooseSDKModel(selectedIndex int) tea.Model { l := list.New(sdksToItems(), sdkDelegate{}, 30, 14) l.Title = "Select your SDK:\n\n" // extra newlines to show pagination // reset title styles @@ -36,14 +37,19 @@ func NewChooseSDKModel() tea.Model { l.SetShowStatusBar(false) l.SetFilteringEnabled(false) // TODO: try to get filtering working l.Paginator.PerPage = 5 + // disable these because we've overridden "left" to go back and leaving NextPage without + // PrevPage would be confusing + l.KeyMap.PrevPage.SetEnabled(false) + l.KeyMap.NextPage.SetEnabled(false) return chooseSDKModel{ - list: l, + list: l, + selectedIndex: selectedIndex, } } func (m chooseSDKModel) Init() tea.Cmd { - return nil + return sendSelectedSDKMsg(m.selectedIndex) } func (m chooseSDKModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { @@ -55,12 +61,14 @@ func (m chooseSDKModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { i, ok := m.list.SelectedItem().(sdkDetail) if ok { m.selectedSDK = i + m.selectedSDK.index = m.list.Index() + cmd = sendChoseSDKMsg(m.selectedSDK) } - - return m, sendChoseSDKMsg(i) default: m.list, cmd = m.list.Update(msg) } + case selectedSDKMsg: + m.list.Select(msg.index) } return m, cmd @@ -73,6 +81,7 @@ func (m chooseSDKModel) View() string { type sdkDetail struct { canonicalName string displayName string + index int kind string url string // custom URL if it differs from the other SDKs } diff --git a/internal/quickstart/container.go b/internal/quickstart/container.go index 8cc81ddb..8ef5419f 100644 --- a/internal/quickstart/container.go +++ b/internal/quickstart/container.go @@ -19,17 +19,16 @@ const ( // ContainerModel is a high level container model that controls the nested models wher each // represents a step in the quick-start flow. type ContainerModel struct { - err error - flagKey string - flagsClient flags.Client - quitMsg string // TODO: set this? - quitting bool - accessToken string baseUri string currentModel tea.Model currentStep int - sdkKind string + err error + flagKey string + flagsClient flags.Client + quitMsg string // TODO: set this? + quitting bool + sdk sdkDetail totalSteps int } @@ -55,32 +54,59 @@ func (m ContainerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case key.Matches(msg, keys.Quit): m.quitting = true cmd = tea.Quit + case key.Matches(msg, keys.Back): + // if showing SDK instructions, let the user go back to choose a different SDK + if m.currentStep == 2 { + m.currentStep -= 1 + m.currentModel = NewChooseSDKModel(m.sdk.index) + cmd = m.currentModel.Init() + } default: // delegate all other input to the current model m.currentModel, cmd = m.currentModel.Update(msg) } case choseSDKMsg: - m.currentModel = NewShowSDKInstructionsModel(m.accessToken, m.baseUri, msg.canonicalName, msg.url, m.flagKey) + m.currentModel = NewShowSDKInstructionsModel( + m.accessToken, + m.baseUri, + msg.sdk.canonicalName, + msg.sdk.url, + m.flagKey, + ) cmd = m.currentModel.Init() - m.sdkKind = msg.sdkKind + m.sdk = msg.sdk m.currentStep += 1 case createdFlagMsg: - m.currentModel = NewChooseSDKModel() + m.currentModel = NewChooseSDKModel(0) m.flagKey = msg.flagKey // TODO: figure out if we maintain state here or pass in another message m.currentStep += 1 case errMsg: m.err = msg.err case noInstructionsMsg: // skip the ShowSDKInstructionsModel and move along to toggling the flag - m.currentModel = NewToggleFlagModel(m.flagsClient, m.accessToken, m.baseUri, m.flagKey, m.sdkKind) + m.currentModel = NewToggleFlagModel( + m.flagsClient, + m.accessToken, + m.baseUri, + m.flagKey, + m.sdk.kind, + ) m.currentStep += 1 case fetchedSDKInstructions, fetchedEnv, toggledFlagMsg: m.currentModel, cmd = m.currentModel.Update(msg) case showToggleFlagMsg: - m.currentModel = NewToggleFlagModel(m.flagsClient, m.accessToken, m.baseUri, m.flagKey, m.sdkKind) + m.currentModel = NewToggleFlagModel( + m.flagsClient, + m.accessToken, + m.baseUri, + m.flagKey, + m.sdk.kind, + ) m.currentStep += 1 + case selectedSDKMsg: + m.currentModel, cmd = m.currentModel.Update(msg) default: - log.Println("container default - bad", msg) + log.Printf("container default: %T\n", msg) } return m, cmd @@ -113,12 +139,17 @@ func (m ContainerModel) View() string { } type keyMap struct { + Back key.Binding Enter key.Binding Quit key.Binding Tab key.Binding } var keys = keyMap{ + Back: key.NewBinding( + key.WithKeys("left"), + key.WithHelp("back", "go back"), + ), Enter: key.NewBinding( key.WithKeys("enter"), key.WithHelp("enter", "select"), diff --git a/internal/quickstart/messages.go b/internal/quickstart/messages.go index 68d0b5db..d44653c3 100644 --- a/internal/quickstart/messages.go +++ b/internal/quickstart/messages.go @@ -71,10 +71,7 @@ type fetchedSDKInstructions struct { } type choseSDKMsg struct { - canonicalName string - displayName string - sdkKind string - url string + sdk sdkDetail } func sendChoseSDKMsg(sdk sdkDetail) tea.Cmd { @@ -84,10 +81,7 @@ func sendChoseSDKMsg(sdk sdkDetail) tea.Cmd { } return choseSDKMsg{ - canonicalName: sdk.canonicalName, - displayName: sdk.displayName, - url: sdk.url, - sdkKind: sdk.kind, + sdk: sdk, } } } @@ -147,3 +141,13 @@ func sendFetchEnv(accessToken string, baseUri string, key string, projKey string // noInstructionsMsg is sent when we can't find the SDK instructions repository for the given SDK. type noInstructionsMsg struct{} + +type selectedSDKMsg struct { + index int +} + +func sendSelectedSDKMsg(index int) tea.Cmd { + return func() tea.Msg { + return selectedSDKMsg{index: index} + } +} From 3136db51bcccffadb9960e5a7c8dc1a638f99087 Mon Sep 17 00:00:00 2001 From: Danny Olson Date: Wed, 3 Apr 2024 15:38:08 -0700 Subject: [PATCH 2/2] Change back button to esc --- internal/quickstart/choose_sdk.go | 4 ---- internal/quickstart/container.go | 8 +++----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/internal/quickstart/choose_sdk.go b/internal/quickstart/choose_sdk.go index 19cabb46..69344f9b 100644 --- a/internal/quickstart/choose_sdk.go +++ b/internal/quickstart/choose_sdk.go @@ -37,10 +37,6 @@ func NewChooseSDKModel(selectedIndex int) tea.Model { l.SetShowStatusBar(false) l.SetFilteringEnabled(false) // TODO: try to get filtering working l.Paginator.PerPage = 5 - // disable these because we've overridden "left" to go back and leaving NextPage without - // PrevPage would be confusing - l.KeyMap.PrevPage.SetEnabled(false) - l.KeyMap.NextPage.SetEnabled(false) return chooseSDKModel{ list: l, diff --git a/internal/quickstart/container.go b/internal/quickstart/container.go index 8ef5419f..34945745 100644 --- a/internal/quickstart/container.go +++ b/internal/quickstart/container.go @@ -92,7 +92,7 @@ func (m ContainerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.sdk.kind, ) m.currentStep += 1 - case fetchedSDKInstructions, fetchedEnv, toggledFlagMsg: + case fetchedSDKInstructions, fetchedEnv, selectedSDKMsg, toggledFlagMsg: m.currentModel, cmd = m.currentModel.Update(msg) case showToggleFlagMsg: m.currentModel = NewToggleFlagModel( @@ -103,8 +103,6 @@ func (m ContainerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.sdk.kind, ) m.currentStep += 1 - case selectedSDKMsg: - m.currentModel, cmd = m.currentModel.Update(msg) default: log.Printf("container default: %T\n", msg) } @@ -147,8 +145,8 @@ type keyMap struct { var keys = keyMap{ Back: key.NewBinding( - key.WithKeys("left"), - key.WithHelp("back", "go back"), + key.WithKeys("esc"), + key.WithHelp("esc", "go back"), ), Enter: key.NewBinding( key.WithKeys("enter"),