11import React , { useContext , useState } from 'react' ;
2+ import { Predicate } from '../types' ;
3+ import { CalendarStateContext } from '../picker/picker' ;
4+ import { SelectedContext } from '../context/selectedContext'
25import MonthComponent from '../month/month' ;
3- import YearComponent from '../year/year' ;
46import Header from '../header/header' ;
5- import Years from '../years/years' ;
6- import { CalendarStateContext , SelectedDateContext } from '../context'
7- import { Predicate } from '../types' ;
7+ import CalendarContextProvider from '../context/calendarContext'
8+ import Options from '../options' ;
89import './calendar.css'
910
1011type CalendarProps = { className ?: string , style ?: React . CSSProperties , initial ?: Date , selected ?: Date | undefined , predicate ?: Predicate < Date > , locale ?: string , onDateSelected ?: ( date : Date ) => void }
1112type CalendarState = { index : number , selected : Date | undefined , calendar : Date }
1213
13- function getToday ( ) : Date {
14- const date = new Date ( )
15- date . setHours ( 0 )
16- date . setMinutes ( 0 )
17- date . setSeconds ( 0 )
18- date . setMilliseconds ( 0 )
1914
20- return date
21- }
15+ export default ( { className = "" , style, initial, locale, predicate = ( ) => false , onDateSelected } : CalendarProps ) => {
16+ let [ calendarState , setCalendarState ] = useContext ( CalendarStateContext )
17+ const [ selected , setSelected ] = useContext ( SelectedContext )
18+ const [ showOptions , setShowOptions ] = useState ( false )
2219
23- function Calendar ( { className = "" , style, initial = getToday ( ) , locale, predicate = ( ) => false , onDateSelected } : CalendarProps ) {
24- const { value, action } = useContext ( SelectedDateContext )
25- const calendarStateContext = useContext ( CalendarStateContext )
26- const [ index , setIndex ] = useState ( 0 )
27- const [ calendar , setCalendar ] = useState ( value ? new Date ( value ) : initial )
2820
29- const today = getToday ( )
30- let lossFocusHandler : { ( e : MouseEvent ) : void }
3121 return (
32- < div ref = { setCalendarContainer } className = { `${ className } calendar-container` } style = { style } >
33- < Header
34- index = { index }
35- calendar = { calendar }
36- onChange = { ( date : Date ) => { setCalendar ( date ) } }
37- onClick = { ( e : React . MouseEvent < HTMLDivElement , MouseEvent > , index ) => {
38- setIndex ( index )
39-
40- } } />
41- {
42- index === 0 && (
43- < MonthComponent
44- calendar = { calendar }
45- selected = { value }
46- today = { today }
47- predicate = { predicate }
48- onClick = { ( e : React . MouseEvent < HTMLDivElement , MouseEvent > , time ) => {
49- action ( new Date ( time ) )
50- onDateSelected && onDateSelected ( value as Date )
51- calendarStateContext . action ( false )
52- } } />
53- )
54- }
55- {
56- index === 1 && (
57- < YearComponent calendar = { calendar } today = { today } selected = { value } predicate = { predicate } onClick = { ( e : React . MouseEvent < HTMLDivElement , MouseEvent > , month : number ) => {
58- calendar . setMonth ( month ) ;
59- setCalendar ( calendar )
60- setIndex ( 0 )
61- e . nativeEvent . stopImmediatePropagation ( )
22+ < CalendarContextProvider initial = { initial || selected } >
23+ < div ref = { setCalendarContainer } className = { `${ className } calendar-container` } style = { style } >
24+ < Header onAction = { ( ) => { setShowOptions ( true ) } } />
25+ < MonthComponent
26+ predicate = { predicate }
27+ onClick = { ( e : React . MouseEvent < HTMLDivElement , MouseEvent > , time ) => {
28+ setSelected ?.( new Date ( time ) )
29+ onDateSelected ?.( selected )
30+ setCalendarState ?.( false )
6231 } } />
63- )
64- }
65- {
66- index === 2 && (
67- < Years
68- calendar = { calendar }
69- predicate = { predicate }
70- onClick = { ( e : React . MouseEvent < HTMLDivElement , MouseEvent > , value : number ) => {
71- calendar . setFullYear ( value ) ;
72- setCalendar ( calendar )
73- setIndex ( 1 )
74- e . nativeEvent . stopImmediatePropagation ( )
75- } } />
76- )
77- }
78- </ div >
32+ { showOptions && < Options onAction = { ( ) => { setShowOptions ( false ) } } > </ Options > }
33+ </ div >
34+ </ CalendarContextProvider >
7935 )
8036
8137 function setCalendarContainer ( element : HTMLDivElement ) {
38+ let lossFocusHandler : { ( e : MouseEvent ) : void } | undefined = undefined
39+
8240 if ( element ) {
8341 lossFocusHandler = ( e : MouseEvent ) => {
8442 let target : Element | null = e . target as Element
8543 while ( target ) {
8644 if ( target === element ) return
8745 target = target . parentElement
8846 }
89- document . removeEventListener ( 'click' , lossFocusHandler )
90- calendarStateContext . action ( false )
47+ setCalendarState ?. ( false )
48+ lossFocusHandler && document . removeEventListener ( 'click' , lossFocusHandler )
9149 }
9250 document . addEventListener ( 'click' , lossFocusHandler )
9351 } else {
94- document . removeEventListener ( 'click' , lossFocusHandler )
52+ lossFocusHandler && document . removeEventListener ( 'click' , lossFocusHandler )
9553
9654 }
9755 }
98-
99-
100-
101-
102- }
103-
104- export default Calendar
56+ }
0 commit comments