From c8467c29da8c10f1eedcbd3bf1805a368e092863 Mon Sep 17 00:00:00 2001 From: alex luu Date: Fri, 10 Apr 2026 11:39:06 -0400 Subject: [PATCH 1/6] fix: fix ui based off of feedback --- src/components/trade/header/user-menu.tsx | 9 +++++++++ src/hooks/use-referral.ts | 6 +++--- src/locales/ar/messages.po | 4 ++++ src/locales/en/messages.po | 4 ++++ src/locales/es/messages.po | 4 ++++ src/locales/fr/messages.po | 4 ++++ src/locales/hi/messages.po | 4 ++++ src/locales/zh/messages.po | 4 ++++ 8 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/components/trade/header/user-menu.tsx b/src/components/trade/header/user-menu.tsx index dd7e8b57..99278bf4 100644 --- a/src/components/trade/header/user-menu.tsx +++ b/src/components/trade/header/user-menu.tsx @@ -6,6 +6,7 @@ import { PlusCircleIcon, SignOutIcon, SpinnerGapIcon, + TrophyIcon, WalletIcon, } from "@phosphor-icons/react"; import { useLogin, useLogout, usePrivy } from "@privy-io/react-auth"; @@ -22,6 +23,7 @@ import { import { useCopyToClipboard } from "@/hooks/ui/use-copy-to-clipboard"; import { useAutoRegisterReferral } from "@/hooks/use-referral"; import { shortenAddress } from "@/lib/format"; +import { usePointsModalActions } from "@/stores/use-global-modal-store"; function CopyAddressMenuItem({ address }: { address: string }) { const { copied, copy } = useCopyToClipboard(); @@ -55,6 +57,7 @@ export function UserMenu() { const [mounted, setMounted] = useState(false); useAutoRegisterReferral(); + const { open: openPointsModal } = usePointsModalActions(); useEffect(() => { setMounted(true); @@ -104,6 +107,12 @@ export function UserMenu() { Add funds + + + + Referrals + + diff --git a/src/hooks/use-referral.ts b/src/hooks/use-referral.ts index 4930bcde..512c0eb0 100644 --- a/src/hooks/use-referral.ts +++ b/src/hooks/use-referral.ts @@ -33,12 +33,12 @@ export function useReferralCapture() { export function useAutoRegisterReferral() { const { address, isConnected } = useConnection(); - const { user } = usePrivy(); + const { user, authenticated } = usePrivy(); const registeredRef = useRef(false); useEffect(() => { async function autoRegister() { - if (!isConnected || !address || registeredRef.current) return; + if (!isConnected || !authenticated || !address || registeredRef.current) return; registeredRef.current = true; @@ -72,7 +72,7 @@ export function useAutoRegisterReferral() { } autoRegister(); - }, [isConnected, address, user?.id]); + }, [isConnected, authenticated, address, user?.id]); } export { getStoredReferral }; diff --git a/src/locales/ar/messages.po b/src/locales/ar/messages.po index 80d948cf..d47646af 100644 --- a/src/locales/ar/messages.po +++ b/src/locales/ar/messages.po @@ -1467,6 +1467,10 @@ msgstr "" msgid "Referral Code (optional)" msgstr "" +#: src/components/trade/header/user-menu.tsx +msgid "Referrals" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" diff --git a/src/locales/en/messages.po b/src/locales/en/messages.po index 09737820..fd7a0bd8 100644 --- a/src/locales/en/messages.po +++ b/src/locales/en/messages.po @@ -1476,6 +1476,10 @@ msgstr "Refer friends" msgid "Referral Code (optional)" msgstr "Referral Code (optional)" +#: src/components/trade/header/user-menu.tsx +msgid "Referrals" +msgstr "Referrals" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "Register Another" diff --git a/src/locales/es/messages.po b/src/locales/es/messages.po index b43e0be9..90885348 100644 --- a/src/locales/es/messages.po +++ b/src/locales/es/messages.po @@ -1467,6 +1467,10 @@ msgstr "" msgid "Referral Code (optional)" msgstr "" +#: src/components/trade/header/user-menu.tsx +msgid "Referrals" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" diff --git a/src/locales/fr/messages.po b/src/locales/fr/messages.po index 5c94e71f..d600be9e 100644 --- a/src/locales/fr/messages.po +++ b/src/locales/fr/messages.po @@ -1467,6 +1467,10 @@ msgstr "" msgid "Referral Code (optional)" msgstr "" +#: src/components/trade/header/user-menu.tsx +msgid "Referrals" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" diff --git a/src/locales/hi/messages.po b/src/locales/hi/messages.po index fed857b9..0196085c 100644 --- a/src/locales/hi/messages.po +++ b/src/locales/hi/messages.po @@ -1467,6 +1467,10 @@ msgstr "" msgid "Referral Code (optional)" msgstr "" +#: src/components/trade/header/user-menu.tsx +msgid "Referrals" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" diff --git a/src/locales/zh/messages.po b/src/locales/zh/messages.po index e45d55bb..f3b7280a 100644 --- a/src/locales/zh/messages.po +++ b/src/locales/zh/messages.po @@ -1467,6 +1467,10 @@ msgstr "" msgid "Referral Code (optional)" msgstr "" +#: src/components/trade/header/user-menu.tsx +msgid "Referrals" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" From 19628b462787bdb7637dd889404a3298743636da Mon Sep 17 00:00:00 2001 From: alex luu Date: Fri, 10 Apr 2026 11:52:47 -0400 Subject: [PATCH 2/6] fix: address feedback --- src/components/trade/header/user-menu.tsx | 5 ++--- src/hooks/use-referral.ts | 10 ++++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/components/trade/header/user-menu.tsx b/src/components/trade/header/user-menu.tsx index 99278bf4..22298f6a 100644 --- a/src/components/trade/header/user-menu.tsx +++ b/src/components/trade/header/user-menu.tsx @@ -52,7 +52,7 @@ export function UserMenu() { const { authenticated, ready } = usePrivy(); const { login } = useLogin(); const { logout } = useLogout(); - const { disconnect } = useDisconnect(); + const { mutate: disconnect } = useDisconnect(); const { data: ensName } = useEnsName({ address }); const [mounted, setMounted] = useState(false); @@ -66,9 +66,8 @@ export function UserMenu() { function handleLogout() { if (authenticated) { logout(); - } else { - disconnect(); } + disconnect(); } if (!mounted || !ready || isConnecting) { diff --git a/src/hooks/use-referral.ts b/src/hooks/use-referral.ts index 512c0eb0..e6d1035d 100644 --- a/src/hooks/use-referral.ts +++ b/src/hooks/use-referral.ts @@ -34,13 +34,15 @@ export function useReferralCapture() { export function useAutoRegisterReferral() { const { address, isConnected } = useConnection(); const { user, authenticated } = usePrivy(); - const registeredRef = useRef(false); + const registeredAddressRef = useRef(null); useEffect(() => { async function autoRegister() { - if (!isConnected || !authenticated || !address || registeredRef.current) return; + if (!isConnected || !authenticated || !address) return; + if (authenticated && !user?.id) return; + if (registeredAddressRef.current === address) return; - registeredRef.current = true; + registeredAddressRef.current = address; try { const res = await fetch(`${API_URL}/user_points?user_address=${address}`); @@ -67,7 +69,7 @@ export function useAutoRegisterReferral() { } } catch (error) { console.error("Auto-registration failed:", error); - registeredRef.current = false; + registeredAddressRef.current = null; } } From d16ccf596d807c92f0837d42f956c48c371aec93 Mon Sep 17 00:00:00 2001 From: alex luu Date: Fri, 10 Apr 2026 12:00:25 -0400 Subject: [PATCH 3/6] fix: address feedback --- src/components/trade/header/user-menu.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/trade/header/user-menu.tsx b/src/components/trade/header/user-menu.tsx index 22298f6a..6cb6d57a 100644 --- a/src/components/trade/header/user-menu.tsx +++ b/src/components/trade/header/user-menu.tsx @@ -63,9 +63,9 @@ export function UserMenu() { setMounted(true); }, []); - function handleLogout() { + async function handleLogout() { if (authenticated) { - logout(); + await logout(); } disconnect(); } From 81aaa4a0ae2416ddf14fdc4825b7c18f6e1bdddf Mon Sep 17 00:00:00 2001 From: alex luu Date: Sat, 11 Apr 2026 13:11:13 -0400 Subject: [PATCH 4/6] fix: open positions --- .../trade/mobile/mobile-positions-view.tsx | 4 ++-- src/components/trade/mobile/mobile-terminal.tsx | 6 +++++- src/components/trade/positions/orders-tab.tsx | 4 ++-- src/components/trade/positions/positions-panel.tsx | 5 ++++- src/components/trade/tradebox/trade-panel.tsx | 12 +++++++++++- src/lib/trade/use-button-content.ts | 8 ++++++-- src/locales/ar/messages.po | 4 ++++ src/locales/en/messages.po | 4 ++++ src/locales/es/messages.po | 4 ++++ src/locales/fr/messages.po | 4 ++++ src/locales/hi/messages.po | 4 ++++ src/locales/zh/messages.po | 4 ++++ 12 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/components/trade/mobile/mobile-positions-view.tsx b/src/components/trade/mobile/mobile-positions-view.tsx index d4dc68f2..03f1b362 100644 --- a/src/components/trade/mobile/mobile-positions-view.tsx +++ b/src/components/trade/mobile/mobile-positions-view.tsx @@ -4,7 +4,7 @@ import { useConnection } from "wagmi"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; -import { POSITIONS_TABS, UI_TEXT } from "@/config/constants"; +import { HL_ALL_DEXS, POSITIONS_TABS, UI_TEXT } from "@/config/constants"; import { useAccountBalances } from "@/hooks/trade/use-account-balances"; import { cn } from "@/lib/cn"; import { useSubOpenOrders } from "@/lib/hyperliquid/hooks/subscription"; @@ -32,7 +32,7 @@ export function MobilePositionsView({ className }: MobilePositionsViewProps) { const { perpPositions, isLoading: isLoadingState } = useAccountBalances(); const { data: ordersEvent, status: ordersStatus } = useSubOpenOrders( - { user: address ?? "0x0" }, + { user: address ?? "0x0", dex: HL_ALL_DEXS }, { enabled: isConnected && !!address }, ); const openOrders = ordersEvent?.orders; diff --git a/src/components/trade/mobile/mobile-terminal.tsx b/src/components/trade/mobile/mobile-terminal.tsx index 5667d991..17334ff9 100644 --- a/src/components/trade/mobile/mobile-terminal.tsx +++ b/src/components/trade/mobile/mobile-terminal.tsx @@ -1,5 +1,6 @@ import { useMemo, useState } from "react"; import { useConnection } from "wagmi"; +import { HL_ALL_DEXS } from "@/config/constants"; import { useAccountBalances } from "@/hooks/trade/use-account-balances"; import { cn } from "@/lib/cn"; import { useSubOpenOrders } from "@/lib/hyperliquid/hooks/subscription"; @@ -22,7 +23,10 @@ export function MobileTerminal({ className }: Props) { const { address, isConnected } = useConnection(); const { perpPositions } = useAccountBalances(); - const { data: ordersEvent } = useSubOpenOrders({ user: address ?? "0x0" }, { enabled: isConnected && !!address }); + const { data: ordersEvent } = useSubOpenOrders( + { user: address ?? "0x0", dex: HL_ALL_DEXS }, + { enabled: isConnected && !!address }, + ); const openOrders = ordersEvent?.orders; const positionsCount = useMemo(() => { diff --git a/src/components/trade/positions/orders-tab.tsx b/src/components/trade/positions/orders-tab.tsx index 06070fe8..222b69dc 100644 --- a/src/components/trade/positions/orders-tab.tsx +++ b/src/components/trade/positions/orders-tab.tsx @@ -6,7 +6,7 @@ import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; -import { FALLBACK_VALUE_PLACEHOLDER } from "@/config/constants"; +import { FALLBACK_VALUE_PLACEHOLDER, HL_ALL_DEXS } from "@/config/constants"; import { cn } from "@/lib/cn"; import { formatDateTime, formatToken, formatUSD } from "@/lib/format"; import { useMarkets } from "@/lib/hyperliquid"; @@ -44,7 +44,7 @@ export function OrdersTab() { data: openOrdersEvent, status, error, - } = useSubOpenOrders({ user: address ?? "0x0" }, { enabled: isConnected && !!address }); + } = useSubOpenOrders({ user: address ?? "0x0", dex: HL_ALL_DEXS }, { enabled: isConnected && !!address }); const markets = useMarkets(); const [selectedOrderIds, setSelectedOrderIds] = useState>(() => new Set()); diff --git a/src/components/trade/positions/positions-panel.tsx b/src/components/trade/positions/positions-panel.tsx index 0ce39c94..19a1a98e 100644 --- a/src/components/trade/positions/positions-panel.tsx +++ b/src/components/trade/positions/positions-panel.tsx @@ -26,7 +26,10 @@ export function PositionsPanel() { const { address, isConnected } = useConnection(); const { perpSummary, spotBalances } = useAccountBalances(); const { positions } = useUserPositions(); - const { data: ordersEvent } = useSubOpenOrders({ user: address ?? "0x0" }, { enabled: isConnected && !!address }); + const { data: ordersEvent } = useSubOpenOrders( + { user: address ?? "0x0", dex: HL_ALL_DEXS }, + { enabled: isConnected && !!address }, + ); const { data: twapStatesEvent } = useSubTwapStates( { user: address ?? "0x0", dex: HL_ALL_DEXS }, { enabled: isConnected && !!address }, diff --git a/src/components/trade/tradebox/trade-panel.tsx b/src/components/trade/tradebox/trade-panel.tsx index d9e0b10e..ec7cffda 100644 --- a/src/components/trade/tradebox/trade-panel.tsx +++ b/src/components/trade/tradebox/trade-panel.tsx @@ -31,7 +31,12 @@ import { import type { ActiveDialog } from "@/lib/trade/types"; import { useButtonContent } from "@/lib/trade/use-button-content"; import { perpInput, spotInput, useOrderValidation } from "@/lib/trade/use-order-validation"; -import { useDepositModalActions, useSettingsDialogActions, useSwapModalActions } from "@/stores/use-global-modal-store"; +import { + useDepositModalActions, + useFaucetModalActions, + useSettingsDialogActions, + useSwapModalActions, +} from "@/stores/use-global-modal-store"; import { useMarketOrderSlippageBps, useMarketOrderSlippagePercent } from "@/stores/use-global-settings-store"; import { useLimitPrice, @@ -137,9 +142,12 @@ export function TradePanel() { const [activeDialog, setActiveDialog] = useState>(null); const { open: openDepositModal } = useDepositModalActions(); + const { open: openFaucetModal } = useFaucetModalActions(); const { open: openSettingsDialog } = useSettingsDialogActions(); const { open: openSwapModal } = useSwapModalActions(); + const isTestnet = import.meta.env.VITE_HYPERLIQUID_TESTNET === "true"; + const swapTargetToken = useMemo(() => { if (!market || market.kind !== "builderPerp") return null; @@ -424,8 +432,10 @@ export function TradePanel() { canApprove, side, isSubmitting, + isTestnet, onConnectWallet: () => !authenticated && login(), onDeposit: () => openDepositModal("deposit"), + onFaucet: openFaucetModal, onRegister: handleRegister, onSubmit: handleSubmit, }); diff --git a/src/lib/trade/use-button-content.ts b/src/lib/trade/use-button-content.ts index 6e07c7a7..b1047e8c 100644 --- a/src/lib/trade/use-button-content.ts +++ b/src/lib/trade/use-button-content.ts @@ -12,8 +12,10 @@ interface ButtonContentInput { canApprove: boolean; side: Side; isSubmitting: boolean; + isTestnet: boolean; onConnectWallet: () => void; onDeposit: () => void; + onFaucet: () => void; onRegister: () => void; onSubmit: () => void; } @@ -58,8 +60,8 @@ export function useButtonContent(input: ButtonContentInput): ButtonContent { } if (input.availableBalance <= 0) { return { - text: t`Deposit`, - action: input.onDeposit, + text: input.isTestnet ? t`Deposit USDH or use Faucet` : t`Deposit`, + action: input.isTestnet ? input.onFaucet : input.onDeposit, disabled: false, variant: "cyan", }; @@ -79,8 +81,10 @@ export function useButtonContent(input: ButtonContentInput): ButtonContent { isRegistering, input.canApprove, input.isAgentLoading, + input.isTestnet, input.onConnectWallet, input.onDeposit, + input.onFaucet, input.onRegister, input.onSubmit, input.side, diff --git a/src/locales/ar/messages.po b/src/locales/ar/messages.po index d47646af..d25d01b0 100644 --- a/src/locales/ar/messages.po +++ b/src/locales/ar/messages.po @@ -508,6 +508,10 @@ msgstr "" #~ msgid "Deposit on Hyperliquid" #~ msgstr "إيداع في Hyperliquid" +#: src/lib/trade/use-button-content.ts +msgid "Deposit USDH or use Faucet" +msgstr "" + #: src/components/trade/positions/send-dialog.tsx msgid "Destination" msgstr "" diff --git a/src/locales/en/messages.po b/src/locales/en/messages.po index fd7a0bd8..6c76bf10 100644 --- a/src/locales/en/messages.po +++ b/src/locales/en/messages.po @@ -509,6 +509,10 @@ msgstr "Deposit failed" #~ msgid "Deposit on Hyperliquid" #~ msgstr "Deposit on Hyperliquid" +#: src/lib/trade/use-button-content.ts +msgid "Deposit USDH or use Faucet" +msgstr "Deposit USDH or use Faucet" + #: src/components/trade/positions/send-dialog.tsx msgid "Destination" msgstr "Destination" diff --git a/src/locales/es/messages.po b/src/locales/es/messages.po index 90885348..7cd4202a 100644 --- a/src/locales/es/messages.po +++ b/src/locales/es/messages.po @@ -508,6 +508,10 @@ msgstr "" #~ msgid "Deposit on Hyperliquid" #~ msgstr "Depositar en Hyperliquid" +#: src/lib/trade/use-button-content.ts +msgid "Deposit USDH or use Faucet" +msgstr "" + #: src/components/trade/positions/send-dialog.tsx msgid "Destination" msgstr "" diff --git a/src/locales/fr/messages.po b/src/locales/fr/messages.po index d600be9e..9ecfc91b 100644 --- a/src/locales/fr/messages.po +++ b/src/locales/fr/messages.po @@ -508,6 +508,10 @@ msgstr "" #~ msgid "Deposit on Hyperliquid" #~ msgstr "Déposer sur Hyperliquid" +#: src/lib/trade/use-button-content.ts +msgid "Deposit USDH or use Faucet" +msgstr "" + #: src/components/trade/positions/send-dialog.tsx msgid "Destination" msgstr "" diff --git a/src/locales/hi/messages.po b/src/locales/hi/messages.po index 0196085c..9deac9ae 100644 --- a/src/locales/hi/messages.po +++ b/src/locales/hi/messages.po @@ -508,6 +508,10 @@ msgstr "" #~ msgid "Deposit on Hyperliquid" #~ msgstr "Hyperliquid पर जमा करें" +#: src/lib/trade/use-button-content.ts +msgid "Deposit USDH or use Faucet" +msgstr "" + #: src/components/trade/positions/send-dialog.tsx msgid "Destination" msgstr "" diff --git a/src/locales/zh/messages.po b/src/locales/zh/messages.po index f3b7280a..b905a968 100644 --- a/src/locales/zh/messages.po +++ b/src/locales/zh/messages.po @@ -508,6 +508,10 @@ msgstr "" #~ msgid "Deposit on Hyperliquid" #~ msgstr "在 Hyperliquid 存款" +#: src/lib/trade/use-button-content.ts +msgid "Deposit USDH or use Faucet" +msgstr "" + #: src/components/trade/positions/send-dialog.tsx msgid "Destination" msgstr "" From 86aa599ced04caa8e8208904812835a0afb8478f Mon Sep 17 00:00:00 2001 From: alex luu Date: Sat, 11 Apr 2026 13:22:20 -0400 Subject: [PATCH 5/6] fix: address feedback --- src/components/trade/header/user-menu.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/trade/header/user-menu.tsx b/src/components/trade/header/user-menu.tsx index 6cb6d57a..a838c4d6 100644 --- a/src/components/trade/header/user-menu.tsx +++ b/src/components/trade/header/user-menu.tsx @@ -64,10 +64,13 @@ export function UserMenu() { }, []); async function handleLogout() { - if (authenticated) { - await logout(); + try { + if (authenticated) { + await logout(); + } + } finally { + disconnect(); } - disconnect(); } if (!mounted || !ready || isConnecting) { From 68ab9091e6385a81bf1cad7f5e3763b9db0672a1 Mon Sep 17 00:00:00 2001 From: alex luu Date: Mon, 13 Apr 2026 19:56:56 -0400 Subject: [PATCH 6/6] feat: update privy logins --- src/config/privy.ts | 2 +- src/styles.css | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/config/privy.ts b/src/config/privy.ts index 1d715dd7..02e8501e 100644 --- a/src/config/privy.ts +++ b/src/config/privy.ts @@ -2,7 +2,7 @@ import type { PrivyClientConfig } from "@privy-io/react-auth"; import { arbitrum, arbitrumSepolia } from "wagmi/chains"; export const privyConfig: PrivyClientConfig = { - loginMethods: ["google", "wallet"], + loginMethods: ["google", "email", "twitter"], embeddedWallets: { ethereum: { createOnLogin: "users-without-wallets", diff --git a/src/styles.css b/src/styles.css index 4835db8d..b114e101 100644 --- a/src/styles.css +++ b/src/styles.css @@ -391,6 +391,10 @@ } @layer components { + #privy-dialog input#email-input ~ button { + display: none; + } + .active\:scale-98:active { transform: scale(0.98); }