From 617a3e24622052d7bce6fc83f8faadb8a785703c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20H=C3=B6ck?= Date: Wed, 22 Jan 2025 11:34:17 +0100 Subject: [PATCH] feat: nav dropdown for active customer --- components/account/sign-in-form.tsx | 3 + components/account/user-dropdown.tsx | 31 ++++ components/layout/navbar/index.tsx | 6 +- lib/vendure/index.ts | 13 ++ lib/vendure/queries/active-customer.ts | 19 +++ lib/vendure/types.ts | 9 ++ package.json | 1 + pnpm-lock.yaml | 100 ++++++++++++ ui-components/ui/dropdown-menu.tsx | 201 +++++++++++++++++++++++++ 9 files changed, 381 insertions(+), 2 deletions(-) create mode 100644 components/account/user-dropdown.tsx create mode 100644 lib/vendure/queries/active-customer.ts create mode 100644 ui-components/ui/dropdown-menu.tsx diff --git a/components/account/sign-in-form.tsx b/components/account/sign-in-form.tsx index dd6cf64518..0b502d640c 100644 --- a/components/account/sign-in-form.tsx +++ b/components/account/sign-in-form.tsx @@ -16,6 +16,7 @@ import { LoaderButton } from '@/components/loader-button'; import { signIn, SignInState } from '@/components/account/actions'; import { useActionState, useEffect, useTransition } from 'react'; import { useToast } from '@/ui-components/hooks/use-toast'; +import {useRouter} from "next/navigation"; const formSchema = z.object({ username: z.string().min(3), @@ -26,6 +27,7 @@ type FormSchema = z.infer; export function SignInForm() { const { toast } = useToast(); + const router = useRouter() const form = useForm({ mode: 'all', resolver: zodResolver(formSchema) @@ -46,6 +48,7 @@ export function SignInForm() { title: 'Success', description: 'Welcome back!' }); + router.replace('/') } }, [state]); diff --git a/components/account/user-dropdown.tsx b/components/account/user-dropdown.tsx new file mode 100644 index 0000000000..5949db25a2 --- /dev/null +++ b/components/account/user-dropdown.tsx @@ -0,0 +1,31 @@ +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger +} from '@/ui-components/ui/dropdown-menu'; +import { UserIcon } from '@heroicons/react/24/outline'; +import { Active_CustomerFragment } from '@/lib/vendure/types'; + +export async function UserDropdown({ customer }: { customer: Active_CustomerFragment }) { + return ( + + +
+ + {customer.firstName} {customer.lastName} +
+
+ + My Account + Dashboard + Orders + Settings + + Sign out + +
+ ); +} diff --git a/components/layout/navbar/index.tsx b/components/layout/navbar/index.tsx index 31fdcfa695..a483834d9c 100644 --- a/components/layout/navbar/index.tsx +++ b/components/layout/navbar/index.tsx @@ -1,16 +1,18 @@ import CartModal from 'components/cart/modal'; import LogoSquare from 'components/logo-square'; -import { getMenu } from 'lib/vendure'; +import { getActiveCustomer, getMenu } from 'lib/vendure'; import Link from 'next/link'; import { Suspense } from 'react'; import MobileMenu from './mobile-menu'; import Search, { SearchSkeleton } from './search'; import OpenSignIn from '@/components/account/open-sign-in'; +import { UserDropdown } from '@/components/account/user-dropdown'; const { SITE_NAME } = process.env; export async function Navbar() { const menu = await getMenu(); + const activeCustomer = await getActiveCustomer(); return (