00:00:00TanStack vient de sortir un nouveau paquet dans sa quête pour améliorer l'écosystème JavaScript,
00:00:03et cette fois, ils s'attaquent aux raccourcis clavier. Si vous pensez que c'est un sujet
00:00:07simple que l'IA pourrait coder pour vous, détrompez-vous. TanStack Hotkeys
00:00:11gère tous les cas particuliers que l'IA oublie souvent, comme les dispositions de touches multiples,
00:00:16les différents systèmes d'exploitation, les conflits de raccourcis ou de contextes, et bien plus encore.
00:00:20Il propose même des séquences de touches et l'enregistrement de raccourcis, tout en étant type-safe et agnostique.
00:00:26Croyez-moi, si vous avez besoin de raccourcis, utilisez ce paquet ou demandez à votre agent IA de le faire.
00:00:30C'est du TanStack, donc l'expérience développeur sera excellente. Plongeons maintenant
00:00:35dans le vif du sujet pour voir ça en action.
00:00:41Je vais commencer directement par le code car c'est assez simple. Ici,
00:00:45je travaille sur une application React, j'utilise donc le paquet TanStack React Hotkeys.
00:00:49Ils proposent aussi une version JavaScript pur, et d'autres frameworks
00:00:52arriveront bientôt. C'est actuellement en version alpha, il peut donc y avoir quelques
00:00:56bugs, mais pour mes besoins, c'est déjà parfait. Commençons par
00:01:01le cas d'utilisation le plus basique : le hook "useHotkey". Comme vous le voyez,
00:01:05on l'importe du paquet et il suffit de définir notre raccourci ainsi que
00:01:09la fonction à exécuter lors de l'appui. Dans mon exemple, j'ai configuré
00:01:13l'ouverture d'une palette de commandes, un cas très classique.
00:01:17J'ai ajouté une notification en bas pour que vous puissiez voir mes pressions de touches
00:01:20et le résultat obtenu. Ce hook est incroyablement simple, il fait
00:01:24exactement ce qu'on lui demande. Mais la magie de TanStack réside souvent dans
00:01:28l'expérience développeur et la sécurité du typage, et c'est le cas ici.
00:01:32D'abord, les raccourcis : partout où ils sont utilisés dans ce paquet,
00:01:37ils sont typés, ce qui est assez fou. Il connaît toutes les touches possibles
00:01:41ainsi que leurs combinaisons. Je pourrais changer cela en "meta+s",
00:01:46ce qui correspond à "Cmd+S" sur macOS, pour créer un raccourci de sauvegarde.
00:01:50Il reconnaît la validité de la combinaison, et si je fais une faute de frappe, l'erreur de type
00:01:54me signalera que le raccourci est invalide. Autre point intéressant sur la définition :
00:01:58actuellement, j'ai mis "meta+k", soit "Cmd+K" sur mon Mac,
00:02:02et cela fonctionne très bien. Cependant, ce raccourci ne fonctionnerait pas
00:02:06sur Windows ou d'autres plateformes puisque la touche "meta" n'y existe pas.
00:02:11À la place, nous pouvons utiliser la touche "modifier".
00:02:15Cela signifie qu'automatiquement sur macOS, ce sera "Cmd", alors que sur
00:02:19les autres plateformes, ce sera "Ctrl". Vous obtenez ainsi un raccourci multiplateforme.
00:02:24Enfin, toujours concernant la définition des touches dans ce paquet,
00:02:27si vous n'aimez pas le format chaîne de caractères, vous pouvez utiliser un objet.
00:02:31C'est exactement la même commande que précédemment ("Cmd+K" ou "Ctrl+K").
00:02:35Il suffit de préciser la touche principale et de mettre "modifier" à "true",
00:02:38ou d'autres touches modificatrices si besoin. Après la définition des touches,
00:02:42le deuxième argument du hook est la fonction qui s'exécute lors de l'appui.
00:02:46C'est très simple, vous y mettez ce que vous voulez.
00:02:50Sachez que vous avez aussi accès à l'événement clavier brut si nécessaire,
00:02:54ainsi qu'à un contexte. Dans ce cas, le contexte vous donne simplement
00:02:58le raccourci sous forme de chaîne, ou vous pouvez récupérer
00:03:02la définition sous forme d'objet. Pour finir avec "useHotkey",
00:03:05il y a plein d'autres fonctionnalités, notamment le troisième argument
00:03:09qui permet de passer des options pour contrôler le comportement du raccourci.
00:03:13La plupart sont explicites et je les ai laissées par défaut. Il y a "enabled"
00:03:17pour l'activer par programmation, ou "eventType" pour choisir
00:03:21entre "keydown" ou "keyup". L'option "requireReset" signifie que
00:03:25si elle est à "false", maintenir "Cmd+K" déclenchera
00:03:29le raccourci en boucle. Si je la passe à "true",
00:03:33il faut relâcher les touches avant de pouvoir le déclencher à nouveau.
00:03:37On peut voir que même en restant appuyé, ça ne s'est déclenché qu'une fois. Ensuite, "ignoreInputs" :
00:03:41si je suis dans un champ de saisie et que je fais "Cmd+K", pour l'instant,
00:03:45le raccourci est ignoré. On peut changer cela en le passant à "false"
00:03:49si l'on souhaite que les raccourcis fonctionnent même dans les champs de texte.
00:03:53Enfin, la dernière option que je vais aborder est "target".
00:03:57Elle permet de créer des raccourcis contextualisés. Par défaut, elle cible tout le document,
00:04:00donc "Cmd+K" fonctionne n'importe où sur la page pour ouvrir la palette.
00:04:04Mais je peux cibler un élément précis ou une référence React (ref).
00:04:09Si je choisis la référence de mon badge par exemple, faire "Cmd+K" sur la page
00:04:13ne fonctionnera plus. Par contre, si je mets le focus sur l'élément du badge,
00:04:17le raccourci s'active. On a donc un raccourci à portée limitée.
00:04:21Vous comprenez pourquoi j'aime ce paquet : le souci du détail est incroyable,
00:04:25l'expérience est top et le typage est complet. Et je n'ai montré
00:04:30qu'un seul hook ! Voyons les autres. Voici "useHotkeySequences"
00:04:34qui permet des séquences de touches, idéal pour une navigation de type Vim.
00:04:38Le fonctionnement est similaire : on définit la séquence de touches,
00:04:43la fonction à exécuter une fois la séquence saisie,
00:04:47et quelques options. Notez que "timeout" est le délai maximal
00:04:51entre chaque touche pour qu'elle soit comptabilisée dans la séquence.
00:04:54Ici, j'ai configuré "gg" pour remonter en haut de la liste.
00:04:59Si je tape "gg", ça fonctionne. J'en ai aussi fait un
00:05:04avec "sub" pour aller en bas. Coïncidence : ça épèle "subscribe" (abonnez-vous),
00:05:09ce que vous devriez d'ailleurs faire. Passons à des hooks encore plus simples.
00:05:12D'abord "useKeyHold" : indiquez la touche à surveiller,
00:05:16et vous obtenez un booléen indiquant si elle est pressée ou non.
00:05:20J'en surveille plusieurs ici. Si je maintiens "Shift" et "Alt",
00:05:24l'état sur la page change en fonction de ce booléen.
00:05:28Vous remarquerez aussi en bas la liste des touches actuellement pressées.
00:05:32Cela vient du deuxième hook, "useHeldKeys", qui renvoie simplement
00:05:36un tableau des touches enfoncées. Si je tape "sub", elles apparaissent
00:05:40dans le tableau. Le dernier hook avant de passer aux fonctions utilitaires
00:05:43est "useHotkeyRecorder". Il permet de créer des interfaces
00:05:47de personnalisation de raccourcis clavier. C'est une aide précieuse.
00:05:52C'est très simple à utiliser : on récupère des valeurs comme
00:05:56l'état de l'enregistrement, le raccourci enregistré, et les fonctions pour démarrer
00:06:00ou annuler l'enregistrement. Dans les options du hook,
00:06:05on peut définir ce qu'il se passe quand un raccourci est validé.
00:06:09Ici, je mets simplement à jour le raccourci de la palette avec celui choisi par l'utilisateur.
00:06:14En reliant cela à un bouton, on obtient une interface comme celle-ci. Actuellement, "Cmd+K"
00:06:17ouvre ma palette. Si je clique sur enregistrer, le hook écoute
00:06:21mon clavier. Si je fais "Cmd+Backspace", c'est mon nouveau raccourci
00:06:26pour ouvrir la palette. En situation réelle, vous le sauvegarderiez en base de données
00:06:29pour que ce soit persistant. C'est un helper super pratique et,
00:06:33comme les autres, il est facile à utiliser avec de bons réglages par défaut.
00:06:37Par exemple, si l'utilisateur enregistre sur Mac avec la touche "Cmd",
00:06:42elle sera automatiquement convertie en "modifier" pour devenir "Ctrl" sur Windows ou Linux.
00:06:46En plus des hooks, il y a d'autres choses à voir,
00:06:49notamment des fonctions pour aider au formatage.
00:06:53La fonction "formatForDisplay", importée de TanStack Hotkeys,
00:06:57permet de transformer un raccourci comme "modifier+backspace"
00:07:02pour l'adapter à la plateforme et utiliser des icônes. Ici, ça affiche "Cmd+⌫".
00:07:06Sur Windows, ce serait "Ctrl+Backspace". Il y a aussi "formatWithLabels"
00:07:10qui fait la même chose, mais en convertissant la touche
00:07:14en texte plutôt qu'en icône. On obtient donc "Command Backspace",
00:07:18ou "Control Backspace" sur Windows. Enfin, une des raisons pour lesquelles
00:07:22j'adore TanStack, ce sont les DevTools, et ce paquet n'y échappe pas.
00:07:27En ouvrant les DevTools, on voit tous les raccourcis enregistrés sur la page
00:07:30ainsi que les séquences. On peut voir leur état et combien de fois ils ont été déclenchés.
00:07:33On voit s'ils s'activent sur "keydown" ou "keyup", s'ils écoutent
00:07:37le document ou un élément spécifique. On peut même voir plus de détails,
00:07:41comme les options configurées, et même forcer un déclenchement manuel.
00:07:45En haut, on voit aussi les touches actuellement pressées.
00:07:49Si vous ne connaissez pas le nom d'une touche lors de la configuration,
00:07:52appuyez dessus ici et vous verrez sa valeur exacte. Je me répète peut-être,
00:07:56mais TanStack comprend vraiment l'expérience développeur,
00:08:00et je suis ravi d'avoir ça dans un monde de code par IA. Je vous recommande
00:08:05vivement de tester ce paquet si vous en avez besoin. Dites-moi ce que vous en pensez
00:08:08en commentaire, abonnez-vous, et à la prochaine !