index.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import React, { useMemo, useState } from 'react';
  2. import { View } from 'react-native';
  3. import CalendarPicker, { CustomDatesStylesFunc, CustomDayHeaderStylesFunc } from 'react-native-calendar-picker';
  4. import moment from 'moment';
  5. import { Modal } from '../../Modal';
  6. import Navigation from './Navigation';
  7. import { styles } from './style';
  8. import { Colors } from '../../../theme';
  9. export default function RangeCalendar(
  10. { isModalVisible, closeModal }: { isModalVisible: boolean, closeModal: () => void }
  11. ) {
  12. const [selectedStartDate, setSelectedStartDate] = useState<Date | null>(null);
  13. const [selectedEndDate, setSelectedEndDate] = useState<Date | null>(null);
  14. const handleOnDateChange = (date: Date, type: string) => {
  15. if (type === 'END_DATE') {
  16. setSelectedEndDate(date);
  17. } else {
  18. setSelectedStartDate(date);
  19. setSelectedEndDate(null);
  20. }
  21. };
  22. const customDayHeaderStyles: CustomDayHeaderStylesFunc = () => {
  23. return {
  24. textStyle: styles.dayHeader,
  25. };
  26. };
  27. const customSelectedDatesStyles: CustomDatesStylesFunc = useMemo(() => {
  28. return (date: moment.Moment) => {
  29. if (date.isSame(moment(), 'day')) {
  30. return {
  31. containerStyle: {},
  32. textStyle: {
  33. borderWidth: 1,
  34. borderColor: Colors.DARK_BLUE,
  35. borderRadius: 17,
  36. height: 34,
  37. width: 34,
  38. textAlign: 'center',
  39. verticalAlign: 'middle',
  40. },
  41. style: {
  42. backgroundColor: Colors.WHITE,
  43. }
  44. };
  45. }
  46. return {
  47. containerStyle: {},
  48. textStyle: {},
  49. };
  50. };
  51. }, []);
  52. const resetSelections = () => {
  53. closeModal();
  54. setSelectedStartDate(null);
  55. setSelectedEndDate(null);
  56. };
  57. const prevNavigationComponent = useMemo(() => <Navigation direction="prev" />, []);
  58. const nextNavigationComponent = useMemo(() => <Navigation direction="next" />, []);
  59. return (
  60. <Modal
  61. visibleInPercent={'70%'}
  62. visible={isModalVisible}
  63. onRequestClose={resetSelections}
  64. headerTitle='Select Date'
  65. >
  66. <View style={styles.modalContent}>
  67. <CalendarPicker
  68. scaleFactor={400}
  69. allowRangeSelection
  70. allowBackwardRangeSelect
  71. onDateChange={handleOnDateChange as any}
  72. selectedStartDate={selectedStartDate as Date}
  73. selectedEndDate={selectedEndDate as Date}
  74. scrollable
  75. showDayStragglers
  76. previousComponent={prevNavigationComponent}
  77. nextComponent={nextNavigationComponent}
  78. dayLabelsWrapper={styles.labelsWrapper}
  79. selectedRangeStyle={styles.rangeStyle}
  80. selectedRangeEndTextStyle={styles.rangeStartEndTextStyle}
  81. selectedRangeStartTextStyle={styles.rangeStartEndTextStyle}
  82. selectedRangeEndStyle={[styles.rangeStartEndStyle, styles.rangeEndStyle]}
  83. selectedRangeStartStyle={[styles.rangeStartEndStyle, styles.rangeStartStyle]}
  84. customDayHeaderStyles={customDayHeaderStyles}
  85. customDatesStyles={customSelectedDatesStyles}
  86. disabledDatesTextStyle={styles.disabledDates}
  87. textStyle={styles.textStyle}
  88. monthTitleStyle={styles.dateTitle}
  89. yearTitleStyle={styles.dateTitle}
  90. headerWrapperStyle={styles.headerWrapper}
  91. />
  92. </View>
  93. </Modal>
  94. );
  95. }