Feature: Combine dynamic month label with moving month label in x axis

Co-authored-by: @livgm
This commit is contained in:
bl00dymarie
2024-04-03 20:39:59 +02:00
parent 35224ba722
commit a54e48b17e
3 changed files with 38 additions and 7 deletions
+29 -3
View File
@@ -32,6 +32,7 @@ import {
CHART_GRID_LINE_HORIZONTAL_WIDTH,
CHART_SYMPTOM_HEIGHT_RATIO,
CHART_XAXIS_HEIGHT_RATIO,
CHART_YAXIS_WIDTH,
SYMPTOMS,
} from '../../config'
import { Spacing } from '../../styles'
@@ -97,8 +98,7 @@ const CycleChart = ({ navigate, setDate }) => {
const shouldShowNoDataWarning =
isTemperatureEnabled && chartSymptoms.indexOf('temperature') <= -1
const { width, height } = Dimensions.get('window')
const numberOfColumnsToRender = Math.round(width / CHART_COLUMN_WIDTH)
const { height } = Dimensions.get('window')
const xAxisHeight = height * 0.7 * CHART_XAXIS_HEIGHT_RATIO
const remainingHeight = height * 0.7 - xAxisHeight
@@ -117,6 +117,29 @@ const CycleChart = ({ navigate, setDate }) => {
const columns = makeColumnInfo()
// Monitor scrolling to show proper month abbreviation in symptom chart
const [currentScrollPosition, setCurrentScrollPosition] = useState(0)
const handleScroll = (event) => {
const currentPosition = event.nativeEvent.contentOffset.x
setCurrentScrollPosition(currentPosition)
}
const [numberOfColumnsToRender, setNumberOfColumnsToRender] = useState(0)
const onLayout = (event) => {
const { width } = event.nativeEvent.layout
setNumberOfColumnsToRender(
Math.round((width - CHART_YAXIS_WIDTH) / CHART_COLUMN_WIDTH)
)
}
const getcomputedDateInView = () => {
const columnIndex = Math.floor(currentScrollPosition / CHART_COLUMN_WIDTH)
// detect oldest visible day to render its month dynamically
return columns[columnIndex + numberOfColumnsToRender]
}
const renderColumn = ({ item }) => {
return (
<DayColumn
@@ -144,7 +167,7 @@ const CycleChart = ({ navigate, setDate }) => {
contentContainerStyle={styles.pageContainer}
scrollViewStyle={styles.page}
>
<View style={styles.chartContainer}>
<View style={styles.chartContainer} onLayout={onLayout}>
{shouldShowHint && <Tutorial onClose={hideHint} />}
{shouldShowNoDataWarning && <NoTemperature />}
<View style={styles.chartArea}>
@@ -154,12 +177,15 @@ const CycleChart = ({ navigate, setDate }) => {
symptomsSectionHeight={symptomRowHeight}
shouldShowTemperatureColumn={shouldShowTemperatureColumn}
xAxisHeight={xAxisHeight}
computedDate={getcomputedDateInView()}
/>
<MainGrid
data={columns}
renderItem={renderColumn}
initialNumToRender={numberOfColumnsToRender}
contentContainerStyle={{ height: chartHeight }}
onScroll={handleScroll}
scrollEventThrottle={16} // Detects scroll events at roughly 60fps
/>
{shouldShowTemperatureColumn && (
<HorizontalGrid height={columnHeight} />