keys.go

  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}