11import { hooks } from 'botframework-webchat-api' ;
22import { validateProps } from 'botframework-webchat-react-valibot' ;
33import classNames from 'classnames' ;
4- import React , { memo , useCallback , useEffect , useRef , useState } from 'react' ;
4+ import React , { memo , useCallback , useEffect , useRef } from 'react' ;
5+ import { wrapWith } from 'react-wrap-with' ;
56import { instance , nullable , object , optional , pipe , readonly , string , type InferInput } from 'valibot' ;
67
78import useStyleSet from '../../../hooks/useStyleSet' ;
9+ import ClipboardWritePermissionComposer , {
10+ useClipboardWritePermissionHooks
11+ } from '../../../providers/ClipboardWritePermission/ClipboardWritePermissionComposer' ;
812import { useQueueStaticElement } from '../../../providers/LiveRegionTwin' ;
913import refObject from '../../../types/internal/refObject' ;
1014import ActivityButton from './ActivityButton' ;
@@ -23,11 +27,11 @@ type ActivityCopyButtonProps = InferInput<typeof activityCopyButtonPropsSchema>;
2327
2428const COPY_ICON_URL = `data:image/svg+xml;utf8,${ encodeURIComponent ( '<svg xmlns="http://www.w3.org/2000/svg" width="21" height="20" viewBox="0 0 21 20" fill="none"><path d="M8.5 2C7.39543 2 6.5 2.89543 6.5 4V14C6.5 15.1046 7.39543 16 8.5 16H14.5C15.6046 16 16.5 15.1046 16.5 14V4C16.5 2.89543 15.6046 2 14.5 2H8.5ZM7.5 4C7.5 3.44772 7.94772 3 8.5 3H14.5C15.0523 3 15.5 3.44772 15.5 4V14C15.5 14.5523 15.0523 15 14.5 15H8.5C7.94772 15 7.5 14.5523 7.5 14V4ZM4.5 6.00001C4.5 5.25973 4.9022 4.61339 5.5 4.26758V14.5C5.5 15.8807 6.61929 17 8 17H14.2324C13.8866 17.5978 13.2403 18 12.5 18H8C6.067 18 4.5 16.433 4.5 14.5V6.00001Z" fill="#000000"/></svg>' ) } ` ;
2529
26- const ActivityCopyButton = ( props : ActivityCopyButtonProps ) => {
30+ function ActivityCopyButton ( props : ActivityCopyButtonProps ) {
2731 const { className, targetRef } = validateProps ( activityCopyButtonPropsSchema , props ) ;
2832
2933 const [ { activityButton, activityCopyButton } ] = useStyleSet ( ) ;
30- const [ permissionGranted , setPermissionGranted ] = useState ( false ) ;
34+ const [ permissionGranted ] = useClipboardWritePermissionHooks ( ) . usePermissionGranted ( ) ;
3135 const [ uiState ] = useUIState ( ) ;
3236 const buttonRef = useRef < HTMLButtonElement > ( null ) ;
3337 const localize = useLocalizer ( ) ;
@@ -73,20 +77,6 @@ const ActivityCopyButton = (props: ActivityCopyButtonProps) => {
7377 queueStaticElement ( < div className = "webchat__activity-copy-button__copy-announcement" > { copiedText } </ div > ) ;
7478 } , [ buttonRef , copiedText , queueStaticElement , targetRef ] ) ;
7579
76- useEffect ( ( ) => {
77- let unmounted = false ;
78-
79- ( async function ( ) {
80- if ( ( await navigator . permissions . query ( { name : 'clipboard-write' as any } ) ) . state === 'granted' ) {
81- unmounted || setPermissionGranted ( true ) ;
82- }
83- } ) ( ) ;
84-
85- return ( ) => {
86- unmounted = true ;
87- } ;
88- } , [ setPermissionGranted ] ) ;
89-
9080 return (
9181 < ActivityButton
9282 className = { classNames (
@@ -106,9 +96,7 @@ const ActivityCopyButton = (props: ActivityCopyButtonProps) => {
10696 < span className = "webchat__activity-copy-button__copied-text" > { copiedText } </ span >
10797 </ ActivityButton >
10898 ) ;
109- } ;
110-
111- ActivityCopyButton . displayName = 'ActivityCopyButton' ;
99+ }
112100
113- export default memo ( ActivityCopyButton ) ;
101+ export default memo ( wrapWith ( ClipboardWritePermissionComposer ) ( ActivityCopyButton ) ) ;
114102export { activityCopyButtonPropsSchema , type ActivityCopyButtonProps } ;
0 commit comments