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}