@@ -14,16 +14,16 @@ See the License for the specific language governing permissions and
1414limitations under the License.
1515*/
1616
17- import React , { useContext } from "react" ;
17+ import React , { useContext , useState } from "react" ;
1818import { Thread , ThreadEvent } from "matrix-js-sdk/src/models/thread" ;
19- import { MatrixEvent , MatrixEventEvent } from "matrix-js-sdk/src/models/event" ;
19+ import { IContent , MatrixEvent , MatrixEventEvent } from "matrix-js-sdk/src/models/event" ;
2020
2121import { _t } from "../../../languageHandler" ;
2222import { CardContext } from "../right_panel/context" ;
2323import AccessibleButton , { ButtonEvent } from "../elements/AccessibleButton" ;
2424import { showThread } from "../../../dispatcher/dispatch-actions/threads" ;
2525import PosthogTrackers from "../../../PosthogTrackers" ;
26- import { useTypedEventEmitterState } from "../../../hooks/useEventEmitter" ;
26+ import { useTypedEventEmitter , useTypedEventEmitterState } from "../../../hooks/useEventEmitter" ;
2727import RoomContext from "../../../contexts/RoomContext" ;
2828import { MessagePreviewStore } from "../../../stores/room-list/MessagePreviewStore" ;
2929import MemberAvatar from "../avatars/MemberAvatar" ;
@@ -76,18 +76,21 @@ export const ThreadMessagePreview = ({ thread, showDisplayname = false }: IPrevi
7676 const cli = useContext ( MatrixClientContext ) ;
7777
7878 const lastReply = useTypedEventEmitterState ( thread , ThreadEvent . Update , ( ) => thread . replyToEvent ) ;
79- // track the replacing event id as a means to regenerate the thread message preview
80- const replacingEventId = useTypedEventEmitterState (
81- lastReply ,
82- MatrixEventEvent . Replaced ,
83- ( ) => lastReply ?. replacingEventId ( ) ,
84- ) ;
79+ // track the content as a means to regenerate the thread message preview upon edits & decryption
80+ const [ content , setContent ] = useState < IContent > ( lastReply ?. getContent ( ) ) ;
81+ useTypedEventEmitter ( lastReply , MatrixEventEvent . Replaced , ( ) => {
82+ setContent ( lastReply . getContent ( ) ) ;
83+ } ) ;
84+ const awaitDecryption = lastReply ?. shouldAttemptDecryption ( ) || lastReply ?. isBeingDecrypted ( ) ;
85+ useTypedEventEmitter ( awaitDecryption ? lastReply : null , MatrixEventEvent . Decrypted , ( ) => {
86+ setContent ( lastReply . getContent ( ) ) ;
87+ } ) ;
8588
8689 const preview = useAsyncMemo ( async ( ) => {
8790 if ( ! lastReply ) return ;
8891 await cli . decryptEventIfNeeded ( lastReply ) ;
8992 return MessagePreviewStore . instance . generatePreviewForEvent ( lastReply ) ;
90- } , [ lastReply , replacingEventId ] ) ;
93+ } , [ lastReply , content ] ) ;
9194 if ( ! preview ) return null ;
9295
9396 return < >
0 commit comments