Files
baya-monorepo/client/src/components/booking/BookingMoneySummary/BookingMoneySummary.tsx
T
2026-07-17 17:10:39 +03:30

73 lines
2.5 KiB
TypeScript

'use client';
import { FunctionComponent, ReactNode } from 'react';
import { useTranslations } from 'next-intl';
import { Paper, Stack, Typography } from '@mui/material';
import Money from '@/components/common/Money';
import type { MoneyTone } from '@/components/common/Money';
import type { BookingViewerRole } from '@/services/bookings/types';
export interface BookingMoneySummaryProps {
/** IRR digit-strings; `gross = commission + payout`, guaranteed server-side. **Never** summed/re-split here. */
grossPriceIrr: string;
balinyaarCommissionIrr: string;
nursePayoutAmount: string;
/** Drives the payout row label (nurse sees «درآمد شما»; customer sees «سهم پرستار»). */
viewerRole: BookingViewerRole;
}
/**
* The confirmed booking money summary: service cost / Balinyaar fee (کارمزد) / nurse payout — each
* rendered exactly as the server sent it (IRR digit-strings) through the money util as grouped Toman.
* **Display-only:** no client-side sum, derive, or re-split; the tax line + escrow notice are the
* checkout surface (deferred to f9). The payout row label adapts to the viewer.
* @component BookingMoneySummary
*/
const BookingMoneySummary: FunctionComponent<BookingMoneySummaryProps> = ({
grossPriceIrr,
balinyaarCommissionIrr,
nursePayoutAmount,
viewerRole,
}) => {
const t = useTranslations('booking');
return (
<Paper elevation={0} sx={{ p: 2.5, border: '1px solid', borderColor: 'divider', borderRadius: 2 }}>
<Typography variant="subtitle2" sx={{ fontWeight: 700, mb: 1.5 }}>
{t('money_title')}
</Typography>
<Stack sx={{ gap: 1 }}>
<MoneyRow label={t('money_gross')} amountIrr={grossPriceIrr} tone="emphasis" />
<MoneyRow label={t('money_commission')} amountIrr={balinyaarCommissionIrr} deduction />
<MoneyRow
label={viewerRole === 'nurse' ? t('money_nurse_earning') : t('money_payout')}
amountIrr={nursePayoutAmount}
tone="emphasis"
/>
</Stack>
</Paper>
);
};
function MoneyRow({
label,
amountIrr,
tone,
deduction = false,
}: {
label: string;
amountIrr: string;
tone?: MoneyTone;
deduction?: boolean;
}): ReactNode {
return (
<Stack direction="row" sx={{ justifyContent: 'space-between', alignItems: 'center', gap: 2 }}>
<Typography variant="body2" sx={{ color: 'text.secondary' }}>
{label}
</Typography>
<Money amountIrr={amountIrr} size="sm" tone={tone} deduction={deduction} />
</Stack>
);
}
export default BookingMoneySummary;