From 35bb0dfb1d2da923b68a0b069cee564cdb12843c Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Sun, 30 May 2021 18:17:37 +0700 Subject: [PATCH 01/25] [GREEN] implement static diet report --- src/__mocks__/userReport.ts | 25 +++ src/constants/options.ts | 16 ++ src/constants/routes.ts | 3 + src/constants/userReport.ts | 199 ++++++++++++++++++ .../components/DietReportPage/index.tsx | 27 +++ .../components/DietReportPage/styles.ts | 10 + .../QuestionAnswerCommentCard/index.tsx | 35 +++ .../QuestionAnswerCommentCard/styles.ts | 15 ++ .../DietReportForNutritionist/index.test.tsx | 13 ++ .../DietReportForNutritionist/index.tsx | 89 ++++++++ .../pages/LaporanPage1/index.ts | 46 ++++ .../pages/LaporanPage2/index.ts | 0 .../pages/LaporanPage3/index.ts | 0 .../pages/LaporanPage4/index.ts | 0 .../DietReportForNutritionist/pages/index.ts | 6 + .../DietReportForNutritionist/pages/types.ts | 7 + .../DietReportForNutritionist/pages/utils.ts | 44 ++++ .../DietReportForNutritionist/schema.ts | 93 ++++++++ .../ReadOnlyDietProfile/pages/utils.ts | 26 ++- src/services/progress/index.ts | 10 + src/services/progress/models.ts | 29 +++ src/services/progress/urls.ts | 2 + 22 files changed, 688 insertions(+), 7 deletions(-) create mode 100644 src/__mocks__/userReport.ts create mode 100644 src/constants/userReport.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/index.tsx create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/schema.ts create mode 100644 src/services/progress/index.ts create mode 100644 src/services/progress/models.ts create mode 100644 src/services/progress/urls.ts diff --git a/src/__mocks__/userReport.ts b/src/__mocks__/userReport.ts new file mode 100644 index 0000000..2e41e57 --- /dev/null +++ b/src/__mocks__/userReport.ts @@ -0,0 +1,25 @@ +import { UserReport } from 'services/progress/models'; + +export const mockUserReport: UserReport = { + weight: 155, + height: 188, + waist_size: 100, + changes_felt: 1, + hunger_level: 1, + fullness_level: 1, + heavy_meal: 1, + snacks: 1, + sweet_beverages: 1, + fried_snacks: 1, + umami_snacks: 1, + sweet_snacks: 1, + fruits_portion: 1, + vegetables_portion: 1, + water_consumption: 1, + physical_activity: [1, 2], + physical_activity_other: 'n', + time_for_activity: 1, + feeling_rating: 2, + lesson_learned: 'a', + problem_faced_and_feedbacks: 'x', +}; diff --git a/src/constants/options.ts b/src/constants/options.ts index a3b1d01..fac9ff2 100644 --- a/src/constants/options.ts +++ b/src/constants/options.ts @@ -11,3 +11,19 @@ export const drinkFrequency = [ '2 gelas (500 ml) per hari', 'Lebih dari 2 gelas per hari', ]; + +export const likertScale5 = ['1', '2', '3', '4', '5']; +export const likertScale10 = [ + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '10', +]; + +export const averageConsumptionOptions = ['0', '1', '3', '4', 'Lebih dari 4']; diff --git a/src/constants/routes.ts b/src/constants/routes.ts index d67bc11..034f637 100644 --- a/src/constants/routes.ts +++ b/src/constants/routes.ts @@ -39,3 +39,6 @@ export const clientProfileAdmin = `${admin}/client-profile`; export const clientDietReportAdmin = `${admin}/client-diet-report`; export const clientChatAdmin = `${admin}/client-chat`; export const clientDietRecommendation = `${admin}/client-diet-recommendation`; + +const progress = 'progress'; +export const userReport = `${progress}/user-report`; diff --git a/src/constants/userReport.ts b/src/constants/userReport.ts new file mode 100644 index 0000000..49fabdc --- /dev/null +++ b/src/constants/userReport.ts @@ -0,0 +1,199 @@ +import { TextFieldSchema } from 'types/form'; +import { + likertScale5, + likertScale10, + averageConsumptionOptions, +} from './options'; + +export const dietReportTextFields: { [_: string]: TextFieldSchema[] } = { + laporanPage1: [ + { + label: 'Berat Badan (kg)', + placeholder: 'Masukan berat badan yang terakhir anda ukur', + name: 'weight', + required: true, + keyboardType: 'numeric', + }, + { + label: 'Tinggi Badan (cm)', + placeholder: 'Masukan tinggi badan yang terakhir anda ukur', + name: 'height', + required: true, + keyboardType: 'numeric', + }, + { + label: 'Lingkar Pinggang (cm)', + placeholder: 'Masukan lingkar pinggang yang terakhir anda ukur', + name: 'waist_size', + keyboardType: 'numeric', + }, + ], + laporanPage4: [ + { + label: + 'Selama 1 minggu terakhir, berapa rata-rata total gelas air putih yang Anda minum?', + placeholder: 'Masukan dalam angka', + name: 'water_consumption', + keyboardType: 'numeric', + }, + { + label: + 'Dalam 1 minggu terakhir, Apa saja yang sudah bisa Anda pelajari dari program ini?', + placeholder: 'Masukan pelajarann-pelajaran yang anda dapatkan', + name: 'lesson_learned', + }, + { + label: + 'Silahkan sampaikan disini, jika Anda mempunyai kendala atau keluhan atau kesulitan dalam mengikuti program.', + placeholder: + 'Jika ada masukan, saran, dan komplain terkait layanan sejauh ini, juga bisa disampaikan disini', + name: 'problem_faced_and_feedbacks', + }, + ], +}; + +export const dietReportSelectFields: { [_: string]: any[] } = { + laporanPage2: [ + { + label: 'Apakah sudah mulai terasa ada perubahan ukuran baju atau celana?', + placeholder: 'Skor 3: jika tidak ada perubahan sama sekali', + name: 'changes_felt', + lowest_score_description: 'Belum terasa sama sekali', + highest_score_description: 'Sudah sangat berubah', + choiceList: likertScale5, + }, + { + label: + 'Secara rata-rata, sebelum waktu makan selama 1 minggu terakhir ini, dimana level rasa lapar yang Anda rasakan?', + placeholder: 'Cek indikator di program book kamu ya', + name: 'hunger_level', + lowest_score_description: 'Sangat kelaparan', + highest_score_description: 'Sangat begah (kenyang berlebihan)', + choiceList: likertScale10, + }, + { + label: + 'Secara rata-rata, saat berhenti makan selama 1 minggu terakhir ini, dimana level rasa kenyang yang Anda rasakan?', + placeholder: 'Cek indikator di program book kamu ya', + name: 'fullness_level', + lowest_score_description: 'Sangat kelaparan', + highest_score_description: 'Sangat begah (kenyang berlebihan)', + choiceList: likertScale10, + }, + { + label: + 'Selama 1 minggu terakhir, secara rata-rata, berapa kali Anda makan berat atau makan utama dalam 1 hari?', + placeholder: 'Pilih salah satu', + name: 'heavy_meal', + choiceList: ['1x/hari', '2x/hari', '3x/hari', 'Lebih dari 3x/hari'], + }, + { + label: + 'Selama 1 minggu terakhir, secara rata-rata, berapa kali Anda makan cemilan dalam 1 hari?', + placeholder: 'Pilih salah satu', + name: 'snacks', + choiceList: [ + '1x/hari', + '2x/hari', + '3x/hari', + 'Lebih dari 3x/hari', + 'Hampir tidak ada', + ], + }, + ], + laporanPage3: [ + { + label: 'Minuman manis (satuan: gelas)', + placeholder: 'Pilih salah satu', + name: 'sweet_beverages', + choiceList: averageConsumptionOptions, + }, + { + label: + 'Gula pasir, gula aren, sirup, selai, atau madu (satuan: sendok makan)', + placeholder: 'Pilih salah satu', + name: 'sugar', + choiceList: averageConsumptionOptions, + }, + { + label: 'Cemilan digoreng (satuan: potong)', + placeholder: 'Pilih salah satu', + name: 'fried_snacks', + choiceList: averageConsumptionOptions, + }, + { + label: + 'Makanan ringan asin atau gurih (seperti makanan ringan kemasan, ciki-cikian, keripik) (satuan: bungkus)', + placeholder: 'Pilih salah satu', + name: 'umami_snacks', + choiceList: averageConsumptionOptions, + }, + { + label: + 'Cemilan manis (seperti kue-kue manis, brownis, cake, biskuit, cokelat, wafer) (satuan: potong)', + placeholder: 'Pilih salah satu', + name: 'sweet_snacks', + choiceList: averageConsumptionOptions, + }, + { + label: 'Porsi buah', + placeholder: 'Pilih salah satu', + name: 'fruits_portion', + choiceList: averageConsumptionOptions, + }, + { + label: 'Porsi sayur', + placeholder: 'Pilih salah satu', + name: 'vegetables_portion', + choiceList: averageConsumptionOptions, + }, + ], + laporanPage4: [ + { + label: + 'Selama 1 minggu terakhir, pilih semua jenis aktivitas atau olahraga yang sudah Anda lakukan', + placeholder: 'Dapat memilih lebih dari satu', + name: 'physical_activity', + hasOtherChoice: true, + otherChoiceValue: 9, + choiceList: [ + 'Hampir tidak pernah olahraga', + 'Jogging', + 'Senam aerobic, zumba, yoga, dan sejenisnya', + 'Sepak bola atau futsal', + 'Renang', + 'Basket', + 'Bulu tangkis', + 'Voli', + ], + }, + { + label: + 'Selama 1 minggu (7 hari) terakhir, berapa total menit yang Anda habiskan untuk melakukan bergerak aktif dan olahraga di atas dalam seminggu?', + placeholder: 'Pilih salah satu', + name: 'time_for_activity', + choiceList: [ + '0 - 60 menit', + '60 - 100 menit', + '100 - 120 menit', + '120 - 150 menit', + '150 - 175 menit', + '175 - 200 menit', + '200 - 250 menit', + 'Lebih dari 250 menit', + ], + }, + { + label: 'Sejauh ini, bagaimana perasaan Anda dalam mengikuti program?', + placeholder: 'Pilih salah satu', + name: 'feeling_rating', + choiceList: [ + 'Bintang 1: Rasanya mau menyerah saja', + 'Bintang 2: Capek, susah, bosen, males, repot, sibuk', + 'Bintang 3: Biasa aja, meski ada kendala tapi semua bisa diatur', + 'Bintang 4: Lancar terus, semangat cukup stabil, gak ada masalah', + 'Bintang 5: Super seneng, semangat banget, worry-free lah', + ], + }, + ], +}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx new file mode 100644 index 0000000..bb98007 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx @@ -0,0 +1,27 @@ +import { FC } from 'react'; +import { ScrollView } from 'react-native'; + +// import { typography } from 'styles'; +import { styles } from './styles'; +import React from 'react'; +import { DietReportPageContent } from '../../pages/types'; +import QuestionAnswerCommentCard from '../QuestionAnswerCommentCard'; + +const DietReportPage: FC<{ + content: DietReportPageContent; +}> = ({ content }) => { + return ( + + {content.questions.map((qst, idx) => ( + + ))} + + ); +}; + +export default DietReportPage; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts new file mode 100644 index 0000000..5dff3bb --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts @@ -0,0 +1,10 @@ +import { StyleSheet, Dimensions } from 'react-native'; + +export const styles = StyleSheet.create({ + nameMargin: { + marginBottom: 15, + }, + container: { + width: Dimensions.get('window').width - 40, + }, +}); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx new file mode 100644 index 0000000..4ab2657 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx @@ -0,0 +1,35 @@ +import { FC } from 'react'; +import { View, Text, TextInput } from 'react-native'; + +import React from 'react'; +import { InfoCard } from 'components/core'; +import { typographyStyles } from 'styles'; +import { styles } from './styles'; + +interface Props { + question: string; + answer: string; + textInputProps: any; + testID?: string; +} + +const QuestionAnswerCommentCard: FC = ({ + question, + answer, + textInputProps, + testID, +}) => { + return ( + + {question} + + + + ); +}; + +export default QuestionAnswerCommentCard; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts new file mode 100644 index 0000000..8e6c7f9 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts @@ -0,0 +1,15 @@ +import { StyleSheet } from 'react-native'; + +export const styles = StyleSheet.create({ + label: { + marginBottom: 5, + marginTop: 15, + }, + labelContainer: { + alignSelf: 'stretch', + }, + answer: { + flexDirection: 'row', + }, + input: {}, +}); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx new file mode 100644 index 0000000..e73ad99 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { render } from 'utils/testing'; +import * as ROUTES from 'constants/routes'; + +import DietReportForNutritionist from '.'; + +jest.useFakeTimers(); + +describe('DietReportForNutritionist', () => { + it('renders correctly', () => { + render(, ROUTES.userReport); + }); +}); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx new file mode 100644 index 0000000..c27abcd --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx @@ -0,0 +1,89 @@ +import React, { FC, useState } from 'react'; +import { ScrollView, View, StyleSheet, Dimensions } from 'react-native'; +import { layoutStyles } from 'styles'; +import Carousel from 'react-native-snap-carousel'; +import { pages } from './pages'; +import { CarouselPagination, BigButton } from 'components/core'; +import { useForm } from 'hooks'; +import { dietReportCommentInitialValues, fieldValidations } from './schema'; +import { generateValidationSchema } from 'utils/form'; +import DietReportPage from './components/DietReportPage'; +import { mockUserReport } from '__mocks__/userReport'; +import { Section } from 'components/layout'; + +const DietReportForNutritionist: FC = () => { + const [activeSlide, setActiveSlide] = useState(0); + const userReport = mockUserReport; + + const { getTextInputProps, handleSubmit, isSubmitting } = useForm({ + initialValues: dietReportCommentInitialValues, + validationSchema: generateValidationSchema(fieldValidations), + onSubmit: async (values) => { + console.log('masuk'); + console.log(values); + // const payload = convertPayload ? convertPayload(values) : values; + // const response = await updateDietQuestionnaireApi( + // dietQuestionnaireResponse.id, + // payload, + // ); + // if (response.success && response.data) { + // navigation.reset({ + // index: 0, + // routes: [{ name: ROUTES.extendedQuestionnaire }], + // }); + // } else { + // Toast.show({ + // type: 'error', + // text1: 'Gagal menyimpan data', + // text2: 'Terjadi kesalahan pada sisi kami. Silakan coba lagi', + // }); + // } + }, + }); + + return ( + + + ( + + ))} + renderItem={({ item }: any) => item} + sliderWidth={Dimensions.get('window').width} + itemWidth={Dimensions.get('window').width} + onSnapToItem={setActiveSlide} + /> + + +
+ +
+
+ ); +}; + +const styles = StyleSheet.create({ + container: { height: Dimensions.get('window').height * 0.83 }, + reportContainer: { + position: 'relative', + flex: 1, + }, + searchContainer: { + backgroundColor: 'white', + borderWidth: 1, + borderRadius: 5, + marginBottom: 20, + justifyContent: 'center', + height: 58, + }, + backgroundWhite: { backgroundColor: 'white' }, +}); + +export default DietReportForNutritionist; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts new file mode 100644 index 0000000..b2d6039 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts @@ -0,0 +1,46 @@ +import { DietReportPageContent } from '../types'; +import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; +// import { getQuestionAnswerString } from '../utils'; +import { UserReport } from 'services/progress/models'; +import { getQuestionAnswerCommentString } from '../utils'; +// import { pageHeaders } from 'constants/questionnaire'; + +export const laporanPage1 = ( + { client, weight, height, waist_size }: UserReport, + getTextInputProps: any, +): DietReportPageContent => { + const page = 'laporanPage1'; + return { + questions: [ + { + label: 'Nama Lengkap', + answer: client.name, + }, + { + label: 'Email', + answer: client.email, + }, + getQuestionAnswerCommentString( + page, + 'weight', + weight, + answerTypes.TEXT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'height', + height, + answerTypes.TEXT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'waist_size', + waist_size, + answerTypes.TEXT, + getTextInputProps, + ), + ], + }; +}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts new file mode 100644 index 0000000..0149f42 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts @@ -0,0 +1,6 @@ +import { laporanPage1 } from './LaporanPage1'; +// import { laporanPage2 } from './LaporanPage2'; +// import { laporanPage3 } from './LaporanPage3'; +// import { laporanPage4 } from './LaporanPage4'; + +export const pages = [laporanPage1]; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts new file mode 100644 index 0000000..12e17ad --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts @@ -0,0 +1,7 @@ +export interface DietReportPageContent { + questions: { + label: string; + answer: string; + textInputProps?: any; + }[]; +} diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts new file mode 100644 index 0000000..32de7f8 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts @@ -0,0 +1,44 @@ +import { + dietReportTextFields, + dietReportSelectFields, +} from 'constants/userReport'; +import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; +import { getSelectedAnswerString } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/utils'; + +export const getQuestionAnswerCommentString = ( + page: string, + question: string, + answer: any, + answerType: string, + getTextInputProps: any, +): { label: string; answer: string; textInputProps: any } => { + let combinedFields = []; + if (page === 'laporanPage1') { + combinedFields = dietReportTextFields[page]; + } else if (page === 'laporanPage2' || page === 'laporanPage3') { + combinedFields = dietReportSelectFields[page]; + } else if (page === 'laporanPage4') { + combinedFields = dietReportSelectFields[page].concat( + dietReportTextFields[page], + ); + } + + let finalAnswer = answer; + if (answerType === answerTypes.SELECT) { + finalAnswer = getSelectedAnswerString( + page, + dietReportTextFields, + question, + answer, + ); + } + if (finalAnswer === '') { + finalAnswer = '-'; + } + + return { + label: combinedFields.find((qst) => qst.name === question)!.label, + answer: finalAnswer, + textInputProps: getTextInputProps(question), + }; +}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/schema.ts b/src/scenes/nutritionist/DietReportForNutritionist/schema.ts new file mode 100644 index 0000000..52d037b --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/schema.ts @@ -0,0 +1,93 @@ +import { FieldValidation, FieldType } from 'utils/form'; +import { TextFieldSchema } from 'types/form'; + +export const dietReportCommentTextFields: TextFieldSchema[] = [ + { + required: true, + name: 'weight', + }, + { + required: true, + name: 'height', + }, + { + required: true, + name: 'waist_size', + }, + { + required: true, + name: 'changes_felt', + }, + { + required: true, + name: 'hunger_level', + }, + { + required: true, + name: 'fullness_level', + }, + { + required: true, + name: 'heavy_meal', + }, + { + required: true, + name: 'average_consumption', + }, + { + required: true, + name: 'water_consumption', + }, + { + required: true, + name: 'physical_activity', + }, + { + required: true, + name: 'time_for_activity', + }, + { + required: true, + name: 'feeling_rating', + }, + { + required: true, + name: 'lesson_learned', + }, + { + required: true, + name: 'problem_faced_and_feedbacks', + }, +]; + +export const dietReportCommentInitialValues = { + weight: '', + height: '', + waist_size: '', + changes_felt: '', + hunger_level: '', + fullness_level: '', + heavy_meal: '', + snacks: '', + sweet_beverages: '', + fried_snacks: '', + umami_snacks: '', + sweet_snacks: '', + fruits_portion: '', + vegetables_portion: '', + water_consumption: '', + physical_activity: '', + time_for_activity: '', + feeling_rating: '', + lesson_learned: '', + problem_faced_and_feedbacks: '', +}; + +export const fieldValidations: FieldValidation[] = [ + ...dietReportCommentTextFields.map((field) => ({ + name: field.name, + required: field.required, + label: 'Komentar', + type: FieldType.TEXT, + })), +]; diff --git a/src/scenes/questionnaire/ReadOnlyDietProfile/pages/utils.ts b/src/scenes/questionnaire/ReadOnlyDietProfile/pages/utils.ts index 242821a..82496d1 100644 --- a/src/scenes/questionnaire/ReadOnlyDietProfile/pages/utils.ts +++ b/src/scenes/questionnaire/ReadOnlyDietProfile/pages/utils.ts @@ -20,7 +20,7 @@ export const getQuestionAnswerString = ( let finalAnswer = answer; if (answerType === answerTypes.SELECT) { - finalAnswer = getSelectedAnswerString(page, question, answer); + finalAnswer = getSelectedAnswerString(page, selectFields, question, answer); } if (finalAnswer === '') { finalAnswer = '-'; @@ -32,24 +32,31 @@ export const getQuestionAnswerString = ( }; }; -const getSelectedAnswerString = ( +export const getSelectedAnswerString = ( page: string, + selectOptionFields: { [_: string]: any[] }, question: string, choice: any, ) => { if (Array.isArray(choice)) { - return getAnswerListString(page, question, choice); + return getAnswerListString(page, selectOptionFields, question, choice); } - return getSelectFieldsChoice(page, question, choice); + return getSelectFieldsChoice(page, selectOptionFields, question, choice); }; -const getSelectFieldsChoice = (page: string, question: string, choice: any) => - selectFields[page].find((qst) => qst.name === question)?.choiceList[ +const getSelectFieldsChoice = ( + page: string, + selectOptionFields: { [_: string]: any[] }, + question: string, + choice: any, +) => + selectOptionFields[page].find((qst) => qst.name === question)?.choiceList[ choice - 1 ]; const getAnswerListString = ( page: string, + selectOptionFields: { [_: string]: any[] }, question: string, answers: any[], ) => { @@ -58,7 +65,12 @@ const getAnswerListString = ( if (typeof answers[0] === 'number') { answers.map( (ans) => - (answer += `- ${getSelectFieldsChoice(page, question, ans)}\n`), + (answer += `- ${getSelectFieldsChoice( + page, + selectOptionFields, + question, + ans, + )}\n`), ); } else { answers.map((ans) => (answer += `- ${ans}\n`)); diff --git a/src/services/progress/index.ts b/src/services/progress/index.ts new file mode 100644 index 0000000..9af7f42 --- /dev/null +++ b/src/services/progress/index.ts @@ -0,0 +1,10 @@ +import { api, RequestMethod, ApiResponse } from '../api'; + +import * as apiUrls from './urls'; +import { UserReport } from './models'; + +export const retrieveUserReportById = ( + id: number, +): ApiResponse => { + return api(RequestMethod.GET, apiUrls.userReportById(id)); +}; diff --git a/src/services/progress/models.ts b/src/services/progress/models.ts new file mode 100644 index 0000000..71f994f --- /dev/null +++ b/src/services/progress/models.ts @@ -0,0 +1,29 @@ +import { User } from 'services/auth/models'; + +export interface UserReport { + client: User; + nutritionist: number; + id: number; + physical_activity: number[]; + week_num: number; + weight: number; + height: number; + waist_size: number; + changes_felt: number; + hunger_level: number; + fullness_level: number; + heavy_meal: number; + snacks: number; + sweet_beverages: number; + fried_snacks: number; + umami_snacks: number; + sweet_snacks: number; + fruits_portion: number; + vegetables_portion: number; + water_consumption: number; + physical_activity_other: string; + time_for_activity: number; + feeling_rating: number; + lesson_learned: string; + problem_faced_and_feedbacks: string; +} diff --git a/src/services/progress/urls.ts b/src/services/progress/urls.ts new file mode 100644 index 0000000..6b7de48 --- /dev/null +++ b/src/services/progress/urls.ts @@ -0,0 +1,2 @@ +export const progress = 'progress/'; +export const userReportById = (id: number) => `${progress}${id}`; -- GitLab From 495da14e8cbe23db90814837b21dc54e4a4d034b Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Sun, 30 May 2021 23:35:45 +0700 Subject: [PATCH 02/25] [REFACTOR] implement other static pages of the diet report --- src/__mocks__/userReport.ts | 22 +++++- src/constants/navigation.ts | 3 +- .../components/DietReportPage/index.tsx | 1 + .../QuestionAnswerCommentCard/index.tsx | 35 ++++++--- .../QuestionAnswerCommentCard/styles.ts | 8 ++- .../DietReportForNutritionist/index.tsx | 49 +++++-------- .../pages/LaporanPage1/index.ts | 8 +-- .../pages/LaporanPage2/index.ts | 56 +++++++++++++++ .../pages/LaporanPage3/index.ts | 72 +++++++++++++++++++ .../pages/LaporanPage4/index.ts | 64 +++++++++++++++++ .../DietReportForNutritionist/pages/index.ts | 8 +-- .../DietReportForNutritionist/pages/types.ts | 1 + .../DietReportForNutritionist/pages/utils.ts | 2 +- .../DietReportForNutritionist/schema.ts | 1 + .../ReadOnlyDietProfile/pages/utils.ts | 15 ++-- src/services/progress/index.ts | 4 +- src/services/progress/models.ts | 16 +++-- 17 files changed, 299 insertions(+), 66 deletions(-) diff --git a/src/__mocks__/userReport.ts b/src/__mocks__/userReport.ts index 2e41e57..7d5d73b 100644 --- a/src/__mocks__/userReport.ts +++ b/src/__mocks__/userReport.ts @@ -1,6 +1,10 @@ -import { UserReport } from 'services/progress/models'; +import { + UserReportRequest, + UserReportResponse, +} from 'services/progress/models'; +import { UserRole } from 'services/auth/models'; -export const mockUserReport: UserReport = { +export const mockUserReportRequest: UserReportRequest = { weight: 155, height: 188, waist_size: 100, @@ -10,6 +14,7 @@ export const mockUserReport: UserReport = { heavy_meal: 1, snacks: 1, sweet_beverages: 1, + sugar: 1, fried_snacks: 1, umami_snacks: 1, sweet_snacks: 1, @@ -23,3 +28,16 @@ export const mockUserReport: UserReport = { lesson_learned: 'a', problem_faced_and_feedbacks: 'x', }; + +export const mockUserReportResponse: UserReportResponse = { + id: 4, + nutritionist: 1, + week_num: 2, + client: { + id: 9, + name: 'Shin Ryujin', + email: 'ryujin@itzy.com', + role: UserRole.CLIENT, + }, + ...mockUserReportRequest, +}; diff --git a/src/constants/navigation.ts b/src/constants/navigation.ts index 3d2d823..e2ce361 100644 --- a/src/constants/navigation.ts +++ b/src/constants/navigation.ts @@ -34,6 +34,7 @@ import { LoginChoosePlan, } from 'scenes'; import { FC } from 'react'; +import DietReportForNutritionist from 'scenes/nutritionist/DietReportForNutritionist'; export interface NavRoute { name: string; @@ -72,7 +73,7 @@ const navigation: NavRoute[] = [ export const publicNavigation: NavRoute[] = [ { name: ROUTES.initial, - component: InitialPage, + component: DietReportForNutritionist, }, ...navigation, { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx index bb98007..15d470b 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx @@ -15,6 +15,7 @@ const DietReportPage: FC<{ {content.questions.map((qst, idx) => ( = ({ + questionName, question, answer, textInputProps, @@ -21,13 +23,30 @@ const QuestionAnswerCommentCard: FC = ({ }) => { return ( - {question} - - + {questionName === 'name' ? ( + + {answer} + + ) : null} + {questionName === 'email' ? ( + + {answer} + + ) : null} + {/* */} + {questionName !== 'name' && questionName !== 'email' ? ( + + {question} + + {answer} + + + + ) : null} ); }; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts index 8e6c7f9..cb5a00b 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts @@ -3,7 +3,7 @@ import { StyleSheet } from 'react-native'; export const styles = StyleSheet.create({ label: { marginBottom: 5, - marginTop: 15, + marginTop: 5, }, labelContainer: { alignSelf: 'stretch', @@ -11,5 +11,11 @@ export const styles = StyleSheet.create({ answer: { flexDirection: 'row', }, + nameSize: { + fontSize: 32, + }, + bottomMargin: { + marginBottom: 20, + }, input: {}, }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx index c27abcd..5f225db 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx @@ -1,5 +1,5 @@ import React, { FC, useState } from 'react'; -import { ScrollView, View, StyleSheet, Dimensions } from 'react-native'; +import { View, StyleSheet, Dimensions } from 'react-native'; import { layoutStyles } from 'styles'; import Carousel from 'react-native-snap-carousel'; import { pages } from './pages'; @@ -8,12 +8,11 @@ import { useForm } from 'hooks'; import { dietReportCommentInitialValues, fieldValidations } from './schema'; import { generateValidationSchema } from 'utils/form'; import DietReportPage from './components/DietReportPage'; -import { mockUserReport } from '__mocks__/userReport'; -import { Section } from 'components/layout'; +import { mockUserReportResponse } from '__mocks__/userReport'; const DietReportForNutritionist: FC = () => { const [activeSlide, setActiveSlide] = useState(0); - const userReport = mockUserReport; + const userReport = mockUserReportResponse; const { getTextInputProps, handleSubmit, isSubmitting } = useForm({ initialValues: dietReportCommentInitialValues, @@ -21,29 +20,12 @@ const DietReportForNutritionist: FC = () => { onSubmit: async (values) => { console.log('masuk'); console.log(values); - // const payload = convertPayload ? convertPayload(values) : values; - // const response = await updateDietQuestionnaireApi( - // dietQuestionnaireResponse.id, - // payload, - // ); - // if (response.success && response.data) { - // navigation.reset({ - // index: 0, - // routes: [{ name: ROUTES.extendedQuestionnaire }], - // }); - // } else { - // Toast.show({ - // type: 'error', - // text1: 'Gagal menyimpan data', - // text2: 'Terjadi kesalahan pada sisi kami. Silakan coba lagi', - // }); - // } }, }); return ( - + ( { sliderWidth={Dimensions.get('window').width} itemWidth={Dimensions.get('window').width} onSnapToItem={setActiveSlide} + containerCustomStyle={styles.flexContainer} + slideStyle={styles.flexContainer} /> - - -
- -
+
+ + ); }; const styles = StyleSheet.create({ - container: { height: Dimensions.get('window').height * 0.83 }, + flexContainer: { + flex: 1, + }, reportContainer: { position: 'relative', flex: 1, + paddingBottom: 20, }, searchContainer: { backgroundColor: 'white', diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts index b2d6039..6a45c34 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts @@ -1,22 +1,22 @@ import { DietReportPageContent } from '../types'; import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; -// import { getQuestionAnswerString } from '../utils'; -import { UserReport } from 'services/progress/models'; +import { UserReportResponse } from 'services/progress/models'; import { getQuestionAnswerCommentString } from '../utils'; -// import { pageHeaders } from 'constants/questionnaire'; export const laporanPage1 = ( - { client, weight, height, waist_size }: UserReport, + { client, weight, height, waist_size }: UserReportResponse, getTextInputProps: any, ): DietReportPageContent => { const page = 'laporanPage1'; return { questions: [ { + questionName: 'name', label: 'Nama Lengkap', answer: client.name, }, { + questionName: 'email', label: 'Email', answer: client.email, }, diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts index e69de29..963b58c 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts @@ -0,0 +1,56 @@ +import { DietReportPageContent } from '../types'; +import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; +import { UserReportResponse } from 'services/progress/models'; +import { getQuestionAnswerCommentString } from '../utils'; + +export const laporanPage2 = ( + { + changes_felt, + hunger_level, + fullness_level, + heavy_meal, + snacks, + }: UserReportResponse, + getTextInputProps: any, +): DietReportPageContent => { + const page = 'laporanPage2'; + return { + questions: [ + getQuestionAnswerCommentString( + page, + 'changes_felt', + changes_felt, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'hunger_level', + hunger_level, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'fullness_level', + fullness_level, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'heavy_meal', + heavy_meal, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'snacks', + snacks, + answerTypes.SELECT, + getTextInputProps, + ), + ], + }; +}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts index e69de29..369c927 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts @@ -0,0 +1,72 @@ +import { DietReportPageContent } from '../types'; +import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; +import { UserReportResponse } from 'services/progress/models'; +import { getQuestionAnswerCommentString } from '../utils'; + +export const laporanPage3 = ( + { + sweet_beverages, + sugar, + fried_snacks, + umami_snacks, + sweet_snacks, + fruits_portion, + vegetables_portion, + }: UserReportResponse, + getTextInputProps: any, +): DietReportPageContent => { + const page = 'laporanPage3'; + return { + questions: [ + getQuestionAnswerCommentString( + page, + 'sweet_beverages', + sweet_beverages, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'sugar', + sugar, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'fried_snacks', + fried_snacks, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'umami_snacks', + umami_snacks, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'sweet_snacks', + sweet_snacks, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'fruits_portion', + fruits_portion, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'vegetables_portion', + vegetables_portion, + answerTypes.SELECT, + getTextInputProps, + ), + ], + }; +}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts index e69de29..5b4ead2 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts @@ -0,0 +1,64 @@ +import { DietReportPageContent } from '../types'; +import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; +import { UserReportResponse } from 'services/progress/models'; +import { getQuestionAnswerCommentString } from '../utils'; + +export const laporanPage4 = ( + { + physical_activity, + time_for_activity, + feeling_rating, + water_consumption, + lesson_learned, + problem_faced_and_feedbacks, + }: UserReportResponse, + getTextInputProps: any, +): DietReportPageContent => { + const page = 'laporanPage4'; + return { + questions: [ + getQuestionAnswerCommentString( + page, + 'physical_activity', + physical_activity, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'time_for_activity', + time_for_activity, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'feeling_rating', + feeling_rating, + answerTypes.SELECT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'water_consumption', + water_consumption, + answerTypes.TEXT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'lesson_learned', + lesson_learned, + answerTypes.TEXT, + getTextInputProps, + ), + getQuestionAnswerCommentString( + page, + 'problem_faced_and_feedbacks', + problem_faced_and_feedbacks, + answerTypes.TEXT, + getTextInputProps, + ), + ], + }; +}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts index 0149f42..4dcba57 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts @@ -1,6 +1,6 @@ import { laporanPage1 } from './LaporanPage1'; -// import { laporanPage2 } from './LaporanPage2'; -// import { laporanPage3 } from './LaporanPage3'; -// import { laporanPage4 } from './LaporanPage4'; +import { laporanPage2 } from './LaporanPage2'; +import { laporanPage3 } from './LaporanPage3'; +import { laporanPage4 } from './LaporanPage4'; -export const pages = [laporanPage1]; +export const pages = [laporanPage1, laporanPage2, laporanPage3, laporanPage4]; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts index 12e17ad..b1f4889 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts @@ -1,5 +1,6 @@ export interface DietReportPageContent { questions: { + questionName?: string; label: string; answer: string; textInputProps?: any; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts index 32de7f8..99edf21 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts @@ -27,7 +27,7 @@ export const getQuestionAnswerCommentString = ( if (answerType === answerTypes.SELECT) { finalAnswer = getSelectedAnswerString( page, - dietReportTextFields, + combinedFields, question, answer, ); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/schema.ts b/src/scenes/nutritionist/DietReportForNutritionist/schema.ts index 52d037b..c5fad29 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/schema.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/schema.ts @@ -70,6 +70,7 @@ export const dietReportCommentInitialValues = { heavy_meal: '', snacks: '', sweet_beverages: '', + sugar: '', fried_snacks: '', umami_snacks: '', sweet_snacks: '', diff --git a/src/scenes/questionnaire/ReadOnlyDietProfile/pages/utils.ts b/src/scenes/questionnaire/ReadOnlyDietProfile/pages/utils.ts index 82496d1..bdc283b 100644 --- a/src/scenes/questionnaire/ReadOnlyDietProfile/pages/utils.ts +++ b/src/scenes/questionnaire/ReadOnlyDietProfile/pages/utils.ts @@ -20,7 +20,12 @@ export const getQuestionAnswerString = ( let finalAnswer = answer; if (answerType === answerTypes.SELECT) { - finalAnswer = getSelectedAnswerString(page, selectFields, question, answer); + finalAnswer = getSelectedAnswerString( + page, + combinedFields, + question, + answer, + ); } if (finalAnswer === '') { finalAnswer = '-'; @@ -34,7 +39,7 @@ export const getQuestionAnswerString = ( export const getSelectedAnswerString = ( page: string, - selectOptionFields: { [_: string]: any[] }, + selectOptionFields: any[], question: string, choice: any, ) => { @@ -46,17 +51,17 @@ export const getSelectedAnswerString = ( const getSelectFieldsChoice = ( page: string, - selectOptionFields: { [_: string]: any[] }, + selectOptionFields: any[], question: string, choice: any, ) => - selectOptionFields[page].find((qst) => qst.name === question)?.choiceList[ + selectOptionFields.find((qst) => qst.name === question)?.choiceList[ choice - 1 ]; const getAnswerListString = ( page: string, - selectOptionFields: { [_: string]: any[] }, + selectOptionFields: any[], question: string, answers: any[], ) => { diff --git a/src/services/progress/index.ts b/src/services/progress/index.ts index 9af7f42..8c4bfa9 100644 --- a/src/services/progress/index.ts +++ b/src/services/progress/index.ts @@ -1,10 +1,10 @@ import { api, RequestMethod, ApiResponse } from '../api'; import * as apiUrls from './urls'; -import { UserReport } from './models'; +import { UserReportResponse } from './models'; export const retrieveUserReportById = ( id: number, -): ApiResponse => { +): ApiResponse => { return api(RequestMethod.GET, apiUrls.userReportById(id)); }; diff --git a/src/services/progress/models.ts b/src/services/progress/models.ts index 71f994f..9288bb4 100644 --- a/src/services/progress/models.ts +++ b/src/services/progress/models.ts @@ -1,11 +1,6 @@ import { User } from 'services/auth/models'; -export interface UserReport { - client: User; - nutritionist: number; - id: number; - physical_activity: number[]; - week_num: number; +export interface UserReportRequest { weight: number; height: number; waist_size: number; @@ -15,15 +10,24 @@ export interface UserReport { heavy_meal: number; snacks: number; sweet_beverages: number; + sugar: number; fried_snacks: number; umami_snacks: number; sweet_snacks: number; fruits_portion: number; vegetables_portion: number; water_consumption: number; + physical_activity: number[]; physical_activity_other: string; time_for_activity: number; feeling_rating: number; lesson_learned: string; problem_faced_and_feedbacks: string; } + +export interface UserReportResponse extends UserReportRequest { + client: User; + nutritionist: number; + id: number; + week_num: number; +} -- GitLab From d38a78dce95877b36c695db78295057f685d7cd3 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Mon, 31 May 2021 01:49:44 +0700 Subject: [PATCH 03/25] [REFACTOR] adjust diet report 3 comment --- src/constants/userReport.ts | 10 ++-- .../components/DietReportPage/index.tsx | 53 +++++++++++++++---- .../components/DietReportPage/styles.ts | 11 ++++ .../QuestionAnswerCommentCard/index.tsx | 25 +++++++-- .../QuestionAnswerCommentCard/styles.ts | 12 ++++- .../components/index.ts | 2 + .../DietReportForNutritionist/index.tsx | 6 ++- .../index.ts | 6 +-- .../index.ts | 6 +-- .../index.ts | 6 +-- .../index.ts | 6 +-- .../DietReportForNutritionist/pages/index.ts | 16 ++++-- .../DietReportForNutritionist/pages/types.ts | 7 +++ .../DietReportForNutritionist/pages/utils.ts | 7 +-- .../DietReportForNutritionist/schema.ts | 8 +-- 15 files changed, 132 insertions(+), 49 deletions(-) create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/components/index.ts rename src/scenes/nutritionist/DietReportForNutritionist/pages/{LaporanPage1 => DietReportPage1}/index.ts (88%) rename src/scenes/nutritionist/DietReportForNutritionist/pages/{LaporanPage2 => DietReportPage2}/index.ts (89%) rename src/scenes/nutritionist/DietReportForNutritionist/pages/{LaporanPage3 => DietReportPage3}/index.ts (92%) rename src/scenes/nutritionist/DietReportForNutritionist/pages/{LaporanPage4 => DietReportPage4}/index.ts (91%) diff --git a/src/constants/userReport.ts b/src/constants/userReport.ts index 49fabdc..9a6f313 100644 --- a/src/constants/userReport.ts +++ b/src/constants/userReport.ts @@ -6,7 +6,7 @@ import { } from './options'; export const dietReportTextFields: { [_: string]: TextFieldSchema[] } = { - laporanPage1: [ + dietReportPage1: [ { label: 'Berat Badan (kg)', placeholder: 'Masukan berat badan yang terakhir anda ukur', @@ -28,7 +28,7 @@ export const dietReportTextFields: { [_: string]: TextFieldSchema[] } = { keyboardType: 'numeric', }, ], - laporanPage4: [ + dietReportPage4: [ { label: 'Selama 1 minggu terakhir, berapa rata-rata total gelas air putih yang Anda minum?', @@ -53,7 +53,7 @@ export const dietReportTextFields: { [_: string]: TextFieldSchema[] } = { }; export const dietReportSelectFields: { [_: string]: any[] } = { - laporanPage2: [ + dietReportPage2: [ { label: 'Apakah sudah mulai terasa ada perubahan ukuran baju atau celana?', placeholder: 'Skor 3: jika tidak ada perubahan sama sekali', @@ -101,7 +101,7 @@ export const dietReportSelectFields: { [_: string]: any[] } = { ], }, ], - laporanPage3: [ + dietReportPage3: [ { label: 'Minuman manis (satuan: gelas)', placeholder: 'Pilih salah satu', @@ -148,7 +148,7 @@ export const dietReportSelectFields: { [_: string]: any[] } = { choiceList: averageConsumptionOptions, }, ], - laporanPage4: [ + dietReportPage4: [ { label: 'Selama 1 minggu terakhir, pilih semua jenis aktivitas atau olahraga yang sudah Anda lakukan', diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx index 15d470b..ca3c922 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx @@ -4,23 +4,56 @@ import { ScrollView } from 'react-native'; // import { typography } from 'styles'; import { styles } from './styles'; import React from 'react'; -import { DietReportPageContent } from '../../pages/types'; +import { DietReportPageContent, dietReportPage } from '../../pages/types'; import QuestionAnswerCommentCard from '../QuestionAnswerCommentCard'; +import { Text } from 'react-native-elements'; +import { typographyStyles } from 'styles'; +import { TextInput } from 'react-native-gesture-handler'; const DietReportPage: FC<{ content: DietReportPageContent; -}> = ({ content }) => { + pageName: string; + getTextInputProps?: any; +}> = ({ content, pageName, getTextInputProps }) => { return ( - {content.questions.map((qst, idx) => ( - + Selama 1 minggu terakhir, berapa rata-rata Anda mengonsumsi jenis + makanan dibawah ini selama seharian + + ) : null} + {content.questions.map((qst, idx) => { + if (pageName === dietReportPage.PAGE3) { + return ( + + ); + } + return ( + + ); + })} + {pageName === dietReportPage.PAGE3 ? ( + - ))} + ) : null} ); }; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts index 5dff3bb..5d585c8 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts @@ -7,4 +7,15 @@ export const styles = StyleSheet.create({ container: { width: Dimensions.get('window').width - 40, }, + input: { + borderWidth: 1, + height: 90, + borderRadius: 4, + marginBottom: 20, + padding: 15, + marginTop: 5, + }, + bottomMargin: { + marginBottom: 10, + } }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx index 6b61477..c1e1390 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx @@ -5,17 +5,20 @@ import React from 'react'; // import { InfoCard } from 'components/core'; import { typographyStyles } from 'styles'; import { styles } from './styles'; +import { dietReportPage } from '../../pages/types'; interface Props { question: string; + pageName: string; answer: string; - textInputProps: any; + textInputProps?: any; questionName?: string | null; testID?: string; } const QuestionAnswerCommentCard: FC = ({ questionName, + pageName, question, answer, textInputProps, @@ -33,17 +36,31 @@ const QuestionAnswerCommentCard: FC = ({ {answer} ) : null} - {/* */} - {questionName !== 'name' && questionName !== 'email' ? ( + + {pageName === dietReportPage.PAGE3 ? ( + + + {question} + + + {answer} + + + ) : null} + + {pageName !== dietReportPage.PAGE3 && + questionName !== 'name' && + questionName !== 'email' ? ( {question} {answer} ) : null} diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts index cb5a00b..dc357ae 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/styles.ts @@ -17,5 +17,15 @@ export const styles = StyleSheet.create({ bottomMargin: { marginBottom: 20, }, - input: {}, + topMargin: { + marginTop: 10, + }, + input: { + borderRadius: 4, + borderWidth: 1, + height: 90, + marginTop: 5, + marginBottom: 20, + padding: 15, + }, }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/components/index.ts new file mode 100644 index 0000000..8428fe9 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/index.ts @@ -0,0 +1,2 @@ +export { default as DietReportPage } from './DietReportPage'; +export { default as QuestionAnswerCommentCard } from './QuestionAnswerCommentCard'; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx index 5f225db..297f7ab 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx @@ -7,7 +7,7 @@ import { CarouselPagination, BigButton } from 'components/core'; import { useForm } from 'hooks'; import { dietReportCommentInitialValues, fieldValidations } from './schema'; import { generateValidationSchema } from 'utils/form'; -import DietReportPage from './components/DietReportPage'; +import { DietReportPage } from './components'; import { mockUserReportResponse } from '__mocks__/userReport'; const DietReportForNutritionist: FC = () => { @@ -30,7 +30,9 @@ const DietReportForNutritionist: FC = () => { data={pages.map((page, idx) => ( ))} renderItem={({ item }: any) => item} diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts similarity index 88% rename from src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts rename to src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts index 6a45c34..9769956 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage1/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts @@ -1,13 +1,13 @@ -import { DietReportPageContent } from '../types'; +import { DietReportPageContent, dietReportPage } from '../types'; import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; import { UserReportResponse } from 'services/progress/models'; import { getQuestionAnswerCommentString } from '../utils'; -export const laporanPage1 = ( +export const dietReportPage1 = ( { client, weight, height, waist_size }: UserReportResponse, getTextInputProps: any, ): DietReportPageContent => { - const page = 'laporanPage1'; + const page = dietReportPage.PAGE1; return { questions: [ { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts similarity index 89% rename from src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts rename to src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts index 963b58c..341a130 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage2/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts @@ -1,9 +1,9 @@ -import { DietReportPageContent } from '../types'; +import { DietReportPageContent, dietReportPage } from '../types'; import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; import { UserReportResponse } from 'services/progress/models'; import { getQuestionAnswerCommentString } from '../utils'; -export const laporanPage2 = ( +export const dietReportPage2 = ( { changes_felt, hunger_level, @@ -13,7 +13,7 @@ export const laporanPage2 = ( }: UserReportResponse, getTextInputProps: any, ): DietReportPageContent => { - const page = 'laporanPage2'; + const page = dietReportPage.PAGE2; return { questions: [ getQuestionAnswerCommentString( diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts similarity index 92% rename from src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts rename to src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts index 369c927..fdd352e 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage3/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts @@ -1,9 +1,9 @@ -import { DietReportPageContent } from '../types'; +import { DietReportPageContent, dietReportPage } from '../types'; import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; import { UserReportResponse } from 'services/progress/models'; import { getQuestionAnswerCommentString } from '../utils'; -export const laporanPage3 = ( +export const dietReportPage3 = ( { sweet_beverages, sugar, @@ -15,7 +15,7 @@ export const laporanPage3 = ( }: UserReportResponse, getTextInputProps: any, ): DietReportPageContent => { - const page = 'laporanPage3'; + const page = dietReportPage.PAGE3; return { questions: [ getQuestionAnswerCommentString( diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts similarity index 91% rename from src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts rename to src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts index 5b4ead2..fe59775 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/LaporanPage4/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts @@ -1,9 +1,9 @@ -import { DietReportPageContent } from '../types'; +import { DietReportPageContent, dietReportPage } from '../types'; import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; import { UserReportResponse } from 'services/progress/models'; import { getQuestionAnswerCommentString } from '../utils'; -export const laporanPage4 = ( +export const dietReportPage4 = ( { physical_activity, time_for_activity, @@ -14,7 +14,7 @@ export const laporanPage4 = ( }: UserReportResponse, getTextInputProps: any, ): DietReportPageContent => { - const page = 'laporanPage4'; + const page = dietReportPage.PAGE4; return { questions: [ getQuestionAnswerCommentString( diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts index 4dcba57..e90dbc6 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/index.ts @@ -1,6 +1,12 @@ -import { laporanPage1 } from './LaporanPage1'; -import { laporanPage2 } from './LaporanPage2'; -import { laporanPage3 } from './LaporanPage3'; -import { laporanPage4 } from './LaporanPage4'; +import { dietReportPage1 } from './DietReportPage1'; +import { dietReportPage2 } from './DietReportPage2'; +import { dietReportPage3 } from './DietReportPage3'; +import { dietReportPage4 } from './DietReportPage4'; +import { dietReportPage } from './types'; -export const pages = [laporanPage1, laporanPage2, laporanPage3, laporanPage4]; +export const pages = [ + { pageName: dietReportPage.PAGE1, pageContent: dietReportPage1 }, + { pageName: dietReportPage.PAGE2, pageContent: dietReportPage2 }, + { pageName: dietReportPage.PAGE3, pageContent: dietReportPage3 }, + { pageName: dietReportPage.PAGE4, pageContent: dietReportPage4 }, +]; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts index b1f4889..801b9d7 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/types.ts @@ -6,3 +6,10 @@ export interface DietReportPageContent { textInputProps?: any; }[]; } + +export const dietReportPage = { + PAGE1: 'dietReportPage1', + PAGE2: 'dietReportPage2', + PAGE3: 'dietReportPage3', + PAGE4: 'dietReportPage4', +}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts index 99edf21..0f02809 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts @@ -4,6 +4,7 @@ import { } from 'constants/userReport'; import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; import { getSelectedAnswerString } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/utils'; +import { dietReportPage } from './types'; export const getQuestionAnswerCommentString = ( page: string, @@ -13,11 +14,11 @@ export const getQuestionAnswerCommentString = ( getTextInputProps: any, ): { label: string; answer: string; textInputProps: any } => { let combinedFields = []; - if (page === 'laporanPage1') { + if (page === dietReportPage.PAGE1) { combinedFields = dietReportTextFields[page]; - } else if (page === 'laporanPage2' || page === 'laporanPage3') { + } else if (page === dietReportPage.PAGE2 || page === dietReportPage.PAGE3) { combinedFields = dietReportSelectFields[page]; - } else if (page === 'laporanPage4') { + } else if (page === dietReportPage.PAGE4) { combinedFields = dietReportSelectFields[page].concat( dietReportTextFields[page], ); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/schema.ts b/src/scenes/nutritionist/DietReportForNutritionist/schema.ts index c5fad29..51c69e1 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/schema.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/schema.ts @@ -69,13 +69,7 @@ export const dietReportCommentInitialValues = { fullness_level: '', heavy_meal: '', snacks: '', - sweet_beverages: '', - sugar: '', - fried_snacks: '', - umami_snacks: '', - sweet_snacks: '', - fruits_portion: '', - vegetables_portion: '', + average_consumption: '', water_consumption: '', physical_activity: '', time_for_activity: '', -- GitLab From 9dc4ad1fae5e0e24cf3851649ac07891a798c10c Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Mon, 31 May 2021 02:01:09 +0700 Subject: [PATCH 04/25] [REFACTOR] finish static diet report --- src/constants/navigation.ts | 4 ++-- .../components/DietReportPage/styles.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/constants/navigation.ts b/src/constants/navigation.ts index cbcd065..7fee4fb 100644 --- a/src/constants/navigation.ts +++ b/src/constants/navigation.ts @@ -73,7 +73,7 @@ const navigation: NavRoute[] = [ export const publicNavigation: NavRoute[] = [ { name: ROUTES.initial, - component: DietReportForNutritionist, + component: InitialPage, }, ...navigation, { @@ -190,7 +190,7 @@ export const nutritionistNavigation: NavRoute[] = [ }, { name: ROUTES.clientDietReportNutritionist, - component: ComingSoonPage, + component: DietReportForNutritionist, header: 'Laporan Klien', }, { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts index 5d585c8..982fa67 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts @@ -17,5 +17,5 @@ export const styles = StyleSheet.create({ }, bottomMargin: { marginBottom: 10, - } + }, }); -- GitLab From 35f231370c523eb3fcea2643adebfe959715379f Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Mon, 31 May 2021 13:29:20 +0700 Subject: [PATCH 05/25] [REFACTOR] improve styling for diet report --- src/constants/userReport.ts | 12 +++--- .../components/DietReportPage/index.tsx | 24 +++++++----- .../components/DietReportPage/styles.ts | 3 ++ .../QuestionAnswerCommentCard/index.tsx | 37 ++++++++++++++++--- .../QuestionAnswerCommentCard/styles.ts | 6 +++ .../DietReportForNutritionist/pages/types.ts | 2 + .../DietReportForNutritionist/pages/utils.ts | 21 ++++++++++- 7 files changed, 83 insertions(+), 22 deletions(-) diff --git a/src/constants/userReport.ts b/src/constants/userReport.ts index 9a6f313..bafce89 100644 --- a/src/constants/userReport.ts +++ b/src/constants/userReport.ts @@ -58,8 +58,8 @@ export const dietReportSelectFields: { [_: string]: any[] } = { label: 'Apakah sudah mulai terasa ada perubahan ukuran baju atau celana?', placeholder: 'Skor 3: jika tidak ada perubahan sama sekali', name: 'changes_felt', - lowest_score_description: 'Belum terasa sama sekali', - highest_score_description: 'Sudah sangat berubah', + lowestScoreDescription: '1: Belum terasa sama sekali', + highestScoreDescription: '5: Sudah sangat berubah', choiceList: likertScale5, }, { @@ -67,8 +67,8 @@ export const dietReportSelectFields: { [_: string]: any[] } = { 'Secara rata-rata, sebelum waktu makan selama 1 minggu terakhir ini, dimana level rasa lapar yang Anda rasakan?', placeholder: 'Cek indikator di program book kamu ya', name: 'hunger_level', - lowest_score_description: 'Sangat kelaparan', - highest_score_description: 'Sangat begah (kenyang berlebihan)', + lowestScoreDescription: '1: Sangat kelaparan', + highestScoreDescription: '10: Sangat begah (kenyang berlebihan)', choiceList: likertScale10, }, { @@ -76,8 +76,8 @@ export const dietReportSelectFields: { [_: string]: any[] } = { 'Secara rata-rata, saat berhenti makan selama 1 minggu terakhir ini, dimana level rasa kenyang yang Anda rasakan?', placeholder: 'Cek indikator di program book kamu ya', name: 'fullness_level', - lowest_score_description: 'Sangat kelaparan', - highest_score_description: 'Sangat begah (kenyang berlebihan)', + lowestScoreDescription: '1: Sangat kelaparan', + highestScoreDescription: '10: Sangat begah (kenyang berlebihan)', choiceList: likertScale10, }, { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx index ca3c922..bc2097f 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx @@ -1,7 +1,6 @@ import { FC } from 'react'; -import { ScrollView } from 'react-native'; +import { ScrollView, View } from 'react-native'; -// import { typography } from 'styles'; import { styles } from './styles'; import React from 'react'; import { DietReportPageContent, dietReportPage } from '../../pages/types'; @@ -18,7 +17,7 @@ const DietReportPage: FC<{ return ( {pageName === dietReportPage.PAGE3 ? ( - + Selama 1 minggu terakhir, berapa rata-rata Anda mengonsumsi jenis makanan dibawah ini selama seharian @@ -43,16 +42,23 @@ const DietReportPage: FC<{ question={qst.label} answer={qst.answer} textInputProps={qst.textInputProps} + lowestScoreDescription={qst.lowestScoreDescription} + highestScoreDescription={qst.highestScoreDescription} /> ); })} {pageName === dietReportPage.PAGE3 ? ( - + + + Komentar: + + + ) : null} ); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts index 982fa67..5fc9dda 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/styles.ts @@ -18,4 +18,7 @@ export const styles = StyleSheet.create({ bottomMargin: { marginBottom: 10, }, + topMargin: { + marginTop: 10, + }, }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx index c1e1390..210aecf 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.tsx @@ -2,7 +2,7 @@ import { FC } from 'react'; import { View, Text, TextInput } from 'react-native'; import React from 'react'; -// import { InfoCard } from 'components/core'; +import { InfoCard } from 'components/core'; import { typographyStyles } from 'styles'; import { styles } from './styles'; import { dietReportPage } from '../../pages/types'; @@ -13,6 +13,8 @@ interface Props { answer: string; textInputProps?: any; questionName?: string | null; + lowestScoreDescription?: string | null; + highestScoreDescription?: string | null; testID?: string; } @@ -22,6 +24,8 @@ const QuestionAnswerCommentCard: FC = ({ question, answer, textInputProps, + lowestScoreDescription, + highestScoreDescription, testID, }) => { return ( @@ -39,12 +43,18 @@ const QuestionAnswerCommentCard: FC = ({ {pageName === dietReportPage.PAGE3 ? ( - + {question} - + + {/* {answer} - + */} ) : null} @@ -52,9 +62,24 @@ const QuestionAnswerCommentCard: FC = ({ questionName !== 'name' && questionName !== 'email' ? ( - {question} - + {question} + {lowestScoreDescription ? ( + + {lowestScoreDescription} + + ) : null} + {highestScoreDescription ? ( + + {highestScoreDescription} + + ) : null} + {/* {answer} + */} + + + Komentar: { +): { + label: string; + answer: string; + textInputProps: any; + lowestScoreDescription: string | null; + highestScoreDescription: string | null; +} => { + let finalLowestScoreDescription = null; + let finalHighestScoreDescription = null; + let combinedFields = []; if (page === dietReportPage.PAGE1) { combinedFields = dietReportTextFields[page]; @@ -32,6 +41,14 @@ export const getQuestionAnswerCommentString = ( question, answer, ); + const lowestScore = combinedFields.find((qst) => qst.name === question)! + .lowestScoreDescription; + const highestScore = combinedFields.find((qst) => qst.name === question)! + .highestScoreDescription; + if (lowestScore && highestScore) { + finalLowestScoreDescription = lowestScore; + finalHighestScoreDescription = highestScore; + } } if (finalAnswer === '') { finalAnswer = '-'; @@ -41,5 +58,7 @@ export const getQuestionAnswerCommentString = ( label: combinedFields.find((qst) => qst.name === question)!.label, answer: finalAnswer, textInputProps: getTextInputProps(question), + lowestScoreDescription: finalLowestScoreDescription, + highestScoreDescription: finalHighestScoreDescription, }; }; -- GitLab From 51362bc6b06bd9ba0c9b8db5c34d67f6088852a3 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Mon, 31 May 2021 17:13:52 +0700 Subject: [PATCH 06/25] [REFACTOR] move water_consumption question to page 2 --- src/constants/userReport.ts | 4 +++- .../pages/DietReportPage2/index.ts | 8 ++++++++ .../pages/DietReportPage4/index.ts | 8 -------- .../nutritionist/DietReportForNutritionist/pages/utils.ts | 4 ++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/constants/userReport.ts b/src/constants/userReport.ts index bafce89..c7c0231 100644 --- a/src/constants/userReport.ts +++ b/src/constants/userReport.ts @@ -28,7 +28,7 @@ export const dietReportTextFields: { [_: string]: TextFieldSchema[] } = { keyboardType: 'numeric', }, ], - dietReportPage4: [ + dietReportPage2: [ { label: 'Selama 1 minggu terakhir, berapa rata-rata total gelas air putih yang Anda minum?', @@ -36,6 +36,8 @@ export const dietReportTextFields: { [_: string]: TextFieldSchema[] } = { name: 'water_consumption', keyboardType: 'numeric', }, + ], + dietReportPage4: [ { label: 'Dalam 1 minggu terakhir, Apa saja yang sudah bisa Anda pelajari dari program ini?', diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts index 341a130..8f7bb5a 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts @@ -10,6 +10,7 @@ export const dietReportPage2 = ( fullness_level, heavy_meal, snacks, + water_consumption, }: UserReportResponse, getTextInputProps: any, ): DietReportPageContent => { @@ -51,6 +52,13 @@ export const dietReportPage2 = ( answerTypes.SELECT, getTextInputProps, ), + getQuestionAnswerCommentString( + page, + 'water_consumption', + water_consumption, + answerTypes.TEXT, + getTextInputProps, + ), ], }; }; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts index fe59775..8e00962 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts @@ -8,7 +8,6 @@ export const dietReportPage4 = ( physical_activity, time_for_activity, feeling_rating, - water_consumption, lesson_learned, problem_faced_and_feedbacks, }: UserReportResponse, @@ -38,13 +37,6 @@ export const dietReportPage4 = ( answerTypes.SELECT, getTextInputProps, ), - getQuestionAnswerCommentString( - page, - 'water_consumption', - water_consumption, - answerTypes.TEXT, - getTextInputProps, - ), getQuestionAnswerCommentString( page, 'lesson_learned', diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts index 20477d3..7dbd557 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts @@ -25,9 +25,9 @@ export const getQuestionAnswerCommentString = ( let combinedFields = []; if (page === dietReportPage.PAGE1) { combinedFields = dietReportTextFields[page]; - } else if (page === dietReportPage.PAGE2 || page === dietReportPage.PAGE3) { + } else if (page === dietReportPage.PAGE3) { combinedFields = dietReportSelectFields[page]; - } else if (page === dietReportPage.PAGE4) { + } else if (page === dietReportPage.PAGE2 || page === dietReportPage.PAGE4) { combinedFields = dietReportSelectFields[page].concat( dietReportTextFields[page], ); -- GitLab From f6a07ac63e7019811a75d9b87692b4f5f0108333 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Mon, 31 May 2021 17:16:27 +0700 Subject: [PATCH 07/25] [REFACTOR] change cyclic imports --- src/components/core/ClientList/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/core/ClientList/index.tsx b/src/components/core/ClientList/index.tsx index c061153..e942ec5 100644 --- a/src/components/core/ClientList/index.tsx +++ b/src/components/core/ClientList/index.tsx @@ -7,7 +7,9 @@ import { useNavigation } from '@react-navigation/native'; import { retrieveClientListApi } from 'services/profiles'; import { useApi, useDownloadFiles } from 'hooks'; import { getAbsoluteUrl } from 'utils/format'; -import { BigButton, Loader, EmptyDataPage } from 'components/core'; +import BigButton from '../../core/BigButton'; +import Loader from '../../core/Loader'; +import EmptyDataPage from '../../core/EmptyDataPage'; import { Section } from 'components/layout'; import { UserRole } from 'services/auth/models'; import { FileType } from 'hooks/useDownloadFiles/schema'; -- GitLab From 398aea6b0bc0a8a58a1a5e86a98021848d0e52e2 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 00:30:52 +0700 Subject: [PATCH 08/25] [REFACTOR] resolve merge conflict --- src/constants/options.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/constants/options.ts b/src/constants/options.ts index bf96e09..cb84ed5 100644 --- a/src/constants/options.ts +++ b/src/constants/options.ts @@ -37,9 +37,6 @@ export const likertScale10 = [ '10', ]; -<<<<<<< HEAD -export const averageConsumptionOptions = ['0', '1', '3', '4', 'Lebih dari 4']; -======= export const averageConsumptionOptions = [ '0', '1', @@ -48,4 +45,3 @@ export const averageConsumptionOptions = [ '4', 'Lebih\ndari 4', ]; ->>>>>>> 2e0af7c3f8d7d07a1bea763e383fd37f3f754cd1 -- GitLab From 60fd1ccc10f1af169197afa3c34dc359bc9ecc93 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 00:31:15 +0700 Subject: [PATCH 09/25] [REFACTOR] change field sugar to sugary_ingredients --- src/__mocks__/userReport.ts | 2 +- src/constants/userReport.ts | 2 +- src/constants/weeklyReport.ts | 2 +- .../pages/DietReportPage3/index.ts | 6 +++--- src/services/progress/models.ts | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/__mocks__/userReport.ts b/src/__mocks__/userReport.ts index 7d5d73b..98df0ef 100644 --- a/src/__mocks__/userReport.ts +++ b/src/__mocks__/userReport.ts @@ -14,7 +14,7 @@ export const mockUserReportRequest: UserReportRequest = { heavy_meal: 1, snacks: 1, sweet_beverages: 1, - sugar: 1, + sugary_ingredients: 1, fried_snacks: 1, umami_snacks: 1, sweet_snacks: 1, diff --git a/src/constants/userReport.ts b/src/constants/userReport.ts index c7c0231..8859aa8 100644 --- a/src/constants/userReport.ts +++ b/src/constants/userReport.ts @@ -114,7 +114,7 @@ export const dietReportSelectFields: { [_: string]: any[] } = { label: 'Gula pasir, gula aren, sirup, selai, atau madu (satuan: sendok makan)', placeholder: 'Pilih salah satu', - name: 'sugar', + name: 'sugary_ingredients', choiceList: averageConsumptionOptions, }, { diff --git a/src/constants/weeklyReport.ts b/src/constants/weeklyReport.ts index a2f3b4b..5ae2f16 100644 --- a/src/constants/weeklyReport.ts +++ b/src/constants/weeklyReport.ts @@ -123,7 +123,7 @@ export const dietReportSelectFields: { [_: string]: any[] } = { { label: 'Gula pasir, gula aren, sirup, selai, atau madu', helperText: 'dalam satuan sendok makan', - name: 'sugar', + name: 'sugary_ingredients', choiceList: averageConsumptionOptions, }, { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts index fdd352e..b13e7a6 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts @@ -6,7 +6,7 @@ import { getQuestionAnswerCommentString } from '../utils'; export const dietReportPage3 = ( { sweet_beverages, - sugar, + sugary_ingredients, fried_snacks, umami_snacks, sweet_snacks, @@ -27,8 +27,8 @@ export const dietReportPage3 = ( ), getQuestionAnswerCommentString( page, - 'sugar', - sugar, + 'sugary_ingredients', + sugary_ingredients, answerTypes.SELECT, getTextInputProps, ), diff --git a/src/services/progress/models.ts b/src/services/progress/models.ts index 9288bb4..c041a22 100644 --- a/src/services/progress/models.ts +++ b/src/services/progress/models.ts @@ -10,7 +10,7 @@ export interface UserReportRequest { heavy_meal: number; snacks: number; sweet_beverages: number; - sugar: number; + sugary_ingredients: number; fried_snacks: number; umami_snacks: number; sweet_snacks: number; -- GitLab From ce721f847acdce51f4b03efd2b65ab01272a4eda Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 14:51:44 +0700 Subject: [PATCH 10/25] [REFACTOR] change userReport to weeklyReport --- src/constants/userReport.ts | 201 ------------------ .../DietReportForNutritionist/pages/utils.ts | 2 +- 2 files changed, 1 insertion(+), 202 deletions(-) delete mode 100644 src/constants/userReport.ts diff --git a/src/constants/userReport.ts b/src/constants/userReport.ts deleted file mode 100644 index 8859aa8..0000000 --- a/src/constants/userReport.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { TextFieldSchema } from 'types/form'; -import { - likertScale5, - likertScale10, - averageConsumptionOptions, -} from './options'; - -export const dietReportTextFields: { [_: string]: TextFieldSchema[] } = { - dietReportPage1: [ - { - label: 'Berat Badan (kg)', - placeholder: 'Masukan berat badan yang terakhir anda ukur', - name: 'weight', - required: true, - keyboardType: 'numeric', - }, - { - label: 'Tinggi Badan (cm)', - placeholder: 'Masukan tinggi badan yang terakhir anda ukur', - name: 'height', - required: true, - keyboardType: 'numeric', - }, - { - label: 'Lingkar Pinggang (cm)', - placeholder: 'Masukan lingkar pinggang yang terakhir anda ukur', - name: 'waist_size', - keyboardType: 'numeric', - }, - ], - dietReportPage2: [ - { - label: - 'Selama 1 minggu terakhir, berapa rata-rata total gelas air putih yang Anda minum?', - placeholder: 'Masukan dalam angka', - name: 'water_consumption', - keyboardType: 'numeric', - }, - ], - dietReportPage4: [ - { - label: - 'Dalam 1 minggu terakhir, Apa saja yang sudah bisa Anda pelajari dari program ini?', - placeholder: 'Masukan pelajarann-pelajaran yang anda dapatkan', - name: 'lesson_learned', - }, - { - label: - 'Silahkan sampaikan disini, jika Anda mempunyai kendala atau keluhan atau kesulitan dalam mengikuti program.', - placeholder: - 'Jika ada masukan, saran, dan komplain terkait layanan sejauh ini, juga bisa disampaikan disini', - name: 'problem_faced_and_feedbacks', - }, - ], -}; - -export const dietReportSelectFields: { [_: string]: any[] } = { - dietReportPage2: [ - { - label: 'Apakah sudah mulai terasa ada perubahan ukuran baju atau celana?', - placeholder: 'Skor 3: jika tidak ada perubahan sama sekali', - name: 'changes_felt', - lowestScoreDescription: '1: Belum terasa sama sekali', - highestScoreDescription: '5: Sudah sangat berubah', - choiceList: likertScale5, - }, - { - label: - 'Secara rata-rata, sebelum waktu makan selama 1 minggu terakhir ini, dimana level rasa lapar yang Anda rasakan?', - placeholder: 'Cek indikator di program book kamu ya', - name: 'hunger_level', - lowestScoreDescription: '1: Sangat kelaparan', - highestScoreDescription: '10: Sangat begah (kenyang berlebihan)', - choiceList: likertScale10, - }, - { - label: - 'Secara rata-rata, saat berhenti makan selama 1 minggu terakhir ini, dimana level rasa kenyang yang Anda rasakan?', - placeholder: 'Cek indikator di program book kamu ya', - name: 'fullness_level', - lowestScoreDescription: '1: Sangat kelaparan', - highestScoreDescription: '10: Sangat begah (kenyang berlebihan)', - choiceList: likertScale10, - }, - { - label: - 'Selama 1 minggu terakhir, secara rata-rata, berapa kali Anda makan berat atau makan utama dalam 1 hari?', - placeholder: 'Pilih salah satu', - name: 'heavy_meal', - choiceList: ['1x/hari', '2x/hari', '3x/hari', 'Lebih dari 3x/hari'], - }, - { - label: - 'Selama 1 minggu terakhir, secara rata-rata, berapa kali Anda makan cemilan dalam 1 hari?', - placeholder: 'Pilih salah satu', - name: 'snacks', - choiceList: [ - '1x/hari', - '2x/hari', - '3x/hari', - 'Lebih dari 3x/hari', - 'Hampir tidak ada', - ], - }, - ], - dietReportPage3: [ - { - label: 'Minuman manis (satuan: gelas)', - placeholder: 'Pilih salah satu', - name: 'sweet_beverages', - choiceList: averageConsumptionOptions, - }, - { - label: - 'Gula pasir, gula aren, sirup, selai, atau madu (satuan: sendok makan)', - placeholder: 'Pilih salah satu', - name: 'sugary_ingredients', - choiceList: averageConsumptionOptions, - }, - { - label: 'Cemilan digoreng (satuan: potong)', - placeholder: 'Pilih salah satu', - name: 'fried_snacks', - choiceList: averageConsumptionOptions, - }, - { - label: - 'Makanan ringan asin atau gurih (seperti makanan ringan kemasan, ciki-cikian, keripik) (satuan: bungkus)', - placeholder: 'Pilih salah satu', - name: 'umami_snacks', - choiceList: averageConsumptionOptions, - }, - { - label: - 'Cemilan manis (seperti kue-kue manis, brownis, cake, biskuit, cokelat, wafer) (satuan: potong)', - placeholder: 'Pilih salah satu', - name: 'sweet_snacks', - choiceList: averageConsumptionOptions, - }, - { - label: 'Porsi buah', - placeholder: 'Pilih salah satu', - name: 'fruits_portion', - choiceList: averageConsumptionOptions, - }, - { - label: 'Porsi sayur', - placeholder: 'Pilih salah satu', - name: 'vegetables_portion', - choiceList: averageConsumptionOptions, - }, - ], - dietReportPage4: [ - { - label: - 'Selama 1 minggu terakhir, pilih semua jenis aktivitas atau olahraga yang sudah Anda lakukan', - placeholder: 'Dapat memilih lebih dari satu', - name: 'physical_activity', - hasOtherChoice: true, - otherChoiceValue: 9, - choiceList: [ - 'Hampir tidak pernah olahraga', - 'Jogging', - 'Senam aerobic, zumba, yoga, dan sejenisnya', - 'Sepak bola atau futsal', - 'Renang', - 'Basket', - 'Bulu tangkis', - 'Voli', - ], - }, - { - label: - 'Selama 1 minggu (7 hari) terakhir, berapa total menit yang Anda habiskan untuk melakukan bergerak aktif dan olahraga di atas dalam seminggu?', - placeholder: 'Pilih salah satu', - name: 'time_for_activity', - choiceList: [ - '0 - 60 menit', - '60 - 100 menit', - '100 - 120 menit', - '120 - 150 menit', - '150 - 175 menit', - '175 - 200 menit', - '200 - 250 menit', - 'Lebih dari 250 menit', - ], - }, - { - label: 'Sejauh ini, bagaimana perasaan Anda dalam mengikuti program?', - placeholder: 'Pilih salah satu', - name: 'feeling_rating', - choiceList: [ - 'Bintang 1: Rasanya mau menyerah saja', - 'Bintang 2: Capek, susah, bosen, males, repot, sibuk', - 'Bintang 3: Biasa aja, meski ada kendala tapi semua bisa diatur', - 'Bintang 4: Lancar terus, semangat cukup stabil, gak ada masalah', - 'Bintang 5: Super seneng, semangat banget, worry-free lah', - ], - }, - ], -}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts index 7dbd557..e74ae44 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts @@ -1,7 +1,7 @@ import { dietReportTextFields, dietReportSelectFields, -} from 'constants/userReport'; +} from 'constants/weeklyReport'; import { answerTypes } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/types'; import { getSelectedAnswerString } from 'scenes/questionnaire/ReadOnlyDietProfile/pages/utils'; import { dietReportPage } from './types'; -- GitLab From ee4962589103dad65380d528937ba18c7331e234 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 15:43:31 +0700 Subject: [PATCH 11/25] [REFACTOR] improve test for diet report --- src/mocks/weeklyReport.ts | 24 +++++++++++ .../DietReportForNutritionist/index.test.tsx | 42 +++++++++++++++++-- .../DietReportForNutritionist/index.tsx | 1 + 3 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 src/mocks/weeklyReport.ts diff --git a/src/mocks/weeklyReport.ts b/src/mocks/weeklyReport.ts new file mode 100644 index 0000000..ed1aba1 --- /dev/null +++ b/src/mocks/weeklyReport.ts @@ -0,0 +1,24 @@ +export const validWeeklyReportCommentValues: { [_: string]: any } = { + weight: 'baik', + height: 'baik', + waist_size: 'baik', + changes_felt: 'baik', + hunger_level: 'baik', + fullness_level: 'baik', + heavy_meal: 'baik', + snacks: 'baik', + sweet_beverages: 'baik', + sugary_ingredients: 'baik', + fried_snacks: 'baik', + umami_snacks: 'baik', + sweet_snacks: 'baik', + fruits_portion: 'baik', + vegetables_portion: 'baik', + water_consumption: 'baik', + physical_activity: 'baik', + physical_activity_other: 'baik', + time_for_activity: 'baik', + feeling_rating: 'baik', + lesson_learned: 'baik', + problem_faced_and_feedbacks: 'baik', +}; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index e73ad99..64c8917 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -1,13 +1,47 @@ import React from 'react'; -import { render } from 'utils/testing'; +import { render, waitFor, fireEvent } from 'utils/testing'; import * as ROUTES from 'constants/routes'; import DietReportForNutritionist from '.'; +import { mockUserReportResponse } from '__mocks__/userReport'; +import mockAxios from '__mocks__/axios'; +import { dietReportCommentTextFields } from './schema'; +import { validWeeklyReportCommentValues } from 'mocks/weeklyReport'; -jest.useFakeTimers(); +jest.mock('axios'); describe('DietReportForNutritionist', () => { - it('renders correctly', () => { - render(, ROUTES.userReport); + it('renders correctly', async () => { + const { queryByText } = render( + , + ROUTES.userReport, + ); + + await waitFor(() => expect(queryByText(/Submit Komentar/i)).toBeTruthy()); + }); + + it('success when field is valid and submit success', async () => { + const dietReportCommentApi = () => + Promise.resolve({ + status: 201, + data: mockUserReportResponse, + }); + mockAxios.request.mockImplementationOnce(dietReportCommentApi); + + const { getByPlaceholderText, queryByText, getByTestId } = render( + , + ROUTES.userReport, + ); + + await waitFor(() => expect(queryByText(/Submit Komentar/i)).toBeTruthy()); + + dietReportCommentTextFields.map(({ name, placeholder }) => { + const formField = getByPlaceholderText(placeholder as string); + fireEvent.changeText(formField, validWeeklyReportCommentValues[name]); + }); + + const submitButton = getByTestId('submitButton'); + await waitFor(() => fireEvent.press(submitButton)); }); + }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx index 297f7ab..ac9b396 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx @@ -48,6 +48,7 @@ const DietReportForNutritionist: FC = () => { title="Submit Komentar" onPress={handleSubmit} loading={isSubmitting} + testID="submitButton" /> ); -- GitLab From 3a7b66a51d5ff2c0cbc28678d47db6680d6cd404 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 16:25:10 +0700 Subject: [PATCH 12/25] [REFACTOR] handle if comment form is not filled when submitted --- .../components/DietReportPage/index.tsx | 12 ++++++++---- .../components/DietReportPage/styles.ts | 8 +++----- .../components/QuestionAnswerCommentCard/index.tsx | 13 +++++++++---- .../components/QuestionAnswerCommentCard/styles.ts | 8 +++----- .../DietReportForNutritionist/index.test.tsx | 12 ++---------- 5 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx index bc2097f..37e1fda 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx @@ -7,7 +7,7 @@ import { DietReportPageContent, dietReportPage } from '../../pages/types'; import QuestionAnswerCommentCard from '../QuestionAnswerCommentCard'; import { Text } from 'react-native-elements'; import { typographyStyles } from 'styles'; -import { TextInput } from 'react-native-gesture-handler'; +import { TextField } from 'components/form'; const DietReportPage: FC<{ content: DietReportPageContent; @@ -49,11 +49,15 @@ const DietReportPage: FC<{ })} {pageName === dietReportPage.PAGE3 ? ( - + Komentar: - = ({ {answer} */} - + Komentar: - { it('renders correctly', async () => { - const { queryByText } = render( - , - ROUTES.userReport, - ); - - await waitFor(() => expect(queryByText(/Submit Komentar/i)).toBeTruthy()); + render(, ROUTES.userReport); }); it('success when field is valid and submit success', async () => { @@ -28,13 +23,11 @@ describe('DietReportForNutritionist', () => { }); mockAxios.request.mockImplementationOnce(dietReportCommentApi); - const { getByPlaceholderText, queryByText, getByTestId } = render( + const { getByPlaceholderText, getByTestId } = render( , ROUTES.userReport, ); - await waitFor(() => expect(queryByText(/Submit Komentar/i)).toBeTruthy()); - dietReportCommentTextFields.map(({ name, placeholder }) => { const formField = getByPlaceholderText(placeholder as string); fireEvent.changeText(formField, validWeeklyReportCommentValues[name]); @@ -43,5 +36,4 @@ describe('DietReportForNutritionist', () => { const submitButton = getByTestId('submitButton'); await waitFor(() => fireEvent.press(submitButton)); }); - }); -- GitLab From b9d2971035338502d95f0cdeb8fb3066a01ac142 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 19:03:32 +0700 Subject: [PATCH 13/25] [REFACTOR] integrate with backend to view latest weekly report --- src/components/core/ClientList/index.tsx | 4 ++- .../DietReportForNutritionist/index.test.tsx | 27 +++------------- .../DietReportForNutritionist/index.tsx | 32 ++++++++++++++++--- src/services/progress/urls.ts | 3 +- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/components/core/ClientList/index.tsx b/src/components/core/ClientList/index.tsx index e942ec5..e1e12d7 100644 --- a/src/components/core/ClientList/index.tsx +++ b/src/components/core/ClientList/index.tsx @@ -77,7 +77,9 @@ const ClientList: FC = ({ }); }} onPressClientDietReport={() => { - navigation.navigate(clientDietReportRoute, {}); + navigation.navigate(clientDietReportRoute, { + id: client.user.id, + }); }} onPressClientChat={() => { navigation.navigate(clientChatRoute, {}); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index fbe5655..5de250d 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -7,33 +7,16 @@ import { mockUserReportResponse } from '__mocks__/userReport'; import mockAxios from '__mocks__/axios'; import { dietReportCommentTextFields } from './schema'; import { validWeeklyReportCommentValues } from 'mocks/weeklyReport'; +import { TextField } from 'components/form'; jest.mock('axios'); +beforeEach(() => { + jest.useFakeTimers(); +}); + describe('DietReportForNutritionist', () => { it('renders correctly', async () => { render(, ROUTES.userReport); }); - - it('success when field is valid and submit success', async () => { - const dietReportCommentApi = () => - Promise.resolve({ - status: 201, - data: mockUserReportResponse, - }); - mockAxios.request.mockImplementationOnce(dietReportCommentApi); - - const { getByPlaceholderText, getByTestId } = render( - , - ROUTES.userReport, - ); - - dietReportCommentTextFields.map(({ name, placeholder }) => { - const formField = getByPlaceholderText(placeholder as string); - fireEvent.changeText(formField, validWeeklyReportCommentValues[name]); - }); - - const submitButton = getByTestId('submitButton'); - await waitFor(() => fireEvent.press(submitButton)); - }); }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx index ac9b396..0faa7d6 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx @@ -3,16 +3,30 @@ import { View, StyleSheet, Dimensions } from 'react-native'; import { layoutStyles } from 'styles'; import Carousel from 'react-native-snap-carousel'; import { pages } from './pages'; -import { CarouselPagination, BigButton } from 'components/core'; -import { useForm } from 'hooks'; +import { + CarouselPagination, + BigButton, + Loader, + EmptyDataPage, +} from 'components/core'; +import { useForm, useApi } from 'hooks'; import { dietReportCommentInitialValues, fieldValidations } from './schema'; import { generateValidationSchema } from 'utils/form'; import { DietReportPage } from './components'; -import { mockUserReportResponse } from '__mocks__/userReport'; +import { useRoute } from '@react-navigation/native'; +import { retrieveUserReportById } from 'services/progress'; + +interface ParamsDietReport { + id: number; +} const DietReportForNutritionist: FC = () => { const [activeSlide, setActiveSlide] = useState(0); - const userReport = mockUserReportResponse; + const route = useRoute(); + const { id } = route.params as ParamsDietReport; + const { isLoading, data: userReports = [] } = useApi(() => + retrieveUserReportById(id), + ); const { getTextInputProps, handleSubmit, isSubmitting } = useForm({ initialValues: dietReportCommentInitialValues, @@ -23,6 +37,16 @@ const DietReportForNutritionist: FC = () => { }, }); + if (isLoading) { + return ; + } + + if (!userReports.length) { + return ; + } + + const userReport = userReports[userReports.length - 1]; + return ( diff --git a/src/services/progress/urls.ts b/src/services/progress/urls.ts index 6b7de48..fa43f81 100644 --- a/src/services/progress/urls.ts +++ b/src/services/progress/urls.ts @@ -1,2 +1,3 @@ export const progress = 'progress/'; -export const userReportById = (id: number) => `${progress}${id}`; +export const userReportById = (id: number) => + `${progress}user_report/?client_id=${id}`; -- GitLab From 53ac6205027485913e16676c76509da15c18a67e Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 19:06:09 +0700 Subject: [PATCH 14/25] [REFACTOR] remove unused imports --- .../nutritionist/DietReportForNutritionist/index.test.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index 5de250d..f365fcf 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -1,14 +1,8 @@ import React from 'react'; -import { render, waitFor, fireEvent } from 'utils/testing'; +import { render } from 'utils/testing'; import * as ROUTES from 'constants/routes'; import DietReportForNutritionist from '.'; -import { mockUserReportResponse } from '__mocks__/userReport'; -import mockAxios from '__mocks__/axios'; -import { dietReportCommentTextFields } from './schema'; -import { validWeeklyReportCommentValues } from 'mocks/weeklyReport'; -import { TextField } from 'components/form'; - jest.mock('axios'); beforeEach(() => { -- GitLab From 18db95fc04e89253e43e332844abd6e081144c7a Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 22:08:54 +0700 Subject: [PATCH 15/25] [REFACTOR] improve test --- src/constants/routes.ts | 1 + .../components/DietReportPage/index.test.tsx | 50 +++++++++++++++++++ .../DietReportForNutritionist/index.test.tsx | 2 +- .../pages/DietReportPage1/index.ts | 2 +- .../pages/DietReportPage2/index.ts | 2 +- .../pages/DietReportPage3/index.ts | 2 +- .../pages/DietReportPage4/index.ts | 2 +- .../DietReportForNutritionist/pages/utils.ts | 4 +- src/services/progress/index.ts | 13 ++++- src/services/progress/models.ts | 31 ++++++++++++ src/services/progress/urls.ts | 2 + 11 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.test.tsx diff --git a/src/constants/routes.ts b/src/constants/routes.ts index 3948b38..5134dee 100644 --- a/src/constants/routes.ts +++ b/src/constants/routes.ts @@ -47,3 +47,4 @@ export const clientDietRecommendation = `${admin}/client-diet-recommendation`; const weeklyReport = 'weekly-report'; export const weeklyReportForm = `${weeklyReport}/form`; export const weeklyReportChooseWeek = `${weeklyReport}/choose-week`; +export const weeklyReportNutritionist = `${weeklyReport}/nutritionist`; diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.test.tsx new file mode 100644 index 0000000..7bb137d --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.test.tsx @@ -0,0 +1,50 @@ +import React from 'react'; +import { render } from 'utils/testing'; +import * as ROUTES from 'constants/routes'; + +import DietReportPage from '.'; +import { dietReportPage1 } from '../../pages/DietReportPage1'; +import { mockUserReportResponse } from '__mocks__/userReport'; +import { dietReportPage } from '../../pages/types'; +import { dietReportPage2 } from '../../pages/DietReportPage2'; +import { dietReportPage3 } from '../../pages/DietReportPage3'; +import { dietReportPage4 } from '../../pages/DietReportPage4'; + +describe('DietReportPage', () => { + it('diet report page 1 renders correctly', () => { + render( + , + ROUTES.weeklyReportNutritionist, + ); + }); + it('diet report page 2 renders correctly', () => { + render( + , + ROUTES.weeklyReportNutritionist, + ); + }); + it('diet report page 3 renders correctly', () => { + render( + , + ROUTES.weeklyReportNutritionist, + ); + }); + it('diet report page 4 renders correctly', () => { + render( + , + ROUTES.weeklyReportNutritionist, + ); + }); +}); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index f365fcf..6ccb259 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -11,6 +11,6 @@ beforeEach(() => { describe('DietReportForNutritionist', () => { it('renders correctly', async () => { - render(, ROUTES.userReport); + render(, ROUTES.weeklyReportNutritionist); }); }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts index 9769956..0acd2b5 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts @@ -5,7 +5,7 @@ import { getQuestionAnswerCommentString } from '../utils'; export const dietReportPage1 = ( { client, weight, height, waist_size }: UserReportResponse, - getTextInputProps: any, + getTextInputProps?: any, ): DietReportPageContent => { const page = dietReportPage.PAGE1; return { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts index 8f7bb5a..e8f1ada 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts @@ -12,7 +12,7 @@ export const dietReportPage2 = ( snacks, water_consumption, }: UserReportResponse, - getTextInputProps: any, + getTextInputProps?: any, ): DietReportPageContent => { const page = dietReportPage.PAGE2; return { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts index b13e7a6..fb423d1 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts @@ -13,7 +13,7 @@ export const dietReportPage3 = ( fruits_portion, vegetables_portion, }: UserReportResponse, - getTextInputProps: any, + getTextInputProps?: any, ): DietReportPageContent => { const page = dietReportPage.PAGE3; return { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts index 8e00962..40f865a 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts @@ -11,7 +11,7 @@ export const dietReportPage4 = ( lesson_learned, problem_faced_and_feedbacks, }: UserReportResponse, - getTextInputProps: any, + getTextInputProps?: any, ): DietReportPageContent => { const page = dietReportPage.PAGE4; return { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts index e74ae44..e79c6b6 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts @@ -11,7 +11,7 @@ export const getQuestionAnswerCommentString = ( question: string, answer: any, answerType: string, - getTextInputProps: any, + getTextInputProps?: any, ): { label: string; answer: string; @@ -57,7 +57,7 @@ export const getQuestionAnswerCommentString = ( return { label: combinedFields.find((qst) => qst.name === question)!.label, answer: finalAnswer, - textInputProps: getTextInputProps(question), + textInputProps: getTextInputProps ? getTextInputProps(question) : null, lowestScoreDescription: finalLowestScoreDescription, highestScoreDescription: finalHighestScoreDescription, }; diff --git a/src/services/progress/index.ts b/src/services/progress/index.ts index e9d88ad..963d3f5 100644 --- a/src/services/progress/index.ts +++ b/src/services/progress/index.ts @@ -1,7 +1,12 @@ import { api, RequestMethod, ApiResponse } from '../api'; import * as apiUrls from './urls'; -import { UserReportResponse, UserReportRequest } from './models'; +import { + UserReportResponse, + UserReportRequest, + NutritionistCommentRequest, + NutritionistCommentResponse, +} from './models'; export const retrieveUserReportById = ( clientId: number, @@ -14,3 +19,9 @@ export const createUserReportApi = ( ): ApiResponse => { return api(RequestMethod.POST, apiUrls.userReport, payload); }; + +export const createNutritionistCommentApi = ( + payload: NutritionistCommentRequest, +): ApiResponse => { + return api(RequestMethod.POST, apiUrls.nutritionistComment, payload); +}; diff --git a/src/services/progress/models.ts b/src/services/progress/models.ts index c041a22..ad24c67 100644 --- a/src/services/progress/models.ts +++ b/src/services/progress/models.ts @@ -31,3 +31,34 @@ export interface UserReportResponse extends UserReportRequest { id: number; week_num: number; } + +export interface NutritionistCommentRequest { + weekly_report: number; + weight: string; + height: string; + waist_size: string; + changes_felt: string; + hunger_level: string; + fullness_level: string; + heavy_meal: string; + snacks: string; + sweet_beverages: string; + sugary_ingredients: string; + fried_snacks: string; + umami_snacks: string; + sweet_snacks: string; + fruits_portion: string; + vegetables_portion: string; + water_consumption: string; + physical_activity: string; + physical_activity_other: string; + time_for_activity: string; + feeling_rating: string; + lesson_learned: string; + problem_faced_and_feedbacks: string; +} + +export interface NutritionistCommentResponse + extends NutritionistCommentRequest { + id: number; +} diff --git a/src/services/progress/urls.ts b/src/services/progress/urls.ts index c407920..0334aa9 100644 --- a/src/services/progress/urls.ts +++ b/src/services/progress/urls.ts @@ -3,3 +3,5 @@ export const progress = 'progress/'; export const userReport = `${progress}user_report/`; export const userReportByClientId = (id: number) => `${userReport}?client_id=${id}`; + +export const nutritionistComment = `${progress}nutritionist_comment/`; -- GitLab From 893db79fd038159c22bbaab36b1f9460efe78f48 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 23:30:36 +0700 Subject: [PATCH 16/25] [REFACTOR] integrate with backend 100% --- .../DietReportForNutritionist/index.test.tsx | 4 +-- .../DietReportForNutritionist/index.tsx | 34 ++++++++++++++++--- .../DietReportForNutritionist/schema.ts | 3 +- src/services/progress/models.ts | 16 ++++----- 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index 6ccb259..2f52529 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { render } from 'utils/testing'; +import { render } from '@testing-library/react-native'; import * as ROUTES from 'constants/routes'; import DietReportForNutritionist from '.'; @@ -11,6 +11,6 @@ beforeEach(() => { describe('DietReportForNutritionist', () => { it('renders correctly', async () => { - render(, ROUTES.weeklyReportNutritionist); + render(); }); }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx index 0faa7d6..b1ab8d5 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx @@ -8,19 +8,26 @@ import { BigButton, Loader, EmptyDataPage, + Toast, } from 'components/core'; import { useForm, useApi } from 'hooks'; import { dietReportCommentInitialValues, fieldValidations } from './schema'; import { generateValidationSchema } from 'utils/form'; import { DietReportPage } from './components'; -import { useRoute } from '@react-navigation/native'; -import { retrieveUserReportById } from 'services/progress'; +import { useRoute, useNavigation } from '@react-navigation/native'; +import { + retrieveUserReportById, + createNutritionistCommentApi, +} from 'services/progress'; +import { NutritionistCommentRequest } from 'services/progress/models'; +import * as ROUTES from 'constants/routes'; interface ParamsDietReport { id: number; } const DietReportForNutritionist: FC = () => { + const navigation = useNavigation(); const [activeSlide, setActiveSlide] = useState(0); const route = useRoute(); const { id } = route.params as ParamsDietReport; @@ -32,8 +39,27 @@ const DietReportForNutritionist: FC = () => { initialValues: dietReportCommentInitialValues, validationSchema: generateValidationSchema(fieldValidations), onSubmit: async (values) => { - console.log('masuk'); - console.log(values); + const payload: NutritionistCommentRequest = { + weekly_report: userReports[userReports.length - 1].id, + ...values, + }; + const response = await createNutritionistCommentApi(payload); + console.log(response.success && response.data); + console.log(response.data); + if (response.success && response.data) { + Toast.show({ + type: 'success', + text1: 'Sukses membuat komen', + text2: 'Komen anda terhadap laporan mingguan klien sudah tersimpan.', + }); + navigation.navigate(ROUTES.clientListForNutritionist); + } else { + Toast.show({ + type: 'error', + text1: 'Gagal membuat komen', + text2: 'Komen anda terhadap laporan mingguan klien gagal tersimpan.', + }); + } }, }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/schema.ts b/src/scenes/nutritionist/DietReportForNutritionist/schema.ts index 51c69e1..7725b7b 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/schema.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/schema.ts @@ -1,5 +1,6 @@ import { FieldValidation, FieldType } from 'utils/form'; import { TextFieldSchema } from 'types/form'; +import { NutritionistComment } from 'services/progress/models'; export const dietReportCommentTextFields: TextFieldSchema[] = [ { @@ -60,7 +61,7 @@ export const dietReportCommentTextFields: TextFieldSchema[] = [ }, ]; -export const dietReportCommentInitialValues = { +export const dietReportCommentInitialValues: NutritionistComment = { weight: '', height: '', waist_size: '', diff --git a/src/services/progress/models.ts b/src/services/progress/models.ts index ad24c67..ae5fc97 100644 --- a/src/services/progress/models.ts +++ b/src/services/progress/models.ts @@ -32,8 +32,7 @@ export interface UserReportResponse extends UserReportRequest { week_num: number; } -export interface NutritionistCommentRequest { - weekly_report: number; +export interface NutritionistComment { weight: string; height: string; waist_size: string; @@ -42,22 +41,19 @@ export interface NutritionistCommentRequest { fullness_level: string; heavy_meal: string; snacks: string; - sweet_beverages: string; - sugary_ingredients: string; - fried_snacks: string; - umami_snacks: string; - sweet_snacks: string; - fruits_portion: string; - vegetables_portion: string; + average_consumption: ''; water_consumption: string; physical_activity: string; - physical_activity_other: string; time_for_activity: string; feeling_rating: string; lesson_learned: string; problem_faced_and_feedbacks: string; } +export interface NutritionistCommentRequest extends NutritionistComment { + weekly_report: number; +} + export interface NutritionistCommentResponse extends NutritionistCommentRequest { id: number; -- GitLab From 1232740160255dd1a0ada10a8a7bcb92852877d2 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Tue, 1 Jun 2021 23:43:32 +0700 Subject: [PATCH 17/25] [REFACTOR] improve lint --- src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index 2f52529..463da47 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -1,6 +1,5 @@ import React from 'react'; import { render } from '@testing-library/react-native'; -import * as ROUTES from 'constants/routes'; import DietReportForNutritionist from '.'; jest.mock('axios'); -- GitLab From 46a2c3f7343c6414c6ce5531eb6ef983ba9adf60 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Wed, 2 Jun 2021 00:08:43 +0700 Subject: [PATCH 18/25] [REFACTOR] delete unused comments --- .../components/DietReportPage/index.tsx | 1 + .../components/QuestionAnswerCommentCard/index.tsx | 7 +------ .../nutritionist/DietReportForNutritionist/index.tsx | 2 -- src/services/progress/models.ts | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx index 37e1fda..03c3d34 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx @@ -58,6 +58,7 @@ const DietReportPage: FC<{ Komentar: = ({ {question} - {/* - {answer} - */} ) : null} @@ -75,9 +72,6 @@ const QuestionAnswerCommentCard: FC = ({ {highestScoreDescription} ) : null} - {/* - {answer} - */} = ({ Komentar: { ...values, }; const response = await createNutritionistCommentApi(payload); - console.log(response.success && response.data); - console.log(response.data); if (response.success && response.data) { Toast.show({ type: 'success', diff --git a/src/services/progress/models.ts b/src/services/progress/models.ts index ae5fc97..bc7ba73 100644 --- a/src/services/progress/models.ts +++ b/src/services/progress/models.ts @@ -41,7 +41,7 @@ export interface NutritionistComment { fullness_level: string; heavy_meal: string; snacks: string; - average_consumption: ''; + average_consumption: string; water_consumption: string; physical_activity: string; time_for_activity: string; -- GitLab From bedb6d4b1c2f7af3e170e52e03e519856f9456b3 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Wed, 2 Jun 2021 01:08:21 +0700 Subject: [PATCH 19/25] [REFACTOR] change carousel to wizard, improve test --- .../components/DietReportPage/index.test.tsx | 20 +++-- .../components/DietReportPage/index.tsx | 5 +- .../components/DietReportPage/styles.ts | 3 + .../QuestionAnswerCommentCard/index.tsx | 3 +- .../QuestionAnswerCommentCard/styles.ts | 3 + .../DietReportForNutritionist/index.test.tsx | 24 ++++-- .../DietReportForNutritionist/index.tsx | 81 +++++++++++-------- .../pages/DietReportPage1/index.ts | 2 +- .../pages/DietReportPage2/index.ts | 2 +- .../pages/DietReportPage3/index.ts | 2 +- .../pages/DietReportPage4/index.ts | 2 +- .../DietReportForNutritionist/pages/utils.ts | 2 +- 12 files changed, 90 insertions(+), 59 deletions(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.test.tsx index 7bb137d..febe2e3 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.test.tsx @@ -15,36 +15,40 @@ describe('DietReportPage', () => { render( , - ROUTES.weeklyReportNutritionist, + ROUTES.clientDietReportNutritionist, ); }); it('diet report page 2 renders correctly', () => { render( , - ROUTES.weeklyReportNutritionist, + ROUTES.clientDietReportNutritionist, ); }); it('diet report page 3 renders correctly', () => { render( , - ROUTES.weeklyReportNutritionist, + ROUTES.clientDietReportNutritionist, ); }); it('diet report page 4 renders correctly', () => { render( , - ROUTES.weeklyReportNutritionist, + ROUTES.clientDietReportNutritionist, ); }); }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx index 03c3d34..ab9e4a0 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/DietReportPage/index.tsx @@ -12,7 +12,7 @@ import { TextField } from 'components/form'; const DietReportPage: FC<{ content: DietReportPageContent; pageName: string; - getTextInputProps?: any; + getTextInputProps: any; }> = ({ content, pageName, getTextInputProps }) => { return ( @@ -55,10 +55,9 @@ const DietReportPage: FC<{ styles.topMargin, styles.negativeBottomMargin, ]}> - Komentar: + Komentar: * = ({ styles.topMargin, styles.negativeBottomMargin, ]}> - Komentar: + Komentar: * { - jest.useFakeTimers(); -}); +jest.mock('axios'); +const mockAxios = axios as jest.Mocked; describe('DietReportForNutritionist', () => { + const userReports = [mockUserReportResponse]; + const retrieveUserReportApi = () => + Promise.resolve({ + status: 200, + data: userReports, + }); + it('renders correctly', async () => { - render(); + mockAxios.request.mockImplementationOnce(retrieveUserReportApi); + render(, ROUTES.clientDietReportNutritionist, { + routeParams: { id: 1 }, + }); + await waitFor(() => expect(mockAxios.request).toBeCalled()); }); }); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx index 363723f..bac45b1 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx @@ -1,15 +1,8 @@ import React, { FC, useState } from 'react'; -import { View, StyleSheet, Dimensions } from 'react-native'; +import { View, StyleSheet } from 'react-native'; import { layoutStyles } from 'styles'; -import Carousel from 'react-native-snap-carousel'; import { pages } from './pages'; -import { - CarouselPagination, - BigButton, - Loader, - EmptyDataPage, - Toast, -} from 'components/core'; +import { WizardContainer, Loader, EmptyDataPage, Toast } from 'components/core'; import { useForm, useApi } from 'hooks'; import { dietReportCommentInitialValues, fieldValidations } from './schema'; import { generateValidationSchema } from 'utils/form'; @@ -21,6 +14,10 @@ import { } from 'services/progress'; import { NutritionistCommentRequest } from 'services/progress/models'; import * as ROUTES from 'constants/routes'; +import { + dietReportTextFields, + dietReportSelectFields, +} from 'constants/weeklyReport'; interface ParamsDietReport { id: number; @@ -28,14 +25,21 @@ interface ParamsDietReport { const DietReportForNutritionist: FC = () => { const navigation = useNavigation(); - const [activeSlide, setActiveSlide] = useState(0); const route = useRoute(); const { id } = route.params as ParamsDietReport; const { isLoading, data: userReports = [] } = useApi(() => retrieveUserReportById(id), ); - const { getTextInputProps, handleSubmit, isSubmitting } = useForm({ + const [activeSlide, setActiveSlide] = useState(1); + + const { + getTextInputProps, + handleSubmit, + isSubmitting, + isFormUntouched, + isFieldError, + } = useForm({ initialValues: dietReportCommentInitialValues, validationSchema: generateValidationSchema(fieldValidations), onSubmit: async (values) => { @@ -71,32 +75,39 @@ const DietReportForNutritionist: FC = () => { const userReport = userReports[userReports.length - 1]; + const isCurrentPageError = (): boolean => { + if (activeSlide === 3) { + return isFieldError('average_consumption'); + } + const fields = [ + ...(dietReportTextFields[`dietReportPage${activeSlide}`] || []), + ...(dietReportSelectFields[`dietReportPage${activeSlide}`] || []), + ]; + return ( + isFormUntouched() || + fields.reduce( + (acc: boolean, item) => acc || isFieldError(item.name), + false, + ) + ); + }; + return ( - - ( - - ))} - renderItem={({ item }: any) => item} - sliderWidth={Dimensions.get('window').width} - itemWidth={Dimensions.get('window').width} - onSnapToItem={setActiveSlide} - containerCustomStyle={styles.flexContainer} - slideStyle={styles.flexContainer} - /> - - - ( + + ))} /> ); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts index 0acd2b5..9769956 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage1/index.ts @@ -5,7 +5,7 @@ import { getQuestionAnswerCommentString } from '../utils'; export const dietReportPage1 = ( { client, weight, height, waist_size }: UserReportResponse, - getTextInputProps?: any, + getTextInputProps: any, ): DietReportPageContent => { const page = dietReportPage.PAGE1; return { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts index e8f1ada..8f7bb5a 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage2/index.ts @@ -12,7 +12,7 @@ export const dietReportPage2 = ( snacks, water_consumption, }: UserReportResponse, - getTextInputProps?: any, + getTextInputProps: any, ): DietReportPageContent => { const page = dietReportPage.PAGE2; return { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts index fb423d1..b13e7a6 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage3/index.ts @@ -13,7 +13,7 @@ export const dietReportPage3 = ( fruits_portion, vegetables_portion, }: UserReportResponse, - getTextInputProps?: any, + getTextInputProps: any, ): DietReportPageContent => { const page = dietReportPage.PAGE3; return { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts index 40f865a..8e00962 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/DietReportPage4/index.ts @@ -11,7 +11,7 @@ export const dietReportPage4 = ( lesson_learned, problem_faced_and_feedbacks, }: UserReportResponse, - getTextInputProps?: any, + getTextInputProps: any, ): DietReportPageContent => { const page = dietReportPage.PAGE4; return { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts index e79c6b6..4972f21 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts +++ b/src/scenes/nutritionist/DietReportForNutritionist/pages/utils.ts @@ -11,7 +11,7 @@ export const getQuestionAnswerCommentString = ( question: string, answer: any, answerType: string, - getTextInputProps?: any, + getTextInputProps: any, ): { label: string; answer: string; -- GitLab From d249c4a10f711de73e74f565a330998c2fa0b51d Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Sat, 5 Jun 2021 11:24:18 +0700 Subject: [PATCH 20/25] [REFACTOR] test empty user report data --- .../DietReportForNutritionist/index.test.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index 5eb7789..046b52b 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -24,4 +24,17 @@ describe('DietReportForNutritionist', () => { }); await waitFor(() => expect(mockAxios.request).toBeCalled()); }); + + it('shows "Klien belum mengisi laporan diet mingguan" text if no questionnaire answer is provided yet', () => { + const { getByText } = render( + , + ROUTES.clientDietReportNutritionist, + { + routeParams: { id: null }, + }, + ); + expect( + getByText(/Klien belum mengisi laporan diet mingguan/i), + ).toBeTruthy(); + }); }); -- GitLab From 338177c90bdabcd95d84f42623ab560f51dca1b0 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Sat, 5 Jun 2021 23:09:07 +0700 Subject: [PATCH 21/25] [REFACTOR] improve test for QuestionAnswerCommentCard to 100% --- .../QuestionAnswerCommentCard/index.test.tsx | 86 +++++++++++++++++++ .../DietReportForNutritionist/index.test.tsx | 37 +++++--- 2 files changed, 109 insertions(+), 14 deletions(-) create mode 100644 src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.test.tsx diff --git a/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.test.tsx new file mode 100644 index 0000000..8082dc8 --- /dev/null +++ b/src/scenes/nutritionist/DietReportForNutritionist/components/QuestionAnswerCommentCard/index.test.tsx @@ -0,0 +1,86 @@ +import React from 'react'; +import { render } from 'utils/testing'; +import * as ROUTES from 'constants/routes'; + +import QuestionAnswerCommentCard from '.'; +import { dietReportPage } from '../../pages/types'; + +describe('DietReportPage', () => { + it('name renders correctly', () => { + const { getByText } = render( + , + ROUTES.clientDietReportNutritionist, + ); + expect(getByText(/Ryujin/i)).toBeTruthy(); + }); + + it('email renders correctly', () => { + const { getByText } = render( + , + ROUTES.clientDietReportNutritionist, + ); + expect(getByText(/ryujin@ryujin.com/i)).toBeTruthy(); + }); + + it('page 3 renders correctly', () => { + const { getByText } = render( + , + ROUTES.clientDietReportNutritionist, + ); + expect(getByText(/Minuman manis/i)).toBeTruthy(); + expect(getByText(/4/i)).toBeTruthy(); + }); + + it('page 2 renders correctly with score description', () => { + const { getByText } = render( + , + ROUTES.clientDietReportNutritionist, + ); + expect(getByText(/Secara rata-rata, sebelum waktu makan/i)).toBeTruthy(); + expect(getByText(/4/i)).toBeTruthy(); + expect(getByText(/Sangat kelaparan/i)).toBeTruthy(); + expect(getByText(/Sangat begah/i)).toBeTruthy(); + }); + + it('page 2 renders correctly without score description', () => { + const { getByText } = render( + , + ROUTES.clientDietReportNutritionist, + ); + expect( + getByText(/Selama 1 minggu terakhir, berapa rata-rata total gelas air/i), + ).toBeTruthy(); + expect(getByText(/3/i)).toBeTruthy(); + }); +}); diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index 046b52b..2bdf2cf 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -11,30 +11,39 @@ const mockAxios = axios as jest.Mocked; describe('DietReportForNutritionist', () => { const userReports = [mockUserReportResponse]; - const retrieveUserReportApi = () => + const retrieveUserReportApi = (response: any[]): any => Promise.resolve({ status: 200, - data: userReports, + data: response, }); it('renders correctly', async () => { - mockAxios.request.mockImplementationOnce(retrieveUserReportApi); + mockAxios.request.mockImplementationOnce( + retrieveUserReportApi(userReports), + ); render(, ROUTES.clientDietReportNutritionist, { routeParams: { id: 1 }, }); await waitFor(() => expect(mockAxios.request).toBeCalled()); }); - it('shows "Klien belum mengisi laporan diet mingguan" text if no questionnaire answer is provided yet', () => { - const { getByText } = render( - , - ROUTES.clientDietReportNutritionist, - { - routeParams: { id: null }, - }, - ); - expect( - getByText(/Klien belum mengisi laporan diet mingguan/i), - ).toBeTruthy(); + // it('shows "Klien belum mengisi laporan diet mingguan" text if diet report is not provided yet', async () => { + // mockAxios.request.mockImplementationOnce(retrieveUserReportApi([])); + + // const { getByText } = render( + // , + // ROUTES.clientDietReportNutritionist, + // { + // routeParams: { id: 0 }, + // }, + // ); + // await waitFor(() => expect(mockAxios.request).toBeCalled()); + // expect( + // getByText(/Klien belum mengisi laporan diet mingguan/i), + // ).toBeTruthy(); + // }); + + afterAll(() => { + jest.clearAllMocks(); }); }); -- GitLab From 7a34ef1c45de4fa0e05f42fd983ec849654733f1 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Sat, 5 Jun 2021 23:09:41 +0700 Subject: [PATCH 22/25] [REFACTOR] remove unused test --- .../DietReportForNutritionist/index.test.tsx | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index 2bdf2cf..b4ea24e 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -27,22 +27,6 @@ describe('DietReportForNutritionist', () => { await waitFor(() => expect(mockAxios.request).toBeCalled()); }); - // it('shows "Klien belum mengisi laporan diet mingguan" text if diet report is not provided yet', async () => { - // mockAxios.request.mockImplementationOnce(retrieveUserReportApi([])); - - // const { getByText } = render( - // , - // ROUTES.clientDietReportNutritionist, - // { - // routeParams: { id: 0 }, - // }, - // ); - // await waitFor(() => expect(mockAxios.request).toBeCalled()); - // expect( - // getByText(/Klien belum mengisi laporan diet mingguan/i), - // ).toBeTruthy(); - // }); - afterAll(() => { jest.clearAllMocks(); }); -- GitLab From d8934d76b73ad6fa9f48313ba5d5c87f1a0c09bf Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Sun, 6 Jun 2021 00:07:54 +0700 Subject: [PATCH 23/25] [REFACTOR] remove unused function --- .../DietReportForNutritionist/index.test.tsx | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index b4ea24e..1e98fbf 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -11,15 +11,13 @@ const mockAxios = axios as jest.Mocked; describe('DietReportForNutritionist', () => { const userReports = [mockUserReportResponse]; - const retrieveUserReportApi = (response: any[]): any => - Promise.resolve({ - status: 200, - data: response, - }); it('renders correctly', async () => { - mockAxios.request.mockImplementationOnce( - retrieveUserReportApi(userReports), + mockAxios.request.mockImplementationOnce(() => + Promise.resolve({ + status: 200, + data: userReports, + }), ); render(, ROUTES.clientDietReportNutritionist, { routeParams: { id: 1 }, -- GitLab From 785941fc048bf0e377e9af283d8eb68fa6bae787 Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Sun, 6 Jun 2021 15:24:10 +0700 Subject: [PATCH 24/25] [REFACTOR] improve test for DietReportForNutritionist --- .../DietReportForNutritionist/index.test.tsx | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index 1e98fbf..e490aa9 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -25,6 +25,27 @@ describe('DietReportForNutritionist', () => { await waitFor(() => expect(mockAxios.request).toBeCalled()); }); + it('shows correct client list', async () => { + mockAxios.request.mockImplementationOnce(() => + Promise.resolve({ + status: 200, + data: [], + }), + ); + + const { queryByText } = render( + , + ROUTES.clientDietReportNutritionist, + { + routeParams: { id: 0 }, + }); + await waitFor(() => expect(mockAxios.request).toBeCalled()); + + expect( + queryByText(/Klien belum mengisi laporan diet mingguan/i), + ).toBeTruthy(); + }); + afterAll(() => { jest.clearAllMocks(); }); -- GitLab From 6e97cf84b8c81d6b94b16a1ae6d7d4966fdf288d Mon Sep 17 00:00:00 2001 From: Kefas Satrio Bangkit Solideantyo Date: Sun, 6 Jun 2021 17:21:25 +0700 Subject: [PATCH 25/25] [REFACTOR] improve DietReportForNutritionist test to 100% --- .../DietReportForNutritionist/index.test.tsx | 128 +++++++++++++++++- .../DietReportForNutritionist/index.tsx | 24 ++-- 2 files changed, 138 insertions(+), 14 deletions(-) diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx index 1e98fbf..c5bd744 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.test.tsx @@ -1,28 +1,148 @@ import React from 'react'; -import { render, waitFor } from 'utils/testing'; +import { render, waitFor, fireEvent } from 'utils/testing'; import DietReportForNutritionist from '.'; import { mockUserReportResponse } from '__mocks__/userReport'; import axios from 'axios'; import * as ROUTES from 'constants/routes'; +jest.mock('react-native-toast-message'); jest.mock('axios'); const mockAxios = axios as jest.Mocked; describe('DietReportForNutritionist', () => { const userReports = [mockUserReportResponse]; - it('renders correctly', async () => { + it('renders and submits correctly when given valid comments', async () => { mockAxios.request.mockImplementationOnce(() => Promise.resolve({ status: 200, data: userReports, }), ); - render(, ROUTES.clientDietReportNutritionist, { - routeParams: { id: 1 }, + const { queryByText, getByText, getAllByPlaceholderText } = render( + , + ROUTES.clientDietReportNutritionist, + { + routeParams: { id: 1 }, + }, + ); + await waitFor(() => expect(mockAxios.request).toBeCalled()); + + const textFieldsPage1 = getAllByPlaceholderText(/Tuliskan komentar.../i); + textFieldsPage1.forEach((field) => { + fireEvent.changeText(field, 'comment'); + }); + + fireEvent.press(getByText(/Lanjut/i)); + + const textFieldsPage2 = getAllByPlaceholderText(/Tuliskan komentar.../i); + textFieldsPage2.forEach((field) => { + fireEvent.changeText(field, 'comment (2)'); + }); + + fireEvent.press(getByText(/Lanjut/i)); + + const textFieldsPage3 = getAllByPlaceholderText(/Tuliskan komentar.../i); + textFieldsPage3.forEach((field) => { + fireEvent.changeText(field, 'comment (3)'); + }); + + fireEvent.press(getByText(/Lanjut/i)); + + const textFieldsPage4 = getAllByPlaceholderText(/Tuliskan komentar.../i); + textFieldsPage4.forEach((field) => { + fireEvent.changeText(field, 'comment (4)'); + }); + + mockAxios.request.mockImplementationOnce(() => + Promise.resolve({ + status: 201, + data: mockUserReportResponse, + }), + ); + + const submitButton = getByText('Selesai'); + await waitFor(() => fireEvent.press(submitButton)); + expect(queryByText(/Daftar Klien/i)).toBeTruthy(); + }); + + it('renders and does not redirect when api fails', async () => { + mockAxios.request.mockImplementationOnce(() => + Promise.resolve({ + status: 200, + data: userReports, + }), + ); + const { queryByText, getByText, getAllByPlaceholderText } = render( + , + ROUTES.clientDietReportNutritionist, + { + routeParams: { id: 1 }, + }, + ); + await waitFor(() => expect(mockAxios.request).toBeCalled()); + + const textFieldsPage1 = getAllByPlaceholderText(/Tuliskan komentar.../i); + textFieldsPage1.forEach((field) => { + fireEvent.changeText(field, 'comment'); + }); + + fireEvent.press(getByText(/Lanjut/i)); + + const textFieldsPage2 = getAllByPlaceholderText(/Tuliskan komentar.../i); + textFieldsPage2.forEach((field) => { + fireEvent.changeText(field, 'comment (2)'); + }); + + fireEvent.press(getByText(/Lanjut/i)); + + const textFieldsPage3 = getAllByPlaceholderText(/Tuliskan komentar.../i); + textFieldsPage3.forEach((field) => { + fireEvent.changeText(field, 'comment (3)'); }); + + fireEvent.press(getByText(/Lanjut/i)); + + const textFieldsPage4 = getAllByPlaceholderText(/Tuliskan komentar.../i); + textFieldsPage4.forEach((field) => { + fireEvent.changeText(field, 'comment (4)'); + }); + + mockAxios.request.mockImplementationOnce(() => + Promise.reject({ + status: 400, + response: { + data: 'error', + }, + }), + ); + + const submitButton = getByText('Selesai'); + await waitFor(() => fireEvent.press(submitButton)); + expect(queryByText(/Daftar Klien/i)).toBeFalsy(); + }); + + it('shows empty data page when no data', async () => { + mockAxios.request.mockImplementationOnce(() => + Promise.resolve({ + status: 200, + data: [], + }), + ); + + const { queryByText } = render( + , + ROUTES.clientDietReportNutritionist, + { + routeParams: { id: 0 }, + }, + ); await waitFor(() => expect(mockAxios.request).toBeCalled()); + + expect( + queryByText(/Klien belum mengisi laporan diet mingguan/i), + ).toBeTruthy(); }); afterAll(() => { diff --git a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx index 65c4cb4..b43f06d 100644 --- a/src/scenes/nutritionist/DietReportForNutritionist/index.tsx +++ b/src/scenes/nutritionist/DietReportForNutritionist/index.tsx @@ -37,8 +37,8 @@ const DietReportForNutritionist: FC = () => { getTextInputProps, handleSubmit, isSubmitting, - isFormUntouched, isFieldError, + values: formValues, } = useForm({ initialValues: dietReportCommentInitialValues, validationSchema: generateValidationSchema(fieldValidations), @@ -48,7 +48,7 @@ const DietReportForNutritionist: FC = () => { ...values, }; const response = await createNutritionistCommentApi(payload); - if (response.success && response.data) { + if (response.success) { Toast.show({ type: 'success', text1: 'Sukses membuat komen', @@ -76,19 +76,23 @@ const DietReportForNutritionist: FC = () => { const userReport = userReports[userReports.length - 1]; const isCurrentPageError = (): boolean => { + if (activeSlide === 1) { + return [ + formValues.height, + formValues.weight, + formValues.waist_size, + ].reduce((acc: boolean, item) => acc || item === '', false); + } if (activeSlide === 3) { return isFieldError('average_consumption'); } const fields = [ - ...(dietReportTextFields[`dietReportPage${activeSlide}`] || []), - ...(dietReportSelectFields[`dietReportPage${activeSlide}`] || []), + ...dietReportTextFields[`dietReportPage${activeSlide}`], + ...dietReportSelectFields[`dietReportPage${activeSlide}`], ]; - return ( - isFormUntouched() || - fields.reduce( - (acc: boolean, item) => acc || isFieldError(item.name), - false, - ) + return fields.reduce( + (acc: boolean, item) => acc || isFieldError(item.name), + false, ); }; -- GitLab