Skip to content

Commit fc0f551

Browse files
committed
Mobile fixes / bug fixes
1 parent 63c5e79 commit fc0f551

11 files changed

Lines changed: 678 additions & 142 deletions

File tree

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
"@radix-ui/react-checkbox": "^1.1.2",
2424
"@radix-ui/react-collapsible": "^1.1.1",
2525
"@radix-ui/react-context-menu": "^2.2.2",
26-
"@radix-ui/react-dialog": "^1.1.2",
26+
"@radix-ui/react-dialog": "^1.1.4",
2727
"@radix-ui/react-dropdown-menu": "^2.1.2",
2828
"@radix-ui/react-hover-card": "^1.1.2",
2929
"@radix-ui/react-label": "^2.1.0",
3030
"@radix-ui/react-menubar": "^1.1.2",
31-
"@radix-ui/react-navigation-menu": "^1.2.1",
32-
"@radix-ui/react-popover": "^1.1.2",
31+
"@radix-ui/react-navigation-menu": "^1.2.3",
32+
"@radix-ui/react-popover": "^1.1.4",
3333
"@radix-ui/react-progress": "^1.1.0",
3434
"@radix-ui/react-radio-group": "^1.2.1",
3535
"@radix-ui/react-scroll-area": "^1.2.1",

src/app/(main)/layout.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ export default function RootLayout({
2020
children: React.ReactNode;
2121
}>) {
2222
return (
23-
<SidebarProvider>
24-
<ToastProvider />
23+
<>
2524
<ModalProvider />
26-
<AppSidebar />
27-
<main>{children}</main>
28-
</SidebarProvider>
25+
<SidebarProvider>
26+
<ToastProvider />
27+
<AppSidebar />
28+
<main>{children}</main>
29+
</SidebarProvider>
30+
</>
2931
);
3032
}

src/components/modals/password-modal.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
"use client";
22

33
import { usePasswordModal } from "@/hooks/use-password-modal";
4+
import { useUser } from "@clerk/nextjs";
45
import { zodResolver } from "@hookform/resolvers/zod";
56
import axios from "axios";
6-
import { useEffect, useState } from "react";
7+
import CryptoJS from "crypto-js";
8+
import { useState } from "react";
79
import { Controller, useForm } from "react-hook-form";
810
import { toast } from "react-hot-toast";
911
import * as z from "zod";
12+
import { Button } from "../ui/button";
1013
import {
1114
Form,
1215
FormControl,
13-
FormField,
1416
FormItem,
1517
FormLabel,
1618
FormMessage,
1719
} from "../ui/form";
1820
import { Input } from "../ui/input";
1921
import { Modal } from "../ui/modal";
20-
import { Button } from "../ui/button";
21-
import CryptoJS from "crypto-js";
22-
import { useUser } from "@clerk/nextjs";
22+
import {useRouter} from "next/navigation";
2323

2424
const formSchema = z.object({
2525
website: z.string().min(1, "Website is required"),
@@ -31,6 +31,7 @@ export const PasswordModal = () => {
3131
const passwordModal = usePasswordModal();
3232
const { user } = useUser();
3333
const [loading, setLoading] = useState(false);
34+
const router = useRouter();
3435

3536
const form = useForm<z.infer<typeof formSchema>>({
3637
resolver: zodResolver(formSchema),
@@ -78,14 +79,15 @@ export const PasswordModal = () => {
7879
password: encryptedPassword,
7980
});
8081

81-
window.location.reload();
82+
router.refresh()
8283

8384
toast.success("Password created successfully.");
8485
} catch (error) {
8586
toast.error("Something went wrong.");
8687
} finally {
8788
setLoading(false);
8889
form.reset();
90+
passwordModal.onClose();
8991
}
9092
};
9193

src/components/ui/app-sidebar.tsx

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
Asterisk,
55
CreditCard,
66
KeySquare,
7+
LayoutGrid,
78
Notebook,
89
Settings,
910
} from "lucide-react";
@@ -18,10 +19,15 @@ import {
1819
SidebarMenuButton,
1920
SidebarMenuItem,
2021
} from "@/components/ui/sidebar";
21-
import {useSidebar} from "@/hooks/use-sidebar-tab";
22-
import {UserButton,useUser} from "@clerk/nextjs";
23-
import {Icons} from "./icons";
24-
import {Separator} from "./separator";
22+
import { useSidebar } from "@/hooks/use-sidebar-tab";
23+
import { UserButton, useUser } from "@clerk/nextjs";
24+
import { Icons } from "./icons";
25+
import { Separator } from "./separator";
26+
import { Button } from "./button";
27+
import { Popover, PopoverTrigger } from "./popover";
28+
import { PopoverContent } from "@radix-ui/react-popover";
29+
import {Label} from "./label";
30+
import {Input} from "./input";
2531

2632
const items = [
2733
{
@@ -54,14 +60,43 @@ export function AppSidebar() {
5460
<Sidebar className="flex flex-col justify-between min-h-screen bg-gray-800 text-white">
5561
<SidebarContent>
5662
<SidebarGroup>
57-
<SidebarGroupLabel className="mb-10 flex items-center justify-between p-4">
58-
<UserButton />
59-
<span>{user?.username}</span>
63+
<SidebarGroupLabel className="mb-10 flex items-center justify-between p-4 mt-4">
64+
<div className="flex items-center space-x-5">
65+
<UserButton />
66+
<span className="text-muted-foreground text-xl">
67+
{user?.username}
68+
</span>
69+
</div>
6070
<div className="flex items-center space-x-3">
6171
<Separator orientation="vertical" className="bg-gray-600 h-8" />
62-
<Icons.logo className="h-6 w-6 text-primary" />
72+
73+
<Popover>
74+
<PopoverTrigger asChild>
75+
<Button size="icon" variant="ghost">
76+
<LayoutGrid className="h-6 w-6" />
77+
</Button>
78+
</PopoverTrigger>
79+
80+
<PopoverContent className="w-80 z-[100] p-5 rounded-md shadow-xl bg-white">
81+
<div className="grid gap-4">
82+
<div className="space-y-2">
83+
<h4 className="font-medium leading-none">Apps</h4>
84+
<p className="text-sm text-muted-foreground">
85+
Explore our other applications!
86+
</p>
87+
</div>
88+
<div className="grid gap-2">
89+
<div className="grid grid-cols-3 items-center gap-4">
90+
<a href="https://www.lockscript.dev" className="text-primary font-bold hover:underline">LockScript</a>
91+
<a href="https://www.lockscript.dev" className="text-primary font-bold hover:underline">Spectra</a>
92+
</div>
93+
</div>
94+
</div>
95+
</PopoverContent>
96+
</Popover>
6397
</div>
6498
</SidebarGroupLabel>
99+
65100
<SidebarGroupContent>
66101
<SidebarMenu className="space-y-2">
67102
{items.map((item) => (
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import * as React from "react"
2+
import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu"
3+
import { cva } from "class-variance-authority"
4+
import { ChevronDown } from "lucide-react"
5+
6+
import { cn } from "@/lib/utils"
7+
8+
const NavigationMenu = React.forwardRef<
9+
React.ElementRef<typeof NavigationMenuPrimitive.Root>,
10+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>
11+
>(({ className, children, ...props }, ref) => (
12+
<NavigationMenuPrimitive.Root
13+
ref={ref}
14+
className={cn(
15+
"relative z-10 flex max-w-max flex-1 items-center justify-center",
16+
className
17+
)}
18+
{...props}
19+
>
20+
{children}
21+
<NavigationMenuViewport />
22+
</NavigationMenuPrimitive.Root>
23+
))
24+
NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName
25+
26+
const NavigationMenuList = React.forwardRef<
27+
React.ElementRef<typeof NavigationMenuPrimitive.List>,
28+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>
29+
>(({ className, ...props }, ref) => (
30+
<NavigationMenuPrimitive.List
31+
ref={ref}
32+
className={cn(
33+
"group flex flex-1 list-none items-center justify-center space-x-1",
34+
className
35+
)}
36+
{...props}
37+
/>
38+
))
39+
NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName
40+
41+
const NavigationMenuItem = NavigationMenuPrimitive.Item
42+
43+
const navigationMenuTriggerStyle = cva(
44+
"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"
45+
)
46+
47+
const NavigationMenuTrigger = React.forwardRef<
48+
React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,
49+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>
50+
>(({ className, children, ...props }, ref) => (
51+
<NavigationMenuPrimitive.Trigger
52+
ref={ref}
53+
className={cn(navigationMenuTriggerStyle(), "group", className)}
54+
{...props}
55+
>
56+
{children}{" "}
57+
<ChevronDown
58+
className="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180"
59+
aria-hidden="true"
60+
/>
61+
</NavigationMenuPrimitive.Trigger>
62+
))
63+
NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName
64+
65+
const NavigationMenuContent = React.forwardRef<
66+
React.ElementRef<typeof NavigationMenuPrimitive.Content>,
67+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>
68+
>(({ className, ...props }, ref) => (
69+
<NavigationMenuPrimitive.Content
70+
ref={ref}
71+
className={cn(
72+
"left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto ",
73+
className
74+
)}
75+
{...props}
76+
/>
77+
))
78+
NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName
79+
80+
const NavigationMenuLink = NavigationMenuPrimitive.Link
81+
82+
const NavigationMenuViewport = React.forwardRef<
83+
React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,
84+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>
85+
>(({ className, ...props }, ref) => (
86+
<div className={cn("absolute left-0 top-full flex justify-center")}>
87+
<NavigationMenuPrimitive.Viewport
88+
className={cn(
89+
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",
90+
className
91+
)}
92+
ref={ref}
93+
{...props}
94+
/>
95+
</div>
96+
))
97+
NavigationMenuViewport.displayName =
98+
NavigationMenuPrimitive.Viewport.displayName
99+
100+
const NavigationMenuIndicator = React.forwardRef<
101+
React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,
102+
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>
103+
>(({ className, ...props }, ref) => (
104+
<NavigationMenuPrimitive.Indicator
105+
ref={ref}
106+
className={cn(
107+
"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",
108+
className
109+
)}
110+
{...props}
111+
>
112+
<div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />
113+
</NavigationMenuPrimitive.Indicator>
114+
))
115+
NavigationMenuIndicator.displayName =
116+
NavigationMenuPrimitive.Indicator.displayName
117+
118+
export {
119+
navigationMenuTriggerStyle,
120+
NavigationMenu,
121+
NavigationMenuList,
122+
NavigationMenuItem,
123+
NavigationMenuContent,
124+
NavigationMenuTrigger,
125+
NavigationMenuLink,
126+
NavigationMenuIndicator,
127+
NavigationMenuViewport,
128+
}

src/components/ui/popover.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"use client"
2+
3+
import * as React from "react"
4+
import * as PopoverPrimitive from "@radix-ui/react-popover"
5+
6+
import { cn } from "@/lib/utils"
7+
8+
const Popover = PopoverPrimitive.Root
9+
10+
const PopoverTrigger = PopoverPrimitive.Trigger
11+
12+
const PopoverContent = React.forwardRef<
13+
React.ElementRef<typeof PopoverPrimitive.Content>,
14+
React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>
15+
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
16+
<PopoverPrimitive.Portal>
17+
<PopoverPrimitive.Content
18+
ref={ref}
19+
align={align}
20+
sideOffset={sideOffset}
21+
className={cn(
22+
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
23+
className
24+
)}
25+
{...props}
26+
/>
27+
</PopoverPrimitive.Portal>
28+
))
29+
PopoverContent.displayName = PopoverPrimitive.Content.displayName
30+
31+
export { Popover, PopoverTrigger, PopoverContent }

src/components/ui/vault/password-vault.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { ScrollArea } from "../scroll-area";
1212
import { Sheet, SheetContent } from "../sheet";
1313
import { DetailsPanel } from "./password/details-panel";
1414
import Image from "next/image";
15+
import {SidebarTrigger} from "../sidebar";
1516

1617
interface PasswordVaultProps {
1718
user: Prisma.UserGetPayload<{
@@ -106,8 +107,9 @@ const PasswordVault: React.FC<PasswordVaultProps> = ({ user }) => {
106107
`https://s2.googleusercontent.com/s2/favicons?domain=${domain}&sz=128`;
107108

108109
return (
109-
<div className="flex flex-col h-screen bg-background text-foreground">
110+
<div className="flex flex-col h-screen bg-background text-foreground w-screen md:w-full">
110111
<header className="flex items-center justify-between p-4 border-b md:hidden">
112+
<SidebarTrigger />
111113
<div className="font-semibold">Password Manager</div>
112114
<Button variant="ghost" size="icon" onClick={passwordModal.onOpen}>
113115
<Plus className="h-6 w-6" />
@@ -181,11 +183,11 @@ const PasswordVault: React.FC<PasswordVaultProps> = ({ user }) => {
181183
onClose={() => setIsDetailsOpen(false)}
182184
encrypt={encrypt}
183185
setData={setSelectedVault}
186+
setDetailsOpen={setIsDetailsOpen}
184187
/>
185188
)}
186189
</aside>
187190

188-
{/* Details panel for mobile */}
189191
{isDetailsOpen && (
190192
<Sheet open={isDetailsOpen} onOpenChange={setIsDetailsOpen}>
191193
<SheetContent side="right" className="w-full p-0 md:hidden">
@@ -194,6 +196,7 @@ const PasswordVault: React.FC<PasswordVaultProps> = ({ user }) => {
194196
onClose={() => setIsDetailsOpen(false)}
195197
encrypt={encrypt}
196198
setData={setSelectedVault}
199+
setDetailsOpen={setIsDetailsOpen}
197200
/>
198201
</SheetContent>
199202
</Sheet>

0 commit comments

Comments
 (0)