11import clsx from 'clsx' ;
22import React , { useState } from 'react' ;
3- import { useMessageInputContext } from '../../context' ;
4- import type { LinkPreview } from './types' ;
5- import { LinkPreviewState } from './types' ;
6- import { CloseIcon , LinkIcon } from './icons' ;
3+ import { LinkPreviewStatus } from 'stream-chat' ;
4+ import { useStateStore } from '../../store' ;
75import { PopperTooltip } from '../Tooltip' ;
86import { useEnterLeaveHandlers } from '../Tooltip/hooks' ;
97import { useMessageComposer } from './hooks/messageComposer/useMessageComposer' ;
10- import { useStateStore } from '../../store ' ;
8+ import { CloseIcon , LinkIcon } from './icons ' ;
119
12- import type { MessageComposerState } from 'stream-chat' ;
10+ import type {
11+ LinkPreview ,
12+ LinkPreviewsManagerConfig ,
13+ LinkPreviewsManagerState ,
14+ MessageComposerState ,
15+ } from 'stream-chat' ;
1316
14- export type LinkPreviewListProps = {
15- linkPreviews : LinkPreview [ ] ;
16- } ;
17+ const linkPreviewsManagerStateSelector = ( state : LinkPreviewsManagerState ) => ( {
18+ linkPreviews : Array . from ( state . previews . values ( ) ) ,
19+ } ) ;
20+
21+ const linkPreviewsManagerConfigStateSelector = ( state : LinkPreviewsManagerConfig ) => ( {
22+ linkPreviewsEnabled : state . enabled ,
23+ } ) ;
1724
1825const messageComposerStateSelector = ( state : MessageComposerState ) => ( {
1926 quotedMessage : state . quotedMessage ,
2027} ) ;
2128
22- export const LinkPreviewList = ( { linkPreviews } : LinkPreviewListProps ) => {
29+ export const LinkPreviewList = ( ) => {
2330 const messageComposer = useMessageComposer ( ) ;
31+ const { linkPreviewsManager } = messageComposer ;
2432 const { quotedMessage } = useStateStore (
2533 messageComposer . state ,
2634 messageComposerStateSelector ,
2735 ) ;
28- const showLinkPreviews = linkPreviews . length > 0 && ! quotedMessage ;
36+ const { linkPreviews } = useStateStore (
37+ linkPreviewsManager . state ,
38+ linkPreviewsManagerStateSelector ,
39+ ) ;
40+ const { linkPreviewsEnabled } = useStateStore (
41+ linkPreviewsManager . configState ,
42+ linkPreviewsManagerConfigStateSelector ,
43+ ) ;
44+ const showLinkPreviews =
45+ linkPreviewsEnabled && linkPreviews . length > 0 && ! quotedMessage ;
2946
3047 if ( ! showLinkPreviews ) return null ;
3148
3249 return (
3350 < div className = 'str-chat__link-preview-list' >
34- { Array . from ( linkPreviews . values ( ) ) . map ( ( linkPreview ) =>
35- linkPreview . state === LinkPreviewState . LOADED ? (
51+ { linkPreviews . map ( ( linkPreview ) =>
52+ linkPreview . status === LinkPreviewStatus . LOADED ? (
3653 < LinkPreviewCard key = { linkPreview . og_scrape_url } linkPreview = { linkPreview } />
3754 ) : null ,
3855 ) }
@@ -45,15 +62,14 @@ type LinkPreviewProps = {
4562} ;
4663
4764const LinkPreviewCard = ( { linkPreview } : LinkPreviewProps ) => {
48- const { dismissLinkPreview } = useMessageInputContext ( ) ;
4965 const { handleEnter, handleLeave, tooltipVisible } =
5066 useEnterLeaveHandlers < HTMLDivElement > ( ) ;
5167 const [ referenceElement , setReferenceElement ] = useState < HTMLDivElement | null > ( null ) ;
5268 return (
5369 < div
5470 className = { clsx ( 'str-chat__link-preview-card' , {
5571 'str-chat__link-preview-card--loading' :
56- linkPreview . state === LinkPreviewState . LOADING ,
72+ linkPreview . status === LinkPreviewStatus . LOADING ,
5773 } ) }
5874 data-testid = 'link-preview-card'
5975 >
@@ -83,7 +99,7 @@ const LinkPreviewCard = ({ linkPreview }: LinkPreviewProps) => {
8399 < button
84100 className = 'str-chat__link-preview-card__dismiss-button'
85101 data-testid = 'link-preview-card-dismiss-btn'
86- onClick = { ( ) => dismissLinkPreview ( linkPreview ) }
102+ onClick = { linkPreview . dismiss }
87103 >
88104 < CloseIcon />
89105 </ button >
0 commit comments