import React from 'react'; import { View, StyleSheet, Text } from 'react-native'; import Form from '../index'; import Button from '../../Button'; import { ScrollView } from 'react-native'; import BottomSafeArea from '../../BottomSafeArea'; import { Fill, Toast } from '@xrnjs/ui'; import Card from '_global/Card'; import dayjs from 'dayjs'; type FormData = { vacationPeriod: [Date, Date]; projectDuration: [Date, Date]; eventTimeRange: [Date, Date]; workingHours: [Date, Date]; reportPeriod: [Date, Date]; campaignDuration: [Date, Date]; }; const DateRangeExamplesDemo: React.FC = () => { const form = Form.useForm({ defaultValues: { vacationPeriod: [], projectDuration: [new Date(), new Date()], eventTimeRange: [new Date(), new Date()], workingHours: [new Date(), new Date()], reportPeriod: [new Date(), new Date()], campaignDuration: [new Date(), new Date()], }, }); const [fixedRange, setFixedRange] = React.useState<[Date, Date]>([ new Date('2025-01-01'), new Date('2025-02-01'), ]); const onSubmit = (data: FormData) => { console.log('Form submitted:', data); const formatDate = (date: Date) => dayjs(date).format('YYYY-MM-DD'); Toast( `日期范围设置成功!\n假期: ${formatDate( data.vacationPeriod[0] )} ~ ${formatDate(data.vacationPeriod[1])}\n项目: ${formatDate( data.projectDuration[0] )} ~ ${formatDate(data.projectDuration[1])}` ); }; const onError = (errors: Record) => { console.log('Form errors:', errors); }; return ( {/* Form.DateRange 快捷用法 */} { if (!value || !value[0] || !value[1]) { return '请选择完整的时间范围'; } if (dayjs(value[1]).isBefore(dayjs(value[0]))) { return '结束时间不能早于开始时间'; } const diffDays = dayjs(value[1]).diff(dayjs(value[0]), 'day'); if (diffDays > 30) { return '假期时间不能超过30天'; } return true; }, }} /> {/* 年月模式示例 */} { if (!value || !value[0] || !value[1]) { return '请选择完整的报告周期'; } const diffMonths = dayjs(value[1]).diff( dayjs(value[0]), 'month' ); if (diffMonths > 12) { return '报告周期不能超过12个月'; } return true; }, }} /> {/* 时间模式示例 */} { if (!value || !value[0] || !value[1]) { return '请设置完整的工作时间'; } const startHour = dayjs(value[0]).hour(); const endHour = dayjs(value[1]).hour(); if (endHour <= startHour) { return '下班时间必须晚于上班时间'; } const workHours = endHour - startHour; if (workHours > 12) { return '工作时间不能超过12小时'; } if (workHours < 4) { return '工作时间不能少于4小时'; } return true; }, }} /> {/* 复杂验证示例 */} { if (!value || !value[0] || !value[1]) { return '请选择完整的活动周期'; } const startDate = dayjs(value[0]); const endDate = dayjs(value[1]); const now = dayjs(); // 检查开始时间 if (startDate.isBefore(now.add(1, 'day'))) { return '活动开始时间至少需要提前1天设置'; } // 检查活动时长 const duration = endDate.diff(startDate, 'day'); if (duration < 3) { return '营销活动至少需要3天'; } if (duration > 90) { return '营销活动不能超过90天'; } // 检查是否在工作日 const startWeekday = startDate.day(); if (startWeekday === 0 || startWeekday === 6) { return '营销活动不能在周末开始'; } // 检查是否与假期冲突 const vacationPeriod = form.getValues('vacationPeriod'); if ( vacationPeriod && vacationPeriod[0] && vacationPeriod[1] ) { const vacationStart = dayjs(vacationPeriod[0]); const vacationEnd = dayjs(vacationPeriod[1]); // 检查时间范围是否重叠 if ( (startDate.isBefore(vacationEnd) && endDate.isAfter(vacationStart)) || (vacationStart.isBefore(endDate) && vacationEnd.isAfter(startDate)) ) { return '营销活动时间不能与假期时间重叠'; } } return true; }, }} /> {/* 禁用状态示例 */} {/* 自定义配置示例 */} { console.log('日期范围已选择:', dates); const diffDays = dayjs(dates[1]).diff(dayjs(dates[0]), 'day'); Toast(`已选择 ${diffDays + 1} 天的时间范围`); }} rules={{ required: '请选择日期范围', validate: (value: [Date, Date]) => { if (!value || !value[0] || !value[1]) { return '请选择完整的日期范围'; } const diffDays = dayjs(value[1]).diff(dayjs(value[0]), 'day'); if (diffDays < 7) { return '自定义范围至少需要7天'; } return true; }, }} /> 当前值:{dayjs(fixedRange[0]).format('YYYY-MM-DD')} ~{' '} {dayjs(fixedRange[1]).format('YYYY-MM-DD')} setFixedRange(v as [Date, Date])} /> ); }; const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#f5f5f5', }, scrollContainer: { flex: 1, padding: 20, paddingBottom: 0, }, cardStyle: { marginBottom: 16, }, fixedButtonContainer: { backgroundColor: '#fff', paddingHorizontal: 20, paddingTop: 16, paddingBottom: 30, borderTopWidth: 1, borderTopColor: '#e5e5e5', flexDirection: 'row', justifyContent: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: -2, }, shadowOpacity: 0.1, shadowRadius: 4, elevation: 8, }, buttonSpacer: { width: 20, }, }); export default DateRangeExamplesDemo;