1package handlers
2
3import (
4 "context"
5 "encoding/json"
6 "fmt"
7
8 "github.com/bnema/dumber/internal/application/port"
9 "github.com/bnema/dumber/internal/infrastructure/webkit"
10 "github.com/bnema/dumber/internal/logging"
11)
12
13// KeybindingsHandler handles keybinding-related messages.
14type KeybindingsHandler struct {
15 getUC port.KeybindingsGetter
16 setUC port.KeybindingSetter
17 resetUC port.KeybindingResetter
18 resetAllUC port.AllKeybindingsResetter
19}
20
21// NewKeybindingsHandler creates a new KeybindingsHandler.
22func NewKeybindingsHandler(
23 getUC port.KeybindingsGetter,
24 setUC port.KeybindingSetter,
25 resetUC port.KeybindingResetter,
26 resetAllUC port.AllKeybindingsResetter,
27) *KeybindingsHandler {
28 return &KeybindingsHandler{
29 getUC: getUC,
30 setUC: setUC,
31 resetUC: resetUC,
32 resetAllUC: resetAllUC,
33 }
34}
35
36// HandleGetKeybindings returns all keybindings grouped by mode.
37func (h *KeybindingsHandler) HandleGetKeybindings(ctx context.Context, _ webkit.WebViewID, _ json.RawMessage) (any, error) {
38 return h.getUC.Execute(ctx)
39}
40
41// HandleSetKeybinding updates a single keybinding.
42func (h *KeybindingsHandler) HandleSetKeybinding(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) {
43 log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger()
44 log.Debug().RawJSON("payload", payload).Msg("HandleSetKeybinding called")
45
46 var req port.SetKeybindingRequest
47 if err := json.Unmarshal(payload, &req); err != nil {
48 log.Error().Err(err).RawJSON("payload", payload).Msg("failed to unmarshal request")
49 return nil, fmt.Errorf("invalid request: %w", err)
50 }
51
52 resp, err := h.setUC.Execute(ctx, req)
53 if err != nil {
54 return nil, err
55 }
56
57 return map[string]any{
58 "status": "success",
59 "conflicts": resp.Conflicts,
60 }, nil
61}
62
63// HandleResetKeybinding resets a keybinding to default.
64func (h *KeybindingsHandler) HandleResetKeybinding(ctx context.Context, _ webkit.WebViewID, payload json.RawMessage) (any, error) {
65 log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger()
66
67 var req port.ResetKeybindingRequest
68 if err := json.Unmarshal(payload, &req); err != nil {
69 return nil, fmt.Errorf("invalid request: %w", err)
70 }
71
72 log.Info().Str("mode", req.Mode).Str("action", req.Action).Msg("resetting keybinding to default")
73
74 if err := h.resetUC.Execute(ctx, req); err != nil {
75 return nil, err
76 }
77
78 return map[string]any{"status": "success"}, nil
79}
80
81// HandleResetAllKeybindings resets all keybindings to defaults.
82func (h *KeybindingsHandler) HandleResetAllKeybindings(ctx context.Context, _ webkit.WebViewID, _ json.RawMessage) (any, error) {
83 log := logging.FromContext(ctx).With().Str("handler", "keybindings").Logger()
84 log.Info().Msg("resetting all keybindings to defaults")
85
86 if err := h.resetAllUC.Execute(ctx); err != nil {
87 return nil, err
88 }
89
90 return map[string]any{"status": "success"}, nil
91}
92
93// RegisterKeybindingsHandlers registers keybindings handlers with the router.
94func RegisterKeybindingsHandlers(ctx context.Context, router *webkit.MessageRouter, handler *KeybindingsHandler) error {
95 log := logging.FromContext(ctx).With().Str("component", "handlers").Logger()
96
97 // Get all keybindings
98 if err := router.RegisterHandlerWithCallbacks(
99 "get_keybindings",
100 "__dumber_keybindings_loaded",
101 "__dumber_keybindings_error",
102 "",
103 webkit.MessageHandlerFunc(handler.HandleGetKeybindings),
104 ); err != nil {
105 return err
106 }
107
108 // Set a single keybinding
109 if err := router.RegisterHandlerWithCallbacks(
110 "set_keybinding",
111 "__dumber_keybinding_set",
112 "__dumber_keybinding_set_error",
113 "",
114 webkit.MessageHandlerFunc(handler.HandleSetKeybinding),
115 ); err != nil {
116 return err
117 }
118
119 // Reset a single keybinding
120 if err := router.RegisterHandlerWithCallbacks(
121 "reset_keybinding",
122 "__dumber_keybinding_reset",
123 "__dumber_keybinding_reset_error",
124 "",
125 webkit.MessageHandlerFunc(handler.HandleResetKeybinding),
126 ); err != nil {
127 return err
128 }
129
130 // Reset all keybindings
131 if err := router.RegisterHandlerWithCallbacks(
132 "reset_all_keybindings",
133 "__dumber_keybindings_reset_all",
134 "__dumber_keybindings_reset_all_error",
135 "",
136 webkit.MessageHandlerFunc(handler.HandleResetAllKeybindings),
137 ); err != nil {
138 return err
139 }
140
141 log.Info().Msg("registered keybindings handlers")
142 return nil
143}