import React, { ReactNode, useCallback, useState } from 'react' import { StyleProp, StyleSheet, TouchableOpacity, View, ViewStyle } from 'react-native' import { Text } from 'rn-base-component' import DateTimePickerModal from 'react-native-modal-datetime-picker' import { colors, fonts, fontSizes, metrics } from '../themes' import dayjs from 'dayjs' import { DATE_FORMAT } from '@/constants' import { IconSymbol } from './IconSymbol' export interface IDatePickerProps { onConfirm?: (item: Date) => void label: string value?: Date | string placeholder?: string children?: ReactNode | undefined leftComponent?: ReactNode | undefined containerStyle?: StyleProp isRequire?: boolean disabled?: boolean } export const DatePicker: React.FC = ({ onConfirm, leftComponent, label, children, value, placeholder, containerStyle, isRequire, disabled, }) => { const [isDatePickerVisible, setDatePickerVisible] = useState(false) const renderChildren = useCallback(() => { if (!children) { if (value) { if (typeof value === 'string') { return {value} } return {dayjs(value).format(DATE_FORMAT.date)} } return {placeholder} } return children }, [children, placeholder, value]) const handleShowDatePicker = useCallback(() => { setDatePickerVisible(true) }, []) const handleConfirm = useCallback( (date: Date) => { setDatePickerVisible(false) onConfirm?.(date) }, [onConfirm], ) return ( {label} {!!isRequire && *} {leftComponent} {renderChildren()} setDatePickerVisible(false)} date={typeof value === 'string' ? dayjs(value, DATE_FORMAT.date).toDate() : (value ?? new Date())} /> ) } const styles = StyleSheet.create({ container: { marginBottom: metrics.marginTop, width: '100%', }, flex: { flex: 1, }, wrapper: { borderWidth: metrics.borderWidth, height: metrics.textInputHeight, paddingHorizontal: metrics.marginVertical, borderRadius: metrics.borderRadius, backgroundColor: colors.white, borderColor: colors.black, flexDirection: 'row', alignItems: 'center', }, labelStyle: { fontSize: metrics.span, marginBottom: metrics.tiny, fontFamily: fonts.medium, }, input: { fontSize: fontSizes.span, }, labelFocus: { color: colors.black, }, outlineFocus: { borderColor: colors.border, }, error: { fontSize: fontSizes.span, color: colors.red, fontFamily: fonts.regular, position: 'absolute', bottom: -metrics.small, }, icon: { width: metrics.small, height: metrics.small, marginLeft: metrics.tiny, }, required: { color: colors.red, fontFamily: fonts.medium, }, disabled: { backgroundColor: colors.border, }, })