keys.go 2.8 KB

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