| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- import React, { useEffect, useState } from 'react';
- import { View } from 'react-native';
- import { Modal } from '../../Modal';
- import DateTimePicker, { DateType } from 'react-native-ui-datepicker';
- import dayjs from 'dayjs';
- import 'dayjs/locale/en';
- import calendar from 'dayjs/plugin/calendar';
- import updateLocale from 'dayjs/plugin/updateLocale';
- import localeData from 'dayjs/plugin/localeData';
- import customParseFormat from 'dayjs/plugin/customParseFormat';
- dayjs.locale('en');
- dayjs.extend(calendar);
- dayjs.extend(updateLocale);
- dayjs.extend(localeData);
- dayjs.extend(customParseFormat);
- import { styles } from './style';
- import { Colors } from '../../../theme';
- import { Button } from 'src/components/Button';
- import { ButtonVariants } from 'src/types/components';
- export default function RangeCalendar({
- isModalVisible,
- closeModal,
- allowRangeSelection = true,
- disableFutureDates = false,
- disablePastDates = false,
- highlightedDates,
- selectedDate
- }: {
- isModalVisible: boolean;
- closeModal: (startDate?: string | null, endDate?: string | null) => void;
- allowRangeSelection?: boolean;
- disableFutureDates?: boolean;
- disablePastDates?: boolean;
- highlightedDates?: string[];
- selectedDate?: string;
- }) {
- const [selectedStartDate, setSelectedStartDate] = useState<string | null>(null);
- const [selectedEndDate, setSelectedEndDate] = useState<string | null>(null);
- const [singleDate, setSingleDate] = useState<DateType>(undefined);
- const [startDate, setStartDate] = useState<DateType>(undefined);
- const [endDate, setEndDate] = useState<DateType>(undefined);
- useEffect(() => {
- if (selectedDate) {
- setSelectedStartDate(selectedDate);
- setSingleDate(dayjs(selectedDate));
- }
- }, [selectedDate]);
- const getDisabledDates = (date: DateType) => {
- const dateString = dayjs(date).format('YYYY-MM-DD');
- if (disableFutureDates) {
- if (dayjs(date).isAfter(dayjs(), 'day')) {
- return true;
- }
- }
- if (disablePastDates) {
- if (dayjs(date).isBefore(dayjs(), 'day')) {
- return true;
- }
- }
- if (highlightedDates && highlightedDates.length > 0) {
- return !highlightedDates.includes(dateString);
- }
- return false;
- };
- const handleDateChange = (params: any) => {
- if (allowRangeSelection) {
- setStartDate(params.startDate);
- setEndDate(params.endDate);
- if (params.startDate) {
- setSelectedStartDate(dayjs(params.startDate).format('YYYY-MM-DD'));
- }
- if (params.endDate) {
- setSelectedEndDate(dayjs(params.endDate).format('YYYY-MM-DD'));
- } else {
- setSelectedEndDate(null);
- }
- } else {
- setSingleDate(params.date);
- setSelectedStartDate(dayjs(params.date).format('YYYY-MM-DD'));
- setSelectedEndDate(null);
- }
- };
- const resetSelections = () => {
- closeModal();
- setSelectedStartDate(null);
- setSelectedEndDate(null);
- setStartDate(undefined);
- setEndDate(undefined);
- setSingleDate(undefined);
- };
- const handleClose = () => {
- closeModal(selectedStartDate, selectedEndDate);
- setSelectedStartDate(null);
- setSelectedEndDate(null);
- setStartDate(undefined);
- setEndDate(undefined);
- setSingleDate(undefined);
- };
- const minDate =
- highlightedDates && highlightedDates.length > 0 ? dayjs(highlightedDates[0]) : undefined;
- const maxDate =
- highlightedDates && highlightedDates.length > 0
- ? dayjs(highlightedDates[highlightedDates.length - 1])
- : undefined;
- return (
- <Modal
- visibleInPercent={'auto'}
- visible={isModalVisible}
- onRequestClose={resetSelections}
- headerTitle={allowRangeSelection ? 'Select Dates' : 'Select Date'}
- >
- <View style={styles.modalContent}>
- <DateTimePicker
- mode={allowRangeSelection ? 'range' : 'single'}
- date={singleDate}
- startDate={startDate}
- endDate={endDate}
- onChange={handleDateChange}
- minDate={minDate}
- maxDate={maxDate}
- disabledDates={getDisabledDates}
- firstDayOfWeek={1}
- timePicker={false}
- showOutsideDays={true}
- weekdaysFormat={'short'}
- styles={{
- header: {
- paddingBottom: 10
- },
- month_selector_label: {
- color: Colors.DARK_BLUE,
- fontWeight: 'bold',
- fontSize: 15
- },
- year_selector_label: {
- color: Colors.DARK_BLUE,
- fontWeight: 'bold',
- fontSize: 15
- },
- button_prev: {},
- button_next: {},
- weekday_label: {
- color: Colors.DARK_BLUE,
- fontWeight: 'bold',
- fontSize: 12
- },
- days: {},
- day_cell: {},
- day: {},
- day_label: {
- color: Colors.DARK_BLUE,
- fontSize: 14,
- fontWeight: 'normal'
- },
- today: {
- borderWidth: 1,
- borderRadius: 23,
- width: 46,
- height: 46,
- maxHeight: 46,
- borderColor: Colors.ORANGE
- },
- today_label: {
- color: Colors.DARK_BLUE,
- fontWeight: '500'
- },
- selected: {
- backgroundColor: Colors.ORANGE,
- borderRadius: 23,
- width: 46,
- height: 46,
- maxHeight: 46,
- marginVertical: 'auto',
- alignItems: 'center',
- justifyContent: 'center'
- },
- selected_label: {
- color: 'white',
- fontWeight: '500'
- },
- range_start: {
- backgroundColor: Colors.ORANGE,
- borderRadius: 23,
- width: 46,
- height: 46,
- alignItems: 'center',
- justifyContent: 'center'
- },
- range_start_label: {
- color: 'white'
- },
- range_end: {
- backgroundColor: Colors.ORANGE,
- borderRadius: 23,
- width: 46,
- height: 46,
- alignItems: 'center',
- justifyContent: 'center'
- },
- range_end_label: {
- color: 'white'
- },
- range_middle_label: {
- color: Colors.DARK_BLUE,
- fontWeight: '500'
- },
- range_fill: {
- backgroundColor: Colors.ORANGE,
- opacity: 0.2
- },
- disabled: {
- opacity: 0.3
- },
- disabled_label: {
- color: Colors.TEXT_GRAY
- },
- outside_label: {
- color: Colors.LIGHT_GRAY
- }
- }}
- />
- </View>
- <View style={styles.modalFooter}>
- <Button
- children="Done"
- onPress={handleClose}
- disabled={!selectedStartDate}
- variant={!selectedStartDate ? ButtonVariants.OPACITY : ButtonVariants.FILL}
- containerStyles={{ borderWidth: 0 }}
- />
- </View>
- </Modal>
- );
- }
|