diff --git a/apps/bot/src/miniapp-dashboard.test.ts b/apps/bot/src/miniapp-dashboard.test.ts index 91e342b..8f0a264 100644 --- a/apps/bot/src/miniapp-dashboard.test.ts +++ b/apps/bot/src/miniapp-dashboard.test.ts @@ -63,6 +63,7 @@ function repository( id: 'purchase-1', payerMemberId: member?.id ?? 'member-1', amountMinor: 3000n, + currency: 'GEL', description: 'Soap', occurredAt: instantFromIso('2026-03-12T11:00:00.000Z') } @@ -244,10 +245,12 @@ describe('createMiniAppDashboardHandler', () => { ], ledger: [ { - title: 'Soap' + title: 'Soap', + currency: 'GEL' }, { - title: 'Electricity' + title: 'Electricity', + currency: 'USD' } ] } diff --git a/apps/bot/src/miniapp-dashboard.ts b/apps/bot/src/miniapp-dashboard.ts index a00ce12..fc13291 100644 --- a/apps/bot/src/miniapp-dashboard.ts +++ b/apps/bot/src/miniapp-dashboard.ts @@ -103,6 +103,7 @@ export function createMiniAppDashboardHandler(options: { kind: entry.kind, title: entry.title, amountMajor: entry.amount.toMajorString(), + currency: entry.currency, actorDisplayName: entry.actorDisplayName, occurredAt: entry.occurredAt })) diff --git a/apps/miniapp/src/App.tsx b/apps/miniapp/src/App.tsx index 9de0c93..b5a2c60 100644 --- a/apps/miniapp/src/App.tsx +++ b/apps/miniapp/src/App.tsx @@ -413,6 +413,7 @@ function App() { kind: 'purchase', title: 'Soap', amountMajor: '30.00', + currency: 'GEL', actorDisplayName: 'Alice', occurredAt: '2026-03-12T11:00:00.000Z' }, @@ -421,6 +422,7 @@ function App() { kind: 'utility', title: 'Electricity', amountMajor: '120.00', + currency: 'GEL', actorDisplayName: 'Alice', occurredAt: '2026-03-12T12:00:00.000Z' } @@ -898,7 +900,7 @@ function App() { {copy().emptyDashboard}

} - render={(data) => ( + render={() => ( <>
@@ -913,7 +915,7 @@ function App() {
{entry.title} - {entry.amountMajor} {data.currency} + {entry.amountMajor} {entry.currency}

{entry.actorDisplayName ?? copy().ledgerActorFallback}

@@ -935,7 +937,7 @@ function App() {
{entry.title} - {entry.amountMajor} {data.currency} + {entry.amountMajor} {entry.currency}

{entry.actorDisplayName ?? copy().ledgerActorFallback}

@@ -1564,7 +1566,7 @@ function App() {
{entry.title} - {entry.amountMajor} {data.currency} + {entry.amountMajor} {entry.currency}

{entry.actorDisplayName ?? copy().ledgerActorFallback}

diff --git a/apps/miniapp/src/index.css b/apps/miniapp/src/index.css index e29ed1e..48eefad 100644 --- a/apps/miniapp/src/index.css +++ b/apps/miniapp/src/index.css @@ -252,9 +252,9 @@ button { .balance-item header, .ledger-item header { - display: flex; - align-items: baseline; - justify-content: space-between; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: start; gap: 12px; margin-bottom: 10px; } @@ -262,6 +262,7 @@ button { .balance-item strong, .ledger-item strong { font-size: 1rem; + overflow-wrap: anywhere; } .balance-item p, @@ -298,7 +299,7 @@ button { .settings-grid { display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: minmax(0, 1fr); gap: 12px; margin-top: 12px; } @@ -362,10 +363,16 @@ button { } .settings-grid { - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(2, minmax(0, 1fr)); } .panel--wide { grid-column: 1 / -1; } } + +@media (min-width: 980px) { + .settings-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} diff --git a/apps/miniapp/src/miniapp-api.ts b/apps/miniapp/src/miniapp-api.ts index 59d3737..18755bb 100644 --- a/apps/miniapp/src/miniapp-api.ts +++ b/apps/miniapp/src/miniapp-api.ts @@ -81,6 +81,7 @@ export interface MiniAppDashboard { kind: 'purchase' | 'utility' title: string amountMajor: string + currency: 'USD' | 'GEL' actorDisplayName: string | null occurredAt: string | null }[] diff --git a/packages/adapters-db/src/finance-repository.ts b/packages/adapters-db/src/finance-repository.ts index d1822d8..f4ed1ad 100644 --- a/packages/adapters-db/src/finance-repository.ts +++ b/packages/adapters-db/src/finance-repository.ts @@ -283,6 +283,7 @@ export function createDbFinanceRepository( id: schema.purchaseMessages.id, payerMemberId: schema.purchaseMessages.senderMemberId, amountMinor: schema.purchaseMessages.parsedAmountMinor, + currency: schema.purchaseMessages.parsedCurrency, description: schema.purchaseMessages.parsedItemDescription, occurredAt: schema.purchaseMessages.messageSentAt }) @@ -292,6 +293,7 @@ export function createDbFinanceRepository( eq(schema.purchaseMessages.householdId, householdId), isNotNull(schema.purchaseMessages.senderMemberId), isNotNull(schema.purchaseMessages.parsedAmountMinor), + isNotNull(schema.purchaseMessages.parsedCurrency), gte(schema.purchaseMessages.messageSentAt, instantToDate(start)), lt(schema.purchaseMessages.messageSentAt, instantToDate(end)) ) @@ -301,6 +303,7 @@ export function createDbFinanceRepository( id: row.id, payerMemberId: row.payerMemberId!, amountMinor: row.amountMinor!, + currency: toCurrencyCode(row.currency!), description: row.description, occurredAt: instantFromDatabaseValue(row.occurredAt) })) diff --git a/packages/application/src/finance-command-service.test.ts b/packages/application/src/finance-command-service.test.ts index 79a6b5a..39980bd 100644 --- a/packages/application/src/finance-command-service.test.ts +++ b/packages/application/src/finance-command-service.test.ts @@ -247,6 +247,7 @@ describe('createFinanceCommandService', () => { id: 'purchase-1', payerMemberId: 'alice', amountMinor: 3000n, + currency: 'GEL', description: 'Soap', occurredAt: instantFromIso('2026-03-12T11:00:00.000Z') } @@ -259,6 +260,7 @@ describe('createFinanceCommandService', () => { expect(dashboard).not.toBeNull() expect(dashboard?.members.map((line) => line.netDue.amountMinor)).toEqual([39500n, 42500n]) expect(dashboard?.ledger.map((entry) => entry.title)).toEqual(['Soap', 'Electricity']) + expect(dashboard?.ledger.map((entry) => entry.currency)).toEqual(['GEL', 'USD']) expect(statement).toBe( [ 'Statement for 2026-03', diff --git a/packages/application/src/finance-command-service.ts b/packages/application/src/finance-command-service.ts index 542520f..4418abc 100644 --- a/packages/application/src/finance-command-service.ts +++ b/packages/application/src/finance-command-service.ts @@ -72,6 +72,7 @@ export interface FinanceDashboardLedgerEntry { kind: 'purchase' | 'utility' title: string amount: Money + currency: CurrencyCode actorDisplayName: string | null occurredAt: string | null } @@ -182,6 +183,7 @@ async function buildFinanceDashboard( kind: 'utility' as const, title: bill.billName, amount: Money.fromMinor(bill.amountMinor, bill.currency), + currency: bill.currency, actorDisplayName: bill.createdByMemberId ? (memberNameById.get(bill.createdByMemberId) ?? null) : null, @@ -191,7 +193,8 @@ async function buildFinanceDashboard( id: purchase.id, kind: 'purchase' as const, title: purchase.description ?? 'Shared purchase', - amount: Money.fromMinor(purchase.amountMinor, rentRule.currency), + amount: Money.fromMinor(purchase.amountMinor, purchase.currency), + currency: purchase.currency, actorDisplayName: memberNameById.get(purchase.payerMemberId) ?? null, occurredAt: purchase.occurredAt?.toString() ?? null })) diff --git a/packages/ports/src/finance.ts b/packages/ports/src/finance.ts index 4f4e9a9..594fb84 100644 --- a/packages/ports/src/finance.ts +++ b/packages/ports/src/finance.ts @@ -23,6 +23,7 @@ export interface FinanceParsedPurchaseRecord { id: string payerMemberId: string amountMinor: bigint + currency: CurrencyCode description: string | null occurredAt: Instant | null }