(msg tea.Msg)
| 83 | } |
| 84 | |
| 85 | func (m keysTabModel) Update(msg tea.Msg) (keysTabModel, tea.Cmd) { |
| 86 | switch msg := msg.(type) { |
| 87 | case localeChangedMsg: |
| 88 | m.viewport.SetContent(m.renderContent()) |
| 89 | return m, nil |
| 90 | case keysDataMsg: |
| 91 | if msg.err != nil { |
| 92 | m.err = msg.err |
| 93 | } else { |
| 94 | m.err = nil |
| 95 | m.keys = msg.apiKeys |
| 96 | m.gemini = msg.gemini |
| 97 | m.claude = msg.claude |
| 98 | m.codex = msg.codex |
| 99 | m.vertex = msg.vertex |
| 100 | m.openai = msg.openai |
| 101 | if m.cursor >= len(m.keys) { |
| 102 | m.cursor = max(0, len(m.keys)-1) |
| 103 | } |
| 104 | } |
| 105 | m.viewport.SetContent(m.renderContent()) |
| 106 | return m, nil |
| 107 | |
| 108 | case keyActionMsg: |
| 109 | if msg.err != nil { |
| 110 | m.status = errorStyle.Render("✗ " + msg.err.Error()) |
| 111 | } else { |
| 112 | m.status = successStyle.Render("✓ " + msg.action) |
| 113 | } |
| 114 | m.confirm = -1 |
| 115 | m.viewport.SetContent(m.renderContent()) |
| 116 | return m, m.fetchKeys |
| 117 | |
| 118 | case tea.KeyMsg: |
| 119 | // ---- Editing / Adding mode ---- |
| 120 | if m.editing || m.adding { |
| 121 | switch msg.String() { |
| 122 | case "enter": |
| 123 | value := strings.TrimSpace(m.editInput.Value()) |
| 124 | if value == "" { |
| 125 | m.editing = false |
| 126 | m.adding = false |
| 127 | m.editInput.Blur() |
| 128 | m.viewport.SetContent(m.renderContent()) |
| 129 | return m, nil |
| 130 | } |
| 131 | isAdding := m.adding |
| 132 | editIdx := m.editIdx |
| 133 | m.editing = false |
| 134 | m.adding = false |
| 135 | m.editInput.Blur() |
| 136 | if isAdding { |
| 137 | return m, func() tea.Msg { |
| 138 | err := m.client.AddAPIKey(value) |
| 139 | if err != nil { |
| 140 | return keyActionMsg{err: err} |
| 141 | } |
| 142 | return keyActionMsg{action: T("key_added")} |
nothing calls this directly
no test coverage detected