@@ -6,14 +6,16 @@ import {
66 ExternalLink ,
77 // eslint-disable-next-line @wordpress/no-unsafe-wp-apis
88 __experimentalHStack as HStack ,
9+ Modal ,
910} from '@wordpress/components' ;
10- import { useResizeObserver } from '@wordpress/compose' ;
11+ import { useResizeObserver , useViewportMatch } from '@wordpress/compose' ;
1112import { DataViews } from '@wordpress/dataviews/wp' ;
1213import { dateI18n , getSettings as getDateSettings } from '@wordpress/date' ;
1314import { useCallback , useMemo , useState } from '@wordpress/element' ;
1415import { decodeEntities } from '@wordpress/html-entities' ;
1516import { __ } from '@wordpress/i18n' ;
1617import { Icon , globe } from '@wordpress/icons' ;
18+ import clsx from 'clsx' ;
1719import { useEffect } from 'react' ;
1820import { useSearchParams } from 'react-router' ;
1921/**
@@ -89,6 +91,30 @@ export default function InboxView() {
8991 ) ;
9092 const isMobile = containerWidth <= MOBILE_BREAKPOINT ;
9193 const selectedResponses = searchParams . get ( 'r' ) ;
94+ const isMobileViewport = useViewportMatch ( 'medium' , '<' ) ;
95+ const [ isResponseModalOpen , setIsResponseModalOpen ] = useState ( false ) ;
96+ const [ responseModal , setResponseModal ] = useState ( null ) ;
97+
98+ const closeResponseModal = useCallback ( ( ) => {
99+ setIsResponseModalOpen ( false ) ;
100+ setResponseModal ( null ) ;
101+ } , [ setIsResponseModalOpen , setResponseModal ] ) ;
102+
103+ const openResponseModal = useCallback (
104+ item => {
105+ const content = < ResponseMobileView response = { item } closeModal = { closeResponseModal } /> ;
106+
107+ setResponseModal ( content ) ;
108+ setIsResponseModalOpen ( true ) ;
109+ } ,
110+ [ setIsResponseModalOpen , closeResponseModal , setResponseModal ]
111+ ) ;
112+
113+ useEffect ( ( ) => {
114+ if ( ! isMobileViewport ) {
115+ closeResponseModal ( ) ;
116+ }
117+ } , [ isMobileViewport , closeResponseModal ] ) ;
92118
93119 useEffect ( ( ) => {
94120 return setupSidebarWidthObserver ( ) ;
@@ -228,8 +254,22 @@ export default function InboxView() {
228254 item . author_name || item . author_email || item . author_url || item . ip
229255 ) ;
230256 const defaultImage = item . author_name || item . author_email ? 'initials' : 'mp' ;
257+
258+ const handleClick = isMobileViewport ? ( ) => openResponseModal ( item ) : undefined ;
259+
231260 return (
232- < div className = "jp-forms__inbox__author-field" >
261+ < div
262+ className = { clsx (
263+ 'jp-forms__inbox__author-field' ,
264+ isMobileViewport && 'jp-forms__inbox__author-field--mobile'
265+ ) }
266+ { ...( isMobileViewport && {
267+ onClick : handleClick ,
268+ onKeyDown : ( ) => { } ,
269+ role : 'button' ,
270+ tabIndex : 0 ,
271+ } ) }
272+ >
233273 { item . is_unread && (
234274 < span
235275 className = "jp-forms__inbox__unread-indicator"
@@ -328,7 +368,13 @@ export default function InboxView() {
328368 } ,
329369 } ,
330370 ] ,
331- [ filterOptions , dateSettings . formats . date ]
371+ [
372+ filterOptions ?. date ,
373+ filterOptions ?. source ,
374+ isMobileViewport ,
375+ openResponseModal ,
376+ dateSettings . formats . date ,
377+ ]
332378 ) ;
333379
334380 const actions = useMemo ( ( ) => {
@@ -421,6 +467,15 @@ export default function InboxView() {
421467 />
422468 }
423469 />
470+ { isResponseModalOpen && (
471+ < Modal
472+ title = { __ ( 'Response' , 'jetpack-forms' ) }
473+ __experimentalHideHeader = { true }
474+ onRequestClose = { closeResponseModal }
475+ >
476+ { responseModal }
477+ </ Modal >
478+ ) }
424479 </ div >
425480 < SingleResponseView
426481 sidePanelItem = { selection . length && sidePanelItem }
0 commit comments