import type { ChangeEvent } from 'react'; import type { FC } from '../../../lib/teact/teact'; import React, { memo, useCallback, useState } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; import type { ApiExportedInvite } from '../../../api/types'; import { ManagementScreens } from '../../../types'; import { selectTabState } from '../../../global/selectors'; import { formatFullDate, formatTime } from '../../../util/date/dateFormat'; import { getServerTime } from '../../../util/serverTime'; import useFlag from '../../../hooks/useFlag'; import useHistoryBack from '../../../hooks/useHistoryBack'; import useLang from '../../../hooks/useLang'; import useSyncEffect from '../../../hooks/useSyncEffect'; import CalendarModal from '../../common/CalendarModal'; import Button from '../../ui/Button'; import Checkbox from '../../ui/Checkbox'; import FloatingActionButton from '../../ui/FloatingActionButton'; import InputText from '../../ui/InputText'; import RadioGroup from '../../ui/RadioGroup'; const DEFAULT_USAGE_LIMITS = [1, 10, 100]; const DEFAULT_EXPIRE_DATE = { hour: 3600000, day: 86400000, week: 604800000, }; const DEFAULT_CUSTOM_EXPIRE_DATE = DEFAULT_EXPIRE_DATE.hour; type OwnProps = { chatId: string; onClose: NoneToVoidFunction; onScreenSelect: (screen: ManagementScreens) => void; isActive: boolean; }; type StateProps = { editingInvite?: ApiExportedInvite; }; const ManageInvite: FC = ({ chatId, editingInvite, isActive, onClose, onScreenSelect, }) => { const { editExportedChatInvite, exportChatInvite } = getActions(); const lang = useLang(); const [isCalendarOpened, openCalendar, closeCalendar] = useFlag(); const [isRequestNeeded, setIsRequestNeeded] = useState(false); const [title, setTitle] = useState(''); const [customExpireDate, setCustomExpireDate] = useState(Date.now() + DEFAULT_CUSTOM_EXPIRE_DATE); const [selectedExpireOption, setSelectedExpireOption] = useState('unlimited'); const [customUsageLimit, setCustomUsageLimit] = useState(10); const [selectedUsageOption, setSelectedUsageOption] = useState('0'); const [isSubmitBlocked, setIsSubmitBlocked] = useState(false); useHistoryBack({ isActive, onBack: onClose, }); useSyncEffect(([oldEditingInvite]) => { if (oldEditingInvite === editingInvite) return; if (!editingInvite) { setTitle(''); setSelectedExpireOption('unlimited'); setSelectedUsageOption('0'); setCustomExpireDate(getServerTime() * 1000 + DEFAULT_CUSTOM_EXPIRE_DATE); setCustomUsageLimit(10); setIsRequestNeeded(false); } else { const { title: editingTitle, usageLimit, expireDate, isRequestNeeded: editingIsRequestNeeded, } = editingInvite; if (editingTitle) setTitle(editingTitle); if (usageLimit) { setSelectedUsageOption(DEFAULT_USAGE_LIMITS.includes(usageLimit) ? usageLimit.toString() : 'custom'); setCustomUsageLimit(usageLimit); } if (expireDate) { const minSafeDate = getServerTime() + DEFAULT_CUSTOM_EXPIRE_DATE; setSelectedExpireOption('custom'); setCustomExpireDate(Math.max(expireDate, minSafeDate) * 1000); } if (editingIsRequestNeeded) { setIsRequestNeeded(true); } } }, [editingInvite]); const handleIsRequestChange = useCallback((e: ChangeEvent) => { setIsRequestNeeded(e.target.checked); }, []); const handleTitleChange = useCallback((e: ChangeEvent) => { setTitle(e.target.value); }, []); const handleCustomUsageLimitChange = useCallback((e: ChangeEvent) => { setCustomUsageLimit(Number.parseInt(e.target.value, 10)); }, []); const handleExpireDateChange = useCallback((date: Date) => { setCustomExpireDate(date.getTime()); closeCalendar(); }, [closeCalendar]); const handleSaveClick = useCallback(() => { setIsSubmitBlocked(true); const usageLimit = selectedUsageOption === 'custom' ? customUsageLimit : Number(selectedUsageOption); let expireDate; switch (selectedExpireOption) { case 'custom': expireDate = getServerTime() + (customExpireDate - Date.now()) / 1000; break; case 'hour': case 'day': case 'week': expireDate = getServerTime() + DEFAULT_EXPIRE_DATE[selectedExpireOption] / 1000; break; case 'unlimited': expireDate = 0; break; default: expireDate = undefined; } if (editingInvite) { editExportedChatInvite({ link: editingInvite.link, chatId, title, isRequestNeeded, expireDate, usageLimit, }); } else { exportChatInvite({ chatId, title, isRequestNeeded, expireDate, usageLimit, }); } onScreenSelect(ManagementScreens.Invites); }, [ chatId, customExpireDate, customUsageLimit, editExportedChatInvite, editingInvite, exportChatInvite, isRequestNeeded, selectedExpireOption, selectedUsageOption, title, onScreenSelect, ]); return (

{lang('LinkNameHelp')}

{lang('LimitByPeriod')}
{selectedExpireOption === 'custom' && ( )}

{lang('TimeLimitHelp')}

{!isRequestNeeded && (
{lang('LimitNumberOfUses')}
({ value: n.toString(), label: n })), { value: '0', label: lang('NoLimit'), }, { value: 'custom', label: lang('lng_group_invite_usage_custom'), }, ]} onChange={setSelectedUsageOption} selected={selectedUsageOption} /> {selectedUsageOption === 'custom' && ( )}

{lang('UsesLimitHelp')}

)}
); }; export default memo(withGlobal( (global, { chatId }): StateProps => { const { editingInvite } = selectTabState(global).management.byChatId[chatId] || {}; return { editingInvite, }; }, )(ManageInvite));