manual improvement 2 & add telegram bot
This commit is contained in:
@@ -9,19 +9,15 @@ import {
|
||||
CountdownTimer,
|
||||
EmptyState,
|
||||
ErrorState,
|
||||
InitialsAvatar,
|
||||
Money,
|
||||
PageHeader,
|
||||
SurfaceCard,
|
||||
TrustBadge,
|
||||
} from '@/components';
|
||||
import { ROUTES } from '@/constants';
|
||||
import { formatRelativeTime, formatShamsiDate, localeTag, parseIrr } from '@/utils';
|
||||
import { useMe } from '@/services/auth';
|
||||
import { useNurseRequestInbox } from '@/services/bookingRequests';
|
||||
import { useTodaySessions } from '@/services/bookings';
|
||||
import { useNurseEarningsBalance } from '@/services/payouts';
|
||||
import { useVerificationStatus } from '@/services/verification';
|
||||
import { ownBadgeState } from '@/services/verification/types';
|
||||
import { coarseResponseLabel } from '@/services/bookingRequests/format';
|
||||
import DashboardActivationSlot from './DashboardActivationSlot';
|
||||
|
||||
@@ -35,17 +31,25 @@ const WARN_THRESHOLD_SECONDS = 2 * 60 * 60;
|
||||
* Rebuilt for the phone-width frame. The previous version stacked five same-weight cards, each
|
||||
* repeating its own icon + bold heading + inline "see all" button; at 480px the buttons wrapped
|
||||
* mid-word, the countdown collided with the request title, and nothing on the screen looked more
|
||||
* important than anything else. This version gives the page one visual hierarchy: a quiet identity
|
||||
* strip, then exactly one hero action (the next visit), then sections introduced by a plain label
|
||||
* with a text link instead of a competing button.
|
||||
* important than anything else. This version gives the page one visual hierarchy: exactly one hero
|
||||
* action (the next visit), then sections introduced by a plain label with a text link instead of a
|
||||
* competing button.
|
||||
*
|
||||
* The greeting/identity strip that used to sit above all of it is gone: it spent the most valuable
|
||||
* row on the screen restating the signed-in name to the person who typed the phone number, and the
|
||||
* badge beside it duplicated the activation tracker further down. Identity now lives in the shell's
|
||||
* top bar (`NurseAccountButton`), where it costs no content height and opens the account hub.
|
||||
*
|
||||
* Composition only — every widget reads a query that is already cached elsewhere in the shell, and
|
||||
* order encodes urgency: a missed request expires, an unread earnings figure does not.
|
||||
*/
|
||||
export default function NurseDashboardScreen() {
|
||||
const t = useTranslations('dashboard');
|
||||
return (
|
||||
<Stack sx={{ gap: 2.5 }}>
|
||||
<GreetingHeader />
|
||||
{/* Load-bearing now that the bottom nav is icon-only: this is the only place the current
|
||||
section is named, and the page's only h1. */}
|
||||
<PageHeader title={t('title')} />
|
||||
<NextVisitCard />
|
||||
<RequestsSection />
|
||||
<EarningsSection />
|
||||
@@ -74,40 +78,6 @@ function SectionHeader({ title, actionLabel, actionTo }: { title: string; action
|
||||
);
|
||||
}
|
||||
|
||||
/** Greeting + own trust badge. The avatar is initials-based — a nurse photo lives on the profile. */
|
||||
function GreetingHeader() {
|
||||
const t = useTranslations('dashboard');
|
||||
const { data: me, isLoading } = useMe();
|
||||
const verification = useVerificationStatus();
|
||||
|
||||
const displayName = me ? [me.firstName, me.lastName].filter(Boolean).join(' ').trim() || me.phone : '';
|
||||
|
||||
if (isLoading) {
|
||||
return (
|
||||
<Stack direction="row" sx={{ gap: 1.5, alignItems: 'center' }}>
|
||||
<Skeleton variant="circular" width={44} height={44} />
|
||||
<Skeleton variant="text" width={180} height={28} />
|
||||
</Stack>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Stack direction="row" sx={{ gap: 1.5, alignItems: 'center', minWidth: 0 }}>
|
||||
<InitialsAvatar name={displayName} size={44} />
|
||||
<Stack sx={{ gap: 0.5, minWidth: 0 }}>
|
||||
<Typography variant="subtitle1" component="h1" noWrap sx={{ fontWeight: 700 }}>
|
||||
{t('greeting', { name: displayName })}
|
||||
</Typography>
|
||||
{verification.isLoading ? null : (
|
||||
<Box>
|
||||
<TrustBadge state={ownBadgeState(verification.data)} />
|
||||
</Box>
|
||||
)}
|
||||
</Stack>
|
||||
</Stack>
|
||||
);
|
||||
}
|
||||
|
||||
/** The page's one hero action: the next actionable session, with a full-width primary CTA. */
|
||||
function NextVisitCard() {
|
||||
const t = useTranslations('dashboard');
|
||||
|
||||
Reference in New Issue
Block a user