1- import React , { useCallback , useState } from "react" ;
1+ import React , { useCallback , useState , MouseEvent } from "react" ;
22import { useIntl } from "react-intl" ;
33import _ from "lodash" ;
44import { useHistory } from "react-router-dom" ;
@@ -30,17 +30,55 @@ interface IImageWallProps {
3030 onChangePage : ( page : number ) => void ;
3131 currentPage : number ;
3232 pageCount : number ;
33+ handleImageOpen : ( index : number ) => void ;
3334}
3435
35- const ImageWall : React . FC < IImageWallProps > = ( {
36+ const ImageWall : React . FC < IImageWallProps > = ( { images, handleImageOpen } ) => {
37+ const thumbs = images . map ( ( image , index ) => (
38+ < div
39+ role = "link"
40+ tabIndex = { index }
41+ key = { image . id }
42+ onClick = { ( ) => handleImageOpen ( index ) }
43+ onKeyPress = { ( ) => handleImageOpen ( index ) }
44+ >
45+ < img
46+ src = { image . paths . thumbnail ?? "" }
47+ loading = "lazy"
48+ className = "gallery-image"
49+ alt = { image . title ?? TextUtils . fileNameFromPath ( image . path ) }
50+ />
51+ </ div >
52+ ) ) ;
53+
54+ return (
55+ < div className = "gallery" >
56+ < div className = "flexbin" > { thumbs } </ div >
57+ </ div >
58+ ) ;
59+ } ;
60+
61+ interface IImageListImages {
62+ images : SlimImageDataFragment [ ] ;
63+ filter : ListFilterModel ;
64+ selectedIds : Set < string > ;
65+ onChangePage : ( page : number ) => void ;
66+ pageCount : number ;
67+ onSelectChange : ( id : string , selected : boolean , shiftKey : boolean ) => void ;
68+ }
69+
70+ const ImageListImages : React . FC < IImageListImages > = ( {
3671 images,
72+ filter,
73+ selectedIds,
3774 onChangePage,
38- currentPage,
3975 pageCount,
76+ onSelectChange,
4077} ) => {
4178 const [ slideshowRunning , setSlideshowRunning ] = useState < boolean > ( false ) ;
4279 const handleLightBoxPage = useCallback (
4380 ( direction : number ) => {
81+ const { currentPage } = filter ;
4482 if ( direction === - 1 ) {
4583 if ( currentPage === 1 ) {
4684 onChangePage ( pageCount ) ;
@@ -56,7 +94,7 @@ const ImageWall: React.FC<IImageWallProps> = ({
5694 }
5795 }
5896 } ,
59- [ onChangePage , currentPage , pageCount ]
97+ [ onChangePage , filter , pageCount ]
6098 ) ;
6199
62100 const handleClose = useCallback ( ( ) => {
@@ -67,7 +105,7 @@ const ImageWall: React.FC<IImageWallProps> = ({
67105 images,
68106 showNavigation : false ,
69107 pageCallback : pageCount > 1 ? handleLightBoxPage : undefined ,
70- pageHeader : `Page ${ currentPage } / ${ pageCount } ` ,
108+ pageHeader : `Page ${ filter . currentPage } / ${ pageCount } ` ,
71109 slideshowEnabled : slideshowRunning ,
72110 onClose : handleClose ,
73111 } ) ;
@@ -80,28 +118,54 @@ const ImageWall: React.FC<IImageWallProps> = ({
80118 [ showLightbox ]
81119 ) ;
82120
83- const thumbs = images . map ( ( image , index ) => (
84- < div
85- role = "link"
86- tabIndex = { index }
87- key = { image . id }
88- onClick = { ( ) => handleImageOpen ( index ) }
89- onKeyPress = { ( ) => handleImageOpen ( index ) }
90- >
91- < img
92- src = { image . paths . thumbnail ?? "" }
93- loading = "lazy"
94- className = "gallery-image"
95- alt = { image . title ?? TextUtils . fileNameFromPath ( image . path ) }
121+ function onPreview ( index : number , ev : MouseEvent ) {
122+ handleImageOpen ( index ) ;
123+ ev . preventDefault ( ) ;
124+ }
125+
126+ function renderImageCard (
127+ index : number ,
128+ image : SlimImageDataFragment ,
129+ zoomIndex : number
130+ ) {
131+ return (
132+ < ImageCard
133+ key = { image . id }
134+ image = { image }
135+ zoomIndex = { zoomIndex }
136+ selecting = { selectedIds . size > 0 }
137+ selected = { selectedIds . has ( image . id ) }
138+ onSelectedChanged = { ( selected : boolean , shiftKey : boolean ) =>
139+ onSelectChange ( image . id , selected , shiftKey )
140+ }
141+ onPreview = { ( ev ) => onPreview ( index , ev ) }
96142 />
97- </ div >
98- ) ) ;
143+ ) ;
144+ }
99145
100- return (
101- < div className = "gallery" >
102- < div className = "flexbin" > { thumbs } </ div >
103- </ div >
104- ) ;
146+ if ( filter . displayMode === DisplayMode . Grid ) {
147+ return (
148+ < div className = "row justify-content-center" >
149+ { images . map ( ( image , index ) =>
150+ renderImageCard ( index , image , filter . zoomIndex )
151+ ) }
152+ </ div >
153+ ) ;
154+ }
155+ if ( filter . displayMode === DisplayMode . Wall ) {
156+ return (
157+ < ImageWall
158+ images = { images }
159+ onChangePage = { onChangePage }
160+ currentPage = { filter . currentPage }
161+ pageCount = { pageCount }
162+ handleImageOpen = { handleImageOpen }
163+ />
164+ ) ;
165+ }
166+
167+ // should not happen
168+ return < > </ > ;
105169} ;
106170
107171interface IImageList {
@@ -237,23 +301,8 @@ export const ImageList: React.FC<IImageList> = ({
237301 ) ;
238302 }
239303
240- function renderImageCard (
241- image : SlimImageDataFragment ,
242- selectedIds : Set < string > ,
243- zoomIndex : number
244- ) {
245- return (
246- < ImageCard
247- key = { image . id }
248- image = { image }
249- zoomIndex = { zoomIndex }
250- selecting = { selectedIds . size > 0 }
251- selected = { selectedIds . has ( image . id ) }
252- onSelectedChanged = { ( selected : boolean , shiftKey : boolean ) =>
253- onSelectChange ( image . id , selected , shiftKey )
254- }
255- />
256- ) ;
304+ function selectChange ( id : string , selected : boolean , shiftKey : boolean ) {
305+ onSelectChange ( id , selected , shiftKey ) ;
257306 }
258307
259308 function renderImages (
@@ -266,25 +315,17 @@ export const ImageList: React.FC<IImageList> = ({
266315 if ( ! result . data || ! result . data . findImages ) {
267316 return ;
268317 }
269- if ( filter . displayMode === DisplayMode . Grid ) {
270- return (
271- < div className = "row justify-content-center" >
272- { result . data . findImages . images . map ( ( image ) =>
273- renderImageCard ( image , selectedIds , filter . zoomIndex )
274- ) }
275- </ div >
276- ) ;
277- }
278- if ( filter . displayMode === DisplayMode . Wall ) {
279- return (
280- < ImageWall
281- images = { result . data . findImages . images }
282- onChangePage = { onChangePage }
283- currentPage = { filter . currentPage }
284- pageCount = { pageCount }
285- />
286- ) ;
287- }
318+
319+ return (
320+ < ImageListImages
321+ filter = { filter }
322+ images = { result . data . findImages . images }
323+ onChangePage = { onChangePage }
324+ onSelectChange = { selectChange }
325+ pageCount = { pageCount }
326+ selectedIds = { selectedIds }
327+ />
328+ ) ;
288329 }
289330
290331 function renderContent (
0 commit comments