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;