fix(miniapp): make dashboard screens react to initial load

This commit is contained in:
2026-03-12 01:32:05 +04:00
parent 7005efbc7b
commit 7467d3a4cf
3 changed files with 700 additions and 687 deletions

View File

@@ -39,15 +39,16 @@ type Props = {
} }
export function BalancesScreen(props: Props) { export function BalancesScreen(props: Props) {
if (!props.dashboard) {
return ( return (
<Show
when={props.dashboard}
fallback={
<div class="balance-list"> <div class="balance-list">
<p>{props.copy.emptyDashboard ?? ''}</p> <p>{props.copy.emptyDashboard ?? ''}</p>
</div> </div>
)
} }
>
return ( {(dashboard) => (
<div class="balance-list"> <div class="balance-list">
<Show when={props.currentMemberLine}> <Show when={props.currentMemberLine}>
{(member) => ( {(member) => (
@@ -55,7 +56,7 @@ export function BalancesScreen(props: Props) {
<header> <header>
<strong>{props.copy.yourBalanceTitle ?? ''}</strong> <strong>{props.copy.yourBalanceTitle ?? ''}</strong>
<span> <span>
{member().netDueMajor} {props.dashboard!.currency} {member().netDueMajor} {dashboard().currency}
</span> </span>
</header> </header>
<p>{props.copy.yourBalanceBody ?? ''}</p> <p>{props.copy.yourBalanceBody ?? ''}</p>
@@ -63,31 +64,31 @@ export function BalancesScreen(props: Props) {
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.baseDue ?? ''}</span> <span>{props.copy.baseDue ?? ''}</span>
<strong> <strong>
{props.memberBaseDueMajor(member())} {props.dashboard!.currency} {props.memberBaseDueMajor(member())} {dashboard().currency}
</strong> </strong>
</article> </article>
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.shareOffset ?? ''}</span> <span>{props.copy.shareOffset ?? ''}</span>
<strong> <strong>
{member().purchaseOffsetMajor} {props.dashboard!.currency} {member().purchaseOffsetMajor} {dashboard().currency}
</strong> </strong>
</article> </article>
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.finalDue ?? ''}</span> <span>{props.copy.finalDue ?? ''}</span>
<strong> <strong>
{member().netDueMajor} {props.dashboard!.currency} {member().netDueMajor} {dashboard().currency}
</strong> </strong>
</article> </article>
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.paidLabel ?? ''}</span> <span>{props.copy.paidLabel ?? ''}</span>
<strong> <strong>
{member().paidMajor} {props.dashboard!.currency} {member().paidMajor} {dashboard().currency}
</strong> </strong>
</article> </article>
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.remainingLabel ?? ''}</span> <span>{props.copy.remainingLabel ?? ''}</span>
<strong> <strong>
{member().remainingMajor} {props.dashboard!.currency} {member().remainingMajor} {dashboard().currency}
</strong> </strong>
</article> </article>
</div> </div>
@@ -96,7 +97,7 @@ export function BalancesScreen(props: Props) {
</Show> </Show>
<div class="summary-card-grid"> <div class="summary-card-grid">
<FinanceSummaryCards <FinanceSummaryCards
dashboard={props.dashboard} dashboard={dashboard()}
utilityTotalMajor={props.utilityTotalMajor} utilityTotalMajor={props.utilityTotalMajor}
purchaseTotalMajor={props.purchaseTotalMajor} purchaseTotalMajor={props.purchaseTotalMajor}
labels={{ labels={{
@@ -108,7 +109,7 @@ export function BalancesScreen(props: Props) {
/> />
</div> </div>
<FinanceVisuals <FinanceVisuals
dashboard={props.dashboard} dashboard={dashboard()}
memberVisuals={props.memberBalanceVisuals} memberVisuals={props.memberBalanceVisuals}
purchaseChart={props.purchaseChart} purchaseChart={props.purchaseChart}
remainingClass={props.memberRemainingClass} remainingClass={props.memberRemainingClass}
@@ -129,39 +130,41 @@ export function BalancesScreen(props: Props) {
</header> </header>
<p>{props.copy.householdBalancesBody ?? ''}</p> <p>{props.copy.householdBalancesBody ?? ''}</p>
</article> </article>
<For each={props.dashboard.members}> <For each={dashboard().members}>
{(member) => ( {(member) => (
<article class="balance-item"> <article class="balance-item">
<header> <header>
<strong>{member.displayName}</strong> <strong>{member.displayName}</strong>
<span> <span>
{member.remainingMajor} {props.dashboard!.currency} {member.remainingMajor} {dashboard().currency}
</span> </span>
</header> </header>
<p> <p>
{props.copy.baseDue ?? ''}: {props.memberBaseDueMajor(member)}{' '} {props.copy.baseDue ?? ''}: {props.memberBaseDueMajor(member)}{' '}
{props.dashboard!.currency} {dashboard().currency}
</p> </p>
<p> <p>
{props.copy.shareRent ?? ''}: {member.rentShareMajor} {props.dashboard!.currency} {props.copy.shareRent ?? ''}: {member.rentShareMajor} {dashboard().currency}
</p> </p>
<p> <p>
{props.copy.shareUtilities ?? ''}: {member.utilityShareMajor}{' '} {props.copy.shareUtilities ?? ''}: {member.utilityShareMajor}{' '}
{props.dashboard!.currency} {dashboard().currency}
</p> </p>
<p> <p>
{props.copy.shareOffset ?? ''}: {member.purchaseOffsetMajor}{' '} {props.copy.shareOffset ?? ''}: {member.purchaseOffsetMajor}{' '}
{props.dashboard!.currency} {dashboard().currency}
</p> </p>
<p> <p>
{props.copy.paidLabel ?? ''}: {member.paidMajor} {props.dashboard!.currency} {props.copy.paidLabel ?? ''}: {member.paidMajor} {dashboard().currency}
</p> </p>
<p class={`balance-status ${props.memberRemainingClass(member)}`}> <p class={`balance-status ${props.memberRemainingClass(member)}`}>
{props.copy.remainingLabel ?? ''}: {member.remainingMajor} {props.dashboard!.currency} {props.copy.remainingLabel ?? ''}: {member.remainingMajor} {dashboard().currency}
</p> </p>
</article> </article>
)} )}
</For> </For>
</div> </div>
)}
</Show>
) )
} }

View File

@@ -18,8 +18,10 @@ type Props = {
} }
export function HomeScreen(props: Props) { export function HomeScreen(props: Props) {
if (!props.dashboard) {
return ( return (
<Show
when={props.dashboard}
fallback={
<div class="home-grid"> <div class="home-grid">
<div class="summary-card-grid"> <div class="summary-card-grid">
<article class="stat-card"> <article class="stat-card">
@@ -40,14 +42,13 @@ export function HomeScreen(props: Props) {
</article> </article>
</div> </div>
</div> </div>
)
} }
>
return ( {(dashboard) => (
<div class="home-grid"> <div class="home-grid">
<div class="summary-card-grid"> <div class="summary-card-grid">
<FinanceSummaryCards <FinanceSummaryCards
dashboard={props.dashboard} dashboard={dashboard()}
utilityTotalMajor={props.utilityTotalMajor} utilityTotalMajor={props.utilityTotalMajor}
purchaseTotalMajor={props.purchaseTotalMajor} purchaseTotalMajor={props.purchaseTotalMajor}
labels={{ labels={{
@@ -71,45 +72,45 @@ export function HomeScreen(props: Props) {
<header> <header>
<strong>{props.copy.yourBalanceTitle ?? ''}</strong> <strong>{props.copy.yourBalanceTitle ?? ''}</strong>
<span> <span>
{member().remainingMajor} {props.dashboard!.currency} {member().remainingMajor} {dashboard().currency}
</span> </span>
</header> </header>
<p> <p>
{props.copy.shareRent ?? ''}: {props.dashboard!.rentSourceAmountMajor}{' '} {props.copy.shareRent ?? ''}: {dashboard().rentSourceAmountMajor}{' '}
{props.dashboard!.rentSourceCurrency} {dashboard().rentSourceCurrency}
{props.dashboard!.rentSourceCurrency !== props.dashboard!.currency {dashboard().rentSourceCurrency !== dashboard().currency
? ` -> ${props.dashboard!.rentDisplayAmountMajor} ${props.dashboard!.currency}` ? ` -> ${dashboard().rentDisplayAmountMajor} ${dashboard().currency}`
: ''} : ''}
</p> </p>
<div class="balance-breakdown"> <div class="balance-breakdown">
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.baseDue ?? ''}</span> <span>{props.copy.baseDue ?? ''}</span>
<strong> <strong>
{props.memberBaseDueMajor(member())} {props.dashboard!.currency} {props.memberBaseDueMajor(member())} {dashboard().currency}
</strong> </strong>
</article> </article>
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.shareOffset ?? ''}</span> <span>{props.copy.shareOffset ?? ''}</span>
<strong> <strong>
{member().purchaseOffsetMajor} {props.dashboard!.currency} {member().purchaseOffsetMajor} {dashboard().currency}
</strong> </strong>
</article> </article>
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.finalDue ?? ''}</span> <span>{props.copy.finalDue ?? ''}</span>
<strong> <strong>
{member().netDueMajor} {props.dashboard!.currency} {member().netDueMajor} {dashboard().currency}
</strong> </strong>
</article> </article>
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.paidLabel ?? ''}</span> <span>{props.copy.paidLabel ?? ''}</span>
<strong> <strong>
{member().paidMajor} {props.dashboard!.currency} {member().paidMajor} {dashboard().currency}
</strong> </strong>
</article> </article>
<article class="stat-card"> <article class="stat-card">
<span>{props.copy.remainingLabel ?? ''}</span> <span>{props.copy.remainingLabel ?? ''}</span>
<strong> <strong>
{member().remainingMajor} {props.dashboard!.currency} {member().remainingMajor} {dashboard().currency}
</strong> </strong>
</article> </article>
</div> </div>
@@ -121,11 +122,11 @@ export function HomeScreen(props: Props) {
<header> <header>
<strong>{props.copy.latestActivityTitle ?? ''}</strong> <strong>{props.copy.latestActivityTitle ?? ''}</strong>
</header> </header>
{props.dashboard.ledger.length === 0 ? ( {dashboard().ledger.length === 0 ? (
<p>{props.copy.latestActivityEmpty ?? ''}</p> <p>{props.copy.latestActivityEmpty ?? ''}</p>
) : ( ) : (
<div class="activity-list"> <div class="activity-list">
<For each={props.dashboard.ledger.slice(0, 3)}> <For each={dashboard().ledger.slice(0, 3)}>
{(entry) => ( {(entry) => (
<article class="activity-row"> <article class="activity-row">
<header> <header>
@@ -143,5 +144,7 @@ export function HomeScreen(props: Props) {
)} )}
</article> </article>
</div> </div>
)}
</Show>
) )
} }

View File

@@ -118,15 +118,15 @@ type Props = {
} }
export function LedgerScreen(props: Props) { export function LedgerScreen(props: Props) {
if (!props.dashboard) {
return ( return (
<Show
when={props.dashboard}
fallback={
<div class="ledger-list"> <div class="ledger-list">
<p>{props.copy.emptyDashboard ?? ''}</p> <p>{props.copy.emptyDashboard ?? ''}</p>
</div> </div>
)
} }
>
return (
<div class="ledger-list"> <div class="ledger-list">
<article class="balance-item"> <article class="balance-item">
<header> <header>
@@ -233,7 +233,11 @@ export function LedgerScreen(props: Props) {
<input <input
value={draft.description} value={draft.description}
onInput={(event) => onInput={(event) =>
props.onPurchaseDescriptionChange(entry.id, entry, event.currentTarget.value) props.onPurchaseDescriptionChange(
entry.id,
entry,
event.currentTarget.value
)
} }
/> />
</Field> </Field>
@@ -284,7 +288,9 @@ export function LedgerScreen(props: Props) {
} }
> >
<option value="equal">{props.copy.purchaseSplitEqual ?? ''}</option> <option value="equal">{props.copy.purchaseSplitEqual ?? ''}</option>
<option value="custom_amounts">{props.copy.purchaseSplitCustom ?? ''}</option> <option value="custom_amounts">
{props.copy.purchaseSplitCustom ?? ''}
</option>
</select> </select>
</Field> </Field>
</div> </div>
@@ -596,5 +602,6 @@ export function LedgerScreen(props: Props) {
})()} })()}
</Modal> </Modal>
</div> </div>
</Show>
) )
} }