src/Calendar/Calendar.tsx
import React, { useReducer } from 'react' import { Block, BlockProps } from '../Block' import { Browser, StyledBrowser } from './Browser'import { Years } from './modes/Years'import { Quarters } from './modes/Quarters'import { Months } from './modes/Months'import { Days } from './modes/Days'import { StyledHeader, StyledDays, StyledMonths, StyledWeekDays, StyledQuarters } from './styled'import { browseReducer, createBrowsers, formatDateHeader, useMode } from './helpers'import { onChangeDate, Modes } from './types' export interface CalendarProps { value: Date onChange: onChangeDate onHeaderClick?: () => void initialMode?: Modes mode?: Modes | Modes[]} const renderMode = (mode: Modes, value: Date, browseDate: Date, onChange: onChangeDate) => { switch (mode) { case Modes.YEARS: return <Years value={value} browseDate={browseDate} onChange={onChange} /> case Modes.QUARTERS: return <Quarters value={value} browseDate={browseDate} onChange={onChange} /> case Modes.MONTHS: return <Months value={value} browseDate={browseDate} onChange={onChange} /> case Modes.DAYS: default: return <Days value={value} browseDate={browseDate} onChange={onChange} /> }} export const Calendar = ({ value, onChange, onHeaderClick, initialMode, mode, ...blockProps}: CalendarProps & BlockProps) => { const [selectedMode, selectNextMode] = useMode(initialMode, mode) const [browseDate, dispatch] = useReducer(browseReducer, value) const [onPrev, onNext] = createBrowsers(dispatch, selectedMode) return ( <Block {...blockProps}> <Browser onPrev={onPrev} onNext={onNext}> <StyledHeader onClick={onHeaderClick || selectNextMode}> {formatDateHeader(browseDate, selectedMode)} </StyledHeader> </Browser> {renderMode(selectedMode, value, browseDate, onChange)} </Block> )} // CSS selectors for styled-componentsCalendar.Browser = StyledBrowserCalendar.Header = StyledHeaderCalendar.Years = StyledMonthsCalendar.Quarters = StyledQuartersCalendar.Months = StyledMonthsCalendar.Days = StyledDaysCalendar.Weekdays = StyledWeekDays