Skip to content

Commit 5d9984b

Browse files
authored
Merge branch 'main' into bug/wallet-connector
2 parents 9eb4ca2 + ba4c400 commit 5d9984b

File tree

6 files changed

+326
-163
lines changed

6 files changed

+326
-163
lines changed

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

Lines changed: 102 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import useUser from "@/hooks/useUser";
99
import { useUserStore } from "@/lib/zustand/user";
1010
import useAppWallet from "@/hooks/useAppWallet";
1111
import { useWalletContext, WalletState } from "@/hooks/useWalletContext";
12-
1312
import SessionProvider from "@/components/SessionProvider";
1413
import { getServerSession } from "next-auth";
1514

16-
// import MenuWallets from "@/components/common/overall-layout/menus/wallets";
15+
import MenuWallets from "@/components/common/overall-layout/menus/wallets";
1716
import MenuWallet from "@/components/common/overall-layout/menus/multisig-wallet";
17+
import WalletSelector from "@/components/common/overall-layout/wallet-selector";
1818
import {
1919
WalletDataLoaderWrapper,
2020
DialogReportWrapper,
@@ -83,6 +83,7 @@ export default function RootLayout({
8383
const { user, isLoading } = useUser();
8484
const router = useRouter();
8585
const { appWallet } = useAppWallet();
86+
const { multisigWallet } = useMultisigWallet();
8687
const { generateNsec } = useNostrChat();
8788

8889
const userAddress = useUserStore((state) => state.userAddress);
@@ -195,6 +196,43 @@ export default function RootLayout({
195196
const walletPageNames = walletPageRoute ? walletPageRoute.split("/") : [];
196197
const pageIsPublic = publicRoutes.includes(router.pathname);
197198
const isLoggedIn = !!user;
199+
const isHomepage = router.pathname === "/";
200+
201+
// Keep track of the last visited wallet to show wallet menu even on other pages
202+
const [lastVisitedWalletId, setLastVisitedWalletId] = React.useState<string | null>(null);
203+
const [lastVisitedWalletName, setLastVisitedWalletName] = React.useState<string | null>(null);
204+
const [lastWalletStakingEnabled, setLastWalletStakingEnabled] = React.useState<boolean | null>(null);
205+
206+
React.useEffect(() => {
207+
const walletId = router.query.wallet as string | undefined;
208+
if (walletId && isWalletPath && appWallet && multisigWallet) {
209+
setLastVisitedWalletId(walletId);
210+
setLastVisitedWalletName(appWallet.name);
211+
// Check if staking is enabled for this wallet
212+
try {
213+
const stakingEnabled = multisigWallet.stakingEnabled();
214+
setLastWalletStakingEnabled(stakingEnabled);
215+
} catch (error) {
216+
// Don't update state on error - keep the last known value
217+
console.error("Error checking staking status:", error);
218+
}
219+
}
220+
}, [router.query.wallet, isWalletPath, appWallet, multisigWallet]);
221+
222+
const clearWalletContext = React.useCallback(() => {
223+
setLastVisitedWalletId(null);
224+
setLastVisitedWalletName(null);
225+
setLastWalletStakingEnabled(null);
226+
}, []);
227+
228+
// Clear wallet context when navigating to homepage
229+
React.useEffect(() => {
230+
if (isHomepage && lastVisitedWalletId) {
231+
clearWalletContext();
232+
}
233+
}, [isHomepage, lastVisitedWalletId, clearWalletContext]);
234+
235+
const showWalletMenu = isLoggedIn && (isWalletPath || !!lastVisitedWalletId);
198236

199237
return (
200238
<div className="flex h-screen w-screen flex-col overflow-hidden">
@@ -206,11 +244,21 @@ export default function RootLayout({
206244
data-header="main"
207245
>
208246
<div className="flex h-14 items-center gap-4 lg:h-16">
209-
{/* Mobile menu button - only in wallet context */}
210-
{isWalletPath && <MobileNavigation isWalletPath={isWalletPath} />}
247+
{/* Mobile menu button - hidden only on public homepage (not logged in) */}
248+
{(isLoggedIn || !isHomepage) && (
249+
<MobileNavigation
250+
showWalletMenu={showWalletMenu}
251+
isLoggedIn={isLoggedIn}
252+
walletId={router.query.wallet as string || lastVisitedWalletId || undefined}
253+
fallbackWalletName={lastVisitedWalletName}
254+
onClearWallet={clearWalletContext}
255+
stakingEnabled={lastWalletStakingEnabled ?? undefined}
256+
isWalletPath={isWalletPath}
257+
/>
258+
)}
211259

212260
{/* Logo - in fixed-width container matching sidebar width */}
213-
<div className={`flex items-center md:w-[260px] lg:w-[280px] ${isWalletPath ? 'flex-1 justify-center md:flex-none md:justify-start' : ''}`}>
261+
<div className={`flex items-center md:w-[260px] lg:w-[280px] ${(isLoggedIn || !isHomepage) ? 'flex-1 justify-center md:flex-none md:justify-start' : ''}`}>
214262
<Link
215263
href="/"
216264
className="flex items-center gap-2 rounded-md px-4 py-2 text-sm transition-all duration-200 hover:bg-gray-100/50 dark:hover:bg-white/5 md:px-4"
@@ -249,13 +297,57 @@ export default function RootLayout({
249297
</header>
250298

251299
{/* Content area with sidebar + main */}
252-
<div className={`flex flex-1 overflow-hidden ${isWalletPath ? '' : ''}`}>
253-
{/* Sidebar for larger screens - only in wallet context */}
254-
{isWalletPath && (
300+
<div className={`flex flex-1 overflow-hidden`}>
301+
{/* Sidebar for larger screens - hidden only on public homepage (not logged in) */}
302+
{(isLoggedIn || !isHomepage) && (
255303
<aside className="hidden w-[260px] border-r border-gray-300/50 bg-muted/40 dark:border-white/[0.03] md:block lg:w-[280px]">
256304
<div className="flex h-full max-h-screen flex-col">
257-
<nav className="flex-1 pt-2">
258-
<MenuWallet />
305+
<nav className="flex-1 pt-2 overflow-y-auto">
306+
<div className="flex flex-col">
307+
{/* 1. Home Link - only when NOT logged in */}
308+
{!isLoggedIn && (
309+
<div className="px-2 lg:px-4">
310+
<div className="space-y-1">
311+
<Link
312+
href="/"
313+
className={`flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm transition-all duration-200 hover:bg-gray-100/50 dark:hover:bg-white/5 ${
314+
router.pathname === "/"
315+
? "text-white"
316+
: "text-muted-foreground hover:text-foreground"
317+
}`}
318+
>
319+
<svg className="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
320+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6" />
321+
</svg>
322+
<span>Home</span>
323+
</Link>
324+
</div>
325+
</div>
326+
)}
327+
328+
{/* 2. Wallet Selector - only when logged in */}
329+
{isLoggedIn && (
330+
<WalletSelector
331+
fallbackWalletName={lastVisitedWalletName}
332+
onClearWallet={clearWalletContext}
333+
/>
334+
)}
335+
336+
{/* 3. Wallet Menu - shown when wallet is selected */}
337+
{showWalletMenu && (
338+
<div className="mt-4">
339+
<MenuWallet
340+
walletId={router.query.wallet as string || lastVisitedWalletId || undefined}
341+
stakingEnabled={isWalletPath ? undefined : (lastWalletStakingEnabled ?? undefined)}
342+
/>
343+
</div>
344+
)}
345+
346+
{/* 4. Resources Menu - always visible */}
347+
<div className="mt-4">
348+
<MenuWallets />
349+
</div>
350+
</div>
259351
</nav>
260352
<div className="mt-auto p-4" />
261353
</div>
Lines changed: 28 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,37 @@
1-
import { Banknote, Info, List, Landmark, UserRoundPen, ChartNoAxesColumnIncreasing, FileCode2, ArrowLeft, ChevronDown, ChevronUp, Wallet2, Plus } from "lucide-react";
1+
import { Banknote, Info, List, Landmark, UserRoundPen, ChartNoAxesColumnIncreasing, FileCode2 } from "lucide-react";
22
import { useRouter } from "next/router";
3-
import { useState, useEffect } from "react";
43
import MenuLink from "./menu-link";
54
import usePendingTransactions from "@/hooks/usePendingTransactions";
6-
import useUserWallets from "@/hooks/useUserWallets";
75
import { Badge } from "@/components/ui/badge";
86
import { ChatBubbleIcon } from "@radix-ui/react-icons";
97
import usePendingSignables from "@/hooks/usePendingSignables";
108
import useMultisigWallet from "@/hooks/useMultisigWallet";
11-
import useAppWallet from "@/hooks/useAppWallet";
12-
import WalletNavLink from "@/components/common/overall-layout/wallet-nav-link";
13-
import {
14-
DropdownMenu,
15-
DropdownMenuContent,
16-
DropdownMenuItem,
17-
DropdownMenuSeparator,
18-
DropdownMenuTrigger,
19-
} from "@/components/ui/dropdown-menu";
209

21-
export default function MenuWallet() {
10+
interface MenuWalletProps {
11+
walletId?: string;
12+
stakingEnabled?: boolean;
13+
}
14+
15+
export default function MenuWallet({ walletId, stakingEnabled }: MenuWalletProps) {
2216
const router = useRouter();
23-
const baseUrl = `/wallets/${router.query.wallet as string | undefined}/`;
24-
const { wallets } = useUserWallets();
25-
const { appWallet } = useAppWallet();
17+
const effectiveWalletId = walletId || (router.query.wallet as string | undefined);
18+
const baseUrl = `/wallets/${effectiveWalletId}/`;
2619
const { transactions } = usePendingTransactions();
2720
const { signables } = usePendingSignables();
2821
const { multisigWallet } = useMultisigWallet();
29-
const [open, setOpen] = useState(false);
30-
31-
// Close dropdown on route change
32-
useEffect(() => {
33-
const handleRouteChange = () => {
34-
setOpen(false);
35-
};
36-
router.events.on("routeChangeStart", handleRouteChange);
37-
return () => {
38-
router.events.off("routeChangeStart", handleRouteChange);
39-
};
40-
}, [router.events]);
4122

42-
if (!wallets) return;
23+
// Use fallback staking enabled if provided, otherwise check multisigWallet
24+
const showStaking = stakingEnabled !== undefined
25+
? stakingEnabled
26+
: (multisigWallet ? multisigWallet.stakingEnabled() : false);
4327

4428
return (
45-
<nav className="grid h-full items-start px-2 font-medium lg:px-4">
29+
<div className="grid items-start px-2 font-medium lg:px-4">
4630
<div className="grid items-start space-y-1">
47-
{/* Wallet Selector */}
48-
<div className="mt-1 mb-1">
49-
<DropdownMenu open={open} onOpenChange={setOpen}>
50-
<DropdownMenuTrigger asChild>
51-
<button type="button" className="flex w-full max-w-[244px] lg:max-w-[248px] items-center gap-3 rounded-md px-3 py-2 text-sm transition-all duration-200 bg-white dark:bg-zinc-900 border border-zinc-300/40 dark:border-white/10 text-muted-foreground hover:bg-zinc-100 dark:hover:bg-zinc-800 hover:text-foreground">
52-
<Wallet2 className="h-5 w-5 flex-shrink-0" />
53-
<span className="truncate">{appWallet?.name || "Select Wallet"}</span>
54-
{open ? (
55-
<ChevronUp className="h-5 w-5 flex-shrink-0 ml-auto" />
56-
) : (
57-
<ChevronDown className="h-5 w-5 flex-shrink-0 ml-auto" />
58-
)}
59-
</button>
60-
</DropdownMenuTrigger>
61-
<DropdownMenuContent align="start" className="w-[var(--radix-dropdown-menu-trigger-width)]">
62-
{wallets
63-
.filter((wallet) => !wallet.isArchived)
64-
.sort((a, b) => a.name.localeCompare(b.name))
65-
.map((wallet) => (
66-
<DropdownMenuItem asChild key={wallet.id}>
67-
<WalletNavLink wallet={wallet} />
68-
</DropdownMenuItem>
69-
))}
70-
<DropdownMenuSeparator />
71-
<DropdownMenuItem asChild>
72-
<button
73-
type="button"
74-
onClick={() => {
75-
setOpen(false);
76-
void router.push("/wallets/new-wallet-flow/save");
77-
}}
78-
className="flex w-full items-center gap-3 rounded-md px-3 py-2 text-sm text-muted-foreground transition-all duration-200 hover:bg-zinc-100 dark:hover:bg-zinc-800 hover:text-foreground cursor-pointer"
79-
>
80-
<Plus className="h-5 w-5 flex-shrink-0" />
81-
<span>New Wallet</span>
82-
</button>
83-
</DropdownMenuItem>
84-
</DropdownMenuContent>
85-
</DropdownMenu>
86-
</div>
87-
88-
{/* Menu Items */}
31+
{/* Wallet Items */}
8932
<div className="mt-1 pt-1 space-y-1">
9033
<div className="px-3 py-1 text-xs font-medium text-muted-foreground">
91-
Menu
34+
Wallet
9235
</div>
9336
<MenuLink
9437
href={`${baseUrl}`}
@@ -138,15 +81,17 @@ export default function MenuWallet() {
13881
</Badge>
13982
)}
14083
</MenuLink>
141-
{multisigWallet && multisigWallet.stakingEnabled() && <MenuLink
142-
href={`${baseUrl}staking`}
143-
className={
144-
router.pathname == "/wallets/[wallet]/staking" ? "text-white" : ""
145-
}
146-
>
147-
<ChartNoAxesColumnIncreasing className="h-5 w-5" />
148-
Staking
149-
</MenuLink>}
84+
{showStaking && (
85+
<MenuLink
86+
href={`${baseUrl}staking`}
87+
className={
88+
router.pathname == "/wallets/[wallet]/staking" ? "text-white" : ""
89+
}
90+
>
91+
<ChartNoAxesColumnIncreasing className="h-5 w-5" />
92+
Staking
93+
</MenuLink>
94+
)}
15095
<MenuLink
15196
href={`${baseUrl}assets`}
15297
className={
@@ -175,15 +120,7 @@ export default function MenuWallet() {
175120
Dapps
176121
</MenuLink>
177122
</div>
178-
179-
{/* Back to All Wallets */}
180-
<div className="mt-2 border-t border-gray-300/50 dark:border-white/[0.03] pt-1">
181-
<MenuLink href={`/`}>
182-
<ArrowLeft className="h-5 w-5" />
183-
All Wallets
184-
</MenuLink>
185-
</div>
186123
</div>
187-
</nav>
124+
</div>
188125
);
189126
}

0 commit comments

Comments
 (0)