import React, {memo} from 'react'; import {StyleSheet, View, Text} from 'react-native'; import dayjs from 'dayjs'; // components import Week from './Week'; // types import {getWeeks, Month_Type, Week_Type} from './utils/data'; import {LOCALE_TYPE} from './utils/locale'; import {Style} from './index'; interface Props { item: Month_Type; locale: LOCALE_TYPE; handlePress: (date: string) => void; startDate: string | null; endDate: string | null; isMonthFirst?: boolean; disabledBeforeToday?: boolean; disabledAfterToday?: boolean; style?: Style; } const PADDING_HORIZONTAL = 10; function Month({ item, locale, handlePress, startDate, endDate, isMonthFirst, disabledBeforeToday, disabledAfterToday, style, }: Props) { const {year, month} = item; const renderDayNames = () => { const result = []; const dayNames = locale.dayNames; for (let i = 0; i < dayNames.length; i++) { result.push( {dayNames[i]} , ); } return result; }; const renderWeeks = () => { const result = []; const weeks: Week_Type[] = getWeeks(item.id, startDate, endDate); const is6Weeks = weeks.length > 5; for (let i = 0; i < weeks.length; i++) { result.push( , ); } return result; }; return ( {isMonthFirst ? {locale.monthNames[month - 1]} : null} {year} {locale.year} {!isMonthFirst ? {locale.monthNames[month - 1]} : null} {renderDayNames()} {renderWeeks()} ); } function areEqual(prevProps: Props, nextProps: Props) { const newId = nextProps.item.id; if ( nextProps.startDate && dayjs(nextProps.startDate).format('YYYY-MM') === newId ) { return false; } if ( nextProps.endDate && dayjs(nextProps.endDate).format('YYYY-MM') === newId ) { return false; } if ( prevProps.startDate && dayjs(prevProps.startDate).format('YYYY-MM') === newId ) { return false; } if ( prevProps.endDate && dayjs(prevProps.endDate).format('YYYY-MM') === newId ) { return false; } if ( nextProps.startDate && nextProps.endDate && dayjs(nextProps.startDate).format('YYYYMM') < dayjs(newId).format('YYYYMM') && dayjs(nextProps.endDate).format('YYYYMM') > dayjs(newId).format('YYYYMM') ) { return false; } if ( prevProps.endDate && prevProps.startDate && dayjs(prevProps.startDate).format('YYYYMM') < dayjs(newId).format('YYYYMM') && dayjs(prevProps.endDate).format('YYYYMM') > dayjs(newId).format('YYYYMM') ) { return false; } if ( prevProps.locale && nextProps.locale && prevProps.locale.today !== nextProps.locale.today ) { return false; } return true; } export default memo(Month, areEqual); const styles = StyleSheet.create({ monthContainer: { paddingTop: 20, paddingHorizontal: PADDING_HORIZONTAL, backgroundColor: '#fff', }, monthNameContainer: { flexDirection: 'row', alignItems: 'center', height: 30, paddingLeft: 16, }, monthName: { fontSize: 16, }, dayNamesContainer: { height: 50, flexDirection: 'row', alignItems: 'center', }, dayNameContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', }, dayName: { fontSize: 15, color: '#bababe', }, dayContainer: { flexDirection: 'row', flexWrap: 'wrap', }, });