TelegramPWA/src/components/left/main/StatusPickerMenu.tsx
2025-11-22 12:54:21 +01:00

85 lines
2.3 KiB
TypeScript

import type { ElementRef } from '../../../lib/teact/teact';
import {
memo, useCallback, useEffect, useRef,
} from '../../../lib/teact/teact';
import { getActions, withGlobal } from '../../../global';
import type { ApiSticker } from '../../../api/types';
import { selectIsContextMenuTranslucent } from '../../../global/selectors';
import CustomEmojiPicker from '../../common/CustomEmojiPicker';
import Menu from '../../ui/Menu';
import Portal from '../../ui/Portal';
import styles from './StatusPickerMenu.module.scss';
export type OwnProps = {
isOpen: boolean;
statusButtonRef: ElementRef<HTMLButtonElement>;
onEmojiStatusSelect: (emojiStatus: ApiSticker) => void;
onClose: () => void;
};
interface StateProps {
areFeaturedStickersLoaded?: boolean;
isTranslucent?: boolean;
}
const StatusPickerMenu = ({
isOpen,
statusButtonRef,
areFeaturedStickersLoaded,
isTranslucent,
onEmojiStatusSelect,
onClose,
}: OwnProps & StateProps) => {
const { loadFeaturedEmojiStickers } = getActions();
const transformOriginX = useRef<number>(0);
useEffect(() => {
transformOriginX.current = statusButtonRef.current!.getBoundingClientRect().right;
}, [isOpen, statusButtonRef]);
useEffect(() => {
if (isOpen && !areFeaturedStickersLoaded) {
loadFeaturedEmojiStickers();
}
}, [areFeaturedStickersLoaded, isOpen, loadFeaturedEmojiStickers]);
const handleEmojiSelect = useCallback((sticker: ApiSticker) => {
onEmojiStatusSelect(sticker);
onClose();
}, [onClose, onEmojiStatusSelect]);
return (
<Portal>
<Menu
isOpen={isOpen}
noCompact
positionX="left"
bubbleClassName={styles.menuContent}
onClose={onClose}
transformOriginX={transformOriginX.current}
>
<CustomEmojiPicker
idPrefix="status-emoji-set-"
loadAndPlay={isOpen}
isHidden={!isOpen}
isStatusPicker
isTranslucent={isTranslucent}
onDismiss={onClose}
onCustomEmojiSelect={handleEmojiSelect}
/>
</Menu>
</Portal>
);
};
export default memo(withGlobal<OwnProps>((global): Complete<StateProps> => {
return {
areFeaturedStickersLoaded: Boolean(global.customEmojis.featuredIds?.length),
isTranslucent: selectIsContextMenuTranslucent(global),
};
})(StatusPickerMenu));