package bubbles import ( tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) type ConfirmPrompt struct { Question string Style lipgloss.Style Payload interface{} value bool answered bool focused bool } func NewConfirmPrompt(question string, payload interface{}) ConfirmPrompt { return ConfirmPrompt{ Question: question, Style: lipgloss.NewStyle(), Payload: payload, focused: true, // focus by default } } type MsgConfirmPromptAnswered struct { Value bool Payload interface{} } func (b ConfirmPrompt) Update(msg tea.Msg) (ConfirmPrompt, tea.Cmd) { switch msg := msg.(type) { case tea.KeyMsg: if !b.focused || b.answered { return b, nil } switch msg.String() { case "y", "Y": b.value = true b.answered = true b.focused = false return b, func() tea.Msg { return MsgConfirmPromptAnswered{true, b.Payload} } case "n", "N", "esc": b.value = false b.answered = true b.focused = false return b, func() tea.Msg { return MsgConfirmPromptAnswered{false, b.Payload} } } } return b, nil } func (b ConfirmPrompt) View() string { return b.Style.Render(b.Question) + lipgloss.NewStyle().Faint(true).Render(" (y/n)") } func (b *ConfirmPrompt) Focus() { b.focused = true } func (b *ConfirmPrompt) Blur() { b.focused = false } func (b ConfirmPrompt) Focused() bool { return b.focused }