import React, { ReactChild } from 'react'; import { ViewMode } from '../../types/public-types'; import { TopPartOfCalendar } from './top-part-of-calendar'; import { getLocaleMonth, getWeekNumberISO8601, } from '../../helpers/date-helper'; import '../../style.css'; export type CalendarProps = { dates: Date[]; locale: string; viewMode: ViewMode; headerHeight: number; columnWidth: number; fontFamily: string; fontSize: string; }; export const Calendar: React.FC = ({ dates, locale, viewMode, headerHeight, columnWidth, fontFamily, fontSize, }) => { const getCalendarValuesForMonth = () => { let topValues: ReactChild[] = []; let bottomValues: ReactChild[] = []; const topDefaultWidth = columnWidth * 6; const topDefaultHeight = headerHeight * 0.5; for (let i = 0; i < dates.length; i++) { const date = dates[i]; let bottomValue = getLocaleMonth(date, locale); bottomValues.push( {bottomValue} ); if (i === 0 || date.getFullYear() !== dates[i - 1].getFullYear()) { let topValue = date.getFullYear().toString(); topValues.push( ); } } return [topValues, bottomValues]; }; const getCalendarValuesForWeek = () => { let topValues: ReactChild[] = []; let bottomValues: ReactChild[] = []; let weeksCount: number = 0; const topDefaultHeight = headerHeight * 0.5; for (let i = dates.length - 1; i >= 0; i--) { const date = dates[i]; let topValue = ''; if (i === 0 || date.getMonth() !== dates[i - 1].getMonth()) { //top topValue = `${getLocaleMonth(date, locale)}, ${date.getFullYear()}`; } //bottom const bottomValue = `W${getWeekNumberISO8601(date)}`; bottomValues.push( {bottomValue} ); if (topValue) { //if last day is new month if (i !== dates.length - 1) { topValues.push( ); } weeksCount = 0; } weeksCount++; } return [topValues, bottomValues]; }; const getCalendarValuesForDay = () => { let topValues: ReactChild[] = []; let bottomValues: ReactChild[] = []; const topDefaultHeight = headerHeight * 0.5; for (let i = 0; i < dates.length; i++) { const date = dates[i]; const bottomValue = date.getDate().toString(); bottomValues.push( {bottomValue} ); if ( i + 1 !== dates.length && date.getMonth() !== dates[i + 1].getMonth() ) { let topValue = getLocaleMonth(date, locale); topValues.push( ); } } return [topValues, bottomValues]; }; const getCalendarValuesForOther = () => { let topValues: ReactChild[] = []; let bottomValues: ReactChild[] = []; let ticks = viewMode === ViewMode.HalfDay ? 2 : 4; const topDefaultHeight = headerHeight * 0.5; for (let i = 0; i < dates.length; i++) { const date = dates[i]; const bottomValue = Intl.DateTimeFormat(locale, { hour: 'numeric', }).format(date); bottomValues.push( {bottomValue} ); if (i === 0 || date.getDate() !== dates[i - 1].getDate()) { const topValue = `${date.getDate()} ${getLocaleMonth(date, locale)}`; topValues.push( ); } } return [topValues, bottomValues]; }; let topValues: ReactChild[] = []; let bottomValues: ReactChild[] = []; switch (viewMode) { case ViewMode.Month: [topValues, bottomValues] = getCalendarValuesForMonth(); break; case ViewMode.Week: [topValues, bottomValues] = getCalendarValuesForWeek(); break; case ViewMode.Day: [topValues, bottomValues] = getCalendarValuesForDay(); break; default: [topValues, bottomValues] = getCalendarValuesForOther(); break; } return ( {bottomValues} {topValues} ); };