import React, { useCallback } from 'react'; import { View, Text, Pressable, StyleSheet, Image } from 'react-native'; import { useCalendarContext } from '../CalendarContext'; import dayjs from 'dayjs'; import type { HeaderProps } from '../types'; import { getDateYear, getYearRange, YEAR_PAGE_SIZE } from '../utils'; const arrow_left = require('../assets/images/arrow_left.png'); const arrow_right = require('../assets/images/arrow_right.png'); const Header = ({ buttonPrevIcon, buttonNextIcon }: HeaderProps) => { const { mode, date, currentDate, currentYear, onChangeMonth, onChangeYear, calendarView, setCalendarView, theme, locale, timePicker, } = useCalendarContext(); const currentMonthText = dayjs(currentDate).locale(locale).format('MMMM'); const renderPrevButton = ( calendarView === 'day' ? onChangeMonth(-1) : calendarView === 'month' ? onChangeYear(currentYear - 1) : calendarView === 'year' && onChangeYear(currentYear - YEAR_PAGE_SIZE) } testID="btn-prev" accessibilityRole="button" accessibilityLabel="Prev" > {buttonPrevIcon || ( )} ); const renderNextButton = ( calendarView === 'day' ? onChangeMonth(1) : calendarView === 'month' ? onChangeYear(currentYear + 1) : calendarView === 'year' && onChangeYear(currentYear + YEAR_PAGE_SIZE) } testID="btn-next" accessibilityRole="button" accessibilityLabel="Next" > {buttonNextIcon || ( )} ); const yearSelector = useCallback(() => { const years = getYearRange(currentYear); return ( { setCalendarView(calendarView === 'year' ? 'day' : 'year'); onChangeYear(getDateYear(currentDate)); }} testID="btn-year" accessibilityRole="button" accessibilityLabel={dayjs(currentDate).format('YYYY')} > {calendarView === 'year' ? `${years[0]} - ${years[years.length-1]}` : dayjs(currentDate).format('YYYY')} ); }, [ calendarView, currentDate, currentYear, setCalendarView, onChangeYear, theme, ]); const monthSelector = ( setCalendarView(calendarView === 'month' ? 'day' : 'month') } testID="btn-month" accessibilityRole="button" accessibilityLabel={currentMonthText} > {currentMonthText} ); const renderSelectors = ( <> {calendarView !== 'year' ? monthSelector : null} {yearSelector()} {timePicker && mode === 'single' && calendarView !== 'year' ? ( setCalendarView(calendarView === 'time' ? 'day' : 'time') } accessibilityRole="button" accessibilityLabel={dayjs(date).format('HH:mm')} > {dayjs(date).format('HH:mm')} ) : null} ); return ( {theme?.headerButtonsPosition === 'left' ? ( {renderPrevButton} {renderNextButton} {renderSelectors} ) : theme?.headerButtonsPosition === 'right' ? ( {renderSelectors} {renderPrevButton} {renderNextButton} ) : ( {renderPrevButton} {renderSelectors} {renderNextButton} )} ); }; const styles = StyleSheet.create({ headerContainer: { marginBottom: 5, }, container: { padding: 5, flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', }, selectorContainer: { flexDirection: 'row', alignItems: 'center', }, textContainer: { marginHorizontal: 1, paddingHorizontal: 5, paddingVertical: 5, borderRadius: 5, }, text: { fontWeight: 'bold', fontSize: 15, }, iconContainer: { padding: 4, }, prev: { marginRight: 3, }, next: { marginLeft: 3, }, row: { flexDirection: 'row', }, }); export default Header;