Skip to content

Commit 785e454

Browse files
committed
fixing the navigation in the user dropdown
1 parent e8faa14 commit 785e454

File tree

7 files changed

+66
-12
lines changed

7 files changed

+66
-12
lines changed

resources/js/components/app-header.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
Sheet,
2828
SheetContent,
2929
SheetHeader,
30+
SheetTitle,
3031
SheetTrigger,
3132
} from "@/components/ui/sheet"
3233
import { type SharedData } from '@/types';
@@ -80,6 +81,7 @@ export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) {
8081
</Button>
8182
</SheetTrigger>
8283
<SheetContent side="left" className="bg-neutral-50 h-full flex flex-col items-stretch w-64">
84+
<SheetTitle className="sr-only">Navigation Menu</SheetTitle>
8385
<SheetHeader className="text-left flex justify-start">
8486
<AppLogoIcon className="h-6 w-6 fill-current text-black dark:text-white" />
8587
</SheetHeader>

resources/js/components/delete-user.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,12 @@ export default function DeleteUser() {
4949
<Button variant="destructive">Delete account</Button>
5050
</DialogTrigger>
5151
<DialogContent>
52+
<DialogTitle>Are you sure you want to delete your account?</DialogTitle>
53+
<DialogDescription>
54+
Once your account is deleted, all of its resources and data will also be permanently deleted. Please enter your
55+
password to confirm you would like to permanently delete your account.
56+
</DialogDescription>
5257
<form className="space-y-6" onSubmit={deleteUser}>
53-
<DialogHeader className="space-y-3">
54-
<DialogTitle>Are you sure you want to delete your account?</DialogTitle>
55-
<DialogDescription>
56-
Once your account is deleted, all of its resources and data will also be permanently deleted. Please enter your
57-
password to confirm you would like to permanently delete your account.
58-
</DialogDescription>
59-
</DialogHeader>
6058
<div className="grid gap-2">
6159
<Label htmlFor="password" className="sr-only">
6260
Password
@@ -70,6 +68,7 @@ export default function DeleteUser() {
7068
value={data.password}
7169
onChange={(e) => setData('password', e.target.value)}
7270
placeholder="Password"
71+
autoComplete="current-password"
7372
/>
7473

7574
<InputError message={errors.password} />

resources/js/components/nav-user.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@ import { UserMenuContent } from '@/components/user-menu-content';
1515
import { type SharedData } from '@/types';
1616
import { Link, usePage } from '@inertiajs/react';
1717
import { ChevronsUpDown, LogOut, Settings } from 'lucide-react';
18+
import { useIsMobile } from '@/hooks/use-mobile';
1819

1920
export function NavUser() {
2021
const { auth } = usePage<SharedData>().props;
2122
const { state } = useSidebar();
23+
const isMobile = useIsMobile();
2224

2325
return (
2426
<SidebarMenu>
@@ -33,7 +35,7 @@ export function NavUser() {
3335
<DropdownMenuContent
3436
className="w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg"
3537
align="end"
36-
side={state === 'collapsed' ? "left" : "bottom"}
38+
side={isMobile ? "bottom" : state === 'collapsed' ? "left" : "bottom"}
3739
>
3840
<UserMenuContent user={auth.user} />
3941
</DropdownMenuContent>

resources/js/components/ui/sidebar.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as React from 'react';
66
import { Button } from '@/components/ui/button';
77
import { Input } from '@/components/ui/input';
88
import { Separator } from '@/components/ui/separator';
9-
import { Sheet, SheetContent } from '@/components/ui/sheet';
9+
import { Sheet, SheetContent, SheetTitle } from '@/components/ui/sheet';
1010
import { Skeleton } from '@/components/ui/skeleton';
1111
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
1212
import { useIsMobile } from '@/hooks/use-mobile';
@@ -75,6 +75,18 @@ const SidebarProvider = React.forwardRef<
7575
return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);
7676
}, [isMobile, setOpen, setOpenMobile]);
7777

78+
// Listen for mobile navigation events
79+
React.useEffect(() => {
80+
const handleMobileNavigation = () => {
81+
if (isMobile) {
82+
setOpenMobile(false);
83+
}
84+
};
85+
86+
window.addEventListener('mobile-navigation', handleMobileNavigation);
87+
return () => window.removeEventListener('mobile-navigation', handleMobileNavigation);
88+
}, [isMobile, setOpenMobile]);
89+
7890
// Adds a keyboard shortcut to toggle the sidebar.
7991
React.useEffect(() => {
8092
const handleKeyDown = (event: KeyboardEvent) => {
@@ -160,6 +172,7 @@ const Sidebar = React.forwardRef<
160172
}
161173
side={side}
162174
>
175+
<SheetTitle className="sr-only">Sidebar Navigation</SheetTitle>
163176
<div className="flex h-full w-full flex-col">{children}</div>
164177
</SheetContent>
165178
</Sheet>

resources/js/components/user-menu-content.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@ import {
88
} from "@/components/ui/dropdown-menu"
99
import { Settings, LogOut } from 'lucide-react';
1010
import { type User } from '@/types';
11+
import { useMobileNavigation } from '@/hooks/use-mobile-navigation';
1112

1213
interface UserMenuContentProps {
1314
user: User;
1415
}
1516

1617
export function UserMenuContent({ user }: UserMenuContentProps) {
18+
const cleanup = useMobileNavigation();
19+
1720
return (
1821
<>
1922
<DropdownMenuLabel className="p-0 font-normal">
@@ -24,15 +27,27 @@ export function UserMenuContent({ user }: UserMenuContentProps) {
2427
<DropdownMenuSeparator />
2528
<DropdownMenuGroup>
2629
<DropdownMenuItem asChild>
27-
<Link className="block w-full" href={route('profile.edit')} as="button" prefetch>
30+
<Link
31+
className="block w-full"
32+
href={route('profile.edit')}
33+
as="button"
34+
prefetch
35+
onClick={cleanup}
36+
>
2837
<Settings className="mr-2" />
2938
Settings
3039
</Link>
3140
</DropdownMenuItem>
3241
</DropdownMenuGroup>
3342
<DropdownMenuSeparator />
3443
<DropdownMenuItem asChild>
35-
<Link className="block w-full" method="post" href={route('logout')} as="button">
44+
<Link
45+
className="block w-full"
46+
method="post"
47+
href={route('logout')}
48+
as="button"
49+
onClick={cleanup}
50+
>
3651
<LogOut className="mr-2" />
3752
Log out
3853
</Link>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { useCallback } from 'react';
2+
3+
export function useMobileNavigation() {
4+
const cleanup = useCallback(() => {
5+
// Remove pointer-events style from body
6+
document.body.style.removeProperty('pointer-events');
7+
// Find and click the close button of any open sheet
8+
const closeButton = document.querySelector('[data-radix-collection-item]');
9+
if (closeButton instanceof HTMLElement) {
10+
closeButton.click();
11+
}
12+
}, []);
13+
14+
return cleanup;
15+
}

resources/js/lib/utils.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1-
import { clsx, type ClassValue } from 'clsx';
1+
import { type ClassValue, clsx } from 'clsx';
22
import { twMerge } from 'tailwind-merge';
33

44
export function cn(...inputs: ClassValue[]) {
55
return twMerge(clsx(inputs));
66
}
7+
8+
export function cleanupMobileNavigation() {
9+
// Remove pointer-events style from body
10+
document.body.style.removeProperty('pointer-events');
11+
12+
// Dispatch a custom event that the sidebar can listen to
13+
window.dispatchEvent(new CustomEvent('mobile-navigation'));
14+
}

0 commit comments

Comments
 (0)