109 lines
2.9 KiB
TypeScript
109 lines
2.9 KiB
TypeScript
import React from 'react';
|
|
|
|
import { Database } from '@/packages/supabase/src/database.types';
|
|
import Isikukood from 'isikukood';
|
|
import { Clock, TrendingUp, User } from 'lucide-react';
|
|
|
|
import {
|
|
bmiFromMetric,
|
|
getBmiBackgroundColor,
|
|
getBmiStatus,
|
|
} from '~/lib/utils';
|
|
|
|
import { TeamAccountStatisticsProps } from '../../_components/team-account-statistics';
|
|
|
|
interface AccountHealthDetailsField {
|
|
title: string;
|
|
value: string | number;
|
|
Icon: React.ComponentType<{
|
|
size?: number;
|
|
color?: string;
|
|
className?: string;
|
|
}>;
|
|
iconBg: string;
|
|
}
|
|
|
|
export const getAccountHealthDetailsFields = (
|
|
memberParams: TeamAccountStatisticsProps['memberParams'],
|
|
bmiThresholds: Omit<
|
|
Database['medreport']['Tables']['bmi_thresholds']['Row'],
|
|
'id'
|
|
>[],
|
|
members: Database['medreport']['Functions']['get_account_members']['Returns'],
|
|
): AccountHealthDetailsField[] => {
|
|
const averageWeight =
|
|
memberParams.reduce((sum, r) => sum + r.weight!, 0) / memberParams.length;
|
|
const averageHeight =
|
|
memberParams.reduce((sum, r) => sum + r.height!, 0) / memberParams.length;
|
|
const averageAge =
|
|
members.reduce((sum, r) => {
|
|
const person = new Isikukood(r.personal_code);
|
|
return sum + person.getAge();
|
|
}, 0) / members.length;
|
|
const numberOfMaleMembers = members.filter((r) => {
|
|
const person = new Isikukood(r.personal_code);
|
|
return person.getGender() === 'male';
|
|
}).length;
|
|
const numberOfFemaleMembers = members.filter((r) => {
|
|
const person = new Isikukood(r.personal_code);
|
|
return person.getGender() === 'female';
|
|
}).length;
|
|
const averageBMI = bmiFromMetric(averageWeight, averageHeight);
|
|
const bmiStatus = getBmiStatus(bmiThresholds, {
|
|
age: averageAge,
|
|
height: averageHeight,
|
|
weight: averageWeight,
|
|
});
|
|
const malePercentage = members.length
|
|
? (numberOfMaleMembers / members.length) * 100
|
|
: 0;
|
|
const femalePercentage = members.length
|
|
? (numberOfFemaleMembers / members.length) * 100
|
|
: 0;
|
|
|
|
return [
|
|
{
|
|
title: 'teams:healthDetails.women',
|
|
value: `${femalePercentage}% (${numberOfFemaleMembers})`,
|
|
Icon: User,
|
|
iconBg: 'bg-success',
|
|
},
|
|
{
|
|
title: 'teams:healthDetails.men',
|
|
value: `${malePercentage}% (${numberOfMaleMembers})`,
|
|
Icon: User,
|
|
iconBg: 'bg-success',
|
|
},
|
|
{
|
|
title: 'teams:healthDetails.avgAge',
|
|
value: averageAge.toFixed(0),
|
|
Icon: Clock,
|
|
iconBg: 'bg-success',
|
|
},
|
|
{
|
|
title: 'teams:healthDetails.bmi',
|
|
value: averageBMI,
|
|
Icon: TrendingUp,
|
|
iconBg: getBmiBackgroundColor(bmiStatus),
|
|
},
|
|
{
|
|
title: 'teams:healthDetails.cholesterol',
|
|
value: '-',
|
|
Icon: TrendingUp,
|
|
iconBg: 'bg-warning',
|
|
},
|
|
{
|
|
title: 'teams:healthDetails.vitaminD',
|
|
value: '-',
|
|
Icon: TrendingUp,
|
|
iconBg: 'bg-warning',
|
|
},
|
|
{
|
|
title: 'teams:healthDetails.smokers',
|
|
value: '-',
|
|
Icon: TrendingUp,
|
|
iconBg: 'bg-warning',
|
|
},
|
|
];
|
|
};
|