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