@@ -2,16 +2,26 @@ import {
22 Avatar ,
33 Box ,
44 Chip ,
5+ Button ,
6+ Dialog ,
7+ Header ,
58 Icon ,
69 IconButton ,
710 Icons ,
11+ Input ,
812 Line ,
913 Menu ,
1014 MenuItem ,
15+ Modal ,
16+ Overlay ,
17+ OverlayBackdrop ,
18+ OverlayCenter ,
1119 PopOut ,
1220 RectCords ,
21+ Spinner ,
1322 Text ,
1423 as ,
24+ color ,
1525 config ,
1626} from 'folds' ;
1727import {
@@ -57,6 +67,7 @@ import { getSettings, MessageLayout, MessageSpacing, settingsAtom } from '$state
5767import { nicknamesAtom , setNicknameAtom } from '$state/nicknames' ;
5868import { useMatrixClient } from '$hooks/useMatrixClient' ;
5969import { useRecentEmoji } from '$hooks/useRecentEmoji' ;
70+ import { EventReaders } from '../../../components/event-readers' ;
6071import { EmojiBoard } from '$components/emoji-board' ;
6172import { UserAvatar } from '$components/user-avatar' ;
6273import { copyToClipboard } from '$utils/dom' ;
@@ -75,7 +86,6 @@ import { useUserProfile } from '$hooks/useUserProfile';
7586import { useSetting } from '$state/hooks/settings' ;
7687import { useBlobCache } from '$hooks/useBlobCache' ;
7788import { MessageAllReactionItem } from '$components/message/modals/MessageReactions' ;
78- import { MessageReadReceiptItem } from '$components/message/modals/MessageReadRecipts' ;
7989import { MessageEditHistoryItem } from '$components/message/modals/MessageEditHistory' ;
8090import { MessageSourceCodeItem } from '$components/message/modals/MessageSource' ;
8191import { MessageForwardItem } from '$components/message/modals/MessageForward' ;
@@ -134,9 +144,59 @@ export const MessageQuickReactions = as<'div', MessageQuickReactionsProps>(
134144 < Line size = "300" />
135145 </ >
136146 ) ;
137- }
147+ } ,
138148) ;
139149
150+ export const MessageReadReceiptItem = as <
151+ 'button' ,
152+ {
153+ room : Room ;
154+ eventId : string ;
155+ onClose ?: ( ) => void ;
156+ }
157+ > ( ( { room, eventId, onClose, ...props } , ref ) => {
158+ const [ open , setOpen ] = useState ( false ) ;
159+
160+ const handleClose = ( ) => {
161+ setOpen ( false ) ;
162+ onClose ?.( ) ;
163+ } ;
164+
165+ return (
166+ < >
167+ < Overlay open = { open } backdrop = { < OverlayBackdrop /> } >
168+ < OverlayCenter >
169+ < FocusTrap
170+ focusTrapOptions = { {
171+ initialFocus : false ,
172+ onDeactivate : handleClose ,
173+ clickOutsideDeactivates : true ,
174+ escapeDeactivates : stopPropagation ,
175+ } }
176+ >
177+ < Modal variant = "Surface" size = "300" >
178+ < EventReaders room = { room } eventId = { eventId } requestClose = { handleClose } />
179+ </ Modal >
180+ </ FocusTrap >
181+ </ OverlayCenter >
182+ </ Overlay >
183+ < MenuItem
184+ size = "300"
185+ after = { < Icon size = "100" src = { Icons . CheckTwice } /> }
186+ radii = "300"
187+ onClick = { ( ) => setOpen ( true ) }
188+ { ...props }
189+ ref = { ref }
190+ aria-pressed = { open }
191+ >
192+ < Text className = { css . MessageMenuItemText } as = "span" size = "T300" truncate >
193+ Read Receipts
194+ </ Text >
195+ </ MenuItem >
196+ </ >
197+ ) ;
198+ } ) ;
199+
140200export const MessageCopyLinkItem = as <
141201 'button' ,
142202 {
@@ -242,7 +302,7 @@ export type MessageProps = {
242302 onUsernameClick : MouseEventHandler < HTMLButtonElement > ;
243303 onReplyClick : (
244304 ev : Parameters < MouseEventHandler < HTMLButtonElement > > [ 0 ] ,
245- startThread ?: boolean
305+ startThread ?: boolean ,
246306 ) => void ;
247307 onEditId ?: ( eventId ?: string ) => void ;
248308 onReactionToggle : ( targetEventId : string , key : string , shortcode ?: string ) => void ;
@@ -282,7 +342,7 @@ function useMobileDoubleTap(callback: () => void, delay = 300) {
282342 lastTapRef . current = now ;
283343 }
284344 } ,
285- [ callback , delay ]
345+ [ callback , delay ] ,
286346 ) ;
287347}
288348
@@ -315,7 +375,7 @@ const Pronouns = as<
315375 const visiblePronouns = filterPronounsByLanguage (
316376 pronouns ,
317377 languageFilterEnabled ,
318- selectedLanguages
378+ selectedLanguages ,
319379 ) ;
320380
321381 const clamp = ( str : string , len : number ) => ( str . length > len ? `${ str . slice ( 0 , len ) } ...` : str ) ;
@@ -377,7 +437,7 @@ function MessageInternal(
377437 msc2723ForwardedMessageProps,
378438 ...props
379439 } : MessageProps & { className ?: string ; children ?: ReactNode } ,
380- ref : any
440+ ref : any ,
381441) {
382442 const mx = useMatrixClient ( ) ;
383443 const useAuthentication = useMediaAuthentication ( ) ;
@@ -661,7 +721,7 @@ function MessageInternal(
661721 evt . stopPropagation ( ) ;
662722 onResend ?.( mEvent ) ;
663723 } ,
664- [ mEvent , onResend ]
724+ [ mEvent , onResend ] ,
665725 ) ;
666726
667727 const handleDeleteFailedSendClick : MouseEventHandler < HTMLButtonElement > = useCallback (
@@ -670,7 +730,7 @@ function MessageInternal(
670730 evt . stopPropagation ( ) ;
671731 onDeleteFailedSend ?.( mEvent ) ;
672732 } ,
673- [ mEvent , onDeleteFailedSend ]
733+ [ mEvent , onDeleteFailedSend ] ,
674734 ) ;
675735
676736 const MSG_CONTENT_STYLE = { maxWidth : '100%' } ;
@@ -984,7 +1044,7 @@ function MessageInternal(
9841044 `sticker-${ mEvent . getId ( ) } ` ,
9851045 mEvent . getContent ( ) . url ?? mEvent . getContent ( ) . file ?. url ?? '' ,
9861046 mEvent . getContent ( ) . body ,
987- mEvent . getContent ( ) . info
1047+ mEvent . getContent ( ) . info ,
9881048 ) ;
9891049 closeMenu ( ) ;
9901050 } }
@@ -1057,7 +1117,11 @@ function MessageInternal(
10571117 </ MenuItem >
10581118 ) }
10591119 { ! hideReadReceipts && (
1060- < MessageReadReceiptItem room = { room } eventId = { mEvent . getId ( ) ?? '' } />
1120+ < MessageReadReceiptItem
1121+ room = { room }
1122+ eventId = { mEvent . getId ( ) ?? '' }
1123+ onClose = { closeMenu }
1124+ />
10611125 ) }
10621126 { isEdited && (
10631127 < MessageEditHistoryItem
@@ -1232,7 +1296,7 @@ export type EventProps = {
12321296 canDelete ?: boolean ;
12331297 onReplyClick : (
12341298 ev : Parameters < MouseEventHandler < HTMLButtonElement > > [ 0 ] ,
1235- startThread ?: boolean
1299+ startThread ?: boolean ,
12361300 ) => void ;
12371301 messageSpacing : MessageSpacing ;
12381302 hideReadReceipts ?: boolean ;
@@ -1256,7 +1320,7 @@ export const Event = as<'div', EventProps>(
12561320 children,
12571321 ...props
12581322 } ,
1259- ref
1323+ ref ,
12601324 ) => {
12611325 const mx = useMatrixClient ( ) ;
12621326 const stateEvent = typeof mEvent . getStateKey ( ) === 'string' ;
@@ -1452,5 +1516,5 @@ export const Event = as<'div', EventProps>(
14521516 </ div >
14531517 </ MessageBase >
14541518 ) ;
1455- }
1519+ } ,
14561520) ;
0 commit comments