@liberfi.io/ui-portfolio 2.0.7 → 2.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +14 -14
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/contexts/PortfolioClientContext.tsx","../src/contexts/PortfolioContext.tsx","../src/hooks/usePortfolioContext.ts","../src/hooks/useWalletSummary.ts","../src/components/account/account-info.script.ts","../src/components/account/account-info.ui.tsx","../src/components/account/account-info.widget.tsx","../src/utils/index.ts","../src/components/portfolio-page/address-row.ui.tsx","../src/types/index.ts","../src/components/portfolio-page/asset-tabs.ui.tsx","../src/components/portfolio-page/balance-row.ui.tsx","../src/components/portfolio-page/curve-card.ui.tsx","../src/components/portfolio-page/distribution-card.ui.tsx","../src/hooks/usePortfolioClient.ts","../src/hooks/useOverviewQuery.ts","../src/hooks/useSpotHoldingsQuery.ts","../src/hooks/useSpotHistoryQuery.ts","../src/hooks/usePerpsPositionsQuery.ts","../src/hooks/usePerpsHistoryQuery.ts","../src/hooks/usePredictionBetsQuery.ts","../src/hooks/usePredictionSettledQuery.ts","../src/hooks/useCurveDataQuery.ts","../src/hooks/useDistributionQuery.ts","../src/hooks/useRefetchWalletSummary.ts","../src/hooks/useWalletPortfolios.ts","../src/components/portfolio-page/portfolio-page.script.tsx","../src/components/portfolio-page/portfolio-page.skeleton.tsx","../src/components/portfolio-page/viewing-banner.ui.tsx","../src/components/portfolio-page/portfolio-page.widget.tsx","../src/components/holdings/confirm-dialog.ui.tsx","../src/components/holdings/holdings-section.script.tsx","../src/components/holdings/shared.ui.tsx","../src/components/holdings/perps-panel.ui.tsx","../src/components/holdings/prediction-panel.ui.tsx","../src/components/holdings/spot-panel.ui.tsx","../src/components/holdings/holdings-section.widget.tsx","../src/components/shared/format.ts","../src/components/shared/tag-badge.ui.tsx","../src/components/portfolio-activities/portfolio-activities.ui.tsx","../src/components/portfolio-activities/portfolio-activities.script.ts","../src/components/portfolio-activities/portfolio-activities.widget.tsx","../src/components/portfolio-net-worth-tokens/portfolio-net-worth-tokens.ui.tsx","../src/components/portfolio-net-worth-tokens/portfolio-net-worth-tokens.script.ts","../src/components/portfolio-net-worth-tokens/portfolio-net-worth-tokens.widget.tsx","../src/components/portfolio-pnl-details/portfolio-pnl-details.ui.tsx","../src/components/portfolio-pnl-details/portfolio-pnl-details.script.ts","../src/components/portfolio-pnl-details/portfolio-pnl-details.widget.tsx","../src/providers/PortfolioClientProvider.tsx","../src/hooks/useWalletStateManager.ts","../src/providers/PortfolioProvider.tsx"],"names":["version_default","PortfolioClientContext","createContext","PortfolioContext","PortfolioInternalContext","usePortfolioContext","context","useContext","useWalletSummary","summary","summaryStatus","useAccountInfo","status","signIn","signOut","useAuth","chain","chainNamespace","useCurrentChain","wallet","useConnectedWallet","nativeToken","useMemo","getNativeToken","balanceUsdFormatted","formatAmountUSD","balanceNativeFormatted","formatAmount","AccountInfoUI","walletAddress","actions","t","useTranslation","isMobile","useScreen","isOpen","onClose","onOpenChange","useDisclosure","copyToClipboard","useCopyToClipboard","handleCopyWalletAddress","useCallback","toast","jsx","Button","SignInIcon","jsxs","StyledPopover","PopoverTrigger","WalletIcon","ChevronDownIcon","cn","TokenIcon","PopoverContent","StyledTooltip","CopyIcon","Divider","action","SignOutIcon","AccountInfoWidget","state","parseDecimal","raw","n","formatUsd","value","abs","sign","formatSignedUsd","formatted","formatPercent","splitUsd","parts","integer","decimal","truncateAddress","address","start","end","formatTokenBalance","getExplorerUrl","txHash","_chain","DISTRIBUTION_COLORS","OTHER_COLOR","computeDistribution","holdings","totalValue","sum","h","sorted","a","b","items","otherValue","colorIdx","pct","formatTime","epochMs","AddressRowUI","walletId","wallets","isViewing","viewingAddress","onSelectWallet","onCopyAddress","onSearch","ddOpen","setDdOpen","useState","searchValue","setSearchValue","ddRef","useRef","isAggregated","selectedWallet","w","displayLabel","displayAddr","dotColor","handleSearch","v","handleKeyDown","e","o","Fragment","AssetTab","CurveType","CurvePeriod","CURVE_PERIOD_VALUE","PerpsPositionSide","SpotHistoryType","PredictionBetStatus","PredictionResult","PredictionSource","TABS","getTabValue","tab","spotValue","perpsValue","predictionValue","AssetTabsUI","activeTab","onTabChange","key","label","isActive","BalanceRowUI","overview","uPnl","realized","totalProfit","PnlItem","Separator","PERIODS","formatTimeLabel","ts","period","d","getDataKey","curveType","CurveCardUI","curvePeriod","data","isLoading","onTypeChange","onPeriodChange","points","dataKey","isPnl","displayValues","p","hasNegative","minVal","maxVal","min","max","range","timeLabels","count","step","labels","i","last","lastValue","TypeTab","ResponsiveContainer","AreaChart","XAxis","YAxis","ReferenceLine","Area","active","onClick","DistributionCardUI","chartData","item","PieChart","Pie","idx","Cell","usePortfolioClient","client","overviewQueryKey","query","fetchOverview","useOverviewQuery","queryOptions","useQuery","spotHoldingsQueryKey","fetchSpotHoldings","useSpotHoldingsQuery","spotHistoryQueryKey","fetchSpotHistory","useSpotHistoryQuery","perpsPositionsQueryKey","fetchPerpsPositions","usePerpsPositionsQuery","perpsHistoryQueryKey","fetchPerpsHistory","usePerpsHistoryQuery","predictionBetsQueryKey","fetchPredictionBets","usePredictionBetsQuery","predictionSettledQueryKey","fetchPredictionSettled","usePredictionSettledQuery","curveDataQueryKey","fetchCurveData","useCurveDataQuery","distributionQueryKey","useDistributionQuery","useRefetchWalletSummary","refetchSummary","DEFAULT_POLL_MS","definedEntries","obj","useWalletPortfolios","tokenAddresses","pollMs","tokens","setTokens","portfolioQuery","useWalletPortfoliosByTokensQuery","pnlQuery","useWalletPortfolioPnlsByTokensQuery","useEffect","portfolios","pnlMap","next","portfolio","tokenKeyRef","tokenSetRef","tokenKey","tokenSet","useWalletPortfoliosSubscription","subscribed","prev","updated","s","existing","_c","_w","_t","rest","patch","useWalletPortfolioPnlsSubscription","refetch","usePortfolioPage","options","defaultTab","walletAddresses","setActiveTab","setWalletId","setViewingAddress","setCurveType","setCurvePeriod","overviewQuery","spotHoldingsQuery","curveQuery","distributionResult","enterViewing","exitViewing","selectWallet","id","PortfolioPageSkeleton","Skeleton","_","ViewingBannerUI","onBack","PortfolioPageWidget","renderHoldings","externalLoading","distributionQuery","ConfirmDialog","open","title","message","confirmLabel","cancelLabel","onConfirm","onCancel","useHoldingsSection","spotSubTab","setSpotSubTab","perpsSubTab","setPerpsSubTab","predictionSubTab","setPredictionSubTab","spotSearch","setSpotSearch","perpsSearch","setPerpsSearch","predictionSearch","setPredictionSearch","hideSmall","setHideSmall","groupCollapsed","setGroupCollapsed","toggleGroupCollapsed","spotHistoryQuery","perpsPositionsQuery","perpsHistoryQuery","predictionBetsQuery","predictionSettledQuery","filteredSpotHoldings","q","filteredPerpsPositions","positions","filteredPredictionBets","bets","HoldingsSubTabs","tabs","activeKey","HoldingsSearch","onChange","placeholder","HoldingsEmpty","hint","BatchActionButton","disabled","PerpsPanelUI","onClosePosition","onCloseAll","hasPositions","k","PerpsPositionsTable","PerpsHistoryTable","PerpsPositionRow","position","isLong","isPnlPositive","records","r","PerpsTradeRow","record","PredictionPanelUI","onSellBet","onSellAll","hasBets","PredictionBetsTable","PredictionSettledTable","SOURCE_STYLES","SOURCE_LABELS","SourceTag","source","onSell","PredictionBetRow","bet","PredictionSettledRow","isWon","SpotPanelUI","SpotHoldingsTable","SpotHistoryTable","onToggleGroup","SpotHoldingRow","holding","isPositive","SpotHistoryRow","TYPE_STYLES","TYPE_LABELS","getTradeDetail","explorerUrl","HoldingsSectionWidget","onCloseAllPositions","onSellAllBets","confirmAction","setConfirmAction","handleCloseAll","handleSellAll","handleConfirm","handleCancel","formatAgeShort","from","now","diffSec","diffMin","diffHour","diffDay","diffMon","truncateMiddle","input","head","tail","TAG_META","TagBadge","tag","className","meta","TagBadgeList","tags","visible","overflow","SORT_OPTIONS","TYPE_OPTIONS","PortfolioActivities","activities","sortBy","onSortByChange","typeFilter","onTypeFilterChange","onLoadMore","hasMore","nativeDecimals","nativeSymbol","onRowClick","opt","ActivityRow","pickPrimary","formatGasFee","gasFee","decimals","symbol","activity","primary","sideLabel","sideColor","formatAmountUSDCompact","usePortfolioActivitiesScript","limit","initialSortBy","initialTypeFilter","setSortByState","setTypeFilterState","cursor","setCursor","pages","setPages","liveFront","setLiveFront","reset","setSortBy","setTypeFilter","queryType","queryParams","isPending","isFetching","useWalletActivitiesQuery","liveEligible","useWalletActivitiesSubscription","incoming","seen","fresh","paged","lastPage","loadMore","PortfolioActivitiesWidget","PortfolioNetWorthTokens","Row","formatPriceUSD","usePortfolioNetWorthTokensScript","useWalletPortfoliosQuery","merged","PortfolioNetWorthTokensWidget","RESOLUTION_OPTIONS","POSITION_OPTIONS","PortfolioPnlDetails","resolution","onResolutionChange","positionState","onPositionStateChange","FilterGroup","SummaryCard","total","totalRatio","win","SummaryStat","signTone","bn","SafeBigNumber","tone","PnlCell","cls","pnl","usePortfolioPnlDetailsScript","initialResolution","initialPositionState","setResolutionState","setPositionStateState","setResolution","setPositionState","useWalletPortfolioPnlsQuery","PortfolioPnlDetailsWidget","PortfolioClientProvider","children","SUMMARY_POLL_MS","useWalletStateManager","enabled","summaryPollMs","setSummary","setSummaryStatus","setRefetchSummary","portfoliosQuery","useWalletPnlQuery","isError","isSuccess","portfoliosData","pnlData","useWalletPnlSubscription","pnls","PortfolioProvider","INITIAL_ASYNC_STATUS","refetchRef","fn","publicValue","internalValue","StateManagerBridge"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-portfolio\"] = \"2.0.7\";\n}\n\nexport default \"2.0.7\";\n","import { createContext } from \"react\";\nimport type { IPortfolioClient } from \"../types\";\n\nexport const PortfolioClientContext = createContext<IPortfolioClient | null>(\n null,\n);\n","import type { Dispatch, SetStateAction } from \"react\";\nimport { createContext } from \"react\";\nimport type { AsyncStatus, WalletSummary } from \"../types\";\n\n/** Refetch function for wallet summary. */\nexport type RefetchWalletSummaryFn = () => Promise<void>;\n\n// ── Public Context (wallet summary, consumer-facing) ────────────────────────\n\nexport interface PortfolioContextValue {\n /** Wallet summary (balance + PnL) for the current tree's wallet. */\n summary: WalletSummary | null;\n /** Async status for wallet summary. */\n summaryStatus: AsyncStatus;\n /** Triggers a refetch of wallet summary. */\n refetchSummary: RefetchWalletSummaryFn;\n}\n\nexport const PortfolioContext = createContext<PortfolioContextValue>(\n {} as PortfolioContextValue,\n);\n\n// ── Internal Context (used by useWalletStateManager only) ───────────────────\n\nexport interface PortfolioInternalContextValue {\n setSummary: Dispatch<SetStateAction<WalletSummary | null>>;\n setSummaryStatus: Dispatch<SetStateAction<AsyncStatus>>;\n setRefetchSummary: (fn: RefetchWalletSummaryFn) => void;\n}\n\nexport const PortfolioInternalContext =\n createContext<PortfolioInternalContextValue>(\n {} as PortfolioInternalContextValue,\n );\n","import { useContext } from \"react\";\nimport { PortfolioContext } from \"../contexts\";\n\nexport function usePortfolioContext() {\n const context = useContext(PortfolioContext);\n if (!context) {\n throw new Error(\n \"usePortfolioContext must be used within a PortfolioProvider\",\n );\n }\n return context;\n}\n","import type { AsyncStatus, WalletSummary } from \"../types\";\nimport { usePortfolioContext } from \"./usePortfolioContext\";\n\n/**\n * Read wallet summary (balance + PnL) with async status.\n *\n * Must be used within a `<PortfolioProvider>`. The wallet is the one\n * identified by the `address` prop passed to the nearest `PortfolioProvider`.\n */\nexport function useWalletSummary(): AsyncStatus & {\n data: WalletSummary | null;\n} {\n const { summary, summaryStatus } = usePortfolioContext();\n return { data: summary, ...summaryStatus };\n}\n","import { useMemo } from \"react\";\nimport { useCurrentChain } from \"@liberfi.io/ui-chain-select\";\nimport {\n formatAmount,\n formatAmountUSD,\n getNativeToken,\n type PredefinedToken,\n} from \"@liberfi.io/utils\";\nimport {\n useAuth,\n useConnectedWallet,\n type AuthStatus,\n} from \"@liberfi.io/wallet-connector\";\nimport { useWalletSummary } from \"../../hooks/useWalletSummary\";\n\nexport interface UseAccountInfoResult {\n status: AuthStatus;\n signIn: () => void | Promise<void>;\n signOut: () => void | Promise<void>;\n /** Formatted USD balance for display (e.g. \"$1,234.56\"). */\n balanceUsdFormatted: string;\n /** Formatted native token amount for display (e.g. \"1.23\"). */\n balanceNativeFormatted: string;\n /** Current chain native token (address, symbol, decimals). Undefined when chain/summary not available. */\n nativeToken: PredefinedToken | undefined;\n /** Chain namespace label (e.g. \"EVM\", \"SOL\"). */\n chainNamespace: string;\n /** Connected wallet address, empty string when not connected. */\n walletAddress: string;\n}\n\n/**\n * Account info state and formatted display data for the account popover.\n * Must be used within AuthProvider and PortfolioProvider.\n */\nexport function useAccountInfo(): UseAccountInfoResult {\n const { status, signIn, signOut } = useAuth();\n const { data: summary } = useWalletSummary();\n const { chain, chainNamespace } = useCurrentChain();\n const wallet = useConnectedWallet(chain);\n\n // Use current chain for native token so it updates immediately on chain switch;\n // summary may be stale or null while the new chain's data is loading.\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n\n const balanceUsdFormatted = useMemo(() => {\n if (!summary?.balanceInUsd) return \"--\";\n return formatAmountUSD(summary.balanceInUsd);\n }, [summary?.balanceInUsd]);\n\n const balanceNativeFormatted = useMemo(() => {\n if (!summary?.balanceInNative) return \"--\";\n return formatAmount(summary.balanceInNative);\n }, [summary?.balanceInNative]);\n\n return {\n status,\n signIn,\n signOut,\n balanceUsdFormatted,\n balanceNativeFormatted,\n nativeToken,\n chainNamespace,\n walletAddress: wallet?.address ?? \"\",\n };\n}\n","import type { ReactNode } from \"react\";\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n ChevronDownIcon,\n cn,\n CopyIcon,\n Divider,\n PopoverContent,\n PopoverTrigger,\n SignInIcon,\n SignOutIcon,\n StyledPopover,\n StyledTooltip,\n toast,\n TokenIcon,\n useCopyToClipboard,\n useDisclosure,\n useScreen,\n WalletIcon,\n} from \"@liberfi.io/ui\";\nimport type { PredefinedToken } from \"@liberfi.io/utils\";\nimport type { AuthStatus } from \"@liberfi.io/wallet-connector\";\n\n/** Action button rendered in the popover action bar. */\nexport interface AccountAction {\n key: string;\n icon: ReactNode;\n label: string;\n onPress: () => void;\n}\n\nexport interface AccountInfoUIProps {\n status: AuthStatus;\n signIn: () => void | Promise<void>;\n signOut: () => void | Promise<void>;\n balanceUsdFormatted: string;\n balanceNativeFormatted: string;\n nativeToken: PredefinedToken | undefined;\n chainNamespace: string;\n walletAddress: string;\n /** Custom action buttons displayed before the fixed Sign Out button. */\n actions?: AccountAction[];\n}\n\nexport function AccountInfoUI({\n status,\n signIn,\n signOut,\n balanceUsdFormatted,\n balanceNativeFormatted,\n nativeToken,\n chainNamespace,\n walletAddress,\n actions,\n}: AccountInfoUIProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { isOpen, onClose, onOpenChange } = useDisclosure();\n const copyToClipboard = useCopyToClipboard();\n\n const handleCopyWalletAddress = useCallback(() => {\n copyToClipboard(walletAddress, () =>\n toast.success(\n t(\"common.primaryAddressCopied\", {\n network: chainNamespace.toUpperCase(),\n }),\n ),\n );\n }, [copyToClipboard, chainNamespace, walletAddress]);\n\n if (status === \"unauthenticated\") {\n return (\n <Button\n isIconOnly={isMobile}\n size=\"sm\"\n color=\"primary\"\n radius=\"full\"\n disableRipple\n onPress={signIn}\n startContent={\n isMobile ? undefined : <SignInIcon width={16} height={16} />\n }\n aria-label={t(\"common.signIn\")}\n >\n {isMobile ? <SignInIcon width={16} height={16} /> : t(\"common.signIn\")}\n </Button>\n );\n }\n\n if (status === \"authenticating\") {\n return (\n <Button\n isIconOnly={isMobile}\n size=\"sm\"\n color=\"primary\"\n radius=\"full\"\n disableRipple\n isLoading\n isDisabled\n aria-label={t(\"common.signingIn\")}\n >\n {t(\"common.signingIn\")}\n </Button>\n );\n }\n\n if (status === \"deauthenticating\") {\n return (\n <Button\n isIconOnly={isMobile}\n size=\"sm\"\n color=\"primary\"\n radius=\"full\"\n disableRipple\n isLoading\n isDisabled\n aria-label={t(\"common.signingOut\")}\n >\n {t(\"common.signingOut\")}\n </Button>\n );\n }\n\n return (\n <StyledPopover\n placement={isMobile ? \"bottom\" : \"bottom-end\"}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n triggerScaleOnOpen={false}\n >\n <PopoverTrigger>\n <Button\n size=\"sm\"\n className=\"bg-content2\"\n radius=\"full\"\n disableRipple\n startContent={\n <WalletIcon width={16} height={16} className=\"text-neutral\" />\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className={cn(\n \"text-neutral transition-transform\",\n isOpen && \"rotate-180\",\n )}\n />\n }\n >\n {nativeToken && (\n <div className=\"flex items-center gap-1.5\">\n <TokenIcon symbol={nativeToken.symbol} size={16} />\n <span className=\"text-xs text-foreground\">\n {isMobile\n ? balanceNativeFormatted\n : `${balanceNativeFormatted} ${nativeToken.symbol}`}\n </span>\n </div>\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent>\n <div className=\"w-70 flex flex-col gap-3 py-4\">\n <div className=\"px-4 flex items-start justify-between\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-xs text-neutral\">\n {t(\"common.totalValue\")}\n </span>\n <span className=\"text-base font-semibold text-foreground\">\n {balanceUsdFormatted}\n </span>\n </div>\n\n <div className=\"flex items-start justify-end gap-0.5\">\n <StyledTooltip\n content={t(\"common.copyPrimaryAddress\", {\n network: chainNamespace.toUpperCase(),\n })}\n >\n <Button\n className=\"text-xs bg-transparent text-neutral hover:text-foreground h-4 min-h-4 gap-1\"\n startContent={<CopyIcon width={14} height={14} />}\n disableRipple\n disableAnimation\n onPress={handleCopyWalletAddress}\n >\n {chainNamespace.toUpperCase()}\n </Button>\n </StyledTooltip>\n </div>\n </div>\n\n <Divider />\n\n <div className=\"grid grid-cols-4 gap-2 px-4\">\n {actions?.map((action) => (\n <button\n key={action.key}\n type=\"button\"\n className=\"flex cursor-pointer flex-col items-center justify-center gap-1 rounded-md py-2 text-foreground transition-colors hover:text-primary\"\n onClick={() => {\n action.onPress();\n onClose();\n }}\n >\n {action.icon}\n <span className=\"w-full truncate text-center text-xs\">\n {action.label}\n </span>\n </button>\n ))}\n <button\n type=\"button\"\n className=\"flex cursor-pointer flex-col items-center justify-center gap-1 rounded-md py-2 text-danger transition-colors hover:text-danger/80\"\n onClick={() => {\n signOut();\n onClose();\n }}\n >\n <SignOutIcon width={16} height={16} />\n <span className=\"w-full truncate text-center text-xs\">\n {t(\"common.signOut\")}\n </span>\n </button>\n </div>\n </div>\n </PopoverContent>\n </StyledPopover>\n );\n}\n","import { useAccountInfo } from \"./account-info.script\";\nimport { AccountInfoUI, type AccountAction } from \"./account-info.ui\";\n\nexport interface AccountInfoWidgetProps {\n /** Custom action buttons displayed before the fixed Sign Out button. */\n actions?: AccountAction[];\n}\n\n/**\n * Account / login button with wallet overview popover.\n * Renders sign-in button when unauthenticated, loading state when\n * authenticating/deauthenticating, and a popover with balance and\n * sign-out when authenticated.\n *\n * Must be used within AuthProvider and PortfolioProvider.\n */\nexport function AccountInfoWidget({ actions }: AccountInfoWidgetProps) {\n const state = useAccountInfo();\n\n return (\n <AccountInfoUI\n status={state.status}\n signIn={state.signIn}\n signOut={state.signOut}\n balanceUsdFormatted={state.balanceUsdFormatted}\n balanceNativeFormatted={state.balanceNativeFormatted}\n nativeToken={state.nativeToken}\n chainNamespace={state.chainNamespace}\n walletAddress={state.walletAddress}\n actions={actions}\n />\n );\n}\n","import type { DistributionData, SpotHolding } from \"../types\";\n\n/**\n * Parse a decimal string to a number, returning 0 for empty / invalid values.\n */\nexport function parseDecimal(raw: string | undefined | null): number {\n if (!raw) return 0;\n const n = Number(raw);\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * Format a number as a USD currency string.\n * - >= 1M → \"$1.2M\"\n * - >= 1K → \"$4.2K\"\n * - >= 1 → \"$1,234.56\"\n * - >= 0.01 → \"$0.42\"\n * - < 0.01 and > 0 → \"<$0.01\"\n * - 0 → \"$0.00\"\n */\nexport function formatUsd(value: number): string {\n const abs = Math.abs(value);\n const sign = value < 0 ? \"-\" : \"\";\n\n if (abs >= 1_000_000) {\n return `${sign}$${(abs / 1_000_000).toFixed(1)}M`;\n }\n if (abs >= 10_000) {\n return `${sign}$${(abs / 1_000).toFixed(1)}K`;\n }\n if (abs >= 1) {\n return `${sign}$${abs.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n if (abs >= 0.01) {\n return `${sign}$${abs.toFixed(2)}`;\n }\n if (abs > 0) {\n return `${sign}<$0.01`;\n }\n return \"$0.00\";\n}\n\n/**\n * Format a signed USD value with + / - prefix for PnL display.\n */\nexport function formatSignedUsd(value: number): string {\n const formatted = formatUsd(Math.abs(value));\n if (value > 0) return `+${formatted}`;\n if (value < 0) return `-${formatted.replace(\"-\", \"\")}`;\n return formatted;\n}\n\n/**\n * Format a percentage value.\n * Returns \"+3.24%\" or \"-1.50%\"\n */\nexport function formatPercent(value: number): string {\n const sign = value > 0 ? \"+\" : \"\";\n return `${sign}${value.toFixed(2)}%`;\n}\n\n/**\n * Split a USD value into integer and decimal parts for display.\n * e.g., 12847.63 → { integer: \"12,847\", decimal: \".63\", sign: \"$\" }\n */\nexport function splitUsd(value: number): {\n sign: string;\n integer: string;\n decimal: string;\n} {\n const abs = Math.abs(value);\n const parts = abs.toFixed(2).split(\".\");\n const integer = Number(parts[0]).toLocaleString(\"en-US\");\n const decimal = `.${parts[1]}`;\n const sign = value < 0 ? \"-$\" : \"$\";\n return { sign, integer, decimal };\n}\n\n/**\n * Truncate an address to \"xxxx…xxxx\" format.\n */\nexport function truncateAddress(address: string, start = 4, end = 4): string {\n if (address.length <= start + end + 3) return address;\n return `${address.slice(0, start)}…${address.slice(-end)}`;\n}\n\n/**\n * Format a token balance with appropriate precision.\n */\nexport function formatTokenBalance(value: number): string {\n if (value === 0) return \"0\";\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(2)}M`;\n if (value >= 1_000)\n return value.toLocaleString(\"en-US\", { maximumFractionDigits: 2 });\n if (value >= 1) return value.toFixed(2);\n if (value >= 0.0001) return value.toFixed(4);\n return \"<0.0001\";\n}\n\n/**\n * Build a Solana explorer URL for a transaction hash.\n * Defaults to Solscan. Can be extended for other chains in the future.\n */\nexport function getExplorerUrl(txHash: string, _chain?: string): string {\n return `https://solscan.io/tx/${txHash}`;\n}\n\n// ── Distribution Helpers ────────────────────────────────────────────────────\n\nconst DISTRIBUTION_COLORS = [\n \"#C8FF00\",\n \"#00E676\",\n \"#0066FF\",\n \"#FF6B9D\",\n \"#8B7BFF\",\n \"#FF5252\",\n \"#FFB74D\",\n \"#4DD0E1\",\n];\n\nconst OTHER_COLOR = \"#3A3A4E\";\n\n/**\n * Compute asset distribution from spot holdings for the donut chart.\n * Groups tokens with < 2% into \"Other\".\n */\nexport function computeDistribution(holdings: SpotHolding[]): DistributionData {\n const totalValue = holdings.reduce((sum, h) => sum + h.value, 0);\n if (totalValue <= 0) return { items: [] };\n\n const sorted = [...holdings].sort((a, b) => b.value - a.value);\n\n const items: DistributionData[\"items\"] = [];\n let otherValue = 0;\n let colorIdx = 0;\n\n for (const h of sorted) {\n const pct = (h.value / totalValue) * 100;\n if (pct < 2) {\n otherValue += h.value;\n } else {\n items.push({\n name: h.name,\n symbol: h.symbol,\n percent: pct,\n value: h.value,\n color: DISTRIBUTION_COLORS[colorIdx % DISTRIBUTION_COLORS.length],\n });\n colorIdx++;\n }\n }\n\n if (otherValue > 0) {\n items.push({\n name: \"Other\",\n symbol: \"OTHER\",\n percent: (otherValue / totalValue) * 100,\n value: otherValue,\n color: OTHER_COLOR,\n });\n }\n\n return { items };\n}\n\n/**\n * Format an epoch-ms timestamp for display in history tables.\n */\nexport function formatTime(epochMs: number): string {\n const d = new Date(epochMs);\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { truncateAddress } from \"../../utils\";\n\nexport interface WalletOption {\n id: string;\n name: string;\n address: string;\n balance: string;\n}\n\nexport interface AddressRowUIProps {\n walletId?: string;\n wallets: WalletOption[];\n isViewing: boolean;\n viewingAddress?: string;\n onSelectWallet: (id: string | undefined) => void;\n onCopyAddress: () => void;\n onSearch: (address: string) => void;\n}\n\nexport function AddressRowUI({\n walletId,\n wallets,\n isViewing,\n viewingAddress,\n onSelectWallet,\n onCopyAddress,\n onSearch,\n}: AddressRowUIProps) {\n const [ddOpen, setDdOpen] = useState(false);\n const [searchValue, setSearchValue] = useState(\"\");\n const ddRef = useRef<HTMLDivElement>(null);\n\n const isAggregated = !walletId && !isViewing;\n const selectedWallet = wallets.find((w) => w.id === walletId);\n\n const displayLabel = isViewing\n ? \"External\"\n : isAggregated\n ? \"All Wallets\"\n : (selectedWallet?.name ?? \"\");\n\n const displayAddr = isViewing\n ? truncateAddress(viewingAddress ?? \"\")\n : isAggregated\n ? \"Aggregated\"\n : truncateAddress(selectedWallet?.address ?? \"\");\n\n const dotColor = isViewing\n ? \"bg-[#5C5C72]\"\n : isAggregated\n ? \"bg-[#C8FF00]\"\n : \"bg-[#00E676]\";\n\n const handleSearch = useCallback(() => {\n const v = searchValue.trim();\n if (v.length >= 32) {\n onSearch(v);\n setSearchValue(\"\");\n }\n }, [searchValue, onSearch]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSearch();\n },\n [handleSearch],\n );\n\n return (\n <div className=\"flex items-center justify-between gap-4 pb-4\">\n {/* Left: Wallet Selector + Copy + Tag */}\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {/* Wallet Selector */}\n <div className=\"relative\" ref={ddRef}>\n <button\n type=\"button\"\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-2.5 py-1.5 transition-colors\",\n isViewing\n ? \"border-[rgba(200,255,0,0.2)] bg-[rgba(200,255,0,0.04)]\"\n : \"border-[#252530] bg-[#16161E] hover:border-[#35354A] hover:bg-[#1C1C26]\",\n isViewing && \"pointer-events-none\",\n )}\n onClick={() => !isViewing && setDdOpen((o) => !o)}\n >\n <span\n className={cn(\n \"h-[7px] w-[7px] flex-shrink-0 rounded-full\",\n dotColor,\n )}\n />\n <span className=\"text-[11px] font-medium text-[#A0A0B8]\">\n {displayLabel}\n </span>\n <span className=\"font-mono text-xs text-foreground\">\n {displayAddr}\n </span>\n {!isViewing && (\n <svg\n className={cn(\n \"text-[#5C5C72] transition-transform\",\n ddOpen && \"rotate-180\",\n )}\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M3 4.5L6 7.5L9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </button>\n\n {/* Dropdown */}\n {ddOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setDdOpen(false)}\n />\n <div className=\"absolute left-0 top-[calc(100%+4px)] z-50 min-w-[260px] rounded-lg border border-[#252530] bg-[#16161E] p-1 shadow-[0_8px_32px_rgba(0,0,0,0.4)]\">\n {/* All Wallets option */}\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2 rounded-[5px] px-2.5 py-2 transition-colors hover:bg-[#1C1C26]\",\n isAggregated && \"bg-[rgba(200,255,0,0.07)]\",\n )}\n onClick={() => {\n onSelectWallet(undefined);\n setDdOpen(false);\n }}\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-[#C8FF00]\" />\n <span className=\"min-w-[60px] text-[11px] font-medium text-[#A0A0B8]\">\n All Wallets\n </span>\n <span className=\"text-[11px] text-[#3A3A4E]\">Aggregated</span>\n </button>\n\n {wallets.map((w) => (\n <button\n key={w.id}\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2 rounded-[5px] px-2.5 py-2 transition-colors hover:bg-[#1C1C26]\",\n walletId === w.id && \"bg-[rgba(200,255,0,0.07)]\",\n )}\n onClick={() => {\n onSelectWallet(w.id);\n setDdOpen(false);\n }}\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-[#00E676]\" />\n <span className=\"min-w-[60px] text-[11px] font-medium text-[#A0A0B8]\">\n {w.name}\n </span>\n <span className=\"font-mono text-[11px] text-[#5C5C72]\">\n {truncateAddress(w.address)}\n </span>\n <span className=\"ml-auto font-mono text-[11px] font-medium text-foreground\">\n {w.balance}\n </span>\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n\n {/* Copy Button */}\n <button\n type=\"button\"\n className={cn(\n \"rounded p-1 text-[#5C5C72] transition-colors hover:bg-[#1C1C26] hover:text-[#C8FF00]\",\n isAggregated && !isViewing && \"pointer-events-none opacity-40\",\n )}\n onClick={onCopyAddress}\n disabled={isAggregated && !isViewing}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect\n x=\"4.5\"\n y=\"4.5\"\n width=\"7\"\n height=\"7\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n <path\n d=\"M9.5 4.5V3a1.5 1.5 0 0 0-1.5-1.5H3A1.5 1.5 0 0 0 1.5 3v5A1.5 1.5 0 0 0 3 9.5h1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n </svg>\n </button>\n\n {/* Tag */}\n <span\n className={cn(\n \"flex-shrink-0 rounded-[3px] px-1.5 py-[3px] text-[9px] font-semibold uppercase tracking-wider\",\n isViewing\n ? \"bg-[rgba(200,255,0,0.07)] text-[#C8FF00] animate-[pulse-glow_2s_ease-in-out_infinite]\"\n : \"bg-[rgba(0,230,118,0.1)] text-[#00E676]\",\n )}\n >\n {isViewing ? \"Viewing\" : \"Owner\"}\n </span>\n </div>\n\n {/* Right: Search + View */}\n <div className=\"flex flex-shrink-0 items-center gap-1.5\">\n <div className=\"flex h-[34px] w-[240px] items-center gap-1.5 rounded-lg border border-[#252530] bg-[#16161E] px-2.5 transition-all focus-within:w-[300px] focus-within:border-[#C8FF00]\">\n <svg\n className=\"flex-shrink-0 text-[#5C5C72]\"\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <circle\n cx=\"7\"\n cy=\"7\"\n r=\"5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M11 11L14.5 14.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n <input\n className=\"flex-1 border-none bg-transparent font-mono text-xs text-foreground caret-[#C8FF00] outline-none placeholder:font-sans placeholder:text-[11px] placeholder:text-[#5C5C72]\"\n placeholder=\"Search wallet address…\"\n spellCheck={false}\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n </div>\n <button\n type=\"button\"\n className=\"whitespace-nowrap rounded-[5px] border border-[#252530] bg-[#1C1C26] px-3 py-1.5 text-[11px] font-medium text-[#A0A0B8] transition-colors hover:border-[#C8FF00] hover:bg-[#C8FF00] hover:text-black\"\n onClick={handleSearch}\n >\n View\n </button>\n </div>\n </div>\n );\n}\n","import type { UseQueryResult } from \"@tanstack/react-query\";\nimport type { WalletPnl, WalletPortfolios } from \"@liberfi.io/types\";\n\n// ── Wallet Summary Types ────────────────────────────────────────────────────\n\n/** Wallet summary: balance + PnL fields flattened */\nexport type WalletSummary = Omit<WalletPortfolios, \"portfolios\"> & WalletPnl;\n\n/** Async status derived from React Query */\nexport type AsyncStatus = Pick<\n UseQueryResult,\n | \"status\"\n | \"fetchStatus\"\n | \"isLoading\"\n | \"isPending\"\n | \"isFetching\"\n | \"isRefetching\"\n | \"isError\"\n | \"isSuccess\"\n | \"error\"\n | \"dataUpdatedAt\"\n>;\n\n// ── Enums ────────────────────────────────────────────────────────────────────\n\nexport enum AssetTab {\n SPOT = \"spot\",\n PERPS = \"perps\",\n PREDICTION = \"prediction\",\n}\n\nexport enum CurveType {\n NET_WORTH = \"networth\",\n PNL = \"pnl\",\n}\n\nexport enum CurvePeriod {\n ONE_DAY = \"1D\",\n SEVEN_DAY = \"7D\",\n THIRTY_DAY = \"30D\",\n MAX = \"Max\",\n}\n\n/** Maps UI period enum to the integer value the backend expects. */\nexport const CURVE_PERIOD_VALUE: Record<CurvePeriod, number> = {\n [CurvePeriod.ONE_DAY]: 1,\n [CurvePeriod.SEVEN_DAY]: 7,\n [CurvePeriod.THIRTY_DAY]: 30,\n [CurvePeriod.MAX]: 365,\n};\n\nexport enum PerpsPositionSide {\n LONG = \"long\",\n SHORT = \"short\",\n}\n\nexport enum SpotHistoryType {\n SWAP = \"swap\",\n SEND = \"send\",\n RECEIVE = \"receive\",\n}\n\nexport enum PredictionBetStatus {\n ACTIVE = \"active\",\n PENDING = \"pending\",\n}\n\nexport enum PredictionResult {\n WON = \"won\",\n LOST = \"lost\",\n}\n\nexport enum PredictionSource {\n POLYMARKET = \"polymarket\",\n DRIFT = \"drift\",\n METADAO = \"metadao\",\n}\n\n// ── Query Params ─────────────────────────────────────────────────────────────\n\nexport interface PortfolioQuery {\n walletAddresses?: string[];\n chain?: string;\n}\n\nexport interface CurveQuery extends PortfolioQuery {\n period: number;\n}\n\nexport interface SpotHistoryQuery extends PortfolioQuery {\n cursor?: string;\n limit?: number;\n}\n\n// ── Raw API Response DTOs ───────────────────────────────────────────────────\n// These types mirror the backend proto schemas exactly (all string values).\n\nexport interface PortfolioOverviewDTO {\n totalBalanceUsd: string;\n unrealizedPnl: string;\n realizedPnl: string;\n totalProfitUsd: string;\n winRate: string;\n}\n\nexport interface ChartDataPointDTO {\n timestamp: string;\n netWorth: string;\n change: string;\n changePercent: string;\n}\n\nexport interface GetPortfolioChartReply {\n dataPoints: ChartDataPointDTO[];\n}\n\nexport interface TokenHoldingDTO {\n tokenAddress: string;\n symbol: string;\n name: string;\n imageUrl: string;\n chain: string;\n balance: string;\n priceUsd: string;\n valueUsd: string;\n priceChange24h: string;\n unrealizedPnl: string;\n realizedPnl: string;\n walletAddress: string;\n}\n\nexport interface GetSpotHoldingsReply {\n holdings: TokenHoldingDTO[];\n}\n\nexport interface TradeRecordDTO {\n type: string;\n tokenSymbol: string;\n tokenName: string;\n tokenImageUrl: string;\n tokenAddress: string;\n tokenAmount: string;\n valueUsd: string;\n priceUsd: string;\n sideTokenSymbol: string;\n sideTokenAmount: string;\n dex: string;\n txHash: string;\n chain: string;\n walletAddress: string;\n timestamp: string;\n}\n\nexport interface GetTradeHistoryReply {\n trades: TradeRecordDTO[];\n nextCursor: string;\n hasNext: boolean;\n}\n\n// ── Domain Types (UI-facing, parsed to numbers) ─────────────────────────────\n\nexport interface PortfolioOverview {\n totalValue: number;\n uPnl: number;\n realizedPnl: number;\n totalProfit: number;\n winRate: number;\n}\n\n// ── Spot Holdings ────────────────────────────────────────────────────────────\n\nexport interface SpotHolding {\n tokenAddress: string;\n name: string;\n symbol: string;\n image: string;\n chain: string;\n balance: number;\n price: number;\n value: number;\n change24h: number;\n unrealizedPnl: number;\n realizedPnl: number;\n walletAddress: string;\n /** Client-side derived: true if the token is in a verified whitelist. */\n verified: boolean;\n}\n\nexport interface SpotHoldingsData {\n holdings: SpotHolding[];\n}\n\n// ── Spot History ─────────────────────────────────────────────────────────────\n\nexport interface SpotHistoryRecord {\n type: SpotHistoryType;\n tokenSymbol: string;\n tokenName: string;\n tokenImageUrl: string;\n tokenAddress: string;\n tokenAmount: number;\n valueUsd: number;\n priceUsd: number;\n sideTokenSymbol: string;\n sideTokenAmount: number;\n dex: string;\n txHash: string;\n chain: string;\n walletAddress: string;\n timestamp: number;\n}\n\nexport interface SpotHistoryData {\n trades: SpotHistoryRecord[];\n nextCursor: string;\n hasNext: boolean;\n}\n\n// ── Curve / Chart Data ──────────────────────────────────────────────────────\n\nexport interface CurvePoint {\n timestamp: number;\n netWorth: number;\n change: number;\n changePercent: number;\n}\n\nexport interface CurveData {\n points: CurvePoint[];\n}\n\n// ── Distribution (computed client-side from holdings) ───────────────────────\n\nexport interface DistributionItem {\n name: string;\n symbol: string;\n percent: number;\n value: number;\n color: string;\n}\n\nexport interface DistributionData {\n items: DistributionItem[];\n}\n\n// ── Perps Positions (future — no backend API yet) ───────────────────────────\n\nexport interface PerpsPosition {\n id: string;\n pair: string;\n icon?: string;\n side: PerpsPositionSide;\n leverage: number;\n size: number;\n entryPrice: number;\n markPrice: number;\n uPnl: number;\n protocol: string;\n closeUrl: string;\n}\n\nexport interface PerpsPositionsData {\n positions: PerpsPosition[];\n totalValue: number;\n}\n\nexport interface PerpsTradeRecord {\n id: string;\n pair: string;\n icon?: string;\n side: PerpsPositionSide;\n size: number;\n pnl: number;\n closePrice: number;\n time: string;\n}\n\nexport interface PerpsHistoryData {\n records: PerpsTradeRecord[];\n hasMore: boolean;\n}\n\nexport interface PerpsHistoryQuery extends PortfolioQuery {\n cursor?: string;\n limit?: number;\n}\n\n// ── Prediction Bets (future — no backend API yet) ──────────────────────────\n\nexport interface PredictionBet {\n id: string;\n market: string;\n icon?: string;\n source: PredictionSource;\n expiresAt: string;\n position: \"Yes\" | \"No\";\n stake: number;\n potential: number;\n status: PredictionBetStatus;\n sellUrl: string;\n}\n\nexport interface PredictionBetsData {\n bets: PredictionBet[];\n totalValue: number;\n}\n\nexport interface PredictionSettledRecord {\n id: string;\n market: string;\n icon?: string;\n source: PredictionSource;\n position: \"Yes\" | \"No\";\n stake: number;\n result: PredictionResult;\n payout: number;\n}\n\nexport interface PredictionSettledData {\n records: PredictionSettledRecord[];\n hasMore: boolean;\n}\n\nexport interface PredictionSettledQuery extends PortfolioQuery {\n cursor?: string;\n limit?: number;\n}\n\n// ── Client Interface ─────────────────────────────────────────────────────────\n\nexport interface IPortfolioClient {\n getOverview(query?: PortfolioQuery): Promise<PortfolioOverview>;\n\n getSpotHoldings(query?: PortfolioQuery): Promise<SpotHoldingsData>;\n\n getSpotHistory(query?: SpotHistoryQuery): Promise<SpotHistoryData>;\n\n getChartData(query: CurveQuery): Promise<CurveData>;\n\n // ── Future APIs (not yet available in backend) ─────────────────────────\n getPerpsPositions(query?: PortfolioQuery): Promise<PerpsPositionsData>;\n getPerpsHistory(query?: PerpsHistoryQuery): Promise<PerpsHistoryData>;\n getPredictionBets(query?: PortfolioQuery): Promise<PredictionBetsData>;\n getPredictionSettled(\n query?: PredictionSettledQuery,\n ): Promise<PredictionSettledData>;\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport { AssetTab } from \"../../types\";\nimport { formatUsd } from \"../../utils\";\n\nexport interface AssetTabsUIProps {\n activeTab: AssetTab;\n onTabChange: (tab: AssetTab) => void;\n spotValue?: number;\n perpsValue?: number;\n predictionValue?: number;\n}\n\nconst TABS: { key: AssetTab; label: string }[] = [\n { key: AssetTab.SPOT, label: \"Spot\" },\n { key: AssetTab.PERPS, label: \"Perps\" },\n { key: AssetTab.PREDICTION, label: \"Prediction\" },\n];\n\nfunction getTabValue(\n tab: AssetTab,\n spotValue: number,\n perpsValue: number,\n predictionValue: number,\n): number {\n switch (tab) {\n case AssetTab.SPOT:\n return spotValue;\n case AssetTab.PERPS:\n return perpsValue;\n case AssetTab.PREDICTION:\n return predictionValue;\n }\n}\n\nexport function AssetTabsUI({\n activeTab,\n onTabChange,\n spotValue = 0,\n perpsValue = 0,\n predictionValue = 0,\n}: AssetTabsUIProps) {\n return (\n <div className=\"flex gap-1 border-b border-[#252530] pb-0 pt-5\">\n {TABS.map(({ key, label }) => {\n const isActive = activeTab === key;\n const value = getTabValue(key, spotValue, perpsValue, predictionValue);\n return (\n <button\n key={key}\n type=\"button\"\n className={cn(\n \"relative flex items-center gap-2 border-b-2 px-4 pb-3 pt-2.5 text-[13px] font-medium transition-colors\",\n isActive\n ? \"border-[#C8FF00] text-foreground\"\n : \"border-transparent text-[#5C5C72] hover:text-[#A0A0B8]\",\n )}\n onClick={() => onTabChange(key)}\n >\n {label}\n {!isActive && (\n <span className=\"rounded-[10px] bg-[#16161E] px-2 py-0.5 font-mono text-[11px] text-[#5C5C72]\">\n {formatUsd(value)}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { PortfolioOverview } from \"../../types\";\nimport { formatSignedUsd, splitUsd } from \"../../utils\";\n\nexport interface BalanceRowUIProps {\n overview?: PortfolioOverview;\n}\n\nexport function BalanceRowUI({ overview }: BalanceRowUIProps) {\n const totalValue = overview?.totalValue ?? 0;\n const uPnl = overview?.uPnl ?? 0;\n const realized = overview?.realizedPnl ?? 0;\n const totalProfit = overview?.totalProfit ?? 0;\n\n const { sign, integer, decimal } = splitUsd(totalValue);\n\n return (\n <div className=\"flex items-center gap-4 pb-4\">\n {/* Left: Balance */}\n <div className=\"flex items-baseline gap-3\">\n <div className=\"font-mono text-[26px] font-bold leading-none tracking-tight\">\n <span className=\"mr-px text-lg font-medium text-[#C8FF00]\">\n {sign}\n </span>\n {integer}\n <span className=\"text-base font-normal text-[#5C5C72]\">\n {decimal}\n </span>\n </div>\n </div>\n\n {/* Right: uPNL Indicators */}\n <div className=\"ml-auto flex items-center gap-3\">\n <PnlItem label=\"uPNL\" value={uPnl} />\n <Separator />\n <PnlItem label=\"Realized\" value={realized} />\n <Separator />\n <PnlItem label=\"Total Profit\" value={totalProfit} />\n </div>\n </div>\n );\n}\n\nfunction PnlItem({ label, value }: { label: string; value: number }) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[11px] text-[#5C5C72]\">{label}</span>\n <span\n className={cn(\n \"font-mono text-xs font-medium\",\n value > 0\n ? \"text-[#00E676]\"\n : value < 0\n ? \"text-[#FF5252]\"\n : \"text-[#5C5C72]\",\n )}\n >\n {formatSignedUsd(value)}\n </span>\n </div>\n );\n}\n\nfunction Separator() {\n return <div className=\"h-3.5 w-px bg-[#252530]\" />;\n}\n","import { useMemo } from \"react\";\nimport {\n Area,\n AreaChart,\n ReferenceLine,\n ResponsiveContainer,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { CurvePeriod, CurveType, type CurveData } from \"../../types\";\n\nexport interface CurveCardUIProps {\n curveType: CurveType;\n curvePeriod: CurvePeriod;\n data?: CurveData;\n isLoading?: boolean;\n onTypeChange: (type: CurveType) => void;\n onPeriodChange: (period: CurvePeriod) => void;\n}\n\nconst PERIODS: CurvePeriod[] = [\n CurvePeriod.ONE_DAY,\n CurvePeriod.SEVEN_DAY,\n CurvePeriod.THIRTY_DAY,\n CurvePeriod.MAX,\n];\n\nfunction formatTimeLabel(ts: number, period: CurvePeriod): string {\n const d = new Date(ts);\n switch (period) {\n case CurvePeriod.ONE_DAY:\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n default:\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\n/** The dataKey determines which field of CurvePoint the chart displays. */\nfunction getDataKey(curveType: CurveType): string {\n return curveType === CurveType.PNL ? \"change\" : \"netWorth\";\n}\n\nexport function CurveCardUI({\n curveType,\n curvePeriod,\n data,\n isLoading,\n onTypeChange,\n onPeriodChange,\n}: CurveCardUIProps) {\n const points = data?.points ?? [];\n const dataKey = getDataKey(curveType);\n const isPnl = curveType === CurveType.PNL;\n\n const displayValues = useMemo(\n () => points.map((p) => (isPnl ? p.change : p.netWorth)),\n [points, isPnl],\n );\n\n const hasNegative = displayValues.some((v) => v < 0);\n\n const { minVal, maxVal } = useMemo(() => {\n if (displayValues.length === 0) return { minVal: 0, maxVal: 100 };\n const min = Math.min(...displayValues);\n const max = Math.max(...displayValues);\n const range = max - min || 1;\n return {\n minVal: min - range * 0.1,\n maxVal: max + range * 0.1,\n };\n }, [displayValues]);\n\n const timeLabels = useMemo(() => {\n if (points.length === 0) return [];\n const count = Math.min(7, points.length);\n const step = Math.max(1, Math.floor((points.length - 1) / (count - 1)));\n const labels: { ts: number; label: string }[] = [];\n for (let i = 0; i < points.length; i += step) {\n labels.push({\n ts: points[i].timestamp,\n label: formatTimeLabel(points[i].timestamp, curvePeriod),\n });\n }\n // Always include last\n const last = points[points.length - 1];\n if (labels[labels.length - 1]?.ts !== last.timestamp) {\n labels.push({\n ts: last.timestamp,\n label: formatTimeLabel(last.timestamp, curvePeriod),\n });\n }\n return labels;\n }, [points, curvePeriod]);\n\n const lastValue = displayValues[displayValues.length - 1] ?? 0;\n\n return (\n <div className=\"overflow-hidden rounded-lg border border-[#252530] bg-[#0F0F16]\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 pt-3\">\n {/* Type Tabs */}\n <div className=\"flex gap-0.5 rounded-[5px] bg-[#16161E] p-0.5\">\n <TypeTab\n label=\"Net Worth\"\n active={curveType === CurveType.NET_WORTH}\n onClick={() => onTypeChange(CurveType.NET_WORTH)}\n />\n <TypeTab\n label=\"PNL\"\n active={curveType === CurveType.PNL}\n onClick={() => onTypeChange(CurveType.PNL)}\n />\n </div>\n\n {/* Period Buttons */}\n <div className=\"flex gap-0.5\">\n {PERIODS.map((p) => (\n <button\n key={p}\n type=\"button\"\n className={cn(\n \"rounded-[3px] px-2 py-1 text-[10px] font-medium transition-colors\",\n curvePeriod === p\n ? \"bg-[rgba(200,255,0,0.07)] text-[#C8FF00]\"\n : \"text-[#5C5C72] hover:bg-[#16161E] hover:text-[#A0A0B8]\",\n )}\n onClick={() => onPeriodChange(p)}\n >\n {p}\n </button>\n ))}\n </div>\n </div>\n\n {/* Chart Area */}\n <div className=\"h-[180px] px-4 pt-2\">\n {isLoading || points.length < 2 ? (\n <div className=\"flex h-full items-center justify-center\">\n <span className=\"text-xs text-[#5C5C72]\">\n {isLoading ? \"\" : \"Not enough data\"}\n </span>\n </div>\n ) : (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart\n data={points}\n margin={{ top: 8, right: 0, left: 0, bottom: 0 }}\n >\n <defs>\n <linearGradient id=\"gradAccent\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#C8FF00\" stopOpacity={0.12} />\n <stop offset=\"100%\" stopColor=\"#C8FF00\" stopOpacity={0} />\n </linearGradient>\n <linearGradient id=\"gradGreen\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#00E676\" stopOpacity={0.12} />\n <stop offset=\"100%\" stopColor=\"#00E676\" stopOpacity={0} />\n </linearGradient>\n <linearGradient id=\"gradRed\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#FF5252\" stopOpacity={0} />\n <stop offset=\"100%\" stopColor=\"#FF5252\" stopOpacity={0.1} />\n </linearGradient>\n </defs>\n\n <XAxis dataKey=\"timestamp\" hide />\n <YAxis hide domain={[minVal, maxVal]} />\n\n {isPnl && hasNegative && (\n <ReferenceLine\n y={0}\n stroke=\"rgba(255,255,255,0.06)\"\n strokeDasharray=\"4 4\"\n />\n )}\n\n <Area\n type=\"monotone\"\n dataKey={dataKey}\n stroke={\n isPnl ? (lastValue >= 0 ? \"#00E676\" : \"#FF5252\") : \"#C8FF00\"\n }\n strokeWidth={1.5}\n fill={\n isPnl\n ? lastValue >= 0\n ? \"url(#gradGreen)\"\n : \"url(#gradRed)\"\n : \"url(#gradAccent)\"\n }\n dot={false}\n isAnimationActive={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n )}\n </div>\n\n {/* Time Axis */}\n <div className=\"flex justify-between px-4 pb-2.5 pt-1\">\n {timeLabels.map(({ ts, label }) => (\n <span key={ts} className=\"font-mono text-[9px] text-[#3A3A4E]\">\n {label}\n </span>\n ))}\n </div>\n </div>\n );\n}\n\nfunction TypeTab({\n label,\n active,\n onClick,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"rounded px-2.5 py-1 text-[11px] font-medium transition-colors\",\n active\n ? \"bg-[#1C1C26] text-foreground\"\n : \"text-[#5C5C72] hover:text-[#A0A0B8]\",\n )}\n onClick={onClick}\n >\n {label}\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport { Cell, Pie, PieChart, ResponsiveContainer } from \"recharts\";\nimport type { DistributionData } from \"../../types\";\nimport { formatUsd } from \"../../utils\";\n\nexport interface DistributionCardUIProps {\n data?: DistributionData;\n isLoading?: boolean;\n}\n\nexport function DistributionCardUI({\n data,\n isLoading,\n}: DistributionCardUIProps) {\n const items = data?.items ?? [];\n\n const chartData = useMemo(\n () => items.map((item) => ({ name: item.name, value: item.percent })),\n [items],\n );\n\n return (\n <div className=\"flex flex-col overflow-hidden rounded-lg border border-[#252530] bg-[#0F0F16]\">\n {/* Header */}\n <div className=\"px-4 pb-2 pt-3\">\n <span className=\"text-xs font-semibold text-[#A0A0B8]\">\n Distribution\n </span>\n </div>\n\n {/* Pie Chart */}\n <div className=\"flex flex-1 items-center justify-center px-4\">\n {isLoading || items.length === 0 ? (\n <div className=\"flex h-[140px] w-[140px] items-center justify-center\">\n <span className=\"text-xs text-[#5C5C72]\">\n {isLoading ? \"\" : \"No data\"}\n </span>\n </div>\n ) : (\n <ResponsiveContainer width={140} height={140}>\n <PieChart>\n <Pie\n data={chartData}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={32}\n outerRadius={55}\n dataKey=\"value\"\n stroke=\"none\"\n isAnimationActive={false}\n >\n {items.map((item, idx) => (\n <Cell key={idx} fill={item.color} />\n ))}\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n )}\n </div>\n\n {/* Legend */}\n <div className=\"px-4 pb-3 pt-2\">\n {items.map((item, idx) => (\n <div\n key={idx}\n className=\"flex items-center gap-1.5 py-[3px] text-[11px]\"\n >\n <span\n className=\"h-[7px] w-[7px] flex-shrink-0 rounded-[2px]\"\n style={{ background: item.color }}\n />\n <span className=\"min-w-0 flex-1 truncate text-[#A0A0B8]\">\n {item.name}\n </span>\n <span className=\"font-mono text-[10px] text-[#5C5C72]\">\n {item.percent.toFixed(1)}%\n </span>\n <span className=\"min-w-[55px] text-right font-mono text-[10px] text-foreground\">\n {formatUsd(item.value)}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useContext } from \"react\";\nimport { PortfolioClientContext } from \"../contexts\";\n\nexport function usePortfolioClient() {\n const client = useContext(PortfolioClientContext);\n if (!client) {\n throw new Error(\n \"usePortfolioClient must be used within a PortfolioClientProvider\",\n );\n }\n return client;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PortfolioOverview,\n PortfolioQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function overviewQueryKey(query?: PortfolioQuery): unknown[] {\n return [\"portfolio\", \"overview\", query ?? {}];\n}\n\nexport async function fetchOverview(\n client: IPortfolioClient,\n query?: PortfolioQuery,\n): Promise<PortfolioOverview> {\n return await client.getOverview(query);\n}\n\nexport function useOverviewQuery(\n query?: PortfolioQuery,\n queryOptions: Omit<\n UseQueryOptions<PortfolioOverview, Error, PortfolioOverview, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: overviewQueryKey(query),\n queryFn: async () => fetchOverview(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PortfolioQuery,\n SpotHoldingsData,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function spotHoldingsQueryKey(query?: PortfolioQuery): unknown[] {\n return [\"portfolio\", \"spot\", \"holdings\", query ?? {}];\n}\n\nexport async function fetchSpotHoldings(\n client: IPortfolioClient,\n query?: PortfolioQuery,\n): Promise<SpotHoldingsData> {\n return await client.getSpotHoldings(query);\n}\n\nexport function useSpotHoldingsQuery(\n query?: PortfolioQuery,\n queryOptions: Omit<\n UseQueryOptions<SpotHoldingsData, Error, SpotHoldingsData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: spotHoldingsQueryKey(query),\n queryFn: async () => fetchSpotHoldings(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n SpotHistoryData,\n SpotHistoryQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function spotHistoryQueryKey(query?: SpotHistoryQuery): unknown[] {\n return [\"portfolio\", \"spot\", \"history\", query ?? {}];\n}\n\nexport async function fetchSpotHistory(\n client: IPortfolioClient,\n query?: SpotHistoryQuery,\n): Promise<SpotHistoryData> {\n return await client.getSpotHistory(query);\n}\n\nexport function useSpotHistoryQuery(\n query?: SpotHistoryQuery,\n queryOptions: Omit<\n UseQueryOptions<SpotHistoryData, Error, SpotHistoryData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: spotHistoryQueryKey(query),\n queryFn: async () => fetchSpotHistory(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PerpsPositionsData,\n PortfolioQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function perpsPositionsQueryKey(query?: PortfolioQuery): unknown[] {\n return [\"portfolio\", \"perps\", \"positions\", query ?? {}];\n}\n\nexport async function fetchPerpsPositions(\n client: IPortfolioClient,\n query?: PortfolioQuery,\n): Promise<PerpsPositionsData> {\n return await client.getPerpsPositions(query);\n}\n\nexport function usePerpsPositionsQuery(\n query?: PortfolioQuery,\n queryOptions: Omit<\n UseQueryOptions<PerpsPositionsData, Error, PerpsPositionsData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: perpsPositionsQueryKey(query),\n queryFn: async () => fetchPerpsPositions(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PerpsHistoryData,\n PerpsHistoryQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function perpsHistoryQueryKey(query?: PerpsHistoryQuery): unknown[] {\n return [\"portfolio\", \"perps\", \"history\", query ?? {}];\n}\n\nexport async function fetchPerpsHistory(\n client: IPortfolioClient,\n query?: PerpsHistoryQuery,\n): Promise<PerpsHistoryData> {\n return await client.getPerpsHistory(query);\n}\n\nexport function usePerpsHistoryQuery(\n query?: PerpsHistoryQuery,\n queryOptions: Omit<\n UseQueryOptions<PerpsHistoryData, Error, PerpsHistoryData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: perpsHistoryQueryKey(query),\n queryFn: async () => fetchPerpsHistory(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PortfolioQuery,\n PredictionBetsData,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function predictionBetsQueryKey(query?: PortfolioQuery): unknown[] {\n return [\"portfolio\", \"prediction\", \"active\", query ?? {}];\n}\n\nexport async function fetchPredictionBets(\n client: IPortfolioClient,\n query?: PortfolioQuery,\n): Promise<PredictionBetsData> {\n return await client.getPredictionBets(query);\n}\n\nexport function usePredictionBetsQuery(\n query?: PortfolioQuery,\n queryOptions: Omit<\n UseQueryOptions<PredictionBetsData, Error, PredictionBetsData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: predictionBetsQueryKey(query),\n queryFn: async () => fetchPredictionBets(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PredictionSettledData,\n PredictionSettledQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function predictionSettledQueryKey(\n query?: PredictionSettledQuery,\n): unknown[] {\n return [\"portfolio\", \"prediction\", \"settled\", query ?? {}];\n}\n\nexport async function fetchPredictionSettled(\n client: IPortfolioClient,\n query?: PredictionSettledQuery,\n): Promise<PredictionSettledData> {\n return await client.getPredictionSettled(query);\n}\n\nexport function usePredictionSettledQuery(\n query?: PredictionSettledQuery,\n queryOptions: Omit<\n UseQueryOptions<\n PredictionSettledData,\n Error,\n PredictionSettledData,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: predictionSettledQueryKey(query),\n queryFn: async () => fetchPredictionSettled(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { CurveData, CurveQuery, IPortfolioClient } from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function curveDataQueryKey(query: CurveQuery): unknown[] {\n return [\"portfolio\", \"chart\", query];\n}\n\nexport async function fetchCurveData(\n client: IPortfolioClient,\n query: CurveQuery,\n): Promise<CurveData> {\n return await client.getChartData(query);\n}\n\nexport function useCurveDataQuery(\n query: CurveQuery,\n queryOptions: Omit<\n UseQueryOptions<CurveData, Error, CurveData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: curveDataQueryKey(query),\n queryFn: async () => fetchCurveData(client, query),\n ...queryOptions,\n });\n}\n","import { useMemo } from \"react\";\nimport type { DistributionData, SpotHolding } from \"../types\";\nimport { computeDistribution } from \"../utils\";\n\nexport function distributionQueryKey(): unknown[] {\n return [\"portfolio\", \"distribution\"];\n}\n\n/**\n * Compute distribution data from spot holdings (client-side).\n * No backend API required — derives from existing holdings data.\n */\nexport function useDistributionQuery(holdings: SpotHolding[]): {\n data: DistributionData;\n} {\n const data = useMemo(() => computeDistribution(holdings), [holdings]);\n return { data };\n}\n","import { usePortfolioContext } from \"./usePortfolioContext\";\n\n/**\n * Returns a function that triggers a wallet summary refetch.\n *\n * Must be used within a `<PortfolioProvider>`. The refetch targets the wallet\n * identified by the `address` prop passed to the nearest `PortfolioProvider`.\n */\nexport function useRefetchWalletSummary() {\n const { refetchSummary } = usePortfolioContext();\n return refetchSummary;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n useWalletPortfoliosByTokensQuery,\n useWalletPortfolioPnlsByTokensQuery,\n useWalletPortfoliosSubscription,\n useWalletPortfolioPnlsSubscription,\n} from \"@liberfi.io/react\";\nimport type { API, Chain, Portfolio, PortfolioPnl } from \"@liberfi.io/types\";\n\nconst DEFAULT_POLL_MS = 15_000;\n\n/** Pick only defined (non-undefined) entries from an object. */\nfunction definedEntries<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\nexport interface UseWalletPortfoliosParams {\n chain: Chain;\n /** Wallet address */\n address: string;\n /** Token addresses to track */\n tokenAddresses: string[];\n /** Polling interval in ms (default 15 000) */\n pollMs?: number;\n}\n\nexport interface TokenPortfolio extends Portfolio {\n pnl: PortfolioPnl | null;\n}\n\nexport function useWalletPortfolios({\n chain,\n address,\n tokenAddresses,\n pollMs = DEFAULT_POLL_MS,\n}: UseWalletPortfoliosParams) {\n const active = !!address && tokenAddresses.length > 0;\n\n const [tokens, setTokens] = useState<Record<string, TokenPortfolio>>({});\n\n // ── Queries (polling) ─────────────────────────────────────────────────────\n\n const portfolioQuery = useWalletPortfoliosByTokensQuery(\n { chain, address, tokenAddresses },\n { enabled: active, refetchInterval: pollMs },\n );\n\n const pnlQuery = useWalletPortfolioPnlsByTokensQuery(\n { chain, address, tokenAddresses },\n { enabled: active, refetchInterval: pollMs },\n );\n\n // ── Sync query data → local state ─────────────────────────────────────────\n\n useEffect(() => {\n const portfolios = portfolioQuery.data ?? [];\n\n const pnlMap = new Map<string, PortfolioPnl>();\n if (pnlQuery.data) {\n for (const p of pnlQuery.data) {\n pnlMap.set(p.address, p);\n }\n }\n\n const next: Record<string, TokenPortfolio> = {};\n for (const portfolio of portfolios) {\n next[portfolio.address] = {\n ...portfolio,\n pnl: pnlMap.get(portfolio.address) ?? null,\n };\n }\n setTokens(next);\n }, [portfolioQuery.data, pnlQuery.data]);\n\n // ── Subscriptions (real-time) ─────────────────────────────────────────────\n\n const tokenKeyRef = useRef(\"\");\n const tokenSetRef = useRef(new Set<string>());\n const tokenKey = tokenAddresses.slice().sort().join(\",\");\n if (tokenKey !== tokenKeyRef.current) {\n tokenKeyRef.current = tokenKey;\n tokenSetRef.current = new Set(tokenAddresses);\n }\n const tokenSet = tokenSetRef.current;\n\n useWalletPortfoliosSubscription(\n { chain, address },\n (subscribed: Array<API.PortfolioSubscribed>) => {\n setTokens((prev) => {\n let updated = prev;\n for (const s of subscribed) {\n if (!tokenSet.has(s.tokenAddress)) continue;\n const existing = updated[s.tokenAddress];\n if (!existing) continue;\n\n const { chain: _c, walletAddress: _w, tokenAddress: _t, ...rest } = s;\n const patch = definedEntries(rest);\n if (Object.keys(patch).length === 0) continue;\n\n updated = updated === prev ? { ...prev } : updated;\n updated[s.tokenAddress] = { ...existing, ...patch };\n }\n return updated;\n });\n },\n { enabled: active },\n );\n\n useWalletPortfolioPnlsSubscription(\n { chain, address },\n (subscribed: Array<API.PortfolioPnlSubscribed>) => {\n setTokens((prev) => {\n let updated = prev;\n for (const s of subscribed) {\n if (!tokenSet.has(s.tokenAddress)) continue;\n const existing = updated[s.tokenAddress];\n if (!existing || !existing.pnl) continue;\n\n const { walletAddress: _w, tokenAddress: _t, ...rest } = s;\n const patch = definedEntries(rest);\n if (Object.keys(patch).length === 0) continue;\n\n updated = updated === prev ? { ...prev } : updated;\n updated[s.tokenAddress] = {\n ...existing,\n pnl: { ...existing.pnl, ...patch },\n };\n }\n return updated;\n });\n },\n { enabled: active },\n );\n\n // ── Refetch ───────────────────────────────────────────────────────────────\n\n const refetch = useCallback(async () => {\n await Promise.all([portfolioQuery.refetch(), pnlQuery.refetch()]);\n }, [portfolioQuery.refetch, pnlQuery.refetch]);\n\n // ── Return ────────────────────────────────────────────────────────────────\n\n return {\n tokens,\n\n isPending: portfolioQuery.isPending,\n isFetching: portfolioQuery.isFetching || pnlQuery.isFetching,\n isError: portfolioQuery.isError,\n isSuccess: portfolioQuery.isSuccess,\n error: portfolioQuery.error,\n\n refetch,\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n useCurveDataQuery,\n useDistributionQuery,\n useOverviewQuery,\n useSpotHoldingsQuery,\n} from \"../../hooks\";\nimport {\n AssetTab,\n CURVE_PERIOD_VALUE,\n CurvePeriod,\n CurveType,\n type PortfolioQuery,\n} from \"../../types\";\n\nexport interface UsePortfolioPageOptions {\n defaultTab?: AssetTab;\n /** Wallet addresses to query. Undefined = no data fetched. */\n walletAddresses?: string[];\n /** Chain identifier (e.g. \"solana\"). */\n chain?: string;\n}\n\nexport function usePortfolioPage(options?: UsePortfolioPageOptions) {\n const { defaultTab = AssetTab.SPOT, walletAddresses, chain } = options ?? {};\n\n // ── Core state ──────────────────────────────────────────────────────\n const [activeTab, setActiveTab] = useState<AssetTab>(defaultTab);\n const [walletId, setWalletId] = useState<string | undefined>(undefined);\n const [viewingAddress, setViewingAddress] = useState<string | undefined>(\n undefined,\n );\n const [curveType, setCurveType] = useState<CurveType>(CurveType.NET_WORTH);\n const [curvePeriod, setCurvePeriod] = useState<CurvePeriod>(\n CurvePeriod.SEVEN_DAY,\n );\n\n const isViewing = viewingAddress !== undefined;\n\n // ── Query params ────────────────────────────────────────────────────\n const portfolioQuery: PortfolioQuery | undefined = useMemo(() => {\n if (viewingAddress) {\n return { walletAddresses: [viewingAddress], chain };\n }\n if (walletAddresses?.length) {\n return { walletAddresses, chain };\n }\n return undefined;\n }, [walletAddresses, viewingAddress, chain]);\n\n // ── Data queries ────────────────────────────────────────────────────\n const overviewQuery = useOverviewQuery(portfolioQuery);\n\n const spotHoldingsQuery = useSpotHoldingsQuery(portfolioQuery);\n\n const curveQuery = useCurveDataQuery({\n period: CURVE_PERIOD_VALUE[curvePeriod],\n ...portfolioQuery,\n });\n\n // Distribution is computed client-side from spot holdings\n const distributionResult = useDistributionQuery(\n spotHoldingsQuery.data?.holdings ?? [],\n );\n\n // Compute per-tab values from available data\n const spotValue = useMemo(() => {\n return (\n spotHoldingsQuery.data?.holdings.reduce((sum, h) => sum + h.value, 0) ?? 0\n );\n }, [spotHoldingsQuery.data]);\n\n // ── Actions ─────────────────────────────────────────────────────────\n const enterViewing = useCallback((address: string) => {\n setViewingAddress(address);\n }, []);\n\n const exitViewing = useCallback(() => {\n setViewingAddress(undefined);\n }, []);\n\n const selectWallet = useCallback((id: string | undefined) => {\n setWalletId(id);\n }, []);\n\n return {\n // State\n activeTab,\n setActiveTab,\n walletId,\n selectWallet,\n viewingAddress,\n isViewing,\n curveType,\n setCurveType,\n curvePeriod,\n setCurvePeriod,\n\n // Query params (for child components to reuse)\n portfolioQuery,\n\n // Data\n overviewQuery,\n curveQuery,\n distributionQuery: distributionResult,\n spotHoldingsQuery,\n\n // Tab values\n spotValue,\n perpsValue: 0,\n predictionValue: 0,\n\n // Actions\n enterViewing,\n exitViewing,\n };\n}\n\nexport type UsePortfolioPageResult = ReturnType<typeof usePortfolioPage>;\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport function PortfolioPageSkeleton() {\n return (\n <div className=\"mx-auto max-w-[1280px] px-6\">\n {/* Asset Tabs Skeleton */}\n <div className=\"flex gap-4 border-b border-[#252530] pb-0 pt-5\">\n <Skeleton className=\"h-9 w-16 rounded-md\" />\n <Skeleton className=\"h-9 w-28 rounded-md\" />\n <Skeleton className=\"h-9 w-32 rounded-md\" />\n </div>\n\n {/* Address Row Skeleton */}\n <div className=\"flex items-center justify-between gap-4 py-4\">\n <div className=\"flex items-center gap-2.5\">\n <Skeleton className=\"h-8 w-48 rounded-lg\" />\n <Skeleton className=\"h-6 w-6 rounded\" />\n <Skeleton className=\"h-5 w-14 rounded-[3px]\" />\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Skeleton className=\"h-[34px] w-[240px] rounded-lg\" />\n <Skeleton className=\"h-[34px] w-12 rounded-[5px]\" />\n </div>\n </div>\n\n {/* Balance Row Skeleton */}\n <div className=\"flex items-center gap-4 pb-4\">\n <div className=\"flex items-baseline gap-3\">\n <Skeleton className=\"h-8 w-48 rounded-md\" />\n <Skeleton className=\"h-6 w-16 rounded\" />\n </div>\n <div className=\"ml-auto flex items-center gap-3\">\n <Skeleton className=\"h-4 w-28 rounded\" />\n <div className=\"h-3.5 w-px bg-[#252530]\" />\n <Skeleton className=\"h-4 w-28 rounded\" />\n <div className=\"h-3.5 w-px bg-[#252530]\" />\n <Skeleton className=\"h-4 w-20 rounded\" />\n </div>\n </div>\n\n {/* Dashboard Grid Skeleton */}\n <div className=\"grid grid-cols-[1fr_340px] gap-3 pb-4\">\n {/* Curve Card */}\n <div className=\"rounded-lg border border-[#252530] bg-[#0F0F16] p-4\">\n <div className=\"flex items-center justify-between pb-4\">\n <Skeleton className=\"h-7 w-40 rounded-[5px]\" />\n <Skeleton className=\"h-6 w-32 rounded\" />\n </div>\n <Skeleton className=\"h-[180px] w-full rounded-md\" />\n <div className=\"mt-2 flex justify-between\">\n {Array.from({ length: 7 }).map((_, i) => (\n <Skeleton key={i} className=\"h-3 w-8 rounded\" />\n ))}\n </div>\n </div>\n {/* Distribution Card */}\n <div className=\"rounded-lg border border-[#252530] bg-[#0F0F16] p-4\">\n <Skeleton className=\"mb-3 h-4 w-24 rounded\" />\n <div className=\"flex items-center justify-center py-4\">\n <Skeleton className=\"h-[140px] w-[140px] rounded-full\" />\n </div>\n <div className=\"space-y-1.5 pt-2\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton key={i} className=\"h-4 w-full rounded\" />\n ))}\n </div>\n </div>\n </div>\n\n {/* Holdings Skeleton */}\n <div className=\"pb-6\">\n <div className=\"flex items-center justify-between pb-3\">\n <Skeleton className=\"h-8 w-40 rounded-[5px]\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-7 w-40 rounded-[5px]\" />\n <Skeleton className=\"h-7 w-24 rounded-[5px]\" />\n </div>\n </div>\n <Skeleton className=\"mb-3 h-5 w-full rounded\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton key={i} className=\"mb-2 h-12 w-full rounded-[5px]\" />\n ))}\n </div>\n </div>\n );\n}\n","import { truncateAddress } from \"../../utils\";\n\nexport interface ViewingBannerUIProps {\n viewingAddress: string;\n onBack: () => void;\n}\n\nexport function ViewingBannerUI({\n viewingAddress,\n onBack,\n}: ViewingBannerUIProps) {\n return (\n <div className=\"flex items-center justify-between border-b border-[rgba(200,255,0,0.12)] bg-[rgba(200,255,0,0.06)] px-6 py-2\">\n <div className=\"flex items-center gap-2\">\n {/* Eye Icon */}\n <div className=\"flex h-[18px] w-[18px] items-center justify-center rounded-full border border-[rgba(200,255,0,0.25)] bg-[rgba(200,255,0,0.07)]\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3C4.36 3 1.26 5.28 0 8.5c1.26 3.22 4.36 5.5 8 5.5s6.74-2.28 8-5.5C14.74 5.28 11.64 3 8 3z\"\n stroke=\"#C8FF00\"\n strokeWidth=\"1.3\"\n fill=\"none\"\n />\n <circle\n cx=\"8\"\n cy=\"8.5\"\n r=\"2.5\"\n stroke=\"#C8FF00\"\n strokeWidth=\"1.3\"\n fill=\"none\"\n />\n </svg>\n </div>\n <span className=\"text-xs font-medium text-[#C8FF00]\">\n Viewing external portfolio\n </span>\n <span className=\"ml-1 font-mono text-[11px] text-[#A0A0B8]\">\n {truncateAddress(viewingAddress)}\n </span>\n </div>\n\n <button\n type=\"button\"\n className=\"flex items-center gap-1.5 rounded-[5px] border border-[#252530] bg-[#1C1C26] px-3 py-1.5 text-[11px] font-medium text-[#A0A0B8] transition-colors hover:border-[#C8FF00] hover:bg-[#C8FF00] hover:text-black\"\n onClick={onBack}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 2L4 8l6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Back to My Portfolio\n </button>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { AssetTab, PortfolioQuery } from \"../../types\";\nimport { AddressRowUI, type WalletOption } from \"./address-row.ui\";\nimport { AssetTabsUI } from \"./asset-tabs.ui\";\nimport { BalanceRowUI } from \"./balance-row.ui\";\nimport { CurveCardUI } from \"./curve-card.ui\";\nimport { DistributionCardUI } from \"./distribution-card.ui\";\nimport {\n usePortfolioPage,\n type UsePortfolioPageOptions,\n} from \"./portfolio-page.script\";\nimport { PortfolioPageSkeleton } from \"./portfolio-page.skeleton\";\nimport { ViewingBannerUI } from \"./viewing-banner.ui\";\n\nexport interface PortfolioPageWidgetProps extends UsePortfolioPageOptions {\n wallets?: WalletOption[];\n onCopyAddress?: (address: string) => void;\n /** Render prop for the Holdings section — receives activeTab + portfolioQuery + isViewing */\n renderHoldings?: (props: {\n activeTab: AssetTab;\n portfolioQuery?: PortfolioQuery;\n isViewing: boolean;\n }) => ReactNode;\n isLoading?: boolean;\n}\n\nexport function PortfolioPageWidget({\n wallets = [],\n onCopyAddress,\n renderHoldings,\n isLoading: externalLoading,\n ...options\n}: PortfolioPageWidgetProps) {\n const state = usePortfolioPage(options);\n\n const {\n activeTab,\n setActiveTab,\n walletId,\n selectWallet,\n viewingAddress,\n isViewing,\n curveType,\n setCurveType,\n curvePeriod,\n setCurvePeriod,\n portfolioQuery,\n overviewQuery,\n curveQuery,\n distributionQuery,\n spotValue,\n perpsValue,\n predictionValue,\n enterViewing,\n exitViewing,\n } = state;\n\n const isPageLoading =\n externalLoading || (overviewQuery.isLoading && !overviewQuery.data);\n\n if (isPageLoading) {\n return <PortfolioPageSkeleton />;\n }\n\n const handleCopyAddress = () => {\n if (isViewing && viewingAddress) {\n onCopyAddress?.(viewingAddress);\n } else {\n const wallet = wallets.find((w) => w.id === walletId);\n if (wallet) onCopyAddress?.(wallet.address);\n }\n };\n\n return (\n <div>\n {/* Viewing Banner */}\n {isViewing && viewingAddress && (\n <ViewingBannerUI viewingAddress={viewingAddress} onBack={exitViewing} />\n )}\n\n <div className=\"mx-auto max-w-[1280px] px-6\">\n {/* 1. Asset Type Tabs */}\n <AssetTabsUI\n activeTab={activeTab}\n onTabChange={setActiveTab}\n spotValue={spotValue}\n perpsValue={perpsValue}\n predictionValue={predictionValue}\n />\n\n {/* 2. Address + Search Row */}\n <AddressRowUI\n walletId={walletId}\n wallets={wallets}\n isViewing={isViewing}\n viewingAddress={viewingAddress}\n onSelectWallet={selectWallet}\n onCopyAddress={handleCopyAddress}\n onSearch={enterViewing}\n />\n\n {/* 3. Balance + uPNL Row */}\n <BalanceRowUI overview={overviewQuery.data} />\n\n {/* 4. Dashboard Grid: Curve + Distribution */}\n <div className=\"grid grid-cols-[1fr_340px] gap-3 pb-4\">\n <CurveCardUI\n curveType={curveType}\n curvePeriod={curvePeriod}\n data={curveQuery.data}\n isLoading={curveQuery.isLoading}\n onTypeChange={setCurveType}\n onPeriodChange={setCurvePeriod}\n />\n <DistributionCardUI data={distributionQuery.data} isLoading={false} />\n </div>\n\n {/* 5. Holdings Section (render prop for Day 3) */}\n {renderHoldings?.({\n activeTab,\n portfolioQuery,\n isViewing,\n })}\n </div>\n </div>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n message: string;\n confirmLabel: string;\n cancelLabel: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n title,\n message,\n confirmLabel,\n cancelLabel,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/60\"\n onClick={onCancel}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onCancel();\n }}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Close dialog\"\n />\n\n {/* Dialog */}\n <div className=\"relative z-10 w-full max-w-sm rounded-xl border border-[#252530] bg-[#12121A] p-6 shadow-2xl\">\n <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>\n <p className=\"mt-2 text-xs leading-relaxed text-[#A0A0B8]\">{message}</p>\n\n <div className=\"mt-5 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n className=\"rounded-lg px-4 py-2 text-xs font-medium text-[#5C5C72] transition-colors hover:bg-[#1C1C26] hover:text-foreground\"\n onClick={onCancel}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n className={cn(\n \"rounded-lg border px-4 py-2 text-xs font-medium transition-colors\",\n \"border-[rgba(255,82,82,0.25)] text-[#FF5252]\",\n \"hover:border-[#FF5252] hover:bg-[rgba(255,82,82,0.1)]\",\n )}\n onClick={onConfirm}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n usePerpsHistoryQuery,\n usePerpsPositionsQuery,\n usePredictionBetsQuery,\n usePredictionSettledQuery,\n useSpotHistoryQuery,\n useSpotHoldingsQuery,\n} from \"../../hooks\";\nimport { AssetTab, type PortfolioQuery, type SpotHolding } from \"../../types\";\n\nexport type SpotSubTab = \"holdings\" | \"history\";\nexport type PerpsSubTab = \"positions\" | \"history\";\nexport type PredictionSubTab = \"active\" | \"settled\";\n\nexport interface UseHoldingsSectionOptions {\n activeTab: AssetTab;\n portfolioQuery?: PortfolioQuery;\n isViewing: boolean;\n}\n\nexport function useHoldingsSection({\n activeTab,\n portfolioQuery,\n isViewing,\n}: UseHoldingsSectionOptions) {\n // ── Sub-tab states ──────────────────────────────────────────────────\n const [spotSubTab, setSpotSubTab] = useState<SpotSubTab>(\"holdings\");\n const [perpsSubTab, setPerpsSubTab] = useState<PerpsSubTab>(\"positions\");\n const [predictionSubTab, setPredictionSubTab] =\n useState<PredictionSubTab>(\"active\");\n\n // ── Search states ───────────────────────────────────────────────────\n const [spotSearch, setSpotSearch] = useState(\"\");\n const [perpsSearch, setPerpsSearch] = useState(\"\");\n const [predictionSearch, setPredictionSearch] = useState(\"\");\n\n // ── Spot-specific states ────────────────────────────────────────────\n const [hideSmall, setHideSmall] = useState(false);\n const [groupCollapsed, setGroupCollapsed] = useState(false);\n\n const toggleGroupCollapsed = useCallback(() => {\n setGroupCollapsed((v) => !v);\n }, []);\n\n // ── Data queries (only fetch for active tab) ────────────────────────\n const spotHoldingsQuery = useSpotHoldingsQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.SPOT,\n });\n\n const spotHistoryQuery = useSpotHistoryQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.SPOT && spotSubTab === \"history\",\n });\n\n const perpsPositionsQuery = usePerpsPositionsQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.PERPS,\n });\n\n const perpsHistoryQuery = usePerpsHistoryQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.PERPS && perpsSubTab === \"history\",\n });\n\n const predictionBetsQuery = usePredictionBetsQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.PREDICTION,\n });\n\n const predictionSettledQuery = usePredictionSettledQuery(portfolioQuery, {\n enabled:\n activeTab === AssetTab.PREDICTION && predictionSubTab === \"settled\",\n });\n\n // ── Filtered Spot holdings ──────────────────────────────────────────\n const filteredSpotHoldings = useMemo(() => {\n const holdings = spotHoldingsQuery.data?.holdings ?? [];\n return holdings.filter((h: SpotHolding) => {\n if (hideSmall && h.value < 1 && !h.verified) return false;\n if (spotSearch) {\n const q = spotSearch.toLowerCase();\n return (\n h.name.toLowerCase().includes(q) || h.symbol.toLowerCase().includes(q)\n );\n }\n return true;\n });\n }, [spotHoldingsQuery.data?.holdings, hideSmall, spotSearch]);\n\n // ── Filtered Perps positions ────────────────────────────────────────\n const filteredPerpsPositions = useMemo(() => {\n const positions = perpsPositionsQuery.data?.positions ?? [];\n if (!perpsSearch) return positions;\n const q = perpsSearch.toLowerCase();\n return positions.filter((p) => p.pair.toLowerCase().includes(q));\n }, [perpsPositionsQuery.data?.positions, perpsSearch]);\n\n // ── Filtered Prediction bets ────────────────────────────────────────\n const filteredPredictionBets = useMemo(() => {\n const bets = predictionBetsQuery.data?.bets ?? [];\n if (!predictionSearch) return bets;\n const q = predictionSearch.toLowerCase();\n return bets.filter((b) => b.market.toLowerCase().includes(q));\n }, [predictionBetsQuery.data?.bets, predictionSearch]);\n\n return {\n // Sub-tabs\n spotSubTab,\n setSpotSubTab,\n perpsSubTab,\n setPerpsSubTab,\n predictionSubTab,\n setPredictionSubTab,\n\n // Search\n spotSearch,\n setSpotSearch,\n perpsSearch,\n setPerpsSearch,\n predictionSearch,\n setPredictionSearch,\n\n // Spot-specific\n hideSmall,\n setHideSmall,\n groupCollapsed,\n toggleGroupCollapsed,\n\n // Queries\n spotHoldingsQuery,\n spotHistoryQuery,\n perpsPositionsQuery,\n perpsHistoryQuery,\n predictionBetsQuery,\n predictionSettledQuery,\n\n // Filtered data\n filteredSpotHoldings,\n filteredPerpsPositions,\n filteredPredictionBets,\n\n // Pass-through\n isViewing,\n };\n}\n\nexport type UseHoldingsSectionResult = ReturnType<typeof useHoldingsSection>;\n","import { cn } from \"@liberfi.io/ui\";\n\nexport interface HoldingsSubTabsProps {\n tabs: { key: string; label: string }[];\n activeKey: string;\n onTabChange: (key: string) => void;\n}\n\nexport function HoldingsSubTabs({\n tabs,\n activeKey,\n onTabChange,\n}: HoldingsSubTabsProps) {\n return (\n <div className=\"flex gap-0.5\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n className={cn(\n \"rounded-[5px] px-3 py-1.5 text-xs font-medium transition-colors\",\n activeKey === tab.key\n ? \"bg-[#1C1C26] text-foreground\"\n : \"text-[#5C5C72] hover:bg-[#16161E] hover:text-[#A0A0B8]\",\n )}\n onClick={() => onTabChange(tab.key)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport interface HoldingsSearchProps {\n value: string;\n onChange: (value: string) => void;\n placeholder: string;\n}\n\nexport function HoldingsSearch({\n value,\n onChange,\n placeholder,\n}: HoldingsSearchProps) {\n return (\n <div className=\"flex h-7 w-40 items-center gap-1 rounded-[5px] border border-[#252530] bg-[#16161E] px-2 transition-all focus-within:w-[200px] focus-within:border-[#C8FF00]\">\n <svg\n width=\"11\"\n height=\"11\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className=\"flex-shrink-0 text-[#5C5C72]\"\n >\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M11 11L14.5 14.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n <input\n type=\"text\"\n className=\"flex-1 border-none bg-transparent font-mono text-[11px] text-foreground caret-[#C8FF00] outline-none placeholder:font-sans placeholder:text-[10px] placeholder:text-[#5C5C72]\"\n placeholder={placeholder}\n spellCheck={false}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n );\n}\n\nexport interface HoldingsEmptyProps {\n title: string;\n hint?: string;\n}\n\nexport function HoldingsEmpty({ title, hint }: HoldingsEmptyProps) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <span className=\"text-sm text-[#5C5C72]\">{title}</span>\n {hint && <span className=\"mt-1 text-xs text-[#3A3A4E]\">{hint}</span>}\n </div>\n );\n}\n\nexport interface BatchActionButtonProps {\n label: string;\n disabled?: boolean;\n onClick: () => void;\n}\n\nexport function BatchActionButton({\n label,\n disabled,\n onClick,\n}: BatchActionButtonProps) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex items-center gap-1 whitespace-nowrap rounded-[5px] border px-3 py-1.5 text-[11px] font-medium transition-colors\",\n disabled\n ? \"pointer-events-none border-[#252530] text-[#3A3A4E]\"\n : \"border-[rgba(255,82,82,0.25)] text-[#FF5252] hover:border-[#FF5252] hover:bg-[rgba(255,82,82,0.1)]\",\n )}\n onClick={onClick}\n disabled={disabled}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n {label}\n </button>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { PerpsPosition, PerpsTradeRecord } from \"../../types\";\nimport { PerpsPositionSide } from \"../../types\";\nimport { formatSignedUsd, formatUsd } from \"../../utils\";\nimport type { UseHoldingsSectionResult } from \"./holdings-section.script\";\nimport {\n BatchActionButton,\n HoldingsEmpty,\n HoldingsSearch,\n HoldingsSubTabs,\n} from \"./shared.ui\";\n\n// ── Perps Panel ─────────────────────────────────────────────────────────────\n\nexport interface PerpsPanelUIProps {\n state: UseHoldingsSectionResult;\n onClosePosition?: (position: PerpsPosition) => void;\n onCloseAll?: () => void;\n}\n\nexport function PerpsPanelUI({\n state,\n onClosePosition,\n onCloseAll,\n}: PerpsPanelUIProps) {\n const {\n perpsSubTab,\n setPerpsSubTab,\n perpsSearch,\n setPerpsSearch,\n filteredPerpsPositions,\n perpsHistoryQuery,\n isViewing,\n } = state;\n\n const hasPositions = filteredPerpsPositions.length > 0;\n\n return (\n <div>\n {/* Header bar */}\n <div className=\"flex items-center justify-between pb-3\">\n <div className=\"flex items-center gap-3\">\n <HoldingsSubTabs\n tabs={[\n { key: \"positions\", label: \"Open Positions\" },\n { key: \"history\", label: \"Trade History\" },\n ]}\n activeKey={perpsSubTab}\n onTabChange={(k) => setPerpsSubTab(k as \"positions\" | \"history\")}\n />\n {perpsSubTab === \"positions\" && !isViewing && (\n <BatchActionButton\n label=\"Close All\"\n disabled={!hasPositions}\n onClick={() => onCloseAll?.()}\n />\n )}\n </div>\n <HoldingsSearch\n value={perpsSearch}\n onChange={setPerpsSearch}\n placeholder=\"Search pair…\"\n />\n </div>\n\n {/* Content */}\n {perpsSubTab === \"positions\" ? (\n <PerpsPositionsTable\n positions={filteredPerpsPositions}\n isViewing={isViewing}\n onClose={onClosePosition}\n />\n ) : (\n <PerpsHistoryTable\n records={perpsHistoryQuery.data?.records ?? []}\n isLoading={perpsHistoryQuery.isLoading}\n />\n )}\n </div>\n );\n}\n\n// ── Perps Positions Table ───────────────────────────────────────────────────\n\ninterface PerpsPositionsTableProps {\n positions: PerpsPosition[];\n isViewing: boolean;\n onClose?: (position: PerpsPosition) => void;\n}\n\nfunction PerpsPositionsTable({\n positions,\n isViewing,\n onClose,\n}: PerpsPositionsTableProps) {\n if (positions.length === 0) {\n return <HoldingsEmpty title=\"No open positions\" hint=\"Start trading →\" />;\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{\n gridTemplateColumns: isViewing\n ? \"2fr 1fr .8fr .8fr 1fr\"\n : \"2fr 1fr .8fr .8fr 1fr 80px\",\n }}\n >\n <span>Pair / Side</span>\n <span className=\"text-right\">Size</span>\n <span className=\"text-right\">Entry</span>\n <span className=\"text-right\">Mark</span>\n <span className=\"text-right\">uPNL</span>\n {!isViewing && <span className=\"text-right\" />}\n </div>\n\n {/* Position rows */}\n <div className=\"flex flex-col\">\n {positions.map((p) => (\n <PerpsPositionRow\n key={p.id}\n position={p}\n isViewing={isViewing}\n onClose={onClose}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ── Position Row ────────────────────────────────────────────────────────────\n\nfunction PerpsPositionRow({\n position,\n isViewing,\n onClose,\n}: {\n position: PerpsPosition;\n isViewing: boolean;\n onClose?: (position: PerpsPosition) => void;\n}) {\n const isLong = position.side === PerpsPositionSide.LONG;\n const isPnlPositive = position.uPnl >= 0;\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{\n gridTemplateColumns: isViewing\n ? \"2fr 1fr .8fr .8fr 1fr\"\n : \"2fr 1fr .8fr .8fr 1fr 80px\",\n }}\n >\n {/* Pair / Side */}\n <div className=\"flex items-center gap-2\">\n {position.icon ? (\n <img\n src={position.icon}\n alt={position.pair}\n className=\"h-6 w-6 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[9px] font-bold text-[#5C5C72]\">\n {position.pair.slice(0, 2)}\n </div>\n )}\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-foreground\">\n {position.pair}\n </span>\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isLong\n ? \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\"\n : \"bg-[rgba(255,82,82,0.12)] text-[#FF5252]\",\n )}\n >\n {isLong ? \"Long\" : \"Short\"}\n </span>\n <span className=\"rounded bg-[rgba(200,255,0,0.1)] px-1.5 py-0.5 text-[10px] font-medium text-[#C8FF00]\">\n {position.leverage}×\n </span>\n </div>\n </div>\n\n {/* Size */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(position.size)}\n </span>\n\n {/* Entry */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(position.entryPrice)}\n </span>\n\n {/* Mark */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(position.markPrice)}\n </span>\n\n {/* uPNL */}\n <span\n className={cn(\n \"text-right font-mono text-xs\",\n isPnlPositive ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {formatSignedUsd(position.uPnl)}\n </span>\n\n {/* Close action */}\n {!isViewing && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n className=\"rounded-[5px] border border-[#252530] px-2.5 py-1 text-[10px] font-medium text-[#5C5C72] transition-colors hover:border-[#FF5252] hover:text-[#FF5252]\"\n onClick={() => onClose?.(position)}\n >\n Close\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Perps Trade History Table ───────────────────────────────────────────────\n\ninterface PerpsHistoryTableProps {\n records: PerpsTradeRecord[];\n isLoading: boolean;\n}\n\nfunction PerpsHistoryTable({ records, isLoading }: PerpsHistoryTableProps) {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-[#C8FF00] border-t-transparent\" />\n </div>\n );\n }\n\n if (records.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No trade history\"\n hint=\"Closed positions will appear here\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{ gridTemplateColumns: \"1.5fr 80px 1fr 1fr 1fr 100px\" }}\n >\n <span>Pair</span>\n <span>Side</span>\n <span className=\"text-right\">Size</span>\n <span className=\"text-right\">PNL</span>\n <span className=\"text-right\">Close Price</span>\n <span className=\"text-right\">Time</span>\n </div>\n\n {/* Records */}\n <div className=\"flex flex-col\">\n {records.map((r) => (\n <PerpsTradeRow key={r.id} record={r} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction PerpsTradeRow({ record }: { record: PerpsTradeRecord }) {\n const isLong = record.side === PerpsPositionSide.LONG;\n const isPnlPositive = record.pnl >= 0;\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{ gridTemplateColumns: \"1.5fr 80px 1fr 1fr 1fr 100px\" }}\n >\n {/* Pair */}\n <div className=\"flex items-center gap-2\">\n {record.icon ? (\n <img\n src={record.icon}\n alt={record.pair}\n className=\"h-5 w-5 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[8px] font-bold text-[#5C5C72]\">\n {record.pair.slice(0, 2)}\n </div>\n )}\n <span className=\"text-xs font-medium text-foreground\">\n {record.pair}\n </span>\n </div>\n\n {/* Side */}\n <span>\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isLong\n ? \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\"\n : \"bg-[rgba(255,82,82,0.12)] text-[#FF5252]\",\n )}\n >\n {isLong ? \"Long\" : \"Short\"}\n </span>\n </span>\n\n {/* Size */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(record.size)}\n </span>\n\n {/* PNL */}\n <span\n className={cn(\n \"text-right font-mono text-xs\",\n isPnlPositive ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {formatSignedUsd(record.pnl)}\n </span>\n\n {/* Close Price */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(record.closePrice)}\n </span>\n\n {/* Time */}\n <span className=\"text-right text-[11px] text-[#5C5C72]\">\n {record.time}\n </span>\n </div>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { PredictionBet, PredictionSettledRecord } from \"../../types\";\nimport {\n PredictionBetStatus,\n PredictionResult,\n PredictionSource,\n} from \"../../types\";\nimport { formatUsd } from \"../../utils\";\nimport type { UseHoldingsSectionResult } from \"./holdings-section.script\";\nimport {\n BatchActionButton,\n HoldingsEmpty,\n HoldingsSearch,\n HoldingsSubTabs,\n} from \"./shared.ui\";\n\n// ── Prediction Panel ────────────────────────────────────────────────────────\n\nexport interface PredictionPanelUIProps {\n state: UseHoldingsSectionResult;\n onSellBet?: (bet: PredictionBet) => void;\n onSellAll?: () => void;\n}\n\nexport function PredictionPanelUI({\n state,\n onSellBet,\n onSellAll,\n}: PredictionPanelUIProps) {\n const {\n predictionSubTab,\n setPredictionSubTab,\n predictionSearch,\n setPredictionSearch,\n filteredPredictionBets,\n predictionSettledQuery,\n isViewing,\n } = state;\n\n const hasBets = filteredPredictionBets.length > 0;\n\n return (\n <div>\n {/* Header bar */}\n <div className=\"flex items-center justify-between pb-3\">\n <div className=\"flex items-center gap-3\">\n <HoldingsSubTabs\n tabs={[\n { key: \"active\", label: \"Active Bets\" },\n { key: \"settled\", label: \"Settled\" },\n ]}\n activeKey={predictionSubTab}\n onTabChange={(k) => setPredictionSubTab(k as \"active\" | \"settled\")}\n />\n {predictionSubTab === \"active\" && !isViewing && (\n <BatchActionButton\n label=\"Sell All\"\n disabled={!hasBets}\n onClick={() => onSellAll?.()}\n />\n )}\n </div>\n <HoldingsSearch\n value={predictionSearch}\n onChange={setPredictionSearch}\n placeholder=\"Search market…\"\n />\n </div>\n\n {/* Content */}\n {predictionSubTab === \"active\" ? (\n <PredictionBetsTable\n bets={filteredPredictionBets}\n isViewing={isViewing}\n onSell={onSellBet}\n />\n ) : (\n <PredictionSettledTable\n records={predictionSettledQuery.data?.records ?? []}\n isLoading={predictionSettledQuery.isLoading}\n />\n )}\n </div>\n );\n}\n\n// ── Source Tag ───────────────────────────────────────────────────────────────\n\nconst SOURCE_STYLES: Record<PredictionSource, string> = {\n [PredictionSource.POLYMARKET]: \"bg-[rgba(0,102,255,0.12)] text-[#0066FF]\",\n [PredictionSource.DRIFT]: \"bg-[rgba(200,255,0,0.1)] text-[#C8FF00]\",\n [PredictionSource.METADAO]: \"bg-[rgba(255,107,157,0.1)] text-[#FF6B9D]\",\n};\n\nconst SOURCE_LABELS: Record<PredictionSource, string> = {\n [PredictionSource.POLYMARKET]: \"Polymarket\",\n [PredictionSource.DRIFT]: \"Drift\",\n [PredictionSource.METADAO]: \"MetaDAO\",\n};\n\nfunction SourceTag({ source }: { source: PredictionSource }) {\n return (\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n SOURCE_STYLES[source],\n )}\n >\n {SOURCE_LABELS[source]}\n </span>\n );\n}\n\n// ── Active Bets Table ───────────────────────────────────────────────────────\n\ninterface PredictionBetsTableProps {\n bets: PredictionBet[];\n isViewing: boolean;\n onSell?: (bet: PredictionBet) => void;\n}\n\nfunction PredictionBetsTable({\n bets,\n isViewing,\n onSell,\n}: PredictionBetsTableProps) {\n if (bets.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No active bets\"\n hint=\"Explore prediction markets →\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{\n gridTemplateColumns: isViewing\n ? \"2.2fr .6fr .7fr .7fr .7fr\"\n : \"2.2fr .6fr .7fr .7fr .7fr 80px\",\n }}\n >\n <span>Market / Source</span>\n <span className=\"text-right\">Position</span>\n <span className=\"text-right\">Stake</span>\n <span className=\"text-right\">Potential</span>\n <span className=\"text-right\">Status</span>\n {!isViewing && <span className=\"text-right\" />}\n </div>\n\n {/* Bet rows */}\n <div className=\"flex flex-col\">\n {bets.map((b) => (\n <PredictionBetRow\n key={b.id}\n bet={b}\n isViewing={isViewing}\n onSell={onSell}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ── Bet Row ─────────────────────────────────────────────────────────────────\n\nfunction PredictionBetRow({\n bet,\n isViewing,\n onSell,\n}: {\n bet: PredictionBet;\n isViewing: boolean;\n onSell?: (bet: PredictionBet) => void;\n}) {\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{\n gridTemplateColumns: isViewing\n ? \"2.2fr .6fr .7fr .7fr .7fr\"\n : \"2.2fr .6fr .7fr .7fr .7fr 80px\",\n }}\n >\n {/* Market / Source */}\n <div className=\"flex items-center gap-2 overflow-hidden\">\n {bet.icon ? (\n <img\n src={bet.icon}\n alt={bet.market}\n className=\"h-6 w-6 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[9px] font-bold text-[#5C5C72]\">\n ?\n </div>\n )}\n <div className=\"flex flex-col overflow-hidden\">\n <span className=\"truncate text-xs font-medium text-foreground\">\n {bet.market}\n </span>\n <SourceTag source={bet.source} />\n </div>\n </div>\n\n {/* Position */}\n <span\n className={cn(\n \"text-right text-xs font-medium\",\n bet.position === \"Yes\" ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {bet.position}\n </span>\n\n {/* Stake */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(bet.stake)}\n </span>\n\n {/* Potential */}\n <span className=\"text-right font-mono text-xs text-[#00E676]\">\n {formatUsd(bet.potential)}\n </span>\n\n {/* Status */}\n <span className=\"text-right\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n bet.status === PredictionBetStatus.ACTIVE\n ? \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\"\n : \"bg-[rgba(200,255,0,0.1)] text-[#C8FF00]\",\n )}\n >\n {bet.status === PredictionBetStatus.ACTIVE ? \"Active\" : \"Pending\"}\n </span>\n </span>\n\n {/* Sell action */}\n {!isViewing && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n className=\"rounded-[5px] border border-[#252530] px-2.5 py-1 text-[10px] font-medium text-[#5C5C72] transition-colors hover:border-[#FF5252] hover:text-[#FF5252]\"\n onClick={() => onSell?.(bet)}\n >\n Sell\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Settled Table ───────────────────────────────────────────────────────────\n\ninterface PredictionSettledTableProps {\n records: PredictionSettledRecord[];\n isLoading: boolean;\n}\n\nfunction PredictionSettledTable({\n records,\n isLoading,\n}: PredictionSettledTableProps) {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-[#C8FF00] border-t-transparent\" />\n </div>\n );\n }\n\n if (records.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No settled bets\"\n hint=\"Settled predictions will appear here\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{ gridTemplateColumns: \"1.5fr .8fr .6fr .7fr .6fr .7fr\" }}\n >\n <span>Market</span>\n <span>Source</span>\n <span className=\"text-right\">Position</span>\n <span className=\"text-right\">Stake</span>\n <span className=\"text-right\">Result</span>\n <span className=\"text-right\">Payout</span>\n </div>\n\n {/* Records */}\n <div className=\"flex flex-col\">\n {records.map((r) => (\n <PredictionSettledRow key={r.id} record={r} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction PredictionSettledRow({ record }: { record: PredictionSettledRecord }) {\n const isWon = record.result === PredictionResult.WON;\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{ gridTemplateColumns: \"1.5fr .8fr .6fr .7fr .6fr .7fr\" }}\n >\n {/* Market */}\n <div className=\"flex items-center gap-2 overflow-hidden\">\n {record.icon ? (\n <img\n src={record.icon}\n alt={record.market}\n className=\"h-5 w-5 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[8px] font-bold text-[#5C5C72]\">\n ?\n </div>\n )}\n <span className=\"truncate text-xs font-medium text-foreground\">\n {record.market}\n </span>\n </div>\n\n {/* Source */}\n <SourceTag source={record.source} />\n\n {/* Position */}\n <span\n className={cn(\n \"text-right text-xs font-medium\",\n record.position === \"Yes\" ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {record.position}\n </span>\n\n {/* Stake */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(record.stake)}\n </span>\n\n {/* Result */}\n <span className=\"text-right\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isWon\n ? \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\"\n : \"bg-[rgba(255,82,82,0.12)] text-[#FF5252]\",\n )}\n >\n {isWon ? \"Won\" : \"Lost\"}\n </span>\n </span>\n\n {/* Payout */}\n <span\n className={cn(\n \"text-right font-mono text-xs\",\n isWon ? \"text-[#00E676]\" : \"text-[#5C5C72]\",\n )}\n >\n {isWon ? `+${formatUsd(record.payout)}` : formatUsd(record.payout)}\n </span>\n </div>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { SpotHolding, SpotHistoryRecord } from \"../../types\";\nimport { SpotHistoryType } from \"../../types\";\nimport {\n formatPercent,\n formatTime,\n formatTokenBalance,\n formatUsd,\n getExplorerUrl,\n} from \"../../utils\";\nimport type { UseHoldingsSectionResult } from \"./holdings-section.script\";\nimport { HoldingsEmpty, HoldingsSearch, HoldingsSubTabs } from \"./shared.ui\";\n\n// ── Spot Panel ──────────────────────────────────────────────────────────────\n\nexport interface SpotPanelUIProps {\n state: UseHoldingsSectionResult;\n}\n\nexport function SpotPanelUI({ state }: SpotPanelUIProps) {\n const {\n spotSubTab,\n setSpotSubTab,\n spotSearch,\n setSpotSearch,\n hideSmall,\n setHideSmall,\n groupCollapsed,\n toggleGroupCollapsed,\n filteredSpotHoldings,\n spotHistoryQuery,\n } = state;\n\n return (\n <div>\n {/* Header bar */}\n <div className=\"flex items-center justify-between pb-3\">\n <HoldingsSubTabs\n tabs={[\n { key: \"holdings\", label: \"Holdings\" },\n { key: \"history\", label: \"History\" },\n ]}\n activeKey={spotSubTab}\n onTabChange={(k) => setSpotSubTab(k as \"holdings\" | \"history\")}\n />\n <div className=\"flex items-center gap-2\">\n <HoldingsSearch\n value={spotSearch}\n onChange={setSpotSearch}\n placeholder=\"Search token…\"\n />\n {spotSubTab === \"holdings\" && (\n <label className=\"flex cursor-pointer items-center gap-1.5 text-[11px] text-[#5C5C72] select-none\">\n <input\n type=\"checkbox\"\n className=\"accent-[#C8FF00]\"\n checked={hideSmall}\n onChange={(e) => setHideSmall(e.target.checked)}\n />\n Hide small\n </label>\n )}\n </div>\n </div>\n\n {/* Content */}\n {spotSubTab === \"holdings\" ? (\n <SpotHoldingsTable\n holdings={filteredSpotHoldings}\n groupCollapsed={groupCollapsed}\n onToggleGroup={toggleGroupCollapsed}\n />\n ) : (\n <SpotHistoryTable\n records={spotHistoryQuery.data?.trades ?? []}\n isLoading={spotHistoryQuery.isLoading}\n />\n )}\n </div>\n );\n}\n\n// ── Spot Holdings Table ─────────────────────────────────────────────────────\n\ninterface SpotHoldingsTableProps {\n holdings: SpotHolding[];\n groupCollapsed: boolean;\n onToggleGroup: () => void;\n}\n\nfunction SpotHoldingsTable({\n holdings,\n groupCollapsed,\n onToggleGroup,\n}: SpotHoldingsTableProps) {\n if (holdings.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No tokens found\"\n hint=\"Your spot tokens will appear here\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{ gridTemplateColumns: \"2fr 1fr 1fr 1fr 1fr\" }}\n >\n <span>Asset</span>\n <span className=\"text-right\">Balance</span>\n <span className=\"text-right\">Price</span>\n <span className=\"text-right\">Value</span>\n <span className=\"text-right\">24h</span>\n </div>\n\n {/* Group header */}\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72] transition-colors hover:text-[#A0A0B8]\"\n onClick={onToggleGroup}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={cn(\"transition-transform\", groupCollapsed && \"-rotate-90\")}\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span>Tokens</span>\n <span className=\"text-[#3A3A4E]\">{holdings.length}</span>\n </button>\n\n {/* Token rows */}\n {!groupCollapsed && (\n <div className=\"flex flex-col\">\n {holdings.map((h) => (\n <SpotHoldingRow key={h.tokenAddress} holding={h} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ── Spot Holding Row ────────────────────────────────────────────────────────\n\nfunction SpotHoldingRow({ holding }: { holding: SpotHolding }) {\n const isPositive = holding.change24h >= 0;\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{ gridTemplateColumns: \"2fr 1fr 1fr 1fr 1fr\" }}\n >\n {/* Asset */}\n <div className=\"flex items-center gap-2.5 overflow-hidden\">\n {holding.image ? (\n <img\n src={holding.image}\n alt={holding.symbol}\n className=\"h-7 w-7 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[10px] font-bold text-[#5C5C72]\">\n {holding.symbol.slice(0, 2)}\n </div>\n )}\n <div className=\"flex flex-col overflow-hidden\">\n <span className=\"truncate text-xs font-medium text-foreground\">\n {holding.name}\n </span>\n <span className=\"text-[10px] text-[#5C5C72]\">{holding.symbol}</span>\n </div>\n </div>\n\n {/* Balance */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatTokenBalance(holding.balance)}\n </span>\n\n {/* Price */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(holding.price)}\n </span>\n\n {/* Value */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(holding.value)}\n </span>\n\n {/* 24h Change */}\n <span\n className={cn(\n \"text-right font-mono text-xs\",\n isPositive ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {formatPercent(holding.change24h)}\n </span>\n </div>\n );\n}\n\n// ── Spot History Table ──────────────────────────────────────────────────────\n\ninterface SpotHistoryTableProps {\n records: SpotHistoryRecord[];\n isLoading: boolean;\n}\n\nfunction SpotHistoryTable({ records, isLoading }: SpotHistoryTableProps) {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-[#C8FF00] border-t-transparent\" />\n </div>\n );\n }\n\n if (records.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No history found\"\n hint=\"Transaction history will appear here\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{ gridTemplateColumns: \"80px 1.5fr 1fr 1fr 100px 80px\" }}\n >\n <span>Type</span>\n <span>Detail</span>\n <span className=\"text-right\">Amount</span>\n <span className=\"text-right\">Value</span>\n <span className=\"text-right\">Time</span>\n <span className=\"text-right\">TxHash</span>\n </div>\n\n {/* Records */}\n <div className=\"flex flex-col\">\n {records.map((r) => (\n <SpotHistoryRow key={`${r.txHash}-${r.tokenAddress}`} record={r} />\n ))}\n </div>\n </div>\n );\n}\n\n// ── History Type Badge ──────────────────────────────────────────────────────\n\nconst TYPE_STYLES: Record<SpotHistoryType, string> = {\n [SpotHistoryType.SWAP]: \"bg-[rgba(139,123,255,0.12)] text-[#8B7BFF]\",\n [SpotHistoryType.SEND]: \"bg-[rgba(255,82,82,0.12)] text-[#FF5252]\",\n [SpotHistoryType.RECEIVE]: \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\",\n};\n\nconst TYPE_LABELS: Record<SpotHistoryType, string> = {\n [SpotHistoryType.SWAP]: \"Swap\",\n [SpotHistoryType.SEND]: \"Send\",\n [SpotHistoryType.RECEIVE]: \"Receive\",\n};\n\n/** Derive a human-readable detail from the trade record. */\nfunction getTradeDetail(record: SpotHistoryRecord): string {\n if (record.type === SpotHistoryType.SWAP && record.sideTokenSymbol) {\n return `${record.tokenSymbol} → ${record.sideTokenSymbol}`;\n }\n return record.tokenName || record.tokenSymbol;\n}\n\nfunction SpotHistoryRow({ record }: { record: SpotHistoryRecord }) {\n const explorerUrl = getExplorerUrl(record.txHash, record.chain);\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{ gridTemplateColumns: \"80px 1.5fr 1fr 1fr 100px 80px\" }}\n >\n {/* Type */}\n <span>\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n TYPE_STYLES[record.type],\n )}\n >\n {TYPE_LABELS[record.type]}\n </span>\n </span>\n\n {/* Detail */}\n <span className=\"truncate text-xs text-foreground\">\n {getTradeDetail(record)}\n </span>\n\n {/* Amount */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatTokenBalance(record.tokenAmount)} {record.tokenSymbol}\n </span>\n\n {/* Value */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(record.valueUsd)}\n </span>\n\n {/* Time */}\n <span className=\"text-right text-[11px] text-[#5C5C72]\">\n {record.timestamp ? formatTime(record.timestamp) : \"—\"}\n </span>\n\n {/* TxHash */}\n <span className=\"text-right\">\n {record.txHash ? (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"font-mono text-[11px] text-[#5C5C72] transition-colors hover:text-[#C8FF00]\"\n >\n {record.txHash.slice(0, 4)}…{record.txHash.slice(-3)}\n </a>\n ) : (\n <span className=\"font-mono text-[11px] text-[#3A3A4E]\">—</span>\n )}\n </span>\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { AssetTab } from \"../../types\";\nimport type { PerpsPosition, PredictionBet, PortfolioQuery } from \"../../types\";\nimport { ConfirmDialog } from \"./confirm-dialog.ui\";\nimport {\n useHoldingsSection,\n type UseHoldingsSectionOptions,\n} from \"./holdings-section.script\";\nimport { PerpsPanelUI } from \"./perps-panel.ui\";\nimport { PredictionPanelUI } from \"./prediction-panel.ui\";\nimport { SpotPanelUI } from \"./spot-panel.ui\";\n\n// ── Props ───────────────────────────────────────────────────────────────────\n\nexport interface HoldingsSectionWidgetProps extends UseHoldingsSectionOptions {\n /** Called when user clicks Close on a single perps position */\n onClosePosition?: (position: PerpsPosition) => void;\n /** Called after user confirms Close All positions */\n onCloseAllPositions?: () => void;\n /** Called when user clicks Sell on a single prediction bet */\n onSellBet?: (bet: PredictionBet) => void;\n /** Called after user confirms Sell All bets */\n onSellAllBets?: () => void;\n}\n\n// ── Widget ──────────────────────────────────────────────────────────────────\n\nexport function HoldingsSectionWidget({\n onClosePosition,\n onCloseAllPositions,\n onSellBet,\n onSellAllBets,\n ...options\n}: HoldingsSectionWidgetProps) {\n const state = useHoldingsSection(options);\n\n // ── Confirm dialog state ────────────────────────────────────────────────\n const [confirmAction, setConfirmAction] = useState<\n \"closeAll\" | \"sellAll\" | null\n >(null);\n\n const handleCloseAll = useCallback(() => {\n setConfirmAction(\"closeAll\");\n }, []);\n\n const handleSellAll = useCallback(() => {\n setConfirmAction(\"sellAll\");\n }, []);\n\n const handleConfirm = useCallback(() => {\n if (confirmAction === \"closeAll\") {\n onCloseAllPositions?.();\n } else if (confirmAction === \"sellAll\") {\n onSellAllBets?.();\n }\n setConfirmAction(null);\n }, [confirmAction, onCloseAllPositions, onSellAllBets]);\n\n const handleCancel = useCallback(() => {\n setConfirmAction(null);\n }, []);\n\n // ── Render panel based on active tab ────────────────────────────────────\n const renderPanel = () => {\n switch (options.activeTab) {\n case AssetTab.SPOT:\n return <SpotPanelUI state={state} />;\n case AssetTab.PERPS:\n return (\n <PerpsPanelUI\n state={state}\n onClosePosition={onClosePosition}\n onCloseAll={handleCloseAll}\n />\n );\n case AssetTab.PREDICTION:\n return (\n <PredictionPanelUI\n state={state}\n onSellBet={onSellBet}\n onSellAll={handleSellAll}\n />\n );\n default:\n return null;\n }\n };\n\n return (\n <div className=\"rounded-xl border border-[#1C1C26] bg-[#0E0E16] p-4\">\n {renderPanel()}\n\n {/* Close All Confirm */}\n <ConfirmDialog\n open={confirmAction === \"closeAll\"}\n title=\"Close All Positions\"\n message=\"Close all positions? This will route to each protocol to execute.\"\n confirmLabel=\"Confirm Close All\"\n cancelLabel=\"Cancel\"\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n\n {/* Sell All Confirm */}\n <ConfirmDialog\n open={confirmAction === \"sellAll\"}\n title=\"Sell All Positions\"\n message=\"Sell all positions? This will route to each platform to execute.\"\n confirmLabel=\"Confirm Sell All\"\n cancelLabel=\"Cancel\"\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n </div>\n );\n}\n\n// ── Convenience: standalone render-prop adapter ─────────────────────────────\n\n/**\n * Use this as the `renderHoldings` callback for PortfolioPageWidget.\n *\n * ```tsx\n * <PortfolioPageWidget\n * renderHoldings={(props) => <HoldingsSectionWidget {...props} />}\n * />\n * ```\n */\nexport type HoldingsRenderProps = {\n activeTab: AssetTab;\n portfolioQuery?: PortfolioQuery;\n isViewing: boolean;\n};\n","/**\n * Format the elapsed time between `from` and `now` as a short age string\n * (e.g. \"5m\", \"2h\", \"3d\"). Returns \"--\" if `from` is unavailable.\n */\nexport function formatAgeShort(\n from: Date | string | number | undefined,\n now: Date | number = Date.now(),\n): string {\n if (from == null) return \"--\";\n const start =\n typeof from === \"string\" || typeof from === \"number\"\n ? new Date(from)\n : from;\n const end = typeof now === \"number\" ? new Date(now) : now;\n const diffSec = Math.max(\n 0,\n Math.floor((end.getTime() - start.getTime()) / 1000),\n );\n if (diffSec < 60) return `${diffSec}s`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m`;\n const diffHour = Math.floor(diffMin / 60);\n if (diffHour < 24) return `${diffHour}h`;\n const diffDay = Math.floor(diffHour / 24);\n if (diffDay < 30) return `${diffDay}d`;\n const diffMon = Math.floor(diffDay / 30);\n if (diffMon < 12) return `${diffMon}mo`;\n return `${Math.floor(diffDay / 365)}y`;\n}\n\nexport function truncateMiddle(\n input: string | undefined,\n head = 4,\n tail = 4,\n): string {\n if (!input) return \"--\";\n if (input.length <= head + tail + 1) return input;\n return `${input.slice(0, head)}…${input.slice(-tail)}`;\n}\n","import { cn } from \"@liberfi.io/ui\";\n\nconst TAG_META: Record<\n string,\n { label: string; bgClass: string; textClass: string }\n> = {\n kol: {\n label: \"KOL\",\n bgClass: \"bg-yellow-500/15\",\n textClass: \"text-yellow-400\",\n },\n smart: {\n label: \"Smart\",\n bgClass: \"bg-sky-500/15\",\n textClass: \"text-sky-400\",\n },\n sniper: {\n label: \"Sniper\",\n bgClass: \"bg-red-500/15\",\n textClass: \"text-red-400\",\n },\n dev: {\n label: \"Dev\",\n bgClass: \"bg-orange-500/15\",\n textClass: \"text-orange-400\",\n },\n bundle: {\n label: \"Bundle\",\n bgClass: \"bg-purple-500/15\",\n textClass: \"text-purple-400\",\n },\n bluechip: {\n label: \"Bluechip\",\n bgClass: \"bg-emerald-500/15\",\n textClass: \"text-emerald-400\",\n },\n insider: {\n label: \"Insider\",\n bgClass: \"bg-fuchsia-500/15\",\n textClass: \"text-fuchsia-400\",\n },\n fresh: {\n label: \"Fresh\",\n bgClass: \"bg-teal-500/15\",\n textClass: \"text-teal-400\",\n },\n};\n\nexport interface TagBadgeProps {\n tag: string;\n className?: string;\n}\n\n/**\n * Classification tag chip used across portfolio widgets (mirrors the\n * `HolderTagBadge` / `TraderTagBadge` palette from `@liberfi.io/ui-tokens`).\n */\nexport function TagBadge({ tag, className }: TagBadgeProps) {\n const meta = TAG_META[tag] ?? {\n label: tag,\n bgClass: \"bg-default/20\",\n textClass: \"text-default-500\",\n };\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium uppercase leading-none tracking-wide\",\n meta.bgClass,\n meta.textClass,\n className,\n )}\n >\n {meta.label}\n </span>\n );\n}\n\nexport interface TagBadgeListProps {\n tags?: Array<string>;\n className?: string;\n max?: number;\n}\n\nexport function TagBadgeList({ tags, className, max }: TagBadgeListProps) {\n if (!tags || tags.length === 0) return null;\n const visible = max != null && max > 0 ? tags.slice(0, max) : tags;\n const overflow = tags.length - visible.length;\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1\", className)}>\n {visible.map((tag) => (\n <TagBadge key={tag} tag={tag} />\n ))}\n {overflow > 0 && (\n <span className=\"inline-flex items-center rounded bg-default/20 px-1.5 py-0.5 text-[10px] font-medium text-default-500\">\n +{overflow}\n </span>\n )}\n </div>\n );\n}\n","import type { Activity, API } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAmount, formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { formatAgeShort, truncateMiddle, TagBadgeList } from \"../shared\";\n\nexport type PortfolioActivitiesSortBy = API.ActivitiesSortBy;\nexport type PortfolioActivitiesTypeFilter = \"all\" | \"buy\" | \"sell\";\n\nexport interface PortfolioActivitiesProps {\n activities: Array<Activity>;\n isLoading?: boolean;\n sortBy: PortfolioActivitiesSortBy;\n onSortByChange: (sortBy: PortfolioActivitiesSortBy) => void;\n typeFilter?: PortfolioActivitiesTypeFilter;\n onTypeFilterChange?: (t: PortfolioActivitiesTypeFilter) => void;\n onLoadMore?: () => void;\n hasMore?: boolean;\n now?: number;\n /** native token decimals for gas-fee formatting */\n nativeDecimals?: number;\n /** native token symbol (e.g. \"SOL\") */\n nativeSymbol?: string;\n className?: string;\n onRowClick?: (activity: Activity) => void;\n}\n\nconst SORT_OPTIONS: Array<{ value: PortfolioActivitiesSortBy; label: string }> =\n [\n { value: \"timestamp\", label: \"Latest\" },\n { value: \"totalUsd\", label: \"Top USD\" },\n ];\n\nconst TYPE_OPTIONS: Array<{\n value: PortfolioActivitiesTypeFilter;\n label: string;\n}> = [\n { value: \"all\", label: \"All\" },\n { value: \"buy\", label: \"Buys\" },\n { value: \"sell\", label: \"Sells\" },\n];\n\n/**\n * Presentational wallet activities table (Phase 3). Shows per-activity token,\n * side, trader-tags, token-amount, usd-amount, gas-fee and age.\n */\nexport function PortfolioActivities({\n activities,\n isLoading,\n sortBy,\n onSortByChange,\n typeFilter = \"all\",\n onTypeFilterChange,\n onLoadMore,\n hasMore,\n now = Date.now(),\n nativeDecimals = 9,\n nativeSymbol = \"SOL\",\n className,\n onRowClick,\n}: PortfolioActivitiesProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-2\">\n <div className=\"flex items-center gap-1\">\n {TYPE_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onTypeFilterChange?.(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n typeFilter === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-1\">\n {SORT_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onSortByChange(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n sortBy === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[780px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[10%] px-3 py-2 text-left font-normal\">Side</th>\n <th className=\"w-[25%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Amount\n </th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">USD</th>\n <th className=\"w-[15%] px-3 py-2 text-left font-normal\">Tags</th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">Gas</th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">Age</th>\n </tr>\n </thead>\n <tbody>\n {activities.length === 0 && !isLoading && (\n <tr>\n <td colSpan={7} className=\"py-8 text-center text-default-400\">\n No activities\n </td>\n </tr>\n )}\n {activities.map((a) => (\n <ActivityRow\n key={`${a.txHash}-${a.walletAddress}`}\n activity={a}\n now={now}\n nativeDecimals={nativeDecimals}\n nativeSymbol={nativeSymbol}\n onRowClick={onRowClick}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={7} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction pickPrimary(a: Activity) {\n if (a.type === \"buy\") return a.to;\n if (a.type === \"sell\") return a.from;\n return a.to;\n}\n\nfunction formatGasFee(\n gasFee: string | undefined,\n decimals: number,\n symbol: string,\n): string {\n if (!gasFee) return \"--\";\n const n = Number(gasFee) / Math.pow(10, decimals);\n if (!Number.isFinite(n)) return \"--\";\n return `${formatAmount(n)} ${symbol}`;\n}\n\nfunction ActivityRow({\n activity,\n now,\n nativeDecimals,\n nativeSymbol,\n onRowClick,\n}: {\n activity: Activity;\n now: number;\n nativeDecimals: number;\n nativeSymbol: string;\n onRowClick?: (activity: Activity) => void;\n}) {\n const primary = pickPrimary(activity);\n const sideLabel =\n activity.type === \"buy\"\n ? \"Buy\"\n : activity.type === \"sell\"\n ? \"Sell\"\n : activity.type.replace(/_/g, \" \");\n const sideColor =\n activity.type === \"buy\"\n ? \"text-bullish\"\n : activity.type === \"sell\"\n ? \"text-bearish\"\n : \"text-default-500\";\n\n return (\n <tr\n className={cn(\n \"border-b border-default-50 hover:bg-default-50/60\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(activity) : undefined}\n >\n <td\n className={cn(\n \"px-3 py-2 align-middle font-medium capitalize\",\n sideColor,\n )}\n >\n {sideLabel}\n </td>\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground\">{primary.symbol}</span>\n <span className=\"font-mono text-[10px] text-default-400\">\n {truncateMiddle(primary.address, 6, 6)}\n </span>\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {formatAmount(primary.amount)} {primary.symbol}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {primary.amountInUsd\n ? formatAmountUSDCompact(primary.amountInUsd)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 align-middle\">\n <TagBadgeList tags={activity.traderTags} max={2} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {formatGasFee(activity.gasFee, nativeDecimals, nativeSymbol)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {formatAgeShort(activity.time, now)}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useWalletActivitiesQuery,\n useWalletActivitiesSubscription,\n} from \"@liberfi.io/react\";\nimport type { API, Activity, Chain } from \"@liberfi.io/types\";\nimport type {\n PortfolioActivitiesSortBy,\n PortfolioActivitiesTypeFilter,\n} from \"./portfolio-activities.ui\";\n\nexport interface UsePortfolioActivitiesScriptParams {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: PortfolioActivitiesSortBy;\n initialTypeFilter?: PortfolioActivitiesTypeFilter;\n}\n\nexport interface UsePortfolioActivitiesScriptResult {\n activities: Array<Activity>;\n isLoading: boolean;\n sortBy: PortfolioActivitiesSortBy;\n setSortBy: (s: PortfolioActivitiesSortBy) => void;\n typeFilter: PortfolioActivitiesTypeFilter;\n setTypeFilter: (t: PortfolioActivitiesTypeFilter) => void;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the Phase 3 wallet-activities list. Mirrors the semantics of the\n * token-activities list script: cursor pagination with reset on\n * (sortBy / typeFilter / chain / address), plus live prepend when on the\n * default view.\n */\nexport function usePortfolioActivitiesScript({\n chain,\n address,\n limit = 50,\n initialSortBy = \"timestamp\",\n initialTypeFilter = \"all\",\n}: UsePortfolioActivitiesScriptParams): UsePortfolioActivitiesScriptResult {\n const [sortBy, setSortByState] =\n useState<PortfolioActivitiesSortBy>(initialSortBy);\n const [typeFilter, setTypeFilterState] =\n useState<PortfolioActivitiesTypeFilter>(initialTypeFilter);\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<Activity>>>([]);\n const [liveFront, setLiveFront] = useState<Array<Activity>>([]);\n\n const reset = useCallback(() => {\n setCursor(undefined);\n setPages([]);\n setLiveFront([]);\n }, []);\n\n const setSortBy = useCallback(\n (s: PortfolioActivitiesSortBy) => {\n if (s === sortBy) return;\n setSortByState(s);\n reset();\n },\n [sortBy, reset],\n );\n\n const setTypeFilter = useCallback(\n (t: PortfolioActivitiesTypeFilter) => {\n if (t === typeFilter) return;\n setTypeFilterState(t);\n reset();\n },\n [typeFilter, reset],\n );\n\n useEffect(() => {\n reset();\n }, [chain, address, reset]);\n\n const queryType = typeFilter === \"all\" ? undefined : typeFilter;\n\n const queryParams = useMemo(\n () => ({ chain, address, cursor, limit, sortBy, type: queryType }),\n [chain, address, cursor, limit, sortBy, queryType],\n );\n\n const { data, isPending, isFetching } = useWalletActivitiesQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const liveEligible =\n sortBy === \"timestamp\" && typeFilter === \"all\" && cursor == null;\n\n useWalletActivitiesSubscription({ chain, address }, (incoming) => {\n if (!liveEligible || !incoming?.length) return;\n setLiveFront((prev) => {\n const seen = new Set(prev.map((a) => a.txHash));\n const fresh = incoming.filter((a) => !seen.has(a.txHash));\n if (fresh.length === 0) return prev;\n return [...fresh, ...prev].slice(0, 100);\n });\n });\n\n const activities = useMemo(() => {\n const paged = pages.flatMap((p) => p.data);\n if (!liveEligible || liveFront.length === 0) return paged;\n const seen = new Set(paged.map((a) => a.txHash));\n const frontFiltered = liveFront.filter((a) => !seen.has(a.txHash));\n return [...frontFiltered, ...paged];\n }, [pages, liveFront, liveEligible]);\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n activities,\n isLoading: isPending || isFetching,\n sortBy,\n setSortBy,\n typeFilter,\n setTypeFilter,\n hasMore,\n loadMore,\n };\n}\n","import type { Activity, Chain } from \"@liberfi.io/types\";\nimport { usePortfolioActivitiesScript } from \"./portfolio-activities.script\";\nimport {\n PortfolioActivities,\n type PortfolioActivitiesSortBy,\n type PortfolioActivitiesTypeFilter,\n} from \"./portfolio-activities.ui\";\n\nexport interface PortfolioActivitiesWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: PortfolioActivitiesSortBy;\n initialTypeFilter?: PortfolioActivitiesTypeFilter;\n nativeDecimals?: number;\n nativeSymbol?: string;\n className?: string;\n onRowClick?: (activity: Activity) => void;\n}\n\n/**\n * Phase 3 wallet activities widget. Consumes\n * `GET /v2/trade/{chain}/activities?walletAddress=…` via `useWalletActivitiesQuery`.\n */\nexport function PortfolioActivitiesWidget({\n chain,\n address,\n limit,\n initialSortBy,\n initialTypeFilter,\n nativeDecimals,\n nativeSymbol,\n className,\n onRowClick,\n}: PortfolioActivitiesWidgetProps) {\n const {\n activities,\n isLoading,\n sortBy,\n setSortBy,\n typeFilter,\n setTypeFilter,\n hasMore,\n loadMore,\n } = usePortfolioActivitiesScript({\n chain,\n address,\n limit,\n initialSortBy,\n initialTypeFilter,\n });\n\n return (\n <PortfolioActivities\n activities={activities}\n isLoading={isLoading}\n sortBy={sortBy}\n onSortByChange={setSortBy}\n typeFilter={typeFilter}\n onTypeFilterChange={setTypeFilter}\n hasMore={hasMore}\n onLoadMore={loadMore}\n className={className}\n nativeDecimals={nativeDecimals}\n nativeSymbol={nativeSymbol}\n onRowClick={onRowClick}\n />\n );\n}\n","import type { Portfolio, WalletPortfolios } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmount,\n formatAmountUSDCompact,\n formatPriceUSD,\n} from \"@liberfi.io/utils\";\nimport { formatAgeShort, truncateMiddle, TagBadgeList } from \"../shared\";\n\nexport interface PortfolioNetWorthTokensProps {\n data?: WalletPortfolios;\n isLoading?: boolean;\n className?: string;\n now?: number;\n onRowClick?: (portfolio: Portfolio) => void;\n onLoadMore?: () => void;\n hasMore?: boolean;\n}\n\n/**\n * Presentational net-worth-by-token table (Phase 3).\n *\n * Columns:\n * - Token (symbol + truncated address)\n * - Amount (native token)\n * - Value (USD)\n * - Avg cost (USD) — sparse (~0.2% fill)\n * - Tags (wallet-for-token classifications)\n * - Last active\n */\nexport function PortfolioNetWorthTokens({\n data,\n isLoading,\n className,\n now = Date.now(),\n onRowClick,\n onLoadMore,\n hasMore,\n}: PortfolioNetWorthTokensProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-baseline justify-between px-3 py-2\">\n <span className=\"text-xs font-medium text-default-500\">\n Holdings\n {data && (\n <span className=\"ml-2 text-[10px] text-default-400\">\n Net worth {formatAmountUSDCompact(data.balanceInUsd)}\n </span>\n )}\n </span>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[720px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[28%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Amount\n </th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Value\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Avg cost\n </th>\n <th className=\"w-[16%] px-3 py-2 text-left font-normal\">Tags</th>\n <th className=\"w-[12%] px-3 py-2 text-right font-normal\">\n Last active\n </th>\n </tr>\n </thead>\n <tbody>\n {(!data || data.portfolios.length === 0) && !isLoading && (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No holdings\n </td>\n </tr>\n )}\n {data?.portfolios.map((p) => (\n <Row\n key={`${p.chain}-${p.address}`}\n portfolio={p}\n now={now}\n onRowClick={onRowClick}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction Row({\n portfolio,\n now,\n onRowClick,\n}: {\n portfolio: Portfolio;\n now: number;\n onRowClick?: (portfolio: Portfolio) => void;\n}) {\n return (\n <tr\n className={cn(\n \"border-b border-default-50 hover:bg-default-50/60\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(portfolio) : undefined}\n >\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground\">{portfolio.symbol}</span>\n <span className=\"font-mono text-[10px] text-default-400\">\n {truncateMiddle(portfolio.address, 6, 6)}\n </span>\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {formatAmount(portfolio.amount)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {formatAmountUSDCompact(portfolio.amountInUsd)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {portfolio.avgCostUsd ? formatPriceUSD(portfolio.avgCostUsd) : \"--\"}\n </td>\n <td className=\"px-3 py-2 align-middle\">\n <TagBadgeList tags={portfolio.walletTokenTags} max={2} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {portfolio.lastActiveAt\n ? formatAgeShort(portfolio.lastActiveAt, now)\n : \"--\"}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useWalletPortfoliosQuery } from \"@liberfi.io/react\";\nimport type { Chain, WalletPortfolios } from \"@liberfi.io/types\";\n\nexport interface UsePortfolioNetWorthTokensScriptParams {\n chain: Chain;\n address: string;\n /** page size */\n limit?: number;\n}\n\nexport interface UsePortfolioNetWorthTokensScriptResult {\n data?: WalletPortfolios;\n isLoading: boolean;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the Phase 3 portfolio net-worth-tokens list.\n *\n * Pagination: we accumulate pages into a single `WalletPortfolios` object so\n * the UI can show the full list with infinite-scroll semantics while still\n * carrying the summary fields (`balanceInUsd`, `balanceInNative`) from the\n * first page.\n */\nexport function usePortfolioNetWorthTokensScript({\n chain,\n address,\n limit = 50,\n}: UsePortfolioNetWorthTokensScriptParams): UsePortfolioNetWorthTokensScriptResult {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<WalletPortfolios>>([]);\n\n useEffect(() => {\n setPages([]);\n setCursor(undefined);\n }, [chain, address]);\n\n const { data, isPending, isFetching } = useWalletPortfoliosQuery({\n chain,\n address,\n cursor,\n limit,\n });\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const merged = useMemo<WalletPortfolios | undefined>(() => {\n if (pages.length === 0) return undefined;\n const first = pages[0];\n return {\n ...first,\n portfolios: pages.flatMap((p) => p.portfolios),\n };\n }, [pages]);\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n data: merged,\n isLoading: isPending || isFetching,\n hasMore,\n loadMore,\n };\n}\n","import type { Chain, Portfolio } from \"@liberfi.io/types\";\nimport { usePortfolioNetWorthTokensScript } from \"./portfolio-net-worth-tokens.script\";\nimport { PortfolioNetWorthTokens } from \"./portfolio-net-worth-tokens.ui\";\n\nexport interface PortfolioNetWorthTokensWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n className?: string;\n onRowClick?: (portfolio: Portfolio) => void;\n}\n\n/**\n * Phase 3 net-worth-by-token widget. Consumes\n * `GET /v2/wallet/{chain}/{wallet}/net-worth/tokens` via\n * `useWalletPortfoliosQuery` and surfaces the new fields\n * (`isActive`, `avgCostUsd`, `lastActiveAt`, `walletTokenTags`).\n */\nexport function PortfolioNetWorthTokensWidget({\n chain,\n address,\n limit,\n className,\n onRowClick,\n}: PortfolioNetWorthTokensWidgetProps) {\n const { data, isLoading, hasMore, loadMore } =\n usePortfolioNetWorthTokensScript({ chain, address, limit });\n\n return (\n <PortfolioNetWorthTokens\n data={data}\n isLoading={isLoading}\n className={className}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onRowClick={onRowClick}\n />\n );\n}\n","import type { API, PortfolioPnl, WalletPortfolioPnls } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmountUSDCompact,\n formatPercent,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { formatAgeShort, truncateMiddle } from \"../shared\";\n\nexport type PnlResolution = API.WalletPnlResolution;\nexport type PositionState = API.PositionState;\nexport type PnlSortBy = API.WalletPnlSortBy;\n\nexport interface PortfolioPnlDetailsProps {\n data?: WalletPortfolioPnls;\n isLoading?: boolean;\n resolution: PnlResolution;\n onResolutionChange: (r: PnlResolution) => void;\n positionState: PositionState;\n onPositionStateChange: (p: PositionState) => void;\n sortBy: PnlSortBy;\n onSortByChange: (s: PnlSortBy) => void;\n hasMore?: boolean;\n onLoadMore?: () => void;\n now?: number;\n className?: string;\n onRowClick?: (pnl: PortfolioPnl) => void;\n}\n\nconst RESOLUTION_OPTIONS: Array<{ value: PnlResolution; label: string }> = [\n { value: \"7d\", label: \"7D\" },\n { value: \"30d\", label: \"30D\" },\n { value: \"90d\", label: \"90D\" },\n];\n\nconst POSITION_OPTIONS: Array<{ value: PositionState; label: string }> = [\n { value: \"open\", label: \"Open\" },\n { value: \"closed\", label: \"Closed\" },\n { value: \"all\", label: \"All\" },\n];\n\nconst SORT_OPTIONS: Array<{ value: PnlSortBy; label: string }> = [\n { value: \"totalPnl\", label: \"Total\" },\n { value: \"realizedPnl\", label: \"Realized\" },\n { value: \"unrealizedPnl\", label: \"Unrealized\" },\n];\n\n/**\n * Presentational PnL details table (Phase 3). Shows per-position realized /\n * unrealized / total PnL and the new Phase 3 fields (`isClosed`, `firstBuyAt`,\n * `lastSellAt`). The summary row at the top shows aggregate PnL and win rate.\n */\nexport function PortfolioPnlDetails({\n data,\n isLoading,\n resolution,\n onResolutionChange,\n positionState,\n onPositionStateChange,\n sortBy,\n onSortByChange,\n hasMore,\n onLoadMore,\n now = Date.now(),\n className,\n onRowClick,\n}: PortfolioPnlDetailsProps) {\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-2\">\n <FilterGroup\n label=\"Window\"\n options={RESOLUTION_OPTIONS}\n value={resolution}\n onChange={onResolutionChange}\n />\n <FilterGroup\n label=\"Status\"\n options={POSITION_OPTIONS}\n value={positionState}\n onChange={onPositionStateChange}\n />\n <FilterGroup\n label=\"Sort\"\n options={SORT_OPTIONS}\n value={sortBy}\n onChange={onSortByChange}\n />\n </div>\n\n {data && <SummaryCard data={data} />}\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[780px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[22%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Holding\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Total PnL\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Realized\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Unrealized\n </th>\n <th className=\"w-[8%] px-3 py-2 text-right font-normal\">State</th>\n <th className=\"w-[9%] px-3 py-2 text-right font-normal\">\n First buy\n </th>\n <th className=\"w-[9%] px-3 py-2 text-right font-normal\">\n Last sell\n </th>\n </tr>\n </thead>\n <tbody>\n {(!data || data.portfolios.length === 0) && !isLoading && (\n <tr>\n <td colSpan={8} className=\"py-8 text-center text-default-400\">\n No positions\n </td>\n </tr>\n )}\n {data?.portfolios.map((p) => (\n <Row\n key={`${p.chain}-${p.address}`}\n pnl={p}\n now={now}\n onRowClick={onRowClick}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={8} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction FilterGroup<T extends string>({\n label,\n options,\n value,\n onChange,\n}: {\n label: string;\n options: Array<{ value: T; label: string }>;\n value: T;\n onChange: (v: T) => void;\n}) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] uppercase tracking-wide text-default-400\">\n {label}\n </span>\n <div className=\"flex items-center gap-1\">\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n value === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction SummaryCard({ data }: { data: WalletPortfolioPnls }) {\n const total = data.totalProfitInUsd;\n const totalRatio = data.totalProfitRatio;\n const win = data.winRate;\n return (\n <div className=\"mx-3 flex flex-wrap items-center gap-x-6 gap-y-2 rounded border border-default-100 bg-default-50 px-4 py-2 text-xs\">\n <SummaryStat\n label=\"Total PnL\"\n value={\n total\n ? formatAmountUSDCompact(total, { showPlusGtThanZero: true })\n : \"--\"\n }\n tone={total ? signTone(total) : undefined}\n />\n <SummaryStat\n label=\"Return\"\n value={\n totalRatio\n ? formatPercent(totalRatio, { showPlusGtThanZero: true })\n : \"--\"\n }\n tone={totalRatio ? signTone(totalRatio) : undefined}\n />\n <SummaryStat label=\"Win rate\" value={win ? formatPercent(win) : \"--\"} />\n <SummaryStat\n label=\"Trades\"\n value={data.totalTrades != null ? data.totalTrades.toString() : \"--\"}\n />\n </div>\n );\n}\n\nfunction signTone(value: string): \"bullish\" | \"bearish\" | undefined {\n const bn = new SafeBigNumber(value);\n if (bn.gt(0)) return \"bullish\";\n if (bn.lt(0)) return \"bearish\";\n return undefined;\n}\n\nfunction SummaryStat({\n label,\n value,\n tone,\n}: {\n label: string;\n value: string;\n tone?: \"bullish\" | \"bearish\";\n}) {\n return (\n <div className=\"flex flex-col\">\n <span className=\"text-[10px] uppercase tracking-wide text-default-400\">\n {label}\n </span>\n <span\n className={cn(\n \"text-sm font-medium\",\n tone === \"bullish\"\n ? \"text-bullish\"\n : tone === \"bearish\"\n ? \"text-bearish\"\n : \"text-foreground\",\n )}\n >\n {value}\n </span>\n </div>\n );\n}\n\nfunction PnlCell({ value }: { value?: string }) {\n if (!value) return <span className=\"text-default-400\">--</span>;\n const bn = new SafeBigNumber(value);\n const cls = bn.gt(0)\n ? \"text-bullish\"\n : bn.lt(0)\n ? \"text-bearish\"\n : \"text-default-500\";\n return (\n <span className={cls}>\n {formatAmountUSDCompact(value, { showPlusGtThanZero: true })}\n </span>\n );\n}\n\nfunction Row({\n pnl,\n now,\n onRowClick,\n}: {\n pnl: PortfolioPnl;\n now: number;\n onRowClick?: (pnl: PortfolioPnl) => void;\n}) {\n return (\n <tr\n className={cn(\n \"border-b border-default-50 hover:bg-default-50/60\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(pnl) : undefined}\n >\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground\">{pnl.symbol}</span>\n <span className=\"font-mono text-[10px] text-default-400\">\n {truncateMiddle(pnl.address, 6, 6)}\n </span>\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {formatAmountUSDCompact(pnl.amountInUsd)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n <PnlCell value={pnl.totalProfitInUsd} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n <PnlCell value={pnl.realizedProfitInUsd} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n <PnlCell value={pnl.unrealizedProfitInUsd} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-[10px]\">\n <span\n className={cn(\n \"rounded px-1.5 py-0.5\",\n pnl.isClosed\n ? \"bg-default/20 text-default-500\"\n : \"bg-bullish/15 text-bullish\",\n )}\n >\n {pnl.isClosed ? \"Closed\" : \"Open\"}\n </span>\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {pnl.firstBuyAt ? formatAgeShort(pnl.firstBuyAt, now) : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {pnl.lastSellAt ? formatAgeShort(pnl.lastSellAt, now) : \"--\"}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useWalletPortfolioPnlsQuery } from \"@liberfi.io/react\";\nimport type { Chain, WalletPortfolioPnls } from \"@liberfi.io/types\";\nimport type {\n PnlResolution,\n PnlSortBy,\n PositionState,\n} from \"./portfolio-pnl-details.ui\";\n\nexport interface UsePortfolioPnlDetailsScriptParams {\n chain: Chain;\n address: string;\n limit?: number;\n initialResolution?: PnlResolution;\n initialPositionState?: PositionState;\n initialSortBy?: PnlSortBy;\n}\n\nexport interface UsePortfolioPnlDetailsScriptResult {\n data?: WalletPortfolioPnls;\n isLoading: boolean;\n resolution: PnlResolution;\n setResolution: (r: PnlResolution) => void;\n positionState: PositionState;\n setPositionState: (p: PositionState) => void;\n sortBy: PnlSortBy;\n setSortBy: (s: PnlSortBy) => void;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the Phase 3 PnL-details widget.\n *\n * Pagination: accumulates cursor pages into a single `WalletPortfolioPnls`\n * while keeping the header summary from the first page. Any of\n * `resolution` / `positionState` / `sortBy` / `chain` / `address` changing\n * triggers a full reset — the server invalidates cursors on any of these\n * changes.\n */\nexport function usePortfolioPnlDetailsScript({\n chain,\n address,\n limit = 50,\n initialResolution = \"30d\",\n initialPositionState = \"open\",\n initialSortBy = \"totalPnl\",\n}: UsePortfolioPnlDetailsScriptParams): UsePortfolioPnlDetailsScriptResult {\n const [resolution, setResolutionState] =\n useState<PnlResolution>(initialResolution);\n const [positionState, setPositionStateState] =\n useState<PositionState>(initialPositionState);\n const [sortBy, setSortByState] = useState<PnlSortBy>(initialSortBy);\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<WalletPortfolioPnls>>([]);\n\n const reset = useCallback(() => {\n setCursor(undefined);\n setPages([]);\n }, []);\n\n const setResolution = useCallback(\n (r: PnlResolution) => {\n if (r === resolution) return;\n setResolutionState(r);\n reset();\n },\n [resolution, reset],\n );\n\n const setPositionState = useCallback(\n (p: PositionState) => {\n if (p === positionState) return;\n setPositionStateState(p);\n reset();\n },\n [positionState, reset],\n );\n\n const setSortBy = useCallback(\n (s: PnlSortBy) => {\n if (s === sortBy) return;\n setSortByState(s);\n reset();\n },\n [sortBy, reset],\n );\n\n useEffect(() => {\n reset();\n }, [chain, address, reset]);\n\n const queryParams = useMemo(\n () => ({\n chain,\n address,\n cursor,\n limit,\n resolution,\n positionState,\n sortBy,\n }),\n [chain, address, cursor, limit, resolution, positionState, sortBy],\n );\n\n const { data, isPending, isFetching } =\n useWalletPortfolioPnlsQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const merged = useMemo<WalletPortfolioPnls | undefined>(() => {\n if (pages.length === 0) return undefined;\n const first = pages[0];\n return {\n ...first,\n portfolios: pages.flatMap((p) => p.portfolios),\n };\n }, [pages]);\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n data: merged,\n isLoading: isPending || isFetching,\n resolution,\n setResolution,\n positionState,\n setPositionState,\n sortBy,\n setSortBy,\n hasMore,\n loadMore,\n };\n}\n","import type { Chain, PortfolioPnl } from \"@liberfi.io/types\";\nimport { usePortfolioPnlDetailsScript } from \"./portfolio-pnl-details.script\";\nimport {\n PortfolioPnlDetails,\n type PnlResolution,\n type PnlSortBy,\n type PositionState,\n} from \"./portfolio-pnl-details.ui\";\n\nexport interface PortfolioPnlDetailsWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n initialResolution?: PnlResolution;\n initialPositionState?: PositionState;\n initialSortBy?: PnlSortBy;\n className?: string;\n onRowClick?: (pnl: PortfolioPnl) => void;\n}\n\n/**\n * Phase 3 PnL-details widget. Consumes\n * `GET /v2/wallet/{chain}/{wallet}/pnl-details` via\n * `useWalletPortfolioPnlsQuery` and renders the new fields (`isClosed`,\n * `firstBuyAt`, `lastSellAt`) alongside resolution / positionState / sortBy\n * selectors.\n */\nexport function PortfolioPnlDetailsWidget({\n chain,\n address,\n limit,\n initialResolution,\n initialPositionState,\n initialSortBy,\n className,\n onRowClick,\n}: PortfolioPnlDetailsWidgetProps) {\n const {\n data,\n isLoading,\n resolution,\n setResolution,\n positionState,\n setPositionState,\n sortBy,\n setSortBy,\n hasMore,\n loadMore,\n } = usePortfolioPnlDetailsScript({\n chain,\n address,\n limit,\n initialResolution,\n initialPositionState,\n initialSortBy,\n });\n\n return (\n <PortfolioPnlDetails\n data={data}\n isLoading={isLoading}\n resolution={resolution}\n onResolutionChange={setResolution}\n positionState={positionState}\n onPositionStateChange={setPositionState}\n sortBy={sortBy}\n onSortByChange={setSortBy}\n hasMore={hasMore}\n onLoadMore={loadMore}\n className={className}\n onRowClick={onRowClick}\n />\n );\n}\n","import type { PropsWithChildren } from \"react\";\nimport { PortfolioClientContext } from \"../contexts/PortfolioClientContext\";\nimport type { IPortfolioClient } from \"../types\";\n\nexport type PortfolioClientProviderProps = PropsWithChildren<{\n client: IPortfolioClient;\n}>;\n\nexport function PortfolioClientProvider({\n client,\n children,\n}: PortfolioClientProviderProps) {\n return (\n <PortfolioClientContext.Provider value={client}>\n {children}\n </PortfolioClientContext.Provider>\n );\n}\n","import { useCallback, useContext, useEffect } from \"react\";\nimport {\n useWalletPnlQuery,\n useWalletPortfoliosQuery,\n useWalletPnlSubscription,\n} from \"@liberfi.io/react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { PortfolioInternalContext } from \"../contexts/PortfolioContext\";\n\nconst SUMMARY_POLL_MS = 15_000;\n\n/** Pick only defined (non-undefined) entries from an object. */\nfunction definedEntries<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\nexport interface UseWalletStateManagerParams {\n chain: Chain;\n address: string;\n enabled?: boolean;\n summaryPollMs?: number;\n}\n\n/**\n * Mounts the wallet summary state engine: queries, polls, and subscribes to\n * wallet balance + PnL summary, writing results to the Provider's context state.\n * Call this once near the top of the component tree (inside PortfolioProvider).\n */\nexport function useWalletStateManager({\n chain,\n address,\n enabled = true,\n summaryPollMs = SUMMARY_POLL_MS,\n}: UseWalletStateManagerParams) {\n const { setSummary, setSummaryStatus, setRefetchSummary } = useContext(\n PortfolioInternalContext,\n );\n\n const portfoliosQuery = useWalletPortfoliosQuery(\n { chain, address },\n { enabled, refetchInterval: summaryPollMs },\n );\n\n const pnlQuery = useWalletPnlQuery(\n { chain, address },\n { enabled, refetchInterval: summaryPollMs },\n );\n\n // Clear summary when chain or address changes so we don't show stale data\n // (e.g. old chain's native token) while the new chain's data is loading.\n useEffect(() => {\n setSummary(null);\n }, [chain, address, setSummary]);\n\n useEffect(() => {\n const isPending = portfoliosQuery.isPending || pnlQuery.isPending;\n const isFetching = portfoliosQuery.isFetching || pnlQuery.isFetching;\n const isError = portfoliosQuery.isError || pnlQuery.isError;\n const isSuccess = portfoliosQuery.isSuccess && pnlQuery.isSuccess;\n\n setSummaryStatus({\n status: isError ? \"error\" : isSuccess ? \"success\" : \"pending\",\n fetchStatus: isFetching ? \"fetching\" : \"idle\",\n isLoading: isPending && isFetching,\n isPending,\n isFetching,\n isRefetching: isSuccess && isFetching,\n isError,\n isSuccess,\n error: portfoliosQuery.error ?? pnlQuery.error,\n dataUpdatedAt: Math.max(\n portfoliosQuery.dataUpdatedAt,\n pnlQuery.dataUpdatedAt,\n ),\n });\n }, [\n portfoliosQuery.isPending,\n portfoliosQuery.isFetching,\n portfoliosQuery.isError,\n portfoliosQuery.isSuccess,\n portfoliosQuery.error,\n portfoliosQuery.dataUpdatedAt,\n pnlQuery.isPending,\n pnlQuery.isFetching,\n pnlQuery.isError,\n pnlQuery.isSuccess,\n pnlQuery.error,\n pnlQuery.dataUpdatedAt,\n setSummaryStatus,\n ]);\n\n useEffect(() => {\n const portfoliosData = portfoliosQuery.data;\n const pnlData = pnlQuery.data;\n if (!portfoliosData || !pnlData) return;\n\n setSummary({\n ...pnlData,\n balanceInUsd: portfoliosData.balanceInUsd,\n balanceInNative: portfoliosData.balanceInNative,\n });\n }, [portfoliosQuery.data, pnlQuery.data, setSummary]);\n\n useWalletPnlSubscription(\n { chain, address },\n (pnls) => {\n setSummary((prev) => {\n if (!prev) return prev;\n let updated = prev;\n for (const p of pnls) {\n updated = { ...updated, ...definedEntries(p) };\n }\n return updated;\n });\n },\n { enabled },\n );\n\n const refetchSummary = useCallback(async () => {\n await Promise.all([portfoliosQuery.refetch(), pnlQuery.refetch()]);\n }, [portfoliosQuery, pnlQuery]);\n\n useEffect(() => {\n setRefetchSummary(refetchSummary);\n }, [refetchSummary, setRefetchSummary]);\n}\n","import type { PropsWithChildren, ReactNode } from \"react\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { PortfolioContext } from \"../contexts\";\nimport { PortfolioInternalContext } from \"../contexts/PortfolioContext\";\nimport { useWalletStateManager } from \"../hooks/useWalletStateManager\";\nimport type { AsyncStatus, WalletSummary } from \"../types\";\n\nexport type PortfolioProviderProps = PropsWithChildren<{\n chain: Chain;\n address: string;\n}>;\n\nexport function PortfolioProvider({\n chain,\n address,\n children,\n}: PortfolioProviderProps) {\n const [summary, setSummary] = useState<WalletSummary | null>(null);\n const [summaryStatus, setSummaryStatus] = useState(INITIAL_ASYNC_STATUS);\n const refetchRef = useRef<() => Promise<void>>(() => Promise.resolve());\n\n const refetchSummary = useCallback(() => refetchRef.current(), []);\n const setRefetchSummary = useCallback((fn: () => Promise<void>) => {\n refetchRef.current = fn;\n }, []);\n\n const publicValue = useMemo(\n () => ({ summary, summaryStatus, refetchSummary }),\n [summary, summaryStatus, refetchSummary],\n );\n\n const internalValue = useMemo(\n () => ({ setSummary, setSummaryStatus, setRefetchSummary }),\n [setSummary, setSummaryStatus, setRefetchSummary],\n );\n\n return (\n <PortfolioInternalContext.Provider value={internalValue}>\n <PortfolioContext.Provider value={publicValue}>\n <StateManagerBridge chain={chain} address={address}>\n {children}\n </StateManagerBridge>\n </PortfolioContext.Provider>\n </PortfolioInternalContext.Provider>\n );\n}\n\ninterface StateManagerBridgeProps {\n chain: Chain;\n address: string;\n children: ReactNode;\n}\n\n/** Mounts useWalletStateManager inside both Context providers. */\nfunction StateManagerBridge({\n chain,\n address,\n children,\n}: StateManagerBridgeProps) {\n useWalletStateManager({ chain, address, enabled: !!address });\n return <>{children}</>;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────────\n\nexport const INITIAL_ASYNC_STATUS: AsyncStatus = {\n status: \"pending\",\n fetchStatus: \"idle\",\n isLoading: false,\n isPending: true,\n isFetching: false,\n isRefetching: false,\n isError: false,\n isSuccess: false,\n error: null,\n dataUpdatedAt: 0,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/contexts/PortfolioClientContext.tsx","../src/contexts/PortfolioContext.tsx","../src/hooks/usePortfolioContext.ts","../src/hooks/useWalletSummary.ts","../src/components/account/account-info.script.ts","../src/components/account/account-info.ui.tsx","../src/components/account/account-info.widget.tsx","../src/utils/index.ts","../src/components/portfolio-page/address-row.ui.tsx","../src/types/index.ts","../src/components/portfolio-page/asset-tabs.ui.tsx","../src/components/portfolio-page/balance-row.ui.tsx","../src/components/portfolio-page/curve-card.ui.tsx","../src/components/portfolio-page/distribution-card.ui.tsx","../src/hooks/usePortfolioClient.ts","../src/hooks/useOverviewQuery.ts","../src/hooks/useSpotHoldingsQuery.ts","../src/hooks/useSpotHistoryQuery.ts","../src/hooks/usePerpsPositionsQuery.ts","../src/hooks/usePerpsHistoryQuery.ts","../src/hooks/usePredictionBetsQuery.ts","../src/hooks/usePredictionSettledQuery.ts","../src/hooks/useCurveDataQuery.ts","../src/hooks/useDistributionQuery.ts","../src/hooks/useRefetchWalletSummary.ts","../src/hooks/useWalletPortfolios.ts","../src/components/portfolio-page/portfolio-page.script.tsx","../src/components/portfolio-page/portfolio-page.skeleton.tsx","../src/components/portfolio-page/viewing-banner.ui.tsx","../src/components/portfolio-page/portfolio-page.widget.tsx","../src/components/holdings/confirm-dialog.ui.tsx","../src/components/holdings/holdings-section.script.tsx","../src/components/holdings/shared.ui.tsx","../src/components/holdings/perps-panel.ui.tsx","../src/components/holdings/prediction-panel.ui.tsx","../src/components/holdings/spot-panel.ui.tsx","../src/components/holdings/holdings-section.widget.tsx","../src/components/shared/format.ts","../src/components/shared/tag-badge.ui.tsx","../src/components/portfolio-activities/portfolio-activities.ui.tsx","../src/components/portfolio-activities/portfolio-activities.script.ts","../src/components/portfolio-activities/portfolio-activities.widget.tsx","../src/components/portfolio-net-worth-tokens/portfolio-net-worth-tokens.ui.tsx","../src/components/portfolio-net-worth-tokens/portfolio-net-worth-tokens.script.ts","../src/components/portfolio-net-worth-tokens/portfolio-net-worth-tokens.widget.tsx","../src/components/portfolio-pnl-details/portfolio-pnl-details.ui.tsx","../src/components/portfolio-pnl-details/portfolio-pnl-details.script.ts","../src/components/portfolio-pnl-details/portfolio-pnl-details.widget.tsx","../src/providers/PortfolioClientProvider.tsx","../src/hooks/useWalletStateManager.ts","../src/providers/PortfolioProvider.tsx"],"names":["version_default","PortfolioClientContext","createContext","PortfolioContext","PortfolioInternalContext","usePortfolioContext","context","useContext","useWalletSummary","summary","summaryStatus","useAccountInfo","status","signIn","signOut","useAuth","chain","chainNamespace","useCurrentChain","wallet","useConnectedWallet","nativeToken","useMemo","getNativeToken","balanceUsdFormatted","formatAmountUSD","balanceNativeFormatted","formatAmount","AccountInfoUI","walletAddress","actions","t","useTranslation","isMobile","useScreen","isOpen","onClose","onOpenChange","useDisclosure","copyToClipboard","useCopyToClipboard","handleCopyWalletAddress","useCallback","toast","jsx","Button","SignInIcon","jsxs","StyledPopover","PopoverTrigger","WalletIcon","ChevronDownIcon","cn","TokenIcon","PopoverContent","StyledTooltip","CopyIcon","Divider","action","SignOutIcon","AccountInfoWidget","state","parseDecimal","raw","n","formatUsd","value","abs","sign","formatSignedUsd","formatted","formatPercent","splitUsd","parts","integer","decimal","truncateAddress","address","start","end","formatTokenBalance","getExplorerUrl","txHash","_chain","DISTRIBUTION_COLORS","OTHER_COLOR","computeDistribution","holdings","totalValue","sum","h","sorted","a","b","items","otherValue","colorIdx","pct","formatTime","epochMs","AddressRowUI","walletId","wallets","isViewing","viewingAddress","onSelectWallet","onCopyAddress","onSearch","ddOpen","setDdOpen","useState","searchValue","setSearchValue","ddRef","useRef","isAggregated","selectedWallet","w","displayLabel","displayAddr","dotColor","handleSearch","v","handleKeyDown","e","o","Fragment","AssetTab","CurveType","CurvePeriod","CURVE_PERIOD_VALUE","PerpsPositionSide","SpotHistoryType","PredictionBetStatus","PredictionResult","PredictionSource","TABS","getTabValue","tab","spotValue","perpsValue","predictionValue","AssetTabsUI","activeTab","onTabChange","key","label","isActive","BalanceRowUI","overview","uPnl","realized","totalProfit","PnlItem","Separator","PERIODS","formatTimeLabel","ts","period","d","getDataKey","curveType","CurveCardUI","curvePeriod","data","isLoading","onTypeChange","onPeriodChange","points","dataKey","isPnl","displayValues","p","hasNegative","minVal","maxVal","min","max","range","timeLabels","count","step","labels","i","last","lastValue","TypeTab","ResponsiveContainer","AreaChart","XAxis","YAxis","ReferenceLine","Area","active","onClick","DistributionCardUI","chartData","item","PieChart","Pie","idx","Cell","usePortfolioClient","client","overviewQueryKey","query","fetchOverview","useOverviewQuery","queryOptions","useQuery","spotHoldingsQueryKey","fetchSpotHoldings","useSpotHoldingsQuery","spotHistoryQueryKey","fetchSpotHistory","useSpotHistoryQuery","perpsPositionsQueryKey","fetchPerpsPositions","usePerpsPositionsQuery","perpsHistoryQueryKey","fetchPerpsHistory","usePerpsHistoryQuery","predictionBetsQueryKey","fetchPredictionBets","usePredictionBetsQuery","predictionSettledQueryKey","fetchPredictionSettled","usePredictionSettledQuery","curveDataQueryKey","fetchCurveData","useCurveDataQuery","distributionQueryKey","useDistributionQuery","useRefetchWalletSummary","refetchSummary","DEFAULT_POLL_MS","definedEntries","obj","useWalletPortfolios","tokenAddresses","pollMs","tokens","setTokens","portfolioQuery","useWalletPortfoliosByTokensQuery","pnlQuery","useWalletPortfolioPnlsByTokensQuery","useEffect","portfolios","pnlMap","next","portfolio","tokenKeyRef","tokenSetRef","tokenKey","tokenSet","useWalletPortfoliosSubscription","subscribed","prev","updated","s","existing","_c","_w","_t","rest","patch","useWalletPortfolioPnlsSubscription","refetch","usePortfolioPage","options","defaultTab","walletAddresses","setActiveTab","setWalletId","setViewingAddress","setCurveType","setCurvePeriod","overviewQuery","spotHoldingsQuery","curveQuery","distributionResult","enterViewing","exitViewing","selectWallet","id","PortfolioPageSkeleton","Skeleton","_","ViewingBannerUI","onBack","PortfolioPageWidget","renderHoldings","externalLoading","distributionQuery","ConfirmDialog","open","title","message","confirmLabel","cancelLabel","onConfirm","onCancel","useHoldingsSection","spotSubTab","setSpotSubTab","perpsSubTab","setPerpsSubTab","predictionSubTab","setPredictionSubTab","spotSearch","setSpotSearch","perpsSearch","setPerpsSearch","predictionSearch","setPredictionSearch","hideSmall","setHideSmall","groupCollapsed","setGroupCollapsed","toggleGroupCollapsed","spotHistoryQuery","perpsPositionsQuery","perpsHistoryQuery","predictionBetsQuery","predictionSettledQuery","filteredSpotHoldings","q","filteredPerpsPositions","positions","filteredPredictionBets","bets","HoldingsSubTabs","tabs","activeKey","HoldingsSearch","onChange","placeholder","HoldingsEmpty","hint","BatchActionButton","disabled","PerpsPanelUI","onClosePosition","onCloseAll","hasPositions","k","PerpsPositionsTable","PerpsHistoryTable","PerpsPositionRow","position","isLong","isPnlPositive","records","r","PerpsTradeRow","record","PredictionPanelUI","onSellBet","onSellAll","hasBets","PredictionBetsTable","PredictionSettledTable","SOURCE_STYLES","SOURCE_LABELS","SourceTag","source","onSell","PredictionBetRow","bet","PredictionSettledRow","isWon","SpotPanelUI","SpotHoldingsTable","SpotHistoryTable","onToggleGroup","SpotHoldingRow","holding","isPositive","SpotHistoryRow","TYPE_STYLES","TYPE_LABELS","getTradeDetail","explorerUrl","HoldingsSectionWidget","onCloseAllPositions","onSellAllBets","confirmAction","setConfirmAction","handleCloseAll","handleSellAll","handleConfirm","handleCancel","formatAgeShort","from","now","diffSec","diffMin","diffHour","diffDay","diffMon","truncateMiddle","input","head","tail","TAG_META","TagBadge","tag","className","meta","TagBadgeList","tags","visible","overflow","SORT_OPTIONS","TYPE_OPTIONS","PortfolioActivities","activities","sortBy","onSortByChange","typeFilter","onTypeFilterChange","onLoadMore","hasMore","nativeDecimals","nativeSymbol","onRowClick","opt","ActivityRow","pickPrimary","formatGasFee","gasFee","decimals","symbol","activity","primary","sideLabel","sideColor","formatAmountUSDCompact","usePortfolioActivitiesScript","limit","initialSortBy","initialTypeFilter","setSortByState","setTypeFilterState","cursor","setCursor","pages","setPages","liveFront","setLiveFront","reset","setSortBy","setTypeFilter","queryType","queryParams","isPending","isFetching","useWalletActivitiesQuery","liveEligible","useWalletActivitiesSubscription","incoming","seen","fresh","paged","lastPage","loadMore","PortfolioActivitiesWidget","PortfolioNetWorthTokens","Row","formatPriceUSD","usePortfolioNetWorthTokensScript","useWalletPortfoliosQuery","merged","PortfolioNetWorthTokensWidget","RESOLUTION_OPTIONS","POSITION_OPTIONS","PortfolioPnlDetails","resolution","onResolutionChange","positionState","onPositionStateChange","FilterGroup","SummaryCard","total","totalRatio","win","SummaryStat","signTone","bn","SafeBigNumber","tone","PnlCell","cls","pnl","usePortfolioPnlDetailsScript","initialResolution","initialPositionState","setResolutionState","setPositionStateState","setResolution","setPositionState","useWalletPortfolioPnlsQuery","PortfolioPnlDetailsWidget","PortfolioClientProvider","children","SUMMARY_POLL_MS","useWalletStateManager","enabled","summaryPollMs","setSummary","setSummaryStatus","setRefetchSummary","portfoliosQuery","useWalletPnlQuery","isError","isSuccess","portfoliosData","pnlData","useWalletPnlSubscription","pnls","PortfolioProvider","INITIAL_ASYNC_STATUS","refetchRef","fn","publicValue","internalValue","StateManagerBridge"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-portfolio\"] = \"2.0.9\";\n}\n\nexport default \"2.0.9\";\n","import { createContext } from \"react\";\nimport type { IPortfolioClient } from \"../types\";\n\nexport const PortfolioClientContext = createContext<IPortfolioClient | null>(\n null,\n);\n","import type { Dispatch, SetStateAction } from \"react\";\nimport { createContext } from \"react\";\nimport type { AsyncStatus, WalletSummary } from \"../types\";\n\n/** Refetch function for wallet summary. */\nexport type RefetchWalletSummaryFn = () => Promise<void>;\n\n// ── Public Context (wallet summary, consumer-facing) ────────────────────────\n\nexport interface PortfolioContextValue {\n /** Wallet summary (balance + PnL) for the current tree's wallet. */\n summary: WalletSummary | null;\n /** Async status for wallet summary. */\n summaryStatus: AsyncStatus;\n /** Triggers a refetch of wallet summary. */\n refetchSummary: RefetchWalletSummaryFn;\n}\n\nexport const PortfolioContext = createContext<PortfolioContextValue>(\n {} as PortfolioContextValue,\n);\n\n// ── Internal Context (used by useWalletStateManager only) ───────────────────\n\nexport interface PortfolioInternalContextValue {\n setSummary: Dispatch<SetStateAction<WalletSummary | null>>;\n setSummaryStatus: Dispatch<SetStateAction<AsyncStatus>>;\n setRefetchSummary: (fn: RefetchWalletSummaryFn) => void;\n}\n\nexport const PortfolioInternalContext =\n createContext<PortfolioInternalContextValue>(\n {} as PortfolioInternalContextValue,\n );\n","import { useContext } from \"react\";\nimport { PortfolioContext } from \"../contexts\";\n\nexport function usePortfolioContext() {\n const context = useContext(PortfolioContext);\n if (!context) {\n throw new Error(\n \"usePortfolioContext must be used within a PortfolioProvider\",\n );\n }\n return context;\n}\n","import type { AsyncStatus, WalletSummary } from \"../types\";\nimport { usePortfolioContext } from \"./usePortfolioContext\";\n\n/**\n * Read wallet summary (balance + PnL) with async status.\n *\n * Must be used within a `<PortfolioProvider>`. The wallet is the one\n * identified by the `address` prop passed to the nearest `PortfolioProvider`.\n */\nexport function useWalletSummary(): AsyncStatus & {\n data: WalletSummary | null;\n} {\n const { summary, summaryStatus } = usePortfolioContext();\n return { data: summary, ...summaryStatus };\n}\n","import { useMemo } from \"react\";\nimport { useCurrentChain } from \"@liberfi.io/ui-chain-select\";\nimport {\n formatAmount,\n formatAmountUSD,\n getNativeToken,\n type PredefinedToken,\n} from \"@liberfi.io/utils\";\nimport {\n useAuth,\n useConnectedWallet,\n type AuthStatus,\n} from \"@liberfi.io/wallet-connector\";\nimport { useWalletSummary } from \"../../hooks/useWalletSummary\";\n\nexport interface UseAccountInfoResult {\n status: AuthStatus;\n signIn: () => void | Promise<void>;\n signOut: () => void | Promise<void>;\n /** Formatted USD balance for display (e.g. \"$1,234.56\"). */\n balanceUsdFormatted: string;\n /** Formatted native token amount for display (e.g. \"1.23\"). */\n balanceNativeFormatted: string;\n /** Current chain native token (address, symbol, decimals). Undefined when chain/summary not available. */\n nativeToken: PredefinedToken | undefined;\n /** Chain namespace label (e.g. \"EVM\", \"SOL\"). */\n chainNamespace: string;\n /** Connected wallet address, empty string when not connected. */\n walletAddress: string;\n}\n\n/**\n * Account info state and formatted display data for the account popover.\n * Must be used within AuthProvider and PortfolioProvider.\n */\nexport function useAccountInfo(): UseAccountInfoResult {\n const { status, signIn, signOut } = useAuth();\n const { data: summary } = useWalletSummary();\n const { chain, chainNamespace } = useCurrentChain();\n const wallet = useConnectedWallet(chain);\n\n // Use current chain for native token so it updates immediately on chain switch;\n // summary may be stale or null while the new chain's data is loading.\n const nativeToken = useMemo(() => getNativeToken(chain), [chain]);\n\n const balanceUsdFormatted = useMemo(() => {\n if (!summary?.balanceInUsd) return \"--\";\n return formatAmountUSD(summary.balanceInUsd);\n }, [summary?.balanceInUsd]);\n\n const balanceNativeFormatted = useMemo(() => {\n if (!summary?.balanceInNative) return \"--\";\n return formatAmount(summary.balanceInNative);\n }, [summary?.balanceInNative]);\n\n return {\n status,\n signIn,\n signOut,\n balanceUsdFormatted,\n balanceNativeFormatted,\n nativeToken,\n chainNamespace,\n walletAddress: wallet?.address ?? \"\",\n };\n}\n","import type { ReactNode } from \"react\";\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n ChevronDownIcon,\n cn,\n CopyIcon,\n Divider,\n PopoverContent,\n PopoverTrigger,\n SignInIcon,\n SignOutIcon,\n StyledPopover,\n StyledTooltip,\n toast,\n TokenIcon,\n useCopyToClipboard,\n useDisclosure,\n useScreen,\n WalletIcon,\n} from \"@liberfi.io/ui\";\nimport type { PredefinedToken } from \"@liberfi.io/utils\";\nimport type { AuthStatus } from \"@liberfi.io/wallet-connector\";\n\n/** Action button rendered in the popover action bar. */\nexport interface AccountAction {\n key: string;\n icon: ReactNode;\n label: string;\n onPress: () => void;\n}\n\nexport interface AccountInfoUIProps {\n status: AuthStatus;\n signIn: () => void | Promise<void>;\n signOut: () => void | Promise<void>;\n balanceUsdFormatted: string;\n balanceNativeFormatted: string;\n nativeToken: PredefinedToken | undefined;\n chainNamespace: string;\n walletAddress: string;\n /** Custom action buttons displayed before the fixed Sign Out button. */\n actions?: AccountAction[];\n}\n\nexport function AccountInfoUI({\n status,\n signIn,\n signOut,\n balanceUsdFormatted,\n balanceNativeFormatted,\n nativeToken,\n chainNamespace,\n walletAddress,\n actions,\n}: AccountInfoUIProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const { isOpen, onClose, onOpenChange } = useDisclosure();\n const copyToClipboard = useCopyToClipboard();\n\n const handleCopyWalletAddress = useCallback(() => {\n copyToClipboard(walletAddress, () =>\n toast.success(\n t(\"common.primaryAddressCopied\", {\n network: chainNamespace.toUpperCase(),\n }),\n ),\n );\n }, [copyToClipboard, chainNamespace, walletAddress]);\n\n if (status === \"unauthenticated\") {\n return (\n <Button\n isIconOnly={isMobile}\n size=\"sm\"\n color=\"primary\"\n radius=\"full\"\n disableRipple\n onPress={signIn}\n startContent={\n isMobile ? undefined : <SignInIcon width={16} height={16} />\n }\n aria-label={t(\"common.signIn\")}\n >\n {isMobile ? <SignInIcon width={16} height={16} /> : t(\"common.signIn\")}\n </Button>\n );\n }\n\n if (status === \"authenticating\") {\n return (\n <Button\n isIconOnly={isMobile}\n size=\"sm\"\n color=\"primary\"\n radius=\"full\"\n disableRipple\n isLoading\n isDisabled\n aria-label={t(\"common.signingIn\")}\n >\n {t(\"common.signingIn\")}\n </Button>\n );\n }\n\n if (status === \"deauthenticating\") {\n return (\n <Button\n isIconOnly={isMobile}\n size=\"sm\"\n color=\"primary\"\n radius=\"full\"\n disableRipple\n isLoading\n isDisabled\n aria-label={t(\"common.signingOut\")}\n >\n {t(\"common.signingOut\")}\n </Button>\n );\n }\n\n return (\n <StyledPopover\n placement={isMobile ? \"bottom\" : \"bottom-end\"}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n triggerScaleOnOpen={false}\n >\n <PopoverTrigger>\n <Button\n size=\"sm\"\n className=\"bg-content2\"\n radius=\"full\"\n disableRipple\n startContent={\n <WalletIcon width={16} height={16} className=\"text-neutral\" />\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className={cn(\n \"text-neutral transition-transform\",\n isOpen && \"rotate-180\",\n )}\n />\n }\n >\n {nativeToken && (\n <div className=\"flex items-center gap-1.5\">\n <TokenIcon symbol={nativeToken.symbol} size={16} />\n <span className=\"text-xs text-foreground\">\n {isMobile\n ? balanceNativeFormatted\n : `${balanceNativeFormatted} ${nativeToken.symbol}`}\n </span>\n </div>\n )}\n </Button>\n </PopoverTrigger>\n\n <PopoverContent>\n <div className=\"w-70 flex flex-col gap-3 py-4\">\n <div className=\"px-4 flex items-start justify-between\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-xs text-neutral\">\n {t(\"common.totalValue\")}\n </span>\n <span className=\"text-base font-semibold text-foreground\">\n {balanceUsdFormatted}\n </span>\n </div>\n\n <div className=\"flex items-start justify-end gap-0.5\">\n <StyledTooltip\n content={t(\"common.copyPrimaryAddress\", {\n network: chainNamespace.toUpperCase(),\n })}\n >\n <Button\n className=\"text-xs bg-transparent text-neutral hover:text-foreground h-4 min-h-4 gap-1\"\n startContent={<CopyIcon width={14} height={14} />}\n disableRipple\n disableAnimation\n onPress={handleCopyWalletAddress}\n >\n {chainNamespace.toUpperCase()}\n </Button>\n </StyledTooltip>\n </div>\n </div>\n\n <Divider />\n\n <div className=\"grid grid-cols-4 gap-2 px-4\">\n {actions?.map((action) => (\n <button\n key={action.key}\n type=\"button\"\n className=\"flex cursor-pointer flex-col items-center justify-center gap-1 rounded-md py-2 text-foreground transition-colors hover:text-primary\"\n onClick={() => {\n action.onPress();\n onClose();\n }}\n >\n {action.icon}\n <span className=\"w-full truncate text-center text-xs\">\n {action.label}\n </span>\n </button>\n ))}\n <button\n type=\"button\"\n className=\"flex cursor-pointer flex-col items-center justify-center gap-1 rounded-md py-2 text-danger transition-colors hover:text-danger/80\"\n onClick={() => {\n signOut();\n onClose();\n }}\n >\n <SignOutIcon width={16} height={16} />\n <span className=\"w-full truncate text-center text-xs\">\n {t(\"common.signOut\")}\n </span>\n </button>\n </div>\n </div>\n </PopoverContent>\n </StyledPopover>\n );\n}\n","import { useAccountInfo } from \"./account-info.script\";\nimport { AccountInfoUI, type AccountAction } from \"./account-info.ui\";\n\nexport interface AccountInfoWidgetProps {\n /** Custom action buttons displayed before the fixed Sign Out button. */\n actions?: AccountAction[];\n}\n\n/**\n * Account / login button with wallet overview popover.\n * Renders sign-in button when unauthenticated, loading state when\n * authenticating/deauthenticating, and a popover with balance and\n * sign-out when authenticated.\n *\n * Must be used within AuthProvider and PortfolioProvider.\n */\nexport function AccountInfoWidget({ actions }: AccountInfoWidgetProps) {\n const state = useAccountInfo();\n\n return (\n <AccountInfoUI\n status={state.status}\n signIn={state.signIn}\n signOut={state.signOut}\n balanceUsdFormatted={state.balanceUsdFormatted}\n balanceNativeFormatted={state.balanceNativeFormatted}\n nativeToken={state.nativeToken}\n chainNamespace={state.chainNamespace}\n walletAddress={state.walletAddress}\n actions={actions}\n />\n );\n}\n","import type { DistributionData, SpotHolding } from \"../types\";\n\n/**\n * Parse a decimal string to a number, returning 0 for empty / invalid values.\n */\nexport function parseDecimal(raw: string | undefined | null): number {\n if (!raw) return 0;\n const n = Number(raw);\n return Number.isFinite(n) ? n : 0;\n}\n\n/**\n * Format a number as a USD currency string.\n * - >= 1M → \"$1.2M\"\n * - >= 1K → \"$4.2K\"\n * - >= 1 → \"$1,234.56\"\n * - >= 0.01 → \"$0.42\"\n * - < 0.01 and > 0 → \"<$0.01\"\n * - 0 → \"$0.00\"\n */\nexport function formatUsd(value: number): string {\n const abs = Math.abs(value);\n const sign = value < 0 ? \"-\" : \"\";\n\n if (abs >= 1_000_000) {\n return `${sign}$${(abs / 1_000_000).toFixed(1)}M`;\n }\n if (abs >= 10_000) {\n return `${sign}$${(abs / 1_000).toFixed(1)}K`;\n }\n if (abs >= 1) {\n return `${sign}$${abs.toLocaleString(\"en-US\", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n }\n if (abs >= 0.01) {\n return `${sign}$${abs.toFixed(2)}`;\n }\n if (abs > 0) {\n return `${sign}<$0.01`;\n }\n return \"$0.00\";\n}\n\n/**\n * Format a signed USD value with + / - prefix for PnL display.\n */\nexport function formatSignedUsd(value: number): string {\n const formatted = formatUsd(Math.abs(value));\n if (value > 0) return `+${formatted}`;\n if (value < 0) return `-${formatted.replace(\"-\", \"\")}`;\n return formatted;\n}\n\n/**\n * Format a percentage value.\n * Returns \"+3.24%\" or \"-1.50%\"\n */\nexport function formatPercent(value: number): string {\n const sign = value > 0 ? \"+\" : \"\";\n return `${sign}${value.toFixed(2)}%`;\n}\n\n/**\n * Split a USD value into integer and decimal parts for display.\n * e.g., 12847.63 → { integer: \"12,847\", decimal: \".63\", sign: \"$\" }\n */\nexport function splitUsd(value: number): {\n sign: string;\n integer: string;\n decimal: string;\n} {\n const abs = Math.abs(value);\n const parts = abs.toFixed(2).split(\".\");\n const integer = Number(parts[0]).toLocaleString(\"en-US\");\n const decimal = `.${parts[1]}`;\n const sign = value < 0 ? \"-$\" : \"$\";\n return { sign, integer, decimal };\n}\n\n/**\n * Truncate an address to \"xxxx…xxxx\" format.\n */\nexport function truncateAddress(address: string, start = 4, end = 4): string {\n if (address.length <= start + end + 3) return address;\n return `${address.slice(0, start)}…${address.slice(-end)}`;\n}\n\n/**\n * Format a token balance with appropriate precision.\n */\nexport function formatTokenBalance(value: number): string {\n if (value === 0) return \"0\";\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(2)}M`;\n if (value >= 1_000)\n return value.toLocaleString(\"en-US\", { maximumFractionDigits: 2 });\n if (value >= 1) return value.toFixed(2);\n if (value >= 0.0001) return value.toFixed(4);\n return \"<0.0001\";\n}\n\n/**\n * Build a Solana explorer URL for a transaction hash.\n * Defaults to Solscan. Can be extended for other chains in the future.\n */\nexport function getExplorerUrl(txHash: string, _chain?: string): string {\n return `https://solscan.io/tx/${txHash}`;\n}\n\n// ── Distribution Helpers ────────────────────────────────────────────────────\n\nconst DISTRIBUTION_COLORS = [\n \"#C8FF00\",\n \"#00E676\",\n \"#0066FF\",\n \"#FF6B9D\",\n \"#8B7BFF\",\n \"#FF5252\",\n \"#FFB74D\",\n \"#4DD0E1\",\n];\n\nconst OTHER_COLOR = \"#3A3A4E\";\n\n/**\n * Compute asset distribution from spot holdings for the donut chart.\n * Groups tokens with < 2% into \"Other\".\n */\nexport function computeDistribution(holdings: SpotHolding[]): DistributionData {\n const totalValue = holdings.reduce((sum, h) => sum + h.value, 0);\n if (totalValue <= 0) return { items: [] };\n\n const sorted = [...holdings].sort((a, b) => b.value - a.value);\n\n const items: DistributionData[\"items\"] = [];\n let otherValue = 0;\n let colorIdx = 0;\n\n for (const h of sorted) {\n const pct = (h.value / totalValue) * 100;\n if (pct < 2) {\n otherValue += h.value;\n } else {\n items.push({\n name: h.name,\n symbol: h.symbol,\n percent: pct,\n value: h.value,\n color: DISTRIBUTION_COLORS[colorIdx % DISTRIBUTION_COLORS.length],\n });\n colorIdx++;\n }\n }\n\n if (otherValue > 0) {\n items.push({\n name: \"Other\",\n symbol: \"OTHER\",\n percent: (otherValue / totalValue) * 100,\n value: otherValue,\n color: OTHER_COLOR,\n });\n }\n\n return { items };\n}\n\n/**\n * Format an epoch-ms timestamp for display in history tables.\n */\nexport function formatTime(epochMs: number): string {\n const d = new Date(epochMs);\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { truncateAddress } from \"../../utils\";\n\nexport interface WalletOption {\n id: string;\n name: string;\n address: string;\n balance: string;\n}\n\nexport interface AddressRowUIProps {\n walletId?: string;\n wallets: WalletOption[];\n isViewing: boolean;\n viewingAddress?: string;\n onSelectWallet: (id: string | undefined) => void;\n onCopyAddress: () => void;\n onSearch: (address: string) => void;\n}\n\nexport function AddressRowUI({\n walletId,\n wallets,\n isViewing,\n viewingAddress,\n onSelectWallet,\n onCopyAddress,\n onSearch,\n}: AddressRowUIProps) {\n const [ddOpen, setDdOpen] = useState(false);\n const [searchValue, setSearchValue] = useState(\"\");\n const ddRef = useRef<HTMLDivElement>(null);\n\n const isAggregated = !walletId && !isViewing;\n const selectedWallet = wallets.find((w) => w.id === walletId);\n\n const displayLabel = isViewing\n ? \"External\"\n : isAggregated\n ? \"All Wallets\"\n : (selectedWallet?.name ?? \"\");\n\n const displayAddr = isViewing\n ? truncateAddress(viewingAddress ?? \"\")\n : isAggregated\n ? \"Aggregated\"\n : truncateAddress(selectedWallet?.address ?? \"\");\n\n const dotColor = isViewing\n ? \"bg-[#5C5C72]\"\n : isAggregated\n ? \"bg-[#C8FF00]\"\n : \"bg-[#00E676]\";\n\n const handleSearch = useCallback(() => {\n const v = searchValue.trim();\n if (v.length >= 32) {\n onSearch(v);\n setSearchValue(\"\");\n }\n }, [searchValue, onSearch]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") handleSearch();\n },\n [handleSearch],\n );\n\n return (\n <div className=\"flex items-center justify-between gap-4 pb-4\">\n {/* Left: Wallet Selector + Copy + Tag */}\n <div className=\"flex min-w-0 items-center gap-2.5\">\n {/* Wallet Selector */}\n <div className=\"relative\" ref={ddRef}>\n <button\n type=\"button\"\n className={cn(\n \"flex items-center gap-2 rounded-lg border px-2.5 py-1.5 transition-colors\",\n isViewing\n ? \"border-[rgba(200,255,0,0.2)] bg-[rgba(200,255,0,0.04)]\"\n : \"border-[#252530] bg-[#16161E] hover:border-[#35354A] hover:bg-[#1C1C26]\",\n isViewing && \"pointer-events-none\",\n )}\n onClick={() => !isViewing && setDdOpen((o) => !o)}\n >\n <span\n className={cn(\n \"h-[7px] w-[7px] flex-shrink-0 rounded-full\",\n dotColor,\n )}\n />\n <span className=\"text-[11px] font-medium text-[#A0A0B8]\">\n {displayLabel}\n </span>\n <span className=\"font-mono text-xs text-foreground\">\n {displayAddr}\n </span>\n {!isViewing && (\n <svg\n className={cn(\n \"text-[#5C5C72] transition-transform\",\n ddOpen && \"rotate-180\",\n )}\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n >\n <path\n d=\"M3 4.5L6 7.5L9 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </button>\n\n {/* Dropdown */}\n {ddOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setDdOpen(false)}\n />\n <div className=\"absolute left-0 top-[calc(100%+4px)] z-50 min-w-[260px] rounded-lg border border-[#252530] bg-[#16161E] p-1 shadow-[0_8px_32px_rgba(0,0,0,0.4)]\">\n {/* All Wallets option */}\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2 rounded-[5px] px-2.5 py-2 transition-colors hover:bg-[#1C1C26]\",\n isAggregated && \"bg-[rgba(200,255,0,0.07)]\",\n )}\n onClick={() => {\n onSelectWallet(undefined);\n setDdOpen(false);\n }}\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-[#C8FF00]\" />\n <span className=\"min-w-[60px] text-[11px] font-medium text-[#A0A0B8]\">\n All Wallets\n </span>\n <span className=\"text-[11px] text-[#3A3A4E]\">Aggregated</span>\n </button>\n\n {wallets.map((w) => (\n <button\n key={w.id}\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-2 rounded-[5px] px-2.5 py-2 transition-colors hover:bg-[#1C1C26]\",\n walletId === w.id && \"bg-[rgba(200,255,0,0.07)]\",\n )}\n onClick={() => {\n onSelectWallet(w.id);\n setDdOpen(false);\n }}\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-[#00E676]\" />\n <span className=\"min-w-[60px] text-[11px] font-medium text-[#A0A0B8]\">\n {w.name}\n </span>\n <span className=\"font-mono text-[11px] text-[#5C5C72]\">\n {truncateAddress(w.address)}\n </span>\n <span className=\"ml-auto font-mono text-[11px] font-medium text-foreground\">\n {w.balance}\n </span>\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n\n {/* Copy Button */}\n <button\n type=\"button\"\n className={cn(\n \"rounded p-1 text-[#5C5C72] transition-colors hover:bg-[#1C1C26] hover:text-[#C8FF00]\",\n isAggregated && !isViewing && \"pointer-events-none opacity-40\",\n )}\n onClick={onCopyAddress}\n disabled={isAggregated && !isViewing}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <rect\n x=\"4.5\"\n y=\"4.5\"\n width=\"7\"\n height=\"7\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n <path\n d=\"M9.5 4.5V3a1.5 1.5 0 0 0-1.5-1.5H3A1.5 1.5 0 0 0 1.5 3v5A1.5 1.5 0 0 0 3 9.5h1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.2\"\n />\n </svg>\n </button>\n\n {/* Tag */}\n <span\n className={cn(\n \"flex-shrink-0 rounded-[3px] px-1.5 py-[3px] text-[9px] font-semibold uppercase tracking-wider\",\n isViewing\n ? \"bg-[rgba(200,255,0,0.07)] text-[#C8FF00] animate-[pulse-glow_2s_ease-in-out_infinite]\"\n : \"bg-[rgba(0,230,118,0.1)] text-[#00E676]\",\n )}\n >\n {isViewing ? \"Viewing\" : \"Owner\"}\n </span>\n </div>\n\n {/* Right: Search + View */}\n <div className=\"flex flex-shrink-0 items-center gap-1.5\">\n <div className=\"flex h-[34px] w-[240px] items-center gap-1.5 rounded-lg border border-[#252530] bg-[#16161E] px-2.5 transition-all focus-within:w-[300px] focus-within:border-[#C8FF00]\">\n <svg\n className=\"flex-shrink-0 text-[#5C5C72]\"\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <circle\n cx=\"7\"\n cy=\"7\"\n r=\"5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M11 11L14.5 14.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n <input\n className=\"flex-1 border-none bg-transparent font-mono text-xs text-foreground caret-[#C8FF00] outline-none placeholder:font-sans placeholder:text-[11px] placeholder:text-[#5C5C72]\"\n placeholder=\"Search wallet address…\"\n spellCheck={false}\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n </div>\n <button\n type=\"button\"\n className=\"whitespace-nowrap rounded-[5px] border border-[#252530] bg-[#1C1C26] px-3 py-1.5 text-[11px] font-medium text-[#A0A0B8] transition-colors hover:border-[#C8FF00] hover:bg-[#C8FF00] hover:text-black\"\n onClick={handleSearch}\n >\n View\n </button>\n </div>\n </div>\n );\n}\n","import type { UseQueryResult } from \"@tanstack/react-query\";\nimport type { WalletPnl, WalletPortfolios } from \"@liberfi.io/types\";\n\n// ── Wallet Summary Types ────────────────────────────────────────────────────\n\n/** Wallet summary: balance + PnL fields flattened */\nexport type WalletSummary = Omit<WalletPortfolios, \"portfolios\"> & WalletPnl;\n\n/** Async status derived from React Query */\nexport type AsyncStatus = Pick<\n UseQueryResult,\n | \"status\"\n | \"fetchStatus\"\n | \"isLoading\"\n | \"isPending\"\n | \"isFetching\"\n | \"isRefetching\"\n | \"isError\"\n | \"isSuccess\"\n | \"error\"\n | \"dataUpdatedAt\"\n>;\n\n// ── Enums ────────────────────────────────────────────────────────────────────\n\nexport enum AssetTab {\n SPOT = \"spot\",\n PERPS = \"perps\",\n PREDICTION = \"prediction\",\n}\n\nexport enum CurveType {\n NET_WORTH = \"networth\",\n PNL = \"pnl\",\n}\n\nexport enum CurvePeriod {\n ONE_DAY = \"1D\",\n SEVEN_DAY = \"7D\",\n THIRTY_DAY = \"30D\",\n MAX = \"Max\",\n}\n\n/** Maps UI period enum to the integer value the backend expects. */\nexport const CURVE_PERIOD_VALUE: Record<CurvePeriod, number> = {\n [CurvePeriod.ONE_DAY]: 1,\n [CurvePeriod.SEVEN_DAY]: 7,\n [CurvePeriod.THIRTY_DAY]: 30,\n [CurvePeriod.MAX]: 365,\n};\n\nexport enum PerpsPositionSide {\n LONG = \"long\",\n SHORT = \"short\",\n}\n\nexport enum SpotHistoryType {\n SWAP = \"swap\",\n SEND = \"send\",\n RECEIVE = \"receive\",\n}\n\nexport enum PredictionBetStatus {\n ACTIVE = \"active\",\n PENDING = \"pending\",\n}\n\nexport enum PredictionResult {\n WON = \"won\",\n LOST = \"lost\",\n}\n\nexport enum PredictionSource {\n POLYMARKET = \"polymarket\",\n DRIFT = \"drift\",\n METADAO = \"metadao\",\n}\n\n// ── Query Params ─────────────────────────────────────────────────────────────\n\nexport interface PortfolioQuery {\n walletAddresses?: string[];\n chain?: string;\n}\n\nexport interface CurveQuery extends PortfolioQuery {\n period: number;\n}\n\nexport interface SpotHistoryQuery extends PortfolioQuery {\n cursor?: string;\n limit?: number;\n}\n\n// ── Raw API Response DTOs ───────────────────────────────────────────────────\n// These types mirror the backend proto schemas exactly (all string values).\n\nexport interface PortfolioOverviewDTO {\n totalBalanceUsd: string;\n unrealizedPnl: string;\n realizedPnl: string;\n totalProfitUsd: string;\n winRate: string;\n}\n\nexport interface ChartDataPointDTO {\n timestamp: string;\n netWorth: string;\n change: string;\n changePercent: string;\n}\n\nexport interface GetPortfolioChartReply {\n dataPoints: ChartDataPointDTO[];\n}\n\nexport interface TokenHoldingDTO {\n tokenAddress: string;\n symbol: string;\n name: string;\n imageUrl: string;\n chain: string;\n balance: string;\n priceUsd: string;\n valueUsd: string;\n priceChange24h: string;\n unrealizedPnl: string;\n realizedPnl: string;\n walletAddress: string;\n}\n\nexport interface GetSpotHoldingsReply {\n holdings: TokenHoldingDTO[];\n}\n\nexport interface TradeRecordDTO {\n type: string;\n tokenSymbol: string;\n tokenName: string;\n tokenImageUrl: string;\n tokenAddress: string;\n tokenAmount: string;\n valueUsd: string;\n priceUsd: string;\n sideTokenSymbol: string;\n sideTokenAmount: string;\n dex: string;\n txHash: string;\n chain: string;\n walletAddress: string;\n timestamp: string;\n}\n\nexport interface GetTradeHistoryReply {\n trades: TradeRecordDTO[];\n nextCursor: string;\n hasNext: boolean;\n}\n\n// ── Domain Types (UI-facing, parsed to numbers) ─────────────────────────────\n\nexport interface PortfolioOverview {\n totalValue: number;\n uPnl: number;\n realizedPnl: number;\n totalProfit: number;\n winRate: number;\n}\n\n// ── Spot Holdings ────────────────────────────────────────────────────────────\n\nexport interface SpotHolding {\n tokenAddress: string;\n name: string;\n symbol: string;\n image: string;\n chain: string;\n balance: number;\n price: number;\n value: number;\n change24h: number;\n unrealizedPnl: number;\n realizedPnl: number;\n walletAddress: string;\n /** Client-side derived: true if the token is in a verified whitelist. */\n verified: boolean;\n}\n\nexport interface SpotHoldingsData {\n holdings: SpotHolding[];\n}\n\n// ── Spot History ─────────────────────────────────────────────────────────────\n\nexport interface SpotHistoryRecord {\n type: SpotHistoryType;\n tokenSymbol: string;\n tokenName: string;\n tokenImageUrl: string;\n tokenAddress: string;\n tokenAmount: number;\n valueUsd: number;\n priceUsd: number;\n sideTokenSymbol: string;\n sideTokenAmount: number;\n dex: string;\n txHash: string;\n chain: string;\n walletAddress: string;\n timestamp: number;\n}\n\nexport interface SpotHistoryData {\n trades: SpotHistoryRecord[];\n nextCursor: string;\n hasNext: boolean;\n}\n\n// ── Curve / Chart Data ──────────────────────────────────────────────────────\n\nexport interface CurvePoint {\n timestamp: number;\n netWorth: number;\n change: number;\n changePercent: number;\n}\n\nexport interface CurveData {\n points: CurvePoint[];\n}\n\n// ── Distribution (computed client-side from holdings) ───────────────────────\n\nexport interface DistributionItem {\n name: string;\n symbol: string;\n percent: number;\n value: number;\n color: string;\n}\n\nexport interface DistributionData {\n items: DistributionItem[];\n}\n\n// ── Perps Positions (future — no backend API yet) ───────────────────────────\n\nexport interface PerpsPosition {\n id: string;\n pair: string;\n icon?: string;\n side: PerpsPositionSide;\n leverage: number;\n size: number;\n entryPrice: number;\n markPrice: number;\n uPnl: number;\n protocol: string;\n closeUrl: string;\n}\n\nexport interface PerpsPositionsData {\n positions: PerpsPosition[];\n totalValue: number;\n}\n\nexport interface PerpsTradeRecord {\n id: string;\n pair: string;\n icon?: string;\n side: PerpsPositionSide;\n size: number;\n pnl: number;\n closePrice: number;\n time: string;\n}\n\nexport interface PerpsHistoryData {\n records: PerpsTradeRecord[];\n hasMore: boolean;\n}\n\nexport interface PerpsHistoryQuery extends PortfolioQuery {\n cursor?: string;\n limit?: number;\n}\n\n// ── Prediction Bets (future — no backend API yet) ──────────────────────────\n\nexport interface PredictionBet {\n id: string;\n market: string;\n icon?: string;\n source: PredictionSource;\n expiresAt: string;\n position: \"Yes\" | \"No\";\n stake: number;\n potential: number;\n status: PredictionBetStatus;\n sellUrl: string;\n}\n\nexport interface PredictionBetsData {\n bets: PredictionBet[];\n totalValue: number;\n}\n\nexport interface PredictionSettledRecord {\n id: string;\n market: string;\n icon?: string;\n source: PredictionSource;\n position: \"Yes\" | \"No\";\n stake: number;\n result: PredictionResult;\n payout: number;\n}\n\nexport interface PredictionSettledData {\n records: PredictionSettledRecord[];\n hasMore: boolean;\n}\n\nexport interface PredictionSettledQuery extends PortfolioQuery {\n cursor?: string;\n limit?: number;\n}\n\n// ── Client Interface ─────────────────────────────────────────────────────────\n\nexport interface IPortfolioClient {\n getOverview(query?: PortfolioQuery): Promise<PortfolioOverview>;\n\n getSpotHoldings(query?: PortfolioQuery): Promise<SpotHoldingsData>;\n\n getSpotHistory(query?: SpotHistoryQuery): Promise<SpotHistoryData>;\n\n getChartData(query: CurveQuery): Promise<CurveData>;\n\n // ── Future APIs (not yet available in backend) ─────────────────────────\n getPerpsPositions(query?: PortfolioQuery): Promise<PerpsPositionsData>;\n getPerpsHistory(query?: PerpsHistoryQuery): Promise<PerpsHistoryData>;\n getPredictionBets(query?: PortfolioQuery): Promise<PredictionBetsData>;\n getPredictionSettled(\n query?: PredictionSettledQuery,\n ): Promise<PredictionSettledData>;\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport { AssetTab } from \"../../types\";\nimport { formatUsd } from \"../../utils\";\n\nexport interface AssetTabsUIProps {\n activeTab: AssetTab;\n onTabChange: (tab: AssetTab) => void;\n spotValue?: number;\n perpsValue?: number;\n predictionValue?: number;\n}\n\nconst TABS: { key: AssetTab; label: string }[] = [\n { key: AssetTab.SPOT, label: \"Spot\" },\n { key: AssetTab.PERPS, label: \"Perps\" },\n { key: AssetTab.PREDICTION, label: \"Prediction\" },\n];\n\nfunction getTabValue(\n tab: AssetTab,\n spotValue: number,\n perpsValue: number,\n predictionValue: number,\n): number {\n switch (tab) {\n case AssetTab.SPOT:\n return spotValue;\n case AssetTab.PERPS:\n return perpsValue;\n case AssetTab.PREDICTION:\n return predictionValue;\n }\n}\n\nexport function AssetTabsUI({\n activeTab,\n onTabChange,\n spotValue = 0,\n perpsValue = 0,\n predictionValue = 0,\n}: AssetTabsUIProps) {\n return (\n <div className=\"flex gap-1 border-b border-[#252530] pb-0 pt-5\">\n {TABS.map(({ key, label }) => {\n const isActive = activeTab === key;\n const value = getTabValue(key, spotValue, perpsValue, predictionValue);\n return (\n <button\n key={key}\n type=\"button\"\n className={cn(\n \"relative flex items-center gap-2 border-b-2 px-4 pb-3 pt-2.5 text-[13px] font-medium transition-colors\",\n isActive\n ? \"border-[#C8FF00] text-foreground\"\n : \"border-transparent text-[#5C5C72] hover:text-[#A0A0B8]\",\n )}\n onClick={() => onTabChange(key)}\n >\n {label}\n {!isActive && (\n <span className=\"rounded-[10px] bg-[#16161E] px-2 py-0.5 font-mono text-[11px] text-[#5C5C72]\">\n {formatUsd(value)}\n </span>\n )}\n </button>\n );\n })}\n </div>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { PortfolioOverview } from \"../../types\";\nimport { formatSignedUsd, splitUsd } from \"../../utils\";\n\nexport interface BalanceRowUIProps {\n overview?: PortfolioOverview;\n}\n\nexport function BalanceRowUI({ overview }: BalanceRowUIProps) {\n const totalValue = overview?.totalValue ?? 0;\n const uPnl = overview?.uPnl ?? 0;\n const realized = overview?.realizedPnl ?? 0;\n const totalProfit = overview?.totalProfit ?? 0;\n\n const { sign, integer, decimal } = splitUsd(totalValue);\n\n return (\n <div className=\"flex items-center gap-4 pb-4\">\n {/* Left: Balance */}\n <div className=\"flex items-baseline gap-3\">\n <div className=\"font-mono text-[26px] font-bold leading-none tracking-tight\">\n <span className=\"mr-px text-lg font-medium text-[#C8FF00]\">\n {sign}\n </span>\n {integer}\n <span className=\"text-base font-normal text-[#5C5C72]\">\n {decimal}\n </span>\n </div>\n </div>\n\n {/* Right: uPNL Indicators */}\n <div className=\"ml-auto flex items-center gap-3\">\n <PnlItem label=\"uPNL\" value={uPnl} />\n <Separator />\n <PnlItem label=\"Realized\" value={realized} />\n <Separator />\n <PnlItem label=\"Total Profit\" value={totalProfit} />\n </div>\n </div>\n );\n}\n\nfunction PnlItem({ label, value }: { label: string; value: number }) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[11px] text-[#5C5C72]\">{label}</span>\n <span\n className={cn(\n \"font-mono text-xs font-medium\",\n value > 0\n ? \"text-[#00E676]\"\n : value < 0\n ? \"text-[#FF5252]\"\n : \"text-[#5C5C72]\",\n )}\n >\n {formatSignedUsd(value)}\n </span>\n </div>\n );\n}\n\nfunction Separator() {\n return <div className=\"h-3.5 w-px bg-[#252530]\" />;\n}\n","import { useMemo } from \"react\";\nimport {\n Area,\n AreaChart,\n ReferenceLine,\n ResponsiveContainer,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { CurvePeriod, CurveType, type CurveData } from \"../../types\";\n\nexport interface CurveCardUIProps {\n curveType: CurveType;\n curvePeriod: CurvePeriod;\n data?: CurveData;\n isLoading?: boolean;\n onTypeChange: (type: CurveType) => void;\n onPeriodChange: (period: CurvePeriod) => void;\n}\n\nconst PERIODS: CurvePeriod[] = [\n CurvePeriod.ONE_DAY,\n CurvePeriod.SEVEN_DAY,\n CurvePeriod.THIRTY_DAY,\n CurvePeriod.MAX,\n];\n\nfunction formatTimeLabel(ts: number, period: CurvePeriod): string {\n const d = new Date(ts);\n switch (period) {\n case CurvePeriod.ONE_DAY:\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n default:\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n }\n}\n\n/** The dataKey determines which field of CurvePoint the chart displays. */\nfunction getDataKey(curveType: CurveType): string {\n return curveType === CurveType.PNL ? \"change\" : \"netWorth\";\n}\n\nexport function CurveCardUI({\n curveType,\n curvePeriod,\n data,\n isLoading,\n onTypeChange,\n onPeriodChange,\n}: CurveCardUIProps) {\n const points = data?.points ?? [];\n const dataKey = getDataKey(curveType);\n const isPnl = curveType === CurveType.PNL;\n\n const displayValues = useMemo(\n () => points.map((p) => (isPnl ? p.change : p.netWorth)),\n [points, isPnl],\n );\n\n const hasNegative = displayValues.some((v) => v < 0);\n\n const { minVal, maxVal } = useMemo(() => {\n if (displayValues.length === 0) return { minVal: 0, maxVal: 100 };\n const min = Math.min(...displayValues);\n const max = Math.max(...displayValues);\n const range = max - min || 1;\n return {\n minVal: min - range * 0.1,\n maxVal: max + range * 0.1,\n };\n }, [displayValues]);\n\n const timeLabels = useMemo(() => {\n if (points.length === 0) return [];\n const count = Math.min(7, points.length);\n const step = Math.max(1, Math.floor((points.length - 1) / (count - 1)));\n const labels: { ts: number; label: string }[] = [];\n for (let i = 0; i < points.length; i += step) {\n labels.push({\n ts: points[i].timestamp,\n label: formatTimeLabel(points[i].timestamp, curvePeriod),\n });\n }\n // Always include last\n const last = points[points.length - 1];\n if (labels[labels.length - 1]?.ts !== last.timestamp) {\n labels.push({\n ts: last.timestamp,\n label: formatTimeLabel(last.timestamp, curvePeriod),\n });\n }\n return labels;\n }, [points, curvePeriod]);\n\n const lastValue = displayValues[displayValues.length - 1] ?? 0;\n\n return (\n <div className=\"overflow-hidden rounded-lg border border-[#252530] bg-[#0F0F16]\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 pt-3\">\n {/* Type Tabs */}\n <div className=\"flex gap-0.5 rounded-[5px] bg-[#16161E] p-0.5\">\n <TypeTab\n label=\"Net Worth\"\n active={curveType === CurveType.NET_WORTH}\n onClick={() => onTypeChange(CurveType.NET_WORTH)}\n />\n <TypeTab\n label=\"PNL\"\n active={curveType === CurveType.PNL}\n onClick={() => onTypeChange(CurveType.PNL)}\n />\n </div>\n\n {/* Period Buttons */}\n <div className=\"flex gap-0.5\">\n {PERIODS.map((p) => (\n <button\n key={p}\n type=\"button\"\n className={cn(\n \"rounded-[3px] px-2 py-1 text-[10px] font-medium transition-colors\",\n curvePeriod === p\n ? \"bg-[rgba(200,255,0,0.07)] text-[#C8FF00]\"\n : \"text-[#5C5C72] hover:bg-[#16161E] hover:text-[#A0A0B8]\",\n )}\n onClick={() => onPeriodChange(p)}\n >\n {p}\n </button>\n ))}\n </div>\n </div>\n\n {/* Chart Area */}\n <div className=\"h-[180px] px-4 pt-2\">\n {isLoading || points.length < 2 ? (\n <div className=\"flex h-full items-center justify-center\">\n <span className=\"text-xs text-[#5C5C72]\">\n {isLoading ? \"\" : \"Not enough data\"}\n </span>\n </div>\n ) : (\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart\n data={points}\n margin={{ top: 8, right: 0, left: 0, bottom: 0 }}\n >\n <defs>\n <linearGradient id=\"gradAccent\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#C8FF00\" stopOpacity={0.12} />\n <stop offset=\"100%\" stopColor=\"#C8FF00\" stopOpacity={0} />\n </linearGradient>\n <linearGradient id=\"gradGreen\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#00E676\" stopOpacity={0.12} />\n <stop offset=\"100%\" stopColor=\"#00E676\" stopOpacity={0} />\n </linearGradient>\n <linearGradient id=\"gradRed\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor=\"#FF5252\" stopOpacity={0} />\n <stop offset=\"100%\" stopColor=\"#FF5252\" stopOpacity={0.1} />\n </linearGradient>\n </defs>\n\n <XAxis dataKey=\"timestamp\" hide />\n <YAxis hide domain={[minVal, maxVal]} />\n\n {isPnl && hasNegative && (\n <ReferenceLine\n y={0}\n stroke=\"rgba(255,255,255,0.06)\"\n strokeDasharray=\"4 4\"\n />\n )}\n\n <Area\n type=\"monotone\"\n dataKey={dataKey}\n stroke={\n isPnl ? (lastValue >= 0 ? \"#00E676\" : \"#FF5252\") : \"#C8FF00\"\n }\n strokeWidth={1.5}\n fill={\n isPnl\n ? lastValue >= 0\n ? \"url(#gradGreen)\"\n : \"url(#gradRed)\"\n : \"url(#gradAccent)\"\n }\n dot={false}\n isAnimationActive={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n )}\n </div>\n\n {/* Time Axis */}\n <div className=\"flex justify-between px-4 pb-2.5 pt-1\">\n {timeLabels.map(({ ts, label }) => (\n <span key={ts} className=\"font-mono text-[9px] text-[#3A3A4E]\">\n {label}\n </span>\n ))}\n </div>\n </div>\n );\n}\n\nfunction TypeTab({\n label,\n active,\n onClick,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"rounded px-2.5 py-1 text-[11px] font-medium transition-colors\",\n active\n ? \"bg-[#1C1C26] text-foreground\"\n : \"text-[#5C5C72] hover:text-[#A0A0B8]\",\n )}\n onClick={onClick}\n >\n {label}\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport { Cell, Pie, PieChart, ResponsiveContainer } from \"recharts\";\nimport type { DistributionData } from \"../../types\";\nimport { formatUsd } from \"../../utils\";\n\nexport interface DistributionCardUIProps {\n data?: DistributionData;\n isLoading?: boolean;\n}\n\nexport function DistributionCardUI({\n data,\n isLoading,\n}: DistributionCardUIProps) {\n const items = data?.items ?? [];\n\n const chartData = useMemo(\n () => items.map((item) => ({ name: item.name, value: item.percent })),\n [items],\n );\n\n return (\n <div className=\"flex flex-col overflow-hidden rounded-lg border border-[#252530] bg-[#0F0F16]\">\n {/* Header */}\n <div className=\"px-4 pb-2 pt-3\">\n <span className=\"text-xs font-semibold text-[#A0A0B8]\">\n Distribution\n </span>\n </div>\n\n {/* Pie Chart */}\n <div className=\"flex flex-1 items-center justify-center px-4\">\n {isLoading || items.length === 0 ? (\n <div className=\"flex h-[140px] w-[140px] items-center justify-center\">\n <span className=\"text-xs text-[#5C5C72]\">\n {isLoading ? \"\" : \"No data\"}\n </span>\n </div>\n ) : (\n <ResponsiveContainer width={140} height={140}>\n <PieChart>\n <Pie\n data={chartData}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={32}\n outerRadius={55}\n dataKey=\"value\"\n stroke=\"none\"\n isAnimationActive={false}\n >\n {items.map((item, idx) => (\n <Cell key={idx} fill={item.color} />\n ))}\n </Pie>\n </PieChart>\n </ResponsiveContainer>\n )}\n </div>\n\n {/* Legend */}\n <div className=\"px-4 pb-3 pt-2\">\n {items.map((item, idx) => (\n <div\n key={idx}\n className=\"flex items-center gap-1.5 py-[3px] text-[11px]\"\n >\n <span\n className=\"h-[7px] w-[7px] flex-shrink-0 rounded-[2px]\"\n style={{ background: item.color }}\n />\n <span className=\"min-w-0 flex-1 truncate text-[#A0A0B8]\">\n {item.name}\n </span>\n <span className=\"font-mono text-[10px] text-[#5C5C72]\">\n {item.percent.toFixed(1)}%\n </span>\n <span className=\"min-w-[55px] text-right font-mono text-[10px] text-foreground\">\n {formatUsd(item.value)}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useContext } from \"react\";\nimport { PortfolioClientContext } from \"../contexts\";\n\nexport function usePortfolioClient() {\n const client = useContext(PortfolioClientContext);\n if (!client) {\n throw new Error(\n \"usePortfolioClient must be used within a PortfolioClientProvider\",\n );\n }\n return client;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PortfolioOverview,\n PortfolioQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function overviewQueryKey(query?: PortfolioQuery): unknown[] {\n return [\"portfolio\", \"overview\", query ?? {}];\n}\n\nexport async function fetchOverview(\n client: IPortfolioClient,\n query?: PortfolioQuery,\n): Promise<PortfolioOverview> {\n return await client.getOverview(query);\n}\n\nexport function useOverviewQuery(\n query?: PortfolioQuery,\n queryOptions: Omit<\n UseQueryOptions<PortfolioOverview, Error, PortfolioOverview, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: overviewQueryKey(query),\n queryFn: async () => fetchOverview(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PortfolioQuery,\n SpotHoldingsData,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function spotHoldingsQueryKey(query?: PortfolioQuery): unknown[] {\n return [\"portfolio\", \"spot\", \"holdings\", query ?? {}];\n}\n\nexport async function fetchSpotHoldings(\n client: IPortfolioClient,\n query?: PortfolioQuery,\n): Promise<SpotHoldingsData> {\n return await client.getSpotHoldings(query);\n}\n\nexport function useSpotHoldingsQuery(\n query?: PortfolioQuery,\n queryOptions: Omit<\n UseQueryOptions<SpotHoldingsData, Error, SpotHoldingsData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: spotHoldingsQueryKey(query),\n queryFn: async () => fetchSpotHoldings(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n SpotHistoryData,\n SpotHistoryQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function spotHistoryQueryKey(query?: SpotHistoryQuery): unknown[] {\n return [\"portfolio\", \"spot\", \"history\", query ?? {}];\n}\n\nexport async function fetchSpotHistory(\n client: IPortfolioClient,\n query?: SpotHistoryQuery,\n): Promise<SpotHistoryData> {\n return await client.getSpotHistory(query);\n}\n\nexport function useSpotHistoryQuery(\n query?: SpotHistoryQuery,\n queryOptions: Omit<\n UseQueryOptions<SpotHistoryData, Error, SpotHistoryData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: spotHistoryQueryKey(query),\n queryFn: async () => fetchSpotHistory(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PerpsPositionsData,\n PortfolioQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function perpsPositionsQueryKey(query?: PortfolioQuery): unknown[] {\n return [\"portfolio\", \"perps\", \"positions\", query ?? {}];\n}\n\nexport async function fetchPerpsPositions(\n client: IPortfolioClient,\n query?: PortfolioQuery,\n): Promise<PerpsPositionsData> {\n return await client.getPerpsPositions(query);\n}\n\nexport function usePerpsPositionsQuery(\n query?: PortfolioQuery,\n queryOptions: Omit<\n UseQueryOptions<PerpsPositionsData, Error, PerpsPositionsData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: perpsPositionsQueryKey(query),\n queryFn: async () => fetchPerpsPositions(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PerpsHistoryData,\n PerpsHistoryQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function perpsHistoryQueryKey(query?: PerpsHistoryQuery): unknown[] {\n return [\"portfolio\", \"perps\", \"history\", query ?? {}];\n}\n\nexport async function fetchPerpsHistory(\n client: IPortfolioClient,\n query?: PerpsHistoryQuery,\n): Promise<PerpsHistoryData> {\n return await client.getPerpsHistory(query);\n}\n\nexport function usePerpsHistoryQuery(\n query?: PerpsHistoryQuery,\n queryOptions: Omit<\n UseQueryOptions<PerpsHistoryData, Error, PerpsHistoryData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: perpsHistoryQueryKey(query),\n queryFn: async () => fetchPerpsHistory(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PortfolioQuery,\n PredictionBetsData,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function predictionBetsQueryKey(query?: PortfolioQuery): unknown[] {\n return [\"portfolio\", \"prediction\", \"active\", query ?? {}];\n}\n\nexport async function fetchPredictionBets(\n client: IPortfolioClient,\n query?: PortfolioQuery,\n): Promise<PredictionBetsData> {\n return await client.getPredictionBets(query);\n}\n\nexport function usePredictionBetsQuery(\n query?: PortfolioQuery,\n queryOptions: Omit<\n UseQueryOptions<PredictionBetsData, Error, PredictionBetsData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: predictionBetsQueryKey(query),\n queryFn: async () => fetchPredictionBets(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPortfolioClient,\n PredictionSettledData,\n PredictionSettledQuery,\n} from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function predictionSettledQueryKey(\n query?: PredictionSettledQuery,\n): unknown[] {\n return [\"portfolio\", \"prediction\", \"settled\", query ?? {}];\n}\n\nexport async function fetchPredictionSettled(\n client: IPortfolioClient,\n query?: PredictionSettledQuery,\n): Promise<PredictionSettledData> {\n return await client.getPredictionSettled(query);\n}\n\nexport function usePredictionSettledQuery(\n query?: PredictionSettledQuery,\n queryOptions: Omit<\n UseQueryOptions<\n PredictionSettledData,\n Error,\n PredictionSettledData,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: predictionSettledQueryKey(query),\n queryFn: async () => fetchPredictionSettled(client, query),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { CurveData, CurveQuery, IPortfolioClient } from \"../types\";\nimport { usePortfolioClient } from \"./usePortfolioClient\";\n\nexport function curveDataQueryKey(query: CurveQuery): unknown[] {\n return [\"portfolio\", \"chart\", query];\n}\n\nexport async function fetchCurveData(\n client: IPortfolioClient,\n query: CurveQuery,\n): Promise<CurveData> {\n return await client.getChartData(query);\n}\n\nexport function useCurveDataQuery(\n query: CurveQuery,\n queryOptions: Omit<\n UseQueryOptions<CurveData, Error, CurveData, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePortfolioClient();\n return useQuery({\n queryKey: curveDataQueryKey(query),\n queryFn: async () => fetchCurveData(client, query),\n ...queryOptions,\n });\n}\n","import { useMemo } from \"react\";\nimport type { DistributionData, SpotHolding } from \"../types\";\nimport { computeDistribution } from \"../utils\";\n\nexport function distributionQueryKey(): unknown[] {\n return [\"portfolio\", \"distribution\"];\n}\n\n/**\n * Compute distribution data from spot holdings (client-side).\n * No backend API required — derives from existing holdings data.\n */\nexport function useDistributionQuery(holdings: SpotHolding[]): {\n data: DistributionData;\n} {\n const data = useMemo(() => computeDistribution(holdings), [holdings]);\n return { data };\n}\n","import { usePortfolioContext } from \"./usePortfolioContext\";\n\n/**\n * Returns a function that triggers a wallet summary refetch.\n *\n * Must be used within a `<PortfolioProvider>`. The refetch targets the wallet\n * identified by the `address` prop passed to the nearest `PortfolioProvider`.\n */\nexport function useRefetchWalletSummary() {\n const { refetchSummary } = usePortfolioContext();\n return refetchSummary;\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n useWalletPortfoliosByTokensQuery,\n useWalletPortfolioPnlsByTokensQuery,\n useWalletPortfoliosSubscription,\n useWalletPortfolioPnlsSubscription,\n} from \"@liberfi.io/react\";\nimport type { API, Chain, Portfolio, PortfolioPnl } from \"@liberfi.io/types\";\n\nconst DEFAULT_POLL_MS = 15_000;\n\n/** Pick only defined (non-undefined) entries from an object. */\nfunction definedEntries<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\nexport interface UseWalletPortfoliosParams {\n chain: Chain;\n /** Wallet address */\n address: string;\n /** Token addresses to track */\n tokenAddresses: string[];\n /** Polling interval in ms (default 15 000) */\n pollMs?: number;\n}\n\nexport interface TokenPortfolio extends Portfolio {\n pnl: PortfolioPnl | null;\n}\n\nexport function useWalletPortfolios({\n chain,\n address,\n tokenAddresses,\n pollMs = DEFAULT_POLL_MS,\n}: UseWalletPortfoliosParams) {\n const active = !!address && tokenAddresses.length > 0;\n\n const [tokens, setTokens] = useState<Record<string, TokenPortfolio>>({});\n\n // ── Queries (polling) ─────────────────────────────────────────────────────\n\n const portfolioQuery = useWalletPortfoliosByTokensQuery(\n { chain, address, tokenAddresses },\n { enabled: active, refetchInterval: pollMs },\n );\n\n const pnlQuery = useWalletPortfolioPnlsByTokensQuery(\n { chain, address, tokenAddresses },\n { enabled: active, refetchInterval: pollMs },\n );\n\n // ── Sync query data → local state ─────────────────────────────────────────\n\n useEffect(() => {\n const portfolios = portfolioQuery.data ?? [];\n\n const pnlMap = new Map<string, PortfolioPnl>();\n if (pnlQuery.data) {\n for (const p of pnlQuery.data) {\n pnlMap.set(p.address, p);\n }\n }\n\n const next: Record<string, TokenPortfolio> = {};\n for (const portfolio of portfolios) {\n next[portfolio.address] = {\n ...portfolio,\n pnl: pnlMap.get(portfolio.address) ?? null,\n };\n }\n setTokens(next);\n }, [portfolioQuery.data, pnlQuery.data]);\n\n // ── Subscriptions (real-time) ─────────────────────────────────────────────\n\n const tokenKeyRef = useRef(\"\");\n const tokenSetRef = useRef(new Set<string>());\n const tokenKey = tokenAddresses.slice().sort().join(\",\");\n if (tokenKey !== tokenKeyRef.current) {\n tokenKeyRef.current = tokenKey;\n tokenSetRef.current = new Set(tokenAddresses);\n }\n const tokenSet = tokenSetRef.current;\n\n useWalletPortfoliosSubscription(\n { chain, address },\n (subscribed: Array<API.PortfolioSubscribed>) => {\n setTokens((prev) => {\n let updated = prev;\n for (const s of subscribed) {\n if (!tokenSet.has(s.tokenAddress)) continue;\n const existing = updated[s.tokenAddress];\n if (!existing) continue;\n\n const { chain: _c, walletAddress: _w, tokenAddress: _t, ...rest } = s;\n const patch = definedEntries(rest);\n if (Object.keys(patch).length === 0) continue;\n\n updated = updated === prev ? { ...prev } : updated;\n updated[s.tokenAddress] = { ...existing, ...patch };\n }\n return updated;\n });\n },\n { enabled: active },\n );\n\n useWalletPortfolioPnlsSubscription(\n { chain, address },\n (subscribed: Array<API.PortfolioPnlSubscribed>) => {\n setTokens((prev) => {\n let updated = prev;\n for (const s of subscribed) {\n if (!tokenSet.has(s.tokenAddress)) continue;\n const existing = updated[s.tokenAddress];\n if (!existing || !existing.pnl) continue;\n\n const { walletAddress: _w, tokenAddress: _t, ...rest } = s;\n const patch = definedEntries(rest);\n if (Object.keys(patch).length === 0) continue;\n\n updated = updated === prev ? { ...prev } : updated;\n updated[s.tokenAddress] = {\n ...existing,\n pnl: { ...existing.pnl, ...patch },\n };\n }\n return updated;\n });\n },\n { enabled: active },\n );\n\n // ── Refetch ───────────────────────────────────────────────────────────────\n\n const refetch = useCallback(async () => {\n await Promise.all([portfolioQuery.refetch(), pnlQuery.refetch()]);\n }, [portfolioQuery.refetch, pnlQuery.refetch]);\n\n // ── Return ────────────────────────────────────────────────────────────────\n\n return {\n tokens,\n\n isPending: portfolioQuery.isPending,\n isFetching: portfolioQuery.isFetching || pnlQuery.isFetching,\n isError: portfolioQuery.isError,\n isSuccess: portfolioQuery.isSuccess,\n error: portfolioQuery.error,\n\n refetch,\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n useCurveDataQuery,\n useDistributionQuery,\n useOverviewQuery,\n useSpotHoldingsQuery,\n} from \"../../hooks\";\nimport {\n AssetTab,\n CURVE_PERIOD_VALUE,\n CurvePeriod,\n CurveType,\n type PortfolioQuery,\n} from \"../../types\";\n\nexport interface UsePortfolioPageOptions {\n defaultTab?: AssetTab;\n /** Wallet addresses to query. Undefined = no data fetched. */\n walletAddresses?: string[];\n /** Chain identifier (e.g. \"solana\"). */\n chain?: string;\n}\n\nexport function usePortfolioPage(options?: UsePortfolioPageOptions) {\n const { defaultTab = AssetTab.SPOT, walletAddresses, chain } = options ?? {};\n\n // ── Core state ──────────────────────────────────────────────────────\n const [activeTab, setActiveTab] = useState<AssetTab>(defaultTab);\n const [walletId, setWalletId] = useState<string | undefined>(undefined);\n const [viewingAddress, setViewingAddress] = useState<string | undefined>(\n undefined,\n );\n const [curveType, setCurveType] = useState<CurveType>(CurveType.NET_WORTH);\n const [curvePeriod, setCurvePeriod] = useState<CurvePeriod>(\n CurvePeriod.SEVEN_DAY,\n );\n\n const isViewing = viewingAddress !== undefined;\n\n // ── Query params ────────────────────────────────────────────────────\n const portfolioQuery: PortfolioQuery | undefined = useMemo(() => {\n if (viewingAddress) {\n return { walletAddresses: [viewingAddress], chain };\n }\n if (walletAddresses?.length) {\n return { walletAddresses, chain };\n }\n return undefined;\n }, [walletAddresses, viewingAddress, chain]);\n\n // ── Data queries ────────────────────────────────────────────────────\n const overviewQuery = useOverviewQuery(portfolioQuery);\n\n const spotHoldingsQuery = useSpotHoldingsQuery(portfolioQuery);\n\n const curveQuery = useCurveDataQuery({\n period: CURVE_PERIOD_VALUE[curvePeriod],\n ...portfolioQuery,\n });\n\n // Distribution is computed client-side from spot holdings\n const distributionResult = useDistributionQuery(\n spotHoldingsQuery.data?.holdings ?? [],\n );\n\n // Compute per-tab values from available data\n const spotValue = useMemo(() => {\n return (\n spotHoldingsQuery.data?.holdings.reduce((sum, h) => sum + h.value, 0) ?? 0\n );\n }, [spotHoldingsQuery.data]);\n\n // ── Actions ─────────────────────────────────────────────────────────\n const enterViewing = useCallback((address: string) => {\n setViewingAddress(address);\n }, []);\n\n const exitViewing = useCallback(() => {\n setViewingAddress(undefined);\n }, []);\n\n const selectWallet = useCallback((id: string | undefined) => {\n setWalletId(id);\n }, []);\n\n return {\n // State\n activeTab,\n setActiveTab,\n walletId,\n selectWallet,\n viewingAddress,\n isViewing,\n curveType,\n setCurveType,\n curvePeriod,\n setCurvePeriod,\n\n // Query params (for child components to reuse)\n portfolioQuery,\n\n // Data\n overviewQuery,\n curveQuery,\n distributionQuery: distributionResult,\n spotHoldingsQuery,\n\n // Tab values\n spotValue,\n perpsValue: 0,\n predictionValue: 0,\n\n // Actions\n enterViewing,\n exitViewing,\n };\n}\n\nexport type UsePortfolioPageResult = ReturnType<typeof usePortfolioPage>;\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport function PortfolioPageSkeleton() {\n return (\n <div className=\"mx-auto max-w-[1280px] px-6\">\n {/* Asset Tabs Skeleton */}\n <div className=\"flex gap-4 border-b border-[#252530] pb-0 pt-5\">\n <Skeleton className=\"h-9 w-16 rounded-md\" />\n <Skeleton className=\"h-9 w-28 rounded-md\" />\n <Skeleton className=\"h-9 w-32 rounded-md\" />\n </div>\n\n {/* Address Row Skeleton */}\n <div className=\"flex items-center justify-between gap-4 py-4\">\n <div className=\"flex items-center gap-2.5\">\n <Skeleton className=\"h-8 w-48 rounded-lg\" />\n <Skeleton className=\"h-6 w-6 rounded\" />\n <Skeleton className=\"h-5 w-14 rounded-[3px]\" />\n </div>\n <div className=\"flex items-center gap-1.5\">\n <Skeleton className=\"h-[34px] w-[240px] rounded-lg\" />\n <Skeleton className=\"h-[34px] w-12 rounded-[5px]\" />\n </div>\n </div>\n\n {/* Balance Row Skeleton */}\n <div className=\"flex items-center gap-4 pb-4\">\n <div className=\"flex items-baseline gap-3\">\n <Skeleton className=\"h-8 w-48 rounded-md\" />\n <Skeleton className=\"h-6 w-16 rounded\" />\n </div>\n <div className=\"ml-auto flex items-center gap-3\">\n <Skeleton className=\"h-4 w-28 rounded\" />\n <div className=\"h-3.5 w-px bg-[#252530]\" />\n <Skeleton className=\"h-4 w-28 rounded\" />\n <div className=\"h-3.5 w-px bg-[#252530]\" />\n <Skeleton className=\"h-4 w-20 rounded\" />\n </div>\n </div>\n\n {/* Dashboard Grid Skeleton */}\n <div className=\"grid grid-cols-[1fr_340px] gap-3 pb-4\">\n {/* Curve Card */}\n <div className=\"rounded-lg border border-[#252530] bg-[#0F0F16] p-4\">\n <div className=\"flex items-center justify-between pb-4\">\n <Skeleton className=\"h-7 w-40 rounded-[5px]\" />\n <Skeleton className=\"h-6 w-32 rounded\" />\n </div>\n <Skeleton className=\"h-[180px] w-full rounded-md\" />\n <div className=\"mt-2 flex justify-between\">\n {Array.from({ length: 7 }).map((_, i) => (\n <Skeleton key={i} className=\"h-3 w-8 rounded\" />\n ))}\n </div>\n </div>\n {/* Distribution Card */}\n <div className=\"rounded-lg border border-[#252530] bg-[#0F0F16] p-4\">\n <Skeleton className=\"mb-3 h-4 w-24 rounded\" />\n <div className=\"flex items-center justify-center py-4\">\n <Skeleton className=\"h-[140px] w-[140px] rounded-full\" />\n </div>\n <div className=\"space-y-1.5 pt-2\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton key={i} className=\"h-4 w-full rounded\" />\n ))}\n </div>\n </div>\n </div>\n\n {/* Holdings Skeleton */}\n <div className=\"pb-6\">\n <div className=\"flex items-center justify-between pb-3\">\n <Skeleton className=\"h-8 w-40 rounded-[5px]\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-7 w-40 rounded-[5px]\" />\n <Skeleton className=\"h-7 w-24 rounded-[5px]\" />\n </div>\n </div>\n <Skeleton className=\"mb-3 h-5 w-full rounded\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <Skeleton key={i} className=\"mb-2 h-12 w-full rounded-[5px]\" />\n ))}\n </div>\n </div>\n );\n}\n","import { truncateAddress } from \"../../utils\";\n\nexport interface ViewingBannerUIProps {\n viewingAddress: string;\n onBack: () => void;\n}\n\nexport function ViewingBannerUI({\n viewingAddress,\n onBack,\n}: ViewingBannerUIProps) {\n return (\n <div className=\"flex items-center justify-between border-b border-[rgba(200,255,0,0.12)] bg-[rgba(200,255,0,0.06)] px-6 py-2\">\n <div className=\"flex items-center gap-2\">\n {/* Eye Icon */}\n <div className=\"flex h-[18px] w-[18px] items-center justify-center rounded-full border border-[rgba(200,255,0,0.25)] bg-[rgba(200,255,0,0.07)]\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3C4.36 3 1.26 5.28 0 8.5c1.26 3.22 4.36 5.5 8 5.5s6.74-2.28 8-5.5C14.74 5.28 11.64 3 8 3z\"\n stroke=\"#C8FF00\"\n strokeWidth=\"1.3\"\n fill=\"none\"\n />\n <circle\n cx=\"8\"\n cy=\"8.5\"\n r=\"2.5\"\n stroke=\"#C8FF00\"\n strokeWidth=\"1.3\"\n fill=\"none\"\n />\n </svg>\n </div>\n <span className=\"text-xs font-medium text-[#C8FF00]\">\n Viewing external portfolio\n </span>\n <span className=\"ml-1 font-mono text-[11px] text-[#A0A0B8]\">\n {truncateAddress(viewingAddress)}\n </span>\n </div>\n\n <button\n type=\"button\"\n className=\"flex items-center gap-1.5 rounded-[5px] border border-[#252530] bg-[#1C1C26] px-3 py-1.5 text-[11px] font-medium text-[#A0A0B8] transition-colors hover:border-[#C8FF00] hover:bg-[#C8FF00] hover:text-black\"\n onClick={onBack}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M10 2L4 8l6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n Back to My Portfolio\n </button>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { AssetTab, PortfolioQuery } from \"../../types\";\nimport { AddressRowUI, type WalletOption } from \"./address-row.ui\";\nimport { AssetTabsUI } from \"./asset-tabs.ui\";\nimport { BalanceRowUI } from \"./balance-row.ui\";\nimport { CurveCardUI } from \"./curve-card.ui\";\nimport { DistributionCardUI } from \"./distribution-card.ui\";\nimport {\n usePortfolioPage,\n type UsePortfolioPageOptions,\n} from \"./portfolio-page.script\";\nimport { PortfolioPageSkeleton } from \"./portfolio-page.skeleton\";\nimport { ViewingBannerUI } from \"./viewing-banner.ui\";\n\nexport interface PortfolioPageWidgetProps extends UsePortfolioPageOptions {\n wallets?: WalletOption[];\n onCopyAddress?: (address: string) => void;\n /** Render prop for the Holdings section — receives activeTab + portfolioQuery + isViewing */\n renderHoldings?: (props: {\n activeTab: AssetTab;\n portfolioQuery?: PortfolioQuery;\n isViewing: boolean;\n }) => ReactNode;\n isLoading?: boolean;\n}\n\nexport function PortfolioPageWidget({\n wallets = [],\n onCopyAddress,\n renderHoldings,\n isLoading: externalLoading,\n ...options\n}: PortfolioPageWidgetProps) {\n const state = usePortfolioPage(options);\n\n const {\n activeTab,\n setActiveTab,\n walletId,\n selectWallet,\n viewingAddress,\n isViewing,\n curveType,\n setCurveType,\n curvePeriod,\n setCurvePeriod,\n portfolioQuery,\n overviewQuery,\n curveQuery,\n distributionQuery,\n spotValue,\n perpsValue,\n predictionValue,\n enterViewing,\n exitViewing,\n } = state;\n\n const isPageLoading =\n externalLoading || (overviewQuery.isLoading && !overviewQuery.data);\n\n if (isPageLoading) {\n return <PortfolioPageSkeleton />;\n }\n\n const handleCopyAddress = () => {\n if (isViewing && viewingAddress) {\n onCopyAddress?.(viewingAddress);\n } else {\n const wallet = wallets.find((w) => w.id === walletId);\n if (wallet) onCopyAddress?.(wallet.address);\n }\n };\n\n return (\n <div>\n {/* Viewing Banner */}\n {isViewing && viewingAddress && (\n <ViewingBannerUI viewingAddress={viewingAddress} onBack={exitViewing} />\n )}\n\n <div className=\"mx-auto max-w-[1280px] px-6\">\n {/* 1. Asset Type Tabs */}\n <AssetTabsUI\n activeTab={activeTab}\n onTabChange={setActiveTab}\n spotValue={spotValue}\n perpsValue={perpsValue}\n predictionValue={predictionValue}\n />\n\n {/* 2. Address + Search Row */}\n <AddressRowUI\n walletId={walletId}\n wallets={wallets}\n isViewing={isViewing}\n viewingAddress={viewingAddress}\n onSelectWallet={selectWallet}\n onCopyAddress={handleCopyAddress}\n onSearch={enterViewing}\n />\n\n {/* 3. Balance + uPNL Row */}\n <BalanceRowUI overview={overviewQuery.data} />\n\n {/* 4. Dashboard Grid: Curve + Distribution */}\n <div className=\"grid grid-cols-[1fr_340px] gap-3 pb-4\">\n <CurveCardUI\n curveType={curveType}\n curvePeriod={curvePeriod}\n data={curveQuery.data}\n isLoading={curveQuery.isLoading}\n onTypeChange={setCurveType}\n onPeriodChange={setCurvePeriod}\n />\n <DistributionCardUI data={distributionQuery.data} isLoading={false} />\n </div>\n\n {/* 5. Holdings Section (render prop for Day 3) */}\n {renderHoldings?.({\n activeTab,\n portfolioQuery,\n isViewing,\n })}\n </div>\n </div>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n message: string;\n confirmLabel: string;\n cancelLabel: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n title,\n message,\n confirmLabel,\n cancelLabel,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/60\"\n onClick={onCancel}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") onCancel();\n }}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Close dialog\"\n />\n\n {/* Dialog */}\n <div className=\"relative z-10 w-full max-w-sm rounded-xl border border-[#252530] bg-[#12121A] p-6 shadow-2xl\">\n <h3 className=\"text-sm font-semibold text-foreground\">{title}</h3>\n <p className=\"mt-2 text-xs leading-relaxed text-[#A0A0B8]\">{message}</p>\n\n <div className=\"mt-5 flex items-center justify-end gap-2\">\n <button\n type=\"button\"\n className=\"rounded-lg px-4 py-2 text-xs font-medium text-[#5C5C72] transition-colors hover:bg-[#1C1C26] hover:text-foreground\"\n onClick={onCancel}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n className={cn(\n \"rounded-lg border px-4 py-2 text-xs font-medium transition-colors\",\n \"border-[rgba(255,82,82,0.25)] text-[#FF5252]\",\n \"hover:border-[#FF5252] hover:bg-[rgba(255,82,82,0.1)]\",\n )}\n onClick={onConfirm}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport {\n usePerpsHistoryQuery,\n usePerpsPositionsQuery,\n usePredictionBetsQuery,\n usePredictionSettledQuery,\n useSpotHistoryQuery,\n useSpotHoldingsQuery,\n} from \"../../hooks\";\nimport { AssetTab, type PortfolioQuery, type SpotHolding } from \"../../types\";\n\nexport type SpotSubTab = \"holdings\" | \"history\";\nexport type PerpsSubTab = \"positions\" | \"history\";\nexport type PredictionSubTab = \"active\" | \"settled\";\n\nexport interface UseHoldingsSectionOptions {\n activeTab: AssetTab;\n portfolioQuery?: PortfolioQuery;\n isViewing: boolean;\n}\n\nexport function useHoldingsSection({\n activeTab,\n portfolioQuery,\n isViewing,\n}: UseHoldingsSectionOptions) {\n // ── Sub-tab states ──────────────────────────────────────────────────\n const [spotSubTab, setSpotSubTab] = useState<SpotSubTab>(\"holdings\");\n const [perpsSubTab, setPerpsSubTab] = useState<PerpsSubTab>(\"positions\");\n const [predictionSubTab, setPredictionSubTab] =\n useState<PredictionSubTab>(\"active\");\n\n // ── Search states ───────────────────────────────────────────────────\n const [spotSearch, setSpotSearch] = useState(\"\");\n const [perpsSearch, setPerpsSearch] = useState(\"\");\n const [predictionSearch, setPredictionSearch] = useState(\"\");\n\n // ── Spot-specific states ────────────────────────────────────────────\n const [hideSmall, setHideSmall] = useState(false);\n const [groupCollapsed, setGroupCollapsed] = useState(false);\n\n const toggleGroupCollapsed = useCallback(() => {\n setGroupCollapsed((v) => !v);\n }, []);\n\n // ── Data queries (only fetch for active tab) ────────────────────────\n const spotHoldingsQuery = useSpotHoldingsQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.SPOT,\n });\n\n const spotHistoryQuery = useSpotHistoryQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.SPOT && spotSubTab === \"history\",\n });\n\n const perpsPositionsQuery = usePerpsPositionsQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.PERPS,\n });\n\n const perpsHistoryQuery = usePerpsHistoryQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.PERPS && perpsSubTab === \"history\",\n });\n\n const predictionBetsQuery = usePredictionBetsQuery(portfolioQuery, {\n enabled: activeTab === AssetTab.PREDICTION,\n });\n\n const predictionSettledQuery = usePredictionSettledQuery(portfolioQuery, {\n enabled:\n activeTab === AssetTab.PREDICTION && predictionSubTab === \"settled\",\n });\n\n // ── Filtered Spot holdings ──────────────────────────────────────────\n const filteredSpotHoldings = useMemo(() => {\n const holdings = spotHoldingsQuery.data?.holdings ?? [];\n return holdings.filter((h: SpotHolding) => {\n if (hideSmall && h.value < 1 && !h.verified) return false;\n if (spotSearch) {\n const q = spotSearch.toLowerCase();\n return (\n h.name.toLowerCase().includes(q) || h.symbol.toLowerCase().includes(q)\n );\n }\n return true;\n });\n }, [spotHoldingsQuery.data?.holdings, hideSmall, spotSearch]);\n\n // ── Filtered Perps positions ────────────────────────────────────────\n const filteredPerpsPositions = useMemo(() => {\n const positions = perpsPositionsQuery.data?.positions ?? [];\n if (!perpsSearch) return positions;\n const q = perpsSearch.toLowerCase();\n return positions.filter((p) => p.pair.toLowerCase().includes(q));\n }, [perpsPositionsQuery.data?.positions, perpsSearch]);\n\n // ── Filtered Prediction bets ────────────────────────────────────────\n const filteredPredictionBets = useMemo(() => {\n const bets = predictionBetsQuery.data?.bets ?? [];\n if (!predictionSearch) return bets;\n const q = predictionSearch.toLowerCase();\n return bets.filter((b) => b.market.toLowerCase().includes(q));\n }, [predictionBetsQuery.data?.bets, predictionSearch]);\n\n return {\n // Sub-tabs\n spotSubTab,\n setSpotSubTab,\n perpsSubTab,\n setPerpsSubTab,\n predictionSubTab,\n setPredictionSubTab,\n\n // Search\n spotSearch,\n setSpotSearch,\n perpsSearch,\n setPerpsSearch,\n predictionSearch,\n setPredictionSearch,\n\n // Spot-specific\n hideSmall,\n setHideSmall,\n groupCollapsed,\n toggleGroupCollapsed,\n\n // Queries\n spotHoldingsQuery,\n spotHistoryQuery,\n perpsPositionsQuery,\n perpsHistoryQuery,\n predictionBetsQuery,\n predictionSettledQuery,\n\n // Filtered data\n filteredSpotHoldings,\n filteredPerpsPositions,\n filteredPredictionBets,\n\n // Pass-through\n isViewing,\n };\n}\n\nexport type UseHoldingsSectionResult = ReturnType<typeof useHoldingsSection>;\n","import { cn } from \"@liberfi.io/ui\";\n\nexport interface HoldingsSubTabsProps {\n tabs: { key: string; label: string }[];\n activeKey: string;\n onTabChange: (key: string) => void;\n}\n\nexport function HoldingsSubTabs({\n tabs,\n activeKey,\n onTabChange,\n}: HoldingsSubTabsProps) {\n return (\n <div className=\"flex gap-0.5\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n className={cn(\n \"rounded-[5px] px-3 py-1.5 text-xs font-medium transition-colors\",\n activeKey === tab.key\n ? \"bg-[#1C1C26] text-foreground\"\n : \"text-[#5C5C72] hover:bg-[#16161E] hover:text-[#A0A0B8]\",\n )}\n onClick={() => onTabChange(tab.key)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n );\n}\n\nexport interface HoldingsSearchProps {\n value: string;\n onChange: (value: string) => void;\n placeholder: string;\n}\n\nexport function HoldingsSearch({\n value,\n onChange,\n placeholder,\n}: HoldingsSearchProps) {\n return (\n <div className=\"flex h-7 w-40 items-center gap-1 rounded-[5px] border border-[#252530] bg-[#16161E] px-2 transition-all focus-within:w-[200px] focus-within:border-[#C8FF00]\">\n <svg\n width=\"11\"\n height=\"11\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className=\"flex-shrink-0 text-[#5C5C72]\"\n >\n <circle cx=\"7\" cy=\"7\" r=\"5.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M11 11L14.5 14.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n <input\n type=\"text\"\n className=\"flex-1 border-none bg-transparent font-mono text-[11px] text-foreground caret-[#C8FF00] outline-none placeholder:font-sans placeholder:text-[10px] placeholder:text-[#5C5C72]\"\n placeholder={placeholder}\n spellCheck={false}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n );\n}\n\nexport interface HoldingsEmptyProps {\n title: string;\n hint?: string;\n}\n\nexport function HoldingsEmpty({ title, hint }: HoldingsEmptyProps) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <span className=\"text-sm text-[#5C5C72]\">{title}</span>\n {hint && <span className=\"mt-1 text-xs text-[#3A3A4E]\">{hint}</span>}\n </div>\n );\n}\n\nexport interface BatchActionButtonProps {\n label: string;\n disabled?: boolean;\n onClick: () => void;\n}\n\nexport function BatchActionButton({\n label,\n disabled,\n onClick,\n}: BatchActionButtonProps) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"flex items-center gap-1 whitespace-nowrap rounded-[5px] border px-3 py-1.5 text-[11px] font-medium transition-colors\",\n disabled\n ? \"pointer-events-none border-[#252530] text-[#3A3A4E]\"\n : \"border-[rgba(255,82,82,0.25)] text-[#FF5252] hover:border-[#FF5252] hover:bg-[rgba(255,82,82,0.1)]\",\n )}\n onClick={onClick}\n disabled={disabled}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n {label}\n </button>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { PerpsPosition, PerpsTradeRecord } from \"../../types\";\nimport { PerpsPositionSide } from \"../../types\";\nimport { formatSignedUsd, formatUsd } from \"../../utils\";\nimport type { UseHoldingsSectionResult } from \"./holdings-section.script\";\nimport {\n BatchActionButton,\n HoldingsEmpty,\n HoldingsSearch,\n HoldingsSubTabs,\n} from \"./shared.ui\";\n\n// ── Perps Panel ─────────────────────────────────────────────────────────────\n\nexport interface PerpsPanelUIProps {\n state: UseHoldingsSectionResult;\n onClosePosition?: (position: PerpsPosition) => void;\n onCloseAll?: () => void;\n}\n\nexport function PerpsPanelUI({\n state,\n onClosePosition,\n onCloseAll,\n}: PerpsPanelUIProps) {\n const {\n perpsSubTab,\n setPerpsSubTab,\n perpsSearch,\n setPerpsSearch,\n filteredPerpsPositions,\n perpsHistoryQuery,\n isViewing,\n } = state;\n\n const hasPositions = filteredPerpsPositions.length > 0;\n\n return (\n <div>\n {/* Header bar */}\n <div className=\"flex items-center justify-between pb-3\">\n <div className=\"flex items-center gap-3\">\n <HoldingsSubTabs\n tabs={[\n { key: \"positions\", label: \"Open Positions\" },\n { key: \"history\", label: \"Trade History\" },\n ]}\n activeKey={perpsSubTab}\n onTabChange={(k) => setPerpsSubTab(k as \"positions\" | \"history\")}\n />\n {perpsSubTab === \"positions\" && !isViewing && (\n <BatchActionButton\n label=\"Close All\"\n disabled={!hasPositions}\n onClick={() => onCloseAll?.()}\n />\n )}\n </div>\n <HoldingsSearch\n value={perpsSearch}\n onChange={setPerpsSearch}\n placeholder=\"Search pair…\"\n />\n </div>\n\n {/* Content */}\n {perpsSubTab === \"positions\" ? (\n <PerpsPositionsTable\n positions={filteredPerpsPositions}\n isViewing={isViewing}\n onClose={onClosePosition}\n />\n ) : (\n <PerpsHistoryTable\n records={perpsHistoryQuery.data?.records ?? []}\n isLoading={perpsHistoryQuery.isLoading}\n />\n )}\n </div>\n );\n}\n\n// ── Perps Positions Table ───────────────────────────────────────────────────\n\ninterface PerpsPositionsTableProps {\n positions: PerpsPosition[];\n isViewing: boolean;\n onClose?: (position: PerpsPosition) => void;\n}\n\nfunction PerpsPositionsTable({\n positions,\n isViewing,\n onClose,\n}: PerpsPositionsTableProps) {\n if (positions.length === 0) {\n return <HoldingsEmpty title=\"No open positions\" hint=\"Start trading →\" />;\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{\n gridTemplateColumns: isViewing\n ? \"2fr 1fr .8fr .8fr 1fr\"\n : \"2fr 1fr .8fr .8fr 1fr 80px\",\n }}\n >\n <span>Pair / Side</span>\n <span className=\"text-right\">Size</span>\n <span className=\"text-right\">Entry</span>\n <span className=\"text-right\">Mark</span>\n <span className=\"text-right\">uPNL</span>\n {!isViewing && <span className=\"text-right\" />}\n </div>\n\n {/* Position rows */}\n <div className=\"flex flex-col\">\n {positions.map((p) => (\n <PerpsPositionRow\n key={p.id}\n position={p}\n isViewing={isViewing}\n onClose={onClose}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ── Position Row ────────────────────────────────────────────────────────────\n\nfunction PerpsPositionRow({\n position,\n isViewing,\n onClose,\n}: {\n position: PerpsPosition;\n isViewing: boolean;\n onClose?: (position: PerpsPosition) => void;\n}) {\n const isLong = position.side === PerpsPositionSide.LONG;\n const isPnlPositive = position.uPnl >= 0;\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{\n gridTemplateColumns: isViewing\n ? \"2fr 1fr .8fr .8fr 1fr\"\n : \"2fr 1fr .8fr .8fr 1fr 80px\",\n }}\n >\n {/* Pair / Side */}\n <div className=\"flex items-center gap-2\">\n {position.icon ? (\n <img\n src={position.icon}\n alt={position.pair}\n className=\"h-6 w-6 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[9px] font-bold text-[#5C5C72]\">\n {position.pair.slice(0, 2)}\n </div>\n )}\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-xs font-medium text-foreground\">\n {position.pair}\n </span>\n <span\n className={cn(\n \"rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isLong\n ? \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\"\n : \"bg-[rgba(255,82,82,0.12)] text-[#FF5252]\",\n )}\n >\n {isLong ? \"Long\" : \"Short\"}\n </span>\n <span className=\"rounded bg-[rgba(200,255,0,0.1)] px-1.5 py-0.5 text-[10px] font-medium text-[#C8FF00]\">\n {position.leverage}×\n </span>\n </div>\n </div>\n\n {/* Size */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(position.size)}\n </span>\n\n {/* Entry */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(position.entryPrice)}\n </span>\n\n {/* Mark */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(position.markPrice)}\n </span>\n\n {/* uPNL */}\n <span\n className={cn(\n \"text-right font-mono text-xs\",\n isPnlPositive ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {formatSignedUsd(position.uPnl)}\n </span>\n\n {/* Close action */}\n {!isViewing && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n className=\"rounded-[5px] border border-[#252530] px-2.5 py-1 text-[10px] font-medium text-[#5C5C72] transition-colors hover:border-[#FF5252] hover:text-[#FF5252]\"\n onClick={() => onClose?.(position)}\n >\n Close\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Perps Trade History Table ───────────────────────────────────────────────\n\ninterface PerpsHistoryTableProps {\n records: PerpsTradeRecord[];\n isLoading: boolean;\n}\n\nfunction PerpsHistoryTable({ records, isLoading }: PerpsHistoryTableProps) {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-[#C8FF00] border-t-transparent\" />\n </div>\n );\n }\n\n if (records.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No trade history\"\n hint=\"Closed positions will appear here\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{ gridTemplateColumns: \"1.5fr 80px 1fr 1fr 1fr 100px\" }}\n >\n <span>Pair</span>\n <span>Side</span>\n <span className=\"text-right\">Size</span>\n <span className=\"text-right\">PNL</span>\n <span className=\"text-right\">Close Price</span>\n <span className=\"text-right\">Time</span>\n </div>\n\n {/* Records */}\n <div className=\"flex flex-col\">\n {records.map((r) => (\n <PerpsTradeRow key={r.id} record={r} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction PerpsTradeRow({ record }: { record: PerpsTradeRecord }) {\n const isLong = record.side === PerpsPositionSide.LONG;\n const isPnlPositive = record.pnl >= 0;\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{ gridTemplateColumns: \"1.5fr 80px 1fr 1fr 1fr 100px\" }}\n >\n {/* Pair */}\n <div className=\"flex items-center gap-2\">\n {record.icon ? (\n <img\n src={record.icon}\n alt={record.pair}\n className=\"h-5 w-5 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[8px] font-bold text-[#5C5C72]\">\n {record.pair.slice(0, 2)}\n </div>\n )}\n <span className=\"text-xs font-medium text-foreground\">\n {record.pair}\n </span>\n </div>\n\n {/* Side */}\n <span>\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isLong\n ? \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\"\n : \"bg-[rgba(255,82,82,0.12)] text-[#FF5252]\",\n )}\n >\n {isLong ? \"Long\" : \"Short\"}\n </span>\n </span>\n\n {/* Size */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(record.size)}\n </span>\n\n {/* PNL */}\n <span\n className={cn(\n \"text-right font-mono text-xs\",\n isPnlPositive ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {formatSignedUsd(record.pnl)}\n </span>\n\n {/* Close Price */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(record.closePrice)}\n </span>\n\n {/* Time */}\n <span className=\"text-right text-[11px] text-[#5C5C72]\">\n {record.time}\n </span>\n </div>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { PredictionBet, PredictionSettledRecord } from \"../../types\";\nimport {\n PredictionBetStatus,\n PredictionResult,\n PredictionSource,\n} from \"../../types\";\nimport { formatUsd } from \"../../utils\";\nimport type { UseHoldingsSectionResult } from \"./holdings-section.script\";\nimport {\n BatchActionButton,\n HoldingsEmpty,\n HoldingsSearch,\n HoldingsSubTabs,\n} from \"./shared.ui\";\n\n// ── Prediction Panel ────────────────────────────────────────────────────────\n\nexport interface PredictionPanelUIProps {\n state: UseHoldingsSectionResult;\n onSellBet?: (bet: PredictionBet) => void;\n onSellAll?: () => void;\n}\n\nexport function PredictionPanelUI({\n state,\n onSellBet,\n onSellAll,\n}: PredictionPanelUIProps) {\n const {\n predictionSubTab,\n setPredictionSubTab,\n predictionSearch,\n setPredictionSearch,\n filteredPredictionBets,\n predictionSettledQuery,\n isViewing,\n } = state;\n\n const hasBets = filteredPredictionBets.length > 0;\n\n return (\n <div>\n {/* Header bar */}\n <div className=\"flex items-center justify-between pb-3\">\n <div className=\"flex items-center gap-3\">\n <HoldingsSubTabs\n tabs={[\n { key: \"active\", label: \"Active Bets\" },\n { key: \"settled\", label: \"Settled\" },\n ]}\n activeKey={predictionSubTab}\n onTabChange={(k) => setPredictionSubTab(k as \"active\" | \"settled\")}\n />\n {predictionSubTab === \"active\" && !isViewing && (\n <BatchActionButton\n label=\"Sell All\"\n disabled={!hasBets}\n onClick={() => onSellAll?.()}\n />\n )}\n </div>\n <HoldingsSearch\n value={predictionSearch}\n onChange={setPredictionSearch}\n placeholder=\"Search market…\"\n />\n </div>\n\n {/* Content */}\n {predictionSubTab === \"active\" ? (\n <PredictionBetsTable\n bets={filteredPredictionBets}\n isViewing={isViewing}\n onSell={onSellBet}\n />\n ) : (\n <PredictionSettledTable\n records={predictionSettledQuery.data?.records ?? []}\n isLoading={predictionSettledQuery.isLoading}\n />\n )}\n </div>\n );\n}\n\n// ── Source Tag ───────────────────────────────────────────────────────────────\n\nconst SOURCE_STYLES: Record<PredictionSource, string> = {\n [PredictionSource.POLYMARKET]: \"bg-[rgba(0,102,255,0.12)] text-[#0066FF]\",\n [PredictionSource.DRIFT]: \"bg-[rgba(200,255,0,0.1)] text-[#C8FF00]\",\n [PredictionSource.METADAO]: \"bg-[rgba(255,107,157,0.1)] text-[#FF6B9D]\",\n};\n\nconst SOURCE_LABELS: Record<PredictionSource, string> = {\n [PredictionSource.POLYMARKET]: \"Polymarket\",\n [PredictionSource.DRIFT]: \"Drift\",\n [PredictionSource.METADAO]: \"MetaDAO\",\n};\n\nfunction SourceTag({ source }: { source: PredictionSource }) {\n return (\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n SOURCE_STYLES[source],\n )}\n >\n {SOURCE_LABELS[source]}\n </span>\n );\n}\n\n// ── Active Bets Table ───────────────────────────────────────────────────────\n\ninterface PredictionBetsTableProps {\n bets: PredictionBet[];\n isViewing: boolean;\n onSell?: (bet: PredictionBet) => void;\n}\n\nfunction PredictionBetsTable({\n bets,\n isViewing,\n onSell,\n}: PredictionBetsTableProps) {\n if (bets.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No active bets\"\n hint=\"Explore prediction markets →\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{\n gridTemplateColumns: isViewing\n ? \"2.2fr .6fr .7fr .7fr .7fr\"\n : \"2.2fr .6fr .7fr .7fr .7fr 80px\",\n }}\n >\n <span>Market / Source</span>\n <span className=\"text-right\">Position</span>\n <span className=\"text-right\">Stake</span>\n <span className=\"text-right\">Potential</span>\n <span className=\"text-right\">Status</span>\n {!isViewing && <span className=\"text-right\" />}\n </div>\n\n {/* Bet rows */}\n <div className=\"flex flex-col\">\n {bets.map((b) => (\n <PredictionBetRow\n key={b.id}\n bet={b}\n isViewing={isViewing}\n onSell={onSell}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ── Bet Row ─────────────────────────────────────────────────────────────────\n\nfunction PredictionBetRow({\n bet,\n isViewing,\n onSell,\n}: {\n bet: PredictionBet;\n isViewing: boolean;\n onSell?: (bet: PredictionBet) => void;\n}) {\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{\n gridTemplateColumns: isViewing\n ? \"2.2fr .6fr .7fr .7fr .7fr\"\n : \"2.2fr .6fr .7fr .7fr .7fr 80px\",\n }}\n >\n {/* Market / Source */}\n <div className=\"flex items-center gap-2 overflow-hidden\">\n {bet.icon ? (\n <img\n src={bet.icon}\n alt={bet.market}\n className=\"h-6 w-6 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[9px] font-bold text-[#5C5C72]\">\n ?\n </div>\n )}\n <div className=\"flex flex-col overflow-hidden\">\n <span className=\"truncate text-xs font-medium text-foreground\">\n {bet.market}\n </span>\n <SourceTag source={bet.source} />\n </div>\n </div>\n\n {/* Position */}\n <span\n className={cn(\n \"text-right text-xs font-medium\",\n bet.position === \"Yes\" ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {bet.position}\n </span>\n\n {/* Stake */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(bet.stake)}\n </span>\n\n {/* Potential */}\n <span className=\"text-right font-mono text-xs text-[#00E676]\">\n {formatUsd(bet.potential)}\n </span>\n\n {/* Status */}\n <span className=\"text-right\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n bet.status === PredictionBetStatus.ACTIVE\n ? \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\"\n : \"bg-[rgba(200,255,0,0.1)] text-[#C8FF00]\",\n )}\n >\n {bet.status === PredictionBetStatus.ACTIVE ? \"Active\" : \"Pending\"}\n </span>\n </span>\n\n {/* Sell action */}\n {!isViewing && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n className=\"rounded-[5px] border border-[#252530] px-2.5 py-1 text-[10px] font-medium text-[#5C5C72] transition-colors hover:border-[#FF5252] hover:text-[#FF5252]\"\n onClick={() => onSell?.(bet)}\n >\n Sell\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ── Settled Table ───────────────────────────────────────────────────────────\n\ninterface PredictionSettledTableProps {\n records: PredictionSettledRecord[];\n isLoading: boolean;\n}\n\nfunction PredictionSettledTable({\n records,\n isLoading,\n}: PredictionSettledTableProps) {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-[#C8FF00] border-t-transparent\" />\n </div>\n );\n }\n\n if (records.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No settled bets\"\n hint=\"Settled predictions will appear here\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{ gridTemplateColumns: \"1.5fr .8fr .6fr .7fr .6fr .7fr\" }}\n >\n <span>Market</span>\n <span>Source</span>\n <span className=\"text-right\">Position</span>\n <span className=\"text-right\">Stake</span>\n <span className=\"text-right\">Result</span>\n <span className=\"text-right\">Payout</span>\n </div>\n\n {/* Records */}\n <div className=\"flex flex-col\">\n {records.map((r) => (\n <PredictionSettledRow key={r.id} record={r} />\n ))}\n </div>\n </div>\n );\n}\n\nfunction PredictionSettledRow({ record }: { record: PredictionSettledRecord }) {\n const isWon = record.result === PredictionResult.WON;\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{ gridTemplateColumns: \"1.5fr .8fr .6fr .7fr .6fr .7fr\" }}\n >\n {/* Market */}\n <div className=\"flex items-center gap-2 overflow-hidden\">\n {record.icon ? (\n <img\n src={record.icon}\n alt={record.market}\n className=\"h-5 w-5 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[8px] font-bold text-[#5C5C72]\">\n ?\n </div>\n )}\n <span className=\"truncate text-xs font-medium text-foreground\">\n {record.market}\n </span>\n </div>\n\n {/* Source */}\n <SourceTag source={record.source} />\n\n {/* Position */}\n <span\n className={cn(\n \"text-right text-xs font-medium\",\n record.position === \"Yes\" ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {record.position}\n </span>\n\n {/* Stake */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(record.stake)}\n </span>\n\n {/* Result */}\n <span className=\"text-right\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isWon\n ? \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\"\n : \"bg-[rgba(255,82,82,0.12)] text-[#FF5252]\",\n )}\n >\n {isWon ? \"Won\" : \"Lost\"}\n </span>\n </span>\n\n {/* Payout */}\n <span\n className={cn(\n \"text-right font-mono text-xs\",\n isWon ? \"text-[#00E676]\" : \"text-[#5C5C72]\",\n )}\n >\n {isWon ? `+${formatUsd(record.payout)}` : formatUsd(record.payout)}\n </span>\n </div>\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { SpotHolding, SpotHistoryRecord } from \"../../types\";\nimport { SpotHistoryType } from \"../../types\";\nimport {\n formatPercent,\n formatTime,\n formatTokenBalance,\n formatUsd,\n getExplorerUrl,\n} from \"../../utils\";\nimport type { UseHoldingsSectionResult } from \"./holdings-section.script\";\nimport { HoldingsEmpty, HoldingsSearch, HoldingsSubTabs } from \"./shared.ui\";\n\n// ── Spot Panel ──────────────────────────────────────────────────────────────\n\nexport interface SpotPanelUIProps {\n state: UseHoldingsSectionResult;\n}\n\nexport function SpotPanelUI({ state }: SpotPanelUIProps) {\n const {\n spotSubTab,\n setSpotSubTab,\n spotSearch,\n setSpotSearch,\n hideSmall,\n setHideSmall,\n groupCollapsed,\n toggleGroupCollapsed,\n filteredSpotHoldings,\n spotHistoryQuery,\n } = state;\n\n return (\n <div>\n {/* Header bar */}\n <div className=\"flex items-center justify-between pb-3\">\n <HoldingsSubTabs\n tabs={[\n { key: \"holdings\", label: \"Holdings\" },\n { key: \"history\", label: \"History\" },\n ]}\n activeKey={spotSubTab}\n onTabChange={(k) => setSpotSubTab(k as \"holdings\" | \"history\")}\n />\n <div className=\"flex items-center gap-2\">\n <HoldingsSearch\n value={spotSearch}\n onChange={setSpotSearch}\n placeholder=\"Search token…\"\n />\n {spotSubTab === \"holdings\" && (\n <label className=\"flex cursor-pointer items-center gap-1.5 text-[11px] text-[#5C5C72] select-none\">\n <input\n type=\"checkbox\"\n className=\"accent-[#C8FF00]\"\n checked={hideSmall}\n onChange={(e) => setHideSmall(e.target.checked)}\n />\n Hide small\n </label>\n )}\n </div>\n </div>\n\n {/* Content */}\n {spotSubTab === \"holdings\" ? (\n <SpotHoldingsTable\n holdings={filteredSpotHoldings}\n groupCollapsed={groupCollapsed}\n onToggleGroup={toggleGroupCollapsed}\n />\n ) : (\n <SpotHistoryTable\n records={spotHistoryQuery.data?.trades ?? []}\n isLoading={spotHistoryQuery.isLoading}\n />\n )}\n </div>\n );\n}\n\n// ── Spot Holdings Table ─────────────────────────────────────────────────────\n\ninterface SpotHoldingsTableProps {\n holdings: SpotHolding[];\n groupCollapsed: boolean;\n onToggleGroup: () => void;\n}\n\nfunction SpotHoldingsTable({\n holdings,\n groupCollapsed,\n onToggleGroup,\n}: SpotHoldingsTableProps) {\n if (holdings.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No tokens found\"\n hint=\"Your spot tokens will appear here\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{ gridTemplateColumns: \"2fr 1fr 1fr 1fr 1fr\" }}\n >\n <span>Asset</span>\n <span className=\"text-right\">Balance</span>\n <span className=\"text-right\">Price</span>\n <span className=\"text-right\">Value</span>\n <span className=\"text-right\">24h</span>\n </div>\n\n {/* Group header */}\n <button\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72] transition-colors hover:text-[#A0A0B8]\"\n onClick={onToggleGroup}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={cn(\"transition-transform\", groupCollapsed && \"-rotate-90\")}\n >\n <path\n d=\"M4 6l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span>Tokens</span>\n <span className=\"text-[#3A3A4E]\">{holdings.length}</span>\n </button>\n\n {/* Token rows */}\n {!groupCollapsed && (\n <div className=\"flex flex-col\">\n {holdings.map((h) => (\n <SpotHoldingRow key={h.tokenAddress} holding={h} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ── Spot Holding Row ────────────────────────────────────────────────────────\n\nfunction SpotHoldingRow({ holding }: { holding: SpotHolding }) {\n const isPositive = holding.change24h >= 0;\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{ gridTemplateColumns: \"2fr 1fr 1fr 1fr 1fr\" }}\n >\n {/* Asset */}\n <div className=\"flex items-center gap-2.5 overflow-hidden\">\n {holding.image ? (\n <img\n src={holding.image}\n alt={holding.symbol}\n className=\"h-7 w-7 flex-shrink-0 rounded-full\"\n />\n ) : (\n <div className=\"flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-full bg-[#1C1C26] text-[10px] font-bold text-[#5C5C72]\">\n {holding.symbol.slice(0, 2)}\n </div>\n )}\n <div className=\"flex flex-col overflow-hidden\">\n <span className=\"truncate text-xs font-medium text-foreground\">\n {holding.name}\n </span>\n <span className=\"text-[10px] text-[#5C5C72]\">{holding.symbol}</span>\n </div>\n </div>\n\n {/* Balance */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatTokenBalance(holding.balance)}\n </span>\n\n {/* Price */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(holding.price)}\n </span>\n\n {/* Value */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatUsd(holding.value)}\n </span>\n\n {/* 24h Change */}\n <span\n className={cn(\n \"text-right font-mono text-xs\",\n isPositive ? \"text-[#00E676]\" : \"text-[#FF5252]\",\n )}\n >\n {formatPercent(holding.change24h)}\n </span>\n </div>\n );\n}\n\n// ── Spot History Table ──────────────────────────────────────────────────────\n\ninterface SpotHistoryTableProps {\n records: SpotHistoryRecord[];\n isLoading: boolean;\n}\n\nfunction SpotHistoryTable({ records, isLoading }: SpotHistoryTableProps) {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-16\">\n <div className=\"h-5 w-5 animate-spin rounded-full border-2 border-[#C8FF00] border-t-transparent\" />\n </div>\n );\n }\n\n if (records.length === 0) {\n return (\n <HoldingsEmpty\n title=\"No history found\"\n hint=\"Transaction history will appear here\"\n />\n );\n }\n\n return (\n <div>\n {/* Column headers */}\n <div\n className=\"grid gap-2 px-3 pb-2 text-[10px] font-medium uppercase tracking-wider text-[#5C5C72]\"\n style={{ gridTemplateColumns: \"80px 1.5fr 1fr 1fr 100px 80px\" }}\n >\n <span>Type</span>\n <span>Detail</span>\n <span className=\"text-right\">Amount</span>\n <span className=\"text-right\">Value</span>\n <span className=\"text-right\">Time</span>\n <span className=\"text-right\">TxHash</span>\n </div>\n\n {/* Records */}\n <div className=\"flex flex-col\">\n {records.map((r) => (\n <SpotHistoryRow key={`${r.txHash}-${r.tokenAddress}`} record={r} />\n ))}\n </div>\n </div>\n );\n}\n\n// ── History Type Badge ──────────────────────────────────────────────────────\n\nconst TYPE_STYLES: Record<SpotHistoryType, string> = {\n [SpotHistoryType.SWAP]: \"bg-[rgba(139,123,255,0.12)] text-[#8B7BFF]\",\n [SpotHistoryType.SEND]: \"bg-[rgba(255,82,82,0.12)] text-[#FF5252]\",\n [SpotHistoryType.RECEIVE]: \"bg-[rgba(0,230,118,0.12)] text-[#00E676]\",\n};\n\nconst TYPE_LABELS: Record<SpotHistoryType, string> = {\n [SpotHistoryType.SWAP]: \"Swap\",\n [SpotHistoryType.SEND]: \"Send\",\n [SpotHistoryType.RECEIVE]: \"Receive\",\n};\n\n/** Derive a human-readable detail from the trade record. */\nfunction getTradeDetail(record: SpotHistoryRecord): string {\n if (record.type === SpotHistoryType.SWAP && record.sideTokenSymbol) {\n return `${record.tokenSymbol} → ${record.sideTokenSymbol}`;\n }\n return record.tokenName || record.tokenSymbol;\n}\n\nfunction SpotHistoryRow({ record }: { record: SpotHistoryRecord }) {\n const explorerUrl = getExplorerUrl(record.txHash, record.chain);\n\n return (\n <div\n className=\"grid items-center gap-2 rounded-[5px] px-3 py-2.5 transition-colors hover:bg-[#16161E]\"\n style={{ gridTemplateColumns: \"80px 1.5fr 1fr 1fr 100px 80px\" }}\n >\n {/* Type */}\n <span>\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n TYPE_STYLES[record.type],\n )}\n >\n {TYPE_LABELS[record.type]}\n </span>\n </span>\n\n {/* Detail */}\n <span className=\"truncate text-xs text-foreground\">\n {getTradeDetail(record)}\n </span>\n\n {/* Amount */}\n <span className=\"text-right font-mono text-xs text-foreground\">\n {formatTokenBalance(record.tokenAmount)} {record.tokenSymbol}\n </span>\n\n {/* Value */}\n <span className=\"text-right font-mono text-xs text-[#A0A0B8]\">\n {formatUsd(record.valueUsd)}\n </span>\n\n {/* Time */}\n <span className=\"text-right text-[11px] text-[#5C5C72]\">\n {record.timestamp ? formatTime(record.timestamp) : \"—\"}\n </span>\n\n {/* TxHash */}\n <span className=\"text-right\">\n {record.txHash ? (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"font-mono text-[11px] text-[#5C5C72] transition-colors hover:text-[#C8FF00]\"\n >\n {record.txHash.slice(0, 4)}…{record.txHash.slice(-3)}\n </a>\n ) : (\n <span className=\"font-mono text-[11px] text-[#3A3A4E]\">—</span>\n )}\n </span>\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { AssetTab } from \"../../types\";\nimport type { PerpsPosition, PredictionBet, PortfolioQuery } from \"../../types\";\nimport { ConfirmDialog } from \"./confirm-dialog.ui\";\nimport {\n useHoldingsSection,\n type UseHoldingsSectionOptions,\n} from \"./holdings-section.script\";\nimport { PerpsPanelUI } from \"./perps-panel.ui\";\nimport { PredictionPanelUI } from \"./prediction-panel.ui\";\nimport { SpotPanelUI } from \"./spot-panel.ui\";\n\n// ── Props ───────────────────────────────────────────────────────────────────\n\nexport interface HoldingsSectionWidgetProps extends UseHoldingsSectionOptions {\n /** Called when user clicks Close on a single perps position */\n onClosePosition?: (position: PerpsPosition) => void;\n /** Called after user confirms Close All positions */\n onCloseAllPositions?: () => void;\n /** Called when user clicks Sell on a single prediction bet */\n onSellBet?: (bet: PredictionBet) => void;\n /** Called after user confirms Sell All bets */\n onSellAllBets?: () => void;\n}\n\n// ── Widget ──────────────────────────────────────────────────────────────────\n\nexport function HoldingsSectionWidget({\n onClosePosition,\n onCloseAllPositions,\n onSellBet,\n onSellAllBets,\n ...options\n}: HoldingsSectionWidgetProps) {\n const state = useHoldingsSection(options);\n\n // ── Confirm dialog state ────────────────────────────────────────────────\n const [confirmAction, setConfirmAction] = useState<\n \"closeAll\" | \"sellAll\" | null\n >(null);\n\n const handleCloseAll = useCallback(() => {\n setConfirmAction(\"closeAll\");\n }, []);\n\n const handleSellAll = useCallback(() => {\n setConfirmAction(\"sellAll\");\n }, []);\n\n const handleConfirm = useCallback(() => {\n if (confirmAction === \"closeAll\") {\n onCloseAllPositions?.();\n } else if (confirmAction === \"sellAll\") {\n onSellAllBets?.();\n }\n setConfirmAction(null);\n }, [confirmAction, onCloseAllPositions, onSellAllBets]);\n\n const handleCancel = useCallback(() => {\n setConfirmAction(null);\n }, []);\n\n // ── Render panel based on active tab ────────────────────────────────────\n const renderPanel = () => {\n switch (options.activeTab) {\n case AssetTab.SPOT:\n return <SpotPanelUI state={state} />;\n case AssetTab.PERPS:\n return (\n <PerpsPanelUI\n state={state}\n onClosePosition={onClosePosition}\n onCloseAll={handleCloseAll}\n />\n );\n case AssetTab.PREDICTION:\n return (\n <PredictionPanelUI\n state={state}\n onSellBet={onSellBet}\n onSellAll={handleSellAll}\n />\n );\n default:\n return null;\n }\n };\n\n return (\n <div className=\"rounded-xl border border-[#1C1C26] bg-[#0E0E16] p-4\">\n {renderPanel()}\n\n {/* Close All Confirm */}\n <ConfirmDialog\n open={confirmAction === \"closeAll\"}\n title=\"Close All Positions\"\n message=\"Close all positions? This will route to each protocol to execute.\"\n confirmLabel=\"Confirm Close All\"\n cancelLabel=\"Cancel\"\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n\n {/* Sell All Confirm */}\n <ConfirmDialog\n open={confirmAction === \"sellAll\"}\n title=\"Sell All Positions\"\n message=\"Sell all positions? This will route to each platform to execute.\"\n confirmLabel=\"Confirm Sell All\"\n cancelLabel=\"Cancel\"\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n </div>\n );\n}\n\n// ── Convenience: standalone render-prop adapter ─────────────────────────────\n\n/**\n * Use this as the `renderHoldings` callback for PortfolioPageWidget.\n *\n * ```tsx\n * <PortfolioPageWidget\n * renderHoldings={(props) => <HoldingsSectionWidget {...props} />}\n * />\n * ```\n */\nexport type HoldingsRenderProps = {\n activeTab: AssetTab;\n portfolioQuery?: PortfolioQuery;\n isViewing: boolean;\n};\n","/**\n * Format the elapsed time between `from` and `now` as a short age string\n * (e.g. \"5m\", \"2h\", \"3d\"). Returns \"--\" if `from` is unavailable.\n */\nexport function formatAgeShort(\n from: Date | string | number | undefined,\n now: Date | number = Date.now(),\n): string {\n if (from == null) return \"--\";\n const start =\n typeof from === \"string\" || typeof from === \"number\"\n ? new Date(from)\n : from;\n const end = typeof now === \"number\" ? new Date(now) : now;\n const diffSec = Math.max(\n 0,\n Math.floor((end.getTime() - start.getTime()) / 1000),\n );\n if (diffSec < 60) return `${diffSec}s`;\n const diffMin = Math.floor(diffSec / 60);\n if (diffMin < 60) return `${diffMin}m`;\n const diffHour = Math.floor(diffMin / 60);\n if (diffHour < 24) return `${diffHour}h`;\n const diffDay = Math.floor(diffHour / 24);\n if (diffDay < 30) return `${diffDay}d`;\n const diffMon = Math.floor(diffDay / 30);\n if (diffMon < 12) return `${diffMon}mo`;\n return `${Math.floor(diffDay / 365)}y`;\n}\n\nexport function truncateMiddle(\n input: string | undefined,\n head = 4,\n tail = 4,\n): string {\n if (!input) return \"--\";\n if (input.length <= head + tail + 1) return input;\n return `${input.slice(0, head)}…${input.slice(-tail)}`;\n}\n","import { cn } from \"@liberfi.io/ui\";\n\nconst TAG_META: Record<\n string,\n { label: string; bgClass: string; textClass: string }\n> = {\n kol: {\n label: \"KOL\",\n bgClass: \"bg-yellow-500/15\",\n textClass: \"text-yellow-400\",\n },\n smart: {\n label: \"Smart\",\n bgClass: \"bg-sky-500/15\",\n textClass: \"text-sky-400\",\n },\n sniper: {\n label: \"Sniper\",\n bgClass: \"bg-red-500/15\",\n textClass: \"text-red-400\",\n },\n dev: {\n label: \"Dev\",\n bgClass: \"bg-orange-500/15\",\n textClass: \"text-orange-400\",\n },\n bundle: {\n label: \"Bundle\",\n bgClass: \"bg-purple-500/15\",\n textClass: \"text-purple-400\",\n },\n bluechip: {\n label: \"Bluechip\",\n bgClass: \"bg-emerald-500/15\",\n textClass: \"text-emerald-400\",\n },\n insider: {\n label: \"Insider\",\n bgClass: \"bg-fuchsia-500/15\",\n textClass: \"text-fuchsia-400\",\n },\n fresh: {\n label: \"Fresh\",\n bgClass: \"bg-teal-500/15\",\n textClass: \"text-teal-400\",\n },\n};\n\nexport interface TagBadgeProps {\n tag: string;\n className?: string;\n}\n\n/**\n * Classification tag chip used across portfolio widgets (mirrors the\n * `HolderTagBadge` / `TraderTagBadge` palette from `@liberfi.io/ui-tokens`).\n */\nexport function TagBadge({ tag, className }: TagBadgeProps) {\n const meta = TAG_META[tag] ?? {\n label: tag,\n bgClass: \"bg-default/20\",\n textClass: \"text-default-500\",\n };\n return (\n <span\n className={cn(\n \"inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium uppercase leading-none tracking-wide\",\n meta.bgClass,\n meta.textClass,\n className,\n )}\n >\n {meta.label}\n </span>\n );\n}\n\nexport interface TagBadgeListProps {\n tags?: Array<string>;\n className?: string;\n max?: number;\n}\n\nexport function TagBadgeList({ tags, className, max }: TagBadgeListProps) {\n if (!tags || tags.length === 0) return null;\n const visible = max != null && max > 0 ? tags.slice(0, max) : tags;\n const overflow = tags.length - visible.length;\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1\", className)}>\n {visible.map((tag) => (\n <TagBadge key={tag} tag={tag} />\n ))}\n {overflow > 0 && (\n <span className=\"inline-flex items-center rounded bg-default/20 px-1.5 py-0.5 text-[10px] font-medium text-default-500\">\n +{overflow}\n </span>\n )}\n </div>\n );\n}\n","import type { Activity, API } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { formatAmount, formatAmountUSDCompact } from \"@liberfi.io/utils\";\nimport { formatAgeShort, truncateMiddle, TagBadgeList } from \"../shared\";\n\nexport type PortfolioActivitiesSortBy = API.ActivitiesSortBy;\nexport type PortfolioActivitiesTypeFilter = \"all\" | \"buy\" | \"sell\";\n\nexport interface PortfolioActivitiesProps {\n activities: Array<Activity>;\n isLoading?: boolean;\n sortBy: PortfolioActivitiesSortBy;\n onSortByChange: (sortBy: PortfolioActivitiesSortBy) => void;\n typeFilter?: PortfolioActivitiesTypeFilter;\n onTypeFilterChange?: (t: PortfolioActivitiesTypeFilter) => void;\n onLoadMore?: () => void;\n hasMore?: boolean;\n now?: number;\n /** native token decimals for gas-fee formatting */\n nativeDecimals?: number;\n /** native token symbol (e.g. \"SOL\") */\n nativeSymbol?: string;\n className?: string;\n onRowClick?: (activity: Activity) => void;\n}\n\nconst SORT_OPTIONS: Array<{ value: PortfolioActivitiesSortBy; label: string }> =\n [\n { value: \"timestamp\", label: \"Latest\" },\n { value: \"totalUsd\", label: \"Top USD\" },\n ];\n\nconst TYPE_OPTIONS: Array<{\n value: PortfolioActivitiesTypeFilter;\n label: string;\n}> = [\n { value: \"all\", label: \"All\" },\n { value: \"buy\", label: \"Buys\" },\n { value: \"sell\", label: \"Sells\" },\n];\n\n/**\n * Presentational wallet activities table (Phase 3). Shows per-activity token,\n * side, trader-tags, token-amount, usd-amount, gas-fee and age.\n */\nexport function PortfolioActivities({\n activities,\n isLoading,\n sortBy,\n onSortByChange,\n typeFilter = \"all\",\n onTypeFilterChange,\n onLoadMore,\n hasMore,\n now = Date.now(),\n nativeDecimals = 9,\n nativeSymbol = \"SOL\",\n className,\n onRowClick,\n}: PortfolioActivitiesProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-2\">\n <div className=\"flex items-center gap-1\">\n {TYPE_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onTypeFilterChange?.(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n typeFilter === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-1\">\n {SORT_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onSortByChange(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n sortBy === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[780px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[10%] px-3 py-2 text-left font-normal\">Side</th>\n <th className=\"w-[25%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Amount\n </th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">USD</th>\n <th className=\"w-[15%] px-3 py-2 text-left font-normal\">Tags</th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">Gas</th>\n <th className=\"w-[10%] px-3 py-2 text-right font-normal\">Age</th>\n </tr>\n </thead>\n <tbody>\n {activities.length === 0 && !isLoading && (\n <tr>\n <td colSpan={7} className=\"py-8 text-center text-default-400\">\n No activities\n </td>\n </tr>\n )}\n {activities.map((a) => (\n <ActivityRow\n key={`${a.txHash}-${a.walletAddress}`}\n activity={a}\n now={now}\n nativeDecimals={nativeDecimals}\n nativeSymbol={nativeSymbol}\n onRowClick={onRowClick}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={7} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction pickPrimary(a: Activity) {\n if (a.type === \"buy\") return a.to;\n if (a.type === \"sell\") return a.from;\n return a.to;\n}\n\nfunction formatGasFee(\n gasFee: string | undefined,\n decimals: number,\n symbol: string,\n): string {\n if (!gasFee) return \"--\";\n const n = Number(gasFee) / Math.pow(10, decimals);\n if (!Number.isFinite(n)) return \"--\";\n return `${formatAmount(n)} ${symbol}`;\n}\n\nfunction ActivityRow({\n activity,\n now,\n nativeDecimals,\n nativeSymbol,\n onRowClick,\n}: {\n activity: Activity;\n now: number;\n nativeDecimals: number;\n nativeSymbol: string;\n onRowClick?: (activity: Activity) => void;\n}) {\n const primary = pickPrimary(activity);\n const sideLabel =\n activity.type === \"buy\"\n ? \"Buy\"\n : activity.type === \"sell\"\n ? \"Sell\"\n : activity.type.replace(/_/g, \" \");\n const sideColor =\n activity.type === \"buy\"\n ? \"text-bullish\"\n : activity.type === \"sell\"\n ? \"text-bearish\"\n : \"text-default-500\";\n\n return (\n <tr\n className={cn(\n \"border-b border-default-50 hover:bg-default-50/60\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(activity) : undefined}\n >\n <td\n className={cn(\n \"px-3 py-2 align-middle font-medium capitalize\",\n sideColor,\n )}\n >\n {sideLabel}\n </td>\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground\">{primary.symbol}</span>\n <span className=\"font-mono text-[10px] text-default-400\">\n {truncateMiddle(primary.address, 6, 6)}\n </span>\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {formatAmount(primary.amount)} {primary.symbol}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {primary.amountInUsd\n ? formatAmountUSDCompact(primary.amountInUsd)\n : \"--\"}\n </td>\n <td className=\"px-3 py-2 align-middle\">\n <TagBadgeList tags={activity.traderTags} max={2} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {formatGasFee(activity.gasFee, nativeDecimals, nativeSymbol)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {formatAgeShort(activity.time, now)}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useWalletActivitiesQuery,\n useWalletActivitiesSubscription,\n} from \"@liberfi.io/react\";\nimport type { API, Activity, Chain } from \"@liberfi.io/types\";\nimport type {\n PortfolioActivitiesSortBy,\n PortfolioActivitiesTypeFilter,\n} from \"./portfolio-activities.ui\";\n\nexport interface UsePortfolioActivitiesScriptParams {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: PortfolioActivitiesSortBy;\n initialTypeFilter?: PortfolioActivitiesTypeFilter;\n}\n\nexport interface UsePortfolioActivitiesScriptResult {\n activities: Array<Activity>;\n isLoading: boolean;\n sortBy: PortfolioActivitiesSortBy;\n setSortBy: (s: PortfolioActivitiesSortBy) => void;\n typeFilter: PortfolioActivitiesTypeFilter;\n setTypeFilter: (t: PortfolioActivitiesTypeFilter) => void;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the Phase 3 wallet-activities list. Mirrors the semantics of the\n * token-activities list script: cursor pagination with reset on\n * (sortBy / typeFilter / chain / address), plus live prepend when on the\n * default view.\n */\nexport function usePortfolioActivitiesScript({\n chain,\n address,\n limit = 50,\n initialSortBy = \"timestamp\",\n initialTypeFilter = \"all\",\n}: UsePortfolioActivitiesScriptParams): UsePortfolioActivitiesScriptResult {\n const [sortBy, setSortByState] =\n useState<PortfolioActivitiesSortBy>(initialSortBy);\n const [typeFilter, setTypeFilterState] =\n useState<PortfolioActivitiesTypeFilter>(initialTypeFilter);\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<API.CursorList<Activity>>>([]);\n const [liveFront, setLiveFront] = useState<Array<Activity>>([]);\n\n const reset = useCallback(() => {\n setCursor(undefined);\n setPages([]);\n setLiveFront([]);\n }, []);\n\n const setSortBy = useCallback(\n (s: PortfolioActivitiesSortBy) => {\n if (s === sortBy) return;\n setSortByState(s);\n reset();\n },\n [sortBy, reset],\n );\n\n const setTypeFilter = useCallback(\n (t: PortfolioActivitiesTypeFilter) => {\n if (t === typeFilter) return;\n setTypeFilterState(t);\n reset();\n },\n [typeFilter, reset],\n );\n\n useEffect(() => {\n reset();\n }, [chain, address, reset]);\n\n const queryType = typeFilter === \"all\" ? undefined : typeFilter;\n\n const queryParams = useMemo(\n () => ({ chain, address, cursor, limit, sortBy, type: queryType }),\n [chain, address, cursor, limit, sortBy, queryType],\n );\n\n const { data, isPending, isFetching } = useWalletActivitiesQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const liveEligible =\n sortBy === \"timestamp\" && typeFilter === \"all\" && cursor == null;\n\n useWalletActivitiesSubscription({ chain, address }, (incoming) => {\n if (!liveEligible || !incoming?.length) return;\n setLiveFront((prev) => {\n const seen = new Set(prev.map((a) => a.txHash));\n const fresh = incoming.filter((a) => !seen.has(a.txHash));\n if (fresh.length === 0) return prev;\n return [...fresh, ...prev].slice(0, 100);\n });\n });\n\n const activities = useMemo(() => {\n const paged = pages.flatMap((p) => p.data);\n if (!liveEligible || liveFront.length === 0) return paged;\n const seen = new Set(paged.map((a) => a.txHash));\n const frontFiltered = liveFront.filter((a) => !seen.has(a.txHash));\n return [...frontFiltered, ...paged];\n }, [pages, liveFront, liveEligible]);\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n activities,\n isLoading: isPending || isFetching,\n sortBy,\n setSortBy,\n typeFilter,\n setTypeFilter,\n hasMore,\n loadMore,\n };\n}\n","import type { Activity, Chain } from \"@liberfi.io/types\";\nimport { usePortfolioActivitiesScript } from \"./portfolio-activities.script\";\nimport {\n PortfolioActivities,\n type PortfolioActivitiesSortBy,\n type PortfolioActivitiesTypeFilter,\n} from \"./portfolio-activities.ui\";\n\nexport interface PortfolioActivitiesWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n initialSortBy?: PortfolioActivitiesSortBy;\n initialTypeFilter?: PortfolioActivitiesTypeFilter;\n nativeDecimals?: number;\n nativeSymbol?: string;\n className?: string;\n onRowClick?: (activity: Activity) => void;\n}\n\n/**\n * Phase 3 wallet activities widget. Consumes\n * `GET /v2/trade/{chain}/activities?walletAddress=…` via `useWalletActivitiesQuery`.\n */\nexport function PortfolioActivitiesWidget({\n chain,\n address,\n limit,\n initialSortBy,\n initialTypeFilter,\n nativeDecimals,\n nativeSymbol,\n className,\n onRowClick,\n}: PortfolioActivitiesWidgetProps) {\n const {\n activities,\n isLoading,\n sortBy,\n setSortBy,\n typeFilter,\n setTypeFilter,\n hasMore,\n loadMore,\n } = usePortfolioActivitiesScript({\n chain,\n address,\n limit,\n initialSortBy,\n initialTypeFilter,\n });\n\n return (\n <PortfolioActivities\n activities={activities}\n isLoading={isLoading}\n sortBy={sortBy}\n onSortByChange={setSortBy}\n typeFilter={typeFilter}\n onTypeFilterChange={setTypeFilter}\n hasMore={hasMore}\n onLoadMore={loadMore}\n className={className}\n nativeDecimals={nativeDecimals}\n nativeSymbol={nativeSymbol}\n onRowClick={onRowClick}\n />\n );\n}\n","import type { Portfolio, WalletPortfolios } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmount,\n formatAmountUSDCompact,\n formatPriceUSD,\n} from \"@liberfi.io/utils\";\nimport { formatAgeShort, truncateMiddle, TagBadgeList } from \"../shared\";\n\nexport interface PortfolioNetWorthTokensProps {\n data?: WalletPortfolios;\n isLoading?: boolean;\n className?: string;\n now?: number;\n onRowClick?: (portfolio: Portfolio) => void;\n onLoadMore?: () => void;\n hasMore?: boolean;\n}\n\n/**\n * Presentational net-worth-by-token table (Phase 3).\n *\n * Columns:\n * - Token (symbol + truncated address)\n * - Amount (native token)\n * - Value (USD)\n * - Avg cost (USD) — sparse (~0.2% fill)\n * - Tags (wallet-for-token classifications)\n * - Last active\n */\nexport function PortfolioNetWorthTokens({\n data,\n isLoading,\n className,\n now = Date.now(),\n onRowClick,\n onLoadMore,\n hasMore,\n}: PortfolioNetWorthTokensProps) {\n return (\n <div className={cn(\"flex flex-col\", className)}>\n <div className=\"flex items-baseline justify-between px-3 py-2\">\n <span className=\"text-xs font-medium text-default-500\">\n Holdings\n {data && (\n <span className=\"ml-2 text-[10px] text-default-400\">\n Net worth {formatAmountUSDCompact(data.balanceInUsd)}\n </span>\n )}\n </span>\n </div>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[720px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[28%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Amount\n </th>\n <th className=\"w-[15%] px-3 py-2 text-right font-normal\">\n Value\n </th>\n <th className=\"w-[14%] px-3 py-2 text-right font-normal\">\n Avg cost\n </th>\n <th className=\"w-[16%] px-3 py-2 text-left font-normal\">Tags</th>\n <th className=\"w-[12%] px-3 py-2 text-right font-normal\">\n Last active\n </th>\n </tr>\n </thead>\n <tbody>\n {(!data || data.portfolios.length === 0) && !isLoading && (\n <tr>\n <td colSpan={6} className=\"py-8 text-center text-default-400\">\n No holdings\n </td>\n </tr>\n )}\n {data?.portfolios.map((p) => (\n <Row\n key={`${p.chain}-${p.address}`}\n portfolio={p}\n now={now}\n onRowClick={onRowClick}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={6} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction Row({\n portfolio,\n now,\n onRowClick,\n}: {\n portfolio: Portfolio;\n now: number;\n onRowClick?: (portfolio: Portfolio) => void;\n}) {\n return (\n <tr\n className={cn(\n \"border-b border-default-50 hover:bg-default-50/60\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(portfolio) : undefined}\n >\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground\">{portfolio.symbol}</span>\n <span className=\"font-mono text-[10px] text-default-400\">\n {truncateMiddle(portfolio.address, 6, 6)}\n </span>\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-500\">\n {formatAmount(portfolio.amount)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {formatAmountUSDCompact(portfolio.amountInUsd)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {portfolio.avgCostUsd ? formatPriceUSD(portfolio.avgCostUsd) : \"--\"}\n </td>\n <td className=\"px-3 py-2 align-middle\">\n <TagBadgeList tags={portfolio.walletTokenTags} max={2} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {portfolio.lastActiveAt\n ? formatAgeShort(portfolio.lastActiveAt, now)\n : \"--\"}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useWalletPortfoliosQuery } from \"@liberfi.io/react\";\nimport type { Chain, WalletPortfolios } from \"@liberfi.io/types\";\n\nexport interface UsePortfolioNetWorthTokensScriptParams {\n chain: Chain;\n address: string;\n /** page size */\n limit?: number;\n}\n\nexport interface UsePortfolioNetWorthTokensScriptResult {\n data?: WalletPortfolios;\n isLoading: boolean;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the Phase 3 portfolio net-worth-tokens list.\n *\n * Pagination: we accumulate pages into a single `WalletPortfolios` object so\n * the UI can show the full list with infinite-scroll semantics while still\n * carrying the summary fields (`balanceInUsd`, `balanceInNative`) from the\n * first page.\n */\nexport function usePortfolioNetWorthTokensScript({\n chain,\n address,\n limit = 50,\n}: UsePortfolioNetWorthTokensScriptParams): UsePortfolioNetWorthTokensScriptResult {\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<WalletPortfolios>>([]);\n\n useEffect(() => {\n setPages([]);\n setCursor(undefined);\n }, [chain, address]);\n\n const { data, isPending, isFetching } = useWalletPortfoliosQuery({\n chain,\n address,\n cursor,\n limit,\n });\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const merged = useMemo<WalletPortfolios | undefined>(() => {\n if (pages.length === 0) return undefined;\n const first = pages[0];\n return {\n ...first,\n portfolios: pages.flatMap((p) => p.portfolios),\n };\n }, [pages]);\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n data: merged,\n isLoading: isPending || isFetching,\n hasMore,\n loadMore,\n };\n}\n","import type { Chain, Portfolio } from \"@liberfi.io/types\";\nimport { usePortfolioNetWorthTokensScript } from \"./portfolio-net-worth-tokens.script\";\nimport { PortfolioNetWorthTokens } from \"./portfolio-net-worth-tokens.ui\";\n\nexport interface PortfolioNetWorthTokensWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n className?: string;\n onRowClick?: (portfolio: Portfolio) => void;\n}\n\n/**\n * Phase 3 net-worth-by-token widget. Consumes\n * `GET /v2/wallet/{chain}/{wallet}/net-worth/tokens` via\n * `useWalletPortfoliosQuery` and surfaces the new fields\n * (`isActive`, `avgCostUsd`, `lastActiveAt`, `walletTokenTags`).\n */\nexport function PortfolioNetWorthTokensWidget({\n chain,\n address,\n limit,\n className,\n onRowClick,\n}: PortfolioNetWorthTokensWidgetProps) {\n const { data, isLoading, hasMore, loadMore } =\n usePortfolioNetWorthTokensScript({ chain, address, limit });\n\n return (\n <PortfolioNetWorthTokens\n data={data}\n isLoading={isLoading}\n className={className}\n hasMore={hasMore}\n onLoadMore={loadMore}\n onRowClick={onRowClick}\n />\n );\n}\n","import type { API, PortfolioPnl, WalletPortfolioPnls } from \"@liberfi.io/types\";\nimport { cn } from \"@liberfi.io/ui\";\nimport {\n formatAmountUSDCompact,\n formatPercent,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { formatAgeShort, truncateMiddle } from \"../shared\";\n\nexport type PnlResolution = API.WalletPnlResolution;\nexport type PositionState = API.PositionState;\nexport type PnlSortBy = API.WalletPnlSortBy;\n\nexport interface PortfolioPnlDetailsProps {\n data?: WalletPortfolioPnls;\n isLoading?: boolean;\n resolution: PnlResolution;\n onResolutionChange: (r: PnlResolution) => void;\n positionState: PositionState;\n onPositionStateChange: (p: PositionState) => void;\n sortBy: PnlSortBy;\n onSortByChange: (s: PnlSortBy) => void;\n hasMore?: boolean;\n onLoadMore?: () => void;\n now?: number;\n className?: string;\n onRowClick?: (pnl: PortfolioPnl) => void;\n}\n\nconst RESOLUTION_OPTIONS: Array<{ value: PnlResolution; label: string }> = [\n { value: \"7d\", label: \"7D\" },\n { value: \"30d\", label: \"30D\" },\n { value: \"90d\", label: \"90D\" },\n];\n\nconst POSITION_OPTIONS: Array<{ value: PositionState; label: string }> = [\n { value: \"open\", label: \"Open\" },\n { value: \"closed\", label: \"Closed\" },\n { value: \"all\", label: \"All\" },\n];\n\nconst SORT_OPTIONS: Array<{ value: PnlSortBy; label: string }> = [\n { value: \"totalPnl\", label: \"Total\" },\n { value: \"realizedPnl\", label: \"Realized\" },\n { value: \"unrealizedPnl\", label: \"Unrealized\" },\n];\n\n/**\n * Presentational PnL details table (Phase 3). Shows per-position realized /\n * unrealized / total PnL and the new Phase 3 fields (`isClosed`, `firstBuyAt`,\n * `lastSellAt`). The summary row at the top shows aggregate PnL and win rate.\n */\nexport function PortfolioPnlDetails({\n data,\n isLoading,\n resolution,\n onResolutionChange,\n positionState,\n onPositionStateChange,\n sortBy,\n onSortByChange,\n hasMore,\n onLoadMore,\n now = Date.now(),\n className,\n onRowClick,\n}: PortfolioPnlDetailsProps) {\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <div className=\"flex flex-wrap items-center justify-between gap-2 px-3 py-2\">\n <FilterGroup\n label=\"Window\"\n options={RESOLUTION_OPTIONS}\n value={resolution}\n onChange={onResolutionChange}\n />\n <FilterGroup\n label=\"Status\"\n options={POSITION_OPTIONS}\n value={positionState}\n onChange={onPositionStateChange}\n />\n <FilterGroup\n label=\"Sort\"\n options={SORT_OPTIONS}\n value={sortBy}\n onChange={onSortByChange}\n />\n </div>\n\n {data && <SummaryCard data={data} />}\n\n <div className=\"overflow-x-auto\">\n <table className=\"w-full min-w-[780px] table-fixed text-[12px]\">\n <thead className=\"text-default-400\">\n <tr className=\"border-b border-default-100\">\n <th className=\"w-[22%] px-3 py-2 text-left font-normal\">Token</th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Holding\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Total PnL\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Realized\n </th>\n <th className=\"w-[13%] px-3 py-2 text-right font-normal\">\n Unrealized\n </th>\n <th className=\"w-[8%] px-3 py-2 text-right font-normal\">State</th>\n <th className=\"w-[9%] px-3 py-2 text-right font-normal\">\n First buy\n </th>\n <th className=\"w-[9%] px-3 py-2 text-right font-normal\">\n Last sell\n </th>\n </tr>\n </thead>\n <tbody>\n {(!data || data.portfolios.length === 0) && !isLoading && (\n <tr>\n <td colSpan={8} className=\"py-8 text-center text-default-400\">\n No positions\n </td>\n </tr>\n )}\n {data?.portfolios.map((p) => (\n <Row\n key={`${p.chain}-${p.address}`}\n pnl={p}\n now={now}\n onRowClick={onRowClick}\n />\n ))}\n {isLoading && (\n <tr>\n <td colSpan={8} className=\"py-4 text-center text-default-400\">\n Loading…\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n\n {hasMore && (\n <div className=\"flex justify-center px-3 py-2\">\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={isLoading}\n className=\"rounded bg-default-100 px-3 py-1 text-[11px] text-default-600 transition-colors hover:bg-default-200 disabled:opacity-50\"\n >\n Load more\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction FilterGroup<T extends string>({\n label,\n options,\n value,\n onChange,\n}: {\n label: string;\n options: Array<{ value: T; label: string }>;\n value: T;\n onChange: (v: T) => void;\n}) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[10px] uppercase tracking-wide text-default-400\">\n {label}\n </span>\n <div className=\"flex items-center gap-1\">\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"rounded px-2 py-1 text-[11px] transition-colors\",\n value === opt.value\n ? \"bg-default-100 text-foreground\"\n : \"text-default-400 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\nfunction SummaryCard({ data }: { data: WalletPortfolioPnls }) {\n const total = data.totalProfitInUsd;\n const totalRatio = data.totalProfitRatio;\n const win = data.winRate;\n return (\n <div className=\"mx-3 flex flex-wrap items-center gap-x-6 gap-y-2 rounded border border-default-100 bg-default-50 px-4 py-2 text-xs\">\n <SummaryStat\n label=\"Total PnL\"\n value={\n total\n ? formatAmountUSDCompact(total, { showPlusGtThanZero: true })\n : \"--\"\n }\n tone={total ? signTone(total) : undefined}\n />\n <SummaryStat\n label=\"Return\"\n value={\n totalRatio\n ? formatPercent(totalRatio, { showPlusGtThanZero: true })\n : \"--\"\n }\n tone={totalRatio ? signTone(totalRatio) : undefined}\n />\n <SummaryStat label=\"Win rate\" value={win ? formatPercent(win) : \"--\"} />\n <SummaryStat\n label=\"Trades\"\n value={data.totalTrades != null ? data.totalTrades.toString() : \"--\"}\n />\n </div>\n );\n}\n\nfunction signTone(value: string): \"bullish\" | \"bearish\" | undefined {\n const bn = new SafeBigNumber(value);\n if (bn.gt(0)) return \"bullish\";\n if (bn.lt(0)) return \"bearish\";\n return undefined;\n}\n\nfunction SummaryStat({\n label,\n value,\n tone,\n}: {\n label: string;\n value: string;\n tone?: \"bullish\" | \"bearish\";\n}) {\n return (\n <div className=\"flex flex-col\">\n <span className=\"text-[10px] uppercase tracking-wide text-default-400\">\n {label}\n </span>\n <span\n className={cn(\n \"text-sm font-medium\",\n tone === \"bullish\"\n ? \"text-bullish\"\n : tone === \"bearish\"\n ? \"text-bearish\"\n : \"text-foreground\",\n )}\n >\n {value}\n </span>\n </div>\n );\n}\n\nfunction PnlCell({ value }: { value?: string }) {\n if (!value) return <span className=\"text-default-400\">--</span>;\n const bn = new SafeBigNumber(value);\n const cls = bn.gt(0)\n ? \"text-bullish\"\n : bn.lt(0)\n ? \"text-bearish\"\n : \"text-default-500\";\n return (\n <span className={cls}>\n {formatAmountUSDCompact(value, { showPlusGtThanZero: true })}\n </span>\n );\n}\n\nfunction Row({\n pnl,\n now,\n onRowClick,\n}: {\n pnl: PortfolioPnl;\n now: number;\n onRowClick?: (pnl: PortfolioPnl) => void;\n}) {\n return (\n <tr\n className={cn(\n \"border-b border-default-50 hover:bg-default-50/60\",\n onRowClick && \"cursor-pointer\",\n )}\n onClick={onRowClick ? () => onRowClick(pnl) : undefined}\n >\n <td className=\"px-3 py-2 align-middle\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground\">{pnl.symbol}</span>\n <span className=\"font-mono text-[10px] text-default-400\">\n {truncateMiddle(pnl.address, 6, 6)}\n </span>\n </div>\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-foreground\">\n {formatAmountUSDCompact(pnl.amountInUsd)}\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n <PnlCell value={pnl.totalProfitInUsd} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n <PnlCell value={pnl.realizedProfitInUsd} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle\">\n <PnlCell value={pnl.unrealizedProfitInUsd} />\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-[10px]\">\n <span\n className={cn(\n \"rounded px-1.5 py-0.5\",\n pnl.isClosed\n ? \"bg-default/20 text-default-500\"\n : \"bg-bullish/15 text-bullish\",\n )}\n >\n {pnl.isClosed ? \"Closed\" : \"Open\"}\n </span>\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {pnl.firstBuyAt ? formatAgeShort(pnl.firstBuyAt, now) : \"--\"}\n </td>\n <td className=\"px-3 py-2 text-right align-middle text-default-400\">\n {pnl.lastSellAt ? formatAgeShort(pnl.lastSellAt, now) : \"--\"}\n </td>\n </tr>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useWalletPortfolioPnlsQuery } from \"@liberfi.io/react\";\nimport type { Chain, WalletPortfolioPnls } from \"@liberfi.io/types\";\nimport type {\n PnlResolution,\n PnlSortBy,\n PositionState,\n} from \"./portfolio-pnl-details.ui\";\n\nexport interface UsePortfolioPnlDetailsScriptParams {\n chain: Chain;\n address: string;\n limit?: number;\n initialResolution?: PnlResolution;\n initialPositionState?: PositionState;\n initialSortBy?: PnlSortBy;\n}\n\nexport interface UsePortfolioPnlDetailsScriptResult {\n data?: WalletPortfolioPnls;\n isLoading: boolean;\n resolution: PnlResolution;\n setResolution: (r: PnlResolution) => void;\n positionState: PositionState;\n setPositionState: (p: PositionState) => void;\n sortBy: PnlSortBy;\n setSortBy: (s: PnlSortBy) => void;\n hasMore: boolean;\n loadMore: () => void;\n}\n\n/**\n * Script for the Phase 3 PnL-details widget.\n *\n * Pagination: accumulates cursor pages into a single `WalletPortfolioPnls`\n * while keeping the header summary from the first page. Any of\n * `resolution` / `positionState` / `sortBy` / `chain` / `address` changing\n * triggers a full reset — the server invalidates cursors on any of these\n * changes.\n */\nexport function usePortfolioPnlDetailsScript({\n chain,\n address,\n limit = 50,\n initialResolution = \"30d\",\n initialPositionState = \"open\",\n initialSortBy = \"totalPnl\",\n}: UsePortfolioPnlDetailsScriptParams): UsePortfolioPnlDetailsScriptResult {\n const [resolution, setResolutionState] =\n useState<PnlResolution>(initialResolution);\n const [positionState, setPositionStateState] =\n useState<PositionState>(initialPositionState);\n const [sortBy, setSortByState] = useState<PnlSortBy>(initialSortBy);\n const [cursor, setCursor] = useState<string | undefined>(undefined);\n const [pages, setPages] = useState<Array<WalletPortfolioPnls>>([]);\n\n const reset = useCallback(() => {\n setCursor(undefined);\n setPages([]);\n }, []);\n\n const setResolution = useCallback(\n (r: PnlResolution) => {\n if (r === resolution) return;\n setResolutionState(r);\n reset();\n },\n [resolution, reset],\n );\n\n const setPositionState = useCallback(\n (p: PositionState) => {\n if (p === positionState) return;\n setPositionStateState(p);\n reset();\n },\n [positionState, reset],\n );\n\n const setSortBy = useCallback(\n (s: PnlSortBy) => {\n if (s === sortBy) return;\n setSortByState(s);\n reset();\n },\n [sortBy, reset],\n );\n\n useEffect(() => {\n reset();\n }, [chain, address, reset]);\n\n const queryParams = useMemo(\n () => ({\n chain,\n address,\n cursor,\n limit,\n resolution,\n positionState,\n sortBy,\n }),\n [chain, address, cursor, limit, resolution, positionState, sortBy],\n );\n\n const { data, isPending, isFetching } =\n useWalletPortfolioPnlsQuery(queryParams);\n\n useEffect(() => {\n if (!data) return;\n setPages((prev) => {\n if (cursor == null) return [data];\n if (prev[prev.length - 1]?.endCursor === data.endCursor) return prev;\n return [...prev, data];\n });\n }, [data, cursor]);\n\n const merged = useMemo<WalletPortfolioPnls | undefined>(() => {\n if (pages.length === 0) return undefined;\n const first = pages[0];\n return {\n ...first,\n portfolios: pages.flatMap((p) => p.portfolios),\n };\n }, [pages]);\n\n const lastPage = pages[pages.length - 1];\n const hasMore = !!(lastPage?.hasNext && lastPage.endCursor);\n\n const loadMore = useCallback(() => {\n if (!lastPage?.endCursor || !lastPage.hasNext) return;\n setCursor(lastPage.endCursor);\n }, [lastPage]);\n\n return {\n data: merged,\n isLoading: isPending || isFetching,\n resolution,\n setResolution,\n positionState,\n setPositionState,\n sortBy,\n setSortBy,\n hasMore,\n loadMore,\n };\n}\n","import type { Chain, PortfolioPnl } from \"@liberfi.io/types\";\nimport { usePortfolioPnlDetailsScript } from \"./portfolio-pnl-details.script\";\nimport {\n PortfolioPnlDetails,\n type PnlResolution,\n type PnlSortBy,\n type PositionState,\n} from \"./portfolio-pnl-details.ui\";\n\nexport interface PortfolioPnlDetailsWidgetProps {\n chain: Chain;\n address: string;\n limit?: number;\n initialResolution?: PnlResolution;\n initialPositionState?: PositionState;\n initialSortBy?: PnlSortBy;\n className?: string;\n onRowClick?: (pnl: PortfolioPnl) => void;\n}\n\n/**\n * Phase 3 PnL-details widget. Consumes\n * `GET /v2/wallet/{chain}/{wallet}/pnl-details` via\n * `useWalletPortfolioPnlsQuery` and renders the new fields (`isClosed`,\n * `firstBuyAt`, `lastSellAt`) alongside resolution / positionState / sortBy\n * selectors.\n */\nexport function PortfolioPnlDetailsWidget({\n chain,\n address,\n limit,\n initialResolution,\n initialPositionState,\n initialSortBy,\n className,\n onRowClick,\n}: PortfolioPnlDetailsWidgetProps) {\n const {\n data,\n isLoading,\n resolution,\n setResolution,\n positionState,\n setPositionState,\n sortBy,\n setSortBy,\n hasMore,\n loadMore,\n } = usePortfolioPnlDetailsScript({\n chain,\n address,\n limit,\n initialResolution,\n initialPositionState,\n initialSortBy,\n });\n\n return (\n <PortfolioPnlDetails\n data={data}\n isLoading={isLoading}\n resolution={resolution}\n onResolutionChange={setResolution}\n positionState={positionState}\n onPositionStateChange={setPositionState}\n sortBy={sortBy}\n onSortByChange={setSortBy}\n hasMore={hasMore}\n onLoadMore={loadMore}\n className={className}\n onRowClick={onRowClick}\n />\n );\n}\n","import type { PropsWithChildren } from \"react\";\nimport { PortfolioClientContext } from \"../contexts/PortfolioClientContext\";\nimport type { IPortfolioClient } from \"../types\";\n\nexport type PortfolioClientProviderProps = PropsWithChildren<{\n client: IPortfolioClient;\n}>;\n\nexport function PortfolioClientProvider({\n client,\n children,\n}: PortfolioClientProviderProps) {\n return (\n <PortfolioClientContext.Provider value={client}>\n {children}\n </PortfolioClientContext.Provider>\n );\n}\n","import { useCallback, useContext, useEffect } from \"react\";\nimport {\n useWalletPnlQuery,\n useWalletPortfoliosQuery,\n useWalletPnlSubscription,\n} from \"@liberfi.io/react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { PortfolioInternalContext } from \"../contexts/PortfolioContext\";\n\nconst SUMMARY_POLL_MS = 15_000;\n\n/** Pick only defined (non-undefined) entries from an object. */\nfunction definedEntries<T extends object>(obj: T): Partial<T> {\n return Object.fromEntries(\n Object.entries(obj).filter(([, v]) => v !== undefined),\n ) as Partial<T>;\n}\n\nexport interface UseWalletStateManagerParams {\n chain: Chain;\n address: string;\n enabled?: boolean;\n summaryPollMs?: number;\n}\n\n/**\n * Mounts the wallet summary state engine: queries, polls, and subscribes to\n * wallet balance + PnL summary, writing results to the Provider's context state.\n * Call this once near the top of the component tree (inside PortfolioProvider).\n */\nexport function useWalletStateManager({\n chain,\n address,\n enabled = true,\n summaryPollMs = SUMMARY_POLL_MS,\n}: UseWalletStateManagerParams) {\n const { setSummary, setSummaryStatus, setRefetchSummary } = useContext(\n PortfolioInternalContext,\n );\n\n const portfoliosQuery = useWalletPortfoliosQuery(\n { chain, address },\n { enabled, refetchInterval: summaryPollMs },\n );\n\n const pnlQuery = useWalletPnlQuery(\n { chain, address },\n { enabled, refetchInterval: summaryPollMs },\n );\n\n // Clear summary when chain or address changes so we don't show stale data\n // (e.g. old chain's native token) while the new chain's data is loading.\n useEffect(() => {\n setSummary(null);\n }, [chain, address, setSummary]);\n\n useEffect(() => {\n const isPending = portfoliosQuery.isPending || pnlQuery.isPending;\n const isFetching = portfoliosQuery.isFetching || pnlQuery.isFetching;\n const isError = portfoliosQuery.isError || pnlQuery.isError;\n const isSuccess = portfoliosQuery.isSuccess && pnlQuery.isSuccess;\n\n setSummaryStatus({\n status: isError ? \"error\" : isSuccess ? \"success\" : \"pending\",\n fetchStatus: isFetching ? \"fetching\" : \"idle\",\n isLoading: isPending && isFetching,\n isPending,\n isFetching,\n isRefetching: isSuccess && isFetching,\n isError,\n isSuccess,\n error: portfoliosQuery.error ?? pnlQuery.error,\n dataUpdatedAt: Math.max(\n portfoliosQuery.dataUpdatedAt,\n pnlQuery.dataUpdatedAt,\n ),\n });\n }, [\n portfoliosQuery.isPending,\n portfoliosQuery.isFetching,\n portfoliosQuery.isError,\n portfoliosQuery.isSuccess,\n portfoliosQuery.error,\n portfoliosQuery.dataUpdatedAt,\n pnlQuery.isPending,\n pnlQuery.isFetching,\n pnlQuery.isError,\n pnlQuery.isSuccess,\n pnlQuery.error,\n pnlQuery.dataUpdatedAt,\n setSummaryStatus,\n ]);\n\n useEffect(() => {\n const portfoliosData = portfoliosQuery.data;\n const pnlData = pnlQuery.data;\n if (!portfoliosData || !pnlData) return;\n\n setSummary({\n ...pnlData,\n balanceInUsd: portfoliosData.balanceInUsd,\n balanceInNative: portfoliosData.balanceInNative,\n });\n }, [portfoliosQuery.data, pnlQuery.data, setSummary]);\n\n useWalletPnlSubscription(\n { chain, address },\n (pnls) => {\n setSummary((prev) => {\n if (!prev) return prev;\n let updated = prev;\n for (const p of pnls) {\n updated = { ...updated, ...definedEntries(p) };\n }\n return updated;\n });\n },\n { enabled },\n );\n\n const refetchSummary = useCallback(async () => {\n await Promise.all([portfoliosQuery.refetch(), pnlQuery.refetch()]);\n }, [portfoliosQuery, pnlQuery]);\n\n useEffect(() => {\n setRefetchSummary(refetchSummary);\n }, [refetchSummary, setRefetchSummary]);\n}\n","import type { PropsWithChildren, ReactNode } from \"react\";\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { Chain } from \"@liberfi.io/types\";\nimport { PortfolioContext } from \"../contexts\";\nimport { PortfolioInternalContext } from \"../contexts/PortfolioContext\";\nimport { useWalletStateManager } from \"../hooks/useWalletStateManager\";\nimport type { AsyncStatus, WalletSummary } from \"../types\";\n\nexport type PortfolioProviderProps = PropsWithChildren<{\n chain: Chain;\n address: string;\n}>;\n\nexport function PortfolioProvider({\n chain,\n address,\n children,\n}: PortfolioProviderProps) {\n const [summary, setSummary] = useState<WalletSummary | null>(null);\n const [summaryStatus, setSummaryStatus] = useState(INITIAL_ASYNC_STATUS);\n const refetchRef = useRef<() => Promise<void>>(() => Promise.resolve());\n\n const refetchSummary = useCallback(() => refetchRef.current(), []);\n const setRefetchSummary = useCallback((fn: () => Promise<void>) => {\n refetchRef.current = fn;\n }, []);\n\n const publicValue = useMemo(\n () => ({ summary, summaryStatus, refetchSummary }),\n [summary, summaryStatus, refetchSummary],\n );\n\n const internalValue = useMemo(\n () => ({ setSummary, setSummaryStatus, setRefetchSummary }),\n [setSummary, setSummaryStatus, setRefetchSummary],\n );\n\n return (\n <PortfolioInternalContext.Provider value={internalValue}>\n <PortfolioContext.Provider value={publicValue}>\n <StateManagerBridge chain={chain} address={address}>\n {children}\n </StateManagerBridge>\n </PortfolioContext.Provider>\n </PortfolioInternalContext.Provider>\n );\n}\n\ninterface StateManagerBridgeProps {\n chain: Chain;\n address: string;\n children: ReactNode;\n}\n\n/** Mounts useWalletStateManager inside both Context providers. */\nfunction StateManagerBridge({\n chain,\n address,\n children,\n}: StateManagerBridgeProps) {\n useWalletStateManager({ chain, address, enabled: !!address });\n return <>{children}</>;\n}\n\n// ── Constants ───────────────────────────────────────────────────────────────\n\nexport const INITIAL_ASYNC_STATUS: AsyncStatus = {\n status: \"pending\",\n fetchStatus: \"idle\",\n isLoading: false,\n isPending: true,\n isFetching: false,\n isRefetching: false,\n isError: false,\n isSuccess: false,\n error: null,\n dataUpdatedAt: 0,\n};\n"]}
|