1package models
2
3import (
4 "charm.land/bubbles/v2/key"
5)
6
7type KeyMap struct {
8 Select,
9 Next,
10 Previous,
11 Choose,
12 Tab,
13 Close key.Binding
14
15 isAPIKeyHelp bool
16 isAPIKeyValid bool
17
18 isHyperDeviceFlow bool
19 isCopilotDeviceFlow bool
20 isCopilotUnavailable bool
21}
22
23func DefaultKeyMap() KeyMap {
24 return KeyMap{
25 Select: key.NewBinding(
26 key.WithKeys("enter", "ctrl+y"),
27 key.WithHelp("enter", "choose"),
28 ),
29 Next: key.NewBinding(
30 key.WithKeys("down", "ctrl+n"),
31 key.WithHelp("↓", "next item"),
32 ),
33 Previous: key.NewBinding(
34 key.WithKeys("up", "ctrl+p"),
35 key.WithHelp("↑", "previous item"),
36 ),
37 Choose: key.NewBinding(
38 key.WithKeys("left", "right", "h", "l"),
39 key.WithHelp("←→", "choose"),
40 ),
41 Tab: key.NewBinding(
42 key.WithKeys("tab"),
43 key.WithHelp("tab", "toggle type"),
44 ),
45 Close: key.NewBinding(
46 key.WithKeys("esc", "alt+esc"),
47 key.WithHelp("esc", "exit"),
48 ),
49 }
50}
51
52// KeyBindings implements layout.KeyMapProvider
53func (k KeyMap) KeyBindings() []key.Binding {
54 return []key.Binding{
55 k.Select,
56 k.Next,
57 k.Previous,
58 k.Tab,
59 k.Close,
60 }
61}
62
63// FullHelp implements help.KeyMap.
64func (k KeyMap) FullHelp() [][]key.Binding {
65 m := [][]key.Binding{}
66 slice := k.KeyBindings()
67 for i := 0; i < len(slice); i += 4 {
68 end := min(i+4, len(slice))
69 m = append(m, slice[i:end])
70 }
71 return m
72}
73
74// ShortHelp implements help.KeyMap.
75func (k KeyMap) ShortHelp() []key.Binding {
76 if k.isHyperDeviceFlow || k.isCopilotDeviceFlow {
77 return []key.Binding{
78 key.NewBinding(
79 key.WithKeys("c"),
80 key.WithHelp("c", "copy code"),
81 ),
82 key.NewBinding(
83 key.WithKeys("enter"),
84 key.WithHelp("enter", "copy & open"),
85 ),
86 k.Close,
87 }
88 }
89 if k.isCopilotUnavailable {
90 return []key.Binding{
91 key.NewBinding(
92 key.WithKeys("enter"),
93 key.WithHelp("enter", "open signup"),
94 ),
95 k.Close,
96 }
97 }
98 if k.isAPIKeyHelp && !k.isAPIKeyValid {
99 return []key.Binding{
100 key.NewBinding(
101 key.WithKeys("enter"),
102 key.WithHelp("enter", "submit"),
103 ),
104 k.Close,
105 }
106 } else if k.isAPIKeyValid {
107 return []key.Binding{
108 k.Select,
109 }
110 }
111 return []key.Binding{
112 key.NewBinding(
113 key.WithKeys("down", "up"),
114 key.WithHelp("↑↓", "choose"),
115 ),
116 k.Tab,
117 k.Select,
118 k.Close,
119 }
120}