diff --git a/.claude/settings.local.json b/.claude/settings.local.json index cd46171f..34eacd48 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -1,10 +1,6 @@ { "permissions": { "allow": [ - "Bash(find node_modules/.pnpm -path */start-plugin-core/dist/esm/index.d.ts)", - "Bash(find node_modules/.pnpm -path */start-plugin-core/dist/esm/*.d.ts)", - "Bash(NITRO_PRESET=cloudflare-pages pnpm build)", - "Bash(timeout 12 npx wrangler pages dev .)" ] } } diff --git a/.env.example b/.env.example index 14b85c21..e1501258 100644 --- a/.env.example +++ b/.env.example @@ -2,4 +2,7 @@ VITE_PRIVY_APP_ID=your-privy-app-id # Set to "true" for Hyperliquid testnet, "false" for mainnet VITE_HYPERLIQUID_TESTNET=true -TURNSTILE_SITE_KEY=use-turnstile-key-from-usdh \ No newline at end of file +VITE_TURNSTILE_SITE_KEY=use-turnstile-key-from-usdh + +# Hypermiles points API +VITE_HYPERMILES_API_URL=http://localhost:3001 diff --git a/src/components/trade/components/global-modals.tsx b/src/components/trade/components/global-modals.tsx index 0c74cf13..421a3225 100644 --- a/src/components/trade/components/global-modals.tsx +++ b/src/components/trade/components/global-modals.tsx @@ -6,6 +6,7 @@ const FaucetModal = createLazyComponent(() => import("../tradebox/faucet-modal") const GlobalSettingsDialog = createLazyComponent(() => import("./global-settings-dialog"), "GlobalSettingsDialog"); const SpotSwapModal = createLazyComponent(() => import("./spot-swap-modal"), "SpotSwapModal"); const CommandMenu = createLazyComponent(() => import("./command-menu"), "CommandMenu"); +const PointsModal = createLazyComponent(() => import("../tradebox/points-modal"), "PointsModal"); export function GlobalModals() { return ( @@ -15,6 +16,7 @@ export function GlobalModals() { + ); } diff --git a/src/components/trade/header/top-nav.tsx b/src/components/trade/header/top-nav.tsx index 6f581b81..06f00281 100644 --- a/src/components/trade/header/top-nav.tsx +++ b/src/components/trade/header/top-nav.tsx @@ -1,6 +1,6 @@ import { t } from "@lingui/core/macro"; import { Trans } from "@lingui/react/macro"; -import { DownloadSimpleIcon, DropIcon, GearIcon, TerminalIcon } from "@phosphor-icons/react"; +import { DownloadSimpleIcon, DropIcon, GearIcon, TerminalIcon, TrophyIcon } from "@phosphor-icons/react"; import { Link } from "@tanstack/react-router"; import { useConnection } from "wagmi"; import { Button } from "@/components/ui/button"; @@ -9,6 +9,7 @@ import { useExchangeScope } from "@/providers/exchange-scope"; import { useDepositModalActions, useFaucetModalActions, + usePointsModalActions, useSettingsDialogActions, } from "@/stores/use-global-modal-store"; @@ -38,6 +39,7 @@ function getScopeAccentClass(scope: string): string { export function TopNav() { const { open: openDepositModal } = useDepositModalActions(); const { open: openFaucetModal } = useFaucetModalActions(); + const { open: openPointsModal } = usePointsModalActions(); const { open: openSettingsDialog } = useSettingsDialogActions(); const { isConnected } = useConnection(); const { scope } = useExchangeScope(); @@ -79,26 +81,37 @@ export function TopNav() {
- {isConnected && - (isTestnet ? ( + {isConnected && ( + <> - ) : ( - - ))} + {isTestnet ? ( + + ) : ( + + )} + + )}
diff --git a/src/components/trade/tradebox/points-modal.tsx b/src/components/trade/tradebox/points-modal.tsx new file mode 100644 index 00000000..9be2c766 --- /dev/null +++ b/src/components/trade/tradebox/points-modal.tsx @@ -0,0 +1,344 @@ +import { Trans } from "@lingui/react/macro"; +import { + ArrowRightIcon, + CheckIcon, + CopyIcon, + LightningIcon, + SpinnerGapIcon, + TrophyIcon, + UsersIcon, + WarningCircleIcon, +} from "@phosphor-icons/react"; +import { usePrivy } from "@privy-io/react-auth"; +import { useEffect, useId, useState } from "react"; +import { useConnection } from "wagmi"; +import { Button } from "@/components/ui/button"; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; +import { InfoRow } from "@/components/ui/info-row"; +import { Input } from "@/components/ui/input"; +import { useCopyToClipboard } from "@/hooks/ui/use-copy-to-clipboard"; +import { usePointsModalActions, usePointsModalOpen } from "@/stores/use-global-modal-store"; + +const API_URL = import.meta.env.VITE_HYPERMILES_API_URL; + +type ModalView = "loading" | "signup" | "summary" | "error"; + +interface UserPoints { + walletAddress: string; + totalPoints: string; + rank: number; + referralCode: string; + firstOrderAt: string | null; + lastOrderAt: string | null; +} + +interface EarnMethodProps { + icon: React.ReactNode; + title: React.ReactNode; + description: React.ReactNode; +} + +function EarnMethod({ icon, title, description }: EarnMethodProps) { + return ( +
+
+ {icon} +
+
+

{title}

+

{description}

+
+
+ ); +} + +function CopyableCode({ code }: { code: string }) { + const { copied, copy } = useCopyToClipboard(); + + return ( + + ); +} + +function HowToEarn() { + return ( +
+

+ How to earn +

+
+ } + title={Trade} + description={Earn points for every trade you execute on Hyperliquid} + /> + } + title={Refer friends} + description={Share your referral code and earn bonus points when they trade} + /> +
+
+ ); +} + +export function PointsModal() { + const open = usePointsModalOpen(); + const { close } = usePointsModalActions(); + const { address } = useConnection(); + const { user } = usePrivy(); + + const [view, setView] = useState("loading"); + const [userPoints, setUserPoints] = useState(null); + const [referralCode, setReferralCode] = useState(""); + const [error, setError] = useState(null); + const [submitting, setSubmitting] = useState(false); + const referralInputId = useId(); + + function fetchPoints() { + if (!address) return; + setView("loading"); + setError(null); + setReferralCode(""); + + fetch(`${API_URL}/user_points?user_address=${address}`) + .then((res) => { + if (res.ok) return res.json(); + if (res.status === 404) return null; + throw new Error("Failed to fetch points"); + }) + .then((data) => { + if (data) { + setUserPoints(data); + setView("summary"); + } else { + setView("signup"); + } + }) + .catch(() => { + setError("Unable to connect to points service"); + setView("error"); + }); + } + + // biome-ignore lint/correctness/useExhaustiveDependencies: fetchPoints is intentionally excluded to avoid re-creating on every render + useEffect(() => { + if (!open || !address) return; + fetchPoints(); + }, [open, address]); + + function handleClose() { + close(); + setView("loading"); + setUserPoints(null); + setError(null); + setReferralCode(""); + setSubmitting(false); + } + + async function handleSignup(withReferral: boolean) { + if (!address) return; + setSubmitting(true); + setError(null); + + const body: Record = { walletAddress: address }; + if (user?.id) { + body.privyUserId = user.id; + } + if (withReferral && referralCode.trim()) { + body.referralCode = referralCode.trim(); + } + + try { + const res = await fetch(`${API_URL}/users`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(body), + }); + + if (!res.ok) { + const data = await res.json().catch(() => null); + throw new Error(data?.error ?? "Signup failed"); + } + + const created = await res.json(); + setUserPoints({ + walletAddress: created.walletAddress, + totalPoints: created.totalPoints ?? "0", + rank: 0, + referralCode: created.referralCode, + firstOrderAt: null, + lastOrderAt: null, + }); + setView("summary"); + } catch (err) { + setError(err instanceof Error ? err.message : "Signup failed"); + } finally { + setSubmitting(false); + } + } + + if (view === "summary" && userPoints) { + return ( + + + + + Hypermiles + + + +
+
+
+
+

+ Total Points +

+

{userPoints.totalPoints}

+
+ {userPoints.rank > 0 && ( +
+ + #{userPoints.rank} +
+ )} +
+
+ +
+ Your Referral Code} + value={} + /> +
+ + +
+
+
+ ); + } + + if (view === "error") { + return ( + + + + + Hypermiles + + +
+
+ +
+

{error}

+
+ + +
+
+
+
+ ); + } + + if (view === "signup") { + return ( + + + + + Join Hypermiles + + + +
+

+ Earn points every time you trade on Hyperliquid. Refer friends to earn even more. +

+ + + +
+ + setReferralCode(e.target.value)} + placeholder="Enter code" + disabled={submitting} + /> + {error &&

{error}

} +
+ +
+ + {referralCode.trim() && ( + + )} +
+
+
+
+ ); + } + + return ( + + + + + Hypermiles + + +
+ +

+ Loading points... +

+
+
+
+ ); +} diff --git a/src/locales/ar/messages.po b/src/locales/ar/messages.po index 2e3093c5..4d3e8deb 100644 --- a/src/locales/ar/messages.po +++ b/src/locales/ar/messages.po @@ -304,6 +304,7 @@ msgid "Claiming USDH" msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx +#: src/components/trade/tradebox/points-modal.tsx #: src/components/ui/dialog.tsx #: src/components/ui/sheet.tsx msgid "Close" @@ -340,7 +341,6 @@ msgstr "" msgid "Confirm in wallet" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Connect" #~ msgstr "" @@ -546,6 +546,14 @@ msgstr "" msgid "Duration (Minutes)" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points every time you trade on Hyperliquid. Refer friends to earn even more." +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points for every trade you execute on Hyperliquid" +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Edit TP/SL" msgstr "" @@ -760,6 +768,10 @@ msgstr "" #~ msgid "Gas:" #~ msgstr "الغاز:" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Get Started" +msgstr "" + #: src/components/ui/pagination.tsx #~ msgid "Go to next page" #~ msgstr "الذهاب للصفحة التالية" @@ -777,6 +789,16 @@ msgstr "الذهاب إلى منصة التداول" msgid "Hide small" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "How to earn" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +msgid "Hypermiles" +msgstr "" + #: src/components/trade/tradebox/account-panel.tsx msgid "In Orders" msgstr "" @@ -785,7 +807,6 @@ msgstr "" #~ msgid "In Use" #~ msgstr "قيد الاستخدام" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Install a wallet extension to continue" #~ msgstr "" @@ -833,6 +854,10 @@ msgstr "" msgid "Isolated" msgstr "معزول" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Join Hypermiles" +msgstr "" + #: src/components/trade/footer/footer-bar.tsx #~ msgid "Latency:" #~ msgstr "التأخير:" @@ -919,6 +944,10 @@ msgstr "جارٍ تحميل الأوامر المفتوحة..." msgid "Loading order history..." msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Loading points..." +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Loading positions..." msgstr "جاري تحميل المراكز..." @@ -1073,7 +1102,6 @@ msgstr "" msgid "Minimum withdrawal is ${MIN_WITHDRAW_USD}" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Mock Wallet (Testing)" #~ msgstr "" @@ -1198,7 +1226,6 @@ msgstr "" #~ msgid "No user address" #~ msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "No wallets found" #~ msgstr "لم يتم العثور على محافظ" @@ -1206,7 +1233,6 @@ msgstr "" msgid "Not connected" msgstr "غير متصل" -#: src/components/trade/header/top-nav.tsx #~ msgid "Notifications" #~ msgstr "الإشعارات" @@ -1338,6 +1364,10 @@ msgstr "" msgid "PNL" msgstr "الربح والخسارة" +#: src/components/trade/header/top-nav.tsx +msgid "Points" +msgstr "" + #: src/components/trade/components/wallet-dialog.tsx #~ msgid "Popular" #~ msgstr "" @@ -1422,6 +1452,14 @@ msgstr "" msgid "Reduce Only" msgstr "تقليل فقط" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Refer friends" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Referral Code (optional)" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" @@ -1451,6 +1489,7 @@ msgstr "" #: src/components/trade/tradebox/deposit-modal.tsx #: src/components/trade/tradebox/faucet-modal.tsx #: src/components/trade/tradebox/leverage-control.tsx +#: src/components/trade/tradebox/points-modal.tsx msgid "Retry" msgstr "" @@ -1600,6 +1639,10 @@ msgstr "" msgid "Settings" msgstr "الإعدادات" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Share your referral code and earn bonus points when they trade" +msgstr "" + #: src/components/trade/positions/position-limit-close-modal.tsx #: src/components/trade/positions/position-tpsl-modal.tsx #: src/components/trade/positions/positions-tab.tsx @@ -1682,6 +1725,10 @@ msgstr "الحجم" msgid "Size exceeds position" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Skip referral" +msgstr "" + #: src/components/trade/positions/orders-tab.tsx #~ msgid "SL" #~ msgstr "" @@ -1945,6 +1992,10 @@ msgstr "تبديل وضع الحجم" msgid "Total" msgstr "الإجمالي" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Total Points" +msgstr "" + #: src/components/trade/positions/twap-tab.tsx #~ msgid "Total Size" #~ msgstr "الحجم الإجمالي" @@ -1980,9 +2031,9 @@ msgstr "" msgid "TP/SL" msgstr "TP/SL" -#: src/components/trade/header/top-nav.tsx -#~ msgid "Trade" -#~ msgstr "تداول" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Trade" +msgstr "تداول" #: src/components/trade/positions/history-tab.tsx #~ msgid "Trade ClockCounterClockwise" @@ -2203,3 +2254,7 @@ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "You can revoke permissions at any time by registering a new approval with 0% fee rate. Builder codes are processed entirely onchain as part of the fee logic." #~ msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Your Referral Code" +msgstr "" diff --git a/src/locales/en/messages.po b/src/locales/en/messages.po index 7ae91607..edb9e674 100644 --- a/src/locales/en/messages.po +++ b/src/locales/en/messages.po @@ -304,6 +304,7 @@ msgid "Claiming USDH" msgstr "Claiming USDH" #: src/components/trade/positions/position-actions-dropdown.tsx +#: src/components/trade/tradebox/points-modal.tsx #: src/components/ui/dialog.tsx #: src/components/ui/sheet.tsx msgid "Close" @@ -546,6 +547,14 @@ msgstr "Done" msgid "Duration (Minutes)" msgstr "Duration (Minutes)" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points every time you trade on Hyperliquid. Refer friends to earn even more." +msgstr "Earn points every time you trade on Hyperliquid. Refer friends to earn even more." + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points for every trade you execute on Hyperliquid" +msgstr "Earn points for every trade you execute on Hyperliquid" + #: src/components/trade/positions/positions-tab.tsx msgid "Edit TP/SL" msgstr "Edit TP/SL" @@ -760,6 +769,10 @@ msgstr "Funding History" #~ msgid "Gas:" #~ msgstr "Gas:" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Get Started" +msgstr "Get Started" + #: src/components/ui/pagination.tsx #~ msgid "Go to next page" #~ msgstr "Go to next page" @@ -777,6 +790,16 @@ msgstr "Go to trading terminal" msgid "Hide small" msgstr "Hide small" +#: src/components/trade/tradebox/points-modal.tsx +msgid "How to earn" +msgstr "How to earn" + +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +msgid "Hypermiles" +msgstr "Hypermiles" + #: src/components/trade/tradebox/account-panel.tsx msgid "In Orders" msgstr "In Orders" @@ -833,6 +856,10 @@ msgstr "Invalid amount" msgid "Isolated" msgstr "Isolated" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Join Hypermiles" +msgstr "Join Hypermiles" + #: src/components/trade/components/global-settings-dialog.tsx #~ msgid "Language" #~ msgstr "Language" @@ -923,6 +950,10 @@ msgstr "Loading open orders..." msgid "Loading order history..." msgstr "Loading order history..." +#: src/components/trade/tradebox/points-modal.tsx +msgid "Loading points..." +msgstr "Loading points..." + #: src/components/trade/positions/positions-tab.tsx msgid "Loading positions..." msgstr "Loading positions..." @@ -1342,6 +1373,10 @@ msgstr "Place Limit Close" msgid "PNL" msgstr "PNL" +#: src/components/trade/header/top-nav.tsx +msgid "Points" +msgstr "Points" + #: src/components/trade/components/wallet-dialog.tsx #~ msgid "Popular" #~ msgstr "Popular" @@ -1426,6 +1461,14 @@ msgstr "Reduce" msgid "Reduce Only" msgstr "Reduce Only" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Refer friends" +msgstr "Refer friends" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Referral Code (optional)" +msgstr "Referral Code (optional)" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "Register Another" @@ -1455,6 +1498,7 @@ msgstr "Requirement" #: src/components/trade/tradebox/deposit-modal.tsx #: src/components/trade/tradebox/faucet-modal.tsx #: src/components/trade/tradebox/leverage-control.tsx +#: src/components/trade/tradebox/points-modal.tsx msgid "Retry" msgstr "Retry" @@ -1604,6 +1648,10 @@ msgstr "Set to {p}%" msgid "Settings" msgstr "Settings" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Share your referral code and earn bonus points when they trade" +msgstr "Share your referral code and earn bonus points when they trade" + #: src/components/trade/positions/position-limit-close-modal.tsx #: src/components/trade/positions/position-tpsl-modal.tsx #: src/components/trade/positions/positions-tab.tsx @@ -1686,6 +1734,10 @@ msgstr "Size" msgid "Size exceeds position" msgstr "Size exceeds position" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Skip referral" +msgstr "Skip referral" + #: src/components/trade/positions/orders-tab.tsx #~ msgid "SL" #~ msgstr "SL" @@ -1949,6 +2001,10 @@ msgstr "Toggle size mode" msgid "Total" msgstr "Total" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Total Points" +msgstr "Total Points" + #: src/components/trade/positions/twap-tab.tsx #~ msgid "Total Size" #~ msgstr "Total Size" @@ -1984,9 +2040,9 @@ msgstr "TP Price" msgid "TP/SL" msgstr "TP/SL" -#: src/components/trade/header/top-nav.tsx -#~ msgid "Trade" -#~ msgstr "Trade" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Trade" +msgstr "Trade" #: src/components/trade/positions/history-tab.tsx #~ msgid "Trade ClockCounterClockwise" @@ -2211,3 +2267,7 @@ msgstr "Yes" #: src/components/pages/builder-page.tsx #~ msgid "You can revoke permissions at any time by registering a new approval with 0% fee rate. Builder codes are processed entirely onchain as part of the fee logic." #~ msgstr "You can revoke permissions at any time by registering a new approval with 0% fee rate. Builder codes are processed entirely onchain as part of the fee logic." + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Your Referral Code" +msgstr "Your Referral Code" diff --git a/src/locales/es/messages.po b/src/locales/es/messages.po index a78b5aae..86b5e9ee 100644 --- a/src/locales/es/messages.po +++ b/src/locales/es/messages.po @@ -304,6 +304,7 @@ msgid "Claiming USDH" msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx +#: src/components/trade/tradebox/points-modal.tsx #: src/components/ui/dialog.tsx #: src/components/ui/sheet.tsx msgid "Close" @@ -340,7 +341,6 @@ msgstr "" msgid "Confirm in wallet" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Connect" #~ msgstr "" @@ -546,6 +546,14 @@ msgstr "" msgid "Duration (Minutes)" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points every time you trade on Hyperliquid. Refer friends to earn even more." +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points for every trade you execute on Hyperliquid" +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Edit TP/SL" msgstr "" @@ -760,6 +768,10 @@ msgstr "" #~ msgid "Gas:" #~ msgstr "Gas:" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Get Started" +msgstr "" + #: src/components/ui/pagination.tsx #~ msgid "Go to next page" #~ msgstr "Ir a página siguiente" @@ -777,6 +789,16 @@ msgstr "Ir al terminal de trading" msgid "Hide small" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "How to earn" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +msgid "Hypermiles" +msgstr "" + #: src/components/trade/tradebox/account-panel.tsx msgid "In Orders" msgstr "" @@ -785,7 +807,6 @@ msgstr "" #~ msgid "In Use" #~ msgstr "En uso" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Install a wallet extension to continue" #~ msgstr "" @@ -833,6 +854,10 @@ msgstr "" msgid "Isolated" msgstr "Aislado" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Join Hypermiles" +msgstr "" + #: src/components/trade/footer/footer-bar.tsx #~ msgid "Latency:" #~ msgstr "Latencia:" @@ -919,6 +944,10 @@ msgstr "Cargando órdenes abiertas..." msgid "Loading order history..." msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Loading points..." +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Loading positions..." msgstr "Cargando posiciones..." @@ -1073,7 +1102,6 @@ msgstr "" msgid "Minimum withdrawal is ${MIN_WITHDRAW_USD}" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Mock Wallet (Testing)" #~ msgstr "" @@ -1198,7 +1226,6 @@ msgstr "" #~ msgid "No user address" #~ msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "No wallets found" #~ msgstr "No se encontraron billeteras" @@ -1206,7 +1233,6 @@ msgstr "" msgid "Not connected" msgstr "No conectado" -#: src/components/trade/header/top-nav.tsx #~ msgid "Notifications" #~ msgstr "Notificaciones" @@ -1338,6 +1364,10 @@ msgstr "" msgid "PNL" msgstr "PNL" +#: src/components/trade/header/top-nav.tsx +msgid "Points" +msgstr "" + #: src/components/trade/components/wallet-dialog.tsx #~ msgid "Popular" #~ msgstr "" @@ -1422,6 +1452,14 @@ msgstr "" msgid "Reduce Only" msgstr "Solo reducir" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Refer friends" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Referral Code (optional)" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" @@ -1451,6 +1489,7 @@ msgstr "" #: src/components/trade/tradebox/deposit-modal.tsx #: src/components/trade/tradebox/faucet-modal.tsx #: src/components/trade/tradebox/leverage-control.tsx +#: src/components/trade/tradebox/points-modal.tsx msgid "Retry" msgstr "" @@ -1600,6 +1639,10 @@ msgstr "" msgid "Settings" msgstr "Configuración" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Share your referral code and earn bonus points when they trade" +msgstr "" + #: src/components/trade/positions/position-limit-close-modal.tsx #: src/components/trade/positions/position-tpsl-modal.tsx #: src/components/trade/positions/positions-tab.tsx @@ -1682,6 +1725,10 @@ msgstr "Tamaño" msgid "Size exceeds position" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Skip referral" +msgstr "" + #: src/components/trade/positions/orders-tab.tsx #~ msgid "SL" #~ msgstr "" @@ -1945,6 +1992,10 @@ msgstr "Cambiar modo de tamaño" msgid "Total" msgstr "Total" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Total Points" +msgstr "" + #: src/components/trade/positions/twap-tab.tsx #~ msgid "Total Size" #~ msgstr "Tamaño total" @@ -1980,9 +2031,9 @@ msgstr "" msgid "TP/SL" msgstr "TP/SL" -#: src/components/trade/header/top-nav.tsx -#~ msgid "Trade" -#~ msgstr "Operar" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Trade" +msgstr "Operar" #: src/components/trade/positions/history-tab.tsx #~ msgid "Trade ClockCounterClockwise" @@ -2203,3 +2254,7 @@ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "You can revoke permissions at any time by registering a new approval with 0% fee rate. Builder codes are processed entirely onchain as part of the fee logic." #~ msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Your Referral Code" +msgstr "" diff --git a/src/locales/fr/messages.po b/src/locales/fr/messages.po index d75b7640..e555c780 100644 --- a/src/locales/fr/messages.po +++ b/src/locales/fr/messages.po @@ -304,6 +304,7 @@ msgid "Claiming USDH" msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx +#: src/components/trade/tradebox/points-modal.tsx #: src/components/ui/dialog.tsx #: src/components/ui/sheet.tsx msgid "Close" @@ -340,7 +341,6 @@ msgstr "" msgid "Confirm in wallet" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Connect" #~ msgstr "" @@ -546,6 +546,14 @@ msgstr "" msgid "Duration (Minutes)" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points every time you trade on Hyperliquid. Refer friends to earn even more." +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points for every trade you execute on Hyperliquid" +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Edit TP/SL" msgstr "" @@ -760,6 +768,10 @@ msgstr "" #~ msgid "Gas:" #~ msgstr "Gas :" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Get Started" +msgstr "" + #: src/components/ui/pagination.tsx #~ msgid "Go to next page" #~ msgstr "Aller à la page suivante" @@ -777,6 +789,16 @@ msgstr "Aller au terminal de trading" msgid "Hide small" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "How to earn" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +msgid "Hypermiles" +msgstr "" + #: src/components/trade/tradebox/account-panel.tsx msgid "In Orders" msgstr "" @@ -785,7 +807,6 @@ msgstr "" #~ msgid "In Use" #~ msgstr "En cours d'utilisation" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Install a wallet extension to continue" #~ msgstr "" @@ -833,6 +854,10 @@ msgstr "" msgid "Isolated" msgstr "Isolé" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Join Hypermiles" +msgstr "" + #: src/components/trade/footer/footer-bar.tsx #~ msgid "Latency:" #~ msgstr "Latence :" @@ -919,6 +944,10 @@ msgstr "Chargement des ordres ouverts..." msgid "Loading order history..." msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Loading points..." +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Loading positions..." msgstr "Chargement des positions..." @@ -1073,7 +1102,6 @@ msgstr "" msgid "Minimum withdrawal is ${MIN_WITHDRAW_USD}" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Mock Wallet (Testing)" #~ msgstr "" @@ -1198,7 +1226,6 @@ msgstr "" #~ msgid "No user address" #~ msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "No wallets found" #~ msgstr "Aucun portefeuille trouvé" @@ -1206,7 +1233,6 @@ msgstr "" msgid "Not connected" msgstr "Non connecté" -#: src/components/trade/header/top-nav.tsx #~ msgid "Notifications" #~ msgstr "Notifications" @@ -1338,6 +1364,10 @@ msgstr "" msgid "PNL" msgstr "PNL" +#: src/components/trade/header/top-nav.tsx +msgid "Points" +msgstr "" + #: src/components/trade/components/wallet-dialog.tsx #~ msgid "Popular" #~ msgstr "" @@ -1422,6 +1452,14 @@ msgstr "" msgid "Reduce Only" msgstr "Réduction uniquement" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Refer friends" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Referral Code (optional)" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" @@ -1451,6 +1489,7 @@ msgstr "" #: src/components/trade/tradebox/deposit-modal.tsx #: src/components/trade/tradebox/faucet-modal.tsx #: src/components/trade/tradebox/leverage-control.tsx +#: src/components/trade/tradebox/points-modal.tsx msgid "Retry" msgstr "" @@ -1600,6 +1639,10 @@ msgstr "" msgid "Settings" msgstr "Paramètres" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Share your referral code and earn bonus points when they trade" +msgstr "" + #: src/components/trade/positions/position-limit-close-modal.tsx #: src/components/trade/positions/position-tpsl-modal.tsx #: src/components/trade/positions/positions-tab.tsx @@ -1682,6 +1725,10 @@ msgstr "Taille" msgid "Size exceeds position" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Skip referral" +msgstr "" + #: src/components/trade/positions/orders-tab.tsx #~ msgid "SL" #~ msgstr "" @@ -1945,6 +1992,10 @@ msgstr "Basculer le mode de taille" msgid "Total" msgstr "Total" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Total Points" +msgstr "" + #: src/components/trade/positions/twap-tab.tsx #~ msgid "Total Size" #~ msgstr "Taille totale" @@ -1980,9 +2031,9 @@ msgstr "" msgid "TP/SL" msgstr "TP/SL" -#: src/components/trade/header/top-nav.tsx -#~ msgid "Trade" -#~ msgstr "Trader" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Trade" +msgstr "Trader" #: src/components/trade/positions/history-tab.tsx #~ msgid "Trade ClockCounterClockwise" @@ -2203,3 +2254,7 @@ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "You can revoke permissions at any time by registering a new approval with 0% fee rate. Builder codes are processed entirely onchain as part of the fee logic." #~ msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Your Referral Code" +msgstr "" diff --git a/src/locales/hi/messages.po b/src/locales/hi/messages.po index 51ef4f7c..eb0a8bbf 100644 --- a/src/locales/hi/messages.po +++ b/src/locales/hi/messages.po @@ -304,6 +304,7 @@ msgid "Claiming USDH" msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx +#: src/components/trade/tradebox/points-modal.tsx #: src/components/ui/dialog.tsx #: src/components/ui/sheet.tsx msgid "Close" @@ -340,7 +341,6 @@ msgstr "" msgid "Confirm in wallet" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Connect" #~ msgstr "" @@ -546,6 +546,14 @@ msgstr "" msgid "Duration (Minutes)" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points every time you trade on Hyperliquid. Refer friends to earn even more." +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points for every trade you execute on Hyperliquid" +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Edit TP/SL" msgstr "" @@ -760,6 +768,10 @@ msgstr "" #~ msgid "Gas:" #~ msgstr "गैस:" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Get Started" +msgstr "" + #: src/components/ui/pagination.tsx #~ msgid "Go to next page" #~ msgstr "अगले पृष्ठ पर जाएं" @@ -777,6 +789,16 @@ msgstr "ट्रेडिंग टर्मिनल पर जाएं" msgid "Hide small" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "How to earn" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +msgid "Hypermiles" +msgstr "" + #: src/components/trade/tradebox/account-panel.tsx msgid "In Orders" msgstr "" @@ -785,7 +807,6 @@ msgstr "" #~ msgid "In Use" #~ msgstr "उपयोग में" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Install a wallet extension to continue" #~ msgstr "" @@ -833,6 +854,10 @@ msgstr "" msgid "Isolated" msgstr "आइसोलेटेड" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Join Hypermiles" +msgstr "" + #: src/components/trade/footer/footer-bar.tsx #~ msgid "Latency:" #~ msgstr "लेटेंसी:" @@ -919,6 +944,10 @@ msgstr "खुले ऑर्डर लोड हो रहे हैं..." msgid "Loading order history..." msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Loading points..." +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Loading positions..." msgstr "पोजीशन लोड हो रहे हैं..." @@ -1073,7 +1102,6 @@ msgstr "" msgid "Minimum withdrawal is ${MIN_WITHDRAW_USD}" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Mock Wallet (Testing)" #~ msgstr "" @@ -1198,7 +1226,6 @@ msgstr "" #~ msgid "No user address" #~ msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "No wallets found" #~ msgstr "कोई वॉलेट नहीं मिला" @@ -1206,7 +1233,6 @@ msgstr "" msgid "Not connected" msgstr "कनेक्टेड नहीं" -#: src/components/trade/header/top-nav.tsx #~ msgid "Notifications" #~ msgstr "सूचनाएं" @@ -1338,6 +1364,10 @@ msgstr "" msgid "PNL" msgstr "PNL" +#: src/components/trade/header/top-nav.tsx +msgid "Points" +msgstr "" + #: src/components/trade/components/wallet-dialog.tsx #~ msgid "Popular" #~ msgstr "" @@ -1422,6 +1452,14 @@ msgstr "" msgid "Reduce Only" msgstr "केवल कम करें" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Refer friends" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Referral Code (optional)" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" @@ -1451,6 +1489,7 @@ msgstr "" #: src/components/trade/tradebox/deposit-modal.tsx #: src/components/trade/tradebox/faucet-modal.tsx #: src/components/trade/tradebox/leverage-control.tsx +#: src/components/trade/tradebox/points-modal.tsx msgid "Retry" msgstr "" @@ -1600,6 +1639,10 @@ msgstr "" msgid "Settings" msgstr "सेटिंग्स" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Share your referral code and earn bonus points when they trade" +msgstr "" + #: src/components/trade/positions/position-limit-close-modal.tsx #: src/components/trade/positions/position-tpsl-modal.tsx #: src/components/trade/positions/positions-tab.tsx @@ -1682,6 +1725,10 @@ msgstr "आकार" msgid "Size exceeds position" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Skip referral" +msgstr "" + #: src/components/trade/positions/orders-tab.tsx #~ msgid "SL" #~ msgstr "" @@ -1945,6 +1992,10 @@ msgstr "साइज मोड टॉगल करें" msgid "Total" msgstr "कुल" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Total Points" +msgstr "" + #: src/components/trade/positions/twap-tab.tsx #~ msgid "Total Size" #~ msgstr "कुल आकार" @@ -1980,9 +2031,9 @@ msgstr "" msgid "TP/SL" msgstr "TP/SL" -#: src/components/trade/header/top-nav.tsx -#~ msgid "Trade" -#~ msgstr "ट्रेड" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Trade" +msgstr "ट्रेड" #: src/components/trade/positions/history-tab.tsx #~ msgid "Trade ClockCounterClockwise" @@ -2203,3 +2254,7 @@ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "You can revoke permissions at any time by registering a new approval with 0% fee rate. Builder codes are processed entirely onchain as part of the fee logic." #~ msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Your Referral Code" +msgstr "" diff --git a/src/locales/zh/messages.po b/src/locales/zh/messages.po index 5c1091e6..37c2a0a7 100644 --- a/src/locales/zh/messages.po +++ b/src/locales/zh/messages.po @@ -304,6 +304,7 @@ msgid "Claiming USDH" msgstr "" #: src/components/trade/positions/position-actions-dropdown.tsx +#: src/components/trade/tradebox/points-modal.tsx #: src/components/ui/dialog.tsx #: src/components/ui/sheet.tsx msgid "Close" @@ -340,7 +341,6 @@ msgstr "" msgid "Confirm in wallet" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Connect" #~ msgstr "" @@ -546,6 +546,14 @@ msgstr "" msgid "Duration (Minutes)" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points every time you trade on Hyperliquid. Refer friends to earn even more." +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Earn points for every trade you execute on Hyperliquid" +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Edit TP/SL" msgstr "" @@ -760,6 +768,10 @@ msgstr "" #~ msgid "Gas:" #~ msgstr "Gas:" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Get Started" +msgstr "" + #: src/components/ui/pagination.tsx #~ msgid "Go to next page" #~ msgstr "下一页" @@ -777,6 +789,16 @@ msgstr "前往交易终端" msgid "Hide small" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "How to earn" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +#: src/components/trade/tradebox/points-modal.tsx +msgid "Hypermiles" +msgstr "" + #: src/components/trade/tradebox/account-panel.tsx msgid "In Orders" msgstr "" @@ -785,7 +807,6 @@ msgstr "" #~ msgid "In Use" #~ msgstr "使用中" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Install a wallet extension to continue" #~ msgstr "" @@ -833,6 +854,10 @@ msgstr "" msgid "Isolated" msgstr "逐仓" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Join Hypermiles" +msgstr "" + #: src/components/trade/footer/footer-bar.tsx #~ msgid "Latency:" #~ msgstr "延迟:" @@ -919,6 +944,10 @@ msgstr "加载未成交订单中..." msgid "Loading order history..." msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Loading points..." +msgstr "" + #: src/components/trade/positions/positions-tab.tsx msgid "Loading positions..." msgstr "加载仓位中..." @@ -1073,7 +1102,6 @@ msgstr "" msgid "Minimum withdrawal is ${MIN_WITHDRAW_USD}" msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "Mock Wallet (Testing)" #~ msgstr "" @@ -1198,7 +1226,6 @@ msgstr "" #~ msgid "No user address" #~ msgstr "" -#: src/components/trade/components/wallet-dialog.tsx #~ msgid "No wallets found" #~ msgstr "未找到钱包" @@ -1206,7 +1233,6 @@ msgstr "" msgid "Not connected" msgstr "未连接" -#: src/components/trade/header/top-nav.tsx #~ msgid "Notifications" #~ msgstr "通知" @@ -1338,6 +1364,10 @@ msgstr "" msgid "PNL" msgstr "盈亏" +#: src/components/trade/header/top-nav.tsx +msgid "Points" +msgstr "" + #: src/components/trade/components/wallet-dialog.tsx #~ msgid "Popular" #~ msgstr "" @@ -1422,6 +1452,14 @@ msgstr "" msgid "Reduce Only" msgstr "只减仓" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Refer friends" +msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Referral Code (optional)" +msgstr "" + #: src/components/pages/builder-page.tsx #~ msgid "Register Another" #~ msgstr "" @@ -1451,6 +1489,7 @@ msgstr "" #: src/components/trade/tradebox/deposit-modal.tsx #: src/components/trade/tradebox/faucet-modal.tsx #: src/components/trade/tradebox/leverage-control.tsx +#: src/components/trade/tradebox/points-modal.tsx msgid "Retry" msgstr "" @@ -1600,6 +1639,10 @@ msgstr "" msgid "Settings" msgstr "设置" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Share your referral code and earn bonus points when they trade" +msgstr "" + #: src/components/trade/positions/position-limit-close-modal.tsx #: src/components/trade/positions/position-tpsl-modal.tsx #: src/components/trade/positions/positions-tab.tsx @@ -1682,6 +1725,10 @@ msgstr "数量" msgid "Size exceeds position" msgstr "" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Skip referral" +msgstr "" + #: src/components/trade/positions/orders-tab.tsx #~ msgid "SL" #~ msgstr "" @@ -1945,6 +1992,10 @@ msgstr "切换数量模式" msgid "Total" msgstr "合计" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Total Points" +msgstr "" + #: src/components/trade/positions/twap-tab.tsx #~ msgid "Total Size" #~ msgstr "总数量" @@ -1980,9 +2031,9 @@ msgstr "" msgid "TP/SL" msgstr "止盈止损" -#: src/components/trade/header/top-nav.tsx -#~ msgid "Trade" -#~ msgstr "交易" +#: src/components/trade/tradebox/points-modal.tsx +msgid "Trade" +msgstr "交易" #: src/components/trade/positions/history-tab.tsx #~ msgid "Trade ClockCounterClockwise" @@ -2203,3 +2254,7 @@ msgstr "" #: src/components/pages/builder-page.tsx #~ msgid "You can revoke permissions at any time by registering a new approval with 0% fee rate. Builder codes are processed entirely onchain as part of the fee logic." #~ msgstr "" + +#: src/components/trade/tradebox/points-modal.tsx +msgid "Your Referral Code" +msgstr "" diff --git a/src/stores/use-global-modal-store.ts b/src/stores/use-global-modal-store.ts index 3738cbf6..cd7f01a1 100644 --- a/src/stores/use-global-modal-store.ts +++ b/src/stores/use-global-modal-store.ts @@ -9,6 +9,7 @@ type GlobalModal = | { type: "swap"; fromToken: string; toToken?: string } | { type: "commandMenu" } | { type: "faucet" } + | { type: "points" } | null; interface DepositActions { @@ -37,6 +38,11 @@ interface FaucetActions { close: () => void; } +interface PointsActions { + open: () => void; + close: () => void; +} + interface GlobalModalState { modal: GlobalModal; depositActions: DepositActions; @@ -44,6 +50,7 @@ interface GlobalModalState { swapActions: SwapActions; commandMenuActions: CommandMenuActions; faucetActions: FaucetActions; + pointsActions: PointsActions; } const useGlobalModalStore = create((set) => { @@ -72,6 +79,10 @@ const useGlobalModalStore = create((set) => { open: () => set({ modal: { type: "faucet" } }), close, }, + pointsActions: { + open: () => set({ modal: { type: "points" } }), + close, + }, }; }); @@ -95,3 +106,6 @@ export const useCommandMenuActions = () => useGlobalModalStore((s) => s.commandM export const useFaucetModalOpen = () => useGlobalModalStore((s) => s.modal?.type === "faucet"); export const useFaucetModalActions = () => useGlobalModalStore((s) => s.faucetActions); + +export const usePointsModalOpen = () => useGlobalModalStore((s) => s.modal?.type === "points"); +export const usePointsModalActions = () => useGlobalModalStore((s) => s.pointsActions);