import type { FC } from '../../../lib/teact/teact'; import React, { memo, useCallback, useEffect } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; import type { ApiChatInviteImporter, ApiExportedInvite, ApiUser } from '../../../api/types'; import { isChatChannel } from '../../../global/helpers'; import { selectChat, selectTabState } from '../../../global/selectors'; import { copyTextToClipboard } from '../../../util/clipboard'; import { formatFullDate, formatMediaDateTime, formatTime } from '../../../util/date/dateFormat'; import { getServerTime } from '../../../util/serverTime'; import useHistoryBack from '../../../hooks/useHistoryBack'; import useLang from '../../../hooks/useLang'; import PrivateChatInfo from '../../common/PrivateChatInfo'; import Button from '../../ui/Button'; import ListItem from '../../ui/ListItem'; import Spinner from '../../ui/Spinner'; type OwnProps = { chatId: string; onClose: NoneToVoidFunction; isActive: boolean; }; type StateProps = { invite?: ApiExportedInvite; importers?: ApiChatInviteImporter[]; requesters?: ApiChatInviteImporter[]; admin?: ApiUser; isChannel?: boolean; }; const BULLET = '\u2022'; const ManageInviteInfo: FC = ({ chatId, invite, importers, requesters, isChannel, isActive, onClose, }) => { const { showNotification, loadChatInviteImporters, loadChatInviteRequesters, openChat, } = getActions(); const lang = useLang(); const { usage = 0, usageLimit, link, adminId, } = invite || {}; const expireDate = invite?.expireDate && (invite.expireDate - getServerTime()) * 1000 + Date.now(); const isExpired = ((invite?.expireDate || 0) - getServerTime()) < 0; useEffect(() => { if (link) { loadChatInviteImporters({ chatId, link }); loadChatInviteRequesters({ chatId, link }); } }, [chatId, link, loadChatInviteImporters, loadChatInviteRequesters]); const handleCopyClicked = useCallback(() => { copyTextToClipboard(invite!.link); showNotification({ message: lang('LinkCopied'), }); }, [invite, lang, showNotification]); useHistoryBack({ isActive, onBack: onClose, }); const renderImporters = () => { if (!importers?.length && requesters?.length) return undefined; if (!importers) return ; return (

{importers.length ? lang('PeopleJoined', usage) : lang('NoOneJoined')}

{!importers.length && ( usageLimit ? lang('PeopleCanJoinViaLinkCount', usageLimit - usage) : lang('NoOneJoinedYet') )} {importers.map((importer) => { const joinTime = formatMediaDateTime(lang, importer.date * 1000, true); const status = importer.isFromChatList ? `${joinTime} ${BULLET} ${lang('JoinedViaFolder')}` : joinTime; return ( openChat({ id: importer.userId })} > ); })}

); }; const renderRequesters = () => { if (invite?.isRevoked) return undefined; if (!requesters && importers) return ; if (!requesters?.length) return undefined; return (

{isChannel ? lang('SubscribeRequests') : lang('MemberRequests')}

{requesters.map((requester) => ( openChat({ id: requester.userId })} > ))}

); }; return (
{!invite && (

{lang('Loading')}

)} {invite && ( <>

{invite.title || invite.link}

{Boolean(expireDate) && (

{isExpired ? lang('ExpiredLink') : lang('LinkExpiresIn', `${formatFullDate(lang, expireDate)} ${formatTime(lang, expireDate)}`)}

)}
{adminId && (

{lang('LinkCreatedeBy')}

openChat({ id: adminId })} >
)} {renderImporters()} {renderRequesters()} )}
); }; export default memo(withGlobal( (global, { chatId }): StateProps => { const { inviteInfo } = selectTabState(global).management.byChatId[chatId] || {}; const { invite, importers, requesters } = inviteInfo || {}; const chat = selectChat(global, chatId); const isChannel = chat && isChatChannel(chat); return { invite, importers, requesters, isChannel, }; }, )(ManageInviteInfo));