From e13627186fb43521649f18efa0a029d456754ea0 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 15:49:26 +0530 Subject: [PATCH 01/24] feat: enhance visibility toggling for balance and improve formatting in various components --- src/app/dashboard/plans/page.tsx | 3 ++- .../dashboard/activity/ActivityRow.tsx | 2 +- .../dashboard/plans/PlanHeroCard.tsx | 5 ++++ .../dashboard/wallet/PerformanceGrid.tsx | 4 ++-- .../dashboard/wallet/PortfolioChart.tsx | 24 +++++++++++++++++++ .../dashboard/wallet/TotalValueCard.tsx | 5 ++-- src/lib/formatters.ts | 2 +- 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/src/app/dashboard/plans/page.tsx b/src/app/dashboard/plans/page.tsx index 36d0eab..005027b 100644 --- a/src/app/dashboard/plans/page.tsx +++ b/src/app/dashboard/plans/page.tsx @@ -18,7 +18,7 @@ import { useStore } from "@/lib/store"; export default function PlansPage() { const router = useRouter(); const { data: kyc, isLoading: kycLoading } = useKycStatus(); - const { balanceVisible } = useStore(); + const { balanceVisible, toggleBalanceVisible } = useStore(); const { data: subscription, isLoading: subscriptionLoading } = useSubscriptionCurrent(); const { data: summary } = useWalletSummary(); @@ -51,6 +51,7 @@ export default function PlansPage() { investedSats={investedSats} currentValueLkr={currentValueLkr} visible={balanceVisible} + onToggleVisible={toggleBalanceVisible} /> diff --git a/src/components/dashboard/activity/ActivityRow.tsx b/src/components/dashboard/activity/ActivityRow.tsx index 77a430f..3325bd2 100644 --- a/src/components/dashboard/activity/ActivityRow.tsx +++ b/src/components/dashboard/activity/ActivityRow.tsx @@ -131,7 +131,7 @@ export function ActivityRow({ item, visible }: ActivityRowProps) { BTC Value {isOutgoing ? "Sent" : "Received"}

- {formatSatoshis(item.settlement.btcSats)} BTC + {mask(`${formatSatoshis(item.settlement.btcSats)} BTC`)}

diff --git a/src/components/dashboard/plans/PlanHeroCard.tsx b/src/components/dashboard/plans/PlanHeroCard.tsx index e28f109..a4c2ff6 100644 --- a/src/components/dashboard/plans/PlanHeroCard.tsx +++ b/src/components/dashboard/plans/PlanHeroCard.tsx @@ -13,6 +13,7 @@ import { maskDigits, } from "@/lib/formatters"; import { getPlanIconSrc } from "@/components/dashboard/wallet/PlanSummaryCard"; +import { VisibleToggle } from "@/components/ui/visible-toggle"; import type { Subscription } from "@/lib/types"; export interface PlanHeroCardProps { @@ -21,6 +22,7 @@ export interface PlanHeroCardProps { investedSats: number; currentValueLkr: number; visible: boolean; + onToggleVisible: () => void; } export function PlanHeroCard({ @@ -29,6 +31,7 @@ export function PlanHeroCard({ investedSats, currentValueLkr, visible, + onToggleVisible, }: PlanHeroCardProps) { const router = useRouter(); const mask = (v: string) => maskDigits(v, visible); @@ -43,6 +46,7 @@ export function PlanHeroCard({

Manage My Plan

+ Manage My Plan

+

- LKR {fmtPriceCompact(avgBtcPrice)} + {mask(`LKR ${fmtPriceCompact(avgBtcPrice)}`)}

per BTC

{avgBtcPriceUsd !== undefined && (

- USD {fmtPriceCompact(avgBtcPriceUsd)} + {mask(`USD ${fmtPriceCompact(avgBtcPriceUsd)}`)}

per BTC

diff --git a/src/components/dashboard/wallet/PortfolioChart.tsx b/src/components/dashboard/wallet/PortfolioChart.tsx index 8023e58..c178551 100644 --- a/src/components/dashboard/wallet/PortfolioChart.tsx +++ b/src/components/dashboard/wallet/PortfolioChart.tsx @@ -81,6 +81,9 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart new Date(p.date).toLocaleDateString("en-GB", { day: "2-digit", month: "short" }) ); + const avgBtcPrice = + points.length > 0 ? points.reduce((sum, p) => sum + p.bitcoin, 0) / points.length : 0; + const data = { labels, datasets: [ @@ -117,6 +120,20 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart pointRadius: 0, borderWidth: 2, }, + { + label: "Avg BTC Price", + data: points.map(() => avgBtcPrice), + yAxisID: "y1", + borderColor: "#94a3b8", + backgroundColor: "transparent", + fill: false, + tension: 0, + pointRadius: 0, + pointHoverRadius: 0, + borderWidth: 1.5, + borderDash: [6, 4], + spanGaps: true, + }, ], }; @@ -227,6 +244,13 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart

Invested

+
+
+

Avg BTC

+
diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index 7e36c79..9459045 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -76,9 +76,8 @@ export function TotalValueCard({ {" "} - {mask( - `LKR ${fmtLkr(Math.abs(changeLkr))} (${isProfit ? "+" : "-"}${Math.abs(changePercent).toFixed(2)}%)` - )} + {mask(`LKR ${fmtLkr(Math.abs(changeLkr))}`)} + {` (${isProfit ? "+" : "-"}${Math.abs(changePercent).toFixed(2)}%)`} {" Last 24h"}

diff --git a/src/lib/formatters.ts b/src/lib/formatters.ts index e80f7ec..5af4a44 100644 --- a/src/lib/formatters.ts +++ b/src/lib/formatters.ts @@ -83,5 +83,5 @@ export function fmtActivityDateTime(dateInput: string | Date): string { // Blot out digits in a formatted string while keeping icons/currency codes/units // visible, e.g. "LKR 32,000" -> "LKR ****" when the user hides their balance. export function maskDigits(value: string, visible: boolean): string { - return visible ? value : value.replace(/[\d,.]+/g, "****"); + return visible ? value : value.replace(/[\d,.]+[KM]?/g, "****"); } From d48016eacb120bf323d2109c29e68038c11832e0 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 16:07:34 +0530 Subject: [PATCH 02/24] feat: calculate and display average BTC price in USD on WalletPage; add background overlay to PlanHeroCard and TotalValueCard --- src/app/dashboard/page.tsx | 5 +++++ src/components/dashboard/plans/PlanHeroCard.tsx | 1 + src/components/dashboard/wallet/TotalValueCard.tsx | 1 + 3 files changed, 7 insertions(+) diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 6f89e47..2cef5aa 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -36,6 +36,10 @@ export default function WalletPage() { ? transactions[transactions.length - 1].btc_price_at_purchase : avgBtcPrice); const currentBtcPriceUsd = summary?.current_btc_price?.usd; + const avgBtcPriceUsd = + currentBtcPriceUsd && currentBtcPrice + ? avgBtcPrice * (currentBtcPriceUsd / currentBtcPrice) + : undefined; return (
@@ -56,6 +60,7 @@ export default function WalletPage() { dcaSats={dcaSats} totalLkr={totalLkr} avgBtcPrice={avgBtcPrice} + avgBtcPriceUsd={avgBtcPriceUsd} currentBtcPrice={currentBtcPrice} currentBtcPriceUsd={currentBtcPriceUsd} visible={balanceVisible} diff --git a/src/components/dashboard/plans/PlanHeroCard.tsx b/src/components/dashboard/plans/PlanHeroCard.tsx index a4c2ff6..7b01f58 100644 --- a/src/components/dashboard/plans/PlanHeroCard.tsx +++ b/src/components/dashboard/plans/PlanHeroCard.tsx @@ -84,6 +84,7 @@ export function PlanHeroCard({ style={{ "--tgui--tertiary_bg_color": "transparent" } as React.CSSProperties} > +
diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index 9459045..5dd7fe6 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -34,6 +34,7 @@ export function TotalValueCard({ style={{ "--tgui--tertiary_bg_color": "transparent" } as React.CSSProperties} > +

Total Value

From b21bbac7887792e46cd36c2c03418f5c145898ee Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 16:15:27 +0530 Subject: [PATCH 03/24] feat: add loading components for Activity, Wallet, Plans, and Tasks; enhance UI with skeleton loaders --- src/app/dashboard/activity/loading.tsx | 20 +++++++++++++ src/app/dashboard/loading.tsx | 24 ++++++++++++++++ src/app/dashboard/plans/loading.tsx | 25 +++++++++++++++++ src/app/dashboard/tasks/loading.tsx | 26 +++++++++++++++++ src/app/payment/success/page.tsx | 3 +- src/components/bottomNavigation.tsx | 28 +++++++++++++++++-- .../dashboard/tasks/ReferralProgressCard.tsx | 2 +- .../dashboard/tasks/TaskHeroCard.tsx | 2 +- .../dashboard/wallet/TotalValueCard.tsx | 2 +- 9 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 src/app/dashboard/activity/loading.tsx create mode 100644 src/app/dashboard/loading.tsx create mode 100644 src/app/dashboard/plans/loading.tsx create mode 100644 src/app/dashboard/tasks/loading.tsx diff --git a/src/app/dashboard/activity/loading.tsx b/src/app/dashboard/activity/loading.tsx new file mode 100644 index 0000000..54a08f1 --- /dev/null +++ b/src/app/dashboard/activity/loading.tsx @@ -0,0 +1,20 @@ +import { ActivitySkeleton } from "@/components/dashboard/activity/ActivitySkeleton"; + +export default function ActivityLoading() { + return ( +
+
+
+
+
+ +
+
+
+
+
+ + +
+ ); +} diff --git a/src/app/dashboard/loading.tsx b/src/app/dashboard/loading.tsx new file mode 100644 index 0000000..445ec13 --- /dev/null +++ b/src/app/dashboard/loading.tsx @@ -0,0 +1,24 @@ +export default function WalletLoading() { + return ( +
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+
+ ); +} diff --git a/src/app/dashboard/plans/loading.tsx b/src/app/dashboard/plans/loading.tsx new file mode 100644 index 0000000..84fe4cd --- /dev/null +++ b/src/app/dashboard/plans/loading.tsx @@ -0,0 +1,25 @@ +export default function PlansLoading() { + return ( +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/src/app/dashboard/tasks/loading.tsx b/src/app/dashboard/tasks/loading.tsx new file mode 100644 index 0000000..a47cc28 --- /dev/null +++ b/src/app/dashboard/tasks/loading.tsx @@ -0,0 +1,26 @@ +export default function TasksLoading() { + return ( +
+
+ +
+
+
+
+
+ +
+ {Array.from({ length: 4 }).map((_, i) => ( +
+
+
+
+
+
+
+
+ ))} +
+
+ ); +} diff --git a/src/app/payment/success/page.tsx b/src/app/payment/success/page.tsx index e903e23..33adb71 100644 --- a/src/app/payment/success/page.tsx +++ b/src/app/payment/success/page.tsx @@ -20,8 +20,7 @@ export default function PaymentSuccessPage() {

- Your subscription is now active. Head back to the dashboard to start tracking your - rewards. + Your subscription is now active. Head back to the dashboard to start tracking your rewards.

diff --git a/src/components/bottomNavigation.tsx b/src/components/bottomNavigation.tsx index 47d6320..d2fc715 100644 --- a/src/components/bottomNavigation.tsx +++ b/src/components/bottomNavigation.tsx @@ -1,5 +1,6 @@ "use client"; +import { useEffect, useState } from "react"; import { usePathname, useRouter } from "next/navigation"; import { SegmentedControl } from "@telegram-apps/telegram-ui"; import { cn } from "@/lib/cn"; @@ -94,6 +95,25 @@ export default function BottomNavigation() { const router = useRouter(); const { isDark } = useTheme(); + // Router navigation resolves the destination route segment before the pathname + // (and thus `isActive` below) updates, which made the pill lag behind the tap. + // Track the tapped href locally so the pill jumps immediately; it's cleared once + // `pathname` catches up to the real route. Reset during render (not an effect) per + // https://react.dev/learn/you-might-not-need-an-effect#adjusting-some-state-when-a-prop-changes + const [prevPathname, setPrevPathname] = useState(pathname); + const [pendingHref, setPendingHref] = useState(null); + + if (pathname !== prevPathname) { + setPrevPathname(pathname); + setPendingHref(null); + } + + useEffect(() => { + navItems.forEach((item) => router.prefetch(item.href)); + }, [router]); + + const activeHref = pendingHref ?? pathname; + return (
{navItems.map((item) => { - const isActive = pathname === item.href; + const isActive = activeHref === item.href; return ( router.push(item.href)} + onClick={() => { + if (item.href === pathname) return; + setPendingHref(item.href); + router.push(item.href); + }} className={cn( "h-14! w-auto! rounded-[20px]! p-0! whitespace-normal!", "transition-colors duration-200", diff --git a/src/components/dashboard/tasks/ReferralProgressCard.tsx b/src/components/dashboard/tasks/ReferralProgressCard.tsx index 2e1fcd9..606ab56 100644 --- a/src/components/dashboard/tasks/ReferralProgressCard.tsx +++ b/src/components/dashboard/tasks/ReferralProgressCard.tsx @@ -29,7 +29,7 @@ export function ReferralProgressCard({ joined, target, rewardSats }: ReferralPro diff --git a/src/components/dashboard/tasks/TaskHeroCard.tsx b/src/components/dashboard/tasks/TaskHeroCard.tsx index daca184..83dcf4f 100644 --- a/src/components/dashboard/tasks/TaskHeroCard.tsx +++ b/src/components/dashboard/tasks/TaskHeroCard.tsx @@ -32,7 +32,7 @@ export function TaskHeroCard({ stats, visible }: TaskHeroCardProps) { return ( diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index 5dd7fe6..ce56680 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -38,7 +38,7 @@ export function TotalValueCard({

Total Value

-
+

LKR

From 3846f2a75614f2ddb9a2c2bb3b2e385dfb851643 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 16:48:08 +0530 Subject: [PATCH 04/24] feat: enhance navigation item activation logic and improve PortfolioChart period handling with transitions --- src/components/bottomNavigation.tsx | 9 ++++- .../dashboard/wallet/DashboardTopBar.tsx | 2 +- .../dashboard/wallet/PortfolioChart.tsx | 38 +++++++++++++------ 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/components/bottomNavigation.tsx b/src/components/bottomNavigation.tsx index d2fc715..50e9b14 100644 --- a/src/components/bottomNavigation.tsx +++ b/src/components/bottomNavigation.tsx @@ -88,6 +88,13 @@ const navItems = [ { href: "/dashboard/news", Icon: NewsIcon, label: "News" }, ]; +// "/dashboard" is a prefix of every other item's href, so it only matches exactly; +// nested routes (e.g. /dashboard/news/[id]) should still highlight their parent tab. +function isNavItemActive(href: string, activeHref: string) { + if (href === "/dashboard") return activeHref === href; + return activeHref === href || activeHref.startsWith(`${href}/`); +} + // SegmentedControl is a plain (non-fixed) element, unlike Tabbar which ships its own // FixedLayout — so the fixed bottom-pill positioning lives on this wrapper instead. export default function BottomNavigation() { @@ -130,7 +137,7 @@ export default function BottomNavigation() { } > {navItems.map((item) => { - const isActive = activeHref === item.href; + const isActive = isNavItemActive(item.href, activeHref); return ( -

+

{displayName}

diff --git a/src/components/dashboard/wallet/PortfolioChart.tsx b/src/components/dashboard/wallet/PortfolioChart.tsx index c178551..4477e70 100644 --- a/src/components/dashboard/wallet/PortfolioChart.tsx +++ b/src/components/dashboard/wallet/PortfolioChart.tsx @@ -1,6 +1,6 @@ "use client"; -import { useMemo, useState } from "react"; +import { useMemo, useState, useTransition } from "react"; import { Line } from "react-chartjs-2"; import { Chart as ChartJS, @@ -69,13 +69,23 @@ export interface PortfolioChartProps { export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChartProps) { const { isDark } = useTheme(); - const [period, setPeriod] = useState("3M"); + // The pill highlight (`selectedPeriod`) updates immediately on click; the chart-driving + // `chartPeriod` updates inside a transition so filtering/re-rendering the chart doesn't + // delay the button's own paint. + const [selectedPeriod, setSelectedPeriod] = useState("3M"); + const [chartPeriod, setChartPeriod] = useState("3M"); + const [isPending, startTransition] = useTransition(); + + const handlePeriodClick = (p: Period) => { + setSelectedPeriod(p); + startTransition(() => setChartPeriod(p)); + }; const allPoints = useMemo( () => buildPoints(transactions, currentBtcPrice), [transactions, currentBtcPrice] ); - const points = useMemo(() => filterByPeriod(allPoints, period), [allPoints, period]); + const points = useMemo(() => filterByPeriod(allPoints, chartPeriod), [allPoints, chartPeriod]); const labels = points.map((p) => new Date(p.date).toLocaleDateString("en-GB", { day: "2-digit", month: "short" }) @@ -204,13 +214,19 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart mode="gray" size="s" stretched - onClick={() => setPeriod(p)} - className={cn( - "rounded-[12px]!" - // period === p - // ? "bg-[#e2e8f0]! text-[#1b2027]! dark:bg-[#334155]! dark:text-[#f1f5f9]!" - // : "bg-[#eeeff3]! text-[#64748b]! dark:bg-transparent! dark:text-[#94a3b8]!" - )} + onClick={() => handlePeriodClick(p)} + style={ + { + "--tgui--button--hovered-opacity": 0, + backgroundColor: + selectedPeriod === p ? "#1f2a36" : isDark ? "#1e293b" : "#eeeff3", + color: selectedPeriod === p ? "#fff" : isDark ? "#94a3b8" : "#64748b", + } as React.CSSProperties + } + // tgui's Button renders a square `:after` hover overlay that isn't clipped to + // its own border-radius, so its corners poke out past the pill on mouse hover + // unless the button itself clips overflow. + className="overflow-hidden! rounded-[12px]!" > {p} @@ -226,7 +242,7 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart

) : ( -
+
)} From 0d090fd7ec389a1283ecb5128c5405a1cc715298 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 16:54:23 +0530 Subject: [PATCH 05/24] feat: replace fmtLkr with fmtLkrCurrency for consistent currency formatting across components --- src/app/plans/choose/page.tsx | 15 ++++++--------- .../dashboard/activity/ActivityRow.tsx | 5 +++-- src/components/dashboard/plans/GiftRow.tsx | 4 ++-- .../dashboard/plans/PlanHeroCard.tsx | 10 +++++----- .../dashboard/tasks/TaskHeroCard.tsx | 4 ++-- .../dashboard/wallet/PerformanceGrid.tsx | 18 ++++++++++++------ .../dashboard/wallet/PlanSummaryCard.tsx | 4 ++-- .../dashboard/wallet/PortfolioChart.tsx | 4 ++-- .../dashboard/wallet/TotalValueCard.tsx | 8 ++++---- src/lib/formatters.ts | 15 ++++++++++++++- 10 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/app/plans/choose/page.tsx b/src/app/plans/choose/page.tsx index 02ff7dc..84d1c4a 100644 --- a/src/app/plans/choose/page.tsx +++ b/src/app/plans/choose/page.tsx @@ -19,13 +19,10 @@ import { PageTitle } from "@/components/ui/page-title"; import { TogglePlan, type PlanDuration } from "@/components/ui/toggle-plan"; import { PlanCard } from "@/components/ui/plan-card"; import { getPlanIconSrc } from "@/components/dashboard/wallet/PlanSummaryCard"; +import { fmtLkrCurrency } from "@/lib/formatters"; import type { SubscriptionPlan } from "@/lib/types"; import Link from "next/link"; -function fmtLkr(n: number) { - return `Rs ${n.toLocaleString("en-US", { maximumFractionDigits: 0 })}`; -} - function perMonthAmount(plan: SubscriptionPlan) { return plan.type === "weekly" ? plan.amount * 4 : plan.amount; } @@ -168,10 +165,10 @@ export default function ChoosePlanPage() { /> } name={currentPlan.name} - price={fmtLkr(currentPlan.amount)} + price={fmtLkrCurrency(currentPlan.amount)} period={`/${currentPlan.type === "weekly" ? "week" : "month"}`} description={currentPlan.features?.[0] ?? "Bitcoin membership rewards"} - perYear={`Per Year ${fmtLkr(perMonthAmount(currentPlan) * 12)}`} + perYear={`Per Year ${fmtLkrCurrency(perMonthAmount(currentPlan) * 12)}`} active />
@@ -213,11 +210,11 @@ export default function ChoosePlanPage() { /> } name={plan.name} - price={fmtLkr(plan.amount)} + price={fmtLkrCurrency(plan.amount)} period={`/${plan.type === "weekly" ? "week" : "month"}`} description={plan.features?.[0] ?? "Bitcoin membership rewards"} - perMonth={`Per Month ${fmtLkr(perMonth)}`} - perYear={`Per Year ${fmtLkr(perYear)}`} + perMonth={`Per Month ${fmtLkrCurrency(perMonth)}`} + perYear={`Per Year ${fmtLkrCurrency(perYear)}`} selected={selectedPlanId === plan.id} mostPopular={plan.popular} onSelect={() => setSelectedId(plan.id)} diff --git a/src/components/dashboard/activity/ActivityRow.tsx b/src/components/dashboard/activity/ActivityRow.tsx index 3325bd2..0e5bf46 100644 --- a/src/components/dashboard/activity/ActivityRow.tsx +++ b/src/components/dashboard/activity/ActivityRow.tsx @@ -9,6 +9,7 @@ import { ACTIVITY_ICON, ACTIVITY_TITLE } from "@/lib/activity"; import { fmtActivityTime, fmtLkr, + fmtLkrCurrency, fmtPriceCompact, fmtShortDate, formatSatoshis, @@ -72,7 +73,7 @@ export function ActivityRow({ item, visible }: ActivityRowProps) { {mask(`${isOutgoing ? "-" : "+"}${fmtLkr(Math.abs(item.sats))} sats`)}

- {mask(`≈ LKR ${fmtLkr(item.lkr)}`)} + {mask(`≈ ${fmtLkrCurrency(item.lkr)}`)}

/ BTC · )} - LKR{" "} + රු.{" "} {fmtPriceCompact(item.settlement.btcPriceLkr)} / BTC

diff --git a/src/components/dashboard/plans/GiftRow.tsx b/src/components/dashboard/plans/GiftRow.tsx index 433b1ec..cd06979 100644 --- a/src/components/dashboard/plans/GiftRow.tsx +++ b/src/components/dashboard/plans/GiftRow.tsx @@ -4,7 +4,7 @@ import Image from "next/image"; import { ChevronRight } from "lucide-react"; import { Cell } from "@telegram-apps/telegram-ui"; import { ACTIVITY_ICON } from "@/lib/activity"; -import { fmtActivityDateTime, fmtLkr, maskDigits } from "@/lib/formatters"; +import { fmtActivityDateTime, fmtLkr, fmtLkrCurrency, maskDigits } from "@/lib/formatters"; import type { ActivityItem } from "@/lib/types"; export interface GiftRowProps { @@ -41,7 +41,7 @@ export function GiftRow({ item, visible }: GiftRowProps) { {mask(`${isOutgoing ? "-" : "+"}${fmtLkr(Math.abs(item.sats))} sats`)}

- {mask(`≈ LKR ${fmtLkr(item.lkr)}`)} + {mask(`≈ ${fmtLkrCurrency(item.lkr)}`)}

diff --git a/src/components/dashboard/plans/PlanHeroCard.tsx b/src/components/dashboard/plans/PlanHeroCard.tsx index 7b01f58..39b4441 100644 --- a/src/components/dashboard/plans/PlanHeroCard.tsx +++ b/src/components/dashboard/plans/PlanHeroCard.tsx @@ -6,7 +6,7 @@ import { useRouter } from "next/navigation"; import { ChevronRight } from "lucide-react"; import { Card, Badge, Button, Cell, Navigation } from "@telegram-apps/telegram-ui"; import { - fmtLkr, + fmtLkrCurrency, fmtSatsCompact, fmtShortDate, fmtRelativeDays, @@ -102,7 +102,7 @@ export function PlanHeroCard({

- Rs {fmtLkr(subscription.price)} + {fmtLkrCurrency(subscription.price)}

/{subscription.planType === "weekly" ? "week" : "month"} @@ -176,7 +176,7 @@ export function PlanHeroCard({

You Invested

- {mask(`LKR ${fmtLkr(investedLkr)}`)} + {mask(fmtLkrCurrency(investedLkr))}

{mask( @@ -188,7 +188,7 @@ export function PlanHeroCard({

Current Value

- {mask(`LKR ${fmtLkr(currentValueLkr)}`)} + {mask(fmtLkrCurrency(currentValueLkr))}

{investedLkr > 0 && ( {mask( - `${isProfit ? "+" : "-"}${Math.abs(profitPct).toFixed(0)}% · LKR ${fmtLkr( + `${isProfit ? "+" : "-"}${Math.abs(profitPct).toFixed(0)}% · ${fmtLkrCurrency( Math.abs(profitLkr) )}` )} diff --git a/src/components/dashboard/tasks/TaskHeroCard.tsx b/src/components/dashboard/tasks/TaskHeroCard.tsx index 83dcf4f..ad24056 100644 --- a/src/components/dashboard/tasks/TaskHeroCard.tsx +++ b/src/components/dashboard/tasks/TaskHeroCard.tsx @@ -2,7 +2,7 @@ import { Card } from "@telegram-apps/telegram-ui"; import Image from "next/image"; -import { fmtLkr, fmtSatsCompact, maskDigits } from "@/lib/formatters"; +import { fmtLkrCurrency, fmtSatsCompact, maskDigits } from "@/lib/formatters"; // Matches mock-wallet-data.ts's avg_btc_price so figures stay consistent across pages. const BTC_PRICE_LKR = 29_500_000; @@ -23,7 +23,7 @@ export interface TaskHeroCardProps { function btcLkrLabel(sats: number): string { const btc = sats / 1e8; const lkr = btc * BTC_PRICE_LKR; - return `₿${btc.toFixed(5)} · LKR ${fmtLkr(lkr)}`; + return `₿${btc.toFixed(5)} · ${fmtLkrCurrency(lkr)}`; } export function TaskHeroCard({ stats, visible }: TaskHeroCardProps) { diff --git a/src/components/dashboard/wallet/PerformanceGrid.tsx b/src/components/dashboard/wallet/PerformanceGrid.tsx index c1904e2..172e061 100644 --- a/src/components/dashboard/wallet/PerformanceGrid.tsx +++ b/src/components/dashboard/wallet/PerformanceGrid.tsx @@ -2,7 +2,13 @@ import Image from "next/image"; import { Card, Badge } from "@telegram-apps/telegram-ui"; -import { fmtLkr, fmtPriceCompact, fmtSatsCompact, maskDigits } from "@/lib/formatters"; +import { + fmtLkrCurrency, + fmtLkrCurrencyCompact, + fmtPriceCompact, + fmtSatsCompact, + maskDigits, +} from "@/lib/formatters"; const CARD_SURFACE_STYLE = { "--tgui--tertiary_bg_color": "var(--color-surface-primary)", @@ -55,7 +61,7 @@ export function PerformanceGrid({ You Invested

- {mask(`LKR ${fmtLkr(dcaSpent)}`)} + {mask(fmtLkrCurrency(dcaSpent))}

@@ -79,7 +85,7 @@ export function PerformanceGrid({

- {mask(`LKR ${fmtLkr(totalLkr)}`)} + {mask(fmtLkrCurrency(totalLkr))}

{dcaSpent > 0 && ( {mask( - `LKR ${fmtLkr(Math.abs(profitLkr))} (${isProfit ? "+" : "-"} ${Math.abs(profitPct).toFixed(0)}%)` + `${fmtLkrCurrency(Math.abs(profitLkr))} (${isProfit ? "+" : "-"} ${Math.abs(profitPct).toFixed(0)}%)` )} )} @@ -113,7 +119,7 @@ export function PerformanceGrid({

- {mask(`LKR ${fmtPriceCompact(avgBtcPrice)}`)} + {mask(fmtLkrCurrencyCompact(avgBtcPrice))}

per BTC

@@ -138,7 +144,7 @@ export function PerformanceGrid({

- LKR {fmtPriceCompact(currentBtcPrice)} + {fmtLkrCurrencyCompact(currentBtcPrice)}

per BTC

diff --git a/src/components/dashboard/wallet/PlanSummaryCard.tsx b/src/components/dashboard/wallet/PlanSummaryCard.tsx index 2b840e9..107114d 100644 --- a/src/components/dashboard/wallet/PlanSummaryCard.tsx +++ b/src/components/dashboard/wallet/PlanSummaryCard.tsx @@ -3,7 +3,7 @@ import Image from "next/image"; import Link from "next/link"; import { Card, Badge, Cell, Navigation } from "@telegram-apps/telegram-ui"; -import { fmtLkr, fmtShortDate, fmtRelativeDays } from "@/lib/formatters"; +import { fmtLkrCurrency, fmtShortDate, fmtRelativeDays } from "@/lib/formatters"; import type { Subscription } from "@/lib/types"; const CARD_SURFACE_STYLE = { @@ -119,7 +119,7 @@ export function PlanSummaryCard({ subscription }: PlanSummaryCardProps) { {subscription ? (

- Rs {fmtLkr(subscription.price)} + {fmtLkrCurrency(subscription.price)}

/{subscription.planType === "weekly" ? "week" : "month"} diff --git a/src/components/dashboard/wallet/PortfolioChart.tsx b/src/components/dashboard/wallet/PortfolioChart.tsx index 4477e70..badf822 100644 --- a/src/components/dashboard/wallet/PortfolioChart.tsx +++ b/src/components/dashboard/wallet/PortfolioChart.tsx @@ -14,7 +14,7 @@ import { } from "chart.js"; import { Card, Button } from "@telegram-apps/telegram-ui"; import { cn } from "@/lib/cn"; -import { fmtLkr, fmtPriceCompact } from "@/lib/formatters"; +import { fmtLkrCurrency, fmtPriceCompact } from "@/lib/formatters"; import { useTheme } from "@/app/context/theme"; import type { DcaTransaction } from "@/hooks/query/useTransactionHistory"; @@ -161,7 +161,7 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart cornerRadius: 8, callbacks: { label: (context: TooltipItem<"line">) => - `${context.dataset.label}: LKR ${fmtLkr(Math.round(context.parsed.y ?? 0))}`, + `${context.dataset.label}: ${fmtLkrCurrency(Math.round(context.parsed.y ?? 0))}`, }, }, }, diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index ce56680..d43cb48 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -3,7 +3,7 @@ import Image from "next/image"; import { ChevronDown, TrendingUp, TrendingDown } from "lucide-react"; import { Card, Badge } from "@telegram-apps/telegram-ui"; -import { fmtLkr, fmtSatsCompact, maskDigits } from "@/lib/formatters"; +import { fmtLkrCurrency, fmtSatsCompact, maskDigits } from "@/lib/formatters"; // Card/Badge theme their background/color through --tgui-- CSS variables (same // convention as --tgui--cell--middle--padding on the homepage Cell) — override those @@ -39,13 +39,13 @@ export function TotalValueCard({

Total Value

-

LKR

+

රු.

- {mask(`≈ LKR ${fmtLkr(totalLkr)}`)} + {mask(`≈ ${fmtLkrCurrency(totalLkr)}`)}

@@ -77,7 +77,7 @@ export function TotalValueCard({ {" "} - {mask(`LKR ${fmtLkr(Math.abs(changeLkr))}`)} + {mask(fmtLkrCurrency(Math.abs(changeLkr)))} {` (${isProfit ? "+" : "-"}${Math.abs(changePercent).toFixed(2)}%)`} {" Last 24h"} diff --git a/src/lib/formatters.ts b/src/lib/formatters.ts index 5af4a44..9838829 100644 --- a/src/lib/formatters.ts +++ b/src/lib/formatters.ts @@ -30,6 +30,19 @@ export function fmtLkr(value: number): string { return value.toLocaleString("en-US", { maximumFractionDigits: 0 }); } +// Sri Lankan Rupee symbol used in place of the "LKR" code throughout the UI +export const LKR_SYMBOL = "රු."; + +// Full LKR amount with the රු. symbol (e.g. 45700 -> "රු. 45,700") +export function fmtLkrCurrency(value: number): string { + return `${LKR_SYMBOL} ${fmtLkr(value)}`; +} + +// Compact LKR amount with the රු. symbol (e.g. 29500000 -> "රු. 29.5M") +export function fmtLkrCurrencyCompact(value: number): string { + return `${LKR_SYMBOL} ${fmtPriceCompact(value)}`; +} + // Compact satoshi count (e.g. 214000 -> "214K") export function fmtSatsCompact(sats: number): string { if (sats >= 1_000_000) return `${(sats / 1_000_000).toFixed(1)}M`; @@ -81,7 +94,7 @@ export function fmtActivityDateTime(dateInput: string | Date): string { } // Blot out digits in a formatted string while keeping icons/currency codes/units -// visible, e.g. "LKR 32,000" -> "LKR ****" when the user hides their balance. +// visible, e.g. "රු. 32,000" -> "රු. ****" when the user hides their balance. export function maskDigits(value: string, visible: boolean): string { return visible ? value : value.replace(/[\d,.]+[KM]?/g, "****"); } From 8a97124e71004f08d6a5f19cf390a992cfbd6e36 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 17:02:30 +0530 Subject: [PATCH 06/24] feat: update formatting for investment display in PlanHeroCard, PerformanceGrid, and TotalValueCard; remove unnecessary elements for cleaner UI --- src/app/error.tsx | 1 - src/components/dashboard/plans/PlanHeroCard.tsx | 2 +- src/components/dashboard/wallet/PerformanceGrid.tsx | 2 +- src/components/dashboard/wallet/TotalValueCard.tsx | 1 - 4 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/error.tsx b/src/app/error.tsx index a687701..c9df3d8 100644 --- a/src/app/error.tsx +++ b/src/app/error.tsx @@ -51,7 +51,6 @@ export default function Error({
diff --git a/src/components/dashboard/wallet/PerformanceGrid.tsx b/src/components/dashboard/wallet/PerformanceGrid.tsx index 172e061..f56ef27 100644 --- a/src/components/dashboard/wallet/PerformanceGrid.tsx +++ b/src/components/dashboard/wallet/PerformanceGrid.tsx @@ -69,7 +69,7 @@ export function PerformanceGrid({

- {mask(`丰 ${fmtSatsCompact(dcaSats)}`)} + {mask(`≈ 丰 ${fmtSatsCompact(dcaSats)}`)}

diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index d43cb48..6f3bbfa 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -57,7 +57,6 @@ export function TotalValueCard({
{mask(`丰 ${fmtSatsCompact(totalSats)}`)} - SATS
From 1a1c73139db3aa2bfdf2990ca13c6e80a5645108 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 17:06:30 +0530 Subject: [PATCH 07/24] feat: add loading state to PerformanceGrid and WalletPage; implement skeleton loaders for improved UI experience --- src/app/dashboard/page.tsx | 3 +- .../dashboard/wallet/PerformanceGrid.tsx | 140 ++++++++++++------ 2 files changed, 93 insertions(+), 50 deletions(-) diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 2cef5aa..8cd42b2 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -14,7 +14,7 @@ export default function WalletPage() { const { balanceVisible } = useStore(); const { subscription } = useUser(); - const { data: summary } = useWalletSummary(); + const { data: summary, isLoading: isSummaryLoading } = useWalletSummary(); const { data: transactions } = useTransactionHistory(); const totalLkr = summary @@ -64,6 +64,7 @@ export default function WalletPage() { currentBtcPrice={currentBtcPrice} currentBtcPriceUsd={currentBtcPriceUsd} visible={balanceVisible} + isLoading={isSummaryLoading} /> diff --git a/src/components/dashboard/wallet/PerformanceGrid.tsx b/src/components/dashboard/wallet/PerformanceGrid.tsx index f56ef27..8a18322 100644 --- a/src/components/dashboard/wallet/PerformanceGrid.tsx +++ b/src/components/dashboard/wallet/PerformanceGrid.tsx @@ -27,6 +27,15 @@ export interface PerformanceGridProps { currentBtcPrice: number; currentBtcPriceUsd?: number; visible: boolean; + isLoading?: boolean; +} + +function ValueSkeleton({ className = "" }: { className?: string }) { + return ( + + ); } export function PerformanceGrid({ @@ -38,6 +47,7 @@ export function PerformanceGrid({ currentBtcPrice, currentBtcPriceUsd, visible, + isLoading = false, }: PerformanceGridProps) { const mask = (v: string) => maskDigits(v, visible); const profitLkr = totalLkr - dcaSpent; @@ -60,18 +70,26 @@ export function PerformanceGrid({

You Invested

-

- {mask(fmtLkrCurrency(dcaSpent))} -

-
-

- {mask(`₿ ${(dcaSats / 1e8).toFixed(5)}`)} -

-
-

- {mask(`≈ 丰 ${fmtSatsCompact(dcaSats)}`)} + {isLoading ? ( + + ) : ( +

+ {mask(fmtLkrCurrency(dcaSpent))}

-
+ )} + {isLoading ? ( + + ) : ( +
+

+ {mask(`₿ ${(dcaSats / 1e8).toFixed(5)}`)} +

+
+

+ {mask(`≈ 丰 ${fmtSatsCompact(dcaSats)}`)} +

+
+ )}
-

- {mask(fmtLkrCurrency(totalLkr))} -

- {dcaSpent > 0 && ( - - {mask( - `${fmtLkrCurrency(Math.abs(profitLkr))} (${isProfit ? "+" : "-"} ${Math.abs(profitPct).toFixed(0)}%)` - )} - + {isLoading ? ( + + ) : ( +

+ {mask(fmtLkrCurrency(totalLkr))} +

+ )} + {isLoading ? ( + + ) : ( + dcaSpent > 0 && ( + + {mask( + `${fmtLkrCurrency(Math.abs(profitLkr))} (${isProfit ? "+" : "-"} ${Math.abs(profitPct).toFixed(0)}%)` + )} + + ) )}
@@ -117,20 +143,28 @@ export function PerformanceGrid({

Avg Price

-
-

- {mask(fmtLkrCurrencyCompact(avgBtcPrice))} -

-

per BTC

-
- {avgBtcPriceUsd !== undefined && ( + {isLoading ? ( + + ) : (
-

- {mask(`USD ${fmtPriceCompact(avgBtcPriceUsd)}`)} +

+ {mask(fmtLkrCurrencyCompact(avgBtcPrice))}

per BTC

)} + {isLoading ? ( + + ) : ( + avgBtcPriceUsd !== undefined && ( +
+

+ {mask(`USD ${fmtPriceCompact(avgBtcPriceUsd)}`)} +

+

per BTC

+
+ ) + )} Current Price

-
-

- {fmtLkrCurrencyCompact(currentBtcPrice)} -

-

per BTC

-
- {currentBtcPriceUsd !== undefined && ( + {isLoading ? ( + + ) : (
-

- USD {fmtPriceCompact(currentBtcPriceUsd)} +

+ {fmtLkrCurrencyCompact(currentBtcPrice)}

per BTC

)} + {isLoading ? ( + + ) : ( + currentBtcPriceUsd !== undefined && ( +
+

+ USD {fmtPriceCompact(currentBtcPriceUsd)} +

+

per BTC

+
+ ) + )}
From bc59527d9c4552b0b0df943c080c24aafe04499c Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 17:06:33 +0530 Subject: [PATCH 08/24] feat: enhance navigation logic in ChoosePlanPage to prevent redirect loops by falling back to wallet page --- src/app/plans/choose/page.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/plans/choose/page.tsx b/src/app/plans/choose/page.tsx index 84d1c4a..8ab2f17 100644 --- a/src/app/plans/choose/page.tsx +++ b/src/app/plans/choose/page.tsx @@ -50,7 +50,11 @@ export default function ChoosePlanPage() { const { data: fetchedPackages, isLoading: packagesLoading } = usePackages(); const packages = fetchedPackages ?? EMPTY_PLANS; - useTelegramBackButton(() => router.push("/dashboard/plans")); + // Without an active plan, /dashboard/plans immediately redirects back here — + // going back there would loop, so fall back to the wallet page instead. + useTelegramBackButton(() => + router.push(subscription?.isActive ? "/dashboard/plans" : "/dashboard") + ); const currentPlan = useMemo( () => From f1f074aee96e4fc623c04b95373ac55c88d97e8c Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 17:26:03 +0530 Subject: [PATCH 09/24] feat: integrate haptic feedback across various components for enhanced user interaction --- src/app/plans/choose/page.tsx | 14 +++++++++- src/app/verification/details/page.tsx | 4 +++ src/app/verification/page.tsx | 28 ++++++++++++++++--- src/components/bottomNavigation.tsx | 2 ++ .../dashboard/activity/ActivityTabs.tsx | 6 +++- .../dashboard/plans/GiftFilterTabs.tsx | 6 +++- .../dashboard/plans/KycRequiredNotice.tsx | 6 +++- .../dashboard/tasks/ManageTasksSection.tsx | 7 +++-- .../dashboard/tasks/TaskFilterTabs.tsx | 6 +++- src/components/ui/copy-field.tsx | 2 ++ src/components/ui/plan-card.tsx | 10 ++++++- src/components/ui/visible-toggle.tsx | 11 +++++++- src/lib/haptics.ts | 19 +++++++++++++ 13 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 src/lib/haptics.ts diff --git a/src/app/plans/choose/page.tsx b/src/app/plans/choose/page.tsx index 8ab2f17..1d96285 100644 --- a/src/app/plans/choose/page.tsx +++ b/src/app/plans/choose/page.tsx @@ -8,6 +8,7 @@ import { Button, Snackbar } from "@telegram-apps/telegram-ui"; import { CheckCircle2, AlertCircle } from "lucide-react"; import { getAuthTokenFromStorage } from "@/lib/auth"; import { usePayHereRedirect } from "@/lib/hooks"; +import { haptic } from "@/lib/haptics"; import { usePackages } from "@/hooks/query/usePackages"; import { useCancelSubscription } from "@/hooks/query/useCancelSubscription"; import { useUser } from "@/hooks/useUser"; @@ -72,6 +73,7 @@ export default function ChoosePlanPage() { const selectedPlanId = selectedId ?? filteredPlans[0]?.id; const handleDurationChange = (d: PlanDuration) => { + haptic.select(); setDuration(d); setSelectedId(undefined); }; @@ -80,6 +82,8 @@ export default function ChoosePlanPage() { const plan = packages.find((p) => p.id === selectedPlanId); if (!plan || !authToken) return; + haptic.impact("medium"); + try { setPayhereLinkLoading(true); const res = await fetch("/api/subscription/payhere-link", { @@ -100,8 +104,12 @@ export default function ChoosePlanPage() { throw new Error(result.message || "Failed to generate payment link"); } - if (result.link) redirectToPayHereViaPage(result.link); + if (result.link) { + haptic.notify("success"); + redirectToPayHereViaPage(result.link); + } } catch (err) { + haptic.notify("error"); console.error(err); } finally { setPayhereLinkLoading(false); @@ -119,8 +127,11 @@ export default function ChoosePlanPage() { }); if (buttonId !== "cancel") return; + haptic.impact("rigid"); + try { await cancelSubscription.mutateAsync(); + haptic.notify("success"); setSnackbar({ tone: "success", title: "Plan Cancelled", @@ -128,6 +139,7 @@ export default function ChoosePlanPage() { }); setTimeout(() => router.push("/dashboard/plans"), 1500); } catch (err) { + haptic.notify("error"); setSnackbar({ tone: "error", title: "Cancellation Failed", diff --git a/src/app/verification/details/page.tsx b/src/app/verification/details/page.tsx index 9034910..f689e3b 100644 --- a/src/app/verification/details/page.tsx +++ b/src/app/verification/details/page.tsx @@ -7,6 +7,7 @@ import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useKycInitiate, useUpdateProfile } from "@/hooks/query/useKyc"; import { useTelegramBackButton } from "@/hooks/useTgBackButton"; +import { haptic } from "@/lib/haptics"; import { createUserSchema, type CreateUserFormData } from "@/lib/validations"; const FIELDS: Array<{ @@ -59,6 +60,7 @@ export default function VerificationDetailsPage() { : null; const onSubmit = (formData: CreateUserFormData) => { + haptic.impact("light"); updateProfile.mutate( { first_name: formData.first_name, @@ -83,9 +85,11 @@ export default function VerificationDetailsPage() { window.location.href = result.url; } }, + onError: () => haptic.notify("error"), } ); }, + onError: () => haptic.notify("error"), } ); }; diff --git a/src/app/verification/page.tsx b/src/app/verification/page.tsx index 62f02b2..c108871 100644 --- a/src/app/verification/page.tsx +++ b/src/app/verification/page.tsx @@ -11,6 +11,7 @@ import { VisuallyHidden } from "@radix-ui/react-visually-hidden"; import { useTelegramPlatform } from "@/hooks/useTelegramPlatform"; import { useKycStatus } from "@/hooks/query/useKyc"; import { useTelegramBackButton } from "@/hooks/useTgBackButton"; +import { haptic } from "@/lib/haptics"; import type { User } from "@/lib/types"; type VerificationStatus = NonNullable | null; @@ -108,12 +109,14 @@ export default function VerificationIntroPage() { useEffect(() => { if (status === "APPROVED") { + haptic.notify("success"); const timeout = setTimeout(() => router.push("/plans/choose"), 2000); return () => clearTimeout(timeout); } }, [status, router]); const initiateVerification = () => { + haptic.impact("light"); if (!isMobile) { setShowMobileWarning(true); return; @@ -123,6 +126,7 @@ export default function VerificationIntroPage() { }; const continueVerification = () => { + haptic.impact("light"); if (!isMobile) { setShowMobileWarning(true); return; @@ -222,7 +226,10 @@ export default function VerificationIntroPage() { size="l" stretched style={{ borderRadius: "12px" }} - onClick={() => router.push("/plans/choose")} + onClick={() => { + haptic.impact("light"); + router.push("/plans/choose"); + }} > Continue to Plans @@ -232,7 +239,14 @@ export default function VerificationIntroPage() { size="l" stretched style={{ borderRadius: "12px" }} - onClick={verificationUrl ? continueVerification : () => refetchKycStatus()} + onClick={ + verificationUrl + ? continueVerification + : () => { + haptic.impact("light"); + refetchKycStatus(); + } + } > {verificationUrl ? "Continue Verification" : "Check Verification Status"} @@ -249,7 +263,10 @@ export default function VerificationIntroPage() { "--tgui--plain_foreground": "#fa7119", } as React.CSSProperties } - onClick={() => router.push("/dashboard")} + onClick={() => { + haptic.impact("light"); + router.push("/dashboard"); + }} > Back to Home @@ -327,7 +344,10 @@ export default function VerificationIntroPage() { size="l" stretched style={{ borderRadius: "12px" }} - onClick={() => setShowMobileWarning(false)} + onClick={() => { + haptic.impact("light"); + setShowMobileWarning(false); + }} > Got It diff --git a/src/components/bottomNavigation.tsx b/src/components/bottomNavigation.tsx index 50e9b14..6483a17 100644 --- a/src/components/bottomNavigation.tsx +++ b/src/components/bottomNavigation.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from "react"; import { usePathname, useRouter } from "next/navigation"; import { SegmentedControl } from "@telegram-apps/telegram-ui"; import { cn } from "@/lib/cn"; +import { haptic } from "@/lib/haptics"; import { useTheme } from "@/app/context/theme"; // Icons are inlined (not next/image) so `fill="currentColor"` can pick up the @@ -145,6 +146,7 @@ export default function BottomNavigation() { selected={isActive} onClick={() => { if (item.href === pathname) return; + haptic.select(); setPendingHref(item.href); router.push(item.href); }} diff --git a/src/components/dashboard/activity/ActivityTabs.tsx b/src/components/dashboard/activity/ActivityTabs.tsx index 95e50e7..c44c6f1 100644 --- a/src/components/dashboard/activity/ActivityTabs.tsx +++ b/src/components/dashboard/activity/ActivityTabs.tsx @@ -2,6 +2,7 @@ import { Button } from "@telegram-apps/telegram-ui"; import { cn } from "@/lib/cn"; +import { haptic } from "@/lib/haptics"; import type { ActivityCategory } from "@/lib/activity"; const TABS: { value: ActivityCategory; label: string }[] = [ @@ -28,7 +29,10 @@ export function ActivityTabs({ value, onChange }: ActivityTabsProps) { key={tab.value} mode="gray" size="s" - onClick={() => onChange(tab.value)} + onClick={() => { + haptic.select(); + onChange(tab.value); + }} style={{ "--tgui--button--hovered-opacity": 0 } as React.CSSProperties} className={cn( "rounded-[12px]! whitespace-nowrap!", diff --git a/src/components/dashboard/plans/GiftFilterTabs.tsx b/src/components/dashboard/plans/GiftFilterTabs.tsx index 8663cb4..0804f6d 100644 --- a/src/components/dashboard/plans/GiftFilterTabs.tsx +++ b/src/components/dashboard/plans/GiftFilterTabs.tsx @@ -2,6 +2,7 @@ import { Button } from "@telegram-apps/telegram-ui"; import { cn } from "@/lib/cn"; +import { haptic } from "@/lib/haptics"; export type GiftFilter = "all" | "received" | "sent"; @@ -28,7 +29,10 @@ export function GiftFilterTabs({ value, onChange }: GiftFilterTabsProps) { key={tab.value} mode="gray" size="s" - onClick={() => onChange(tab.value)} + onClick={() => { + haptic.select(); + onChange(tab.value); + }} style={{ "--tgui--button--hovered-opacity": 0 } as React.CSSProperties} className={cn( "rounded-[12px]! whitespace-nowrap!", diff --git a/src/components/dashboard/plans/KycRequiredNotice.tsx b/src/components/dashboard/plans/KycRequiredNotice.tsx index 9019243..6d24b8c 100644 --- a/src/components/dashboard/plans/KycRequiredNotice.tsx +++ b/src/components/dashboard/plans/KycRequiredNotice.tsx @@ -3,6 +3,7 @@ import Image from "next/image"; import { useRouter } from "next/navigation"; import { Button } from "@telegram-apps/telegram-ui"; +import { haptic } from "@/lib/haptics"; export function KycRequiredNotice() { const router = useRouter(); @@ -24,7 +25,10 @@ export function KycRequiredNotice() { mode="filled" size="m" className="mt-1 rounded-full! bg-[#fa7119]!" - onClick={() => router.push("/verification")} + onClick={() => { + haptic.impact("light"); + router.push("/verification"); + }} > Complete Verification diff --git a/src/components/dashboard/tasks/ManageTasksSection.tsx b/src/components/dashboard/tasks/ManageTasksSection.tsx index 87c67b5..5baa3cb 100644 --- a/src/components/dashboard/tasks/ManageTasksSection.tsx +++ b/src/components/dashboard/tasks/ManageTasksSection.tsx @@ -1,10 +1,10 @@ "use client"; import { useMemo, useState } from "react"; -import { initHapticFeedback } from "@telegram-apps/sdk-react"; import { TaskFilterTabs, type TaskFilter } from "@/components/dashboard/tasks/TaskFilterTabs"; import { TaskListCard } from "@/components/dashboard/tasks/TaskListCard"; import { useTMA } from "@/lib/hooks"; +import { haptic } from "@/lib/haptics"; import { useStore } from "@/lib/store"; import type { Task } from "@/lib/types"; @@ -25,14 +25,15 @@ export function ManageTasksSection({ items }: ManageTasksSectionProps) { const handleTaskClick = (taskId: string) => { switch (taskId) { case "task-setup-wallet": + haptic.impact("light"); openTelegramLink("https://t.me/BitcoinDeepaBot"); break; case "task-join-community": + haptic.impact("light"); openTelegramLink("https://t.me/+iiP-rX7ldYxjZWU1"); break; case "task-share-story": { - const haptic = initHapticFeedback(); - haptic.impactOccurred("heavy"); + haptic.impact("heavy"); shareStory("https://ceyloncash.com/bitcoindeepa/tma/story.mp4", { text: `Proud OG Member of Bitcoin දීප. ${count} Citizens and Counting 🚀🔥\n\nhttps://t.me/BitcoinDeepaBot/private_invite?startapp=${userID}\n\n#bitcoindeepa @bitcoindeepabot #viralstory`, widget_link: { diff --git a/src/components/dashboard/tasks/TaskFilterTabs.tsx b/src/components/dashboard/tasks/TaskFilterTabs.tsx index 62199f1..55fa555 100644 --- a/src/components/dashboard/tasks/TaskFilterTabs.tsx +++ b/src/components/dashboard/tasks/TaskFilterTabs.tsx @@ -2,6 +2,7 @@ import { Button } from "@telegram-apps/telegram-ui"; import { cn } from "@/lib/cn"; +import { haptic } from "@/lib/haptics"; export type TaskFilter = "all" | "daily" | "one_time"; @@ -28,7 +29,10 @@ export function TaskFilterTabs({ value, onChange }: TaskFilterTabsProps) { key={tab.value} mode="gray" size="s" - onClick={() => onChange(tab.value)} + onClick={() => { + haptic.select(); + onChange(tab.value); + }} style={{ "--tgui--button--hovered-opacity": 0 } as React.CSSProperties} className={cn( "rounded-[12px]! whitespace-nowrap!", diff --git a/src/components/ui/copy-field.tsx b/src/components/ui/copy-field.tsx index c77a444..b10431f 100644 --- a/src/components/ui/copy-field.tsx +++ b/src/components/ui/copy-field.tsx @@ -4,6 +4,7 @@ import { useEffect, useRef, useState } from "react"; import { Check, Copy } from "lucide-react"; import { IconButton } from "@telegram-apps/telegram-ui"; import { cn } from "@/lib/cn"; +import { haptic } from "@/lib/haptics"; interface CopyButtonProps { onCopy?: () => void; @@ -64,6 +65,7 @@ export function CopyField({ value, className, onCopy }: CopyFieldProps) { const handleCopy = () => { navigator.clipboard.writeText(value).then(() => { + haptic.impact("light"); setCopied(true); onCopy?.(value); if (timeoutRef.current) clearTimeout(timeoutRef.current); diff --git a/src/components/ui/plan-card.tsx b/src/components/ui/plan-card.tsx index 08fae12..cb425e5 100644 --- a/src/components/ui/plan-card.tsx +++ b/src/components/ui/plan-card.tsx @@ -2,6 +2,7 @@ import { Check } from "lucide-react"; import { cn } from "@/lib/cn"; +import { haptic } from "@/lib/haptics"; const RadioDefault = () => (
@@ -54,7 +55,14 @@ export function PlanCard({ return ( { + haptic.select(); + onSelect?.(); + } + } className={cn( "relative w-full rounded-[12px] text-left", "flex flex-col items-end pt-0", diff --git a/src/components/ui/visible-toggle.tsx b/src/components/ui/visible-toggle.tsx index 0b87ae0..a7abfb0 100644 --- a/src/components/ui/visible-toggle.tsx +++ b/src/components/ui/visible-toggle.tsx @@ -3,6 +3,7 @@ import { Eye, EyeOff } from "lucide-react"; import { IconButton } from "@telegram-apps/telegram-ui"; import { cn } from "@/lib/cn"; +import { haptic } from "@/lib/haptics"; interface VisibleToggleProps { visible: boolean; @@ -15,7 +16,15 @@ export function VisibleToggle({ visible, onToggle, dark = false, className }: Vi const Icon = visible ? Eye : EyeOff; return ( - + { + haptic.impact("light"); + onToggle(); + }} + className={cn(className)} + > ) => void) { + try { + fn(initHapticFeedback()); + } catch { + // Not running inside Telegram (e.g. opened directly in a browser during + // local development) — skip instead of crashing the app. + } +} + +export const haptic = { + impact: (style: ImpactStyle = "light") => withHaptics((h) => h.impactOccurred(style)), + notify: (type: NotificationType) => withHaptics((h) => h.notificationOccurred(type)), + select: () => withHaptics((h) => h.selectionChanged()), +}; From b38acf600e5f856706c22aecae4359f31ee7f290 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 17:30:41 +0530 Subject: [PATCH 10/24] feat: add dynamic export to NewsArticleDetailPage and NewsPage for improved rendering --- src/app/dashboard/news/[id]/page.tsx | 2 ++ src/app/dashboard/news/page.tsx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/app/dashboard/news/[id]/page.tsx b/src/app/dashboard/news/[id]/page.tsx index 483472b..0c2034e 100644 --- a/src/app/dashboard/news/[id]/page.tsx +++ b/src/app/dashboard/news/[id]/page.tsx @@ -4,6 +4,8 @@ import { NewsDetailBackButton, NewsArticleCard } from "@/components/dashboard/ne import { fmtShortDate } from "@/lib/formatters"; import { getNewsArticles } from "@/lib/news"; +export const dynamic = "force-dynamic"; + export default async function NewsArticleDetailPage({ params, }: { diff --git a/src/app/dashboard/news/page.tsx b/src/app/dashboard/news/page.tsx index f95d290..ab3c0b5 100644 --- a/src/app/dashboard/news/page.tsx +++ b/src/app/dashboard/news/page.tsx @@ -5,6 +5,8 @@ import { NewsListSection } from "@/components/dashboard/news/NewsListSection"; import { getNewsArticles } from "@/lib/news"; import type { NewsArticle } from "@/lib/types"; +export const dynamic = "force-dynamic"; + function NewsFeaturedCard({ article }: { article: NewsArticle }) { return ( Date: Tue, 4 Aug 2026 17:30:45 +0530 Subject: [PATCH 11/24] feat: update haptic feedback style from light to medium for improved user experience --- src/app/verification/details/page.tsx | 2 +- src/app/verification/page.tsx | 12 ++++++------ src/components/dashboard/plans/KycRequiredNotice.tsx | 2 +- .../dashboard/tasks/ManageTasksSection.tsx | 4 ++-- src/components/ui/copy-field.tsx | 2 +- src/components/ui/visible-toggle.tsx | 2 +- src/lib/haptics.ts | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/app/verification/details/page.tsx b/src/app/verification/details/page.tsx index f689e3b..2985dc9 100644 --- a/src/app/verification/details/page.tsx +++ b/src/app/verification/details/page.tsx @@ -60,7 +60,7 @@ export default function VerificationDetailsPage() { : null; const onSubmit = (formData: CreateUserFormData) => { - haptic.impact("light"); + haptic.impact("medium"); updateProfile.mutate( { first_name: formData.first_name, diff --git a/src/app/verification/page.tsx b/src/app/verification/page.tsx index c108871..e3004ff 100644 --- a/src/app/verification/page.tsx +++ b/src/app/verification/page.tsx @@ -116,7 +116,7 @@ export default function VerificationIntroPage() { }, [status, router]); const initiateVerification = () => { - haptic.impact("light"); + haptic.impact("medium"); if (!isMobile) { setShowMobileWarning(true); return; @@ -126,7 +126,7 @@ export default function VerificationIntroPage() { }; const continueVerification = () => { - haptic.impact("light"); + haptic.impact("medium"); if (!isMobile) { setShowMobileWarning(true); return; @@ -227,7 +227,7 @@ export default function VerificationIntroPage() { stretched style={{ borderRadius: "12px" }} onClick={() => { - haptic.impact("light"); + haptic.impact("medium"); router.push("/plans/choose"); }} > @@ -243,7 +243,7 @@ export default function VerificationIntroPage() { verificationUrl ? continueVerification : () => { - haptic.impact("light"); + haptic.impact("medium"); refetchKycStatus(); } } @@ -264,7 +264,7 @@ export default function VerificationIntroPage() { } as React.CSSProperties } onClick={() => { - haptic.impact("light"); + haptic.impact("medium"); router.push("/dashboard"); }} > @@ -345,7 +345,7 @@ export default function VerificationIntroPage() { stretched style={{ borderRadius: "12px" }} onClick={() => { - haptic.impact("light"); + haptic.impact("medium"); setShowMobileWarning(false); }} > diff --git a/src/components/dashboard/plans/KycRequiredNotice.tsx b/src/components/dashboard/plans/KycRequiredNotice.tsx index 6d24b8c..0312032 100644 --- a/src/components/dashboard/plans/KycRequiredNotice.tsx +++ b/src/components/dashboard/plans/KycRequiredNotice.tsx @@ -26,7 +26,7 @@ export function KycRequiredNotice() { size="m" className="mt-1 rounded-full! bg-[#fa7119]!" onClick={() => { - haptic.impact("light"); + haptic.impact("medium"); router.push("/verification"); }} > diff --git a/src/components/dashboard/tasks/ManageTasksSection.tsx b/src/components/dashboard/tasks/ManageTasksSection.tsx index 5baa3cb..11a40ba 100644 --- a/src/components/dashboard/tasks/ManageTasksSection.tsx +++ b/src/components/dashboard/tasks/ManageTasksSection.tsx @@ -25,11 +25,11 @@ export function ManageTasksSection({ items }: ManageTasksSectionProps) { const handleTaskClick = (taskId: string) => { switch (taskId) { case "task-setup-wallet": - haptic.impact("light"); + haptic.impact("medium"); openTelegramLink("https://t.me/BitcoinDeepaBot"); break; case "task-join-community": - haptic.impact("light"); + haptic.impact("medium"); openTelegramLink("https://t.me/+iiP-rX7ldYxjZWU1"); break; case "task-share-story": { diff --git a/src/components/ui/copy-field.tsx b/src/components/ui/copy-field.tsx index b10431f..c68d4f9 100644 --- a/src/components/ui/copy-field.tsx +++ b/src/components/ui/copy-field.tsx @@ -65,7 +65,7 @@ export function CopyField({ value, className, onCopy }: CopyFieldProps) { const handleCopy = () => { navigator.clipboard.writeText(value).then(() => { - haptic.impact("light"); + haptic.impact("medium"); setCopied(true); onCopy?.(value); if (timeoutRef.current) clearTimeout(timeoutRef.current); diff --git a/src/components/ui/visible-toggle.tsx b/src/components/ui/visible-toggle.tsx index a7abfb0..0f959f8 100644 --- a/src/components/ui/visible-toggle.tsx +++ b/src/components/ui/visible-toggle.tsx @@ -20,7 +20,7 @@ export function VisibleToggle({ visible, onToggle, dark = false, className }: Vi mode="gray" size="m" onClick={() => { - haptic.impact("light"); + haptic.impact("medium"); onToggle(); }} className={cn(className)} diff --git a/src/lib/haptics.ts b/src/lib/haptics.ts index 64b025c..a2350cf 100644 --- a/src/lib/haptics.ts +++ b/src/lib/haptics.ts @@ -13,7 +13,7 @@ function withHaptics(fn: (haptic: ReturnType) => void } export const haptic = { - impact: (style: ImpactStyle = "light") => withHaptics((h) => h.impactOccurred(style)), + impact: (style: ImpactStyle = "medium") => withHaptics((h) => h.impactOccurred(style)), notify: (type: NotificationType) => withHaptics((h) => h.notificationOccurred(type)), select: () => withHaptics((h) => h.selectionChanged()), }; From c932decb8f7c9864895ea9a4efe22cf3594ee6d5 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 17:44:51 +0530 Subject: [PATCH 12/24] feat: enhance loading states across WalletPage, PlansPage, and related components for improved user experience --- src/app/dashboard/page.tsx | 5 +- src/app/dashboard/plans/page.tsx | 3 +- .../dashboard/plans/PlanHeroCard.tsx | 65 ++++++++++----- .../dashboard/wallet/PerformanceGrid.tsx | 17 ++-- .../dashboard/wallet/PlanSummaryCard.tsx | 48 +++++++---- .../dashboard/wallet/TotalValueCard.tsx | 83 +++++++++++-------- src/components/ui/value-skeleton.tsx | 19 +++++ src/hooks/useUser.ts | 3 +- 8 files changed, 156 insertions(+), 87 deletions(-) create mode 100644 src/components/ui/value-skeleton.tsx diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 8cd42b2..e673927 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -12,7 +12,7 @@ import { useStore } from "@/lib/store"; export default function WalletPage() { const { balanceVisible } = useStore(); - const { subscription } = useUser(); + const { subscription, subscriptionLoading } = useUser(); const { data: summary, isLoading: isSummaryLoading } = useWalletSummary(); const { data: transactions } = useTransactionHistory(); @@ -51,9 +51,10 @@ export default function WalletPage() { changePercent={change24h} changeLkr={changeLkr} visible={balanceVisible} + isLoading={isSummaryLoading} /> - + diff --git a/src/components/dashboard/plans/PlanHeroCard.tsx b/src/components/dashboard/plans/PlanHeroCard.tsx index a834d49..fe1d82d 100644 --- a/src/components/dashboard/plans/PlanHeroCard.tsx +++ b/src/components/dashboard/plans/PlanHeroCard.tsx @@ -14,6 +14,7 @@ import { } from "@/lib/formatters"; import { getPlanIconSrc } from "@/components/dashboard/wallet/PlanSummaryCard"; import { VisibleToggle } from "@/components/ui/visible-toggle"; +import { ValueSkeleton } from "@/components/ui/value-skeleton"; import type { Subscription } from "@/lib/types"; export interface PlanHeroCardProps { @@ -23,6 +24,7 @@ export interface PlanHeroCardProps { currentValueLkr: number; visible: boolean; onToggleVisible: () => void; + isLoading?: boolean; } export function PlanHeroCard({ @@ -32,6 +34,7 @@ export function PlanHeroCard({ currentValueLkr, visible, onToggleVisible, + isLoading = false, }: PlanHeroCardProps) { const router = useRouter(); const mask = (v: string) => maskDigits(v, visible); @@ -175,33 +178,49 @@ export function PlanHeroCard({

You Invested

-

- {mask(fmtLkrCurrency(investedLkr))} -

-

- {mask( - `₿${(investedSats / 1e8).toFixed(5)} · ≈ 丰 ${fmtSatsCompact(investedSats)}` - )} -

+ {isLoading ? ( + + ) : ( +

+ {mask(fmtLkrCurrency(investedLkr))} +

+ )} + {isLoading ? ( + + ) : ( +

+ {mask( + `₿${(investedSats / 1e8).toFixed(5)} · ≈ 丰 ${fmtSatsCompact(investedSats)}` + )} +

+ )}

Current Value

-

- {mask(fmtLkrCurrency(currentValueLkr))} -

- {investedLkr > 0 && ( - - {mask( - `${isProfit ? "+" : "-"}${Math.abs(profitPct).toFixed(0)}% · ${fmtLkrCurrency( - Math.abs(profitLkr) - )}` - )} - + {isLoading ? ( + + ) : ( +

+ {mask(fmtLkrCurrency(currentValueLkr))} +

+ )} + {isLoading ? ( + + ) : ( + investedLkr > 0 && ( + + {mask( + `${isProfit ? "+" : "-"}${Math.abs(profitPct).toFixed(0)}% · ${fmtLkrCurrency( + Math.abs(profitLkr) + )}` + )} + + ) )}
diff --git a/src/components/dashboard/wallet/PerformanceGrid.tsx b/src/components/dashboard/wallet/PerformanceGrid.tsx index 8a18322..6463c63 100644 --- a/src/components/dashboard/wallet/PerformanceGrid.tsx +++ b/src/components/dashboard/wallet/PerformanceGrid.tsx @@ -2,6 +2,7 @@ import Image from "next/image"; import { Card, Badge } from "@telegram-apps/telegram-ui"; +import { ValueSkeleton } from "@/components/ui/value-skeleton"; import { fmtLkrCurrency, fmtLkrCurrencyCompact, @@ -30,14 +31,6 @@ export interface PerformanceGridProps { isLoading?: boolean; } -function ValueSkeleton({ className = "" }: { className?: string }) { - return ( - - ); -} - export function PerformanceGrid({ dcaSpent, dcaSats, @@ -71,7 +64,7 @@ export function PerformanceGrid({ You Invested

{isLoading ? ( - + ) : (

{mask(fmtLkrCurrency(dcaSpent))} @@ -103,7 +96,7 @@ export function PerformanceGrid({

{isLoading ? ( - + ) : (

{mask(fmtLkrCurrency(totalLkr))} @@ -144,7 +137,7 @@ export function PerformanceGrid({ Avg Price

{isLoading ? ( - + ) : (

@@ -177,7 +170,7 @@ export function PerformanceGrid({ Current Price

{isLoading ? ( - + ) : (

diff --git a/src/components/dashboard/wallet/PlanSummaryCard.tsx b/src/components/dashboard/wallet/PlanSummaryCard.tsx index 107114d..64d0a32 100644 --- a/src/components/dashboard/wallet/PlanSummaryCard.tsx +++ b/src/components/dashboard/wallet/PlanSummaryCard.tsx @@ -3,6 +3,7 @@ import Image from "next/image"; import Link from "next/link"; import { Card, Badge, Cell, Navigation } from "@telegram-apps/telegram-ui"; +import { ValueSkeleton } from "@/components/ui/value-skeleton"; import { fmtLkrCurrency, fmtShortDate, fmtRelativeDays } from "@/lib/formatters"; import type { Subscription } from "@/lib/types"; @@ -31,10 +32,12 @@ function RewardCard({ label, dateStr, iconSrc, + isLoading = false, }: { label: string; dateStr?: string; iconSrc: string; + isLoading?: boolean; }) { return (

-
-

- {dateStr ? fmtShortDate(dateStr) : "-"} -

- {dateStr && ( -

{fmtRelativeDays(dateStr)}

+
+ {isLoading ? ( + + ) : ( +

+ {dateStr ? fmtShortDate(dateStr) : "-"} +

+ )} + {isLoading ? ( + + ) : ( + dateStr && ( +

{fmtRelativeDays(dateStr)}

+ ) )}
@@ -62,9 +73,10 @@ function RewardCard({ export interface PlanSummaryCardProps { subscription: Subscription | null | undefined; + isLoading?: boolean; } -export function PlanSummaryCard({ subscription }: PlanSummaryCardProps) { +export function PlanSummaryCard({ subscription, isLoading = false }: PlanSummaryCardProps) { return (
@@ -113,10 +125,16 @@ export function PlanSummaryCard({ subscription }: PlanSummaryCardProps) { className="gap-2! rounded-xl border border-transparent bg-white px-4! shadow-[0px_2px_10px_0px_rgba(0,0,0,0.07)] transition-shadow duration-150 hover:shadow-[0px_4px_14px_0px_rgba(0,0,0,0.10)] focus-visible:ring-2 focus-visible:ring-[#fa7119]/50 focus-visible:outline-none dark:border-white/6 dark:bg-[#0B0F14] dark:shadow-[0px_2px_10px_0px_rgba(0,0,0,0.3)] dark:hover:shadow-[0px_4px_14px_0px_rgba(0,0,0,0.4)]" >
-

- {subscription ? subscription.planName : "No Active Plan"} -

- {subscription ? ( + {isLoading ? ( + + ) : ( +

+ {subscription ? subscription.planName : "No Active Plan"} +

+ )} + {isLoading ? ( + + ) : subscription ? (

{fmtLkrCurrency(subscription.price)} @@ -134,17 +152,19 @@ export function PlanSummaryCard({ subscription }: PlanSummaryCardProps) { - {subscription && ( + {(isLoading || subscription) && (

)} diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index 6f3bbfa..d7f912a 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -3,6 +3,7 @@ import Image from "next/image"; import { ChevronDown, TrendingUp, TrendingDown } from "lucide-react"; import { Card, Badge } from "@telegram-apps/telegram-ui"; +import { ValueSkeleton } from "@/components/ui/value-skeleton"; import { fmtLkrCurrency, fmtSatsCompact, maskDigits } from "@/lib/formatters"; // Card/Badge theme their background/color through --tgui-- CSS variables (same @@ -15,6 +16,7 @@ export interface TotalValueCardProps { changePercent: number; changeLkr: number; visible: boolean; + isLoading?: boolean; } export function TotalValueCard({ @@ -23,6 +25,7 @@ export function TotalValueCard({ changePercent, changeLkr, visible, + isLoading = false, }: TotalValueCardProps) { const mask = (v: string) => maskDigits(v, visible); const isProfit = changePercent >= 0; @@ -44,44 +47,56 @@ export function TotalValueCard({
-

- {mask(`≈ ${fmtLkrCurrency(totalLkr)}`)} -

+ {isLoading ? ( + + ) : ( +

+ {mask(`≈ ${fmtLkrCurrency(totalLkr)}`)} +

+ )}
-
-
- {mask(`₿ ${(totalSats / 1e8).toFixed(6)}`)} - BTC + {isLoading ? ( + + ) : ( +
+
+ {mask(`₿ ${(totalSats / 1e8).toFixed(6)}`)} + BTC +
+
+
+ {mask(`丰 ${fmtSatsCompact(totalSats)}`)} +
-
-
- {mask(`丰 ${fmtSatsCompact(totalSats)}`)} -
-
+ )} - -

- - - {" "} - {mask(fmtLkrCurrency(Math.abs(changeLkr)))} - {` (${isProfit ? "+" : "-"}${Math.abs(changePercent).toFixed(2)}%)`} - {" Last 24h"} - -

-
+ {isLoading ? ( + + ) : ( + +

+ + + {" "} + {mask(fmtLkrCurrency(Math.abs(changeLkr)))} + {` (${isProfit ? "+" : "-"}${Math.abs(changePercent).toFixed(2)}%)`} + {" Last 24h"} + +

+
+ )}
diff --git a/src/components/ui/value-skeleton.tsx b/src/components/ui/value-skeleton.tsx new file mode 100644 index 0000000..60135ef --- /dev/null +++ b/src/components/ui/value-skeleton.tsx @@ -0,0 +1,19 @@ +import { cn } from "@/lib/cn"; + +const TONE_STYLES = { + // Light card surfaces (white/#0B0F14 backgrounds). + surface: "bg-[#e2e8f0] dark:bg-[#334155]", + // Cards rendered over a photo/color background (e.g. hero cards). + dark: "bg-white/25 dark:bg-white/15", +}; + +export interface ValueSkeletonProps { + className?: string; + tone?: keyof typeof TONE_STYLES; +} + +export function ValueSkeleton({ className, tone = "surface" }: ValueSkeletonProps) { + return ( + + ); +} diff --git a/src/hooks/useUser.ts b/src/hooks/useUser.ts index 16fbac4..1ad114c 100644 --- a/src/hooks/useUser.ts +++ b/src/hooks/useUser.ts @@ -14,7 +14,7 @@ export function useUser() { const launchParams = useLaunchParams(); const telegramUser = launchParams.initData?.user; const { isExistingUser } = useStore(); - const { data: subscription } = useSubscriptionCurrent(); + const { data: subscription, isLoading: subscriptionLoading } = useSubscriptionCurrent(); const { data: kycData } = useKycStatus(); const username = telegramUser?.username; @@ -32,6 +32,7 @@ export function useUser() { photoUrl: telegramUser?.photoUrl, isExistingUser, subscription: subscription ?? null, + subscriptionLoading, kycStatus: kycData?.status, }; } From b12b89d5db726f96e362c784680a0ea55bec84f0 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 17:59:22 +0530 Subject: [PATCH 13/24] feat: update loading state handling in PlansPage and PlanHeroCard for improved user experience --- src/app/dashboard/plans/page.tsx | 5 +- .../dashboard/plans/PlanHeroCard.tsx | 70 +++++++++++++++++-- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/app/dashboard/plans/page.tsx b/src/app/dashboard/plans/page.tsx index fe86ceb..b1610fa 100644 --- a/src/app/dashboard/plans/page.tsx +++ b/src/app/dashboard/plans/page.tsx @@ -31,7 +31,7 @@ export default function PlansPage() { if (kycLoading) return ; if (!kycApproved) return ; - if (subscriptionLoading || noActivePlan) return ; + if (noActivePlan) return ; const currentValueLkr = summary ? Number( @@ -52,7 +52,8 @@ export default function PlansPage() { currentValueLkr={currentValueLkr} visible={balanceVisible} onToggleVisible={toggleBalanceVisible} - isLoading={summaryLoading} + subscriptionLoading={subscriptionLoading} + summaryLoading={summaryLoading} /> diff --git a/src/components/dashboard/plans/PlanHeroCard.tsx b/src/components/dashboard/plans/PlanHeroCard.tsx index fe1d82d..b4d4ceb 100644 --- a/src/components/dashboard/plans/PlanHeroCard.tsx +++ b/src/components/dashboard/plans/PlanHeroCard.tsx @@ -24,7 +24,8 @@ export interface PlanHeroCardProps { currentValueLkr: number; visible: boolean; onToggleVisible: () => void; - isLoading?: boolean; + subscriptionLoading?: boolean; + summaryLoading?: boolean; } export function PlanHeroCard({ @@ -34,7 +35,8 @@ export function PlanHeroCard({ currentValueLkr, visible, onToggleVisible, - isLoading = false, + subscriptionLoading = false, + summaryLoading = false, }: PlanHeroCardProps) { const router = useRouter(); const mask = (v: string) => maskDigits(v, visible); @@ -42,6 +44,62 @@ export function PlanHeroCard({ const profitPct = investedLkr > 0 ? (profitLkr / investedLkr) * 100 : 0; const isProfit = profitLkr >= 0; + if (subscriptionLoading) { + return ( +
+
+

+ Manage My Plan +

+ +
+ + + +
+ +
+
+ +
+ + +
+
+ +
+
+

Subscribed Since

+ +
+
+
+

Next Reward

+ +
+
+ +
+
+

You Invested

+ +
+
+
+

Current Value

+ +
+
+
+ +
+ ); + } + if (!subscription) { return (
@@ -178,14 +236,14 @@ export function PlanHeroCard({

You Invested

- {isLoading ? ( + {summaryLoading ? ( ) : (

{mask(fmtLkrCurrency(investedLkr))}

)} - {isLoading ? ( + {summaryLoading ? ( ) : (

@@ -198,14 +256,14 @@ export function PlanHeroCard({

Current Value

- {isLoading ? ( + {summaryLoading ? ( ) : (

{mask(fmtLkrCurrency(currentValueLkr))}

)} - {isLoading ? ( + {summaryLoading ? ( ) : ( investedLkr > 0 && ( From 9bae4d9d776774db2f7a9392052ee33877b820b9 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 18:04:45 +0530 Subject: [PATCH 14/24] feat: enhance loading skeletons and styles for improved user experience across various components --- src/app/plans/choose/page.tsx | 3 +- .../dashboard/wallet/PerformanceGrid.tsx | 8 +- .../dashboard/wallet/PlanSummaryCard.tsx | 194 +++++++++--------- .../dashboard/wallet/TotalValueCard.tsx | 16 +- src/components/ui/value-skeleton.tsx | 2 + 5 files changed, 110 insertions(+), 113 deletions(-) diff --git a/src/app/plans/choose/page.tsx b/src/app/plans/choose/page.tsx index 1d96285..fe4d9b5 100644 --- a/src/app/plans/choose/page.tsx +++ b/src/app/plans/choose/page.tsx @@ -19,6 +19,7 @@ import { KycRequiredNotice } from "@/components/dashboard/plans/KycRequiredNotic import { PageTitle } from "@/components/ui/page-title"; import { TogglePlan, type PlanDuration } from "@/components/ui/toggle-plan"; import { PlanCard } from "@/components/ui/plan-card"; +import { ValueSkeleton } from "@/components/ui/value-skeleton"; import { getPlanIconSrc } from "@/components/dashboard/wallet/PlanSummaryCard"; import { fmtLkrCurrency } from "@/lib/formatters"; import type { SubscriptionPlan } from "@/lib/types"; @@ -201,7 +202,7 @@ export default function ChoosePlanPage() { {packagesLoading ? (
{[0, 1, 2].map((i) => ( -
+ ))}
) : filteredPlans.length === 0 ? ( diff --git a/src/components/dashboard/wallet/PerformanceGrid.tsx b/src/components/dashboard/wallet/PerformanceGrid.tsx index 6463c63..52526ca 100644 --- a/src/components/dashboard/wallet/PerformanceGrid.tsx +++ b/src/components/dashboard/wallet/PerformanceGrid.tsx @@ -15,10 +15,6 @@ const CARD_SURFACE_STYLE = { "--tgui--tertiary_bg_color": "var(--color-surface-primary)", } as React.CSSProperties; -const CARD_SUCCESS_STYLE = { - "--tgui--tertiary_bg_color": "color-mix(in srgb, var(--color-success) 10%, transparent)", -} as React.CSSProperties; - export interface PerformanceGridProps { dcaSpent: number; dcaSats: number; @@ -88,7 +84,7 @@ export function PerformanceGrid({

@@ -163,7 +159,7 @@ export function PerformanceGrid({

diff --git a/src/components/dashboard/wallet/PlanSummaryCard.tsx b/src/components/dashboard/wallet/PlanSummaryCard.tsx index 64d0a32..a5baab4 100644 --- a/src/components/dashboard/wallet/PlanSummaryCard.tsx +++ b/src/components/dashboard/wallet/PlanSummaryCard.tsx @@ -32,12 +32,10 @@ function RewardCard({ label, dateStr, iconSrc, - isLoading = false, }: { label: string; dateStr?: string; iconSrc: string; - isLoading?: boolean; }) { return (

-
- {isLoading ? ( - - ) : ( -

- {dateStr ? fmtShortDate(dateStr) : "-"} -

- )} - {isLoading ? ( - - ) : ( - dateStr && ( -

{fmtRelativeDays(dateStr)}

- ) +
+

+ {dateStr ? fmtShortDate(dateStr) : "-"} +

+ {dateStr && ( +

{fmtRelativeDays(dateStr)}

)}
@@ -71,6 +61,18 @@ function RewardCard({ ); } +function PlanSummarySkeleton() { + return ( +
+ +
+ + +
+
+ ); +} + export interface PlanSummaryCardProps { subscription: Subscription | null | undefined; isLoading?: boolean; @@ -85,90 +87,92 @@ export function PlanSummaryCard({ subscription, isLoading = false }: PlanSummary

-
- - - ) : ( - - ) - } - after={ -
- {subscription?.isActive && ( - - - Active - - )} - -
- } - style={{ "--tgui--cell--middle--padding": "12px 0" } as React.CSSProperties} - className="gap-2! rounded-xl border border-transparent bg-white px-4! shadow-[0px_2px_10px_0px_rgba(0,0,0,0.07)] transition-shadow duration-150 hover:shadow-[0px_4px_14px_0px_rgba(0,0,0,0.10)] focus-visible:ring-2 focus-visible:ring-[#fa7119]/50 focus-visible:outline-none dark:border-white/6 dark:bg-[#0B0F14] dark:shadow-[0px_2px_10px_0px_rgba(0,0,0,0.3)] dark:hover:shadow-[0px_4px_14px_0px_rgba(0,0,0,0.4)]" - > -
- {isLoading ? ( - - ) : ( + {isLoading ? ( + + ) : ( +
+ + + ) : ( + + ) + } + after={ +
+ {subscription?.isActive && ( + + + Active + + )} + +
+ } + style={{ "--tgui--cell--middle--padding": "12px 0" } as React.CSSProperties} + className="gap-2! rounded-xl border border-transparent bg-white px-4! shadow-[0px_2px_10px_0px_rgba(0,0,0,0.07)] transition-shadow duration-150 hover:shadow-[0px_4px_14px_0px_rgba(0,0,0,0.10)] focus-visible:ring-2 focus-visible:ring-[#fa7119]/50 focus-visible:outline-none dark:border-white/6 dark:bg-[#0B0F14] dark:shadow-[0px_2px_10px_0px_rgba(0,0,0,0.3)] dark:hover:shadow-[0px_4px_14px_0px_rgba(0,0,0,0.4)]" + > +

{subscription ? subscription.planName : "No Active Plan"}

- )} - {isLoading ? ( - - ) : subscription ? ( -
-

- {fmtLkrCurrency(subscription.price)} + {subscription ? ( +

+

+ {fmtLkrCurrency(subscription.price)} +

+

+ /{subscription.planType === "weekly" ? "week" : "month"} +

+
+ ) : ( +

+ Choose a plan to start earning rewards

-

- /{subscription.planType === "weekly" ? "week" : "month"} -

-
- ) : ( -

- Choose a plan to start earning rewards -

- )} -
-
- + )} +
+ + - {(isLoading || subscription) && ( -
- - -
- )} -
+ {subscription && ( +
+ + +
+ )} +
+ )}
); } diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index d7f912a..01da0e0 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -48,17 +48,15 @@ export function TotalValueCard({
{isLoading ? ( - + ) : (

{mask(`≈ ${fmtLkrCurrency(totalLkr)}`)}

)} -
- {isLoading ? ( - - ) : ( + {!isLoading && ( +
{mask(`₿ ${(totalSats / 1e8).toFixed(6)}`)} @@ -69,11 +67,7 @@ export function TotalValueCard({ {mask(`丰 ${fmtSatsCompact(totalSats)}`)}
- )} - {isLoading ? ( - - ) : (

- )} -
+
+ )}
); diff --git a/src/components/ui/value-skeleton.tsx b/src/components/ui/value-skeleton.tsx index 60135ef..acd7b92 100644 --- a/src/components/ui/value-skeleton.tsx +++ b/src/components/ui/value-skeleton.tsx @@ -5,6 +5,8 @@ const TONE_STYLES = { surface: "bg-[#e2e8f0] dark:bg-[#334155]", // Cards rendered over a photo/color background (e.g. hero cards). dark: "bg-white/25 dark:bg-white/15", + // Subtler variant for prominent hero values — a faint tint rather than a solid block. + translucent: "bg-white/10", }; export interface ValueSkeletonProps { From 256854288f05944cba0796de42a2cd1fabc22cfc Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 18:07:54 +0530 Subject: [PATCH 15/24] feat: update background opacity in PlanHeroCard and TotalValueCard for improved visual consistency --- src/components/dashboard/plans/PlanHeroCard.tsx | 4 ++-- src/components/dashboard/wallet/TotalValueCard.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/plans/PlanHeroCard.tsx b/src/components/dashboard/plans/PlanHeroCard.tsx index b4d4ceb..2d152c0 100644 --- a/src/components/dashboard/plans/PlanHeroCard.tsx +++ b/src/components/dashboard/plans/PlanHeroCard.tsx @@ -60,7 +60,7 @@ export function PlanHeroCard({ style={{ "--tgui--tertiary_bg_color": "transparent" } as React.CSSProperties} > -
+
@@ -145,7 +145,7 @@ export function PlanHeroCard({ style={{ "--tgui--tertiary_bg_color": "transparent" } as React.CSSProperties} > -
+
diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index 01da0e0..2da749d 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -37,7 +37,7 @@ export function TotalValueCard({ style={{ "--tgui--tertiary_bg_color": "transparent" } as React.CSSProperties} > -
+

Total Value

From 8faed26d541868a5da1462ba40f068b15bc60d79 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 18:07:58 +0530 Subject: [PATCH 16/24] feat: conditionally render period switcher based on available data points for improved user experience --- .../dashboard/wallet/PortfolioChart.tsx | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/src/components/dashboard/wallet/PortfolioChart.tsx b/src/components/dashboard/wallet/PortfolioChart.tsx index badf822..4b0aed5 100644 --- a/src/components/dashboard/wallet/PortfolioChart.tsx +++ b/src/components/dashboard/wallet/PortfolioChart.tsx @@ -85,7 +85,14 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart () => buildPoints(transactions, currentBtcPrice), [transactions, currentBtcPrice] ); - const points = useMemo(() => filterByPeriod(allPoints, chartPeriod), [allPoints, chartPeriod]); + // With fewer than 2 points every period falls back to the same full set (see + // filterByPeriod), so the switcher would just be dead buttons — hide it and + // render the one timeframe that's actually meaningful. + const showPeriodSwitcher = allPoints.length >= 2; + const points = useMemo( + () => (showPeriodSwitcher ? filterByPeriod(allPoints, chartPeriod) : allPoints), + [allPoints, chartPeriod, showPeriodSwitcher] + ); const labels = points.map((p) => new Date(p.date).toLocaleDateString("en-GB", { day: "2-digit", month: "short" }) @@ -207,31 +214,33 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart } as React.CSSProperties } > -
- {PERIODS.map((p) => ( - - ))} -
+ {showPeriodSwitcher && ( +
+ {PERIODS.map((p) => ( + + ))} +
+ )} {points.length === 0 ? (
From 4b47bc5305dbd0b88aed31077ab6cf315dc216b3 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 18:39:54 +0530 Subject: [PATCH 17/24] feat: comment out unused imports and functions in PortfolioChart for cleaner code --- .../dashboard/wallet/PortfolioChart.tsx | 126 +++++++++--------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/src/components/dashboard/wallet/PortfolioChart.tsx b/src/components/dashboard/wallet/PortfolioChart.tsx index 4b0aed5..8528869 100644 --- a/src/components/dashboard/wallet/PortfolioChart.tsx +++ b/src/components/dashboard/wallet/PortfolioChart.tsx @@ -1,6 +1,7 @@ "use client"; -import { useMemo, useState, useTransition } from "react"; +import { useMemo } from "react"; +// import { useMemo, useState, useTransition } from "react"; import { Line } from "react-chartjs-2"; import { Chart as ChartJS, @@ -12,23 +13,26 @@ import { Filler, type TooltipItem, } from "chart.js"; -import { Card, Button } from "@telegram-apps/telegram-ui"; -import { cn } from "@/lib/cn"; +import { Card } from "@telegram-apps/telegram-ui"; +// import { Card, Button } from "@telegram-apps/telegram-ui"; +// import { cn } from "@/lib/cn"; import { fmtLkrCurrency, fmtPriceCompact } from "@/lib/formatters"; import { useTheme } from "@/app/context/theme"; import type { DcaTransaction } from "@/hooks/query/useTransactionHistory"; ChartJS.register(CategoryScale, LinearScale, PointElement, LineElement, Tooltip, Filler); -const PERIODS = ["1M", "3M", "6M", "1Y", "All"] as const; -type Period = (typeof PERIODS)[number]; +// Period switcher is disabled for now — chart always renders the full "All" range. +// Kept here (commented) so it can be re-enabled without reconstructing the logic. +// const PERIODS = ["1M", "3M", "6M", "1Y", "All"] as const; +// type Period = (typeof PERIODS)[number]; -const PERIOD_MONTHS: Record, number> = { - "1M": 1, - "3M": 3, - "6M": 6, - "1Y": 12, -}; +// const PERIOD_MONTHS: Record, number> = { +// "1M": 1, +// "3M": 3, +// "6M": 6, +// "1Y": 12, +// }; interface ChartPoint { date: string; @@ -53,14 +57,14 @@ function buildPoints(transactions: DcaTransaction[], currentBtcPrice: number): C }); } -function filterByPeriod(points: ChartPoint[], period: Period): ChartPoint[] { - if (period === "All") return points; - const months = PERIOD_MONTHS[period]; - const cutoff = new Date(); - cutoff.setMonth(cutoff.getMonth() - months); - const windowed = points.filter((p) => new Date(p.date) >= cutoff); - return windowed.length >= 2 ? windowed : points; -} +// function filterByPeriod(points: ChartPoint[], period: Period): ChartPoint[] { +// if (period === "All") return points; +// const months = PERIOD_MONTHS[period]; +// const cutoff = new Date(); +// cutoff.setMonth(cutoff.getMonth() - months); +// const windowed = points.filter((p) => new Date(p.date) >= cutoff); +// return windowed.length >= 2 ? windowed : points; +// } export interface PortfolioChartProps { transactions: DcaTransaction[]; @@ -72,27 +76,22 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart // The pill highlight (`selectedPeriod`) updates immediately on click; the chart-driving // `chartPeriod` updates inside a transition so filtering/re-rendering the chart doesn't // delay the button's own paint. - const [selectedPeriod, setSelectedPeriod] = useState("3M"); - const [chartPeriod, setChartPeriod] = useState("3M"); - const [isPending, startTransition] = useTransition(); + // const [selectedPeriod, setSelectedPeriod] = useState("3M"); + // const [chartPeriod, setChartPeriod] = useState("3M"); + // const [isPending, startTransition] = useTransition(); - const handlePeriodClick = (p: Period) => { - setSelectedPeriod(p); - startTransition(() => setChartPeriod(p)); - }; + // const handlePeriodClick = (p: Period) => { + // setSelectedPeriod(p); + // startTransition(() => setChartPeriod(p)); + // }; const allPoints = useMemo( () => buildPoints(transactions, currentBtcPrice), [transactions, currentBtcPrice] ); - // With fewer than 2 points every period falls back to the same full set (see - // filterByPeriod), so the switcher would just be dead buttons — hide it and - // render the one timeframe that's actually meaningful. - const showPeriodSwitcher = allPoints.length >= 2; - const points = useMemo( - () => (showPeriodSwitcher ? filterByPeriod(allPoints, chartPeriod) : allPoints), - [allPoints, chartPeriod, showPeriodSwitcher] - ); + // Always render the full "All" range — see PERIODS comment above. + const points = allPoints; + // const points = useMemo(() => filterByPeriod(allPoints, chartPeriod), [allPoints, chartPeriod]); const labels = points.map((p) => new Date(p.date).toLocaleDateString("en-GB", { day: "2-digit", month: "short" }) @@ -214,33 +213,33 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart } as React.CSSProperties } > - {showPeriodSwitcher && ( -
- {PERIODS.map((p) => ( - - ))} -
- )} + {/* Period switcher — disabled, see PERIODS comment above. +
+ {PERIODS.map((p) => ( + + ))} +
+ */} {points.length === 0 ? (
@@ -251,9 +250,12 @@ export function PortfolioChart({ transactions, currentBtcPrice }: PortfolioChart

) : ( -
+
+ //
+ // + //
)}
From 59ac850160bec795c5dc674f769b45e5fc2e5212 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 18:47:59 +0530 Subject: [PATCH 18/24] feat: refactor TotalValueCard to improve layout and visibility of badge component --- .../dashboard/wallet/TotalValueCard.tsx | 69 +++++++++---------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index 2da749d..cf1d326 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -4,6 +4,7 @@ import Image from "next/image"; import { ChevronDown, TrendingUp, TrendingDown } from "lucide-react"; import { Card, Badge } from "@telegram-apps/telegram-ui"; import { ValueSkeleton } from "@/components/ui/value-skeleton"; +import { cn } from "@/lib/cn"; import { fmtLkrCurrency, fmtSatsCompact, maskDigits } from "@/lib/formatters"; // Card/Badge theme their background/color through --tgui-- CSS variables (same @@ -55,43 +56,41 @@ export function TotalValueCard({

)} - {!isLoading && ( -
-
-
- {mask(`₿ ${(totalSats / 1e8).toFixed(6)}`)} - BTC -
-
-
- {mask(`丰 ${fmtSatsCompact(totalSats)}`)} -
+
+
+
+ {mask(`₿ ${(totalSats / 1e8).toFixed(6)}`)} + BTC +
+
+
+ {mask(`丰 ${fmtSatsCompact(totalSats)}`)}
- - -

- - - {" "} - {mask(fmtLkrCurrency(Math.abs(changeLkr)))} - {` (${isProfit ? "+" : "-"}${Math.abs(changePercent).toFixed(2)}%)`} - {" Last 24h"} - -

-
- )} + + +

+ + + {" "} + {mask(fmtLkrCurrency(Math.abs(changeLkr)))} + {` (${isProfit ? "+" : "-"}${Math.abs(changePercent).toFixed(2)}%)`} + {" Last 24h"} + +

+
+
); From 6e24eb9004cd0d4c60d23ee2e81a06eb1aded40b Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 19:44:47 +0530 Subject: [PATCH 19/24] feat: refactor useTransactionHistory to support pagination and improve transaction data handling --- src/app/dashboard/activity/page.tsx | 36 +++++++---- src/app/dashboard/page.tsx | 2 +- src/hooks/query/useTransactionHistory.ts | 77 +++++++++++++++++------- 3 files changed, 78 insertions(+), 37 deletions(-) diff --git a/src/app/dashboard/activity/page.tsx b/src/app/dashboard/activity/page.tsx index f56710f..e24397e 100644 --- a/src/app/dashboard/activity/page.tsx +++ b/src/app/dashboard/activity/page.tsx @@ -24,11 +24,9 @@ export default function ActivityPage() { const [search, setSearch] = useState(""); const [category, setCategory] = useState("all"); - const { data: transactions, isLoading } = useTransactionHistory(); - const activity = useMemo( - () => (transactions ?? []).map(mapDcaTransactionToActivityItem), - [transactions] - ); + const { transactions, isLoading, hasNextPage, isFetchingNextPage, fetchNextPage } = + useTransactionHistory(); + const activity = useMemo(() => transactions.map(mapDcaTransactionToActivityItem), [transactions]); const comingSoon = COMING_SOON_CATEGORIES.includes(category); @@ -80,14 +78,26 @@ export default function ActivityPage() { ) : groups.length === 0 ? (

No activity found.

) : ( - groups.map(([dayKey, items]) => ( - - )) + <> + {groups.map(([dayKey, items]) => ( + + ))} + + {hasNextPage && ( + + )} + )}
); diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index e673927..7eb30b7 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -15,7 +15,7 @@ export default function WalletPage() { const { subscription, subscriptionLoading } = useUser(); const { data: summary, isLoading: isSummaryLoading } = useWalletSummary(); - const { data: transactions } = useTransactionHistory(); + const { transactions } = useTransactionHistory(); const totalLkr = summary ? Number( diff --git a/src/hooks/query/useTransactionHistory.ts b/src/hooks/query/useTransactionHistory.ts index a58e6cc..dffcd4d 100644 --- a/src/hooks/query/useTransactionHistory.ts +++ b/src/hooks/query/useTransactionHistory.ts @@ -1,6 +1,7 @@ "use client"; -import { useQuery } from "@tanstack/react-query"; +import { useMemo } from "react"; +import { useInfiniteQuery } from "@tanstack/react-query"; import { queryKeys } from "@/lib/query-keys"; import { getAuthTokenFromStorage } from "@/lib/auth"; import fetchy from "@/lib/fetchy"; @@ -29,46 +30,76 @@ interface RawTransaction { settled?: boolean; } +interface PaginatedTransactions { + transactions: RawTransaction[]; + has_more?: boolean; +} + interface TransactionListResponse { - transactions: RawTransaction[] | { transactions: RawTransaction[] }; + transactions: RawTransaction[] | PaginatedTransactions; } +const PAGE_SIZE = 20; + function toNumber(value: string | number | undefined | null): number { if (value === undefined || value === null) return 0; return typeof value === "string" ? Number(value.replace(/,/g, "")) || 0 : value; } +function normalize(tx: RawTransaction): DcaTransaction { + return { + id: tx.payhere_pay_id, + created_at: tx.created_at, + satoshis_purchased: toNumber(tx.satoshis_purchased), + btc_price_at_purchase: toNumber(tx.btc_price_at_purchase), + package_amount: toNumber(tx.package_amount), + gross_amount: toNumber(tx.gross_amount), + package_name: tx.package_name, + status: tx.status, + settled: tx.settled, + }; +} + // All DCA purchase attempts (success, pending, cancelled, failed, chargeback), -// sorted oldest-first, with numeric fields normalized. +// paginated oldest page first via `has_more`, sorted oldest-first within the +// flattened result with numeric fields normalized. export function useTransactionHistory() { const authToken = getAuthTokenFromStorage(); - return useQuery({ + const query = useInfiniteQuery({ queryKey: queryKeys.transactions, - queryFn: async () => { - const data = await fetchy.get("/api/transaction/list?limit=100", { - headers: { Authorization: `Bearer ${authToken}` }, - shouldCache: false, - }); + queryFn: async ({ pageParam }) => { + const data = await fetchy.get( + `/api/transaction/list?page=${pageParam}&limit=${PAGE_SIZE}`, + { + headers: { Authorization: `Bearer ${authToken}` }, + shouldCache: false, + } + ); + + const nested = Array.isArray(data.transactions) ? null : data.transactions; const raw = Array.isArray(data.transactions) ? data.transactions - : (data.transactions?.transactions ?? []); + : (nested?.transactions ?? []); - return raw - .map((tx) => ({ - id: tx.payhere_pay_id, - created_at: tx.created_at, - satoshis_purchased: toNumber(tx.satoshis_purchased), - btc_price_at_purchase: toNumber(tx.btc_price_at_purchase), - package_amount: toNumber(tx.package_amount), - gross_amount: toNumber(tx.gross_amount), - package_name: tx.package_name, - status: tx.status, - settled: tx.settled, - })) - .sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime()); + return { + transactions: raw.map(normalize), + hasMore: nested?.has_more ?? raw.length === PAGE_SIZE, + }; }, + initialPageParam: 1, + getNextPageParam: (lastPage, allPages) => (lastPage.hasMore ? allPages.length + 1 : undefined), enabled: !!authToken, staleTime: 1000 * 60 * 5, }); + + const transactions = useMemo( + () => + (query.data?.pages ?? []) + .flatMap((page) => page.transactions) + .sort((a, b) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime()), + [query.data] + ); + + return { ...query, transactions }; } From f52f033fe2369c016bacaae33ad4a01af60040f0 Mon Sep 17 00:00:00 2001 From: rayaanr Date: Tue, 4 Aug 2026 19:46:54 +0530 Subject: [PATCH 20/24] feat: update totalLkr calculation to use currentValueLkr for accurate performance metrics --- src/app/dashboard/page.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 7eb30b7..56b96e8 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -40,6 +40,7 @@ export default function WalletPage() { currentBtcPriceUsd && currentBtcPrice ? avgBtcPrice * (currentBtcPriceUsd / currentBtcPrice) : undefined; + const currentValueLkr = (dcaSats / 1e8) * currentBtcPrice; return (
@@ -59,7 +60,7 @@ export default function WalletPage() { Date: Tue, 4 Aug 2026 20:21:18 +0530 Subject: [PATCH 21/24] feat: reveal plan details only after selection for improved user interaction --- src/app/plans/choose/page.tsx | 5 ++--- src/components/ui/plan-card.tsx | 36 +++++++++++++++++---------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/app/plans/choose/page.tsx b/src/app/plans/choose/page.tsx index fe4d9b5..2992bab 100644 --- a/src/app/plans/choose/page.tsx +++ b/src/app/plans/choose/page.tsx @@ -69,9 +69,8 @@ export default function ChoosePlanPage() { [packages, duration, currentPlan] ); - // Derived rather than effect-driven: falls back to the first plan of the - // active duration until the user makes an explicit selection. - const selectedPlanId = selectedId ?? filteredPlans[0]?.id; + // Only set once the user explicitly taps a plan — details stay hidden until then. + const selectedPlanId = selectedId; const handleDurationChange = (d: PlanDuration) => { haptic.select(); diff --git a/src/components/ui/plan-card.tsx b/src/components/ui/plan-card.tsx index cb425e5..4bc6026 100644 --- a/src/components/ui/plan-card.tsx +++ b/src/components/ui/plan-card.tsx @@ -119,25 +119,27 @@ export function PlanCard({
- {/* Bottom: description + pricing */} -
-

- {description} -

-
- {perMonth && ( - <> -

- {perMonth} -

-
- - )} -

- {perYear} + {/* Bottom: description + pricing, revealed only once the plan is selected */} + {isHighlighted && ( +

+

+ {description}

+
+ {perMonth && ( + <> +

+ {perMonth} +

+
+ + )} +

+ {perYear} +

+
-
+ )}
); From edbad53e5fce33c20cf43f7f7fa6bb4a7beb618d Mon Sep 17 00:00:00 2001 From: Dilshan Madushanka Date: Tue, 4 Aug 2026 22:17:48 +0530 Subject: [PATCH 22/24] =?UTF-8?q?feat:=20implement=20Telegram=20authentica?= =?UTF-8?q?tion=20flow=20with=20widget=20support=20for=20=E2=80=A6=20(#83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: implement Telegram authentication flow with widget support for browser sign-in * feat: refactor Telegram platform hooks to use non-throwing functions for improved error handling * feat: implement Telegram OIDC authentication flow and update related components * feat: implement redirection for non-Telegram users after browser authentication and remove BrowserAuthenticatedScreen component * feat: enhance user data handling by integrating first and last name in useUser hook and updating verification components * feat: refactor DashboardTopBar to improve layout and integrate logout functionality for non-Telegram users --- .env | 3 + src/app/api/auth/telegram-oidc/route.ts | 27 ++++++ src/app/context/tma.tsx | 20 ++++- src/app/page.tsx | 38 +++++++- src/app/plans/choose/page.tsx | 29 +++--- src/app/verification/details/page.tsx | 13 ++- src/app/verification/page.tsx | 7 +- src/components/auth/BrowserLoginScreen.tsx | 89 +++++++++++++++++++ src/components/auth/TelegramLoginButton.tsx | 54 +++++++++++ .../dashboard/wallet/DashboardTopBar.tsx | 35 ++++++-- src/hooks/useIsTelegramEnv.ts | 46 ++++++++++ src/hooks/useTelegramPlatform.ts | 20 ++++- src/hooks/useTgBackButton.ts | 13 ++- src/hooks/useUser.ts | 70 ++++++++++++--- src/lib/auth.ts | 81 +++++++++++++++++ src/lib/constants.ts | 4 + 16 files changed, 498 insertions(+), 51 deletions(-) create mode 100644 src/app/api/auth/telegram-oidc/route.ts create mode 100644 src/components/auth/BrowserLoginScreen.tsx create mode 100644 src/components/auth/TelegramLoginButton.tsx create mode 100644 src/hooks/useIsTelegramEnv.ts diff --git a/.env b/.env index 39646a7..0ddf803 100644 --- a/.env +++ b/.env @@ -4,5 +4,8 @@ API_BASE_URL=http://localhost:3000 # Public Telegram bot username (no @, used to build t.me links client-side) NEXT_PUBLIC_TELEGRAM_BOT_USERNAME=BitcoinDeepaBot +# Telegram Login (OIDC) Client ID from @BotFather -> bot -> Login Widget (public, not secret) +NEXT_PUBLIC_TELEGRAM_CLIENT_ID= + # MongoDB connection string MONGODB_URI=your_mongodb_connection_string_here diff --git a/src/app/api/auth/telegram-oidc/route.ts b/src/app/api/auth/telegram-oidc/route.ts new file mode 100644 index 0000000..7c63b43 --- /dev/null +++ b/src/app/api/auth/telegram-oidc/route.ts @@ -0,0 +1,27 @@ +import { NextRequest, NextResponse } from "next/server"; + +/** + * Proxies a Telegram Login (OIDC) id_token to the backend for verification. + * Unlike /api/auth/telegram, this has no dev-mode fallback: verifying the + * JWT's signature requires fetching Telegram's JWKS, which only makes sense + * to do once, on the backend. + */ +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + + const response = await fetch(`${process.env.API_BASE_URL}/auth/telegram-oidc`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(body), + }); + + const data = await response.json(); + return NextResponse.json(data, { status: response.status }); + } catch (error) { + console.error("Error in telegram OIDC auth:", error); + return NextResponse.json({ error: "Failed to authenticate with Telegram" }, { status: 500 }); + } +} diff --git a/src/app/context/tma.tsx b/src/app/context/tma.tsx index b604e8a..508e32a 100644 --- a/src/app/context/tma.tsx +++ b/src/app/context/tma.tsx @@ -3,8 +3,19 @@ import { useEffect } from "react"; import { initMiniApp, postEvent } from "@telegram-apps/sdk-react"; import { useRegisterUser } from "@/hooks/useRegisterUser"; +import { useIsTelegramEnv } from "@/hooks/useIsTelegramEnv"; + +// useRegisterUser calls the Telegram SDK's useLaunchParams(), which throws +// outside Telegram — only mount it once we've confirmed we're in Telegram, +// via a separate component so the hook is never called conditionally. +function RegisterUserGate() { + useRegisterUser(); + return null; +} export default function TMASetupProvider({ children }: { children: React.ReactNode }) { + const isTelegramEnv = useIsTelegramEnv(); + useEffect(() => { try { const [miniApp] = initMiniApp(); @@ -15,7 +26,10 @@ export default function TMASetupProvider({ children }: { children: React.ReactNo } }, []); - useRegisterUser(); - - return <>{children}; + return ( + <> + {isTelegramEnv && } + {children} + + ); } diff --git a/src/app/page.tsx b/src/app/page.tsx index c1ce326..b576e1c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,14 +3,17 @@ import { useEffect, useMemo, useState } from "react"; import Image from "next/image"; import Link from "next/link"; +import { useRouter } from "next/navigation"; import { useInitData, useLaunchParams } from "@telegram-apps/sdk-react"; import { Badge, Button, Cell, Navigation, Progress, Title } from "@telegram-apps/telegram-ui"; import { useTheme } from "@/app/context/theme"; import { useStore } from "@/lib/store"; -import { getAuthTokenFromStorage, getIsExistingUserFromStorage } from "@/lib/auth"; +import { getAuthTokenFromStorage, getIsExistingUserFromStorage, isAuthenticated } from "@/lib/auth"; import { TELEGRAM_BOT_URL, TELEGRAM_BOT_USERNAME } from "@/lib/constants"; import { useRegisterTelegramUser } from "@/hooks/query/useRegisterTelegramUser"; import { useUserCount } from "@/hooks/query/useUserCount"; +import { useIsTelegramEnv } from "@/hooks/useIsTelegramEnv"; +import BrowserLoginScreen from "@/components/auth/BrowserLoginScreen"; // ─── Shared progress bar ──────────────────────────────────────────────────── @@ -156,7 +159,9 @@ function UserScreen({ isExisting }: { isExisting: boolean }) { ); } -export default function Home() { +// Uses Telegram SDK hooks that throw outside the Telegram WebView — only +// mount this once we've confirmed we're running inside Telegram. +function TelegramHome() { const initLaunchParams = useLaunchParams().initData; const launchParams = useLaunchParams(); const initData = useInitData(); @@ -187,3 +192,32 @@ export default function Home() { ); } + +export default function Home() { + const router = useRouter(); + const isTelegramEnv = useIsTelegramEnv(); + const [isBrowserAuthed, setIsBrowserAuthed] = useState(() => isAuthenticated()); + + useEffect(() => { + if (isTelegramEnv === false && isBrowserAuthed) { + router.replace("/dashboard?tab=wallet"); + } + }, [isTelegramEnv, isBrowserAuthed, router]); + + // Still running the non-throwing isTMA() check — avoid flashing either UI. + if (isTelegramEnv === null) { + return {null}; + } + + if (isTelegramEnv === false) { + // Already authenticated — redirecting into /dashboard above; render + // nothing in the meantime instead of flashing the login screen. + return isBrowserAuthed ? ( + {null} + ) : ( + setIsBrowserAuthed(true)} /> + ); + } + + return ; +} diff --git a/src/app/plans/choose/page.tsx b/src/app/plans/choose/page.tsx index 2992bab..6a5100f 100644 --- a/src/app/plans/choose/page.tsx +++ b/src/app/plans/choose/page.tsx @@ -37,7 +37,6 @@ export default function ChoosePlanPage() { const redirectToPayHereViaPage = usePayHereRedirect(); const authToken = getAuthTokenFromStorage(); const { subscription } = useUser(); - const popup = initPopup(); const cancelSubscription = useCancelSubscription(); const [duration, setDuration] = useState("weekly"); @@ -117,15 +116,25 @@ export default function ChoosePlanPage() { }; const handleCancel = async () => { - const buttonId = await popup.open({ - title: "Cancel Plan", - message: "Your membership rewards will stop accruing immediately. This can't be undone.", - buttons: [ - { id: "cancel", type: "destructive", text: "Cancel Plan" }, - { id: "keep", type: "cancel" }, - ], - }); - if (buttonId !== "cancel") return; + // initPopup() throws outside Telegram (no native popup API there) — fall + // back to the browser's own confirm dialog in that case. + let confirmed: boolean; + try { + const buttonId = await initPopup().open({ + title: "Cancel Plan", + message: "Your membership rewards will stop accruing immediately. This can't be undone.", + buttons: [ + { id: "cancel", type: "destructive", text: "Cancel Plan" }, + { id: "keep", type: "cancel" }, + ], + }); + confirmed = buttonId === "cancel"; + } catch { + confirmed = window.confirm( + "Cancel Plan? Your membership rewards will stop accruing immediately. This can't be undone." + ); + } + if (!confirmed) return; haptic.impact("rigid"); diff --git a/src/app/verification/details/page.tsx b/src/app/verification/details/page.tsx index 2985dc9..be6341a 100644 --- a/src/app/verification/details/page.tsx +++ b/src/app/verification/details/page.tsx @@ -1,12 +1,12 @@ "use client"; import { useRouter } from "next/navigation"; -import { useLaunchParams } from "@telegram-apps/sdk-react"; import { Button, Input } from "@telegram-apps/telegram-ui"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { useKycInitiate, useUpdateProfile } from "@/hooks/query/useKyc"; import { useTelegramBackButton } from "@/hooks/useTgBackButton"; +import { useUser } from "@/hooks/useUser"; import { haptic } from "@/lib/haptics"; import { createUserSchema, type CreateUserFormData } from "@/lib/validations"; @@ -27,8 +27,7 @@ const FIELDS: Array<{ export default function VerificationDetailsPage() { const router = useRouter(); - const launchParams = useLaunchParams(); - const userData = launchParams.initData?.user; + const { id: userId, username, firstName, lastName } = useUser(); const kycInitiate = useKycInitiate(); const updateProfile = useUpdateProfile(); @@ -40,8 +39,8 @@ export default function VerificationDetailsPage() { resolver: zodResolver(createUserSchema), mode: "onChange", defaultValues: { - first_name: userData?.firstName ?? "", - last_name: userData?.lastName ?? "", + first_name: firstName ?? "", + last_name: lastName ?? "", email: "", phone: "", address: "", @@ -75,8 +74,8 @@ export default function VerificationDetailsPage() { onSuccess: () => { kycInitiate.mutate( { - user_id: userData?.id, - username: userData?.username, + user_id: userId ? Number(userId) : undefined, + username, ...formData, }, { diff --git a/src/app/verification/page.tsx b/src/app/verification/page.tsx index e3004ff..5ea0722 100644 --- a/src/app/verification/page.tsx +++ b/src/app/verification/page.tsx @@ -3,12 +3,12 @@ import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import Image from "next/image"; -import { useLaunchParams } from "@telegram-apps/sdk-react"; import { Button, Modal } from "@telegram-apps/telegram-ui"; import { X } from "lucide-react"; import { Drawer } from "@xelene/vaul-with-scroll-fix"; import { VisuallyHidden } from "@radix-ui/react-visually-hidden"; import { useTelegramPlatform } from "@/hooks/useTelegramPlatform"; +import { useUser } from "@/hooks/useUser"; import { useKycStatus } from "@/hooks/query/useKyc"; import { useTelegramBackButton } from "@/hooks/useTgBackButton"; import { haptic } from "@/lib/haptics"; @@ -95,8 +95,7 @@ const SHOW_STEPS_FOR: VerificationStatus[] = [ export default function VerificationIntroPage() { const router = useRouter(); - const launchParams = useLaunchParams(); - const userData = launchParams.initData?.user; + const { id: userId } = useUser(); const { isMobile } = useTelegramPlatform(); const [showMobileWarning, setShowMobileWarning] = useState(false); @@ -276,7 +275,7 @@ export default function VerificationIntroPage() { size="l" stretched style={{ borderRadius: "12px" }} - disabled={showSteps && !userData} + disabled={showSteps && !userId} onClick={initiateVerification} > {status === "DECLINED" || diff --git a/src/components/auth/BrowserLoginScreen.tsx b/src/components/auth/BrowserLoginScreen.tsx new file mode 100644 index 0000000..8f4fcfd --- /dev/null +++ b/src/components/auth/BrowserLoginScreen.tsx @@ -0,0 +1,89 @@ +"use client"; + +import { useState } from "react"; +import Image from "next/image"; +import Link from "next/link"; +import { Button, Title } from "@telegram-apps/telegram-ui"; +import { useTheme } from "@/app/context/theme"; +import { authenticateWithTelegramOidc, saveAuthToStorage } from "@/lib/auth"; +import type { TelegramOidcAuthData } from "@/lib/auth"; +import { TELEGRAM_BOT_URL } from "@/lib/constants"; +import TelegramLoginButton from "@/components/auth/TelegramLoginButton"; + +interface BrowserLoginScreenProps { + onLoggedIn: () => void; +} + +/** + * Shown when the app is opened outside Telegram (a plain browser tab). + * Signs the user in via Telegram's Login Widget rather than Mini App + * initData, since initData only exists inside the Telegram WebView. + */ +export default function BrowserLoginScreen({ onLoggedIn }: BrowserLoginScreenProps) { + const { isDark } = useTheme(); + const [error, setError] = useState(null); + const [isLoading, setIsLoading] = useState(false); + + const handleAuth = async (data: TelegramOidcAuthData) => { + setError(null); + + if (data.error || !data.id_token) { + setError("Couldn't sign you in with Telegram. Please try again."); + return; + } + + setIsLoading(true); + try { + const result = await authenticateWithTelegramOidc(data.id_token); + if (!result.token) throw new Error("No token returned"); + saveAuthToStorage(result.token); + onLoggedIn(); + } catch (err) { + console.error(err); + setError("Couldn't sign you in with Telegram. Please try again."); + } finally { + setIsLoading(false); + } + }; + + return ( +
+
+ Bitcoin Deepa +
+ + + Sign In With Telegram + + +

+ Bitcoin Deepa runs best inside Telegram. Sign in with your Telegram account to continue in + the browser. +

+ +
+ +
+ + {isLoading && ( +

+ Signing you in… +

+ )} + {error &&

{error}

} + + + + +
+ ); +} diff --git a/src/components/auth/TelegramLoginButton.tsx b/src/components/auth/TelegramLoginButton.tsx new file mode 100644 index 0000000..ed95e45 --- /dev/null +++ b/src/components/auth/TelegramLoginButton.tsx @@ -0,0 +1,54 @@ +"use client"; + +import { useEffect, useId, useRef } from "react"; +import { TELEGRAM_CLIENT_ID } from "@/lib/constants"; +import type { TelegramOidcAuthData } from "@/lib/auth"; + +interface TelegramLoginButtonProps { + onAuth: (data: TelegramOidcAuthData) => void; + className?: string; +} + +/** + * Renders Telegram's Login library (https://core.telegram.org/bots/telegram-login) — + * the current OIDC-based login, which superseded the legacy iframe widget. The + * script scans the DOM for a `.tg-auth-button` element and wires a popup-based + * login flow to it; the onauth callback receives { id_token, user, error }. + * The id_token is a signed JWT that must be verified server-side (JWKS), not a + * hash to check against the bot token. + */ +export default function TelegramLoginButton({ onAuth, className }: TelegramLoginButtonProps) { + const containerRef = useRef(null); + const rawId = useId().replace(/[^a-zA-Z0-9]/g, ""); + + useEffect(() => { + const container = containerRef.current; + if (!container) return; + + const callbackName = `telegramOidcCallback_${rawId}`; + (window as unknown as Record)[callbackName] = (data: TelegramOidcAuthData) => + onAuth(data); + + const button = document.createElement("button"); + button.type = "button"; + button.className = "tg-auth-button"; + button.textContent = "Sign In with Telegram"; + + const script = document.createElement("script"); + script.src = "https://oauth.telegram.org/js/telegram-login.js?5"; + script.async = true; + script.setAttribute("data-client-id", TELEGRAM_CLIENT_ID); + script.setAttribute("data-onauth", `${callbackName}(data)`); + script.setAttribute("data-request-access", "write"); + + container.appendChild(button); + container.appendChild(script); + + return () => { + delete (window as unknown as Record)[callbackName]; + container.innerHTML = ""; + }; + }, [onAuth, rawId]); + + return
; +} diff --git a/src/components/dashboard/wallet/DashboardTopBar.tsx b/src/components/dashboard/wallet/DashboardTopBar.tsx index b2d2fac..51c30ca 100644 --- a/src/components/dashboard/wallet/DashboardTopBar.tsx +++ b/src/components/dashboard/wallet/DashboardTopBar.tsx @@ -1,13 +1,20 @@ "use client"; -import { Avatar } from "@telegram-apps/telegram-ui"; +import { useRouter } from "next/navigation"; +import { Avatar, IconButton } from "@telegram-apps/telegram-ui"; +import { LogOut } from "lucide-react"; import { VisibleToggle } from "@/components/ui/visible-toggle"; import { useUser } from "@/hooks/useUser"; import { useStore } from "@/lib/store"; +import { useIsTelegramEnv } from "@/hooks/useIsTelegramEnv"; +import { clearAuthFromStorage } from "@/lib/auth"; +import { haptic } from "@/lib/haptics"; export function DashboardTopBar() { + const router = useRouter(); const { initials, displayName, photoUrl } = useUser(); const { balanceVisible, toggleBalanceVisible } = useStore(); + const isTelegramEnv = useIsTelegramEnv(); return (
@@ -22,11 +29,27 @@ export function DashboardTopBar() { {displayName}

- +
+ {isTelegramEnv === false && ( + { + haptic.impact("medium"); + clearAuthFromStorage(); + router.replace("/"); + }} + > + + + )} + +
); } diff --git a/src/hooks/useIsTelegramEnv.ts b/src/hooks/useIsTelegramEnv.ts new file mode 100644 index 0000000..ceea4eb --- /dev/null +++ b/src/hooks/useIsTelegramEnv.ts @@ -0,0 +1,46 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { isTMA } from "@telegram-apps/sdk-react"; + +/** + * Non-throwing check for whether the app is running inside the Telegram + * client. Unlike useLaunchParams()/useInitData(), this never throws, so it's + * safe to call before deciding whether to mount Telegram-SDK-dependent UI. + * + * Uses the async, "complete" variant of isTMA() rather than the sync one: + * root layout loads Telegram's telegram-web-app.js unconditionally, which + * stubs out window.Telegram.WebApp with empty initData even in a plain + * browser, so the sync heuristic (which just checks for that object's + * presence) reports a false positive. The async variant round-trips an + * actual Mini Apps method call and only resolves true if something answers. + * + * Returns null until the check has resolved on the client. + */ +export function useIsTelegramEnv(): boolean | null { + const [isTelegramEnv, setIsTelegramEnv] = useState(null); + + useEffect(() => { + let cancelled = false; + + // Cast around the ambient overload set here — depending on which of + // @telegram-apps/sdk's and @telegram-apps/bridge's declarations TS + // resolves through the re-export chain, it sometimes only "sees" the + // sync (0-arg) signature and rejects the 'complete' call below. + const isTMAComplete = isTMA as unknown as (type: "complete") => Promise; + + isTMAComplete("complete") + .then((result) => { + if (!cancelled) setIsTelegramEnv(result); + }) + .catch(() => { + if (!cancelled) setIsTelegramEnv(false); + }); + + return () => { + cancelled = true; + }; + }, []); + + return isTelegramEnv; +} diff --git a/src/hooks/useTelegramPlatform.ts b/src/hooks/useTelegramPlatform.ts index fb4b1c0..ef13c51 100644 --- a/src/hooks/useTelegramPlatform.ts +++ b/src/hooks/useTelegramPlatform.ts @@ -1,6 +1,6 @@ "use client"; -import { useLaunchParams } from "@telegram-apps/sdk-react"; +import { retrieveLaunchParams } from "@telegram-apps/sdk-react"; const MOBILE_PLATFORMS = ["ios", "android"]; @@ -8,10 +8,24 @@ const MOBILE_PLATFORMS = ["ios", "android"]; * Identifies the Telegram client the Mini App is running in. * `isMobile` is true only for the native iOS/Android apps — used to gate * features (e.g. camera-based KYC) that don't work on desktop/web clients. + * + * Uses the plain retrieveLaunchParams() function (not the useLaunchParams() + * hook) in a try/catch — the hook throws outside Telegram even with the ssr + * flag set, whereas this is just a regular function call we can safely + * swallow errors from. */ export function useTelegramPlatform() { - const launchParams = useLaunchParams(true); - const platform = launchParams?.platform; + let platform: string | undefined; + try { + // Cast around the same ambient-overload flakiness noted in + // useIsTelegramEnv.ts — TS sometimes only resolves the 0-arg signature. + const retrieveCamelCased = retrieveLaunchParams as unknown as (camelCase: true) => { + platform?: string; + }; + platform = retrieveCamelCased(true).platform; + } catch { + platform = undefined; + } return { platform, diff --git a/src/hooks/useTgBackButton.ts b/src/hooks/useTgBackButton.ts index 3eb4f5e..875a7f3 100644 --- a/src/hooks/useTgBackButton.ts +++ b/src/hooks/useTgBackButton.ts @@ -1,11 +1,16 @@ "use client"; import { useEffect, useRef } from "react"; -import { useBackButton } from "@telegram-apps/sdk-react"; +import { useBackButtonRaw } from "@telegram-apps/sdk-react"; -/** Shows the native Telegram back chevron and wires it to `onBack` for the page's lifetime. */ +/** + * Shows the native Telegram back chevron and wires it to `onBack` for the + * page's lifetime. Uses the "raw" (non-throwing) resource hook — the plain + * useBackButton() throws outside Telegram, where there's no such control to + * show; here we just no-op instead. + */ export function useTelegramBackButton(onBack: () => void) { - const backButton = useBackButton(); + const backButton = useBackButtonRaw(true)?.result; // Callers typically pass an inline arrow function, which is a new reference // every render. Routing the call through a ref keeps the effect's dependency @@ -14,6 +19,8 @@ export function useTelegramBackButton(onBack: () => void) { onBackRef.current = onBack; useEffect(() => { + if (!backButton) return; + backButton.show(); const handleClick = () => onBackRef.current(); backButton.on("click", handleClick); diff --git a/src/hooks/useUser.ts b/src/hooks/useUser.ts index 1ad114c..ca0e800 100644 --- a/src/hooks/useUser.ts +++ b/src/hooks/useUser.ts @@ -1,35 +1,79 @@ "use client"; -import { useLaunchParams } from "@telegram-apps/sdk-react"; +import { retrieveLaunchParams } from "@telegram-apps/sdk-react"; import { useStore } from "@/lib/store"; import { useSubscriptionCurrent } from "@/hooks/query/useSubscriptionCurrent"; import { useKycStatus } from "@/hooks/query/useKyc"; +import { getUserFromToken } from "@/lib/auth"; /** - * Single source of truth for user-related data: Telegram identity (client-only), - * registration status (store, synced by useAuthGuard), and server state - * (subscription, KYC status) — so components don't each re-derive these. + * Identity from Telegram's initData when available (in Telegram), falling + * back to the id/username embedded in the stored auth token (outside + * Telegram, e.g. a browser session signed in via the Login Widget). + * Uses the plain retrieveLaunchParams() function rather than the + * useLaunchParams() hook, since the hook throws outside Telegram. + */ +interface CamelCasedTelegramUser { + id?: number; + username?: string; + firstName?: string; + lastName?: string; + photoUrl?: string; +} + +function getIdentity() { + try { + // Cast around the same ambient-overload flakiness noted in + // useIsTelegramEnv.ts — TS sometimes only resolves the 0-arg signature. + const retrieveCamelCased = retrieveLaunchParams as unknown as (camelCase: true) => { + initData?: { user?: CamelCasedTelegramUser }; + }; + const telegramUser = retrieveCamelCased(true).initData?.user; + if (telegramUser) { + return { + id: telegramUser.id?.toString() ?? "", + username: telegramUser.username, + firstName: telegramUser.firstName, + lastName: telegramUser.lastName, + photoUrl: telegramUser.photoUrl, + }; + } + } catch { + // Not running inside Telegram — fall through to the token-based identity. + } + + const tokenUser = getUserFromToken(); + return { + id: tokenUser?.id ?? "", + username: tokenUser?.username, + firstName: undefined as string | undefined, + lastName: undefined as string | undefined, + photoUrl: undefined as string | undefined, + }; +} + +/** + * Single source of truth for user-related data: identity, registration + * status (store, synced by useAuthGuard), and server state (subscription, + * KYC status) — so components don't each re-derive these. */ export function useUser() { - const launchParams = useLaunchParams(); - const telegramUser = launchParams.initData?.user; + const { id, username, firstName, lastName, photoUrl } = getIdentity(); const { isExistingUser } = useStore(); const { data: subscription, isLoading: subscriptionLoading } = useSubscriptionCurrent(); const { data: kycData } = useKycStatus(); - const username = telegramUser?.username; const displayName = username ?? "User"; const initials = username?.slice(0, 2).toUpperCase() ?? "BD"; return { - id: telegramUser?.id?.toString() ?? "", + id, username, - displayName: - (telegramUser?.firstName && telegramUser?.lastName - ? `${telegramUser.firstName} ${telegramUser.lastName}` - : telegramUser?.firstName) ?? displayName, + firstName, + lastName, + displayName: (firstName && lastName ? `${firstName} ${lastName}` : firstName) ?? displayName, initials, - photoUrl: telegramUser?.photoUrl, + photoUrl, isExistingUser, subscription: subscription ?? null, subscriptionLoading, diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 379090f..57166e7 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -20,6 +20,25 @@ export interface PlanSelectionData { planName: string; } +/** + * Payload Telegram's Login library (https://core.telegram.org/bots/telegram-login) + * passes to the onauth callback — distinct from Mini App initData, this is + * used for browser-based sign-in outside Telegram. id_token is a signed JWT + * that must be verified server-side (JWKS) before the claims in `user` are trusted. + */ +export interface TelegramOidcAuthData { + id_token?: string; + user?: { + id: number; + name?: string; + given_name?: string; + family_name?: string; + preferred_username?: string; + picture?: string; + }; + error?: string; +} + /** * Authenticate user with Telegram initData */ @@ -60,6 +79,38 @@ export async function authenticateWithTelegram(initData: string): Promise { + try { + const response = await fetch("/api/auth/telegram-oidc", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ id_token: idToken }), + }); + + const result = await response.json(); + + if (!response.ok) { + throw new Error(result.error || result.message || "Telegram login failed"); + } + + return { + token: result.token, + user: result.user, + isRegistered: result.isRegistered ?? true, + }; + } catch (error) { + console.error("Error during Telegram OIDC authentication:", error); + throw error; + } +} + /** * Register a new user with the backend */ @@ -178,3 +229,33 @@ export const clearAuthFromStorage = () => { export const isAuthenticated = (): boolean => { return !!getAuthTokenFromStorage(); }; + +/** + * Decodes the stored JWT's payload for identity ({ id, username }) without + * verifying it — used as a fallback source of identity outside Telegram, + * where there's no initData to read from. Both auth flows (initData and + * the Login Widget) mint tokens with the same payload shape, so this works + * regardless of which one signed the user in. + */ +export const getUserFromToken = (): { id: string; username?: string } | null => { + const token = getAuthTokenFromStorage(); + if (!token) return null; + + try { + const payloadSegment = token.split(".")[1]; + if (!payloadSegment) return null; + + const base64 = payloadSegment.replace(/-/g, "+").replace(/_/g, "/"); + const json = decodeURIComponent( + atob(base64) + .split("") + .map((c) => "%" + c.charCodeAt(0).toString(16).padStart(2, "0")) + .join("") + ); + const payload = JSON.parse(json); + + return typeof payload.id === "string" ? { id: payload.id, username: payload.username } : null; + } catch { + return null; + } +}; diff --git a/src/lib/constants.ts b/src/lib/constants.ts index a2a052d..cb6f9f7 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -2,3 +2,7 @@ export const TELEGRAM_BOT_USERNAME = process.env.NEXT_PUBLIC_TELEGRAM_BOT_USERNAME || "BitcoinDeepaBot"; export const TELEGRAM_BOT_URL = `https://t.me/${TELEGRAM_BOT_USERNAME}`; + +// Client ID for Telegram Login (OIDC), from @BotFather -> bot -> Login Widget. +// Public identifier, not a secret — see https://core.telegram.org/bots/telegram-login +export const TELEGRAM_CLIENT_ID = process.env.NEXT_PUBLIC_TELEGRAM_CLIENT_ID || ""; From 51fe9ed8f13b0a9e31dca063b6d1cc92318b09dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=8F=92=CE=B1=E1=83=A7=CE=B1=CE=B1=C9=B3?= <108685206+rayaanr@users.noreply.github.com> Date: Thu, 6 Aug 2026 12:29:05 +0530 Subject: [PATCH 23/24] fix: Wallet metrics and enhance UI components (#85) * feat: refactor wallet metrics and improve UI components for better performance and user experience * feat: update caching strategy and revalidation for news articles to enhance performance * feat: update favicon and add metadata for improved site identity * feat: implement PWA --- next.config.mjs | 20 ++ public/apple-touch-icon.png | Bin 0 -> 28897 bytes public/icons/icon-192.png | Bin 0 -> 38912 bytes public/icons/icon-512.png | Bin 0 -> 178732 bytes public/icons/icon-maskable-192.png | Bin 0 -> 21707 bytes public/icons/icon-maskable-512.png | Bin 0 -> 99181 bytes public/offline.html | 49 +++++ public/sw.js | 71 +++++++ src/app/dashboard/news/[id]/page.tsx | 2 +- src/app/dashboard/news/page.tsx | 2 +- src/app/dashboard/page.tsx | 45 ++--- src/app/dashboard/plans/page.tsx | 19 +- src/app/favicon.ico | Bin 25931 -> 15086 bytes src/app/layout.tsx | 22 +++ src/app/manifest.ts | 41 ++++ src/app/plans/choose/page.tsx | 16 +- src/app/register-sw.tsx | 12 ++ .../dashboard/activity/ActivityRow.tsx | 12 +- .../dashboard/tasks/ManageTasksSection.tsx | 20 ++ .../dashboard/wallet/TotalValueCard.tsx | 7 +- src/components/motion/number-ticker.tsx | 176 ++++++++++++++++++ src/components/ui/plan-card.tsx | 48 ++--- src/hooks/query/useWalletMetrics.ts | 55 ++++++ src/lib/ease.ts | 57 ++++++ src/lib/news.ts | 9 +- 25 files changed, 603 insertions(+), 80 deletions(-) create mode 100644 public/apple-touch-icon.png create mode 100644 public/icons/icon-192.png create mode 100644 public/icons/icon-512.png create mode 100644 public/icons/icon-maskable-192.png create mode 100644 public/icons/icon-maskable-512.png create mode 100644 public/offline.html create mode 100644 public/sw.js create mode 100644 src/app/manifest.ts create mode 100644 src/app/register-sw.tsx create mode 100644 src/components/motion/number-ticker.tsx create mode 100644 src/hooks/query/useWalletMetrics.ts create mode 100644 src/lib/ease.ts diff --git a/next.config.mjs b/next.config.mjs index 1c4efaa..2485c61 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,6 +1,16 @@ /** @type {import('next').NextConfig} */ const nextConfig = { allowedDevOrigins: ["*.sats.day", "*.ngrok-free.app"], + experimental: { + // Since Next 15, page segments aren't reused across Link/router.push + // navigation by default (only layouts + true back/forward are). This + // lets the news list <-> article navigation reuse the client RSC cache + // instead of re-requesting the server on every tap. + staleTimes: { + dynamic: 60, + static: 900, + }, + }, async headers() { return [ { @@ -10,6 +20,16 @@ const nextConfig = { source: "/((?!_next/static|_next/image).*)", headers: [{ key: "Cache-Control", value: "no-store, must-revalidate" }], }, + { + // Service worker script: never cache (so updates ship immediately) + // and lock down what it's allowed to load. + source: "/sw.js", + headers: [ + { key: "Content-Type", value: "application/javascript; charset=utf-8" }, + { key: "Cache-Control", value: "no-cache, no-store, must-revalidate" }, + { key: "Content-Security-Policy", value: "default-src 'self'; script-src 'self'" }, + ], + }, ]; }, }; diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eda67b14f2ba37563b885301a2f1055a73a02144 GIT binary patch literal 28897 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 z zs&_k=?gTpwRH=+Cyj$bQdBk*BY6kW4U}G(rFRcABW;5c!{9BqRY9*Sm+<1%Rv{99& zRmZFj1KI78V)DWiZ>qxtm4j9Lo{}T6?knDJgnhY}aOD!t-=xk+am_>-R+TI73p{DK zId4>!Y@U(hdo}l&t9}SKhq(VuHWzmx$W42ZQ+gRhcDg~8Q--)v6{hI^U5TH*2PTyF zTQlrVQDjSgWKCV2BePC(N*JOH`hVdTr z6)Esvs(siD))grWJ}R*6hI-X?v%hTC%LV@EA;`|tNjFx;jlR+JtxS78z06-oy1uX2(Nsvf1y}9g9latT+==s% z_KB*y_-Ez0vsAot6YBHtCsISX>ZGMPS{G?S{wTt@y^U)yP+=WK)#h|ve+o9ChB<6VJOku*Gz5nJw>{X%0Q(W;J=^Hslt`0IDdhb2jmv6aUf z@W=`~7rz0N`wdn`x~cmbW&w+PZ^M;F#(O!qd6ijrL3{-E`L9b+hG!&ABi@C(o?eo( z1XOD|Ub!A(vyqsA&gR)>nj25qwnJlkN1OzWNGD z_~!?sb(3FPl~5TJHl*)}dIog8Dqw`uI0)Z&o!pbJRNwbM?OpdCOdjEi9m*l@a=+C> zDrEQH{5EqcG`-3TIqyp7#iBD+9Zi;9y@iTP=>TVuNmun(U;fm_CLYJZK=cjyWG=s30|Fqr5`H0fQpQ(#+O)^IzCr8|r7|vi4~q@#=6wx!kn9 z_i{HSiHU^M%lC(`Op>9n&8zqig@RpB}l}3<3R5 zW8V~>Nf&G#+jb_l&53Or6Wi9r&cwED+s+%?b~5qA|NEWiocsTx_eEdq-d(%;sj9Wt zs!p7d3);yXL(P_y&8rB^zC--5`5x!&m7~b5{hfRd>yZTQY(^WKG@Gl_98$KUVl9l3 z*L>)*_EOj2SLbX5epH=jlxwqBF1K+Je&JmptH3J z0LhM^gQ616dUW%bijYy0l>V-lVT5*M>EvEY+ZWyR;_D!PVg(Pe?u&{{;VMP{6>xf0 zKnIt&R3+<$`jmLwR1u54$i^eI6#kdA95zgL!zonp(>Iva(5;rUOhWvZ2E4!Ni>i!+ z)SygHgoYtubLPy}pqV={hP5CbWX>DKW2xLf&F@^He-EzkL_m;EpWoW4qqV7qjD@a2PD%(xN|hS;%NZXROgR-xDP%H5t?n* zH`7|lW?-lz@8j2mYxyfmjmtF9>%_{L@5hy&q5w9{azEZWa2}oc47b$7fc}}LQv>LItp`v8 zLa6br>|t_V-#>m;XW^8Te9ySF5X#IK#qDepz9Itnm&t@c+pfeYZ)Q&mq$ApBgNx8a z{=8Ffl`tw5)dX_51G72BkIq2fW|m0G{D4>s&yFn0aT$!^)*~eTe9U?J z>Slgv4}#f4K&Wyb(#g3Vu+9^y%7mskbTemN3YtxCGH0H8StD1W%R(|+g`fLVdrZ^z zoPw^T@=fb2LXAv}_q*{LS%g@Au~i4i#@wWaLhT6h74GZET|%5tYW!)2lr?o5OQW

*9&z`#MhBjR z4N+ezV5aYRmq!F$U$Ub)UHehu$^qjljE*NoMKE}M6~yah zHQqxpNT)Rnl)+*)%wpvmK44*Z?&A*H4>1b+tHyBPS;E0TBm71HX|@q4t-9lUKl{YX znHj3RgJx$zTllf$S0_sM0b_3Hb!CX<)|BiAZb1$B7rwVYeAnFl$7rc8H1n-6BCeK! z;j;GFM~QX!h|#&ojwwd2=oXQhW|rkaxQ<0f zRUF8wpc6aC449RRaI|!O_;-U=eooxT)iU3mriu}Dw6Jp8AxD&t+CpaYuQtU!$X!I>`Jv*0{(pS{MKgfrH5WB{#L-AG zEpWF6BvkH1Bl*d`;PpiMjaKI!RP~`fy9EYJ)k)OrKtNkha%On7W^W`u7 zddmX!X;eF72+MQEP4c<-*cJBDr$@3Wqnx^v=mBGOeUisR-JlDu1-_(|x}AFcVs2mK zt&rx|U2)V=yDk;D-tgvEMSJi-2Hr`0m3&iQO6uNzkdjihv$4dE`d_<(W1O%M=I5ZP!ILG;GRg%+Y~l{OuB@Y#XVeYgc0!B=z_0YPlxsWGH}L9n2kr=5n5n54 zhH1PJHWyCVa$reeQuplDVoR#s#iZuc+N$d@Pv&YGBeVBk@j(>X6VB2h>xbM(b*!-0 z(n3LDDc8!QLuzr&U=Pra`|O122pWnREZAer9&|)`A1b6)I}1}-uvQ1280{8#HALdZ zqipUWwK~WI`}<Q)rz8gI+jeH8G96bFe2Y=dY9dB4X z{Eyra8QbnmV0|JxH%T>?;K@rs5nCFvhML_=pdXa_0*b#{zV09*?}K`=b6Q~gdHWHL z=V(=AsroWi`*WZ-AW~T2_cB}`Oew5h@;)pW7>FtLIko+bjCF4_7dI(7ej%{|fgQ+1 z!Uxe&4pY?9$g*vDhhc*x$MMqW1iK|gla}`+4eH$z2kcyxh6r88P?kguC8*43nF#A; zoL_390UTXcxF0#qgADfliP9}~VDmMi=FmQjAu?;d@yTeIKl=!SKHuPCktr@v`am!N z+x_*#)Bq!cqs$oYarblRW$NcZ-;Fv@T?5MF$J>0E5$_&wXrR>~M`c%znKiOhqg4T6 zRjFD!&~@O3v+ZU=bo5HB{|9=G0Fy~{``xEpn`x}An}ZyuW|OB-l7Z;Z9pk?A8-5ZH z5b9PM!ea+k@7AEfj=aQpoUOC|+?SscFgq>1Co*@b(Kzq@WA=mvx6|-w%!1A{$!eEp z>M?Ante5&%M9i#i`2&l zb}1Y8#$1(|R_2Qzn8^h@Ea!P90W-LhS4Ig7itqVK)jj>k*=}ierkp6k-w24-%g_I| zSdWjYc7iOv`rz5d$LdLjO~BbDaeh8VRVXEW<6liVK`ke}Y#*C2``j1pDkkerq$#O< zNm~kn;Zv_JC*#6xBRA0@Tffl(Ywpm*dmo%JuKtdI1hN(l!JMklm1Xp~sx+Y)Pju^n zv^g8i{);M%l;Qm-6uR7VRZ(jPu)UZ#+S)WHfS!O3F}b(qTIXuWOlCt?2Dm}x&Nt@y&O8#r9ph> z74;~FW;$%G4R99%;&mzpFtj3*E~NaZKNb7}f#G;F_HAoD} zVsP&v9qt{Q0>dELu8Q@#p)0B2#&_gGA@m_)MY=bcU*2dlN`E-~ffnY=u z-2PQv@o&=TsK@-Zh$^pjVpifB^B&@W2-M@5qi_#;VOt34^raT!`iNxFm*`drb2ug$OJp7XxDd zxO$ISi30s4!moW&w!~{s$RvzNO)|0#nfb4Yja--G{BHKiwEiH^CD){ zSqts~CM5^_8=byeW~2uhooD>gzsm*jeu=RgbmxT^)*7^}U}8iLx(SmLU|-W{KvX) z>iFM^?|7GBphgGQ$tx7-4v73|A9TPV9fAQC=XTeijKJrxpp*}#D2?{OGfcAPq74|n zg1I@~O9L&_PEH6Vyk}Y;*e#sL;amCwBEN=^sF+ogAJ@|LH_YWUHN*X5=(vXwdoA`= zNJW3I7o0T!|HEOUKf@1G$^8@mXyzNlY%?Id@$);Puk9;fZYx=oj~!ZKNCKFw0qfjs z>J9#KBcb1b@0byJ>u2afIig#F$TG??RW7qVXRjMjiDS z&koq0z*&Ha$by+`feq@7#x4l217@$FF{1+fSs#J;47rmWAm0~1`z;xazWJkeyiK5% zKH>Lu?;QRzyc7CPePi~Pd?VZjeIxB21cc3N57OXi^MPja^{YmEhW(Ry9;#yEMeF3)U1o{1e^iSyN=j zU-Xg6-OQ!e?is7GDACE5W9h2R$o+Ki3J~nY3oS9_PF=wiqUMFHQ>@9DIgKxM-LJ?` z&VEuz;GK_pQc?Y*&n{aoREHJFFcqt19*o#W5uX{9)By61!bapIWWA}O9i-8DT(cM0 zj^|`{Ugj=6geEfCIZu9TWnXRsLBwk@h;$ecop^nJS~KtH+{z`Vk6?q-@ZZg$;Y~= z{YFgUKA#U;hSn*TOW}&X=xxhaTAjMCEssU8;j?!aqI+Xi<00oPqC6NO&fSpOw_8&#ZGV#w%OL9vn;6=K zG`{cVpL{ZK){HHhIS9)K%(sX*;wvM6!5pqlHss-hzU|rK$m@D7mZ!`*Mzih{n+^1? zB2zrMX?`5S#C2QJ(%ln%h{GxAp4t>(&cJXkH~tIQguhC`9uZwE4!jS|c8@1R-z4J? zVO6ft8p%g$PDJh6-+k1qMUV(qb1jzL6bx|~A=Z9pN$mnX-q@iC07}m3ZXW%&j79_S z@;hqIpdJqt^KV`WuXG8EPFsuZ+Lu8&o_K(`Xa5Bs$eEzx)Fja4fk}R!rww{I-^0G(71` zz9|Gf?iNkgsZED6$iN+%J@R0yMpCSKg^dNkPd2}rNYgdi!f13qmhd903x(&{J z^RdJY2y^NC>2F$Oc>fn9`SH|PzcMiM*`k*B0&{V#Tf#wWR-eUs<3TC$8#=i-ASCgg zNy+^i)!e7@jFPy@0rGCZtqO=*qg24Bb*PGaZFvM+@z*#LWl2EwvC~E&unQGUw1QsW zfv15~>M*AqR|x;zpnNpZ{fE3xHFq-Ksf66(+>w7CVOG9Q?Ts~NU1@Tz)Yy0Ei9u(9vhEvVTT$H8E(oR{E++ z#_d%c^~lku5tH6LW8e!F2|7$sL|t=}DfpdQMN(#et1l}SdE+`?F-bD}5vXTne_}Fo z`G(ih^qJ@?7LSK88>LK(8I2k`Jw1GrN-9f%1kGLM{v;K=XQY>2=>Xq$ku0>?*lp2# z)t58hdI|~Ko#kL0V9Xj{)=~Ed_&etzD{;~yHsx1RB{Ap2?Ji{Z5z(L2|ABYAXU!8n zJ0PLV+U$ijzd+xBJCu+X8hRry&$Oz4IY~f8ANVO5mwU?q@nQ)c^SE!jx^3&on!zh_ zdH(dK_sc+a5^p|lCl%n|veEc48UU~O+wLs$3nd#IGn3uti5^UvX~=H(z(JzNvSXju zkuM8H4iElR2yr@g(dZ}uzfX734OC-YMDO#N1R@pKI#91{cM|_!XNSesXGj<_KU&yR zD7beEz#pp8mDJ{7oI+3Ip>~mZfhf4c9bxM^(Z&O{Sk6)h%;c3=J4~yC$@%ZE6Mp2X zGcrW6&J&6y^Df0@h0_z2<=GNGp)KbKpFlR|L}(K3TYns@S?jKouZUj9H?K&c(*Eh) zL9N%qpHfk`>Ks`uo$7+%l{AN)Jx0zvHdrLg4k#q$fg?kxQr@8358?gvZ^DMC z2R*4vcMKyirLm$f)xuXMk_M8K@J(3^y*GJb`95#Edsj58o|XomH}cqmDRC{lDkB7=>ReFr zS8ak|a+0`lG<^QVv`>=B+hto@vp^0ClxZh5L$}erQhJ67jn>d9)oW{XZO5RqQ>(>a zmSlD6EGWq}#{HEah#AeMfl^NtMZe#X3>!T(ND#sA6tuG-hH?eU$p$5zK zAm%r8%uNO%8L#{?$z>>d_b}QliQ{q?=$rdFmYu=@`cmC0MX65WZEbZSi;Y+VJOM(E zcZSmYi38CIcW~1me^Ajt-4EpTYFmRE+;yU*I#VFrc`vn9@##i?q~C)HD;yC0NCn(f z^fV8{FycZjck3LsFcF%_Zwp+bLSXU3xA4H;Bv9U?aQr@3c9s7^RI_7MR|KD^Bcpb$ z1?M2huwkv$2v(VSbwpaa;C#^-N}DsjK8{18vWvuMX^Jb&d+jL}pS!u&uVfP5LK{Zy_S4^pgs6<$p#jK|=HwvePn*OUUU zyzp7uOnOhH?4A3y_Nq~g9@9MFid+vzX}K+s!D!$BKDp7FTh*PxhXklyhGE1PTZxXh z7k3s;Z28mD*e{%=VWoKADg(Dwz7e_+D%&1*Af?+RwA$Txx|SPzLwp;a@X6TyaNT2L zPs8w>LRSA*d(DS)&}tiExf@Hth6d~*tiMv$>|TPsqV6F8V*;Yewf84lpR`TKCV>Y{ zf#}kZqdR@*X67=JZ)h_7&bfK(b#X|%vzXnRQWbt=qt(FWQsGSsh_h9nGeV^`D_3OW zKvPyyew5(vjekTvh7lR5EUny#YQ8nHc}ep1Ri*v4|H7(#ciV22C5N@{nVpCWAqQVP zU%9iv@t9FHy@YUj<{DUUo_7nlipIcahCTWdcN)kJUZPo?TL? z3U9);Ndh7$+Al`8KuyYqqr2kgNLD(n7a`*M-+i@u(aJ3kcxu*}o5CH7sF&zzc8{=L*oSC zRgZk_(6Wb{?s|f-7K)&1>wn1iCry<-qXv?dnHLO-#e%d<(=UH6%9M$%@KnE#WYE=H z*4I|}$l$}2HM(M5rHYgjUTOuMHIjnd9w^KFgHkn=e7P!vwM2V|PlP#mGTMVVQiR)#(9>^_n*y|i?l2AJ4caj>cl1EAnbwHp`bH(bOB=ZuO zeWNa%5$1RQko{yKhPLB~4NPfokkEpx+`;%@|I4vu1>~I<&#D50fa);ms(fiq)5=LS zqYOz<^-6!GR^jd}!}!NnB90J$b8SWr;nW^G;Jm<+yy%F|k#8y=&LFVIE_Y|{30jU^ zz!nt1HT_Hey16#Y!=HExwyi;?&O3WEi4;Ph(?k+ym1iJKlQVvj*@YwI|CYvDpnu5Cqeh zFC!>W)w~@fp^R`9eABX*(pKTiQ!%ad#p4Rbu%E_*CNm>H*WE`qV1EjtGl=u<=qLVC zn|{vN6P_fOinU9b`E@!p{<${BxGQ8zS*+h77B7(vJ}8=QFhM7BVbi;^6UkLM;NXJr z!$h3K^&DlX^ra{hOK-U|UuNg{x}esx)tn2?5bbKoJ(aTZq>G4`5G#B8yqoqf1S*QZ zE(tD^&YXmYs;LV#AXVpDnDG+qiz5mb^TJ< zj(~aK?^eyB%74m=aCD_kqSP;dY&xZBGIA_KP<wQxU}Z=DVVAnau_g0I)TlPn?;oREShnCh=0#+dug6%BBiqf5!sS>t$p_LHPA zl!DK1&r`m04=~{J{%SF(P53CAO1bXr!y(yu zYWI16mbE*Anw>WdPQz`v7Luuj-EI0r)Gacpoj^NN}t!`%bKJE4r}l#F`O8 zzDeU-DKe{mfyNA9QQU;+w~AyuuIqjZx>hetdtKauGWQ1=TFywKmgFBRVShS;rv8px zmxuMxrM1wa>r}JAQO=7hCu-Evi(tV30%EenjFYD#^o~ZWgJvxuXln$w3+ivC&10vZ z2q02>tGUt|Wjxre{SQFg1fV3UmC?8Z*e^9YvUP1F2YA|RJu>zc5zm9fRVr|eRV86E z+dhc+1?#$dJ&tjb*4BF=+_%}+vdRW)zhR%BOB~%x(d;jX>MSNu{h8c{^xEyj33|sT zXnJhU{UdOSE3*sL)BGnQrOz7`v@WTX)+C_Vbb{X!cO0W)9A<2Z0oE)9`l$9lI}vXp z&8_`leDwG+?6$zifPSqn zj2LyMK`BDGs$pW^kWC-;rsi&uH3VubSZd9IXvsbIrKd07+LXBhqP!%gihOBwbJGiI zPo&!;B5U=kQMonws(pe=(X&(Z>VhEvsPU+m35I;+BwY$xF*4&WF4+Qr`FzzlDPeY4cYb1?gCI)ozGAqz4236y< z0I-&Q#PWj|BTdDyMP_&fS>EnLUDveXTZ}UuUZGd;0of^|QL9ZHv+!Yf>5zx_z1B2w zbl&W<1wZZ`p?y4c7F_GYcZ?|ZMB?y2QK7!>|mFD18*NS7{vC z?~uJhXcWC4?XlrB$2KRuP&S8R7K|894lnF8FOqApYezXEjDg{ z_Q)(8NFYf@jyW+>9nQSQcM001HhFw>p>%zIL0OyjfSZhHZOlx}YP{NNEl1~Dr(P6! z(^OAF4r@TC#)ui+7+r_>*rpj^bOK1~&%E$LDmz_qybPaawJ)(pLDHde!fA1)grhR< zAi7OB{xY@*+Yvyw*kg2~KYdx-NusleKs)L$9GpTSGf{7$;HawY=YsE6dkfok#+JwKDL@u|@K zG2)so5^Rx*t+=m)wN^P!n(#(tC(`vgMLy&GJSB4srFP7ZUt*jub9Xlzv{wkYqi zTYyO7B#T+22T64FXk=G4Qd;gOk6Ck(O4mFZ*@L0-;;z;WfX`7{kYE&X7z(_I&UNUvYvf7 zLjp`GUuKDE4rG&D-Kb#nNALLd8307`_v38~UP*(O>2n!k7ntp{W9#9WLo1iATvbuaz+xlm9Z%6VhsqY^i z^K~;rQN>(4b^l5-;GCNzwdnfXo!Bg;;T_IpH|qFb-Lz6sh$MNQ4ipgrlJ@r!pT|3PW%zA9dseOKH&AarhcmFLBs7X;t$6ZTv=TXD{UlH zIk8k9L?(owYBJ6*B?U$)l-s{iMBPT)LX=$n9iEE_*>$PE-zCdqVKv*%LT)R9sx(i% z%_^@mQnT8~KvXm;^#B``KByKxWt^|n&{Z)$35YaWu!O)uBKsn%Kk{mvRM)4?7NDr- z^!;Nrd6_xN@uKZI`;nz#)H&pIivIQsfBNX%*v=Q-`csy-Lz5qY?%k^0?y@7u#Z5!M zGx!HcF5TEZVO=n79t_*3^2(Y@xDSSYH`==ImP*jOpCgj74(nR*4Fw{W!dd6Jk~lj1 zkI7wn9mqq}LIz+@LPiToyqJ-`mo8EkbQWALY(IosErCt%lee}v(mTBbkSqj~^P)$u z$e523D8Ux|mA4l%Y1$#YCP&ih3*5hhu-ChqP?Q?SuGT>zRB>(DYx}cO3Y|Cb^&Zs) z5ZW)*V<=k85E>(To#6359G~d@^u;`81xNx8OigHTw=dz;A0E6nz9NSFFzUR4c6=7^LDZeqyYoXvx%G2Xj(l|aGCxCFZXi=> z0IfXTGkhJGJE49s`T{4iNUqMLG^#Ql-*^jcYBOzr89fXn*T;_`{*3n|A{U9m@PV-T zw2y{9BET*B4$m0swRXlVxs09dPmOS!^9L<*uYk~f=LiPlvTiSiUjpQ{aNRzkmrAg5 zx@};G7Q5<;QV*R6JR^k5eXQG_V-rrJ%2U4N_WCwEFrRY~nIEV~(jN(8)a#UKh2#AS zm^o?;TikBHGamCpM=2;J2Aa9{a|GvR$9BE9UK0;5VB2fftJUA@9$k8<5dOr)j^~HC zIoh-u3_M5-Oyk1Qc|a_6rWvowQPN4I@8N}d1UuCs1l1CqQqI@r9jgxV@6P_^VQ@ru z39wkDRX{!5Se9OI&`AC?JciqRK_Uv2X&#Tj1;k@ES)00+l$ehr$iz8u^ih&3dvLXb zc6&qJG+ZmCEE*U0g%~X`LnM`Ka}x}d1ivrP8 zqZhuw$j(uLF(1U_HJDkI=!t>FUiu~tMQ}87O!S-{p8Qpwiiv}4J45i zzY@i$ZEf#t!hvE-7JT(DM7{IhkL@}zpqdK5#YA3W#YD!!#$92*|4PZT8=F$tWkXjT zfww+XBOV&p_&{n5aC5(}s&q>*(^)T$5llYnRySNCNFE;PYJB&ntf37X+=*%7{|st5 zcd;`f54sf4x-V=v&D{bTjr)HLhxsNZnmir-m)#L8J5?R^tg`xGG;wzjJ>b5T)RU@p z{%w#)Z9x$h3fbNQQSI2n_9@c0&Q&Dn;S1Yd5^_MgabuHDqo4M|_$SHjttS~*d}PQC zeq=}-VkVxt>fn#Wxu9fSfkEQtwFCtibfC-e5hBs(S=C4VjBuB%#TKDu_)a7cPY`p| zd5{`KWcC@obeiJagJso0B{Fai2m?VLT?y+KtF?(qWOU(w4VH6=@0uYE-tjT!@jSA$YsIDj2ntqwA62U)bumhY1nXF~=gT!$2- z2F_Nv-OyF#0zVA#rngBJmG10R0vwuv(8X*Z7Q%+1gB@4snG}v16w-Dx*=?hs+IRAw z_e$y7j@_3Vv^XMea@I33WQ)G$=szGP>7)ce`CJn0D9G~M`6a}Sl>V`dM8$q!NX7PX zZe}j_!ma#A7PZ+9EvEkHqV?)9IPHb1@#R@wN#po@JhamxgOBqnia!t-fhc8CB8!WZgai;|uQf!mfRo`aez)Y@`c$<7XELM*TdvH3tR(xvoHuUv9deqtXeLsCSb0mmGMM# zslBh(@OHU(j_S#xEh?B;lNKC`0bes1R$zu$7{A`8Z*j5DUof>aUwhW^5Nn?=?09C7 z-i`#x0%2u#bG8`6k8l1BMz)v&jo1Ibr;``7eHClZ{vvPYs|g5B96z)Jp4uP0nD|2b z5e*w(WiH6|DPGGHm|iRKVgxNl3M&-6qRZs&uY;ZS`H9F;Y=I2tqmgI!?UdQ8d2pR|fy{af>Fd@a#0sQL~#()TX z?~s6AspK}RYr%Wb?^bh2x*zWtkjtM;eofV!(x>zG(cvk*jDTtTc> I#3<y%KEd7HNpK79IuIi2 z^)qX_ySjSsT~!^asw{(wM1%wZ0f8zfD+&B;yZ`$jzhay&(Lu)2!P3Rl&C!K|;hUSAlPf63Jf8X_uh}5NW;C=H>#;F9r7t~uDY(BStV-Dz(FJ?v6bXn*c*XWO_rn66o{ z5y)N<0j|^=GJ{SEHe}%cmbsNDloY()!js7cf3vrFH5R{nRaTAqN_!rAe^!0x^V1ue z*`;Q8HKeJMa^+%olu7NPJ6$tHkcj=DRsd#j1bYpwUfE?zk0V(V8SR}?8z8V7?YGf+ zH+B$r=;&-;8;|7dvpfeUJlgc0QlnzO<>+C*rC#tR+*yfrhvuUzHBusi>H4^CLng)* zmr>Ynx4>vMBiX|lxisrdQfK_~H|H>hPd?(%(PQuiAMxtGVa?gj0z~qGd;E8Q)PVR2 zWMKQ0EA`^*qf7gb^szoFC0058IzxNJ694a}i?Dw|!ngx|!}o%$em`c5X?R$8;kz4Q znYdjQoTSrqF!m$-J?&J}Im~-?hqDh0$twP!-}cHko)W<2X8irjW4-*Gz@;TF>!fnA zAb@p0QP?%>o^HPHERMB#ro8vDt!#3Lg!roI zjXjL+J7`F(o6Ni+d=|H>`~RDu+vIbUjQe%zuRI+tmj)E_Z9ozNjVr>~fXHhTB5#4dFEOblg#S|x^D|?XZL0^vv;^ebr`q{PY{~LaG zDBC1`?dmnfr<;bKWV!uUynB`PX6*e#M4Ds=^fVSYs4{uGjKRT;cVMMx?GW0-=Vizc1ODBU4;yueBp0 z@0FKOUM7~YRs1PvuFC~_-WN7{H3Q}=;++j^U(ps}M;9euyd@PrH|e)Xov4Yl(d9xQ zp{Fd1e%-BVP5RA~PF+AJ#eT!Oi*N-BuTfAJlf^8^0DL44q7%>_vr-QVwq$1##=vgq z%a&e1EF0tgsW|&Udu@$e_8Q(seZTsCs6=-Odk*t5_-XObUbTRD?On%n{a#~kPsopS zA^atOqO%K3)<`e-0$Ly}zhPC;;;7{#QC*Ciyi|BtNuq0p5|fEQzt6KZW3CaoU~4f+ z8r?yyE$rYhJpvkl$)Zjs7~Yu|Gg;e5Le?CFRCddMc@xd}+JA20t<>$AM-%y)dM^1c zr3$g+NFu-41aq!`&V6t55ITC{VrbH3<#KmDTks}SK&y5k+9+AoXU&*;ga`hm�YX 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 literal 0 HcmV?d00001 diff --git a/public/icons/icon-512.png b/public/icons/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..34c04231fc370934fe46c6c55eaf05491da45e06 GIT binary patch literal 178732 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

htc%~+8(W0Z6M3+K@A6EANu+^)V4|A$xp;p{ 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 aQ;H=Wb{`Y4P&WwpY2AOIR(;Pl`u_pY?utJE literal 0 HcmV?d00001 diff --git a/public/icons/icon-maskable-192.png b/public/icons/icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..9954a55affe5d094756e6ebf9611b3f7460e90af GIT binary patch literal 21707 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 V51d*7QJYt;sKK=#SE|@X{11PUCZGTS literal 0 HcmV?d00001 diff --git a/public/icons/icon-maskable-512.png b/public/icons/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..43f0c677f75d8bf41b32b27ee1f64cdff04fc4e2 GIT binary patch literal 99181 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
<_`uSGJVVXn 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 YXKrnlm7=FR7YqC-$*Id$NWTpIKR1XSasU7T literal 0 HcmV?d00001 diff --git a/public/offline.html b/public/offline.html new file mode 100644 index 0000000..fbd0725 --- /dev/null +++ b/public/offline.html @@ -0,0 +1,49 @@ + + + + + + You're offline — Bitcoin Deepa + + + + +

You're offline. Check your connection and try again.

+ + + diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..ea7e69a --- /dev/null +++ b/public/sw.js @@ -0,0 +1,71 @@ +const CACHE_VERSION = "v1"; +const STATIC_CACHE = `bd-static-${CACHE_VERSION}`; +const OFFLINE_URL = "/offline.html"; + +const PRECACHE_URLS = [OFFLINE_URL, "/icons/icon-192.png", "/icons/icon-512.png", "/favicon.ico"]; + +self.addEventListener("install", (event) => { + event.waitUntil( + caches + .open(STATIC_CACHE) + .then((cache) => cache.addAll(PRECACHE_URLS)) + .then(() => self.skipWaiting()) + ); +}); + +self.addEventListener("activate", (event) => { + event.waitUntil( + caches + .keys() + .then((keys) => + Promise.all(keys.filter((key) => key !== STATIC_CACHE).map((key) => caches.delete(key))) + ) + .then(() => self.clients.claim()) + ); +}); + +// Navigations (HTML documents) are intentionally network-only, never cached. +// This app forces Cache-Control: no-store on HTML routes to work around a +// Telegram Desktop WebView bug that serves stale pages (see next.config.mjs) +// — caching navigations here would reintroduce that exact bug. We only fall +// back to a static offline page when the network request fails outright. +async function handleNavigation(request) { + try { + return await fetch(request); + } catch { + const cache = await caches.open(STATIC_CACHE); + return (await cache.match(OFFLINE_URL)) ?? Response.error(); + } +} + +// Hashed Next.js build assets and local images are immutable — safe to +// cache-first indefinitely. +async function handleStaticAsset(request) { + const cache = await caches.open(STATIC_CACHE); + const cached = await cache.match(request); + if (cached) return cached; + + const response = await fetch(request); + if (response.ok) cache.put(request, response.clone()); + return response; +} + +self.addEventListener("fetch", (event) => { + const { request } = event; + if (request.method !== "GET") return; + + const url = new URL(request.url); + if (url.origin !== self.location.origin) return; + + // Never cache API responses — always fresh, subscription/wallet data included. + if (url.pathname.startsWith("/api/")) return; + + if (request.mode === "navigate") { + event.respondWith(handleNavigation(request)); + return; + } + + if (url.pathname.startsWith("/_next/static/") || url.pathname.startsWith("/icons/")) { + event.respondWith(handleStaticAsset(request)); + } +}); diff --git a/src/app/dashboard/news/[id]/page.tsx b/src/app/dashboard/news/[id]/page.tsx index 0c2034e..732b619 100644 --- a/src/app/dashboard/news/[id]/page.tsx +++ b/src/app/dashboard/news/[id]/page.tsx @@ -4,7 +4,7 @@ import { NewsDetailBackButton, NewsArticleCard } from "@/components/dashboard/ne import { fmtShortDate } from "@/lib/formatters"; import { getNewsArticles } from "@/lib/news"; -export const dynamic = "force-dynamic"; +export const revalidate = 900; export default async function NewsArticleDetailPage({ params, diff --git a/src/app/dashboard/news/page.tsx b/src/app/dashboard/news/page.tsx index ab3c0b5..0c78af4 100644 --- a/src/app/dashboard/news/page.tsx +++ b/src/app/dashboard/news/page.tsx @@ -5,7 +5,7 @@ import { NewsListSection } from "@/components/dashboard/news/NewsListSection"; import { getNewsArticles } from "@/lib/news"; import type { NewsArticle } from "@/lib/types"; -export const dynamic = "force-dynamic"; +export const revalidate = 900; function NewsFeaturedCard({ article }: { article: NewsArticle }) { return ( diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 56b96e8..b67de58 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -5,8 +5,7 @@ import { TotalValueCard } from "@/components/dashboard/wallet/TotalValueCard"; import { PlanSummaryCard } from "@/components/dashboard/wallet/PlanSummaryCard"; import { PerformanceGrid } from "@/components/dashboard/wallet/PerformanceGrid"; import { PortfolioChart } from "@/components/dashboard/wallet/PortfolioChart"; -import { useWalletSummary } from "@/hooks/query/useWalletSummary"; -import { useTransactionHistory } from "@/hooks/query/useTransactionHistory"; +import { useWalletMetrics } from "@/hooks/query/useWalletMetrics"; import { useUser } from "@/hooks/useUser"; import { useStore } from "@/lib/store"; @@ -14,33 +13,21 @@ export default function WalletPage() { const { balanceVisible } = useStore(); const { subscription, subscriptionLoading } = useUser(); - const { data: summary, isLoading: isSummaryLoading } = useWalletSummary(); - const { transactions } = useTransactionHistory(); - - const totalLkr = summary - ? Number( - typeof summary.total_lkr === "string" - ? summary.total_lkr.replace(/,/g, "") - : summary.total_lkr - ) - : 0; - const totalSats = summary?.total_balance ?? 0; - const dcaSpent = summary?.dca.spent ?? 0; - const dcaSats = summary?.dca.balance ?? 0; - const avgBtcPrice = summary?.dca.avg_btc_price ?? 0; - const change24h = summary?.["24_hr_change"] ?? 0; - const changeLkr = (change24h / 100) * totalLkr; - const currentBtcPrice = - summary?.current_btc_price?.lkr ?? - (transactions?.length - ? transactions[transactions.length - 1].btc_price_at_purchase - : avgBtcPrice); - const currentBtcPriceUsd = summary?.current_btc_price?.usd; - const avgBtcPriceUsd = - currentBtcPriceUsd && currentBtcPrice - ? avgBtcPrice * (currentBtcPriceUsd / currentBtcPrice) - : undefined; - const currentValueLkr = (dcaSats / 1e8) * currentBtcPrice; + const { + transactions, + isLoading: isSummaryLoading, + totalLkr, + totalSats, + dcaSpent, + dcaSats, + avgBtcPrice, + avgBtcPriceUsd, + changePercent: change24h, + changeLkr, + currentBtcPrice, + currentBtcPriceUsd, + currentValueLkr, + } = useWalletMetrics(); return (
diff --git a/src/app/dashboard/plans/page.tsx b/src/app/dashboard/plans/page.tsx index b1610fa..e989485 100644 --- a/src/app/dashboard/plans/page.tsx +++ b/src/app/dashboard/plans/page.tsx @@ -9,7 +9,7 @@ import { GiftPlansComingSoon } from "@/components/dashboard/plans/GiftPlanAction import { ManageGiftsSection } from "@/components/dashboard/plans/ManageGiftsSection"; import { MOCK_GIFTS } from "@/components/dashboard/plans/mock-data"; import { KycRequiredNotice } from "@/components/dashboard/plans/KycRequiredNotice"; -import { useWalletSummary } from "@/hooks/query/useWalletSummary"; +import { useWalletMetrics } from "@/hooks/query/useWalletMetrics"; import { useKycStatus } from "@/hooks/query/useKyc"; import { useSubscriptionCurrent } from "@/hooks/query/useSubscriptionCurrent"; import LoadingPage from "@/components/LoadingPage"; @@ -20,7 +20,12 @@ export default function PlansPage() { const { data: kyc, isLoading: kycLoading } = useKycStatus(); const { balanceVisible, toggleBalanceVisible } = useStore(); const { data: subscription, isLoading: subscriptionLoading } = useSubscriptionCurrent(); - const { data: summary, isLoading: summaryLoading } = useWalletSummary(); + const { + isLoading: summaryLoading, + dcaSpent: investedLkr, + dcaSats: investedSats, + currentValueLkr, + } = useWalletMetrics(); const kycApproved = kyc?.status === "APPROVED"; const noActivePlan = kycApproved && !subscriptionLoading && !subscription; @@ -33,16 +38,6 @@ export default function PlansPage() { if (!kycApproved) return ; if (noActivePlan) return ; - const currentValueLkr = summary - ? Number( - typeof summary.total_lkr === "string" - ? summary.total_lkr.replace(/,/g, "") - : summary.total_lkr - ) - : 0; - const investedLkr = summary?.dca.spent ?? 0; - const investedSats = summary?.dca.balance ?? 0; - return (
Yh^qIp^M)3072e-rsL~(xPn9Gj=x-Uwpau{)V;JUf&vi zYhkghv3y`TaKM6Iv;41Z7RynK#iD87U2n2j{tfpwq383qbr#Dw2JFNbOtCbh@&0Om z@p#$Spk?1cCDX;) z+~`s!A_L-7O#1IcKk2lN8_AIO>%wg0oHQ4^Y@LlBN$|%u5zSC0V^!jWkt2=k7!yz8 zoW%40>Ry`r=9A>R%jI%0DFFk^+yU258 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 AIRF3v literal 25931 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 LrJugUA?W`A8`#=m diff --git a/src/app/layout.tsx b/src/app/layout.tsx index fb86153..6e11179 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,12 +1,33 @@ +import type { Metadata, Viewport } from "next"; import { Inter } from "next/font/google"; import "@/styles/theme.css"; import "@telegram-apps/telegram-ui/dist/styles.css"; import Providers from "./context/providers"; +import { RegisterServiceWorker } from "./register-sw"; import Script from "next/script"; import { cn } from "@/lib/cn"; const inter = Inter({ subsets: ["latin"], variable: "--font-sans" }); +export const metadata: Metadata = { + title: "Bitcoin Deepa", + description: + "Bitcoin membership reward accrual with subscription management for Sri Lankan users.", + icons: { + icon: "/favicon.ico", + apple: "/apple-touch-icon.png", + }, + appleWebApp: { + capable: true, + statusBarStyle: "black-translucent", + title: "Bitcoin Deepa", + }, +}; + +export const viewport: Viewport = { + themeColor: "#fa7119", +}; + export default function RootLayout({ children, }: Readonly<{ @@ -34,6 +55,7 @@ export default function RootLayout({ + {children} diff --git a/src/app/manifest.ts b/src/app/manifest.ts new file mode 100644 index 0000000..2d209e1 --- /dev/null +++ b/src/app/manifest.ts @@ -0,0 +1,41 @@ +import type { MetadataRoute } from "next"; + +export default function manifest(): MetadataRoute.Manifest { + return { + name: "Bitcoin Deepa", + short_name: "Bitcoin Deepa", + description: + "Bitcoin membership reward accrual with subscription management for Sri Lankan users.", + start_url: "/dashboard", + scope: "/", + display: "standalone", + background_color: "#0B0F14", + theme_color: "#fa7119", + icons: [ + { + src: "/icons/icon-192.png", + sizes: "192x192", + type: "image/png", + purpose: "any", + }, + { + src: "/icons/icon-512.png", + sizes: "512x512", + type: "image/png", + purpose: "any", + }, + { + src: "/icons/icon-maskable-192.png", + sizes: "192x192", + type: "image/png", + purpose: "maskable", + }, + { + src: "/icons/icon-maskable-512.png", + sizes: "512x512", + type: "image/png", + purpose: "maskable", + }, + ], + }; +} diff --git a/src/app/plans/choose/page.tsx b/src/app/plans/choose/page.tsx index 6a5100f..8337e6f 100644 --- a/src/app/plans/choose/page.tsx +++ b/src/app/plans/choose/page.tsx @@ -160,14 +160,14 @@ export default function ChoosePlanPage() { if (kycLoading) return ; if (kyc?.status !== "APPROVED") { return ( -
+
); } return ( -
+
{currentPlan ? ( ) : ( @@ -208,9 +208,9 @@ export default function ChoosePlanPage() {
{packagesLoading ? ( -
+
{[0, 1, 2].map((i) => ( - + ))}
) : filteredPlans.length === 0 ? ( @@ -218,7 +218,7 @@ export default function ChoosePlanPage() {

No {duration} plans available

) : ( -
+
{filteredPlans.map((plan) => { const perMonth = perMonthAmount(plan); const perYear = perMonth * 12; @@ -229,9 +229,9 @@ export default function ChoosePlanPage() { } name={plan.name} diff --git a/src/app/register-sw.tsx b/src/app/register-sw.tsx new file mode 100644 index 0000000..ef47f28 --- /dev/null +++ b/src/app/register-sw.tsx @@ -0,0 +1,12 @@ +"use client"; + +import { useEffect } from "react"; + +export function RegisterServiceWorker() { + useEffect(() => { + if (!("serviceWorker" in navigator)) return; + navigator.serviceWorker.register("/sw.js").catch(() => {}); + }, []); + + return null; +} diff --git a/src/components/dashboard/activity/ActivityRow.tsx b/src/components/dashboard/activity/ActivityRow.tsx index 0e5bf46..3181076 100644 --- a/src/components/dashboard/activity/ActivityRow.tsx +++ b/src/components/dashboard/activity/ActivityRow.tsx @@ -121,7 +121,7 @@ export function ActivityRow({ item, visible }: ActivityRowProps) {

Date

-

+

{fmtShortDate(item.settlement.settledOn)}

@@ -131,7 +131,7 @@ export function ActivityRow({ item, visible }: ActivityRowProps) {

BTC Value {isOutgoing ? "Sent" : "Received"}

-

+

{mask(`${formatSatoshis(item.settlement.btcSats)} BTC`)}

@@ -142,12 +142,16 @@ export function ActivityRow({ item, visible }: ActivityRowProps) { {item.settlement.btcPriceUsd !== undefined && ( <> USD{" "} - {item.settlement.btcPriceUsd.toFixed(2)} + + {item.settlement.btcPriceUsd.toFixed(2)} + / BTC · )} රු.{" "} - {fmtPriceCompact(item.settlement.btcPriceLkr)} + + {fmtPriceCompact(item.settlement.btcPriceLkr)} + / BTC

diff --git a/src/components/dashboard/tasks/ManageTasksSection.tsx b/src/components/dashboard/tasks/ManageTasksSection.tsx index 11a40ba..4ae5604 100644 --- a/src/components/dashboard/tasks/ManageTasksSection.tsx +++ b/src/components/dashboard/tasks/ManageTasksSection.tsx @@ -1,11 +1,14 @@ "use client"; import { useMemo, useState } from "react"; +import { Snackbar } from "@telegram-apps/telegram-ui"; +import { AlertCircle } from "lucide-react"; import { TaskFilterTabs, type TaskFilter } from "@/components/dashboard/tasks/TaskFilterTabs"; import { TaskListCard } from "@/components/dashboard/tasks/TaskListCard"; import { useTMA } from "@/lib/hooks"; import { haptic } from "@/lib/haptics"; import { useStore } from "@/lib/store"; +import { useIsTelegramEnv } from "@/hooks/useIsTelegramEnv"; import type { Task } from "@/lib/types"; export interface ManageTasksSectionProps { @@ -14,8 +17,10 @@ export interface ManageTasksSectionProps { export function ManageTasksSection({ items }: ManageTasksSectionProps) { const [filter, setFilter] = useState("all"); + const [snackbarError, setSnackbarError] = useState(null); const { openTelegramLink, shareStory } = useTMA(); const { userID, count } = useStore(); + const isTelegramEnv = useIsTelegramEnv(); const filtered = useMemo(() => { if (filter === "all") return items; @@ -33,6 +38,10 @@ export function ManageTasksSection({ items }: ManageTasksSectionProps) { openTelegramLink("https://t.me/+iiP-rX7ldYxjZWU1"); break; case "task-share-story": { + if (!isTelegramEnv) { + setSnackbarError("Open this app inside Telegram to share a story."); + return; + } haptic.impact("heavy"); shareStory("https://ceyloncash.com/bitcoindeepa/tma/story.mp4", { text: `Proud OG Member of Bitcoin දීප. ${count} Citizens and Counting 🚀🔥\n\nhttps://t.me/BitcoinDeepaBot/private_invite?startapp=${userID}\n\n#bitcoindeepa @bitcoindeepabot #viralstory`, @@ -55,6 +64,17 @@ export function ManageTasksSection({ items }: ManageTasksSectionProps) { + + {snackbarError && ( + setSnackbarError(null)} + description={snackbarError} + className="bottom-24! z-100!" + before={} + > + Not Available + + )}
); } diff --git a/src/components/dashboard/wallet/TotalValueCard.tsx b/src/components/dashboard/wallet/TotalValueCard.tsx index cf1d326..878ac09 100644 --- a/src/components/dashboard/wallet/TotalValueCard.tsx +++ b/src/components/dashboard/wallet/TotalValueCard.tsx @@ -3,9 +3,10 @@ import Image from "next/image"; import { ChevronDown, TrendingUp, TrendingDown } from "lucide-react"; import { Card, Badge } from "@telegram-apps/telegram-ui"; +import { NumberTicker } from "@/components/motion/number-ticker"; import { ValueSkeleton } from "@/components/ui/value-skeleton"; import { cn } from "@/lib/cn"; -import { fmtLkrCurrency, fmtSatsCompact, maskDigits } from "@/lib/formatters"; +import { fmtLkr, fmtLkrCurrency, fmtSatsCompact, maskDigits, LKR_SYMBOL } from "@/lib/formatters"; // Card/Badge theme their background/color through --tgui-- CSS variables (same // convention as --tgui--cell--middle--padding on the homepage Cell) — override those @@ -50,6 +51,10 @@ export function TotalValueCard({ {isLoading ? ( + ) : visible ? ( +

+ +

) : (

{mask(`≈ ${fmtLkrCurrency(totalLkr)}`)} diff --git a/src/components/motion/number-ticker.tsx b/src/components/motion/number-ticker.tsx new file mode 100644 index 0000000..3807222 --- /dev/null +++ b/src/components/motion/number-ticker.tsx @@ -0,0 +1,176 @@ +"use client"; +// beui.dev/components/motion/number + +import { animate, motion, useInView, useReducedMotion } from "framer-motion"; +import { useEffect, useMemo, useRef, useState } from "react"; +import { EASE_OUT } from "@/lib/ease"; +import { cn } from "@/lib/cn"; + +export interface NumberTickerProps { + value: number; + /** Digits to pad to (left). */ + pad?: number; + /** Per-digit roll duration in seconds. */ + duration?: number; + /** Stagger between digits. */ + stagger?: number; + /** Render only after the element enters the viewport. */ + startOnView?: boolean; + prefix?: string; + suffix?: string; + /** Add a small blur during digit rolls. */ + blur?: boolean; + className?: string; + digitClassName?: string; + /** Insert locale group separators (commas). Server-component safe. */ + locale?: boolean; + /** Custom formatter. Client-only — server components must use `locale` instead. */ + format?: (value: number) => string; +} + +const DIGIT_HEIGHT_EM = 1.1; +const DIGITS = Array.from({ length: 10 }, (_, n) => n); + +export function NumberTicker({ + value, + pad, + duration = 0.9, + stagger = 0.04, + startOnView = true, + prefix, + suffix, + blur = false, + className, + digitClassName, + locale, + format, +}: NumberTickerProps) { + const containerRef = useRef(null); + const inView = useInView(containerRef, { once: true, amount: 0.6 }); + const [armed, setArmed] = useState(!startOnView); + + useEffect(() => { + if (startOnView && inView) setArmed(true); + }, [startOnView, inView]); + + const text = useMemo(() => { + const rounded = Math.round(value); + const formatted = format + ? format(rounded) + : locale + ? rounded.toLocaleString() + : rounded.toString(); + return pad ? formatted.padStart(pad, "0") : formatted; + }, [value, pad, format, locale]); + const glyphs = useMemo(() => { + const chars = text.split(""); + // Key by place value (position from the right): a changing digit keeps its + // identity and rolls to the new value instead of remounting and replaying + // from 0. Growing numbers add glyphs on the left without re-keying the + // ones, tens, hundreds already on screen. + return chars.map((char, i) => ({ char, id: `g-${chars.length - 1 - i}` })); + }, [text]); + const readableText = `${prefix ?? ""}${text}${suffix ?? ""}`; + + // Stagger is an entrance flourish. Once the reveal has played, value + // changes roll every digit immediately — a per-digit delay on live updates + // reads as lag. + const [entered, setEntered] = useState(false); + useEffect(() => { + if (!armed || entered) return; + const total = (duration + glyphs.length * stagger) * 1000; + const t = window.setTimeout(() => setEntered(true), total); + return () => window.clearTimeout(t); + }, [armed, entered, duration, stagger, glyphs.length]); + + return ( + + {readableText} + + + ); +} + +function Digit({ + digit, + delay, + duration, + blur, + className, +}: { + digit: number; + delay: number; + duration: number; + blur: boolean; + className?: string; +}) { + const reduce = useReducedMotion(); + const columnRef = useRef(null); + + useEffect(() => { + if (reduce || !blur || !columnRef.current || !Number.isFinite(digit)) { + return; + } + + const node = columnRef.current; + const controls = animate( + node, + { filter: ["blur(10px)", "blur(0px)"] }, + { + duration: Math.min(duration * 0.75, 0.32), + delay, + ease: EASE_OUT, + } + ); + + return () => { + controls.stop(); + node.style.filter = "blur(0px)"; + }; + }, [blur, delay, digit, duration, reduce]); + + return ( + + + {DIGITS.map((n) => ( + + {n} + + ))} + + + ); +} diff --git a/src/components/ui/plan-card.tsx b/src/components/ui/plan-card.tsx index 4bc6026..e71b64a 100644 --- a/src/components/ui/plan-card.tsx +++ b/src/components/ui/plan-card.tsx @@ -78,13 +78,6 @@ export function PlanCard({ className )} > - {active && ( -

-
-

Current Plan

-
-
- )} {mostPopular && !active && (
@@ -94,34 +87,43 @@ export function PlanCard({
)} -
+
{/* Top row: radio + emoji + name + price */} -
+
{active ? : isHighlighted ? : } -
{emoji}
+
{emoji}

{name}

-
-

- {price} -

-

- {period} -

+
+ {active && ( +
+

+ Current Plan +

+
+ )} +
+

+ {price} +

+

+ {period} +

+
{/* Bottom: description + pricing, revealed only once the plan is selected */} {isHighlighted && ( -
+

{description}

diff --git a/src/hooks/query/useWalletMetrics.ts b/src/hooks/query/useWalletMetrics.ts new file mode 100644 index 0000000..fff3521 --- /dev/null +++ b/src/hooks/query/useWalletMetrics.ts @@ -0,0 +1,55 @@ +"use client"; + +import { useWalletSummary } from "@/hooks/query/useWalletSummary"; +import { useTransactionHistory } from "@/hooks/query/useTransactionHistory"; + +// Single source of truth for wallet numbers derived from the DCA summary + +// transaction history. Both the dashboard and Manage My Plan read this so +// "Current Value" stays identical across the app instead of drifting when +// one screen's calculation is tweaked and the other isn't. +export function useWalletMetrics() { + const { data: summary, isLoading: isSummaryLoading } = useWalletSummary(); + const { transactions, isLoading: isTransactionsLoading } = useTransactionHistory(); + + const totalLkr = summary + ? Number( + typeof summary.total_lkr === "string" + ? summary.total_lkr.replace(/,/g, "") + : summary.total_lkr + ) + : 0; + const totalSats = summary?.total_balance ?? 0; + const dcaSpent = summary?.dca.spent ?? 0; + const dcaSats = summary?.dca.balance ?? 0; + const avgBtcPrice = summary?.dca.avg_btc_price ?? 0; + const changePercent = summary?.["24_hr_change"] ?? 0; + const changeLkr = (changePercent / 100) * totalLkr; + const currentBtcPrice = + summary?.current_btc_price?.lkr ?? + (transactions?.length + ? transactions[transactions.length - 1].btc_price_at_purchase + : avgBtcPrice); + const currentBtcPriceUsd = summary?.current_btc_price?.usd; + const avgBtcPriceUsd = + currentBtcPriceUsd && currentBtcPrice + ? avgBtcPrice * (currentBtcPriceUsd / currentBtcPrice) + : undefined; + const currentValueLkr = (dcaSats / 1e8) * currentBtcPrice; + + return { + summary, + transactions, + isLoading: isSummaryLoading || isTransactionsLoading, + totalLkr, + totalSats, + dcaSpent, + dcaSats, + avgBtcPrice, + avgBtcPriceUsd, + changePercent, + changeLkr, + currentBtcPrice, + currentBtcPriceUsd, + currentValueLkr, + }; +} diff --git a/src/lib/ease.ts b/src/lib/ease.ts new file mode 100644 index 0000000..144a563 --- /dev/null +++ b/src/lib/ease.ts @@ -0,0 +1,57 @@ +// Shared motion tokens. Easing curves mirror the CSS custom properties in +// globals.css; springs are the canonical physics used across components. +// Strong custom variants — defaults like `ease-in`/`ease-out` feel weak. + +export const EASE_OUT: [number, number, number, number] = [0.16, 1, 0.3, 1]; +export const EASE_IN_OUT = [0.77, 0, 0.175, 1] as const; +export const EASE_DRAWER = [0.32, 0.72, 0, 1] as const; + +/** CSS string form of EASE_OUT for inline style transitions. */ +export const EASE_OUT_CSS = "cubic-bezier(0.16, 1, 0.3, 1)"; + +/** Press feedback on buttons and other tappable surfaces. */ +export const SPRING_PRESS = { + type: "spring", + stiffness: 500, + damping: 30, + mass: 0.6, +} as const; + +/** Content swaps — label/icon slots trading places inside a control. */ +export const SPRING_SWAP = { + type: "spring", + stiffness: 460, + damping: 30, + mass: 0.55, +} as const; + +/** Overlay panel entrances — modals and sheets summoned by pointer. */ +export const SPRING_PANEL = { + type: "spring", + stiffness: 420, + damping: 40, + mass: 0.5, +} as const; + +/** Shared-layout glides — pills, indicators and panels morphing between positions. */ +export const SPRING_LAYOUT = { + type: "spring", + stiffness: 360, + damping: 32, + mass: 0.6, +} as const; + +/** Cursor-follow physics for decorative mouse tracking (magnetic, tilt, dock). */ +export const SPRING_MOUSE = { + stiffness: 200, + damping: 15, + mass: 0.3, +} as const; + +/** Dragged handles and fills (sliders) — critically damped `useSpring` config, + * so the value follows the pointer butterily and never rebounds off an end. */ +export const SPRING_GLIDE = { + stiffness: 700, + damping: 50, + mass: 0.5, +} as const; diff --git a/src/lib/news.ts b/src/lib/news.ts index 77aacbd..2f85062 100644 --- a/src/lib/news.ts +++ b/src/lib/news.ts @@ -1,5 +1,6 @@ import Parser from "rss-parser"; import sanitizeHtml from "sanitize-html"; +import { unstable_cache } from "next/cache"; import type { NewsArticle } from "@/lib/types"; const FEED_URL = "https://bitcoinmagazine.com/feed"; @@ -105,7 +106,7 @@ function toArticle(item: FeedItem, index: number): NewsArticle | null { }; } -export async function getNewsArticles(): Promise { +async function fetchNewsArticles(): Promise { const response = await fetch(FEED_URL, { next: { revalidate: 900 } }); if (!response.ok) return []; @@ -122,3 +123,9 @@ export async function getNewsArticles(): Promise { .map((item, index) => toArticle(item, index)) .filter((article): article is NewsArticle => article !== null); } + +// Caches the parsed+sanitized article list (not just the raw feed fetch), so the +// list and detail pages share one parse pass instead of redoing it per request. +export const getNewsArticles = unstable_cache(fetchNewsArticles, ["news-articles"], { + revalidate: 900, +}); From e42c8dabeb995516e06f48e4386cb7b57609c377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=8F=92=CE=B1=E1=83=A7=CE=B1=CE=B1=C9=B3?= <108685206+rayaanr@users.noreply.github.com> Date: Mon, 10 Aug 2026 15:24:02 +0530 Subject: [PATCH 24/24] feat: Add transaction history API and enhance user registration flow (#87) * feat: add bot transaction history API and integrate into activity dashboard * refactor: streamline user registration flow and improve returning user handling * feat: add KYC status and subscription current hooks to dashboard layout * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/app/api/transaction/bot-history/route.ts | 67 +++++++++++++++++ src/app/dashboard/activity/page.tsx | 38 ++++++++-- src/app/dashboard/layout.tsx | 9 +++ src/app/page.tsx | 31 +++++++- .../dashboard/activity/ActivityRow.tsx | 49 +++++++----- .../dashboard/news/NewsListSection.tsx | 12 +-- .../dashboard/plans/PlanHeroCard.tsx | 6 +- src/hooks/query/useBotTransactionHistory.ts | 75 +++++++++++++++++++ src/hooks/query/useRegisterTelegramUser.ts | 27 ++++++- src/lib/activity.ts | 31 ++++++++ src/lib/auth.ts | 21 ++++++ src/lib/query-keys.ts | 1 + src/lib/types.ts | 5 +- 13 files changed, 332 insertions(+), 40 deletions(-) create mode 100644 src/app/api/transaction/bot-history/route.ts create mode 100644 src/hooks/query/useBotTransactionHistory.ts diff --git a/src/app/api/transaction/bot-history/route.ts b/src/app/api/transaction/bot-history/route.ts new file mode 100644 index 0000000..0046d98 --- /dev/null +++ b/src/app/api/transaction/bot-history/route.ts @@ -0,0 +1,67 @@ +import { NextResponse } from "next/server"; +import { headers } from "next/headers"; + +export async function GET(request: Request) { + try { + // Get authorization header + const headersList = await headers(); + const authorization = headersList.get("authorization"); + + if (!authorization) { + return NextResponse.json( + { + error: "Unauthorized", + message: "Authorization header is required", + }, + { status: 401 } + ); + } + + // Extract token from "Bearer " format + const token = authorization.startsWith("Bearer ") ? authorization.slice(7) : authorization; + + // Get pagination parameters from URL + const url = new URL(request.url); + const limit = url.searchParams.get("limit") || "100"; + const offset = url.searchParams.get("offset") || "0"; + + // Build API URL with pagination parameters + const apiUrl = new URL(`${process.env.API_BASE_URL}/transaction/bot-history`); + apiUrl.searchParams.set("limit", limit); + apiUrl.searchParams.set("offset", offset); + + // Make request to external API to get current user's bot (sats send/receive) transactions + const response = await fetch(apiUrl.toString(), { + method: "GET", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + cache: "no-cache", + }); + + if (!response.ok) { + const errorData = await response.text(); + return NextResponse.json( + { + error: "Failed to fetch bot transactions", + message: errorData || `HTTP ${response.status}: ${response.statusText}`, + }, + { status: response.status } + ); + } + + const data = await response.json(); + + return NextResponse.json(data); + } catch (error) { + console.error("❌ Error fetching bot transactions:", error); + return NextResponse.json( + { + error: "Internal server error", + message: error instanceof Error ? error.message : "Unknown error occurred", + }, + { status: 500 } + ); + } +} diff --git a/src/app/dashboard/activity/page.tsx b/src/app/dashboard/activity/page.tsx index e24397e..ecce05f 100644 --- a/src/app/dashboard/activity/page.tsx +++ b/src/app/dashboard/activity/page.tsx @@ -7,26 +7,45 @@ import { ActivityTabs } from "@/components/dashboard/activity/ActivityTabs"; import { ActivityGroup } from "@/components/dashboard/activity/ActivityGroup"; import { ActivitySkeleton } from "@/components/dashboard/activity/ActivitySkeleton"; import { useTransactionHistory } from "@/hooks/query/useTransactionHistory"; +import { useBotTransactionHistory } from "@/hooks/query/useBotTransactionHistory"; import { ACTIVITY_TITLE, getActivityCategory, + mapBotTransactionToActivityItem, mapDcaTransactionToActivityItem, type ActivityCategory, } from "@/lib/activity"; import { useStore } from "@/lib/store"; -// Only membership rewards (DCA purchases) are backed by real data today — -// sent/received/tipjar/faucet/gift and tasks have no backend endpoint yet. -const COMING_SOON_CATEGORIES: ActivityCategory[] = ["transactions", "tasks"]; +// Tipjar/faucet/gift and tasks have no backend endpoint yet. +const COMING_SOON_CATEGORIES: ActivityCategory[] = ["tasks"]; export default function ActivityPage() { const { balanceVisible, toggleBalanceVisible } = useStore(); const [search, setSearch] = useState(""); const [category, setCategory] = useState("all"); - const { transactions, isLoading, hasNextPage, isFetchingNextPage, fetchNextPage } = - useTransactionHistory(); - const activity = useMemo(() => transactions.map(mapDcaTransactionToActivityItem), [transactions]); + const dca = useTransactionHistory(); + const botHistory = useBotTransactionHistory(); + + const activity = useMemo( + () => [ + ...dca.transactions.map(mapDcaTransactionToActivityItem), + ...botHistory.transactions.map(mapBotTransactionToActivityItem), + ], + [dca.transactions, botHistory.transactions] + ); + + const showDca = category !== "transactions"; + const showBotHistory = category === "transactions"; + const isLoading = + (showDca && dca.isLoading) || (showBotHistory && botHistory.isLoading); + const hasNextPage = (showDca && dca.hasNextPage) || (showBotHistory && botHistory.hasNextPage); + const isFetchingNextPage = dca.isFetchingNextPage || botHistory.isFetchingNextPage; + const fetchNextPage = () => { + if (showDca && dca.hasNextPage) dca.fetchNextPage(); + if (showBotHistory && botHistory.hasNextPage) botHistory.fetchNextPage(); + }; const comingSoon = COMING_SOON_CATEGORIES.includes(category); @@ -34,7 +53,10 @@ export default function ActivityPage() { if (comingSoon) return []; const filtered = activity.filter((item) => { - if (category !== "all" && getActivityCategory(item.type) !== category) return false; + const itemCategory = getActivityCategory(item.type); + if (category === "all" ? itemCategory === "transactions" : itemCategory !== category) { + return false; + } if (!search.trim()) return true; const query = search.trim().toLowerCase(); @@ -92,7 +114,7 @@ export default function ActivityPage() { diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx index f482d9e..5ae98b2 100644 --- a/src/app/dashboard/layout.tsx +++ b/src/app/dashboard/layout.tsx @@ -2,10 +2,19 @@ import BottomNavigation from "@/components/bottomNavigation"; import { useAuthGuard } from "@/hooks/useAuthGuard"; +import { useKycStatus } from "@/hooks/query/useKyc"; +import { useSubscriptionCurrent } from "@/hooks/query/useSubscriptionCurrent"; export default function DashboardLayout({ children }: { children: React.ReactNode }) { useAuthGuard(); + // Warm the shared query cache as soon as any dashboard page mounts, not + // just when the plans tab does — by the time the user taps into Plans, + // these are already fetched (or in flight), so it skips straight past + // the kycLoading/noActivePlan LoadingPage states instead of flashing them. + useKycStatus(); + useSubscriptionCurrent(); + return (
{children} diff --git a/src/app/page.tsx b/src/app/page.tsx index b576e1c..9324205 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -162,6 +162,7 @@ function UserScreen({ isExisting }: { isExisting: boolean }) { // Uses Telegram SDK hooks that throw outside the Telegram WebView — only // mount this once we've confirmed we're running inside Telegram. function TelegramHome() { + const router = useRouter(); const initLaunchParams = useLaunchParams().initData; const launchParams = useLaunchParams(); const initData = useInitData(); @@ -172,7 +173,7 @@ function TelegramHome() { return initLaunchParams || initData; }, [initLaunchParams, initData]); - useRegisterTelegramUser(authData, launchParams); + const registerUser = useRegisterTelegramUser(authData, launchParams); useEffect(() => { setUserID(authData?.user?.id?.toString() || ""); @@ -186,6 +187,34 @@ function TelegramHome() { } }, [isExistingUser]); + // Cached from a previous launch's 409 response (see + // useRegisterTelegramUser) — lets a known returning user skip straight to + // the dashboard without waiting on the network at all. + const [cachedReturningUser] = useState(() => getIsExistingUserFromStorage()); + + // /api/user (Mongo-backed) already fires on every launch — read its + // result instead of ignoring it. status 409 means this Telegram id was + // already registered, i.e. a returning user, who skips straight to the + // dashboard. It only fires when the profile has a username; without one, + // treat the visitor as new rather than waiting on a call that never runs. + const canCheckExisting = !!(authData?.user?.id && authData?.user?.username); + const isReturningUser = cachedReturningUser || registerUser.data?.status === 409; + const checkPending = + !cachedReturningUser && + canCheckExisting && + registerUser.data === undefined && + !registerUser.isError; + + useEffect(() => { + if (isReturningUser) { + router.replace("/dashboard?tab=wallet"); + } + }, [isReturningUser, router]); + + if (checkPending || isReturningUser) { + return {null}; + } + return ( diff --git a/src/components/dashboard/activity/ActivityRow.tsx b/src/components/dashboard/activity/ActivityRow.tsx index 3181076..e81286f 100644 --- a/src/components/dashboard/activity/ActivityRow.tsx +++ b/src/components/dashboard/activity/ActivityRow.tsx @@ -136,25 +136,36 @@ export function ActivityRow({ item, visible }: ActivityRowProps) {

-
-

BTC price at transaction time

-

- {item.settlement.btcPriceUsd !== undefined && ( - <> - USD{" "} - - {item.settlement.btcPriceUsd.toFixed(2)} - - / BTC · - - )} - රු.{" "} - - {fmtPriceCompact(item.settlement.btcPriceLkr)} - - / BTC -

-
+ {item.settlement.btcPriceLkr !== undefined ? ( +
+

BTC price at transaction time

+

+ {item.settlement.btcPriceUsd !== undefined && ( + <> + USD{" "} + + {item.settlement.btcPriceUsd.toFixed(2)} + + / BTC · + + )} + රු.{" "} + + {fmtPriceCompact(item.settlement.btcPriceLkr)} + + / BTC +

+
+ ) : ( + item.settlement.memo && ( +
+

Memo

+

+ {item.settlement.memo} +

+
+ ) + )}

Transaction ID

diff --git a/src/components/dashboard/news/NewsListSection.tsx b/src/components/dashboard/news/NewsListSection.tsx index 4f5b543..6895bf2 100644 --- a/src/components/dashboard/news/NewsListSection.tsx +++ b/src/components/dashboard/news/NewsListSection.tsx @@ -33,14 +33,14 @@ export function NewsArticleCard({ article }: { article: NewsArticle }) { )}
-

+

{article.title}

-
- - {article.readTimeMinutes} min read - · - {article.category} +
+ + {article.readTimeMinutes} min read + · + {article.category}
diff --git a/src/components/dashboard/plans/PlanHeroCard.tsx b/src/components/dashboard/plans/PlanHeroCard.tsx index 2d152c0..dd9a751 100644 --- a/src/components/dashboard/plans/PlanHeroCard.tsx +++ b/src/components/dashboard/plans/PlanHeroCard.tsx @@ -273,9 +273,9 @@ export function PlanHeroCard({ }`} > {mask( - `${isProfit ? "+" : "-"}${Math.abs(profitPct).toFixed(0)}% · ${fmtLkrCurrency( - Math.abs(profitLkr) - )}` + `${fmtLkrCurrency(Math.abs(profitLkr))} (${isProfit ? "+" : "-"}${Math.abs( + profitPct + ).toFixed(0)}%)` )} ) diff --git a/src/hooks/query/useBotTransactionHistory.ts b/src/hooks/query/useBotTransactionHistory.ts new file mode 100644 index 0000000..b773a68 --- /dev/null +++ b/src/hooks/query/useBotTransactionHistory.ts @@ -0,0 +1,75 @@ +"use client"; + +import { useMemo } from "react"; +import { useInfiniteQuery } from "@tanstack/react-query"; +import { queryKeys } from "@/lib/query-keys"; +import { getAuthTokenFromStorage } from "@/lib/auth"; +import fetchy from "@/lib/fetchy"; + +export interface BotTransaction { + id: number; + time: string; + direction: "incoming" | "outgoing"; + from_id: number; + to_id: number; + from_user?: string; + to_user?: string; + type: string; + amount: number; + amount_lkr: string; + memo?: string; + success: boolean; +} + +interface BotTransactionsResponse { + success: boolean; + count: number; + limit: number; + offset: number; + transactions: BotTransaction[]; + message?: string; +} + +const PAGE_SIZE = 50; + +// Sats sent/received to other Telegram users via the bot, paginated +// oldest page first via offset/limit, sorted oldest-first once flattened. +export function useBotTransactionHistory() { + const authToken = getAuthTokenFromStorage(); + + const query = useInfiniteQuery({ + queryKey: queryKeys.botTransactions, + queryFn: async ({ pageParam }) => { + const data = await fetchy.get( + `/api/transaction/bot-history?limit=${PAGE_SIZE}&offset=${pageParam}`, + { + headers: { Authorization: `Bearer ${authToken}` }, + shouldCache: false, + } + ); + + const transactions = data.success ? data.transactions : []; + const hasMore = data.success && data.offset + transactions.length < data.count; + + return { + transactions, + nextOffset: data.offset + PAGE_SIZE, + hasMore, + }; + }, + initialPageParam: 0, + getNextPageParam: (lastPage) => (lastPage.hasMore ? lastPage.nextOffset : undefined), + enabled: !!authToken, + staleTime: 1000 * 60 * 5, + }); + + const transactions = useMemo( + () => + (query.data?.pages ?? []) + .flatMap((page) => page.transactions) + .sort((a, b) => new Date(a.time).getTime() - new Date(b.time).getTime()), + [query.data] + ); + + return { ...query, transactions }; +} diff --git a/src/hooks/query/useRegisterTelegramUser.ts b/src/hooks/query/useRegisterTelegramUser.ts index 06891e3..d2fa45c 100644 --- a/src/hooks/query/useRegisterTelegramUser.ts +++ b/src/hooks/query/useRegisterTelegramUser.ts @@ -3,6 +3,7 @@ import { useEffect } from "react"; import { useMutation } from "@tanstack/react-query"; import fetchy from "@/lib/fetchy"; +import { markIsExistingUserInStorage, clearIsExistingUserInStorage } from "@/lib/auth"; type TelegramAuthData = { user?: { id?: number; username?: string } } | undefined; @@ -12,18 +13,40 @@ type RegisterUserPayload = { data: { authdata: TelegramAuthData; launchparam: unknown }; }; +export interface RegisterUserResponse { + status: number; // 201 = newly created, 409 = already existed, 500 = error + message: string; + user?: unknown; +} + export function useRegisterTelegramUser(authData: TelegramAuthData, launchParams: unknown) { - const { mutate } = useMutation({ - mutationFn: (payload: RegisterUserPayload) => fetchy.post("/api/user", payload), + const mutation = useMutation({ + mutationFn: (payload: RegisterUserPayload) => + fetchy.post("/api/user", payload), + onSuccess: (data) => { + // Keep the cached flag in sync with the authoritative server response + // (this call fires on every launch regardless of cache) — 409 means + // still registered, 201 means the id wasn't found, so any stale + // "existing user" cache from a deleted account gets corrected here. + if (data.status === 409) { + markIsExistingUserInStorage(); + } else if (data.status === 201) { + clearIsExistingUserInStorage(); + } + }, onError: (error) => { console.error("Error adding user to database:", error); }, }); + const { mutate } = mutation; + useEffect(() => { const { username, id } = authData?.user || {}; if (id && username) { mutate({ id, username, data: { authdata: authData, launchparam: launchParams } }); } }, [authData, launchParams, mutate]); + + return mutation; } diff --git a/src/lib/activity.ts b/src/lib/activity.ts index fa0dea1..c66913e 100644 --- a/src/lib/activity.ts +++ b/src/lib/activity.ts @@ -1,5 +1,6 @@ import type { ActivityItem, ActivityType } from "@/lib/types"; import type { DcaTransaction } from "@/hooks/query/useTransactionHistory"; +import type { BotTransaction } from "@/hooks/query/useBotTransactionHistory"; import { fmtActivityTime } from "@/lib/formatters"; type StatusDot = NonNullable; @@ -86,6 +87,36 @@ export function mapDcaTransactionToActivityItem(tx: DcaTransaction): ActivityIte }; } +// A bot-relayed sats transfer to/from another Telegram user maps onto the +// "sent"/"received" activity type based on `direction`. +function parseLkr(value: string): number { + return Number(value.replace(/,/g, "")) || 0; +} + +export function mapBotTransactionToActivityItem(tx: BotTransaction): ActivityItem { + const isOutgoing = tx.direction === "outgoing"; + const counterpartyRaw = isOutgoing ? tx.to_user : tx.from_user; + const counterparty = counterpartyRaw?.replace(/^@/, "") ?? String(isOutgoing ? tx.to_id : tx.from_id); + const lkr = parseLkr(tx.amount_lkr); + + return { + id: String(tx.id), + type: isOutgoing ? "sent" : "received", + counterparty, + timestamp: tx.time, + sats: isOutgoing ? -tx.amount : tx.amount, + lkr, + statusDot: tx.success ? "green" : "red", + settlement: { + status: tx.success ? "Completed" : "Failed", + settledOn: tx.time, + btcSats: tx.amount, + memo: tx.memo, + transactionId: String(tx.id), + }, + }; +} + export function getActivitySubtitle(item: ActivityItem): string { const time = fmtActivityTime(item.timestamp); diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 57166e7..2348126 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -214,6 +214,27 @@ export const getIsExistingUserFromStorage = (): boolean => { return localStorage.getItem("bitcoin-deepa-is-existing-user") === "true"; }; +/** + * Persists the "returning user" flag on its own, independent of an auth + * token — used by the /api/user existing-check (409 response), which never + * hands back a token. Cached so future launches can skip the network round + * trip entirely and redirect straight to the dashboard. + */ +export const markIsExistingUserInStorage = () => { + if (typeof window === "undefined") return; + localStorage.setItem("bitcoin-deepa-is-existing-user", "true"); +}; + +/** + * Clears the returning-user flag — used when the server tells us the id we + * thought was registered actually wasn't (a stale cache from a deleted + * account or DB reset), so the next launch stops trusting it. + */ +export const clearIsExistingUserInStorage = () => { + if (typeof window === "undefined") return; + localStorage.removeItem("bitcoin-deepa-is-existing-user"); +}; + export const saveAuthToStorage = (token: string) => { if (typeof window === "undefined") return; localStorage.setItem("bitcoin-deepa-auth-token", token); diff --git a/src/lib/query-keys.ts b/src/lib/query-keys.ts index 46b1442..6a4a8a8 100644 --- a/src/lib/query-keys.ts +++ b/src/lib/query-keys.ts @@ -1,6 +1,7 @@ export const queryKeys = { walletSummary: ["wallet-summary"] as const, transactions: ["transactions"] as const, + botTransactions: ["bot-transactions"] as const, packages: ["packages"] as const, userCount: ["user-count"] as const, subscriptionCurrent: ["subscription-current"] as const, diff --git a/src/lib/types.ts b/src/lib/types.ts index 48fc35f..cc59769 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -113,7 +113,10 @@ export interface ActivityItem { settledOn: string; btcSats: number; btcPriceUsd?: number; - btcPriceLkr: number; + /** Omit when there's no real price for this transaction (e.g. bot transfers) — show `memo` instead */ + btcPriceLkr?: number; + /** Transfer note from the sender, shown in place of the price panel when there's no real price */ + memo?: string; transactionId: string; }; }