Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
146 changes: 101 additions & 45 deletions src/Date/Calendar.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { View } from 'react-native'
import Swiper from './Swiper'
import Month from './Month'
import Year from './Year'
import {
areDatesOnSameDay,
dateToUnix,
Expand All @@ -18,7 +19,7 @@ import { darkenBy, lightenBy, useLatest } from '../shared/utils'
import { sharedStyles } from '../shared/styles'
import { defaultStartYear, defaultEndYear } from './dateUtils'

export type ModeType = 'single' | 'range' | 'multiple'
export type ModeType = 'single' | 'range' | 'multiple' | 'month'

export type ScrollModeType = 'horizontal' | 'vertical'

Expand Down Expand Up @@ -80,8 +81,14 @@ export interface CalendarMultiProps extends BaseCalendarProps {
onChange: MultiChange
}

export interface CalendarMonthProps extends BaseCalendarProps {
mode: 'month'
date: CalendarDate
onChange: SingleChange
}

function Calendar(
props: CalendarSingleProps | CalendarRangeProps | CalendarMultiProps
props: CalendarSingleProps | CalendarRangeProps | CalendarMultiProps | CalendarMonthProps
) {
const {
locale,
Expand Down Expand Up @@ -128,7 +135,7 @@ function Calendar(

const onPressDate = useCallback(
(d: Date) => {
if (mode === 'single') {
if (mode === 'single' || mode === 'month') {
;(onChangeRef.current as SingleChange)({
date: dateMode === 'start' ? d : getEndOfDay(d),
})
Expand Down Expand Up @@ -174,48 +181,97 @@ function Calendar(

return (
<View style={sharedStyles.root}>
<Swiper
initialIndex={getInitialIndex(firstDate, startYear, endYear)}
selectedYear={selectedYear}
scrollMode={scrollMode}
startWeekOnMonday={startWeekOnMonday || false}
startYear={startYear}
endYear={endYear}
renderItem={({ index }) => (
<Month
locale={locale}
mode={mode}
key={index}
validRange={validRange}
index={index}
startDate={startDate}
endDate={endDate}
date={date}
dates={dates}
onPressYear={onPressYear}
selectingYear={selectingYear}
onPressDate={onPressDate}
scrollMode={scrollMode}
primaryColor={theme.colors.primary}
selectColor={selectColor}
roundness={theme.roundness}
disableWeekDays={disableWeekDays}
startWeekOnMonday={startWeekOnMonday || false}
startYear={startYear}
endYear={endYear}
/>
)}
renderHeader={({ onPrev, onNext }) => (
<CalendarHeader
locale={locale}
onPrev={onPrev}
onNext={onNext}
scrollMode={scrollMode}
disableWeekDays={disableWeekDays}
startWeekOnMonday={startWeekOnMonday || false}
/>
)}
/>
{mode === 'month' ? (
<Swiper
initialIndex={getInitialIndex(firstDate, startYear, endYear)}
selectedYear={selectedYear}
scrollMode={scrollMode}
startWeekOnMonday={startWeekOnMonday || false}
yearOnly={true}
startYear={startYear}
endYear={endYear}
renderItem={({ index }) => (
<Year
locale={locale}
mode={mode}
key={index}
validRange={validRange}
index={index}
startDate={startDate}
endDate={endDate}
date={date}
dates={dates}
onPressYear={onPressYear}
selectingYear={selectingYear}
onPressDate={onPressDate}
scrollMode={scrollMode}
primaryColor={theme.colors.primary}
selectColor={selectColor}
roundness={theme.roundness}
disableWeekDays={disableWeekDays}
startWeekOnMonday={startWeekOnMonday || false}
startYear={startYear}
endYear={endYear}
/>
)}
renderHeader={({ onPrev, onNext }) => (
<CalendarHeader
locale={locale}
onPrev={onPrev}
onNext={onNext}
scrollMode={scrollMode}
disableWeekDays={disableWeekDays}
startWeekOnMonday={startWeekOnMonday || false}
hideDays={true}
/>
)}
/>
) : (
<Swiper
initialIndex={getInitialIndex(firstDate, startYear, endYear)}
selectedYear={selectedYear}
scrollMode={scrollMode}
startWeekOnMonday={startWeekOnMonday || false}
yearOnly={false}
startYear={startYear}
endYear={endYear}
renderItem={({ index }) => (
<Month
locale={locale}
mode={mode}
key={index}
validRange={validRange}
index={index}
startDate={startDate}
endDate={endDate}
date={date}
dates={dates}
onPressYear={onPressYear}
selectingYear={selectingYear}
onPressDate={onPressDate}
scrollMode={scrollMode}
primaryColor={theme.colors.primary}
selectColor={selectColor}
roundness={theme.roundness}
disableWeekDays={disableWeekDays}
startWeekOnMonday={startWeekOnMonday || false}
startYear={startYear}
endYear={endYear}
/>
)}
renderHeader={({ onPrev, onNext }) => (
<CalendarHeader
locale={locale}
onPrev={onPrev}
onNext={onNext}
scrollMode={scrollMode}
disableWeekDays={disableWeekDays}
startWeekOnMonday={startWeekOnMonday || false}
hideDays={false}
/>
)}
/>
)}
{scrollMode === 'horizontal' ? (
<YearPicker
selectedYear={selectedYear}
Expand Down
18 changes: 11 additions & 7 deletions src/Date/CalendarHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ function CalendarHeader({
onPrev,
onNext,
disableWeekDays,
hideDays,
locale,
startWeekOnMonday,
}: {
Expand All @@ -35,13 +36,14 @@ function CalendarHeader({
onPrev: () => any
onNext: () => any
disableWeekDays?: DisableWeekDaysType
hideDays: boolean
startWeekOnMonday: boolean
}) {
const isHorizontal = scrollMode === 'horizontal'

const theme = useTheme()

return (
return isHorizontal || !hideDays ? (
<View style={styles.datePickerHeader} pointerEvents={'box-none'}>
{isHorizontal ? (
<View style={styles.buttonContainer} pointerEvents={'box-none'}>
Expand All @@ -62,13 +64,15 @@ function CalendarHeader({
</View>
</View>
) : null}
<DayNames
disableWeekDays={disableWeekDays}
locale={locale}
startWeekOnMonday={startWeekOnMonday}
/>
{hideDays ? null : (
<DayNames
disableWeekDays={disableWeekDays}
locale={locale}
startWeekOnMonday={startWeekOnMonday}
/>
)}
</View>
)
) : null
}

const styles = StyleSheet.create({
Expand Down
1 change: 1 addition & 0 deletions src/Date/DatePickerInput.shared.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export type DatePickerInputProps = {
uppercase?: boolean
startYear?: number
endYear?: number
monthOnly?: boolean
onChangeText?: (text: string | undefined) => void
inputEnabled?: boolean
disableStatusBarPadding?: boolean
Expand Down
4 changes: 3 additions & 1 deletion src/Date/DatePickerInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ function DatePickerInput(
disableCalendarIcon = false,
animationType = Platform.select({ web: 'none', default: 'slide' }),
presentationStyle = 'overFullScreen',
monthOnly = false,
...rest
}: DatePickerInputProps,
ref: any
Expand All @@ -37,6 +38,7 @@ function DatePickerInput(
return (
<DatePickerInputWithoutModal
ref={ref}
monthOnly={monthOnly}
{...rest}
inputButton={
withModal ? (
Expand Down Expand Up @@ -70,7 +72,7 @@ function DatePickerInput(
withModal ? (
<DatePickerModal
date={value}
mode="single"
mode={monthOnly ? 'month' : 'single'}
visible={visible}
onDismiss={onDismiss}
onConfirm={onInnerConfirm}
Expand Down
5 changes: 5 additions & 0 deletions src/Date/DatePickerInputWithoutModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ function DatePickerInputWithoutModal(
uppercase,
startYear,
endYear,
monthOnly = false,
onChangeText,
inputEnabled,
disableStatusBarPadding,
Expand All @@ -41,6 +42,7 @@ function DatePickerInputWithoutModal(
uppercase: DatePickerInputProps['uppercase']
startYear: DatePickerInputProps['startYear']
endYear: DatePickerInputProps['endYear']
monthOnly: DatePickerInputProps['monthOnly']
inputEnabled: DatePickerInputProps['inputEnabled']
disableStatusBarPadding: DatePickerInputProps['disableStatusBarPadding']
startWeekOnMonday?: DatePickerInputProps['startWeekOnMonday']
Expand All @@ -50,6 +52,7 @@ function DatePickerInputWithoutModal(
ref: any
) {
const theme = useTheme()

const {
formattedValue,
inputFormat,
Expand All @@ -60,6 +63,7 @@ function DatePickerInputWithoutModal(
value,
validRange,
inputMode,
monthOnly,
onChange,
onValidationError,
})
Expand Down Expand Up @@ -117,6 +121,7 @@ function DatePickerInputWithoutModal(
uppercase,
startYear,
endYear,
monthOnly,
inputEnabled,
disableStatusBarPadding,
startWeekOnMonday,
Expand Down
6 changes: 6 additions & 0 deletions src/Date/DatePickerModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
} from 'react-native'
import { useTheme } from 'react-native-paper'
import DatePickerModalContent, {
DatePickerModalContentMonthProps,
DatePickerModalContentMultiProps,
DatePickerModalContentRangeProps,
DatePickerModalContentSingleProps,
Expand Down Expand Up @@ -37,11 +38,16 @@ export interface DatePickerModalRangeProps
extends DatePickerModalContentRangeProps,
DatePickerModalProps {}

export interface DatePickerModalMonthProps
extends DatePickerModalContentMonthProps,
DatePickerModalProps {}

export function DatePickerModal(
props:
| DatePickerModalRangeProps
| DatePickerModalSingleProps
| DatePickerModalMultiProps
| DatePickerModalMonthProps
) {
const {
visible,
Expand Down
16 changes: 16 additions & 0 deletions src/Date/DatePickerModalContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,23 @@ export interface DatePickerModalContentMultiProps
onConfirm: MultiConfirm
}

export interface DatePickerModalContentMonthProps
extends HeaderPickProps,
BaseCalendarProps,
DatePickerModalContentBaseProps {
mode: 'month'
date?: CalendarDate
onChange?: SingleChange
onConfirm: SingleChange
dateMode?: 'start' | 'end'
}

export function DatePickerModalContent(
props:
| DatePickerModalContentRangeProps
| DatePickerModalContentSingleProps
| DatePickerModalContentMultiProps
| DatePickerModalContentMonthProps
) {
const {
mode,
Expand Down Expand Up @@ -139,6 +151,10 @@ export function DatePickerModalContent(
;(onConfirm as DatePickerModalContentMultiProps['onConfirm'])({
dates: state.dates || [],
})
} else if (mode === 'month') {
;(onConfirm as DatePickerModalContentMonthProps['onConfirm'])({
date: state.date,
})
}
}, [state, mode, onConfirm])

Expand Down
Loading