Files
mini-programs/src/components/TimeSelector/TimeSelector.tsx
张成 0090fc45c6 1
2025-11-09 18:05:03 +08:00

114 lines
4.1 KiB
TypeScript

import React, { useState, useEffect } from 'react'
import { View, Text, } from '@tarojs/components'
import { getDate, getTime, getDateStr, getEndTime } from '@/utils/timeUtils'
import { DialogCalendarCard } from '@/components/index'
import './TimeSelector.scss'
import dayjs from 'dayjs'
// 安全地解析日期字符串,兼容 iOS
const parseDate = (dateStr: string): Date => {
if (!dateStr) return new Date();
// 将 "yyyy-MM-dd HH:mm:ss" 转换为 "yyyy-MM-ddTHH:mm:ss"
const isoStr = dateStr.replace(/^(\d{4}-\d{2}-\d{2})\s(\d{2}:\d{2}(?::\d{2})?)$/, '$1T$2');
return new Date(isoStr);
};
export interface TimeRange {
start_time: string
end_time: string
}
interface TimeSelectorProps {
value: TimeRange
onChange: (timeRange: TimeRange) => void
}
const TimeSelector: React.FC<TimeSelectorProps> = ({
value = {
start_time: '',
end_time: ''
},
onChange
}) => {
// 格式化日期显示
const [visible, setVisible] = useState(false)
const [currentTimeValue, setCurrentTimeValue] = useState<Date>(new Date())
const [currentTimeType, setCurrentTimeType] = useState<'start' | 'end'>('start')
const [showEndTime, setShowEndTime] = useState(false)
const handleConfirm = (date: Date) => {
console.log('选择的日期:', date)
const start_time = currentTimeType === 'start' ? getDateStr(date) : value.start_time;
const end_time = currentTimeType === 'end' ? getDateStr(date) : value.end_time;
const isLater = dayjs(start_time).isAfter(dayjs(end_time));
if (isLater) {
if (onChange) onChange({start_time, end_time: getEndTime(start_time)})
return
}
if (onChange) onChange({start_time, end_time})
}
const openPicker = (type: 'start' | 'end') => {
setCurrentTimeValue(type === 'start' ? parseDate(value.start_time) : parseDate(value.end_time))
setCurrentTimeType(type)
setVisible(true)
}
useEffect(() => {
if (value.start_time && value.end_time) {
const start_time = dayjs(value.start_time).format('YYYY-MM-DD')
const end_time = dayjs(value.end_time).format('YYYY-MM-DD')
if (start_time === end_time) {
setShowEndTime(false)
} else {
setShowEndTime(true)
}
}
}, [value])
return (
<View className='time-selector'>
<View className='time-section'>
{/* 开始时间 */}
<View className='time-item'>
<View className='time-label'>
<View className='dot'></View>
</View>
<View className='time-content' onClick={() => openPicker('start')}>
<Text className='time-label'></Text>
<view className='time-text-wrapper'>
{value.start_time && (<>
<Text className='time-text'>{getDate(value.start_time)}</Text>
<Text className='time-text time-am'>{getTime(value.start_time)}</Text>
</>)}
{!value.start_time && (<Text className='time-text'></Text>)}
</view>
</View>
</View>
{/* 结束时间 */}
<View className='time-item'>
<View className='time-label'>
<View className='dot hollow'></View>
</View>
<View className='time-content' onClick={() => openPicker('end')}>
<Text className='time-label'></Text>
<view className='time-text-wrapper'>
{value.end_time && (<>{showEndTime && (<Text className='time-text'>{getDate(value.end_time)}</Text>)}
<Text className='time-text time-am'>{getTime(value.end_time)}</Text></>)}
{!value.end_time && (<Text className='time-text'></Text>)}
</view>
</View>
</View>
</View>
{
visible && <DialogCalendarCard
visible={visible}
value={currentTimeValue}
onChange={handleConfirm}
onClose={() => setVisible(false)}
/>
}
</View>
)
}
export default TimeSelector