diff --git a/internal/analytics/client.go b/internal/analytics/client.go index 4c2d33e2..9b0265c9 100644 --- a/internal/analytics/client.go +++ b/internal/analytics/client.go @@ -30,6 +30,14 @@ type Tracker interface { optOut bool, step string, ) + SendSetupFlagToggledEvent( + accessToken, + baseURI string, + optOut, + on bool, + count int, + duration_ms int64, + ) } type Client struct { @@ -151,6 +159,27 @@ func (c *Client) SendSetupStepStartedEvent( ) } +func (c *Client) SendSetupFlagToggledEvent( + accessToken, + baseURI string, + optOut, + on bool, + count int, + duration_ms int64, +) { + c.sendEvent( + accessToken, + baseURI, + optOut, + "CLI Setup Flag Toggled", + map[string]interface{}{ + "on": on, + "count": count, + "duration_ms": duration_ms, + }, + ) +} + func (a *Client) Wait() { a.wg.Wait() } @@ -181,6 +210,16 @@ func (c *NoopClient) SendSetupStepStartedEvent( ) { } +func (c *NoopClient) SendSetupFlagToggledEvent( + accessToken, + baseURI string, + optOut, + on bool, + count int, + duration_ms int64, +) { +} + type MockTracker struct { mock.Mock ID string @@ -245,3 +284,24 @@ func (m *MockTracker) SendSetupStepStartedEvent( }, ) } + +func (m *MockTracker) SendSetupFlagToggledEvent( + accessToken, + baseURI string, + optOut, + on bool, + count int, + duration_ms int64, +) { + m.sendEvent( + accessToken, + baseURI, + optOut, + "CLI Setup Flag Toggled", + map[string]interface{}{ + "on": on, + "count": count, + "duration_ms": duration_ms, + }, + ) +} diff --git a/internal/quickstart/container.go b/internal/quickstart/container.go index 5f4b5729..9b95c4c2 100644 --- a/internal/quickstart/container.go +++ b/internal/quickstart/container.go @@ -3,6 +3,7 @@ package quickstart import ( "fmt" "log" + "time" "github.com/charmbracelet/bubbles/key" "github.com/charmbracelet/bubbles/spinner" @@ -53,9 +54,14 @@ type ContainerModel struct { err error flagKey string flagsClient flags.Client + flagStatus bool + flagToggled bool gettingStarted bool quitting bool sdk sdkDetail + startTime time.Time + toggleCount int + toggleTime time.Time totalSteps int width int } @@ -78,6 +84,7 @@ func NewContainerModel( environmentsClient: environmentsClient, flagsClient: flagsClient, gettingStarted: true, + startTime: time.Now(), totalSteps: 4, } } @@ -165,10 +172,19 @@ func (m ContainerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case fetchedFlagStatusMsg: m.currentModel, cmd = m.currentModel.Update(msg) m.err = nil - case fetchedSDKInstructionsMsg, selectedSDKMsg, toggledFlagMsg, spinner.TickMsg, createdFlagMsg: + case fetchedSDKInstructionsMsg, selectedSDKMsg, spinner.TickMsg, createdFlagMsg: m.gettingStarted = false m.currentModel, cmd = m.currentModel.Update(msg) m.err = nil + case toggledFlagMsg: + m.gettingStarted = false + m.currentModel, cmd = m.currentModel.Update(msg) + m.toggleCount++ + m.flagStatus = msg.on + m.toggleTime = msg.time + m.flagToggled = true + m.err = nil + sendEvent = true case showToggleFlagMsg: m.currentModel = NewToggleFlagModel( m.flagsClient, @@ -192,6 +208,18 @@ func (m ContainerModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.analyticsOptOut, m.currentStep.String(), )) + + if (m.currentStep == stepToggleFlag) && m.flagToggled { + cmd = tea.Batch(cmd, trackSetupFlagToggledEvent( + m.analyticsTracker, + m.accessToken, + m.baseUri, + m.analyticsOptOut, + m.flagStatus, + m.toggleCount, + m.toggleTime.Sub(m.startTime).Milliseconds(), + )) + } } return m, cmd diff --git a/internal/quickstart/messages.go b/internal/quickstart/messages.go index 9b8bf2fd..8d6a06dd 100644 --- a/internal/quickstart/messages.go +++ b/internal/quickstart/messages.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "time" tea "github.com/charmbracelet/bubbletea" @@ -26,7 +27,10 @@ func sendErrMsg(err error) tea.Cmd { } } -type toggledFlagMsg struct{} +type toggledFlagMsg struct { + time time.Time + on bool +} func toggleFlag(client flags.Client, accessToken, baseUri, flagKey string, enabled bool) tea.Cmd { return func() tea.Msg { @@ -42,7 +46,10 @@ func toggleFlag(client flags.Client, accessToken, baseUri, flagKey string, enabl return errMsg{err: err} } - return toggledFlagMsg{} + return toggledFlagMsg{ + time: time.Now(), + on: enabled, + } } } @@ -251,3 +258,11 @@ func trackSetupStepStartedEvent(tracker analytics.Tracker, accessToken, baseURI return eventTrackedMsg{} } } + +func trackSetupFlagToggledEvent(tracker analytics.Tracker, accessToken, baseURI string, optOut, on bool, count int, duration_ms int64) tea.Cmd { + return func() tea.Msg { + tracker.SendSetupFlagToggledEvent(accessToken, baseURI, optOut, on, count, duration_ms) + + return eventTrackedMsg{} + } +}