@@ -3,7 +3,7 @@ import XDate from 'xdate';
33import React , { useCallback , useContext , useMemo , useRef , useState } from 'react' ;
44import { FlatList , View , ViewToken } from 'react-native' ;
55
6- import { sameWeek } from '../../dateutils' ;
6+ import { sameWeek , onSameDateRange } from '../../dateutils' ;
77import { toMarkingFormat } from '../../interface' ;
88import { DateData } from '../../types' ;
99import styleConstructor from '../style' ;
@@ -16,7 +16,7 @@ import {extractCalendarProps} from '../../componentUpdater';
1616import CalendarContext from '../Context' ;
1717import { useDidUpdate } from '../../hooks' ;
1818
19- const NUMBER_OF_PAGES = 6 ;
19+ export const NUMBER_OF_PAGES = 6 ;
2020const NUM_OF_ITEMS = NUMBER_OF_PAGES * 2 + 1 ; // NUMBER_OF_PAGES before + NUMBER_OF_PAGES after + current
2121const APPLY_ANDROID_FIX = constants . isAndroid && constants . isRTL ;
2222
@@ -36,7 +36,7 @@ const WeekCalendar = (props: WeekCalendarProps) => {
3636 hideDayNames,
3737 current,
3838 theme,
39- testID
39+ testID,
4040 } = props ;
4141 const context = useContext ( CalendarContext ) ;
4242 const { allowShadow = true , ...calendarListProps } = props ;
@@ -50,9 +50,23 @@ const WeekCalendar = (props: WeekCalendarProps) => {
5050 const list = useRef < FlatList > ( null ) ;
5151 const currentIndex = useRef ( NUMBER_OF_PAGES ) ;
5252
53+ useDidUpdate ( ( ) => {
54+ items . current = getDatesArray ( date , firstDay , numberOfDays ) ;
55+ setListData ( items . current ) ;
56+ visibleWeek . current = date ;
57+ } , [ numberOfDays ] ) ;
58+
5359 useDidUpdate ( ( ) => {
5460 if ( updateSource !== UpdateSources . WEEK_SCROLL ) {
55- const pageIndex = items . current . findIndex ( item => sameWeek ( item , date , firstDay ) ) ;
61+ const pageIndex = items . current . findIndex (
62+ item => isCustomNumberOfDays ( numberOfDays ) ?
63+ onSameDateRange ( {
64+ firstDay : item ,
65+ secondDay : date ,
66+ numberOfDays : numberOfDays as number ,
67+ firstDateInRange : item
68+ } ) :
69+ sameWeek ( item , date , firstDay ) ) ;
5670 if ( pageIndex !== currentIndex . current ) {
5771 if ( pageIndex >= 0 ) {
5872 visibleWeek . current = items . current [ pageIndex ] ;
@@ -206,6 +220,14 @@ const WeekCalendar = (props: WeekCalendarProps) => {
206220 ) ;
207221} ;
208222
223+ function getDateForDayRange ( date : string , weekIndex : number , numberOfDays : number ) {
224+ const d = new XDate ( date ) ;
225+ if ( weekIndex !== 0 ) {
226+ d . addDays ( numberOfDays * weekIndex ) ;
227+ }
228+ return toMarkingFormat ( d ) ;
229+ }
230+
209231function getDate ( date : string , firstDay : number , weekIndex : number , numberOfDays ?: number ) {
210232 const d = new XDate ( date ) ;
211233 // get the first day of the week as date (for the on scroll mark)
@@ -225,10 +247,17 @@ function getDate(date: string, firstDay: number, weekIndex: number, numberOfDays
225247
226248function getDatesArray ( date : string , firstDay : number , numberOfDays ?: number ) {
227249 return [ ...Array ( NUM_OF_ITEMS ) . keys ( ) ] . map ( ( index ) => {
228- return getDate ( date , firstDay , index - NUMBER_OF_PAGES , numberOfDays ) ;
250+ if ( isCustomNumberOfDays ( numberOfDays ) ) {
251+ return getDateForDayRange ( date , index - NUMBER_OF_PAGES , numberOfDays as number ) ;
252+ }
253+ return getDate ( date , firstDay , index - NUMBER_OF_PAGES ) ;
229254 } ) ;
230255}
231256
257+ function isCustomNumberOfDays ( numberOfDays ?: number ) {
258+ return numberOfDays && numberOfDays > 1 ;
259+ }
260+
232261WeekCalendar . displayName = 'WeekCalendar' ;
233262
234263export default WeekCalendar ;
0 commit comments