Merge pull request #848 from gotify/fix-read-more

Fix read more
This commit is contained in:
Jannis Mattheis 2025-09-21 09:59:28 +02:00 committed by GitHub
commit f77d404bba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 32 additions and 10 deletions

View File

@ -2,6 +2,16 @@ import React from 'react';
import ReactMarkdown from 'react-markdown';
import gfm from 'remark-gfm';
export const Markdown = ({children}: {children: string}) => (
<ReactMarkdown remarkPlugins={[gfm]}>{children}</ReactMarkdown>
export const Markdown = ({
children,
onImageLoaded = () => {},
}: {
children: string;
onImageLoaded?: () => void;
}) => (
<ReactMarkdown
components={{img: ({...props}) => <img onLoad={onImageLoaded} {...props} />}}
remarkPlugins={[gfm]}>
{children}
</ReactMarkdown>
);

View File

@ -127,15 +127,27 @@ const Message = ({
expanded: initialExpanded,
}: IProps) => {
const theme = useTheme();
const [previewRef, setPreviewRef] = React.useState<HTMLDivElement | null>(null);
const contentRef = React.useRef<HTMLDivElement | null>(null);
const {classes} = useStyles();
const [expanded, setExpanded] = React.useState(initialExpanded);
const [isOverflowing, setOverflowing] = React.useState(false);
const smallHeader = useMediaQuery(theme.breakpoints.down('md'));
React.useEffect(() => {
setOverflowing(!!previewRef && previewRef.scrollHeight > previewRef.clientHeight);
}, [previewRef]);
const refreshOverflowing = React.useCallback(() => {
const ref = contentRef.current;
if (!ref) {
return;
}
setOverflowing((overflowing) => overflowing || ref.scrollHeight > ref.clientHeight);
}, [contentRef, setOverflowing]);
const onContentRef = React.useCallback(
(ref: HTMLDivElement | null) => {
contentRef.current = ref;
refreshOverflowing();
},
[contentRef, refreshOverflowing]
);
React.useEffect(() => void onExpand(expanded), [expanded]);
@ -144,7 +156,7 @@ const Message = ({
const renderContent = () => {
switch (contentType(extras)) {
case RenderMode.Markdown:
return <Markdown>{content}</Markdown>;
return <Markdown onImageLoaded={refreshOverflowing}>{content}</Markdown>;
case RenderMode.Plain:
default:
return <span className={classes.plainContent}>{content}</span>;
@ -181,7 +193,7 @@ const Message = ({
<div className={classes.messageContentWrapper}>
<Typography
component="div"
ref={setPreviewRef}
ref={onContentRef}
className={`${classes.content} content ${
isOverflowing && expanded ? 'expanded' : ''
}`}>

View File

@ -33,9 +33,9 @@ const Messages = observer(() => {
}
}, [appId]);
const renderMessage = (index: number, message: IMessage) => (
const renderMessage = (_index: number, message: IMessage) => (
<Message
key={index}
key={message.id}
fDelete={deleteMessage(message)}
onExpand={(expanded) => (expandedState.current[message.id] = expanded)}
title={message.title}