import React, { memo, useLayoutEffect, useMemo, useRef, useState, } from '../../lib/teact/teact'; import { getActions } from '../../global'; import type { ObserveFn } from '../../hooks/useIntersectionObserver'; import type { FC } from '../../lib/teact/teact'; import type { ApiChat } from '../../api/types'; import { IS_TOUCH_ENV } from '../../util/environment'; import buildClassName from '../../util/buildClassName'; import { getOrderedTopics } from '../../global/helpers'; import { getIsMobile } from '../../hooks/useAppLayout'; import useLang from '../../hooks/useLang'; import { REM } from './helpers/mediaDimensions'; import renderText from './helpers/renderText'; import TopicIcon from './TopicIcon'; import styles from './ChatForumLastMessage.module.scss'; type OwnProps = { chat: ApiChat; renderLastMessage: () => React.ReactNode; observeIntersection?: ObserveFn; }; const NO_CORNER_THRESHOLD = Number(REM); const MAX_TOPICS = 3; const ChatForumLastMessage: FC = ({ chat, renderLastMessage, observeIntersection, }) => { const { openChat } = getActions(); // eslint-disable-next-line no-null/no-null const lastMessageRef = useRef(null); // eslint-disable-next-line no-null/no-null const mainColumnRef = useRef(null); const lang = useLang(); const lastMessage = renderLastMessage(); const [lastActiveTopic, ...otherTopics] = useMemo(() => { if (!chat.topics) { return []; } return getOrderedTopics(Object.values(chat.topics), undefined, true).slice(0, MAX_TOPICS); }, [chat.topics]); const [isReversedCorner, setIsReversedCorner] = useState(false); const [overwrittenWidth, setOverwrittenWidth] = useState(undefined); function handleOpenTopic(e: React.MouseEvent) { if (lastActiveTopic.unreadCount === 0) return; e.stopPropagation(); e.preventDefault(); openChat({ id: chat.id, threadId: lastActiveTopic.id, shouldReplaceHistory: true, noForumTopicPanel: getIsMobile(), }); } useLayoutEffect(() => { const lastMessageElement = lastMessageRef.current; const mainColumnElement = mainColumnRef.current; if (!lastMessageElement || !mainColumnElement) return; const lastMessageWidth = lastMessageElement.offsetWidth; const mainColumnWidth = mainColumnElement.offsetWidth; if (Math.abs(lastMessageWidth - mainColumnWidth) < NO_CORNER_THRESHOLD) { setOverwrittenWidth(Math.max(lastMessageWidth, mainColumnWidth)); } else { setOverwrittenWidth(undefined); } setIsReversedCorner(lastMessageWidth > mainColumnWidth); }, [lastActiveTopic, lastMessage]); return (
{lastActiveTopic && (
{renderText(lastActiveTopic.title)}
{!overwrittenWidth && isReversedCorner && (
)}
{otherTopics.map((topic) => (
{renderText(topic.title)}
))}
)} {!lastActiveTopic &&
{lang('Loading')}
}
{lastMessage} {!overwrittenWidth && !isReversedCorner && (
)}
); }; export default memo(ChatForumLastMessage);