feat(team-accounts): enhance team account statistics and health details components with new data and improved calculations
This commit is contained in:
@@ -1,8 +1,14 @@
|
||||
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 } from '~/lib/utils';
|
||||
import {
|
||||
bmiFromMetric,
|
||||
getBmiBackgroundColor,
|
||||
getBmiStatus,
|
||||
} from '~/lib/utils';
|
||||
|
||||
import { TeamAccountStatisticsProps } from '../../_components/team-account-statistics';
|
||||
|
||||
@@ -14,66 +20,89 @@ interface AccountHealthDetailsField {
|
||||
color?: string;
|
||||
className?: string;
|
||||
}>;
|
||||
normStatus: NormStatus;
|
||||
}
|
||||
|
||||
export enum NormStatus {
|
||||
CRITICAL = 'CRITICAL',
|
||||
WARNING = 'WARNING',
|
||||
NORMAL = 'NORMAL',
|
||||
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 averageBMI = (
|
||||
memberParams.reduce((sum, { height, weight }) => {
|
||||
return bmiFromMetric(weight ?? 0, height ?? 0) + sum;
|
||||
}, 0) / memberParams.length
|
||||
).toFixed(0);
|
||||
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: `50% (${memberParams.length})`,
|
||||
value: `${femalePercentage}% (${numberOfFemaleMembers})`,
|
||||
Icon: User,
|
||||
normStatus: NormStatus.NORMAL,
|
||||
iconBg: 'bg-success',
|
||||
},
|
||||
{
|
||||
title: 'teams:healthDetails.men',
|
||||
value: `50% (${memberParams.length})`,
|
||||
value: `${malePercentage}% (${numberOfMaleMembers})`,
|
||||
Icon: User,
|
||||
normStatus: NormStatus.NORMAL,
|
||||
iconBg: 'bg-success',
|
||||
},
|
||||
{
|
||||
title: 'teams:healthDetails.avgAge',
|
||||
value: '56',
|
||||
value: avarageAge.toFixed(0),
|
||||
Icon: Clock,
|
||||
normStatus: NormStatus.NORMAL,
|
||||
iconBg: 'bg-success',
|
||||
},
|
||||
{
|
||||
title: 'teams:healthDetails.bmi',
|
||||
value: averageBMI,
|
||||
Icon: TrendingUp,
|
||||
normStatus: NormStatus.WARNING,
|
||||
iconBg: getBmiBackgroundColor(bmiStatus),
|
||||
},
|
||||
{
|
||||
title: 'teams:healthDetails.cholesterol',
|
||||
value: '6.1',
|
||||
value: '-',
|
||||
Icon: TrendingUp,
|
||||
normStatus: NormStatus.WARNING,
|
||||
iconBg: 'bg-warning',
|
||||
},
|
||||
{
|
||||
title: 'teams:healthDetails.vitaminD',
|
||||
value: '76',
|
||||
value: '-',
|
||||
Icon: TrendingUp,
|
||||
normStatus: NormStatus.NORMAL,
|
||||
iconBg: 'bg-warning',
|
||||
},
|
||||
{
|
||||
title: 'teams:healthDetails.smokers',
|
||||
value: '22%',
|
||||
value: '-',
|
||||
Icon: TrendingUp,
|
||||
normStatus: NormStatus.CRITICAL,
|
||||
iconBg: 'bg-warning',
|
||||
},
|
||||
];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user