import { ThemedText } from '@/components/ThemedText'; import { Colors } from '@/constants/Colors'; import { useColorScheme } from '@/hooks/useColorScheme'; import { useI18n } from '@/hooks/useI18n'; import DateTimePicker from '@react-native-community/datetimepicker'; import dayjs from 'dayjs'; import React, { useCallback, useEffect, useState } from 'react'; import { Alert, Modal, Platform, Pressable, StyleSheet, View } from 'react-native'; interface ExpiryDatePickerModalProps { visible: boolean; currentDate: Date | null; onClose: () => void; onConfirm: (date: Date) => void; isAiDraft?: boolean; } /** * 有效期日期选择器组件 * * 功能: * - 显示日期选择器弹窗 * - 验证日期不能早于今天 * - iOS 显示内联日历,Android 显示原生对话框 * - 支持取消和确认操作 */ export function ExpiryDatePickerModal({ visible, currentDate, onClose, onConfirm, isAiDraft = false, }: ExpiryDatePickerModalProps) { const { t } = useI18n(); const scheme = (useColorScheme() ?? 'light') as keyof typeof Colors; const colors = Colors[scheme]; // 内部状态:选择的日期值 const [selectedDate, setSelectedDate] = useState(currentDate || new Date()); // 当弹窗显示时,同步当前日期 useEffect(() => { if (visible) { setSelectedDate(currentDate || new Date()); } }, [visible, currentDate]); /** * 处理日期变化 * iOS: 实时更新选择的日期 * Android: 在用户点击确定时直接确认 */ const handleDateChange = useCallback( (event: any, date?: Date) => { if (Platform.OS === 'ios') { // iOS: 实时更新内部状态 if (date) { setSelectedDate(date); } } else { // Android: 处理用户操作 if (event.type === 'set' && date) { // 用户点击确定 validateAndConfirm(date); } else { // 用户点击取消 onClose(); } } }, [onClose] ); /** * 验证并确认日期 */ const validateAndConfirm = useCallback( (dateToConfirm: Date) => { // 验证有效期不能早于今天 const today = new Date(); today.setHours(0, 0, 0, 0); const selected = new Date(dateToConfirm); selected.setHours(0, 0, 0, 0); if (selected < today) { Alert.alert('日期无效', '有效期不能早于今天'); return; } // 检查日期是否真的发生了变化 const currentExpiry = currentDate ? dayjs(currentDate).format('YYYY-MM-DD') : null; const newExpiry = dayjs(dateToConfirm).format('YYYY-MM-DD'); if (currentExpiry === newExpiry) { // 日期没有变化,直接关闭 onClose(); return; } // 日期有效且发生了变化,执行确认回调 onConfirm(dateToConfirm); onClose(); }, [currentDate, onClose, onConfirm] ); /** * iOS 平台的确认按钮处理 */ const handleIOSConfirm = useCallback(() => { validateAndConfirm(selectedDate); }, [selectedDate, validateAndConfirm]); return ( 选择有效期 {/* iOS 平台显示确认和取消按钮 */} {Platform.OS === 'ios' && ( {t('medications.detail.pickers.cancel')} {t('medications.detail.pickers.confirm')} )} ); } const styles = StyleSheet.create({ backdrop: { flex: 1, backgroundColor: 'rgba(15, 23, 42, 0.4)', }, sheet: { position: 'absolute', left: 20, right: 20, bottom: 40, borderRadius: 24, padding: 20, shadowColor: '#000', shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.2, shadowRadius: 20, elevation: 8, }, title: { fontSize: 20, fontWeight: '700', marginBottom: 20, textAlign: 'center', }, actions: { flexDirection: 'row', gap: 12, marginTop: 16, }, btn: { flex: 1, paddingVertical: 14, borderRadius: 16, alignItems: 'center', borderWidth: 1, }, btnPrimary: { borderWidth: 0, }, btnText: { fontSize: 16, fontWeight: '600', }, });