import React, { useMemo } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import IconButton from 'soapbox/components/icon-button'; import BundleContainer from 'soapbox/features/ui/containers/bundle-container'; import { DatePicker } from 'soapbox/features/ui/util/async-components'; import { useInstance, useFeatures } from 'soapbox/hooks'; const messages = defineMessages({ birthdayPlaceholder: { id: 'edit_profile.fields.birthday_placeholder', defaultMessage: 'Your birthday' }, previousMonth: { id: 'datepicker.previous_month', defaultMessage: 'Previous month' }, nextMonth: { id: 'datepicker.next_month', defaultMessage: 'Next month' }, previousYear: { id: 'datepicker.previous_year', defaultMessage: 'Previous year' }, nextYear: { id: 'datepicker.next_year', defaultMessage: 'Next year' }, }); interface IBirthdayInput { value?: string, onChange: (value: string) => void, required?: boolean, } const BirthdayInput: React.FC = ({ value, onChange, required }) => { const intl = useIntl(); const features = useFeatures(); const instance = useInstance(); const supportsBirthdays = features.birthdays; const minAge = instance.pleroma.getIn(['metadata', 'birthday_min_age']) as number; const maxDate = useMemo(() => { if (!supportsBirthdays) return null; let maxDate = new Date(); maxDate = new Date(maxDate.getTime() - minAge * 1000 * 60 * 60 * 24 + maxDate.getTimezoneOffset() * 1000 * 60); return maxDate; }, [minAge]); const selected = useMemo(() => { if (!supportsBirthdays || !value) return null; const date = new Date(value); return new Date(date.getTime() + (date.getTimezoneOffset() * 60000)); }, [value]); if (!supportsBirthdays) return null; const renderCustomHeader = ({ decreaseMonth, increaseMonth, prevMonthButtonDisabled, nextMonthButtonDisabled, decreaseYear, increaseYear, prevYearButtonDisabled, nextYearButtonDisabled, date, }: { decreaseMonth(): void, increaseMonth(): void, prevMonthButtonDisabled: boolean, nextMonthButtonDisabled: boolean, decreaseYear(): void, increaseYear(): void, prevYearButtonDisabled: boolean, nextYearButtonDisabled: boolean, date: Date, }) => { return (
{intl.formatDate(date, { month: 'long' })}
{intl.formatDate(date, { year: 'numeric' })}
); }; const handleChange = (date: Date) => onChange(date ? new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().slice(0, 10) : ''); return (
{Component => ()}
); }; export default BirthdayInput;