Skip to content

Commit bb3ec4e

Browse files
committed
Merge branch 'master' of github.com:wix/react-native-calendars into release
2 parents 5d56bd9 + 9ccaf67 commit bb3ec4e

File tree

14 files changed

+509
-183
lines changed

14 files changed

+509
-183
lines changed

.buildkite/pipeline.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
agents:
2+
queue: mbms
13
env:
24
LC_ALL: 'en_US'
35
steps:

android/build.gradle

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,20 @@ buildscript {
3333

3434
allprojects {
3535
repositories {
36+
exclusiveContent {
37+
// We get React Native's Android binaries exclusively through npm,
38+
// from a local Maven repo inside node_modules/react-native/.
39+
// (The use of exclusiveContent prevents looking elsewhere like Maven Central
40+
// and potentially getting a wrong version.)
41+
filter {
42+
includeGroup "com.facebook.react"
43+
}
44+
forRepository {
45+
maven {
46+
url "$rootDir/../node_modules/react-native/android"
47+
}
48+
}
49+
}
3650
mavenCentral {
3751
// We don't want to fetch react-native from Maven Central as there are
3852
// older versions over there.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"react": "17.0.2",
7474
"react-component-driver": "^0.10.0",
7575
"react-native": "0.68.3",
76-
"react-native-navigation": "^7.29.0",
76+
"react-native-navigation": "7.30.0",
7777
"react-recipes": "^1.4.0",
7878
"react-test-renderer": "^17.0.2",
7979
"reassure": "^0.4.1",
@@ -91,7 +91,7 @@
9191
"./jest-setup.js"
9292
],
9393
"testMatch": [
94-
"<rootDir>/src/**/?(*.)(spec|test).{js,jsx}"
94+
"<rootDir>/src/**/?(*.)(spec|test).{js,jsx,ts}"
9595
],
9696
"transformIgnorePatterns": [
9797
"node_modules/(?!(@react-native|react-native|react-native-swipe-gestures)/)"

src/dateutils.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,30 @@ export function sameDate(a?: XDate, b?: XDate) {
2020
return false;
2121
} else {
2222
return a?.getFullYear() === b?.getFullYear() && a?.getMonth() === b?.getMonth() && a?.getDate() === b?.getDate();
23-
}
23+
}
24+
}
25+
26+
export function onSameDateRange({
27+
firstDay,
28+
secondDay,
29+
numberOfDays,
30+
firstDateInRange,
31+
}: {
32+
firstDay: string;
33+
secondDay: string;
34+
numberOfDays: number;
35+
firstDateInRange: string;
36+
}){
37+
const aDate = new XDate(firstDay);
38+
const bDate = new XDate(secondDay);
39+
const firstDayDate = new XDate(firstDateInRange);
40+
const aDiff = aDate.getTime() - firstDayDate.getTime();
41+
const bDiff = bDate.getTime() - firstDayDate.getTime();
42+
const aTotalDays = Math.ceil(aDiff / (1000 * 3600 * 24));
43+
const bTotalDays = Math.ceil(bDiff / (1000 * 3600 * 24));
44+
const aWeek = Math.floor(aTotalDays / numberOfDays);
45+
const bWeek = Math.floor(bTotalDays / numberOfDays);
46+
return aWeek === bWeek;
2447
}
2548

2649
export function sameWeek(a: string, b: string, firstDayOfWeek: number) {

src/day-state-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ const {isToday, isDateNotInRange, sameMonth} = require('./dateutils');
22
const {toMarkingFormat} = require('./interface');
33

44

5-
export function getState(day: XDate, current: XDate, props: any) {
5+
export function getState(day: XDate, current: XDate, props: any, disableDaySelection?: boolean) {
66
const {minDate, maxDate, disabledByDefault, context} = props;
77
let state = '';
88

9-
if ((context?.date ?? toMarkingFormat(current)) === toMarkingFormat(day)) {
9+
if (!disableDaySelection && ((context?.date ?? toMarkingFormat(current)) === toMarkingFormat(day))) {
1010
state = 'selected';
1111
} else if (isToday(day)) {
1212
state = 'today';

src/expandableCalendar/WeekCalendar/index.tsx

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import XDate from 'xdate';
33
import React, {useCallback, useContext, useMemo, useRef, useState} from 'react';
44
import {FlatList, View, ViewToken} from 'react-native';
55

6-
import {sameWeek} from '../../dateutils';
6+
import {sameWeek, onSameDateRange} from '../../dateutils';
77
import {toMarkingFormat} from '../../interface';
88
import {DateData} from '../../types';
99
import styleConstructor from '../style';
@@ -16,7 +16,7 @@ import {extractCalendarProps} from '../../componentUpdater';
1616
import CalendarContext from '../Context';
1717
import {useDidUpdate} from '../../hooks';
1818

19-
const NUMBER_OF_PAGES = 6;
19+
export const NUMBER_OF_PAGES = 6;
2020
const NUM_OF_ITEMS = NUMBER_OF_PAGES * 2 + 1; // NUMBER_OF_PAGES before + NUMBER_OF_PAGES after + current
2121
const 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+
209231
function 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

226248
function 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+
232261
WeekCalendar.displayName = 'WeekCalendar';
233262

234263
export default WeekCalendar;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import React from 'react';
2+
import {
3+
CalendarContextProviderProps,
4+
CalendarProvider,
5+
ExpandableCalendar,
6+
ExpandableCalendarProps
7+
} from 'react-native-calendars';
8+
import {toMarkingFormat} from '../../interface';
9+
10+
const XDate = require('xdate');
11+
12+
const today = new XDate();
13+
export const testIdExpandableCalendar = 'myExpandableCalendar';
14+
15+
export const expandableCalendarTestIDs = (testId: string) => {
16+
return {
17+
leftArrow: `${testId}.leftArrow`,
18+
rightArrow: `${testId}.rightArrow`,
19+
};
20+
};
21+
export const generateExpandableCalendarWithContext = ({
22+
expandableCalendarProps,
23+
calendarContextProps,
24+
}: {
25+
expandableCalendarProps?: Partial<ExpandableCalendarProps>;
26+
calendarContextProps?: Partial<CalendarContextProviderProps>;
27+
} = {}) => {
28+
const defaultContextProps: CalendarContextProviderProps = {
29+
date: toMarkingFormat(today),
30+
showTodayButton: true,
31+
};
32+
const defaultExpandableCalendarProps: ExpandableCalendarProps = {
33+
testID: testIdExpandableCalendar,
34+
};
35+
36+
return (
37+
<CalendarProvider {...defaultContextProps} {...calendarContextProps}>
38+
<ExpandableCalendar {...defaultExpandableCalendarProps} {...expandableCalendarProps}/>
39+
</CalendarProvider>
40+
);
41+
};

src/expandableCalendar/__test__/index.spec.js

Lines changed: 0 additions & 135 deletions
This file was deleted.

0 commit comments

Comments
 (0)