import type { TeactNode } from '../../../../lib/teact/teact'; import React, { memo, useMemo } from '../../../../lib/teact/teact'; import { getActions, getGlobal, withGlobal } from '../../../../global'; import type { ApiUser, } from '../../../../api/types'; import type { TabState } from '../../../../global/types'; import { getUserFullName } from '../../../../global/helpers'; import { selectUser } from '../../../../global/selectors'; import buildClassName from '../../../../util/buildClassName'; import { formatDateTimeToString } from '../../../../util/dates/dateFormat'; import { formatStarsAsIcon, formatStarsAsText } from '../../../../util/localization/format'; import { CUSTOM_PEER_HIDDEN } from '../../../../util/objects/customPeer'; import { getServerTime } from '../../../../util/serverTime'; import { formatInteger, formatPercent } from '../../../../util/textFormat'; import { getGiftAttributes, getStickerFromGift } from '../../../common/helpers/gifts'; import { renderTextWithEntities } from '../../../common/helpers/renderTextWithEntities'; import useCurrentOrPrev from '../../../../hooks/useCurrentOrPrev'; import useFlag from '../../../../hooks/useFlag'; import useLang from '../../../../hooks/useLang'; import useLastCallback from '../../../../hooks/useLastCallback'; import useOldLang from '../../../../hooks/useOldLang'; import AnimatedIconFromSticker from '../../../common/AnimatedIconFromSticker'; import Avatar from '../../../common/Avatar'; import BadgeButton from '../../../common/BadgeButton'; import Button from '../../../ui/Button'; import ConfirmDialog from '../../../ui/ConfirmDialog'; import Link from '../../../ui/Link'; import TableInfoModal, { type TableData } from '../../common/TableInfoModal'; import UniqueGiftHeader from '../UniqueGiftHeader'; import styles from './GiftInfoModal.module.scss'; export type OwnProps = { modal: TabState['giftInfoModal']; }; type StateProps = { userFrom?: ApiUser; targetUser?: ApiUser; currentUserId?: string; starGiftMaxConvertPeriod?: number; }; const STICKER_SIZE = 120; const GiftInfoModal = ({ modal, userFrom, targetUser, currentUserId, starGiftMaxConvertPeriod, }: OwnProps & StateProps) => { const { closeGiftInfoModal, changeGiftVisibility, convertGiftToStars, openChatWithInfo, focusMessage, openGiftUpgradeModal, } = getActions(); const [isConvertConfirmOpen, openConvertConfirm, closeConvertConfirm] = useFlag(); const lang = useLang(); const oldLang = useOldLang(); const isOpen = Boolean(modal); const renderingModal = useCurrentOrPrev(modal); const { gift: typeGift } = renderingModal || {}; const isUserGift = typeGift && 'gift' in typeGift; const userGift = isUserGift ? typeGift : undefined; const isSender = userGift?.fromId === currentUserId; const canConvertDifference = (userGift && starGiftMaxConvertPeriod && ( userGift.date + starGiftMaxConvertPeriod - getServerTime() )) || 0; const conversionLeft = Math.ceil(canConvertDifference / 60 / 60 / 24); const gift = isUserGift ? typeGift.gift : typeGift; const giftSticker = gift && getStickerFromGift(gift); const canFocusUpgrade = Boolean(userGift?.upgradeMsgId); const canUpdate = Boolean(userGift?.messageId) && targetUser?.id === currentUserId && !canFocusUpgrade; const handleClose = useLastCallback(() => { closeGiftInfoModal(); }); const handleFocusUpgraded = useLastCallback(() => { if (!userGift?.upgradeMsgId || !targetUser) return; const { upgradeMsgId } = userGift; focusMessage({ chatId: targetUser.id, messageId: upgradeMsgId! }); handleClose(); }); const handleTriggerVisibility = useLastCallback(() => { const { messageId, isUnsaved } = userGift!; changeGiftVisibility({ messageId: messageId!, shouldUnsave: !isUnsaved }); handleClose(); }); const handleConvertToStars = useLastCallback(() => { const { messageId } = userGift!; convertGiftToStars({ messageId: messageId! }); closeConvertConfirm(); handleClose(); }); const handleOpenUpgradeModal = useLastCallback(() => { if (!userGift) return; openGiftUpgradeModal({ giftId: userGift.gift.id, gift: userGift }); }); const giftAttributes = useMemo(() => { return gift && getGiftAttributes(gift); }, [gift]); const renderFooterButton = useLastCallback(() => { if (canFocusUpgrade) { return ( ); } if (canUpdate && userGift?.alreadyPaidUpgradeStars && !userGift.upgradeMsgId) { return ( ); } return ( ); }); const modalData = useMemo(() => { if (!typeGift || !gift) { return undefined; } const { fromId, isNameHidden, starsToConvert, isUnsaved, isConverted, } = userGift || {}; const isVisibleForMe = isNameHidden && targetUser; const description = (() => { if (!userGift) return lang('GiftInfoSoldOutDescription'); if (userGift.upgradeMsgId) return lang('GiftInfoDescriptionUpgraded'); if (userGift.canUpgrade && userGift.alreadyPaidUpgradeStars) { return canUpdate ? lang('GiftInfoDescriptionFreeUpgrade') : lang('GiftInfoDescriptionFreeUpgradeOut', { user: getUserFullName(targetUser)! }); } if (!canUpdate && !isSender) return undefined; if (isConverted && starsToConvert) { return canUpdate ? lang('GiftInfoDescriptionConverted', { amount: formatInteger(starsToConvert!), }, { pluralValue: starsToConvert, withNodes: true, withMarkdown: true, }) : lang('GiftInfoDescriptionOutConverted', { amount: formatInteger(starsToConvert!), user: getUserFullName(targetUser)!, }, { pluralValue: starsToConvert, withNodes: true, withMarkdown: true, }); } if (userGift.canUpgrade && canUpdate) { return lang('GiftInfoDescriptionUpgrade', { amount: formatInteger(starsToConvert!), }, { pluralValue: starsToConvert!, withNodes: true, withMarkdown: true, }); } return canUpdate ? lang('GiftInfoDescription', { amount: starsToConvert, }, { withNodes: true, withMarkdown: true, pluralValue: starsToConvert || 0, }) : lang('GiftInfoDescriptionOut', { amount: starsToConvert, user: getUserFullName(targetUser)!, }, { withNodes: true, withMarkdown: true, pluralValue: starsToConvert || 0, }); })(); function getTitle() { if (gift?.type === 'starGiftUnique') return gift.title; if (!userGift) return lang('GiftInfoSoldOutTitle'); return canUpdate ? lang('GiftInfoReceived') : lang('GiftInfoTitle'); } const isUniqueGift = gift.type === 'starGiftUnique'; const uniqueGiftHeader = isUniqueGift && (
{description}
)}