import React, { useCallback, useEffect, useMemo, useState } from 'react'; import type { Dispatch, SetStateAction } from 'react'; import dayjs from 'dayjs'; import { ReactSVG } from 'react-svg'; import Typography from '@mui/material/Typography'; import Button from '@mui/material/Button'; import Box from '@mui/material/Box'; import Divider from '@mui/material/Divider'; import clsx from 'clsx'; import Fade from '@mui/material/Fade'; import { ASSETS_URL } from '../../../../../consts/common'; import { generateYearsRange, getFullMonthName, getSmallMonthName, months } from './helpers'; import createClasses from './styles'; const years = generateYearsRange(); export interface SelectMMYYProps { setSelectDate: Dispatch>; setIsOpenMMYY: Dispatch>; isOpenMMYY: boolean; minDate?: string | Date; maxDate?: string | Date; width: number; height: number; } // eslint-disable-next-line const SelectMMYY = React.forwardRef((props, ref) => { const { setIsOpenMMYY, isOpenMMYY, setSelectDate, minDate, maxDate, width, height } = props; const styles = createClasses(); const [selectedMonth, setSelectedMonth] = useState(dayjs(new Date()).format('MM')); const [selectedYear, setSelectedYear] = useState(dayjs(new Date()).format('YYYY')); const [yearsEnabled, setYearsEnabled] = useState(!!(minDate || maxDate)); const [monthEnabled, setMonthEnabled] = useState(!(minDate || maxDate)); const formatMinDateYear = useMemo( () => (minDate ? dayjs(new Date(minDate)).format('YYYY') : undefined), [minDate] ); const formatMinDateMonth = useMemo( () => (minDate ? dayjs(new Date(minDate)).format('MM') : undefined), [minDate] ); const formatMaxDateYear = useMemo( () => (maxDate ? dayjs(new Date(maxDate)).format('YYYY') : undefined), [maxDate] ); const formatMaxDateMonth = useMemo( () => (maxDate ? dayjs(new Date(maxDate)).format('MM') : undefined), [maxDate] ); useEffect(() => { setSelectDate(new Date(`${selectedMonth}/01/${selectedYear}`)); if (!minDate && !maxDate) { if (yearsEnabled) { setIsOpenMMYY(false); } } // eslint-disable-next-line }, [selectedYear]); useEffect(() => { setSelectDate(new Date(`${selectedMonth}/01/${selectedYear}`)); if (minDate || maxDate) { if (monthEnabled) { setIsOpenMMYY(false); } } // eslint-disable-next-line }, [selectedMonth]); const handleMonth = useCallback( (month: string) => () => { if (!minDate && !maxDate) { setYearsEnabled(true); setSelectedMonth(month); } else { if (month === selectedMonth) { setIsOpenMMYY(false); return; } setSelectedMonth(month); } }, [maxDate, minDate, selectedMonth, setIsOpenMMYY] ); const handleYear = useCallback( (year: string) => { if (!minDate && !maxDate) { if (year === selectedYear) { setIsOpenMMYY(false); return; } setSelectedYear(year); } else { setMonthEnabled(true); setSelectedYear(year); } }, [maxDate, minDate, selectedYear, setIsOpenMMYY] ); const validationCheckedM = useCallback( (month: string) => { if ((minDate || maxDate) && monthEnabled) { if ( formatMinDateYear && formatMaxDateYear && selectedYear > formatMinDateYear && selectedYear < formatMaxDateYear ) { return true; } if (selectedYear === formatMinDateYear && selectedYear !== formatMaxDateYear) { if (Number(month) >= Number(formatMinDateMonth)) { return true; } return false; } if (selectedYear === formatMaxDateYear && selectedYear !== formatMinDateYear) { if (Number(month) <= Number(formatMaxDateMonth)) { return true; } return false; } if (selectedYear === formatMinDateYear && selectedYear === formatMaxDateYear) { if ( Number(month) >= Number(formatMinDateMonth) && Number(month) <= Number(formatMaxDateMonth) ) { return true; } return false; } return true; } return !!monthEnabled; }, [ formatMaxDateMonth, formatMaxDateYear, formatMinDateMonth, formatMinDateYear, maxDate, minDate, monthEnabled, selectedYear ] ); const blockMM = useMemo( () => months.map(month => ( )), [ handleMonth, monthEnabled, selectedMonth, styles.disabledItem, styles.disabledSelectedItem, styles.item, styles.itemText, styles.selectedItem, validationCheckedM ] ); const validationCheckedY = useCallback( (year: string) => { if (minDate || maxDate) { return !!( (minDate ? Number(year) >= Number(formatMinDateYear) : true) && (maxDate ? Number(year) <= Number(formatMaxDateYear) : true) ); } return !!yearsEnabled; }, [formatMaxDateYear, formatMinDateYear, maxDate, minDate, yearsEnabled] ); const blockYY = useMemo( () => years.map(year => ( )), [ handleYear, selectedYear, styles.disabledItem, styles.disabledSelectedItem, styles.item, styles.itemText, styles.selectedItem, validationCheckedY, yearsEnabled ] ); const handleChangeOpenState = useCallback(() => { setIsOpenMMYY(!isOpenMMYY); }, [isOpenMMYY, setIsOpenMMYY]); return ( {maxDate || minDate ? blockMM : blockYY} {maxDate || minDate ? blockYY : blockMM} ); }); SelectMMYY.defaultProps = { minDate: '', maxDate: '' }; export default SelectMMYY;