Skip to content

Commit f77d404

Browse files
authored
Merge pull request #848 from gotify/fix-read-more
Fix read more
2 parents 632ccc9 + 9ff713c commit f77d404

File tree

3 files changed

+32
-10
lines changed

3 files changed

+32
-10
lines changed

ui/src/common/Markdown.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,16 @@ import React from 'react';
22
import ReactMarkdown from 'react-markdown';
33
import gfm from 'remark-gfm';
44

5-
export const Markdown = ({children}: {children: string}) => (
6-
<ReactMarkdown remarkPlugins={[gfm]}>{children}</ReactMarkdown>
5+
export const Markdown = ({
6+
children,
7+
onImageLoaded = () => {},
8+
}: {
9+
children: string;
10+
onImageLoaded?: () => void;
11+
}) => (
12+
<ReactMarkdown
13+
components={{img: ({...props}) => <img onLoad={onImageLoaded} {...props} />}}
14+
remarkPlugins={[gfm]}>
15+
{children}
16+
</ReactMarkdown>
717
);

ui/src/message/Message.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,15 +127,27 @@ const Message = ({
127127
expanded: initialExpanded,
128128
}: IProps) => {
129129
const theme = useTheme();
130-
const [previewRef, setPreviewRef] = React.useState<HTMLDivElement | null>(null);
130+
const contentRef = React.useRef<HTMLDivElement | null>(null);
131131
const {classes} = useStyles();
132132
const [expanded, setExpanded] = React.useState(initialExpanded);
133133
const [isOverflowing, setOverflowing] = React.useState(false);
134134
const smallHeader = useMediaQuery(theme.breakpoints.down('md'));
135135

136-
React.useEffect(() => {
137-
setOverflowing(!!previewRef && previewRef.scrollHeight > previewRef.clientHeight);
138-
}, [previewRef]);
136+
const refreshOverflowing = React.useCallback(() => {
137+
const ref = contentRef.current;
138+
if (!ref) {
139+
return;
140+
}
141+
setOverflowing((overflowing) => overflowing || ref.scrollHeight > ref.clientHeight);
142+
}, [contentRef, setOverflowing]);
143+
144+
const onContentRef = React.useCallback(
145+
(ref: HTMLDivElement | null) => {
146+
contentRef.current = ref;
147+
refreshOverflowing();
148+
},
149+
[contentRef, refreshOverflowing]
150+
);
139151

140152
React.useEffect(() => void onExpand(expanded), [expanded]);
141153

@@ -144,7 +156,7 @@ const Message = ({
144156
const renderContent = () => {
145157
switch (contentType(extras)) {
146158
case RenderMode.Markdown:
147-
return <Markdown>{content}</Markdown>;
159+
return <Markdown onImageLoaded={refreshOverflowing}>{content}</Markdown>;
148160
case RenderMode.Plain:
149161
default:
150162
return <span className={classes.plainContent}>{content}</span>;
@@ -181,7 +193,7 @@ const Message = ({
181193
<div className={classes.messageContentWrapper}>
182194
<Typography
183195
component="div"
184-
ref={setPreviewRef}
196+
ref={onContentRef}
185197
className={`${classes.content} content ${
186198
isOverflowing && expanded ? 'expanded' : ''
187199
}`}>

ui/src/message/Messages.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ const Messages = observer(() => {
3333
}
3434
}, [appId]);
3535

36-
const renderMessage = (index: number, message: IMessage) => (
36+
const renderMessage = (_index: number, message: IMessage) => (
3737
<Message
38-
key={index}
38+
key={message.id}
3939
fDelete={deleteMessage(message)}
4040
onExpand={(expanded) => (expandedState.current[message.id] = expanded)}
4141
title={message.title}

0 commit comments

Comments
 (0)