Files
medreport_mrb2b/app/home/[account]/_lib/server/load-team-account-health-details.ts

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 avarageWeight =
memberParams.reduce((sum, r) => sum + r.weight!, 0) / memberParams.length;
const avarageHeight =
memberParams.reduce((sum, r) => sum + r.height!, 0) / memberParams.length;
const avarageAge =
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(avarageWeight, avarageHeight);
const bmiStatus = getBmiStatus(bmiThresholds, {
age: avarageAge,
height: avarageHeight,
weight: avarageWeight,
});
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: avarageAge.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',
},
];
};