Skip to content

Commit

Permalink
Added support for shortcut keys to navigate across pages
Browse files Browse the repository at this point in the history
  • Loading branch information
FlorianLeChat committed Sep 30, 2023
1 parent 4ee147d commit 761bb82
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 6 deletions.
83 changes: 78 additions & 5 deletions app/components/user-menu.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
//
// Composant de navigation du profil utilisateur.
//

"use client";

import { useRouter } from "next/navigation";
import { useEffect, useCallback, useState } from "react";

import { Button } from "./ui/button";
import { DropdownMenu,
DropdownMenuItem,
Expand All @@ -14,10 +20,73 @@ import { Avatar, AvatarImage, AvatarFallback } from "./ui/avatar";

export default function UserMenu()
{
// Déclaration des constantes.
const router = useRouter();

// Déclaration des variables d'état.
const [ open, setOpen ] = useState( false );

// Capture et support des combinaisons de touches.
const handleShortcuts = useCallback(
( event: KeyboardEvent ) =>
{
// On vérifie que la touche ALT est pressée.
if ( event.altKey )
{
// On vérifie enfin la touche pressée.
event.preventDefault();

switch ( event.key )
{
case "m":
// Ouverture/fermeture du menu.
setOpen( ( state ) => !state );
break;

case "d":
// Accès au tableau de bord.
router.push( "/dashboard" );
break;

case "s":
// Accès aux paramètres.
router.push( "/settings" );
break;

case "l":
// Accès à la page d'authentification.
router.push( "/" );
break;

default:
break;
}
}
},
[ router ]
);

// Récupération des touches pressées.
useEffect( () =>
{
// On ajoute un écouteur d'événement pour chaque touche pressée
// au montage du composant.
window.addEventListener( "keydown", handleShortcuts );

// On précharge ensuite les trois routes concernées pour éviter
// un temps de chargement trop long.
router.prefetch( "/" );
router.prefetch( "/dashboard" );
router.prefetch( "/settings" );

// On supprime enfin l'écouteur d'événement au démontage du composant.
return () => window.removeEventListener( "keydown", handleShortcuts );
}, [ router, handleShortcuts ] );

// Affichage du rendu HTML du composant.
return (
<nav className="flex items-center space-x-4 sm:ml-auto">
<DropdownMenu>
<DropdownMenu open={open} onOpenChange={setOpen}>
{/* Bouton d'apparition */}
<DropdownMenuTrigger asChild>
<Button
Expand Down Expand Up @@ -54,13 +123,17 @@ export default function UserMenu()
{/* Options disponibles */}
<DropdownMenuGroup>
<DropdownMenuItem>
Profil
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
Tableau de bord
<DropdownMenuShortcut>
ALT/⌥ + D
</DropdownMenuShortcut>
</DropdownMenuItem>

<DropdownMenuItem>
Paramètres
<DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
<DropdownMenuShortcut>
ALT/⌥ + S
</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuGroup>

Expand All @@ -69,7 +142,7 @@ export default function UserMenu()
{/* Déconnexion du compte */}
<DropdownMenuItem>
Déconnexion
<DropdownMenuShortcut>⇧⌘Q</DropdownMenuShortcut>
<DropdownMenuShortcut>ALT/⌥ + L</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
Expand Down
2 changes: 1 addition & 1 deletion app/settings/components/navigation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export default function Navigation()
type="button"
variant="ghost"
data-cc="show-preferencesModal"
className="h-auto min-h-[2.5rem] justify-start"
className="h-auto min-h-[2.5rem] justify-start xl:h-12"
>
<Cookie className="mr-2" />

Expand Down

0 comments on commit 761bb82

Please sign in to comment.