'use client'; import Link from 'next/link'; import { BlendingModeIcon, RulerHorizontalIcon } from '@radix-ui/react-icons'; import { isNil } from 'lodash'; import { Activity, ChevronRight, Clock9, Pill, Scale, TrendingUp, User, } from 'lucide-react'; import type { AccountWithParams, BmiThresholds, } from '@kit/accounts/types/accounts'; import { pathsConfig } from '@kit/shared/config'; import { Button } from '@kit/ui/button'; import { Card, CardDescription, CardFooter, CardHeader, CardProps, } from '@kit/ui/card'; import { Trans } from '@kit/ui/trans'; import { cn } from '@kit/ui/utils'; import { BmiCategory } from '~/lib/types/bmi'; import PersonalCode, { bmiFromMetric, getBmiBackgroundColor, getBmiStatus, } from '~/lib/utils'; import DashboardRecommendations from './dashboard-recommendations'; const getCardVariant = (isSuccess: boolean | null): CardProps['variant'] => { if (isSuccess === null) return 'default'; if (isSuccess) return 'gradient-success'; return 'gradient-destructive'; }; const cards = ({ gender, age, height, weight, bmiStatus, smoking, }: { gender?: string; age?: number; height?: number | null; weight?: number | null; bmiStatus: BmiCategory | null; smoking?: boolean | null; }) => [ { title: 'dashboard:gender', description: gender ?? '-', icon: , iconBg: 'bg-success', }, { title: 'dashboard:age', description: age ? `${age}` : '-', icon: , iconBg: 'bg-success', }, { title: 'dashboard:height', description: height ? `${height}cm` : '-', icon: , iconBg: 'bg-success', }, { title: 'dashboard:weight', description: weight ? `${weight}kg` : '-', icon: , iconBg: 'bg-success', }, { title: 'dashboard:bmi', description: bmiFromMetric(weight || 0, height || 0)?.toString() ?? '-', icon: , iconBg: getBmiBackgroundColor(bmiStatus), }, { title: 'dashboard:bloodPressure', description: '-', icon: , iconBg: 'bg-warning', }, { title: 'dashboard:cholesterol', description: '-', icon: , iconBg: 'bg-destructive', }, { title: 'dashboard:ldlCholesterol', description: '-', icon: , iconBg: 'bg-warning', }, // { // title: 'Score 2', // description: 'Normis', // icon: , // iconBg: 'bg-success', // }, { title: 'dashboard:smoking', description: isNil(smoking) ? 'dashboard:respondToQuestion' : smoking ? 'common:yes' : 'common:no', descriptionColor: 'text-primary', icon: isNil(smoking) ? ( ) : null, cardVariant: getCardVariant(isNil(smoking) ? null : !smoking), }, ]; const IS_SHOWN_RECOMMENDATIONS = false as boolean; export default function Dashboard({ account, bmiThresholds, }: { account: AccountWithParams; bmiThresholds: Omit[]; }) { const height = account.accountParams?.height || 0; const weight = account.accountParams?.weight || 0; let age: number = 0; let gender: { label: string; value: string } | null = null; try { ({ age = 0, gender } = PersonalCode.parsePersonalCode( account.personal_code!, )); } catch (e) { console.error('Failed to parse personal code', e); } const bmiStatus = getBmiStatus(bmiThresholds, { age, height, weight }); return ( <> {cards({ gender: gender?.label, age, height, weight, bmiStatus, smoking: account.accountParams?.isSmoker, }).map( ({ title, description, icon, iconBg, cardVariant, // descriptionColor, }) => ( {icon} ), )} {IS_SHOWN_RECOMMENDATIONS && } > ); }