diff --git a/screens/ScreenPuasa.js b/screens/ScreenPuasa.js index 85fd574..a6be6a7 100644 --- a/screens/ScreenPuasa.js +++ b/screens/ScreenPuasa.js @@ -1,22 +1,349 @@ -import { StatusBar } from 'expo-status-bar'; -import { StyleSheet, Text, View } from 'react-native'; +import React, { useState, useRef, useEffect } from "react"; +import { + View, + Text, + Image, + StyleSheet, + TouchableOpacity, + Animated, + BackHandler, + FlatList, + ScrollView, + TextInput, +} from "react-native"; +import axios from "axios"; +import AsyncStorage from "@react-native-async-storage/async-storage"; +import Container from "../components/Container"; +import CardRecord from "../components/CardRecord"; + +const ScreenFasting = ({ navigation }) => { + const [token, setToken] = useState(null); + + const [profileId, setProfileId] = useState(null); + const [profileName, setProfileName] = useState(null); + const [profileSex, setProfileSex] = useState(null); + const [profileDob, setProfileDob] = useState(null); + const [profileAge, setProfileAge] = useState(null); + + const [whenLastEat, setWhenLastEat] = useState(""); // YYYY-MM-DD HH:MM:SS + const [whenLastDrink, setWhenLastDrink] = useState(""); // YYYY-MM-DD HH:MM:SS + + const [recordList, setRecordList] = useState([]); + + const getToken = async () => { + const savedToken = await AsyncStorage.getItem("auth_token"); + if (savedToken !== null) { + setToken(savedToken); + } else { + // navigation.navigate("Profile"); + } + }; + + const HttpRequest = (url, body, conf, handle) => { + // string, object, object + axios + .post(url, body, conf) + .then((response) => { + handle(response.data); + }) + .catch((error) => { + console.error("Terjadi kesalahan:", error.stack); + }); + }; + + const handleProfileDetail = (data) => { + if (data.status === "success") { + setProfileId(data.data.id); + setProfileName(data.data.name); + setProfileSex(data.data.sex); + setProfileDob(data.data.dob); + if (data.data.dob !== null) { + const tanggalLahir = new Date(data.data.dob); + const today = new Date(); + const umur = today.getFullYear() - tanggalLahir.getFullYear(); + const bulanSekarang = today.getMonth() - tanggalLahir.getMonth(); + let umurTerupdate; + if ( + bulanSekarang < 0 || + (bulanSekarang === 0 && today.getDate() < tanggalLahir.getDate()) + ) { + umurTerupdate = umur - 1; + } else { + umurTerupdate = umur; + } + setProfileAge(umurTerupdate); + } + } + }; + + const fetchProfileDetail = async () => { + try { + const url = "https://uas.ditaajipratama.net/api/checkcare/profile/detail"; + const body = {}; + const auth_token = await AsyncStorage.getItem("auth_token"); + const config = { + headers: { + Authorization: `Bearer ${auth_token}`, + }, + }; + console.log(`Bearer ${auth_token}`); + console.log(token); + if (auth_token !== null) { + HttpRequest(url, body, config, handleProfileDetail); + } + } catch (error) { + console.log(error.stack); + } + }; + + const calculateFastingDuration = (lastEatTime, lastDrinkTime) => { + if (!lastEatTime && !lastDrinkTime) return 0; + + const now = new Date(); + const lastEat = lastEatTime ? new Date(lastEatTime) : null; + const lastDrink = lastDrinkTime ? new Date(lastDrinkTime) : null; + + // Use the more recent time (shorter fasting period) + let lastIntake = null; + if (lastEat && lastDrink) { + lastIntake = lastEat > lastDrink ? lastEat : lastDrink; + } else if (lastEat) { + lastIntake = lastEat; + } else if (lastDrink) { + lastIntake = lastDrink; + } + + if (!lastIntake) return 0; + + const diffMs = now - lastIntake; + const diffHours = diffMs / (1000 * 60 * 60); + return Math.max(0, diffHours); + }; + + const quickResult = (whenLastEat, whenLastDrink) => { + var title = "Cek Puasa"; + var message = "Masukkan waktu makan dan minum terakhir"; + var image = require("../assets/illustration/menu/medicine.png"); // You'll change this + + const fastingHours = calculateFastingDuration(whenLastEat, whenLastDrink); + + if (fastingHours === 0) { + title = "Cek Puasa"; + message = "Masukkan waktu makan dan minum terakhir"; + } else if (fastingHours < 12) { + title = "Puasa Pendek"; + message = `Anda telah berpuasa selama ${fastingHours.toFixed(1)} jam`; + } else if (fastingHours >= 12 && fastingHours < 16) { + title = "Intermittent Fasting"; + message = `Anda telah berpuasa selama ${fastingHours.toFixed(1)} jam`; + } else if (fastingHours >= 16 && fastingHours < 24) { + title = "Extended Fasting"; + message = `Anda telah berpuasa selama ${fastingHours.toFixed(1)} jam`; + } else { + title = "Puasa Panjang"; + message = `Anda telah berpuasa selama ${fastingHours.toFixed( + 1 + )} jam - Konsultasi dengan dokter`; + } + + return { title, message, image, fastingHours }; + }; + + const reqRecordList = async () => { + try { + const url = "https://uas.ditaajipratama.net/api/checkcare/fasting/list"; + const body = {}; + const auth_token = await AsyncStorage.getItem("auth_token"); + const config = { + headers: { + Authorization: `Bearer ${auth_token}`, + }, + }; + const handle = (data) => { + setRecordList(data); + }; + if (auth_token !== null) { + HttpRequest(url, body, config, handle); + } + } catch (error) { + console.log(error.stack); + } + }; + + const reqAdd = async () => { + try { + const url = "https://uas.ditaajipratama.net/api/checkcare/fasting/add"; + const body = { + when_last_eat: whenLastEat, + when_last_drink: whenLastDrink, + }; + const auth_token = await AsyncStorage.getItem("auth_token"); + const config = { + headers: { + Authorization: `Bearer ${auth_token}`, + }, + }; + const handle = (data) => { + reqRecordList(); + setWhenLastEat(""); + setWhenLastDrink(""); + }; + if (auth_token !== null) { + HttpRequest(url, body, config, handle); + } + } catch (error) { + console.log(error.stack); + } + }; + + const ListItem = ({ item }) => { + const result = quickResult(item.when_last_eat, item.when_last_drink); + return ( + + {item.when} + + Puasa: {result.fastingHours.toFixed(1)} jam + + {result.title} + + ); + }; + + useEffect(() => { + getToken(); + fetchProfileDetail(); + reqRecordList(); + }, []); -const ScreenPuasa = ({ navigation }) => { return ( - - Ini halaman Puasa - - + + + + + + + + {quickResult(whenLastEat, whenLastDrink).title} + + + {`Durasi: ${quickResult( + whenLastEat, + whenLastDrink + ).fastingHours.toFixed(1)} jam`} + + + {quickResult(whenLastEat, whenLastDrink).message} + + + + + + setWhenLastEat(text)} + value={whenLastEat} + /> + setWhenLastDrink(text)} + value={whenLastDrink} + /> + + + Submit + + + + + } + keyExtractor={(item, index) => index.toString()} + /> + + ); -} +}; const styles = StyleSheet.create({ - container: { + headerRow: { + flexDirection: "row", + alignItems: "center", + }, + illustration: { + width: 100, + height: 100, + }, + illustrationContainer: { + marginRight: 16, + }, + textContainer: { flex: 1, - backgroundColor: '#fff', - alignItems: 'center', - justifyContent: 'center', + }, + title: { + fontSize: 28, + fontWeight: "bold", + color: "#111", + }, + datetime: { + fontSize: 12, + color: "#444", + marginVertical: 4, + }, + description: { + fontSize: 14, + color: "#333", + maxWidth: 320, + marginBottom: 16, + }, + inputColumn: { + width: "100%", + marginBottom: 10, + }, + inputForm: { + borderWidth: 1, + borderColor: "#ccc", + borderRadius: 30, + paddingVertical: 10, + paddingHorizontal: 16, + marginVertical: 6, + backgroundColor: "#fff", + color: "#333", + }, + inputButtonSubmit: { + borderRadius: 30, + paddingVertical: 12, + marginVertical: 6, + backgroundColor: "#007bff", + }, + submitText: { + textAlign: "center", + color: "#fff", + fontWeight: "600", + }, + resultDate: { + flex: 1, + color: "#333", + }, + resultValue: { + flex: 1, + textAlign: "center", + color: "#111", + fontWeight: "500", + }, + resultStatus: { + flex: 1, + textAlign: "right", + fontWeight: "bold", }, }); -export default ScreenPuasa; +export default ScreenFasting;