1
- import React , { useState } from 'react'
1
+ import React , { useState , useEffect } from 'react'
2
2
import Calendar from 'react-calendar'
3
3
import 'react-calendar/dist/Calendar.css'
4
4
import './DateRangePicker.scss'
@@ -13,11 +13,22 @@ const DateRangePicker = ({
13
13
} ) => {
14
14
const [ range , setRange ] = useState ( [ null , null ] )
15
15
const [ currentMonthIndex , setCurrentMonthIndex ] = useState ( disableFutureDates ? - monthsToShow : 0 )
16
+ const [ showSingleCalendar , setShowSingleCalendar ] = useState ( window . innerWidth < 600 )
16
17
const today = new Date ( )
17
18
19
+ useEffect ( ( ) => {
20
+ const handleResize = ( ) => {
21
+ setShowSingleCalendar ( window . innerWidth < 600 )
22
+ }
23
+ window . addEventListener ( 'resize' , handleResize )
24
+ return ( ) => {
25
+ window . removeEventListener ( 'resize' , handleResize )
26
+ }
27
+ } , [ ] )
28
+
18
29
const generateMonthPairs = ( ) => {
19
30
const months = [ ]
20
- for ( let i = 0 ; i < monthsToShow ; i += 2 ) {
31
+ for ( let i = 0 ; i < monthsToShow ; i += showSingleCalendar ? 1 : 2 ) {
21
32
const date1 = new Date ( today . getFullYear ( ) , today . getMonth ( ) + currentMonthIndex + i , 1 )
22
33
const date2 = new Date ( today . getFullYear ( ) , today . getMonth ( ) + currentMonthIndex + i + 1 , 1 )
23
34
@@ -33,6 +44,16 @@ const DateRangePicker = ({
33
44
return months
34
45
}
35
46
47
+ // Получаем заголовки для диапазона
48
+ const getHeaderLabel = ( range ) => {
49
+ if ( ! range [ 0 ] || ! range [ 1 ] ) return [ '' , '' ]
50
+
51
+ const startLabel = range [ 0 ] . toLocaleString ( 'en-US' , { month : 'long' , year : 'numeric' } )
52
+ const endLabel = range [ 1 ] . toLocaleString ( 'en-US' , { month : 'long' , year : 'numeric' } )
53
+
54
+ return [ startLabel , endLabel ]
55
+ }
56
+
36
57
const monthPairs = generateMonthPairs ( )
37
58
38
59
const onDateChange = ( dates ) => {
@@ -44,11 +65,11 @@ const DateRangePicker = ({
44
65
}
45
66
46
67
const handleNext = ( ) => {
47
- setCurrentMonthIndex ( prev => prev + 2 )
68
+ setCurrentMonthIndex ( prev => prev + ( showSingleCalendar ? 1 : 2 ) )
48
69
}
49
70
50
71
const handlePrev = ( ) => {
51
- setCurrentMonthIndex ( prev => prev - 2 )
72
+ setCurrentMonthIndex ( prev => prev - ( showSingleCalendar ? 1 : 2 ) )
52
73
}
53
74
54
75
const handleSetRange = ( start1 , end2 ) => {
@@ -60,19 +81,25 @@ const DateRangePicker = ({
60
81
return false
61
82
}
62
83
84
+ // Получаем заголовки на основе текущего выбранного диапазона
85
+ const [ headerStart , headerEnd ] = getHeaderLabel ( range )
86
+
63
87
return (
64
88
< div className = { 'DateRangePicker ' +
65
89
`${ className || '' } ` +
66
90
`${ noTopNavigation ? 'DateRangePicker--NoTopNavigation' : '' } ` +
67
91
`${ noWeekDay ? 'DateRangePicker--NoWeekDay' : '' } ` }
68
92
>
93
+ { /* Заголовки месяцев */ }
69
94
< div className = { 'DateRangePicker__Header' } >
70
95
< div className = { 'DateRangePicker__HeaderMonth' } >
71
- { monthPairs [ 0 ] . label . split ( ' - ' ) [ 0 ] }
72
- </ div >
73
- < div className = { 'DateRangePicker__HeaderMonth' } >
74
- { monthPairs [ 0 ] . label . split ( ' - ' ) [ 1 ] }
96
+ { headerStart || monthPairs [ 0 ] . label . split ( ' - ' ) [ 0 ] } { /* Отображаем выбранный месяц или месяц по умолчанию */ }
75
97
</ div >
98
+ { ! showSingleCalendar && (
99
+ < div className = { 'DateRangePicker__HeaderMonth' } >
100
+ { headerEnd || monthPairs [ 0 ] . label . split ( ' - ' ) [ 1 ] } { /* Отображаем выбранный месяц или месяц по умолчанию */ }
101
+ </ div >
102
+ ) }
76
103
</ div >
77
104
78
105
< div className = { 'DateRangePicker__Calendar' } >
@@ -82,12 +109,12 @@ const DateRangePicker = ({
82
109
onChange = { onDateChange }
83
110
value = { range }
84
111
tileDisabled = { tileDisabled }
85
- showDoubleView = { true }
112
+ showDoubleView = { ! showSingleCalendar }
86
113
/>
87
114
</ div >
88
115
89
116
< div className = "DateRangePicker__MonthSelector" >
90
- < button className = { 'DateRangePicker__Arrow DateRangePicker__Arrow--left ' } onClick = { handlePrev } >
117
+ < button className = { 'DateRangePicker__Arrow DateRangePicker__Arrow--Left ' } onClick = { handlePrev } >
91
118
<
92
119
</ button >
93
120
@@ -102,11 +129,11 @@ const DateRangePicker = ({
102
129
onClick = { ( ) => handleSetRange ( pair . start1 , pair . end2 ) }
103
130
disabled = { disableFutureDates && pair . start1 > today }
104
131
>
105
- { pair . labelShort }
132
+ { showSingleCalendar ? pair . labelShort . split ( ' - ' ) [ 0 ] : pair . labelShort }
106
133
</ button >
107
134
) ) }
108
135
109
- < button className = { 'DateRangePicker__Arrow DateRangePicker__Arrow--right ' } onClick = { handleNext } >
136
+ < button className = { 'DateRangePicker__Arrow DateRangePicker__Arrow--Right ' } onClick = { handleNext } >
110
137
>
111
138
</ button >
112
139
</ div >
0 commit comments