Skip to content

Commit 7bf83ee

Browse files
authored
Merge pull request #108 from MeshJS/add-wallet-flow-and-glass-morphism
Add wallet flow and glass morphism
2 parents 17d0be3 + 8d87b4e commit 7bf83ee

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+5438
-287
lines changed

package-lock.json

Lines changed: 445 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/common/button.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export default function Button({
6262
: undefined
6363
}
6464
>
65-
{loading && <Loader className="h-4 w-4 animate-spin" />}
65+
{loading && <Loader className="h-4 w-4 animate-spin mr-2" />}
6666
{children}
6767
{hold &&
6868
holding &&

src/components/common/overall-layout/layout.tsx

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,18 @@ import { getServerSession } from "next-auth";
1515
import MenuWallets from "@/components/common/overall-layout/menus/wallets";
1616
import MenuWallet from "@/components/common/overall-layout/menus/multisig-wallet";
1717
import WalletDropDown from "@/components/common/overall-layout/wallet-drop-down";
18-
import UserDropDown from "@/components/common/overall-layout/user-drop-down";
19-
import DialogReport from "@/components/common/overall-layout/dialog-report";
20-
import WalletDataLoader from "@/components/common/overall-layout/wallet-data-loader";
18+
import {
19+
WalletDataLoaderWrapper,
20+
DialogReportWrapper,
21+
UserDropDownWrapper,
22+
} from "@/components/common/overall-layout/mobile-wrappers";
23+
import LogoutWrapper from "@/components/common/overall-layout/mobile-wrappers/logout-wrapper";
2124
import { PageHomepage } from "@/components/pages/homepage";
2225
import Logo from "@/components/common/overall-layout/logo";
2326
import ConnectWallet from "@/components/common/cardano-objects/connect-wallet";
2427
import Loading from "@/components/common/overall-layout/loading";
28+
import { MobileNavigation } from "@/components/ui/mobile-navigation";
29+
import { MobileActionsMenu } from "@/components/ui/mobile-actions-menu";
2530
import {
2631
Breadcrumb,
2732
BreadcrumbItem,
@@ -90,19 +95,19 @@ export default function RootLayout({
9095
const isLoggedIn = !!user;
9196

9297
return (
93-
<div className="grid h-screen w-full overflow-hidden md:grid-cols-[220px_1fr] lg:grid-cols-[280px_1fr]">
98+
<div className="grid h-screen w-screen overflow-hidden md:grid-cols-[240px_1fr] lg:grid-cols-[260px_1fr]">
9499
{isLoading && <Loading />}
95100

96101
{/* Sidebar for larger screens */}
97-
<aside className="hidden border-r bg-muted/40 md:block">
98-
<div className="flex h-full max-h-screen flex-col gap-2">
99-
<header className="flex h-14 items-center border-b px-4 lg:h-[60px] lg:px-6">
100-
<Link href="/" className="flex items-center gap-2 font-semibold">
102+
<aside className="hidden border-r border-gray-200/30 dark:border-white/[0.03] bg-muted/40 md:block">
103+
<div className="flex h-full max-h-screen flex-col">
104+
<header className="flex h-14 items-center border-b border-gray-200/30 dark:border-white/[0.03] px-4 lg:h-16 lg:px-6" id="logo-header" data-header="sidebar">
105+
<Link href="/" className="flex items-center gap-3">
101106
<Logo />
102-
<span>Multi-Sig Platform</span>
107+
<span className="font-medium text-sm md:text-base lg:text-lg tracking-[-0.01em] select-none">Multi-Sig Platform</span>
103108
</Link>
104109
</header>
105-
<nav className="flex-1">
110+
<nav className="flex-1 pt-2">
106111
<MenuWallets />
107112
{isWalletPath && <MenuWallet />}
108113
</nav>
@@ -112,11 +117,21 @@ export default function RootLayout({
112117

113118
{/* Main content area */}
114119
<div className="flex h-screen flex-col">
115-
<header className="pointer-events-auto relative z-10 border-b bg-muted/40 px-4 lg:px-6">
116-
<div className="flex h-14 items-center gap-4 lg:h-[60px]">
117-
{/* Wallet selection + breadcrumb row */}
120+
<header className="pointer-events-auto relative z-10 border-b border-gray-200/30 dark:border-white/[0.03] bg-muted/40 px-4 lg:px-6" data-header="main">
121+
<div className="flex h-14 items-center gap-4 lg:h-16">
122+
{/* Mobile menu button */}
123+
<MobileNavigation isWalletPath={isWalletPath} />
124+
125+
{/* Wallet selection on mobile - centered */}
126+
{isLoggedIn && (
127+
<div className="flex-1 flex justify-center md:hidden">
128+
<WalletDropDown />
129+
</div>
130+
)}
131+
132+
{/* Wallet selection + breadcrumb row on desktop */}
118133
{isLoggedIn && (
119-
<div className="border-t border-border">
134+
<div className="hidden md:block">
120135
<div className="mx-1 w-full py-2">
121136
<nav className="flex items-center">
122137
<WalletDropDown />
@@ -159,16 +174,27 @@ export default function RootLayout({
159174
<ConnectWallet />
160175
) : (
161176
<>
162-
<WalletDataLoader />
163-
<DialogReport />
164-
<UserDropDown />
177+
{/* Desktop buttons */}
178+
<div className="hidden md:flex items-center space-x-2">
179+
<WalletDataLoaderWrapper mode="button" />
180+
<DialogReportWrapper mode="button" />
181+
<UserDropDownWrapper mode="button" />
182+
</div>
183+
{/* Mobile actions menu */}
184+
<MobileActionsMenu>
185+
<WalletDataLoaderWrapper mode="menu-item" />
186+
<DialogReportWrapper mode="menu-item" />
187+
<UserDropDownWrapper mode="menu-item" />
188+
<div className="h-px bg-border -mx-2 my-1" />
189+
<LogoutWrapper mode="menu-item" />
190+
</MobileActionsMenu>
165191
</>
166192
)}
167193
</div>
168194
</div>
169195
</header>
170196

171-
<main className="relative flex flex-1 flex-col gap-4 overflow-y-auto p-4 md:p-8">
197+
<main className="relative flex flex-1 flex-col gap-4 overflow-y-auto overflow-x-hidden p-4 md:p-8">
172198
{pageIsPublic || userAddress ? children : <PageHomepage />}
173199
</main>
174200
</div>

src/components/common/overall-layout/logo.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export default function Logo() {
55
enableBackground="new 0 0 300 200"
66
viewBox="0 0 300 200"
77
xmlns="http://www.w3.org/2000/svg"
8-
fill="white"
8+
fill="currentColor"
99
>
1010
<path d="m289 127-45-60-45-60c-.9-1.3-2.4-2-4-2s-3.1.7-4 2l-37 49.3c-2 2.7-6 2.7-8 0l-37-49.3c-.9-1.3-2.4-2-4-2s-3.1.7-4 2l-45 60-45 60c-1.3 1.8-1.3 4.2 0 6l45 60c.9 1.3 2.4 2 4 2s3.1-.7 4-2l37-49.3c2-2.7 6-2.7 8 0l37 49.3c.9 1.3 2.4 2 4 2s3.1-.7 4-2l37-49.3c2-2.7 6-2.7 8 0l37 49.3c.9 1.3 2.4 2 4 2s3.1-.7 4-2l45-60c1.3-1.8 1.3-4.2 0-6zm-90-103.3 32.5 43.3c1.3 1.8 1.3 4.2 0 6l-32.5 43.3c-2 2.7-6 2.7-8 0l-32.5-43.3c-1.3-1.8-1.3-4.2 0-6l32.5-43.3c2-2.7 6-2.7 8 0zm-90 0 32.5 43.3c1.3 1.8 1.3 4.2 0 6l-32.5 43.3c-2 2.7-6 2.7-8 0l-32.5-43.3c-1.3-1.8-1.3-4.2 0-6l32.5-43.3c2-2.7 6-2.7 8 0zm-53 152.6-32.5-43.3c-1.3-1.8-1.3-4.2 0-6l32.5-43.3c2-2.7 6-2.7 8 0l32.5 43.3c1.3 1.8 1.3 4.2 0 6l-32.5 43.3c-2 2.7-6 2.7-8 0zm90 0-32.5-43.3c-1.3-1.8-1.3-4.2 0-6l32.5-43.3c2-2.7 6-2.7 8 0l32.5 43.3c1.3 1.8 1.3 4.2 0 6l-32.5 43.3c-2 2.7-6 2.7-8 0zm90 0-32.5-43.3c-1.3-1.8-1.3-4.2 0-6l32.5-43.3c2-2.7 6-2.7 8 0l32.5 43.3c1.3 1.8 1.3 4.2 0 6l-32.5 43.3c-2 2.7-6 2.7-8 0z" />
1111
</svg>

src/components/common/overall-layout/menus/menu-link.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default function MenuLink({
1212
return (
1313
<Link
1414
href={href}
15-
className={`flex items-center gap-3 rounded-lg px-3 py-2 text-muted-foreground transition-all hover:text-primary ${className && className}`}
15+
className={`flex items-center gap-3 rounded-md px-3 py-2 text-muted-foreground transition-all duration-200 hover:bg-gray-100/50 dark:hover:bg-white/5 hover:text-foreground ${className && className === "text-white" ? "!bg-gray-900 dark:!bg-white/10 !text-white dark:!text-white !font-medium" : className}`}
1616
>
1717
{children}
1818
</Link>

src/components/common/overall-layout/menus/wallets.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,38 @@ export default function MenuWallets() {
99
const baseUrl = `/wallets/${router.query.wallet as string | undefined}/`;
1010

1111
return (
12-
<nav className="grid items-start px-2 text-sm font-medium lg:px-4">
13-
<br />
12+
<nav className="grid items-start px-2 text-sm font-medium lg:px-4 space-y-1">
1413
<MenuLink
1514
href={`/`}
16-
className={router.pathname == "/" ? "text-white" : ""}
15+
className={
16+
router.pathname == "/" ||
17+
router.pathname.startsWith("/wallets") && !router.pathname.startsWith("/wallets/[wallet]")
18+
? "text-white"
19+
: ""
20+
}
1721
>
18-
<House className="h-6 w-6" />
22+
<House className="h-5 w-5" />
1923
<div className="flex items-center gap-2">Home</div>
2024
</MenuLink>
2125

2226
<MenuLink
2327
href={`/features`}
2428
className={router.pathname == "/features" ? "text-white" : ""}
2529
>
26-
<Sparkle className="h-6 w-6" />
30+
<Sparkle className="h-5 w-5" />
2731
<div className="flex items-center gap-2">Features</div>
2832
</MenuLink>
2933

3034
<MenuLink
3135
href={`/api-docs`}
3236
className={router.pathname == "/api-docs" ? "text-white" : ""}
3337
>
34-
<FolderCode className="h-6 w-6" />
38+
<FolderCode className="h-5 w-5" />
3539
<div className="flex items-center gap-2">API Docs</div>
3640
</MenuLink>
37-
<br />
3841

3942
{wallets && (
40-
<div className="my-1">
43+
<div className="mt-6 pt-4 border-t border-gray-200/30 dark:border-white/[0.03]">
4144
<MenuLink
4245
href={`${baseUrl}`}
4346
className={
@@ -62,7 +65,7 @@ export default function MenuWallets() {
6265
}
6366
className={router.pathname.includes("governance") ? "text-white" : ""}
6467
>
65-
<Landmark className="h-6 w-6" />
68+
<Landmark className="h-5 w-5" />
6669
Governance
6770
</MenuLink>
6871
</nav>
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
import axios from "axios";
2+
import { Button } from "@/components/ui/button";
3+
import {
4+
Dialog,
5+
DialogContent,
6+
DialogDescription,
7+
DialogFooter,
8+
DialogHeader,
9+
DialogTitle,
10+
DialogTrigger,
11+
} from "@/components/ui/dialog";
12+
import { Input } from "@/components/ui/input";
13+
import { Label } from "@/components/ui/label";
14+
import { MessageSquare } from "lucide-react";
15+
import { useState } from "react";
16+
import { Textarea } from "@/components/ui/textarea";
17+
import {
18+
Select,
19+
SelectContent,
20+
SelectGroup,
21+
SelectItem,
22+
SelectTrigger,
23+
SelectValue,
24+
} from "@/components/ui/select";
25+
import { useToast } from "@/hooks/use-toast";
26+
27+
interface DialogReportWrapperProps {
28+
mode: "button" | "menu-item";
29+
onAction?: () => void;
30+
}
31+
32+
export default function DialogReportWrapper({
33+
mode,
34+
onAction
35+
}: DialogReportWrapperProps) {
36+
const [title, setTitle] = useState("");
37+
const [body, setBody] = useState("");
38+
const [sent, setSent] = useState(false);
39+
const [type, setType] = useState<"bug" | "enhancement">("bug");
40+
const [open, setOpen] = useState(false);
41+
const { toast } = useToast();
42+
const [loading, setLoading] = useState<boolean>(false);
43+
44+
async function handleReport() {
45+
setLoading(true);
46+
await axios.post("/api/github/create-issue", { title, body, type });
47+
setSent(true);
48+
toast({
49+
title: "Ticket created",
50+
description: "Your report has been submitted.",
51+
duration: 5000,
52+
});
53+
setLoading(false);
54+
resetForm();
55+
setOpen(false);
56+
57+
// Call the optional callback after action completes
58+
if (onAction) {
59+
onAction();
60+
}
61+
}
62+
63+
function resetForm() {
64+
setSent(false);
65+
setTitle("");
66+
setBody("");
67+
setType("bug");
68+
}
69+
70+
function handleOpenChange(newOpen: boolean) {
71+
setOpen(newOpen);
72+
if (newOpen) {
73+
resetForm();
74+
}
75+
}
76+
77+
const dialogContent = (
78+
<DialogContent className="sm:max-w-[425px]">
79+
<DialogHeader>
80+
<DialogTitle>Create a ticket</DialogTitle>
81+
<DialogDescription>
82+
Submit a ticket to report a problem or feature request.
83+
</DialogDescription>
84+
</DialogHeader>
85+
86+
{sent ? (
87+
<p>Your report has been submitted.</p>
88+
) : (
89+
<>
90+
<div className="grid gap-4 py-4">
91+
<div className="grid w-full max-w-sm items-center gap-1.5">
92+
<Label>Title</Label>
93+
<Input
94+
placeholder="Title"
95+
value={title}
96+
onChange={(e) => setTitle(e.target.value)}
97+
/>
98+
</div>
99+
<div className="grid w-full gap-1.5">
100+
<Label>What do you want to report?</Label>
101+
<Textarea
102+
placeholder="I am having trouble with... something isn't working... improvements or additions..."
103+
rows={6}
104+
value={body}
105+
onChange={(e) => setBody(e.target.value)}
106+
/>
107+
</div>
108+
109+
<div className="grid w-full gap-1.5">
110+
<Label>Type</Label>
111+
<Select
112+
value={type}
113+
onValueChange={(value) =>
114+
setType(value as "bug" | "enhancement")
115+
}
116+
defaultValue={"atLeast"}
117+
>
118+
<SelectTrigger className="w-full">
119+
<SelectValue placeholder="Select report type" />
120+
</SelectTrigger>
121+
<SelectContent>
122+
<SelectGroup>
123+
<SelectItem value="bug">Bug</SelectItem>
124+
<SelectItem value="enhancement">Enhancement</SelectItem>
125+
</SelectGroup>
126+
</SelectContent>
127+
</Select>
128+
</div>
129+
</div>
130+
<DialogFooter>
131+
<Button
132+
className="px-3 py-2"
133+
onClick={() => handleReport()}
134+
disabled={loading}
135+
>
136+
Create Ticket
137+
</Button>
138+
</DialogFooter>
139+
</>
140+
)}
141+
</DialogContent>
142+
);
143+
144+
if (mode === "button") {
145+
return (
146+
<Dialog open={open} onOpenChange={handleOpenChange}>
147+
<DialogTrigger asChild>
148+
<Button variant="secondary" size="icon" className="rounded-full">
149+
<MessageSquare className="h-5 w-5" />
150+
<span className="sr-only">Report</span>
151+
</Button>
152+
</DialogTrigger>
153+
{dialogContent}
154+
</Dialog>
155+
);
156+
}
157+
158+
// Menu item mode
159+
return (
160+
<Dialog open={open} onOpenChange={handleOpenChange}>
161+
<DialogTrigger asChild>
162+
<div className="flex items-center gap-2 cursor-pointer">
163+
<MessageSquare className="h-4 w-4" />
164+
<span>Report Issue</span>
165+
</div>
166+
</DialogTrigger>
167+
{dialogContent}
168+
</Dialog>
169+
);
170+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export { default as WalletDataLoaderWrapper } from './wallet-data-loader-wrapper';
2+
export { default as DialogReportWrapper } from './dialog-report-wrapper';
3+
export { default as UserDropDownWrapper } from './user-dropdown-wrapper';

0 commit comments

Comments
 (0)