Skróty klawiszowe
View on GitHubSkróty klawiszowe
Każdy skrót klawiszowy w Orbicie — ?// po pomoc, ctrl+k, alt+p, scope'owane do strony p po "utwórz projekt" — przechodzi przez jeden system: ShortcutContext. Nie ma żadnego per-komponentowego listenera keydown nigdzie w aplikacji; jeden globalny listener rozstrzyga każde naciśnięcie klawisza względem zbudowanego w runtime rejestru, a modal pomocy (?) jest generowany w całości z tego samego rejestru — nie ma osobnej, ręcznie utrzymywanej listy skrótów do utrzymywania w zgodzie.
Przewodniki, w kolejności, w jakiej faktycznie będziesz ich potrzebować
- Zarejestruj skrót zakresu komponentu — przećwiczony przykład dodania skrótu, który ma sens tylko, gdy konkretna strona/komponent jest zamontowany, używając hooka
useShortcuts()w ten sam sposób, w jaki już robi top("Create project") wSidebar.tsx. - Zarejestruj skrót globalny — przećwiczony przykład dodania skrótu, który powinien istnieć wszędzie w aplikacji, zarejestrowanego bezpośrednio wewnątrz
ShortcutProviderw ten sam sposób, w jaki już sąctrl+k/alt+p/alt+b.
Architektura w jednym akapicie
ShortcutProvider (resources/js/context/ShortcutContext.tsx) trzyma jedną tablicę ShortcutDefinition (key, description, category, action, opcjonalny disabled) w stanie — nic nie jest zakodowane na sztywno w samym handlerze keydown. register()/registerBatch() dodają do tej tablicy i zwracają funkcję wyrejestrowania, mającą być wywołaną z czyszczenia useEffect (albo, częściej, przez hook useShortcuts(definitions), który robi to dokładnie za Ciebie — przekaż tablicę, dostań z powrotem context, a rejestracja/czyszczenie jest obsłużone przy montowaniu/odmontowaniu i za każdym razem, gdy zmienia się referencja tablicy). Pojedynczy window.addEventListener('keydown', ..., true) (faza capture, więc uruchamia się zanim zafokusowany input mógłby połknąć event) buduje string pressedKey z flag modyfikatorów eventu (prefiksy ctrl+/alt+/meta+/shift+) i osobno śledzi "combo" ostatnich naciśnięć klawiszy bez modyfikatora w oknie 500ms (dla wieloklawiszowych sekwencji jak g p, chociaż żadna aktualnie nie jest zarejestrowana — zobacz tabelę formatu klucza w przewodniku 1), a potem szuka ShortcutDefinition, którego key pasuje do którejkolwiek formy. Skróty są całkowicie ignorowane, gdy fokus ma <input>/<textarea>/element contenteditable, poza Escape. Modal pomocy (ShortcutHelpModal, otwierany przez zawsze zarejestrowany skrót ?//) odczytuje shortcuts z tego samego contextu i grupuje/wyszukuje cokolwiek jest aktualnie zarejestrowane — nie ma żadnej wiedzy o żadnym skrócie poza tym, co jest żywe w tablicy w momencie, gdy się renderuje.
