Fakultas Ilmu Komputer UI

Commit b256c31c authored by Doan Andreas Nathanael's avatar Doan Andreas Nathanael
Browse files

Integrate Quiz Result UI with backend API

parent 1cd4ad49
import { DietProfileResponse } from 'services/dietelaQuiz/models';
import { bodyMassStatus } from 'services/dietelaQuiz/quizResult';
import { ResultPageContent } from '../types';
const statusBeratBadan = (response: DietProfileResponse): ResultPageContent => {
const result = response.quiz_result;
const bmi = result.body_mass_index.toString();
const nutritionStatus = result.nutrition_status;
const infoStatus = bodyMassStatus[nutritionStatus].status;
const weight = result.weight.toFixed(0).toString();
const height = result.height.toString();
const minimum = result.ideal_weight_range.min.toFixed(1).toString();
const maximum = result.ideal_weight_range.max.toFixed(1).toString();
return {
title: 'Status Berat Badan',
mainInfo: {
infos: [
{
label: 'Indeks massa tubuh',
content: bmi,
},
{
label: 'Status',
content: nutritionStatus,
},
],
status: infoStatus,
},
sections: [
{
header: 'Dihitung berdasarkan data:',
content: {
statistics: [
[
{
label: 'berat badan',
emote: '⚖️',
content: `${weight} kg`,
},
{
label: 'tinggi badan',
emote: '📐',
content: `${height} cm`,
},
],
],
},
},
{
header:
'Untuk orang dengan tinggi 156 cm, berikut rentang berat badan yang ideal:',
content: {
statistics: [
[
{
label: 'minimal',
emote: '◀️',
content: `${minimum} kg`,
},
{
label: 'maksimal',
emote: '▶️',
content: `${maximum} kg`,
},
],
],
textCard: ['Usahakan berat badan kamu masuk ke rentang ideal, ya!'],
},
},
],
};
};
export default statusBeratBadan;
import React, { FC } from 'react';
import { View, Text } from 'react-native';
import { AutoImage, ResultCard, Statistic } from 'components/core';
import { Section } from 'components/layout';
import { layoutStyles, typographyStyles } from 'styles';
import { styles } from '../styles';
import { status_berat_badan } from '../../../../../assets/images';
import { ScrollView } from 'react-native-gesture-handler';
const info = [
{
title: 'Indeks massa tubuh',
content: '31.6',
},
{
title: 'Status',
content: 'Obesitas 2',
},
];
const StatusBeratBadan: FC = () => (
<View style={layoutStyles}>
<ScrollView>
<Text style={typographyStyles.headingLarge}>Status Berat Badan</Text>
<Section>
<AutoImage source={status_berat_badan} ratio={0.5} />
</Section>
<Section>
<ResultCard status="danger" infos={info} />
</Section>
<Section>
<Text style={[typographyStyles.bodySmall, styles.sectionHeader]}>
Dihitung berdasarkan data:
</Text>
<View style={{ flexDirection: 'row' }}>
<View style={{ flex: 1 }}>
<Statistic title="berat badan" emote="⚖️" content="77 kg" />
</View>
<View style={{ flex: 1 }}>
<Statistic title="tinggi badan" emote="📐" content="156 cm" />
</View>
</View>
</Section>
<Section>
<Text style={[typographyStyles.bodySmall, styles.sectionHeader]}>
Untuk orang dengan tinggi 156 cm, berikut rentang berat badan yang
ideal:
</Text>
<View style={{ flexDirection: 'row' }}>
<View style={{ flex: 1 }}>
<Statistic title="minimal" emote="◀️" content="46.2 kg" />
</View>
<View style={{ flex: 1 }}>
<Statistic title="maksimal" emote="▶️" content="55.9 kg" />
</View>
</View>
<Text style={[typographyStyles.bodySmall, { marginTop: 8 }]}>
Usahakan berat badan kamu masuk ke rentang ideal, ya!
</Text>
</Section>
</ScrollView>
</View>
);
export default StatusBeratBadan;
export { default as StatusBeratBadan } from './StatusBeratBadan';
export { default as KebutuhanEnergiZatGizi } from './KebutuhanEnergiZatGizi';
export { default as KecukupanSayurBuah } from './KecukupanSayurBuah';
export { default as AsupanGGL } from './AsupanGGL';
export { default as MakanBesar } from './MakanBesar';
export { default as MakanCemilan } from './MakanCemilan';
export { default as MakanPagi } from './MakanPagi';
export { default as DetailEnergiSehari } from './DetailEnergiSehari';
export { default as AktivitasFisik } from './AktivitasFisik';
import aktivitasFisik from './AktivitasFisik';
import asupanGGL from './AsupanGGL';
import detailEnergiSehari from './DetailEnergiSehari';
import kebutuhanEnergiZatGizi from './KebutuhanEnergiZatGizi';
import kecukupanSayurBuah from './KecukupanSayurBuah';
import makanBesar from './MakanBesar';
import makanCemilan from './MakanCemilan';
import makanPagi from './MakanPagi';
import statusBeratBadan from './StatusBeratBadan';
export const pages = [
statusBeratBadan,
kebutuhanEnergiZatGizi,
kecukupanSayurBuah,
asupanGGL,
makanBesar,
makanCemilan,
makanPagi,
aktivitasFisik,
detailEnergiSehari,
];
export { default as ResultPage } from './ResultPage';
export const quizResult = {
statusGizi: {
kurang: {
display: 'Berat badan kurang',
status: 'warning',
},
normal: {
display: 'Normal',
status: 'healthy',
},
pre_obesitas: {
display: 'Pre-obesitas',
status: 'warning',
},
obesitas_1: {
display: 'Obesitas 1',
status: 'warning',
},
obesitas_2: {
display: 'Obesitas 2',
status: 'danger',
},
},
sayurBuah: {
kurang: {
display: 'Kurang makan sayur dan buah',
status: 'warning',
recommendation: `Yah.. asupan buah & sayur kamu masih kurang nih.\n\nYuk, cari solusi agar kamu bisa konsumsi setidaknya 2 porsi sayur & 3 porsi buah atau sebaliknya per hari.\n\nPokoknya kalau di total kamu perlu 5 porsi buah & sayur per hari.`,
},
cukup: {
display: 'Asupan sayur dan buah sudah cukup',
status: 'healthy',
recommendation: `Selamat! Kamu sudah memenuhi salah satu langkah menuju hidup sehat.\n\nPertahankan untuk konsumsi setidaknya 2 porsi sayur & 3 porsi buah atau sebaliknya per hari ya.\n\nPokoknya kalau di total kamu perlu 5 porsi buah dan sayur per sehari.`,
},
},
asupanGGL: {
cukup: {
display: 'Kurang makan sayur dan buah',
status: 'healthy',
recommendation: `Yah.. asupan buah & sayur kamu masih kurang nih.\n\nYuk, cari solusi agar kamu bisa konsumsi setidaknya 2 porsi sayur & 3 porsi buah atau sebaliknya per hari.\n\nPokoknya kalau di total kamu perlu 5 porsi buah & sayur per hari.`,
},
berlebih: {
display: 'Asupan sayur dan buah sudah cukup',
status: 'warning',
recommendation: `Selamat! Kamu sudah memenuhi salah satu langkah menuju hidup sehat.\n\nPertahankan untuk konsumsi setidaknya 2 porsi sayur & 3 porsi buah atau sebaliknya per hari ya.\n\nPokoknya kalau di total kamu perlu 5 porsi buah dan sayur per sehari.`,
},
},
};
export interface ResultPageContent {
title: string;
mainInfo: {
infos: {
label: string;
content: string;
}[];
status: 'healthy' | 'warning' | 'danger';
};
sections: {
header: string;
content: {
statistics?: {
label: string;
emote: string;
content: string;
}[][];
textCard?: string[];
};
}[];
}
import { allAccessQuestions } from 'scenes/questionnaire/AllAccessQuestionnaire/schema';
import { ResultPageContent } from './types';
export const genericResult = (
title,
infosLabel,
infosContent,
infoStatus,
recommendation,
questions,
): ResultPageContent => ({
title: title,
mainInfo: {
infos: [
{
label: infosLabel,
content: infosContent,
},
],
status: infoStatus,
},
sections: [
{
header: 'Ini rekomendasi yang Dietela berikan untukmu:',
content: {
textCard: [recommendation],
},
},
{
header: 'Berdasarkan jawaban kuis kamu:',
content: {
textCard: questions,
},
},
],
});
export const getInfos = (infos) => ({
infosContent: infos.headline,
infoStatus: infos.status,
});
export const getAnswerString = (question: string, choice: number) => {
return allAccessQuestions.find((qst) => qst.fieldName === question)
?.choiceList[choice - 1];
};
import {
BodyMassConstants,
BreakfastReponse,
LargeMealDietRecommendation,
PhysicalActivityResponse,
SnacksDietRecommendation,
SugarSaltFatProblemResponse,
VegetableAndFruitSufficiencyResponse,
} from './quizResult';
export interface DietProfileRequest {
name: string;
email: string;
......@@ -21,10 +31,47 @@ export interface DietProfileRequest {
health_problem: number[];
}
// TODO: Doan
export interface DietelaQuizResult {}
export interface QuizResult {
diet_profile: number;
age: number;
weight: number;
height: number;
gender: number;
body_mass_index: number;
nutrition_status: BodyMassConstants;
ideal_weight_range: {
max: number;
min: number;
};
daily_energy_needs: number;
daily_nutrition_needs: {
fat_needs: number;
fiber_needs: number;
protein_needs: number;
carbohydrate_needs: number;
};
vegetable_and_fruit_sufficiency: VegetableAndFruitSufficiencyResponse;
vegetable_and_fruit_diet_recommendation: string;
sugar_salt_fat_problem: SugarSaltFatProblemResponse;
sugar_salt_fat_diet_recommendation: string;
large_meal_diet_recommendation: LargeMealDietRecommendation;
snacks_diet_recommendation: SnacksDietRecommendation;
breakfast_recommendation: BreakfastReponse;
energy_needed_per_dine: {
lunch: number;
dinner: number;
breakfast: number;
morning_snack: number;
afternoon_snack: number;
};
physical_activity_recommendation: PhysicalActivityResponse;
program_recommendation: {
priority_1: string;
priority_2: string | null;
};
}
export interface DietProfileResponse extends DietProfileRequest {
id: number;
quiz_result: DietelaQuizResult;
quiz_result: QuizResult;
}
import { DietProfileResponse } from 'services/dietelaQuiz/models';
export enum Status {
HEALTHY = 'healthy',
WARNING = 'warning',
DANGER = 'danger',
}
export enum BreakfastReponse {
NO_BREAKFAST = 'Perut kosong di pagi hari bisa mengarahkan kepada 2 keadaan, antara membuat makan berlebihan di siang hari atau kurang asupan zat gizi per hari. Makan pagi bisa disesuaikan dengan pola bangun tidur kamu lho, cari deh solusi terbaik agar kamu bisa beraktifitas tanpa perut kosong.',
MED_BREAKFAST = 'Sudah bagus nih, bisa mengisi perut di pagi hari, eittts, tapi artinya kamu perlu melengkapi asupan energi di siang sampai malam hari karena makan paginya cuma sedikit, kamu perlu pengaturan lebih spesifik lagi agak asupan energi kamu seimbang.',
HI_BREAKFAST = 'Juara! Permulaan yang bagus untuk memenuhi kebutuhan energi seharian kamu. Jangan lupa jenis makanan yang kamu pilih saat sarapan harus seimbang juga komposisinya. Sudah ada buah dan sayur belum di sarapanmu? Masih banyak gorengan gak di sarapanmu?',
}
export enum PhysicalActivityResponse {
LEVEL1_ACTIVITY = 'Hayooo kok duduk-duduk aja? Yuk ah mulai lakukan aktivitas fisik, dimulai dari aktivitas yang ringan seperti jalan kaki, jogging, senam, atau naik turun tangga 15 menit per hari. Tingkatkan perlahan hingga mencapai 30 menit per hari. Konsultasikan kebutuhan gizi harianmu kepada Dietela agar asupan makan kamu seimbang dengan energi yang kamu keluarkan setiap harinya',
LEVEL2_ACTIVITY = 'Lumayan sudah banyak jalan, tapi boleh dong diselingi olahraga ringan seperti jogging, senam, atau naik turun tangga 15 menit per hari. Tingkatkan perlahan hingga mencapai 30 menit per hari. Konsultasikan kebutuhan gizi harianmu kepada dietela agar asupan makan kamu seimbang dengan energi yang kamu keluarkan setiap harinya',
LEVEL3_ACTIVITY = 'Keren! Pertahankan olahraga rutin selama 150 menit per minggu atau minimal 30 menit per hari, tambahkan aktivitas penguatan otot sebanyak 2 kali per minggu selama 10-15 menit per hari. Konsultasikan kebutuhan gizi harianmu kepada dietela untuk pengaturan pola makan yang sesuai dengan aktivitas fisikmu.',
LEVEL4_ACTIVITY = 'Keren! Pertahankan durasi aktivitas fisik, tingkatkan intensitas gerakan secara bertahap, jangan lupa tambahkan aktivitas penguatan otot sebanyak 2 kali per minggu selama 10-15 menit per hari. Konsultasikan kebutuhan gizi harianmu kepada dietela untuk pengaturan pola makan yang sesuai dengan aktivitas fisikmu.',
LEVEL5_ACTIVITY = 'Wow! Sudah bagus banget nih, jangan lupa lakukan monitoring rutin terhadap komposisi tubuhmu. Jangan lupa juga untuk mencukupi kebutuhan cairan sebelum, saat, dan setelah olahraga. Konsultasikan kebutuhan gizi harianmu kepada dietela untuk pengaturan pola makan yang sesuai dengan aktivitas fisikmu.',
}
export enum BodyMassConstants {
UNDERWEIGHT = 'Underweight',
NORMAL = 'Normal',
PREOBESITY = 'Preobesitas',
OBESITY1 = 'Obesitas 1',
OBESITY2 = 'Obesitas 2',
}
export enum VegetableAndFruitSufficiencyResponse {
LACKING = 'Kurang makan sayur dan buah',
ENOUGH = 'Asupan sayur dan buah sudah cukup',
}
export enum SugarSaltFatProblemResponse {
CONTROLLED = 'Asupan gula, garam, dan lemak terkontrol',
EXCESSIVE = 'Kelebihan makan gula, garam, dan lemak',
}
export enum LargeMealDietRecommendation {
ONCE_A_DAY = 'Hmmm.... Kenapa cuma makan besar 1 kali sehari? Makan besar cuma 1 kali dalam sehari berisiko membuat kamu makan berlebihan dan kekurangan zat gizi tertentu Lho! Yuk coba mulai diatur pola makannya, dengan merutinkan waktu makan agar metabolisme kamu lebih baik.',
TWICE_A_DAY = 'Makan besar kamu sudah 2 kali, tapi masih kurang nih. Sebaiknya makan besar itu 3 kali yaah, karena ketika skip 1 jam makan, bisa menyebabkan berbagai risiko, seperti makan berlebihan di jam makan berikutnya, kekurangan zat gizi dan sampai ke masalah kesehatan.',
THRICE_A_DAY = 'Keren! Apresiasi buat kamu yang sudah rutin makan besar 3 kali sehari. Tapi pastikan agar sesuai dengan kebutuhan kamu yah, jangan berlebih atau kekurangan.',
MORE_THAN_THRICE_A_DAY = 'Eiiits, porsi makan besar kamu sulit untuk bisa seimbang kalau kamu makan besar lebih dari 3 kali dalam sehari. Cek porsi yang tepat untukmu yah kalau kamu memang sering makan besar.',
}
export enum SnacksDietRecommendation {
NO_SNACK = 'Yah kok gak ngemil? Makan cemilan itu penting untuk menjaga kadar gula darah kamu seharian, dengan ngemil gula darah seharian kamu bisa terkontrol sehingga mencegah lemas dan berkurangnya konsentrasi.',
ONCE_A_DAY = 'Tambah waktu nyemil ga dosa loh asal porsinya tetap sesuai dengan kebutuhan kamu. Sebaiknya sehari bisa 2 kali makan cemilan agar kamu tidak kekurangan energi di sela-sela aktivitas dan tidak berlebihan makan pada 1 jam makan tertentu. Atur waktu makan kamu dengan lebih baik yah.',
TWICE_A_DAY = 'Baguuuus! Pertahankan ya makan cemilan 2x sehari. Perhatikan porsi dan kandungan zat gizi cemilanmu ya. Utamakan yang padat gizi sehingga kualitasnya baik untuk tubuh kamu.',
THRICE_A_DAY = 'Boleh sih makan cemilan 3 kali sehari, artinya porsi dan jenis cemilan yang kamu konsumsi harus diatur sedemikian rupa agar tidak melebihi kebutuhan energi dan zat gizi dalam sehari.',
MORE_THAN_THRICE_A_DAY = 'Hmmmm.... kalau makan cemilan lebih dari 3 kali dalam sehari, bisa-bisa asupan kalori kamu berlebih nih dalam sehari atau malah kurang karena seharian cuma makan cemilan. Yuk atur jam makan kamu agar lebih baik. Porsi dan jenis makanan yang kamu konsumsi juga menjadi kunci agar asupan energi dan zat gizi kamu sehat dan seimbang.',
}
export const bodyMassStatus = {
[BodyMassConstants.UNDERWEIGHT]: {
status: Status.WARNING,
},
[BodyMassConstants.NORMAL]: {
status: Status.HEALTHY,
},
[BodyMassConstants.PREOBESITY]: {
status: Status.WARNING,
},
[BodyMassConstants.OBESITY1]: {
status: Status.WARNING,
},
[BodyMassConstants.OBESITY2]: {
status: Status.DANGER,
},
};
export const sayurBuahStatus = {
[VegetableAndFruitSufficiencyResponse.ENOUGH]: {
status: Status.HEALTHY,
},
[VegetableAndFruitSufficiencyResponse.LACKING]: {
status: Status.WARNING,
},
};
export const gglStatus = {
[SugarSaltFatProblemResponse.CONTROLLED]: {
status: Status.HEALTHY,
},
[SugarSaltFatProblemResponse.EXCESSIVE]: {
status: Status.WARNING,
},
};
export const makanBesarStatus = {
[LargeMealDietRecommendation.TWICE_A_DAY]: {
status: Status.HEALTHY,
headline: 'Sudah cukup makan besar',
},
[LargeMealDietRecommendation.THRICE_A_DAY]: {
status: Status.HEALTHY,
headline: 'Sudah cukup makan besar',
},
[LargeMealDietRecommendation.ONCE_A_DAY]: {
status: Status.WARNING,
headline: 'Kurang makan besar',
},
[LargeMealDietRecommendation.MORE_THAN_THRICE_A_DAY]: {
status: Status.WARNING,
headline: 'Kelebihan makan besar',
},
};
export const sarapanStatus = {
[BreakfastReponse.HI_BREAKFAST]: {
status: Status.HEALTHY,
headline: 'Porsi sarapan cukup',
},
[BreakfastReponse.MED_BREAKFAST]: {
status: Status.HEALTHY,
headline: 'Porsi sarapan cukup',
},
[BreakfastReponse.NO_BREAKFAST]: {
status: Status.WARNING,
headline: 'Disarankan sarapan',
},
};
export const cemilanStatus = {
[SnacksDietRecommendation.TWICE_A_DAY]: {
status: Status.HEALTHY,
headline: 'Frekuensi cemilan cukup',
},
[SnacksDietRecommendation.THRICE_A_DAY]: {
status: Status.HEALTHY,
headline: 'Frekuensi cemilan cukup',
},
[SnacksDietRecommendation.ONCE_A_DAY]: {
status: Status.WARNING,
headline: 'Tambah makan cemilan',
},
[SnacksDietRecommendation.NO_SNACK]: {
status: Status.WARNING,
headline: 'Disarankan makan cemilan',
},
[SnacksDietRecommendation.MORE_THAN_THRICE_A_DAY]: {
status: Status.WARNING,
headline: 'Disarankan kurangi cemilan',
},
};
export const aktivitasFisikStatus = {
[PhysicalActivityResponse.LEVEL3_ACTIVITY]: {
status: Status.HEALTHY,
headline: 'Sudah baik',
},
[PhysicalActivityResponse.LEVEL4_ACTIVITY]: {
status: Status.HEALTHY,
headline: 'Sudah baik',
},
[PhysicalActivityResponse.LEVEL5_ACTIVITY]: {
status: Status.HEALTHY,
headline: 'Sangat baik',
},
[PhysicalActivityResponse.LEVEL1_ACTIVITY]: {
status: Status.WARNING,
headline: 'Tingkatkan aktivitas fisik',
},
[PhysicalActivityResponse.LEVEL2_ACTIVITY]: {
status: Status.WARNING,
headline: 'Tingkatkan aktivitas fisik',
},
};
export const exampleResult: DietProfileResponse = {
id: 1,
health_problem: [2, 3],
name: 'test2',
email: 'test2@test.com',
age: 20,
weight: 60,
height: 172,
gender: 2,
special_condition: 1,
body_activity: 1,
vegetables_in_one_day: 1,
fruits_in_one_day: 1,
fried_food_in_one_day: 1,
sweet_snacks_in_one_day: 1,
sweet_drinks_in_one_day: 1,
packaged_food_in_one_day: 1,
large_meal_in_one_day: 1,
snacks_in_one_day: 1,
breakfast_type: 1,
current_condition: 1,
problem_to_solve: 1,
quiz_result: {
diet_profile: 1,
age: 20,
weight: 60,
height: 172,
gender: 2,
body_mass_index: 20,
nutrition_status: 'Normal',
ideal_weight_range: {
max: 68.0432,
min: 56.209599999999995,
},
daily_energy_needs: 1696.8,
daily_nutrition_needs: {
fat_needs: 56.559999999999995,
fiber_needs: 25,
protein_needs: 55.146,
carbohydrate_needs: 241.79399999999998,
},
vegetable_and_fruit_sufficiency: 'Kurang makan sayur dan buah',
vegetable_and_fruit_diet_recommendation:
'Yah.. asupan buah & sayur kamu masih kurang nih. Yuk, cari solusi agar kamu bisa konsumsi setidaknya 2 porsi sayur & 3 porsi buah atau sebaliknya per hari. Pokoknya kalau di total kamu perlu 5 porsi buah & sayur per hari.',
sugar_salt_fat_problem: 'Asupan gula, garam, dan lemak terkontrol',
sugar_salt_fat_diet_recommendation:
'Selamat! Kamu sudah memenuhi salah satu langkah untuk menuju hidup sehat. Pertahankan pemilihan jenis makanan yang seperti ini ya. Upayakan agar jumlah gorengan, cemilan manis, makan manis, makanan kemasan, dan makanan cepat saji yang kamu makan bisa terkontrol jumlahnya.',