keys.go

  1package models
  2
  3import (
  4	"charm.land/bubbles/v2/key"
  5)
  6
  7type KeyMap struct {
  8	Select,
  9	Next,
 10	Edit,
 11	Previous,
 12	Choose,
 13	Tab,
 14	Close key.Binding
 15
 16	isAPIKeyHelp  bool
 17	isAPIKeyValid bool
 18
 19	isClaudeAuthChoiseHelp    bool
 20	isClaudeOAuthHelp         bool
 21	isClaudeOAuthURLState     bool
 22	isClaudeOAuthHelpComplete bool
 23}
 24
 25func DefaultKeyMap() KeyMap {
 26	return KeyMap{
 27		Select: key.NewBinding(
 28			key.WithKeys("enter", "ctrl+y"),
 29			key.WithHelp("enter", "choose"),
 30		),
 31		Next: key.NewBinding(
 32			key.WithKeys("down", "ctrl+n"),
 33			key.WithHelp("↓", "next item"),
 34		),
 35		Edit: key.NewBinding(
 36			key.WithKeys("ctrl+e"),
 37			key.WithHelp("ctrl+e", "edit key"),
 38		),
 39		Previous: key.NewBinding(
 40			key.WithKeys("up", "ctrl+p"),
 41			key.WithHelp("↑", "previous item"),
 42		),
 43		Choose: key.NewBinding(
 44			key.WithKeys("left", "right", "h", "l"),
 45			key.WithHelp("←→", "choose"),
 46		),
 47		Tab: key.NewBinding(
 48			key.WithKeys("tab"),
 49			key.WithHelp("tab", "toggle type"),
 50		),
 51		Close: key.NewBinding(
 52			key.WithKeys("esc", "alt+esc"),
 53			key.WithHelp("esc", "exit"),
 54		),
 55	}
 56}
 57
 58// KeyBindings implements layout.KeyMapProvider
 59func (k KeyMap) KeyBindings() []key.Binding {
 60	return []key.Binding{
 61		k.Select,
 62		k.Next,
 63		k.Previous,
 64		k.Edit,
 65		k.Tab,
 66		k.Close,
 67	}
 68}
 69
 70// FullHelp implements help.KeyMap.
 71func (k KeyMap) FullHelp() [][]key.Binding {
 72	m := [][]key.Binding{}
 73	slice := k.KeyBindings()
 74	for i := 0; i < len(slice); i += 4 {
 75		end := min(i+4, len(slice))
 76		m = append(m, slice[i:end])
 77	}
 78	return m
 79}
 80
 81// ShortHelp implements help.KeyMap.
 82func (k KeyMap) ShortHelp() []key.Binding {
 83	if k.isClaudeAuthChoiseHelp {
 84		return []key.Binding{
 85			key.NewBinding(
 86				key.WithKeys("left", "right", "h", "l"),
 87				key.WithHelp("←→", "choose"),
 88			),
 89			key.NewBinding(
 90				key.WithKeys("enter"),
 91				key.WithHelp("enter", "accept"),
 92			),
 93			key.NewBinding(
 94				key.WithKeys("esc"),
 95				key.WithHelp("esc", "back"),
 96			),
 97		}
 98	}
 99	if k.isClaudeOAuthHelp {
100		if k.isClaudeOAuthHelpComplete {
101			return []key.Binding{
102				key.NewBinding(
103					key.WithKeys("enter"),
104					key.WithHelp("enter", "close"),
105				),
106			}
107		}
108
109		enterHelp := "submit"
110		if k.isClaudeOAuthURLState {
111			enterHelp = "open"
112		}
113
114		bindings := []key.Binding{
115			key.NewBinding(
116				key.WithKeys("enter"),
117				key.WithHelp("enter", enterHelp),
118			),
119		}
120
121		if k.isClaudeOAuthURLState {
122			bindings = append(bindings, key.NewBinding(
123				key.WithKeys("c"),
124				key.WithHelp("c", "copy url"),
125			))
126		}
127
128		bindings = append(bindings, key.NewBinding(
129			key.WithKeys("esc"),
130			key.WithHelp("esc", "back"),
131		))
132
133		return bindings
134	}
135	if k.isAPIKeyHelp && !k.isAPIKeyValid {
136		return []key.Binding{
137			key.NewBinding(
138				key.WithKeys("enter"),
139				key.WithHelp("enter", "submit"),
140			),
141			k.Close,
142		}
143	} else if k.isAPIKeyValid {
144		return []key.Binding{
145			k.Select,
146		}
147	}
148	return []key.Binding{
149		key.NewBinding(
150			key.WithKeys("down", "up"),
151			key.WithHelp("↑↓", "choose"),
152		),
153		k.Tab,
154		k.Edit,
155		k.Select,
156		k.Close,
157	}
158}