import type { InvestmentResourceMeta } from "@/shared/api"; import type { BrokerageAccount, } from "../api/useBrokerageAccounts"; const VISIBLE_CURRENCY_LIMIT = 2; type BrokerageAccountCard = { account: BrokerageAccount; positionCounts: null | PositionCounts; source?: NonNullable[number]; summary: | { portfolio: NonNullable; remainingCurrencyCount: number; state: "available"; totals: Money[]; } | { state: "empty" } | { state: "unavailable" }; }; type Money = NonNullable< BrokerageAccount["portfolioSummary"] >["totalsByCurrency"][number]; type PositionCounts = { bonds: number; stocks: number; total: number }; function accountTypeKey(type: BrokerageAccount["type"]) { return `accounts.types.${type}` as const; } function brokerageAccountCards( accounts: BrokerageAccount[], dependencies: InvestmentResourceMeta["dependencies"] = [], ): BrokerageAccountCard[] { return accounts.map((account) => { const source = dependencies.find( item => item.resourceKey === `portfolio/${encodeURIComponent(account.id)}`, ); const summary = account.portfolioSummary; if (!summary) return { account, positionCounts: null, source, summary: { state: "unavailable" }, }; const positionCounts = { bonds: summary.bondPositionCount, stocks: summary.stockPositionCount, total: summary.totalPositionCount, }; if (summary.totalsByCurrency.length === 0) return { account, positionCounts, source, summary: { state: "empty" } }; return { account, positionCounts, source, summary: { portfolio: summary, remainingCurrencyCount: Math.max( summary.totalsByCurrency.length - VISIBLE_CURRENCY_LIMIT, 0, ), state: "available", totals: summary.totalsByCurrency.slice(0, VISIBLE_CURRENCY_LIMIT), }, }; }); } export { accountTypeKey, type BrokerageAccountCard, brokerageAccountCards };