TelegramPWA/src/components/modals/gift/status/GiftStatusInfoModal.tsx
Alexander Zinchuk 3491a3b63b Emoji Status: Support EmojiStatusCollectible (#5547)
Co-authored-by: Alexander Zinchuk <alx.zinchuk@gmail.com>
2025-02-13 14:28:01 +01:00

172 lines
5.1 KiB
TypeScript

import React, { memo, useMemo } from '../../../../lib/teact/teact';
import { getActions, withGlobal } from '../../../../global';
import type {
ApiUser,
} from '../../../../api/types';
import type { TabState } from '../../../../global/types';
import { selectIsCurrentUserPremium, selectUser } from '../../../../global/selectors';
import buildClassName from '../../../../util/buildClassName';
import buildStyle from '../../../../util/buildStyle';
import useCurrentOrPrev from '../../../../hooks/useCurrentOrPrev';
import useLang from '../../../../hooks/useLang';
import useLastCallback from '../../../../hooks/useLastCallback';
import useCustomEmoji from '../../../common/hooks/useCustomEmoji';
import Avatar from '../../../common/Avatar';
import FullNameTitle from '../../../common/FullNameTitle';
import Icon from '../../../common/icons/Icon';
import RadialPatternBackground from '../../../common/profile/RadialPatternBackground';
import Button from '../../../ui/Button';
import TableAboutModal, { type TableAboutData } from '../../common/TableAboutModal';
import styles from './GiftStatusInfoModal.module.scss';
export type OwnProps = {
modal: TabState['giftStatusInfoModal'];
};
type StateProps = {
currentUser: ApiUser;
isCurrentUserPremium?: boolean;
};
const GiftStatusInfoModal = ({
modal,
currentUser,
isCurrentUserPremium,
}: OwnProps & StateProps) => {
const {
closeGiftStatusInfoModal,
setEmojiStatus,
} = getActions();
const lang = useLang();
const isOpen = Boolean(modal);
const renderingModal = useCurrentOrPrev(modal);
const { emojiStatus } = renderingModal || {};
const subtitleColor = emojiStatus?.textColor;
const patternIcon = useCustomEmoji(emojiStatus?.patternDocumentId);
const handleClose = useLastCallback(() => {
closeGiftStatusInfoModal();
});
const onWearClick = useLastCallback(() => {
if (emojiStatus) {
setEmojiStatus({ emojiStatus });
}
closeGiftStatusInfoModal();
});
const radialPatternBackdrop = useMemo(() => {
if (!emojiStatus || !isOpen) return undefined;
const backdropColors = [emojiStatus.centerColor, emojiStatus.edgeColor];
const patternColor = emojiStatus.patternColor;
return (
<RadialPatternBackground
className={styles.radialPattern}
backgroundColors={backdropColors}
patternColor={patternColor}
patternIcon={patternIcon.customEmoji}
/>
);
}, [emojiStatus, isOpen, patternIcon]);
const mockPeerWithStatus = useMemo(() => {
return {
...currentUser,
emojiStatus,
} satisfies ApiUser;
}, [currentUser, emojiStatus]);
const header = useMemo(() => {
return (
<div className={styles.header}>
<div
className={buildClassName(styles.profileBlock)}
style={buildStyle(subtitleColor && `color: ${subtitleColor}`)}
>
{radialPatternBackdrop}
<Avatar peer={mockPeerWithStatus} size="jumbo" className={styles.avatar} />
<FullNameTitle
peer={mockPeerWithStatus}
className={styles.userTitle}
withEmojiStatus
noFake
noVerified
statusSparklesColor={subtitleColor}
/>
<p className={styles.status} style={buildStyle(subtitleColor && `color: ${subtitleColor}`)}>
{lang('Online')}
</p>
</div>
<div className={styles.titleContainer}>
<div className={styles.giftTitle}>{
lang('UniqueStatusWearTitle', {
gift: mockPeerWithStatus?.emojiStatus?.title,
})
}
</div>
<div className={styles.infoDescription}>{
lang('UniqueStatusBenefitsDescription')
}
</div>
</div>
</div>
);
}, [subtitleColor, radialPatternBackdrop, mockPeerWithStatus, lang]);
const listItemData = [
['radial-badge', lang('UniqueStatusBadgeBenefitTitle'), lang('UniqueStatusBadgeDescription')],
['unique-profile', lang('UniqueStatusProfileDesignBenefitTitle'), lang('UniqueStatusProfileDesignDescription')],
['proof-of-ownership', lang('UniqueStatusProofOfOwnershipBenefitTitle'),
lang('UniqueStatusProofOfOwnershipDescription')],
] satisfies TableAboutData;
const footer = useMemo(() => {
if (!isOpen) return undefined;
return (
<div className={styles.footer}>
<Button
size="smaller"
onClick={onWearClick}
>
{lang('UniqueStatusWearButton')}
{!isCurrentUserPremium && <Icon name="lock-badge" className={styles.lockIcon} />}
</Button>
</div>
);
}, [lang, isCurrentUserPremium, isOpen]);
return (
<TableAboutModal
isOpen={isOpen}
header={header}
listItemData={listItemData}
footer={footer}
hasBackdrop
onClose={handleClose}
/>
);
};
export default memo(withGlobal<OwnProps>(
(global): StateProps => {
const currentUser = selectUser(global, global.currentUserId!)!;
const isCurrentUserPremium = selectIsCurrentUserPremium(global);
return {
currentUser,
isCurrentUserPremium,
};
},
)(GiftStatusInfoModal));