import React, { memo, useRef } from '../../lib/teact/teact'; import { getActions } from '../../global'; import type { ApiPeer } from '../../api/types'; import { StoryViewerOrigin } from '../../types'; import { getPeerTitle, isUserId } from '../../global/helpers'; import buildClassName from '../../util/buildClassName'; import { preventMessageInputBlurWithBubbling } from '../middle/helpers/preventMessageInputBlur'; import useContextMenuHandlers from '../../hooks/useContextMenuHandlers'; import useLastCallback from '../../hooks/useLastCallback'; import useOldLang from '../../hooks/useOldLang'; import useStoryPreloader from './hooks/useStoryPreloader'; import Avatar from '../common/Avatar'; import Menu from '../ui/Menu'; import MenuItem from '../ui/MenuItem'; import styles from './StoryRibbon.module.scss'; interface OwnProps { peer: ApiPeer; isArchived?: boolean; } function StoryRibbonButton({ peer, isArchived }: OwnProps) { const { openChat, openChatWithInfo, openStoryViewer, toggleStoriesHidden, } = getActions(); const lang = useOldLang(); // eslint-disable-next-line no-null/no-null const ref = useRef(null); const isSelf = 'isSelf' in peer && peer.isSelf; const isChannel = !isUserId(peer.id); useStoryPreloader(peer.id); const { isContextMenuOpen, contextMenuAnchor, handleBeforeContextMenu, handleContextMenu, handleContextMenuClose, handleContextMenuHide, } = useContextMenuHandlers(ref); const getTriggerElement = useLastCallback(() => ref.current); const getRootElement = useLastCallback(() => document.body); const getMenuElement = useLastCallback(() => ref.current!.querySelector('.story-peer-context-menu .bubble')); const getLayout = useLastCallback(() => ({ withPortal: true, isDense: true })); const handleClick = useLastCallback(() => { if (isContextMenuOpen) return; openStoryViewer({ peerId: peer.id, origin: StoryViewerOrigin.StoryRibbon }); }); const handleMouseDown = useLastCallback((e: React.MouseEvent) => { preventMessageInputBlurWithBubbling(e); handleBeforeContextMenu(e); }); const handleSavedStories = useLastCallback(() => { openChatWithInfo({ id: peer.id, shouldReplaceHistory: true, profileTab: 'stories' }); }); const handleArchivedStories = useLastCallback(() => { openChatWithInfo({ id: peer.id, shouldReplaceHistory: true, profileTab: 'storiesArchive' }); }); const handleOpenChat = useLastCallback(() => { openChat({ id: peer.id, shouldReplaceHistory: true }); }); const handleOpenProfile = useLastCallback(() => { openChatWithInfo({ id: peer.id, shouldReplaceHistory: true }); }); const handleArchivePeer = useLastCallback(() => { toggleStoriesHidden({ peerId: peer.id, isHidden: !isArchived }); }); return (
{isSelf ? lang('MyStory') : getPeerTitle(lang, peer)}
{contextMenuAnchor !== undefined && ( {isSelf ? ( <> {lang('StoryList.Context.SavedStories')} {lang('StoryList.Context.ArchivedStories')} ) : ( <> {!isChannel && ( {lang('SendMessageTitle')} )} {isChannel ? ( {lang('ChatList.ContextOpenChannel')} ) : ( {lang('StoryList.Context.ViewProfile')} )} {lang(isArchived ? 'StoryList.Context.Unarchive' : 'StoryList.Context.Archive')} )} )}
); } export default memo(StoryRibbonButton);