11import './index.scss' ;
2- import React , {
3- ReactElement ,
4- useContext ,
5- useMemo ,
6- useRef ,
7- } from 'react' ;
8- import type { UserMessage } from '@sendbird/chat/message' ;
2+ import React , { ReactElement , useContext , useEffect , useMemo , useRef } from 'react' ;
3+ import type { OGImage , OGMetaData , UserMessage } from '@sendbird/chat/message' ;
94
105import ImageRenderer from '../ImageRenderer' ;
116import Icon , { IconTypes } from '../Icon' ;
@@ -16,6 +11,7 @@ import TextFragment from '../../modules/Message/components/TextFragment';
1611import { tokenizeMessage } from '../../modules/Message/utils/tokens/tokenize' ;
1712import { OG_MESSAGE_BODY_CLASSNAME } from './consts' ;
1813import { useMediaQueryContext } from '../../lib/MediaQueryContext' ;
14+ import { openURL } from '../../utils/utils' ;
1915
2016interface Props {
2117 className ?: string | Array < string > ;
@@ -34,21 +30,12 @@ export default function OGMessageItemBody({
3430 mouseHover = false ,
3531 isMentionEnabled = false ,
3632 isReactionEnabled = false ,
37- onMessageHeightChange = ( ) => { /* noop */ } ,
33+ onMessageHeightChange = ( ) => {
34+ /* noop */
35+ } ,
3836} : Props ) : ReactElement {
39- const imageRef = useRef < HTMLDivElement > ( null ) ;
4037 const { stringSet } = useContext ( LocalizationContext ) ;
41- const { isMobile } = useMediaQueryContext ( ) ;
4238
43- const openOGUrl = ( ) : void => {
44- let url = message ?. ogMetaData ?. url ;
45- if ( url ) {
46- if ( ! url . startsWith ( 'http://' ) && ! url . startsWith ( 'https://' ) ) {
47- url = 'https://' + url ;
48- }
49- window . open ( url ) ;
50- }
51- } ;
5239 const isMessageMentioned = isMentionEnabled && message ?. mentionedMessageTemplate ?. length > 0 && message ?. mentionedUsers ?. length > 0 ;
5340 const tokens = useMemo ( ( ) => {
5441 if ( isMessageMentioned ) {
@@ -61,99 +48,125 @@ export default function OGMessageItemBody({
6148 messageText : message ?. message ,
6249 } ) ;
6350 } , [ message ?. updatedAt , message ?. message ] ) ;
51+
52+ const openOpenGraphURL = ( ) => openURL ( message ?. ogMetaData ?. url ) ;
53+
6454 return (
65- < div className = { getClassName ( [
66- className ,
67- 'sendbird-og-message-item-body' ,
68- isByMe ? 'outgoing' : 'incoming' ,
69- mouseHover ? 'mouse-hover' : '' ,
70- ( isReactionEnabled && message ?. reactions ?. length > 0 ) ? 'reactions' : '' ,
71- ] ) } >
72- < Label
73- type = { LabelTypography . BODY_1 }
74- color = { isByMe ? LabelColors . ONCONTENT_1 : LabelColors . ONBACKGROUND_1 }
75- >
55+ < div
56+ className = { getClassName ( [
57+ className ,
58+ 'sendbird-og-message-item-body' ,
59+ isByMe ? 'outgoing' : 'incoming' ,
60+ mouseHover ? 'mouse-hover' : '' ,
61+ isReactionEnabled && message ?. reactions ?. length > 0 ? 'reactions' : '' ,
62+ ] ) }
63+ >
64+ < Label type = { LabelTypography . BODY_1 } color = { isByMe ? LabelColors . ONCONTENT_1 : LabelColors . ONBACKGROUND_1 } >
7665 < div className = { OG_MESSAGE_BODY_CLASSNAME } >
7766 < TextFragment tokens = { tokens } />
78- {
79- isEditedMessage ( message ) && (
80- < Label
81- className = "sendbird-og-message-item-body__text-bubble__message"
82- type = { LabelTypography . BODY_1 }
83- color = { isByMe ? LabelColors . ONCONTENT_2 : LabelColors . ONBACKGROUND_2 }
84- >
85- { ` ${ stringSet . MESSAGE_EDITED } ` }
86- </ Label >
87- )
88- }
67+ { isEditedMessage ( message ) && (
68+ < Label
69+ className = "sendbird-og-message-item-body__text-bubble__message"
70+ type = { LabelTypography . BODY_1 }
71+ color = { isByMe ? LabelColors . ONCONTENT_2 : LabelColors . ONBACKGROUND_2 }
72+ >
73+ { ` ${ stringSet . MESSAGE_EDITED } ` }
74+ </ Label >
75+ ) }
8976 </ div >
9077 </ Label >
91- < div
92- ref = { imageRef }
93- className = { `sendbird-og-message-item-body__og-thumbnail
94- ${ message ?. ogMetaData ?. defaultImage ?. url ? '' : 'sendbird-og-message-item-body__og-thumbnail__empty' }
95- ` }
96- onClick = { openOGUrl }
97- >
98- < ImageRenderer
99- className = "sendbird-og-message-item-body__og-thumbnail__image"
100- url = { message ?. ogMetaData ?. defaultImage ?. url || '' }
101- alt = { message ?. ogMetaData ?. defaultImage ?. alt }
102- width = "100%"
103- height = { isMobile ? '136px' : '240px' }
104- onLoad = { onMessageHeightChange }
105- onError = { ( ) => {
106- try {
107- imageRef ?. current ?. classList ?. add ( 'sendbird-og-message-item-body__og-thumbnail__empty' ) ;
108- } catch ( error ) {
109- // do nothing
110- }
111- } }
112- defaultComponent = { (
113- < div className = "sendbird-og-message-item-body__og-thumbnail__place-holder" >
114- < Icon
115- className = "sendbird-og-message-item-body__og-thumbnail__place-holder__icon"
116- type = { IconTypes . THUMBNAIL_NONE }
117- width = "56px"
118- height = "56px"
119- />
120- </ div >
121- ) }
78+ { message . ogMetaData ?. defaultImage && (
79+ < OGImageSection
80+ onClick = { openOpenGraphURL }
81+ ogImage = { message . ogMetaData . defaultImage }
82+ onMessageHeightChange = { onMessageHeightChange }
12283 />
123- </ div >
124- < div
125- className = "sendbird-og-message-item-body__description"
126- onClick = { openOGUrl }
127- >
128- { message ?. ogMetaData ?. title && (
129- < Label
130- className = "sendbird-og-message-item-body__description__title"
131- type = { LabelTypography . SUBTITLE_2 }
132- color = { LabelColors . ONBACKGROUND_1 }
133- >
134- { message . ogMetaData . title }
135- </ Label >
136- ) }
137- { message ?. ogMetaData ?. description && (
138- < Label
139- className = "sendbird-og-message-item-body__description__description"
140- type = { LabelTypography . BODY_2 }
141- color = { LabelColors . ONBACKGROUND_1 }
142- >
143- { message . ogMetaData . description }
144- </ Label >
145- ) }
146- { message ?. ogMetaData ?. url && (
147- < Label
148- className = "sendbird-og-message-item-body__description__url"
149- type = { LabelTypography . CAPTION_3 }
150- color = { LabelColors . ONBACKGROUND_2 }
151- >
152- { message . ogMetaData . url }
153- </ Label >
154- ) }
155- </ div >
84+ ) }
85+ { message . ogMetaData && (
86+ < OGDescriptionSection onClick = { openOpenGraphURL } ogMetaData = { message . ogMetaData } onMessageHeightChange = { onMessageHeightChange } />
87+ ) }
15688 < div className = "sendbird-og-message-item-body__cover" />
15789 </ div >
15890 ) ;
15991}
92+
93+ const OGImageSection = ( props : { onClick : ( ) => void ; ogImage : OGImage ; onMessageHeightChange : ( ) => void } ) => {
94+ const { onClick, ogImage, onMessageHeightChange } = props ;
95+
96+ const imageRef = useRef < HTMLDivElement > ( null ) ;
97+ const { isMobile } = useMediaQueryContext ( ) ;
98+
99+ return (
100+ < div
101+ ref = { imageRef }
102+ className = { `sendbird-og-message-item-body__og-thumbnail ${ ogImage . url ? '' : 'sendbird-og-message-item-body__og-thumbnail__empty' } ` }
103+ onClick = { ( ) => onClick ( ) }
104+ >
105+ < ImageRenderer
106+ className = "sendbird-og-message-item-body__og-thumbnail__image"
107+ url = { ogImage . url || '' }
108+ alt = { ogImage . alt }
109+ width = "100%"
110+ height = { isMobile ? '136px' : '240px' }
111+ onLoad = { onMessageHeightChange }
112+ onError = { ( ) => {
113+ try {
114+ imageRef ?. current ?. classList ?. add ( 'sendbird-og-message-item-body__og-thumbnail__empty' ) ;
115+ } catch ( error ) {
116+ // do nothing
117+ }
118+ } }
119+ defaultComponent = {
120+ < div className = "sendbird-og-message-item-body__og-thumbnail__place-holder" >
121+ < Icon
122+ className = "sendbird-og-message-item-body__og-thumbnail__place-holder__icon"
123+ type = { IconTypes . THUMBNAIL_NONE }
124+ width = "56px"
125+ height = "56px"
126+ />
127+ </ div >
128+ }
129+ />
130+ </ div >
131+ ) ;
132+ } ;
133+
134+ const OGDescriptionSection = ( props : { onClick : ( ) => void ; ogMetaData : OGMetaData ; onMessageHeightChange : ( ) => void } ) => {
135+ const { onClick, ogMetaData, onMessageHeightChange } = props ;
136+
137+ useEffect ( ( ) => {
138+ onMessageHeightChange ( ) ;
139+ } , [ ogMetaData . title , ogMetaData . description , ogMetaData . url ] ) ;
140+
141+ return (
142+ < div className = "sendbird-og-message-item-body__description" onClick = { ( ) => onClick ( ) } >
143+ { ogMetaData . title && (
144+ < Label
145+ className = "sendbird-og-message-item-body__description__title"
146+ type = { LabelTypography . SUBTITLE_2 }
147+ color = { LabelColors . ONBACKGROUND_1 }
148+ >
149+ { ogMetaData . title }
150+ </ Label >
151+ ) }
152+ { ogMetaData . description && (
153+ < Label
154+ className = "sendbird-og-message-item-body__description__description"
155+ type = { LabelTypography . BODY_2 }
156+ color = { LabelColors . ONBACKGROUND_1 }
157+ >
158+ { ogMetaData . description }
159+ </ Label >
160+ ) }
161+ { ogMetaData . url && (
162+ < Label
163+ className = "sendbird-og-message-item-body__description__url"
164+ type = { LabelTypography . CAPTION_3 }
165+ color = { LabelColors . ONBACKGROUND_2 }
166+ >
167+ { ogMetaData . url }
168+ </ Label >
169+ ) }
170+ </ div >
171+ ) ;
172+ } ;
0 commit comments