@umituz/react-native-design-system 4.25.6 → 4.25.7
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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@umituz/react-native-design-system",
|
|
3
|
-
"version": "4.25.
|
|
3
|
+
"version": "4.25.7",
|
|
4
4
|
"description": "Universal design system for React Native apps - Consolidated package with atoms, molecules, organisms, theme, typography, responsive, safe area, exception, infinite scroll, UUID, image, timezone, offline, onboarding, and loading utilities",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -40,7 +40,6 @@
|
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"@react-native-async-storage/async-storage": "^2.2.0",
|
|
43
|
-
"@react-native-community/datetimepicker": "^8.6.0",
|
|
44
43
|
"react-native-svg": "^15.12.1",
|
|
45
44
|
"rn-emoji-keyboard": "^1.7.0"
|
|
46
45
|
},
|
|
@@ -93,7 +92,8 @@
|
|
|
93
92
|
"react-native": "*",
|
|
94
93
|
"react-native-gesture-handler": ">=2.20.0",
|
|
95
94
|
"react-native-safe-area-context": ">=5.6.2",
|
|
96
|
-
"zustand": ">=5.0.0"
|
|
95
|
+
"zustand": ">=5.0.0",
|
|
96
|
+
"@react-native-community/datetimepicker": ">=8.0.0"
|
|
97
97
|
},
|
|
98
98
|
"peerDependenciesMeta": {
|
|
99
99
|
"@react-navigation/native": {
|
|
@@ -101,6 +101,9 @@
|
|
|
101
101
|
},
|
|
102
102
|
"expo-application": {
|
|
103
103
|
"optional": true
|
|
104
|
+
},
|
|
105
|
+
"@react-native-community/datetimepicker": {
|
|
106
|
+
"optional": true
|
|
104
107
|
}
|
|
105
108
|
},
|
|
106
109
|
"devDependencies": {
|
|
@@ -4,35 +4,9 @@
|
|
|
4
4
|
* A reusable date picker component that wraps the native date picker
|
|
5
5
|
* with consistent styling and behavior across platforms.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - Locale-aware date/time formatting (native Date methods)
|
|
11
|
-
* - Timezone-aware (respects device timezone)
|
|
12
|
-
* - Automatic language integration (native locale support)
|
|
13
|
-
* - Optional label and error states
|
|
14
|
-
* - Minimum and maximum date constraints
|
|
15
|
-
* - Disabled state support
|
|
16
|
-
* - Theme-aware styling
|
|
17
|
-
* - Proper keyboard avoidance on iOS
|
|
18
|
-
*
|
|
19
|
-
* Usage:
|
|
20
|
-
* ```tsx
|
|
21
|
-
* const [selectedDate, setSelectedDate] = useState(new Date());
|
|
22
|
-
*
|
|
23
|
-
* <AtomicDatePicker
|
|
24
|
-
* value={selectedDate}
|
|
25
|
-
* onChange={setSelectedDate}
|
|
26
|
-
* label="Birth Date"
|
|
27
|
-
* minimumDate={new Date(1900, 0, 1)}
|
|
28
|
-
* maximumDate={new Date()}
|
|
29
|
-
* />
|
|
30
|
-
* ```
|
|
31
|
-
*
|
|
32
|
-
* Platform Behavior:
|
|
33
|
-
* - Opens bottom sheet from bottom with spinner wheel
|
|
34
|
-
* - Requires "Done" button to confirm selection
|
|
35
|
-
* - Can be dismissed by swiping down or tapping backdrop
|
|
7
|
+
* Requires @react-native-community/datetimepicker as a peer dependency.
|
|
8
|
+
* If not installed, the component will render only the button with a
|
|
9
|
+
* console warning when pressed.
|
|
36
10
|
*
|
|
37
11
|
* @module AtomicDatePicker
|
|
38
12
|
*/
|
|
@@ -44,7 +18,6 @@ import {
|
|
|
44
18
|
type StyleProp,
|
|
45
19
|
type ViewStyle,
|
|
46
20
|
} from 'react-native';
|
|
47
|
-
import DateTimePicker, { DateTimePickerEvent } from '@react-native-community/datetimepicker';
|
|
48
21
|
import { useAppDesignTokens } from '../theme';
|
|
49
22
|
import { AtomicText } from './AtomicText';
|
|
50
23
|
import { DatePickerModal } from './datepicker/components/DatePickerModal';
|
|
@@ -52,6 +25,18 @@ import { DatePickerButton } from './datepicker/components/DatePickerButton';
|
|
|
52
25
|
import { useDatePickerText } from './datepicker/hooks/useDatePickerText';
|
|
53
26
|
import { getDatePickerStyles } from './datepicker/styles/datePickerStyles';
|
|
54
27
|
|
|
28
|
+
let DateTimePicker: any = null;
|
|
29
|
+
try {
|
|
30
|
+
DateTimePicker = require('@react-native-community/datetimepicker').default;
|
|
31
|
+
} catch {
|
|
32
|
+
// Optional peer dependency not installed
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type DateTimePickerEvent = {
|
|
36
|
+
type: 'set' | 'dismissed' | 'neutralButtonPressed';
|
|
37
|
+
nativeEvent: { timestamp: number; utcOffset: number };
|
|
38
|
+
};
|
|
39
|
+
|
|
55
40
|
/**
|
|
56
41
|
* Props for AtomicDatePicker component
|
|
57
42
|
*/
|
|
@@ -80,16 +65,6 @@ export interface AtomicDatePickerProps {
|
|
|
80
65
|
style?: StyleProp<ViewStyle>;
|
|
81
66
|
}
|
|
82
67
|
|
|
83
|
-
/**
|
|
84
|
-
* AtomicDatePicker - Universal date/time picker component
|
|
85
|
-
*
|
|
86
|
-
* Wraps @react-native-community/datetimepicker with:
|
|
87
|
-
* - Theme integration
|
|
88
|
-
* - Platform-specific modal handling
|
|
89
|
-
* - Error states
|
|
90
|
-
* - Disabled states
|
|
91
|
-
* - Responsive sizing
|
|
92
|
-
*/
|
|
93
68
|
export const AtomicDatePicker: React.FC<AtomicDatePickerProps> = ({
|
|
94
69
|
value,
|
|
95
70
|
onChange,
|
|
@@ -106,10 +81,6 @@ export const AtomicDatePicker: React.FC<AtomicDatePickerProps> = ({
|
|
|
106
81
|
const tokens = useAppDesignTokens();
|
|
107
82
|
const [showPicker, setShowPicker] = useState(false);
|
|
108
83
|
|
|
109
|
-
/**
|
|
110
|
-
* Handle date/time change in picker
|
|
111
|
-
* On Android, directly apply the change. On iOS, show picker in modal and apply on confirm.
|
|
112
|
-
*/
|
|
113
84
|
const handleChange = (event: DateTimePickerEvent, selectedDate?: Date) => {
|
|
114
85
|
if (Platform.OS === 'android') {
|
|
115
86
|
setShowPicker(false);
|
|
@@ -117,27 +88,24 @@ export const AtomicDatePicker: React.FC<AtomicDatePickerProps> = ({
|
|
|
117
88
|
onChange(selectedDate);
|
|
118
89
|
}
|
|
119
90
|
} else {
|
|
120
|
-
// iOS: Update value while picker is open
|
|
121
91
|
if (event.type === 'set' && selectedDate) {
|
|
122
92
|
onChange(selectedDate);
|
|
123
93
|
}
|
|
124
|
-
// iOS: Close on dismiss (swipe down)
|
|
125
94
|
if (event.type === 'dismissed') {
|
|
126
95
|
setShowPicker(false);
|
|
127
96
|
}
|
|
128
97
|
}
|
|
129
98
|
};
|
|
130
99
|
|
|
131
|
-
/**
|
|
132
|
-
* Handle open - show native picker
|
|
133
|
-
*/
|
|
134
100
|
const handleOpen = () => {
|
|
135
|
-
if (
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
101
|
+
if (!DateTimePicker) {
|
|
102
|
+
console.warn(
|
|
103
|
+
'[AtomicDatePicker] @react-native-community/datetimepicker is not installed. ' +
|
|
104
|
+
'Install it to use the date picker: npx expo install @react-native-community/datetimepicker'
|
|
105
|
+
);
|
|
106
|
+
return;
|
|
140
107
|
}
|
|
108
|
+
setShowPicker(true);
|
|
141
109
|
};
|
|
142
110
|
|
|
143
111
|
const { displayText } = useDatePickerText({ value, placeholder, mode });
|
|
@@ -167,19 +135,21 @@ export const AtomicDatePicker: React.FC<AtomicDatePickerProps> = ({
|
|
|
167
135
|
)}
|
|
168
136
|
|
|
169
137
|
{/* iOS Modal */}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
138
|
+
{DateTimePicker && (
|
|
139
|
+
<DatePickerModal
|
|
140
|
+
visible={Platform.OS === 'ios' && showPicker}
|
|
141
|
+
onClose={() => setShowPicker(false)}
|
|
142
|
+
onDateChange={handleChange}
|
|
143
|
+
currentDate={value ?? new Date()}
|
|
144
|
+
mode={mode}
|
|
145
|
+
minimumDate={minimumDate}
|
|
146
|
+
maximumDate={maximumDate}
|
|
147
|
+
testID={testID}
|
|
148
|
+
/>
|
|
149
|
+
)}
|
|
180
150
|
|
|
181
151
|
{/* Android Picker */}
|
|
182
|
-
{Platform.OS === 'android' && showPicker && (
|
|
152
|
+
{DateTimePicker && Platform.OS === 'android' && showPicker && (
|
|
183
153
|
<DateTimePicker
|
|
184
154
|
value={value ?? new Date()}
|
|
185
155
|
mode={mode}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* DatePickerModal Component
|
|
3
3
|
*
|
|
4
4
|
* Modal component for iOS date picker with proper styling and behavior.
|
|
5
|
-
*
|
|
5
|
+
* Uses lazy-loaded @react-native-community/datetimepicker (optional peer dependency).
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import React, { useMemo } from 'react';
|
|
@@ -14,10 +14,21 @@ import {
|
|
|
14
14
|
Platform,
|
|
15
15
|
} from 'react-native';
|
|
16
16
|
import { useSafeAreaInsets } from '../../../safe-area';
|
|
17
|
-
import DateTimePicker, { DateTimePickerEvent } from '@react-native-community/datetimepicker';
|
|
18
17
|
import { useAppDesignTokens } from '../../../theme';
|
|
19
18
|
import { AtomicText } from '../../AtomicText';
|
|
20
19
|
|
|
20
|
+
let DateTimePicker: any = null;
|
|
21
|
+
try {
|
|
22
|
+
DateTimePicker = require('@react-native-community/datetimepicker').default;
|
|
23
|
+
} catch {
|
|
24
|
+
// Optional peer dependency not installed
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
type DateTimePickerEvent = {
|
|
28
|
+
type: 'set' | 'dismissed' | 'neutralButtonPressed';
|
|
29
|
+
nativeEvent: { timestamp: number; utcOffset: number };
|
|
30
|
+
};
|
|
31
|
+
|
|
21
32
|
interface DatePickerModalProps {
|
|
22
33
|
visible: boolean;
|
|
23
34
|
onClose: () => void;
|
|
@@ -91,7 +102,7 @@ export const DatePickerModal: React.FC<DatePickerModalProps> = ({
|
|
|
91
102
|
},
|
|
92
103
|
}), [overlayOpacity, tokens, insets.bottom]);
|
|
93
104
|
|
|
94
|
-
if (Platform.OS !== 'ios') {
|
|
105
|
+
if (Platform.OS !== 'ios' || !DateTimePicker) {
|
|
95
106
|
return null;
|
|
96
107
|
}
|
|
97
108
|
|
|
@@ -140,4 +151,4 @@ export const DatePickerModal: React.FC<DatePickerModalProps> = ({
|
|
|
140
151
|
</View>
|
|
141
152
|
</Modal>
|
|
142
153
|
);
|
|
143
|
-
};
|
|
154
|
+
};
|