react-native-bikram-sambat 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +44 -211
  3. package/lib/commonjs/accessibility/index.js +1 -1
  4. package/lib/commonjs/accessibility/labels.js +3 -4
  5. package/lib/commonjs/accessibility/labels.js.map +1 -1
  6. package/lib/commonjs/calendar/get-calendar-month-grid.js +5 -5
  7. package/lib/commonjs/calendar/index.js +1 -1
  8. package/lib/commonjs/components/NepaliCalendar/CalendarDay.js +10 -43
  9. package/lib/commonjs/components/NepaliCalendar/CalendarDay.js.map +1 -1
  10. package/lib/commonjs/components/NepaliCalendar/CalendarGrid.js +8 -25
  11. package/lib/commonjs/components/NepaliCalendar/CalendarGrid.js.map +1 -1
  12. package/lib/commonjs/components/NepaliCalendar/CalendarHeader.js +26 -14
  13. package/lib/commonjs/components/NepaliCalendar/CalendarHeader.js.map +1 -1
  14. package/lib/commonjs/components/NepaliCalendar/NepaliCalendar.js +119 -87
  15. package/lib/commonjs/components/NepaliCalendar/NepaliCalendar.js.map +1 -1
  16. package/lib/commonjs/components/NepaliCalendar/index.js +1 -1
  17. package/lib/commonjs/core/arithmetic.js +3 -3
  18. package/lib/commonjs/core/bsData.js +107 -8
  19. package/lib/commonjs/core/bsData.js.map +1 -1
  20. package/lib/commonjs/core/conversion.js +4 -4
  21. package/lib/commonjs/core/conversion.js.map +1 -1
  22. package/lib/commonjs/core/dateKey.js +1 -1
  23. package/lib/commonjs/core/format/format.js +9 -9
  24. package/lib/commonjs/core/format/format.js.map +1 -1
  25. package/lib/commonjs/core/format/index.js +2 -2
  26. package/lib/commonjs/core/format/parse.js +3 -3
  27. package/lib/commonjs/core/format/parse.js.map +1 -1
  28. package/lib/commonjs/core/index.js +19 -19
  29. package/lib/commonjs/core/index.js.map +1 -1
  30. package/lib/commonjs/core/locale/index.js +2 -2
  31. package/lib/commonjs/core/numerals/index.js +1 -1
  32. package/lib/commonjs/core/validation.js +4 -3
  33. package/lib/commonjs/core/validation.js.map +1 -1
  34. package/lib/commonjs/index.js +24 -46
  35. package/lib/commonjs/index.js.map +1 -1
  36. package/lib/commonjs/package.json +1 -0
  37. package/lib/commonjs/theme/create-theme.js +1 -1
  38. package/lib/commonjs/theme/default-theme.js +2 -22
  39. package/lib/commonjs/theme/default-theme.js.map +1 -1
  40. package/lib/commonjs/theme/index.js +2 -2
  41. package/lib/commonjs/utils/date-helpers.js +4 -12
  42. package/lib/commonjs/utils/date-helpers.js.map +1 -1
  43. package/lib/commonjs/utils/index.js +1 -1
  44. package/lib/module/accessibility/index.js +1 -1
  45. package/lib/module/accessibility/index.js.map +1 -1
  46. package/lib/module/accessibility/labels.js +2 -3
  47. package/lib/module/accessibility/labels.js.map +1 -1
  48. package/lib/module/calendar/get-calendar-month-grid.js +6 -6
  49. package/lib/module/calendar/get-calendar-month-grid.js.map +1 -1
  50. package/lib/module/calendar/index.js +1 -1
  51. package/lib/module/calendar/index.js.map +1 -1
  52. package/lib/module/components/NepaliCalendar/CalendarDay.js +9 -42
  53. package/lib/module/components/NepaliCalendar/CalendarDay.js.map +1 -1
  54. package/lib/module/components/NepaliCalendar/CalendarGrid.js +8 -25
  55. package/lib/module/components/NepaliCalendar/CalendarGrid.js.map +1 -1
  56. package/lib/module/components/NepaliCalendar/CalendarHeader.js +22 -10
  57. package/lib/module/components/NepaliCalendar/CalendarHeader.js.map +1 -1
  58. package/lib/module/components/NepaliCalendar/NepaliCalendar.js +102 -70
  59. package/lib/module/components/NepaliCalendar/NepaliCalendar.js.map +1 -1
  60. package/lib/module/components/NepaliCalendar/index.js +1 -1
  61. package/lib/module/components/NepaliCalendar/index.js.map +1 -1
  62. package/lib/module/core/arithmetic.js +3 -3
  63. package/lib/module/core/arithmetic.js.map +1 -1
  64. package/lib/module/core/bsData.js +107 -8
  65. package/lib/module/core/bsData.js.map +1 -1
  66. package/lib/module/core/conversion.js +4 -4
  67. package/lib/module/core/conversion.js.map +1 -1
  68. package/lib/module/core/dateKey.js +1 -1
  69. package/lib/module/core/dateKey.js.map +1 -1
  70. package/lib/module/core/format/format.js +6 -6
  71. package/lib/module/core/format/format.js.map +1 -1
  72. package/lib/module/core/format/index.js +2 -2
  73. package/lib/module/core/format/index.js.map +1 -1
  74. package/lib/module/core/format/parse.js +2 -2
  75. package/lib/module/core/format/parse.js.map +1 -1
  76. package/lib/module/core/index.js +10 -10
  77. package/lib/module/core/index.js.map +1 -1
  78. package/lib/module/core/locale/index.js +2 -2
  79. package/lib/module/core/locale/index.js.map +1 -1
  80. package/lib/module/core/numerals/index.js +1 -1
  81. package/lib/module/core/numerals/index.js.map +1 -1
  82. package/lib/module/core/validation.js +4 -3
  83. package/lib/module/core/validation.js.map +1 -1
  84. package/lib/module/index.js +6 -8
  85. package/lib/module/index.js.map +1 -1
  86. package/lib/module/package.json +1 -0
  87. package/lib/module/theme/create-theme.js +1 -1
  88. package/lib/module/theme/create-theme.js.map +1 -1
  89. package/lib/module/theme/default-theme.js +2 -22
  90. package/lib/module/theme/default-theme.js.map +1 -1
  91. package/lib/module/theme/index.js +2 -2
  92. package/lib/module/theme/index.js.map +1 -1
  93. package/lib/module/utils/date-helpers.js +2 -10
  94. package/lib/module/utils/date-helpers.js.map +1 -1
  95. package/lib/module/utils/index.js +1 -1
  96. package/lib/module/utils/index.js.map +1 -1
  97. package/lib/typescript/src/accessibility/labels.d.ts +1 -1
  98. package/lib/typescript/src/accessibility/labels.d.ts.map +1 -1
  99. package/lib/typescript/src/components/NepaliCalendar/CalendarDay.d.ts +1 -5
  100. package/lib/typescript/src/components/NepaliCalendar/CalendarDay.d.ts.map +1 -1
  101. package/lib/typescript/src/components/NepaliCalendar/CalendarGrid.d.ts +1 -4
  102. package/lib/typescript/src/components/NepaliCalendar/CalendarGrid.d.ts.map +1 -1
  103. package/lib/typescript/src/components/NepaliCalendar/CalendarHeader.d.ts +1 -0
  104. package/lib/typescript/src/components/NepaliCalendar/CalendarHeader.d.ts.map +1 -1
  105. package/lib/typescript/src/components/NepaliCalendar/NepaliCalendar.d.ts +1 -1
  106. package/lib/typescript/src/components/NepaliCalendar/NepaliCalendar.d.ts.map +1 -1
  107. package/lib/typescript/src/components/NepaliCalendar/types.d.ts +6 -10
  108. package/lib/typescript/src/components/NepaliCalendar/types.d.ts.map +1 -1
  109. package/lib/typescript/src/core/bsData.d.ts.map +1 -1
  110. package/lib/typescript/src/core/validation.d.ts.map +1 -1
  111. package/lib/typescript/src/index.d.ts +0 -2
  112. package/lib/typescript/src/index.d.ts.map +1 -1
  113. package/lib/typescript/src/theme/default-theme.d.ts.map +1 -1
  114. package/lib/typescript/src/theme/types.d.ts +0 -10
  115. package/lib/typescript/src/theme/types.d.ts.map +1 -1
  116. package/lib/typescript/src/utils/date-helpers.d.ts +0 -4
  117. package/lib/typescript/src/utils/date-helpers.d.ts.map +1 -1
  118. package/package.json +4 -8
  119. package/src/accessibility/labels.ts +0 -2
  120. package/src/components/NepaliCalendar/CalendarDay.tsx +6 -65
  121. package/src/components/NepaliCalendar/CalendarGrid.tsx +12 -32
  122. package/src/components/NepaliCalendar/CalendarHeader.tsx +18 -2
  123. package/src/components/NepaliCalendar/NepaliCalendar.tsx +128 -56
  124. package/src/components/NepaliCalendar/types.ts +3 -12
  125. package/src/core/bsData.ts +105 -6
  126. package/src/core/conversion.ts +1 -1
  127. package/src/core/validation.ts +7 -1
  128. package/src/index.ts +0 -2
  129. package/src/theme/default-theme.ts +0 -20
  130. package/src/theme/types.ts +0 -10
  131. package/src/utils/date-helpers.ts +0 -12
  132. package/lib/commonjs/components/NepaliDatePicker/DatePickerModal.js +0 -185
  133. package/lib/commonjs/components/NepaliDatePicker/DatePickerModal.js.map +0 -1
  134. package/lib/commonjs/components/NepaliDatePicker/NepaliDatePicker.js +0 -148
  135. package/lib/commonjs/components/NepaliDatePicker/NepaliDatePicker.js.map +0 -1
  136. package/lib/commonjs/components/NepaliDatePicker/index.js +0 -20
  137. package/lib/commonjs/components/NepaliDatePicker/index.js.map +0 -1
  138. package/lib/commonjs/components/NepaliDatePicker/types.js +0 -6
  139. package/lib/commonjs/components/NepaliDatePicker/types.js.map +0 -1
  140. package/lib/commonjs/components/NepaliRangePicker/NepaliRangePicker.js +0 -187
  141. package/lib/commonjs/components/NepaliRangePicker/NepaliRangePicker.js.map +0 -1
  142. package/lib/commonjs/components/NepaliRangePicker/RangePickerModal.js +0 -275
  143. package/lib/commonjs/components/NepaliRangePicker/RangePickerModal.js.map +0 -1
  144. package/lib/commonjs/components/NepaliRangePicker/index.js +0 -57
  145. package/lib/commonjs/components/NepaliRangePicker/index.js.map +0 -1
  146. package/lib/commonjs/components/NepaliRangePicker/range-utils.js +0 -70
  147. package/lib/commonjs/components/NepaliRangePicker/range-utils.js.map +0 -1
  148. package/lib/commonjs/components/NepaliRangePicker/types.js +0 -6
  149. package/lib/commonjs/components/NepaliRangePicker/types.js.map +0 -1
  150. package/lib/module/components/NepaliDatePicker/DatePickerModal.js +0 -180
  151. package/lib/module/components/NepaliDatePicker/DatePickerModal.js.map +0 -1
  152. package/lib/module/components/NepaliDatePicker/NepaliDatePicker.js +0 -143
  153. package/lib/module/components/NepaliDatePicker/NepaliDatePicker.js.map +0 -1
  154. package/lib/module/components/NepaliDatePicker/index.js +0 -5
  155. package/lib/module/components/NepaliDatePicker/index.js.map +0 -1
  156. package/lib/module/components/NepaliDatePicker/types.js +0 -4
  157. package/lib/module/components/NepaliDatePicker/types.js.map +0 -1
  158. package/lib/module/components/NepaliRangePicker/NepaliRangePicker.js +0 -182
  159. package/lib/module/components/NepaliRangePicker/NepaliRangePicker.js.map +0 -1
  160. package/lib/module/components/NepaliRangePicker/RangePickerModal.js +0 -270
  161. package/lib/module/components/NepaliRangePicker/RangePickerModal.js.map +0 -1
  162. package/lib/module/components/NepaliRangePicker/index.js +0 -6
  163. package/lib/module/components/NepaliRangePicker/index.js.map +0 -1
  164. package/lib/module/components/NepaliRangePicker/range-utils.js +0 -61
  165. package/lib/module/components/NepaliRangePicker/range-utils.js.map +0 -1
  166. package/lib/module/components/NepaliRangePicker/types.js +0 -4
  167. package/lib/module/components/NepaliRangePicker/types.js.map +0 -1
  168. package/lib/typescript/src/components/NepaliDatePicker/DatePickerModal.d.ts +0 -4
  169. package/lib/typescript/src/components/NepaliDatePicker/DatePickerModal.d.ts.map +0 -1
  170. package/lib/typescript/src/components/NepaliDatePicker/NepaliDatePicker.d.ts +0 -4
  171. package/lib/typescript/src/components/NepaliDatePicker/NepaliDatePicker.d.ts.map +0 -1
  172. package/lib/typescript/src/components/NepaliDatePicker/index.d.ts +0 -4
  173. package/lib/typescript/src/components/NepaliDatePicker/index.d.ts.map +0 -1
  174. package/lib/typescript/src/components/NepaliDatePicker/types.d.ts +0 -50
  175. package/lib/typescript/src/components/NepaliDatePicker/types.d.ts.map +0 -1
  176. package/lib/typescript/src/components/NepaliRangePicker/NepaliRangePicker.d.ts +0 -4
  177. package/lib/typescript/src/components/NepaliRangePicker/NepaliRangePicker.d.ts.map +0 -1
  178. package/lib/typescript/src/components/NepaliRangePicker/RangePickerModal.d.ts +0 -4
  179. package/lib/typescript/src/components/NepaliRangePicker/RangePickerModal.d.ts.map +0 -1
  180. package/lib/typescript/src/components/NepaliRangePicker/index.d.ts +0 -5
  181. package/lib/typescript/src/components/NepaliRangePicker/index.d.ts.map +0 -1
  182. package/lib/typescript/src/components/NepaliRangePicker/range-utils.d.ts +0 -13
  183. package/lib/typescript/src/components/NepaliRangePicker/range-utils.d.ts.map +0 -1
  184. package/lib/typescript/src/components/NepaliRangePicker/types.d.ts +0 -61
  185. package/lib/typescript/src/components/NepaliRangePicker/types.d.ts.map +0 -1
  186. package/src/components/NepaliDatePicker/DatePickerModal.tsx +0 -220
  187. package/src/components/NepaliDatePicker/NepaliDatePicker.tsx +0 -171
  188. package/src/components/NepaliDatePicker/index.ts +0 -3
  189. package/src/components/NepaliDatePicker/types.ts +0 -70
  190. package/src/components/NepaliRangePicker/NepaliRangePicker.tsx +0 -206
  191. package/src/components/NepaliRangePicker/RangePickerModal.tsx +0 -336
  192. package/src/components/NepaliRangePicker/index.ts +0 -11
  193. package/src/components/NepaliRangePicker/range-utils.ts +0 -75
  194. package/src/components/NepaliRangePicker/types.ts +0 -84
@@ -1,3 +0,0 @@
1
- export { NepaliDatePicker } from './NepaliDatePicker';
2
- export { DatePickerModal } from './DatePickerModal';
3
- export type { NepaliDatePickerProps, DatePickerModalProps } from './types';
@@ -1,70 +0,0 @@
1
- import type { BSDateValue } from '../../core/types';
2
- import type { LocaleCode, CalendarLocale, NumeralSystem } from '../../core/locale';
3
- import type { CalendarTheme } from '../../theme/types';
4
- import type { CalendarMarkedDate } from '../NepaliCalendar/types';
5
-
6
- export type NepaliDatePickerProps = {
7
- value?: BSDateValue | null;
8
- defaultValue?: BSDateValue;
9
- onChange?: (date: BSDateValue) => void;
10
-
11
- placeholder?: string;
12
- disabled?: boolean;
13
-
14
- locale?: LocaleCode | CalendarLocale;
15
- numerals?: NumeralSystem;
16
-
17
- displayFormat?: string;
18
-
19
- minDate?: BSDateValue;
20
- maxDate?: BSDateValue;
21
-
22
- markedDates?: Record<string, CalendarMarkedDate>;
23
- disabledDates?: string[] | ((date: BSDateValue) => boolean);
24
-
25
- weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
26
-
27
- theme?: Partial<CalendarTheme>;
28
- colorScheme?: 'light' | 'dark' | 'system';
29
-
30
- modalTitle?: string;
31
- confirmText?: string;
32
- cancelText?: string;
33
-
34
- onOpen?: () => void;
35
- onClose?: () => void;
36
-
37
- testID?: string;
38
- };
39
-
40
- export type DatePickerModalProps = {
41
- visible: boolean;
42
-
43
- value?: BSDateValue | null;
44
- defaultValue?: BSDateValue;
45
-
46
- onChange?: (date: BSDateValue) => void;
47
- onConfirm?: (date: BSDateValue) => void;
48
- onCancel?: () => void;
49
- onClose?: () => void;
50
-
51
- locale?: LocaleCode | CalendarLocale;
52
- numerals?: NumeralSystem;
53
-
54
- minDate?: BSDateValue;
55
- maxDate?: BSDateValue;
56
-
57
- markedDates?: Record<string, CalendarMarkedDate>;
58
- disabledDates?: string[] | ((date: BSDateValue) => boolean);
59
-
60
- weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
61
-
62
- theme?: Partial<CalendarTheme>;
63
- colorScheme?: 'light' | 'dark' | 'system';
64
-
65
- title?: string;
66
- confirmText?: string;
67
- cancelText?: string;
68
-
69
- testID?: string;
70
- };
@@ -1,206 +0,0 @@
1
- import React, { useState, useMemo, useCallback, useEffect } from 'react';
2
- import { Pressable, Text, StyleSheet } from 'react-native';
3
- import { isValidBSDate, isBSDateInSupportedRange } from '../../core/validation';
4
- import { useCalendarTheme } from '../../theme';
5
- import { safeFormatBSDate, warnOutOfRangeInDev, warnMinMaxInDev } from '../../utils';
6
- import { RangePickerModal } from './RangePickerModal';
7
- import type { NepaliRangePickerProps, DateRangeValue } from './types';
8
-
9
- export function NepaliRangePicker({
10
- value,
11
- defaultValue,
12
- onChange,
13
- placeholder = 'Select date range',
14
- disabled = false,
15
- locale,
16
- numerals,
17
- displayFormat = 'yyyy-MM-dd',
18
- minDate,
19
- maxDate,
20
- markedDates,
21
- disabledDates,
22
- weekStartsOn,
23
- allowSameDay = true,
24
- theme,
25
- colorScheme,
26
- modalTitle,
27
- confirmText,
28
- cancelText,
29
- clearText,
30
- onOpen,
31
- onClose,
32
- testID,
33
- }: NepaliRangePickerProps) {
34
- const [modalVisible, setModalVisible] = useState(false);
35
- const calendarTheme = useCalendarTheme({ colorScheme, theme });
36
-
37
- const isControlled = value !== undefined;
38
- const [internalValue, setInternalValue] = useState<DateRangeValue>(
39
- defaultValue ?? { start: null, end: null }
40
- );
41
-
42
- useEffect(() => {
43
- if (value?.start) {
44
- if (!isValidBSDate(value.start)) {
45
- if (__DEV__) {
46
- console.warn(
47
- 'react-native-bikram-sambat: Invalid start date provided to NepaliRangePicker.',
48
- value.start
49
- );
50
- }
51
- } else if (!isBSDateInSupportedRange(value.start)) {
52
- warnOutOfRangeInDev(value.start, { min: 2000, max: 2090 });
53
- }
54
- }
55
- if (value?.end) {
56
- if (!isValidBSDate(value.end)) {
57
- if (__DEV__) {
58
- console.warn(
59
- 'react-native-bikram-sambat: Invalid end date provided to NepaliRangePicker.',
60
- value.end
61
- );
62
- }
63
- } else if (!isBSDateInSupportedRange(value.end)) {
64
- warnOutOfRangeInDev(value.end, { min: 2000, max: 2090 });
65
- }
66
- }
67
- }, [value]);
68
-
69
- useEffect(() => {
70
- warnMinMaxInDev(minDate, maxDate);
71
- }, [minDate, maxDate]);
72
-
73
- const currentValue = isControlled ? value : internalValue;
74
-
75
- const displayText = useMemo(() => {
76
- if (!currentValue || (!currentValue.start && !currentValue.end)) {
77
- return placeholder;
78
- }
79
-
80
- const startStr = currentValue.start
81
- ? safeFormatBSDate(currentValue.start, displayFormat, locale, numerals)
82
- : null;
83
- const endStr = currentValue.end
84
- ? safeFormatBSDate(currentValue.end, displayFormat, locale, numerals)
85
- : null;
86
-
87
- if (startStr && endStr) return `${startStr} → ${endStr}`;
88
- if (startStr) return `${startStr} → ...`;
89
- return placeholder;
90
- }, [currentValue, placeholder, displayFormat, locale, numerals]);
91
-
92
- const handleOpen = useCallback(() => {
93
- if (disabled) return;
94
- setModalVisible(true);
95
- onOpen?.();
96
- }, [disabled, onOpen]);
97
-
98
- const handleClose = useCallback(() => {
99
- setModalVisible(false);
100
- onClose?.();
101
- }, [onClose]);
102
-
103
- const handleChange = useCallback(
104
- (range: DateRangeValue) => {
105
- if (!isControlled) {
106
- setInternalValue(range);
107
- }
108
- onChange?.(range);
109
- },
110
- [isControlled, onChange]
111
- );
112
-
113
- const handleClear = useCallback(() => {
114
- if (!isControlled) {
115
- setInternalValue({ start: null, end: null });
116
- }
117
- onChange?.({ start: null, end: null });
118
- }, [isControlled, onChange]);
119
-
120
- const accessibilityLabel = useMemo(() => {
121
- if (disabled) return `${placeholder}, disabled`;
122
- if (currentValue?.start) {
123
- const startStr = safeFormatBSDate(currentValue.start, displayFormat, locale, numerals);
124
- const endStr = currentValue.end
125
- ? safeFormatBSDate(currentValue.end, displayFormat, locale, numerals)
126
- : null;
127
- if (startStr && endStr) return `${startStr} to ${endStr}`;
128
- if (startStr) return `${startStr}, start date selected`;
129
- }
130
- return placeholder;
131
- }, [currentValue, placeholder, displayFormat, locale, numerals, disabled]);
132
-
133
- return (
134
- <>
135
- <Pressable
136
- style={[
137
- styles.field,
138
- {
139
- borderColor: calendarTheme.colors.fieldBorder,
140
- backgroundColor: calendarTheme.colors.fieldBackground,
141
- },
142
- disabled && styles.fieldDisabled,
143
- ]}
144
- onPress={handleOpen}
145
- disabled={disabled}
146
- accessibilityRole="button"
147
- accessibilityLabel={accessibilityLabel}
148
- accessibilityState={{ disabled }}
149
- testID={testID}
150
- >
151
- <Text
152
- style={[
153
- styles.fieldText,
154
- {
155
- color: currentValue?.start
156
- ? calendarTheme.colors.text
157
- : calendarTheme.colors.placeholderText,
158
- },
159
- ]}
160
- >
161
- {displayText}
162
- </Text>
163
- </Pressable>
164
-
165
- <RangePickerModal
166
- visible={modalVisible}
167
- value={currentValue}
168
- defaultValue={defaultValue}
169
- onChange={handleChange}
170
- onClose={handleClose}
171
- onClear={handleClear}
172
- locale={locale}
173
- numerals={numerals}
174
- minDate={minDate}
175
- maxDate={maxDate}
176
- markedDates={markedDates}
177
- disabledDates={disabledDates}
178
- weekStartsOn={weekStartsOn}
179
- allowSameDay={allowSameDay}
180
- theme={theme}
181
- colorScheme={colorScheme}
182
- title={modalTitle}
183
- confirmText={confirmText}
184
- cancelText={cancelText}
185
- clearText={clearText}
186
- />
187
- </>
188
- );
189
- }
190
-
191
- const styles = StyleSheet.create({
192
- field: {
193
- borderWidth: 1,
194
- borderRadius: 10,
195
- paddingHorizontal: 16,
196
- paddingVertical: 14,
197
- alignItems: 'center',
198
- },
199
- fieldDisabled: {
200
- opacity: 0.5,
201
- },
202
- fieldText: {
203
- fontSize: 16,
204
- fontWeight: '500',
205
- },
206
- });
@@ -1,336 +0,0 @@
1
- import React, { useState, useEffect, useMemo, useCallback } from 'react';
2
- import {
3
- View,
4
- Text,
5
- Pressable,
6
- Modal,
7
- StyleSheet,
8
- TouchableWithoutFeedback,
9
- } from 'react-native';
10
- import type { BSDateValue } from '../../core/types';
11
- import { useCalendarTheme } from '../../theme';
12
- import { safeFormatBSDate, getSafeInitialBSDate } from '../../utils';
13
- import { NepaliCalendar } from '../NepaliCalendar';
14
- import type { RangePickerModalProps, DateRangeValue } from './types';
15
- import { selectRangeDate } from './range-utils';
16
-
17
- function getInitialTempRange(
18
- value: DateRangeValue | undefined,
19
- defaultValue: DateRangeValue | undefined
20
- ): DateRangeValue {
21
- const start = value?.start ? getSafeInitialBSDate(value.start, undefined) : null;
22
- const end = value?.end ? getSafeInitialBSDate(value.end, undefined) : null;
23
-
24
- if (start) {
25
- return { start, end };
26
- }
27
-
28
- const defStart = defaultValue?.start
29
- ? getSafeInitialBSDate(defaultValue.start, undefined)
30
- : null;
31
- const defEnd = defaultValue?.end
32
- ? getSafeInitialBSDate(defaultValue.end, undefined)
33
- : null;
34
-
35
- if (defStart) {
36
- return { start: defStart, end: defEnd };
37
- }
38
-
39
- return { start: null, end: null };
40
- }
41
-
42
- export function RangePickerModal({
43
- visible,
44
- value,
45
- defaultValue,
46
- onChange,
47
- onConfirm,
48
- onCancel,
49
- onClose,
50
- onClear,
51
- locale,
52
- numerals,
53
- minDate,
54
- maxDate,
55
- markedDates,
56
- disabledDates,
57
- weekStartsOn,
58
- theme,
59
- colorScheme,
60
- title = 'Select Date Range',
61
- confirmText = 'Confirm',
62
- cancelText = 'Cancel',
63
- clearText = 'Clear',
64
- allowSameDay = true,
65
- testID,
66
- }: RangePickerModalProps) {
67
- const calendarTheme = useCalendarTheme({ colorScheme, theme });
68
-
69
- const [tempRange, setTempRange] = useState<DateRangeValue>(() =>
70
- getInitialTempRange(value, defaultValue)
71
- );
72
-
73
- useEffect(() => {
74
- if (visible) {
75
- setTempRange(getInitialTempRange(value, defaultValue));
76
- }
77
- }, [visible, value, defaultValue]);
78
-
79
- const handleDateSelect = useCallback(
80
- (date: BSDateValue) => {
81
- setTempRange((prev) => selectRangeDate(prev, date, { allowSameDay }));
82
- },
83
- [allowSameDay]
84
- );
85
-
86
- const handleConfirm = useCallback(() => {
87
- if (!tempRange.start) return;
88
- onConfirm?.(tempRange);
89
- onChange?.(tempRange);
90
- onClose?.();
91
- }, [tempRange, onConfirm, onChange, onClose]);
92
-
93
- const handleCancel = useCallback(() => {
94
- onCancel?.();
95
- onClose?.();
96
- }, [onCancel, onClose]);
97
-
98
- const handleClear = useCallback(() => {
99
- setTempRange({ start: null, end: null });
100
- onClear?.();
101
- }, [onClear]);
102
-
103
- const handleBackdropPress = useCallback(() => {
104
- onCancel?.();
105
- onClose?.();
106
- }, [onCancel, onClose]);
107
-
108
- const rangeSummary = useMemo(() => {
109
- const startStr = tempRange.start
110
- ? safeFormatBSDate(tempRange.start, 'yyyy-MM-dd', locale, numerals)
111
- : null;
112
- const endStr = tempRange.end
113
- ? safeFormatBSDate(tempRange.end, 'yyyy-MM-dd', locale, numerals)
114
- : null;
115
-
116
- if (startStr && endStr) return `${startStr} → ${endStr}`;
117
- if (startStr) return `${startStr} → ...`;
118
- return `... → ...`;
119
- }, [tempRange, locale, numerals]);
120
-
121
- const isConfirmDisabled = tempRange.start == null || tempRange.end == null;
122
-
123
- const modalContent = useMemo(
124
- () => (
125
- <View
126
- style={[
127
- styles.modalContent,
128
- { backgroundColor: calendarTheme.colors.modalBackground },
129
- ]}
130
- testID={testID}
131
- >
132
- <Text
133
- style={[
134
- styles.title,
135
- {
136
- color: calendarTheme.colors.text,
137
- borderBottomColor: calendarTheme.colors.border,
138
- },
139
- ]}
140
- >
141
- {title}
142
- </Text>
143
-
144
- <View
145
- style={[
146
- styles.rangeSummary,
147
- { borderBottomColor: calendarTheme.colors.border },
148
- ]}
149
- >
150
- <Text style={[styles.rangeText, { color: calendarTheme.colors.primary }]}>
151
- {rangeSummary}
152
- </Text>
153
- </View>
154
-
155
- <View style={styles.calendarWrapper}>
156
- <NepaliCalendar
157
- value={tempRange.start}
158
- onChange={handleDateSelect}
159
- locale={locale}
160
- numerals={numerals}
161
- minDate={minDate}
162
- maxDate={maxDate}
163
- markedDates={markedDates}
164
- disabledDates={disabledDates}
165
- weekStartsOn={weekStartsOn}
166
- theme={theme}
167
- colorScheme={colorScheme}
168
- rangeValue={tempRange}
169
- />
170
- </View>
171
-
172
- <View
173
- style={[
174
- styles.buttonRow,
175
- { borderTopColor: calendarTheme.colors.border },
176
- ]}
177
- >
178
- <Pressable
179
- style={[styles.button, styles.clearButton]}
180
- onPress={handleClear}
181
- accessibilityRole="button"
182
- accessibilityLabel="Clear selected date range"
183
- >
184
- <Text style={[styles.clearText, { color: calendarTheme.colors.danger }]}>
185
- {clearText}
186
- </Text>
187
- </Pressable>
188
-
189
- <Pressable
190
- style={[styles.button, styles.cancelButton]}
191
- onPress={handleCancel}
192
- accessibilityRole="button"
193
- accessibilityLabel="Cancel date range selection"
194
- >
195
- <Text style={[styles.cancelText, { color: calendarTheme.colors.mutedText }]}>
196
- {cancelText}
197
- </Text>
198
- </Pressable>
199
-
200
- <Pressable
201
- style={[
202
- styles.button,
203
- {
204
- backgroundColor: isConfirmDisabled
205
- ? calendarTheme.colors.disabledText
206
- : calendarTheme.colors.primary,
207
- },
208
- ]}
209
- onPress={handleConfirm}
210
- disabled={isConfirmDisabled}
211
- accessibilityRole="button"
212
- accessibilityLabel="Confirm selected date range"
213
- accessibilityState={{ disabled: isConfirmDisabled }}
214
- >
215
- <Text
216
- style={[
217
- styles.confirmText,
218
- { color: calendarTheme.colors.primaryText },
219
- ]}
220
- >
221
- {confirmText}
222
- </Text>
223
- </Pressable>
224
- </View>
225
- </View>
226
- ),
227
- [
228
- tempRange,
229
- title,
230
- rangeSummary,
231
- locale,
232
- numerals,
233
- minDate,
234
- maxDate,
235
- markedDates,
236
- disabledDates,
237
- weekStartsOn,
238
- theme,
239
- colorScheme,
240
- testID,
241
- clearText,
242
- cancelText,
243
- confirmText,
244
- isConfirmDisabled,
245
- calendarTheme,
246
- handleClear,
247
- handleCancel,
248
- handleConfirm,
249
- handleDateSelect,
250
- ]
251
- );
252
-
253
- return (
254
- <Modal
255
- visible={visible}
256
- transparent
257
- animationType="fade"
258
- onRequestClose={handleCancel}
259
- >
260
- <TouchableWithoutFeedback onPress={handleBackdropPress}>
261
- <View style={[styles.backdrop, { backgroundColor: calendarTheme.colors.overlay }]}>
262
- <TouchableWithoutFeedback>{modalContent}</TouchableWithoutFeedback>
263
- </View>
264
- </TouchableWithoutFeedback>
265
- </Modal>
266
- );
267
- }
268
-
269
- const styles = StyleSheet.create({
270
- backdrop: {
271
- flex: 1,
272
- justifyContent: 'center',
273
- alignItems: 'center',
274
- paddingHorizontal: 20,
275
- },
276
- modalContent: {
277
- borderRadius: 16,
278
- overflow: 'hidden',
279
- width: '100%',
280
- maxWidth: 400,
281
- },
282
- title: {
283
- fontSize: 18,
284
- fontWeight: '600',
285
- textAlign: 'center',
286
- paddingVertical: 16,
287
- paddingHorizontal: 16,
288
- borderBottomWidth: StyleSheet.hairlineWidth,
289
- },
290
- rangeSummary: {
291
- paddingVertical: 12,
292
- paddingHorizontal: 16,
293
- borderBottomWidth: StyleSheet.hairlineWidth,
294
- alignItems: 'center',
295
- },
296
- rangeText: {
297
- fontSize: 16,
298
- fontWeight: '500',
299
- },
300
- calendarWrapper: {
301
- padding: 8,
302
- },
303
- buttonRow: {
304
- flexDirection: 'row',
305
- justifyContent: 'flex-end',
306
- paddingHorizontal: 16,
307
- paddingVertical: 12,
308
- gap: 10,
309
- borderTopWidth: StyleSheet.hairlineWidth,
310
- },
311
- button: {
312
- paddingVertical: 10,
313
- paddingHorizontal: 16,
314
- borderRadius: 8,
315
- minWidth: 70,
316
- alignItems: 'center',
317
- },
318
- clearButton: {
319
- backgroundColor: 'transparent',
320
- },
321
- cancelButton: {
322
- backgroundColor: 'transparent',
323
- },
324
- clearText: {
325
- fontSize: 15,
326
- fontWeight: '600',
327
- },
328
- cancelText: {
329
- fontSize: 15,
330
- fontWeight: '600',
331
- },
332
- confirmText: {
333
- fontSize: 15,
334
- fontWeight: '600',
335
- },
336
- });
@@ -1,11 +0,0 @@
1
- export { NepaliRangePicker } from './NepaliRangePicker';
2
- export { RangePickerModal } from './RangePickerModal';
3
- export type { NepaliRangePickerProps, RangePickerModalProps, DateRangeValue } from './types';
4
- export {
5
- isDateInRange,
6
- isRangeStart,
7
- isRangeEnd,
8
- normalizeRange,
9
- selectRangeDate,
10
- getRangeDateKey,
11
- } from './range-utils';
@@ -1,75 +0,0 @@
1
- import type { BSDateValue } from '../../core/types';
2
- import { compareBS } from '../../core';
3
- import type { DateRangeValue } from './types';
4
-
5
- export function isDateInRange(
6
- date: BSDateValue,
7
- range: DateRangeValue
8
- ): boolean {
9
- if (!range.start || !range.end) return false;
10
- const cmpStart = compareBS(date, range.start);
11
- const cmpEnd = compareBS(date, range.end);
12
- return cmpStart >= 0 && cmpEnd <= 0;
13
- }
14
-
15
- export function isRangeStart(
16
- date: BSDateValue,
17
- range: DateRangeValue
18
- ): boolean {
19
- if (!range.start) return false;
20
- return compareBS(date, range.start) === 0;
21
- }
22
-
23
- export function isRangeEnd(
24
- date: BSDateValue,
25
- range: DateRangeValue
26
- ): boolean {
27
- if (!range.end) return false;
28
- return compareBS(date, range.end) === 0;
29
- }
30
-
31
- export function normalizeRange(
32
- start: BSDateValue,
33
- end: BSDateValue,
34
- options?: { allowSameDay?: boolean }
35
- ): DateRangeValue {
36
- const allowSameDay = options?.allowSameDay ?? true;
37
-
38
- if (!allowSameDay && compareBS(start, end) === 0) {
39
- return { start, end: null };
40
- }
41
-
42
- if (compareBS(start, end) <= 0) {
43
- return { start, end };
44
- }
45
-
46
- return { start: end, end: start };
47
- }
48
-
49
- export function selectRangeDate(
50
- currentRange: DateRangeValue,
51
- date: BSDateValue,
52
- options?: { allowSameDay?: boolean }
53
- ): DateRangeValue {
54
- const allowSameDay = options?.allowSameDay ?? true;
55
-
56
- if (!currentRange.start) {
57
- return { start: date, end: null };
58
- }
59
-
60
- if (!currentRange.end) {
61
- return normalizeRange(currentRange.start, date, { allowSameDay });
62
- }
63
-
64
- return { start: date, end: null };
65
- }
66
-
67
- export function getRangeDateKey(
68
- range: DateRangeValue,
69
- date: BSDateValue
70
- ): 'start' | 'end' | 'in-range' | 'none' {
71
- if (isRangeStart(date, range)) return 'start';
72
- if (isRangeEnd(date, range)) return 'end';
73
- if (isDateInRange(date, range)) return 'in-range';
74
- return 'none';
75
- }