trackerHistoryScreen
unknown
plain_text
2 years ago
20 kB
10
Indexable
import React, { useEffect, useRef, useState } from "react"
import { FlatList, ScrollView, StyleSheet, TouchableOpacity, Text, View } from "react-native"
import { LineChart } from "react-native-chart-kit"
import MaterialCommunityIcons from "react-native-vector-icons/MaterialCommunityIcons";
import { useNavigation, useRoute } from "@react-navigation/native";
import { BarChartCustom } from "../../component/common/BarChartCustom"
import CustomHeader from "../../component/common/CustomHeader"
import { ListWithTitle } from "../../component/common/ListWithTitle"
import { ShowErrorMessage } from "../../component/common/showErrorMessage";
import { StepsHistoryCard } from "../../component/common/StepsHistoryCard"
import { WeightPickerPopup } from "../../component/common/WeightPickerPopup";
import { colors } from "../../theme"
import fonts from "../../assets/fonts"
import { historysDataItems, width } from "../../constants/constants"
import { useSelector } from "react-redux"
import { findLatestDate, findLatestDateSleepBmi } from "../../utils/Utils";
import WeekWiseDaySelect from "../../component/common/WeekWiseDaySelect";
import routes from "../../routes/routes";
import useHardwareBackButton from "../../utils/backHandler";
interface InfoComponentPropTypes {
title: string;
value: string | number;
}
interface HistoryDataItem {
id: number;
title: string;
value: number;
}
interface HistoryItem {
id: number;
date: string;
stepsCount: number;
increase: boolean;
}
interface RenderHistoryItemsProps {
item: HistoryItem;
}
export const TrackerHistoryScreen = () => {
const { currentTracker } = useSelector(store => store?.stats)
const { userData } = useSelector(store => store?.userDetails)
const route = useRoute()
const navigation = useNavigation()
const flatlistRef = useRef<FlatList<HistoryDataItem> | null>(null);
const currentTrackerType = route?.params?.selectedTracker
const [selectedFilterId, setSelectedFilterId] = useState(null)
const [weightModal, setWeightModal] = useState<boolean>(false)
const [graphmaxValue, setgraphmaxValue] = useState(null)
const [barGraphData, setBarGraphData] = useState({
titlesData: [],
valuesData: [],
})
useHardwareBackButton()
useEffect(()=>setSelectedFilterId(1),[])
const trackerIcon = <MaterialCommunityIcons name={
currentTrackerType == 'steps' ? 'walk'
: currentTrackerType == 'burn' ? 'fire'
: currentTrackerType
} color={colors.purple} size={20} />
const topGraphData = {
labels: currentTracker?.titlesData,
datasets: [
{
data: currentTracker?.valuesData
},
],
};
const data = {
labels: barGraphData ? barGraphData?.titlesData : ["Dec 1", "2", "3", "4", "5", "6", "7"],
datasets: [
{
data: barGraphData ? barGraphData?.valuesData : [10200, 4256, 7558, 12000, 9463, 3956, 6000]
},
],
};
const barChartConfig = {
backgroundGradientFrom: "#fff",
backgroundGradientFromOpacity: 0,
backgroundGradientTo: "#fff",
backgroundGradientToOpacity: 1,
color: (opacity = 1) => `rgba(0, 0, 0, ${opacity})`,
labelColor: (opacity = 1) => `rgba(153, 153, 153, ${opacity})`,
strokeWidth: 2,
barPercentage: .75,
barRadius: 20,
useShadowColorFromDataset: false,
fillShadowGradientFrom: colors.GREY_F4F4F4,
fillShadowGradientTo: '#f0f0f0',
fillShadowGradientFromOpacity: 1,
fillShadowGradientToOpacity: 1,
propsForBackgroundLines: {
strokeWidth: 2,
stroke: colors.green
},
};
const currentTrackerValue = currentTrackerType == 'weight'
? currentTracker?.trackerData?.data?.current_weight + 'kg'
: currentTrackerType == 'steps'
? currentTracker?.trackerData?.data?.steps_number
: currentTrackerType == 'water'
? currentTracker?.trackerData?.data?.number_of_glass_value
: currentTrackerType == 'burn'
? (currentTracker?.trackerData?.data?.brun_total || currentTracker?.trackerData?.burn_tracking?.calories_burn)
: currentTrackerType == 'heart'
? currentTracker?.trackerData?.data?.bpm
: currentTrackerType == 'bmi'
? userData?.reach_goal?.bmi
: currentTrackerType == 'sleep'
? currentTracker?.trackerData?.data?.yesterday_sleeping_hour : null
const InfoComponent: React.FC<InfoComponentPropTypes> = ({
title,
value
}) => (
<View style={styles.rowCenter}>
<View style={styles.yellowDot} />
<View style={styles.rowCenter}>
<Text style={styles.fs12ppReg666}>{title} : </Text>
<Text style={styles.fs12ppSb666}>{value}</Text>
</View>
</View>
)
const renderHistoryCards: React.FC<RenderHistoryItemsProps> = ({ item }) => (
<StepsHistoryCard
title={currentTrackerType ?? 'Nil'}
date={item?.title}
stepsCount={item?.value}
increase={item?.value > 0}
icon={trackerIcon}
/>
)
const handleUpdateWeight = () => {
setWeightModal(true)
}
const handleSelectFilter = id => {
setSelectedFilterId(id)
if (id === 1) {
setBarGraphData({
titlesData: currentTracker?.titlesData,
valuesData: currentTracker?.valuesData
})
} else if (id === 2) {
// for sleep - currentTracker?.trackerData?.month
const titlesData = currentTracker?.trackerData?.week
? currentTracker?.trackerData?.week?.map(entry => entry.title)
: currentTracker?.trackerData?.chart?.week?.map(entry => entry.title)
const valuesData = currentTracker?.trackerData?.week
? currentTracker?.trackerData?.week?.map(entry => entry.value)
: currentTracker?.trackerData?.chart?.week?.map(entry => entry.value)
if (currentTrackerType == 'bmi') {
ShowErrorMessage('No data present')
} else {
setBarGraphData({
titlesData: titlesData,
valuesData: valuesData
})
}
} else if (id === 3) {
const titlesData = currentTracker?.trackerData?.month ? currentTracker?.trackerData?.month?.map(entry => entry.title) : currentTracker?.trackerData?.chart?.month?.map(entry => entry.title)
const valuesData = currentTracker?.trackerData?.month ? currentTracker?.trackerData?.month?.map(entry => entry.value) : currentTracker?.trackerData?.chart?.month?.map(entry => entry.value)
if (currentTrackerType == 'bmi') {
ShowErrorMessage('No data present')
} else {
setBarGraphData({
titlesData: titlesData,
valuesData: valuesData
})
}
} else if (id === 4) {
const titlesData = currentTracker?.trackerData?.year ? currentTracker?.trackerData?.year?.map(entry => entry.title) : currentTracker?.trackerData?.chart?.month?.map(entry => entry.title)
const valuesData = currentTracker?.trackerData?.year ? currentTracker?.trackerData?.year?.map(entry => entry.value) : currentTracker?.trackerData?.chart?.year?.map(entry => entry.value)
if (currentTrackerType == 'bmi') {
ShowErrorMessage('No data present')
} else {
setBarGraphData({
titlesData: titlesData,
valuesData: valuesData
})
}
}
setAvgVal()
}
const setAvgVal = () => {
setTimeout(() => {
setgraphmaxValue(Math.max(...barGraphData?.valuesData))
}, 800)
}
return (
<>
<CustomHeader
title={currentTrackerType?.toUpperCase()}
onBack={() => navigation.replace(routes.statBurn,{origin:'burn-session'})}
/>
<ScrollView style={styles.container} showsVerticalScrollIndicator={false}>
<WeekWiseDaySelect isDisabled />
<View>
<View style={styles.p16}>
<View style={styles.lineGraphContainer}>
<View style={{ ...styles.rowCenterApart, width: '100%', marginBottom: 12 }}>
<View style={{ ...styles.rowCenter, gap: 6 }}>
<Text style={{ ...styles.fs16ppSb000, textTransform: 'capitalize' }}>{currentTrackerType ? currentTrackerType : 'Nil'}</Text>
<Text style={styles.fs10ppReg999}>Last update-{
currentTrackerType == 'bmi' ?
findLatestDateSleepBmi(currentTracker?.trackerData) :
findLatestDate(currentTracker?.trackerData?.chart?.day) ?? '12 Feb 2023'
}</Text>
</View>
<View style={{ ...styles.rowCenter, gap: 10 }}>
<View style={styles.intensityIndicator}>
<Text style={styles.fs12ppMedRed}>High</Text>
</View>
<Text style={styles.fs28ppBldRed}>{currentTrackerValue ?? '0'}</Text>
</View>
</View>
<View style={{ ...styles.rowCenterApart, width: '100%', marginBottom: 26 }}>
<InfoComponent title={"Height"} value={userData?.height ?? 0} key='infoComponent-height-history' />
<InfoComponent title={"Weight"} value={userData?.weight ?? 0} key='infoComponent-Weight-history' />
<InfoComponent title={"Age"} value={userData?.age ?? '0'} key='infoComponent-age-history' />
<InfoComponent title={"Gender"} value={userData?.gender ?? 'Male'} key='infoComponent-gender-history' />
</View>
<ScrollView horizontal>
{currentTracker?.titlesData?.length > 0 ? <LineChart
data={topGraphData}
width={width * 2}
height={220}
yAxisInterval={1}
chartConfig={{
backgroundGradientFromOpacity: 0,
backgroundGradientToOpacity: 0,
color: (opacity = 1) => `rgba(236, 110, 110, ${1})`,
labelColor: (opacity = 1) => `rgba(153, 153, 153, ${opacity})`,
style: {
borderRadius: 16,
},
propsForDots: {
r: "0",
},
propsForBackgroundLines: {
stroke: 'rgba(0,0,0,.125)',
},
fillShadowGradientFrom: 'rgba(236, 110, 110, 0.47)',
fillShadowGradientTo: 'white',
fillShadowGradientFromOffset: 0,
fillShadowGradientFromOpacity: 1,
fillShadowGradientToOpacity: 0,
// fillShadowGradientOpacity: 0,
}}
bezier
style={{
marginVertical: 8,
borderRadius: 16,
marginLeft: 14
}}
withHorizontalLines={false}
/>
: <View style={styles.noDataContainer}>
<Text style={styles.fs12ppMedRed}>No data found ...</Text>
</View>
}
</ScrollView>
<Text style={styles.yAxisLabel}>BMI Rates</Text>
<TouchableOpacity style={styles.dateButtonContainer}>
<Text style={styles.fs10ppReg666}>Date</Text>
</TouchableOpacity>
</View>
<TouchableOpacity onPress={handleUpdateWeight} style={styles.updateButtonContainer}>
<Text style={styles.fs14ppSbWhite}>Update {currentTrackerType}</Text>
</TouchableOpacity>
</View>
<View style={styles.bottomContainer}>
<ListWithTitle
title={'My progress'}
data={historysDataItems}
selectedName={selectedFilterId}
setSelectedName={handleSelectFilter}
key={'my-progress-history-tracker'}
listRef={flatlistRef}
extraPadding
/>
<BarChartCustom
chartConfig={barChartConfig}
data={data}
key={'custom-bar-chart-track-history'}
graphWidth={barGraphData?.titlesData?.length > 25 ? width * 2 : width}
showXAxis
showAverage
maxDataValue={graphmaxValue}
trackerType={currentTrackerType}
/>
<View style={styles.historyContainer}>
<Text style={{ ...styles.fs18ppSb000, color: colors.c222222 }}>History</Text>
<FlatList
data={
selectedFilterId === 1
? currentTracker?.trackerData?.chart?.day
: selectedFilterId === 2
? currentTracker?.trackerData?.chart?.week
: selectedFilterId === 3
? currentTracker?.trackerData?.chart?.month
: selectedFilterId === 4 ?
currentTracker?.trackerData?.chart?.year
: null
}
keyExtractor={item => item?.id}
renderItem={renderHistoryCards}
contentContainerStyle={{ gap: 12 }}
style={{ marginVertical: 20 }}
/>
</View>
{weightModal &&
<WeightPickerPopup
visible={weightModal}
setVisible={setWeightModal}
key={'weight-picker-modal'}
onUpdate={() => { }}
/>}
</View>
</View>
</ScrollView>
</>
)
}
const styles = StyleSheet.create({
bottomContainer: {
backgroundColor: colors.white,
borderTopLeftRadius: 24,
borderTopRightRadius: 24,
padding: 16,
paddingTop: 24
},
container: {
flex: 1,
backgroundColor: colors.cf9f9f9,
},
dateButtonContainer: {
backgroundColor: colors.white,
width: '100%',
padding: 6,
borderRadius: 12,
alignItems: 'center'
},
fs10ppReg666: {
fontSize: 10,
fontFamily: fonts.PoppinsRegular,
fontWeight: '400',
color: colors.c666666
},
fs10ppReg999: {
fontSize: 10,
fontFamily: fonts.PoppinsRegular,
fontWeight: '400',
color: colors.c999999
},
fs12ppMedRed: {
fontSize: 12,
fontFamily: fonts.PoppinsMedium,
fontWeight: '500',
color: colors.cEC6E6E,
},
fs12ppReg666: {
fontSize: 12,
fontFamily: fonts.PoppinsRegular,
fontWeight: '400',
color: colors.c666666
},
fs12ppSb666: {
fontSize: 12,
fontFamily: fonts.PoppinsSemiBold,
fontWeight: '600',
color: colors.c666666
},
fs14ppSbWhite: {
fontSize: 14,
fontFamily: fonts.PoppinsSemiBold,
fontWeight: '600',
color: colors.white,
},
fs16ppSb000: {
fontSize: 16,
fontFamily: fonts.PoppinsSemiBold,
fontWeight: '600',
color: colors.black
},
fs18ppSb000: {
fontSize: 18,
fontFamily: fonts.PoppinsSemiBold,
fontWeight: '600',
color: colors.black,
},
fs28ppBldRed: {
fontSize: 28,
fontFamily: fonts.PoppinsBold,
fontWeight: '700',
color: colors.cEC6E6E,
},
historyContainer: {
marginTop: 32,
},
intensityIndicator: {
backgroundColor: colors.lightRedBg,
padding: 4,
paddingHorizontal: 12,
borderRadius: 16,
alignItems: 'center'
},
lineGraphContainer: {
alignItems: 'center',
marginVertical: 14,
backgroundColor: colors.white,
padding: 16,
borderRadius: 12,
position: 'relative',
paddingBottom: 10,
zIndex: 99,
},
noDataContainer: {
height: width / 2,
alignItems: 'center',
justifyContent: 'center'
},
p16: {
padding: 16,
},
rowCenter: {
flexDirection: 'row',
alignItems: 'center',
},
rowCenterApart: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between'
},
updateButtonContainer: {
padding: 12,
backgroundColor: colors.green,
borderRadius: 12,
width: '100%',
alignItems: 'center',
marginTop: -30,
paddingTop: 24
},
yAxisLabel: {
fontSize: 10,
fontFamily: fonts.PoppinsRegular,
fontWeight: '400',
color: colors.c999999,
position: 'absolute',
left: -5,
top: '50%',
bottom: '50%',
transform: 'rotate(-90deg)'
},
yellowDot: {
width: 5,
height: 5,
backgroundColor: colors.mangoYellow,
borderRadius: 18,
marginRight: 4
},
})Editor is loading...
Leave a Comment