From 36563db77ee9e422ed00f90adb12c20afbcceeb5 Mon Sep 17 00:00:00 2001
From: Markus Thielker <mail.markus.thielker@gmail.com>
Date: Sat, 16 Mar 2024 21:35:13 +0100
Subject: [PATCH] N-FIN-34: add new navigation variant for mobile devices

---
 src/components/navigation.tsx         | 146 ++++++++++++++++++--------
 src/components/ui/navigation-menu.tsx |   5 +
 2 files changed, 108 insertions(+), 43 deletions(-)

diff --git a/src/components/navigation.tsx b/src/components/navigation.tsx
index c744453..f004745 100644
--- a/src/components/navigation.tsx
+++ b/src/components/navigation.tsx
@@ -2,65 +2,125 @@
 
 import {
     NavigationMenu,
+    navigationMenuIconTriggerStyle,
     NavigationMenuItem,
     NavigationMenuLink,
     NavigationMenuList,
     navigationMenuTriggerStyle,
 } from '@/components/ui/navigation-menu';
-import React from 'react';
+import React, { useState } from 'react';
 import Link from 'next/link';
-import { User } from 'lucide-react';
+import { Banknote, Home, Menu, Tag, User, UserSearch } from 'lucide-react';
+import { Drawer, DrawerContent, DrawerTrigger } from '@/components/ui/drawer';
+import { Button } from '@/components/ui/button';
 
 export default function Navigation() {
 
+    const [open, setOpen] = useState(false);
+
     return (
         <div className="flex sticky items-center border-b border-border bg-background">
-            <NavigationMenu>
-                <NavigationMenuList className="flex w-screen items-center justify-between sm:px-4 py-2">
-                    <div className="inline-flex space-x-2">
-
-                        <img src={'/logo_white.png'} alt="Finances" className="h-10 w-10 mx-3"/>
-
-                        <NavigationMenuItem>
-                            <Link href="/" legacyBehavior passHref>
-                                <NavigationMenuLink className={navigationMenuTriggerStyle()}>
-                                    Dashboard
-                                </NavigationMenuLink>
+            <div className="md:hidden">
+                <Drawer open={open} onOpenChange={open => setOpen(open)}>
+                    <DrawerTrigger asChild>
+                        <Button size="icon" variant="ghost" className="m-2">
+                            <Menu/>
+                        </Button>
+                    </DrawerTrigger>
+                    <DrawerContent>
+                        <div className="flex flex-col space-y-2 w-full rounded-none p-4">
+                            <Link
+                                href="/"
+                                className={navigationMenuIconTriggerStyle()}
+                                onClick={() => setOpen(false)}
+                                passHref>
+                                <Home/>
+                                <span>Dashboard</span>
                             </Link>
-                        </NavigationMenuItem>
-                        <NavigationMenuItem>
-                            <Link href="/payments" legacyBehavior passHref>
-                                <NavigationMenuLink className={navigationMenuTriggerStyle()}>
-                                    Payments
-                                </NavigationMenuLink>
+                            <Link
+                                href="/payments"
+                                className={navigationMenuIconTriggerStyle()}
+                                onClick={() => setOpen(false)}
+                                passHref>
+                                <Banknote/>
+                                <span>Payments</span>
                             </Link>
-                        </NavigationMenuItem>
-                        <NavigationMenuItem>
-                            <Link href="/entities" legacyBehavior passHref>
-                                <NavigationMenuLink className={navigationMenuTriggerStyle()}>
-                                    Entities
-                                </NavigationMenuLink>
+                            <Link
+                                href="/entities"
+                                className={navigationMenuIconTriggerStyle()}
+                                onClick={() => setOpen(false)}
+                                passHref>
+                                <UserSearch/>
+                                <span>Entities</span>
                             </Link>
-                        </NavigationMenuItem>
-                        <NavigationMenuItem>
-                            <Link href="/categories" legacyBehavior passHref>
-                                <NavigationMenuLink className={navigationMenuTriggerStyle()}>
-                                    Categories
-                                </NavigationMenuLink>
+                            <Link
+                                href="/categories"
+                                className={navigationMenuIconTriggerStyle()}
+                                onClick={() => setOpen(false)}
+                                passHref>
+                                <Tag/>
+                                <span>Categories</span>
                             </Link>
-                        </NavigationMenuItem>
-                    </div>
-
-                    <NavigationMenuItem>
-                        <Link href="/account" legacyBehavior passHref>
-                            <NavigationMenuLink className={navigationMenuTriggerStyle()}>
-                                <span className="sr-only">Account</span>
+                            <Link
+                                href="/account"
+                                className={navigationMenuIconTriggerStyle()}
+                                onClick={() => setOpen(false)}
+                                passHref>
                                 <User/>
-                            </NavigationMenuLink>
-                        </Link>
-                    </NavigationMenuItem>
-                </NavigationMenuList>
-            </NavigationMenu>
+                                <span>Account</span>
+                            </Link>
+                        </div>
+                    </DrawerContent>
+                </Drawer>
+            </div>
+            <div className="hidden md:flex">
+                <NavigationMenu>
+                    <NavigationMenuList className="flex w-screen items-center justify-between sm:px-4 py-2">
+                        <div className="inline-flex space-x-2">
+
+                            <img src={'/logo_white.png'} alt="Finances" className="h-10 w-10 mx-3"/>
+
+                            <NavigationMenuItem>
+                                <Link href="/" legacyBehavior passHref>
+                                    <NavigationMenuLink className={navigationMenuTriggerStyle()}>
+                                        Dashboard
+                                    </NavigationMenuLink>
+                                </Link>
+                            </NavigationMenuItem>
+                            <NavigationMenuItem>
+                                <Link href="/payments" legacyBehavior passHref>
+                                    <NavigationMenuLink className={navigationMenuTriggerStyle()}>
+                                        Payments
+                                    </NavigationMenuLink>
+                                </Link>
+                            </NavigationMenuItem>
+                            <NavigationMenuItem>
+                                <Link href="/entities" legacyBehavior passHref>
+                                    <NavigationMenuLink className={navigationMenuTriggerStyle()}>
+                                        Entities
+                                    </NavigationMenuLink>
+                                </Link>
+                            </NavigationMenuItem>
+                            <NavigationMenuItem>
+                                <Link href="/categories" legacyBehavior passHref>
+                                    <NavigationMenuLink className={navigationMenuTriggerStyle()}>
+                                        Categories
+                                    </NavigationMenuLink>
+                                </Link>
+                            </NavigationMenuItem>
+                        </div>
+
+                        <NavigationMenuItem>
+                            <Link href="/account" legacyBehavior passHref>
+                                <NavigationMenuLink className={navigationMenuTriggerStyle()}>
+                                    <span className="sr-only">Account</span>
+                                    <User/>
+                                </NavigationMenuLink>
+                            </Link>
+                        </NavigationMenuItem>
+                    </NavigationMenuList>
+                </NavigationMenu>
+            </div>
         </div>
     );
 }
diff --git a/src/components/ui/navigation-menu.tsx b/src/components/ui/navigation-menu.tsx
index 800788d..71f001a 100644
--- a/src/components/ui/navigation-menu.tsx
+++ b/src/components/ui/navigation-menu.tsx
@@ -44,6 +44,10 @@ const navigationMenuTriggerStyle = cva(
     'group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50',
 );
 
+const navigationMenuIconTriggerStyle = cva(
+    'group inline-flex h-10 w-full items-center justify-start rounded-md bg-background px-4 py-2 space-x-4 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50',
+);
+
 const NavigationMenuTrigger = React.forwardRef<
     React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,
     React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>
@@ -117,6 +121,7 @@ NavigationMenuIndicator.displayName =
 
 export {
     navigationMenuTriggerStyle,
+    navigationMenuIconTriggerStyle,
     NavigationMenu,
     NavigationMenuList,
     NavigationMenuItem,