1
1
import { Box , Button } from "@chakra-ui/react"
2
- import { type SpineItem , isShallowEqual } from "@prose-reader/core"
2
+ import type { SpineItem } from "@prose-reader/core"
3
3
import { memo } from "react"
4
4
import { useObserve , useSubscribe } from "reactjrx"
5
- import { NEVER , distinctUntilChanged , filter , map , switchMap , tap } from "rxjs"
6
- import useMeasure from "../common/useMeasure"
5
+ import { useMeasure } from "../common/useMeasure"
7
6
import {
8
7
DialogActionTrigger ,
9
8
DialogBody ,
@@ -14,34 +13,14 @@ import {
14
13
DialogRoot ,
15
14
DialogTitle ,
16
15
} from "../components/ui/dialog"
17
- import { hasGalleryEnhancer , useReader } from "../context/useReader"
16
+ import { useReader } from "../context/useReader"
17
+ import { useAttachSnapshot } from "./useAttachSnapshot"
18
18
19
- const GalleryItem = ( { item } : { item : SpineItem } ) => {
19
+ const GalleryItem = memo ( ( { item } : { item : SpineItem } ) => {
20
20
const reader = useReader ( )
21
21
const [ setElement , measures , element ] = useMeasure ( )
22
- const readerWithGalleryEnhancer = hasGalleryEnhancer ( reader )
23
- ? reader
24
- : undefined
25
22
26
- useSubscribe ( ( ) => {
27
- if ( ! readerWithGalleryEnhancer || ! element ) return NEVER
28
-
29
- const itemReadyAndLayoutChanged$ = item . isReady$ . pipe (
30
- filter ( ( isReady ) => isReady ) ,
31
- map ( ( ) => item . layout . layoutInfo ) ,
32
- distinctUntilChanged ( isShallowEqual ) ,
33
- )
34
-
35
- return itemReadyAndLayoutChanged$ . pipe (
36
- switchMap ( ( ) =>
37
- readerWithGalleryEnhancer ?. gallery . snapshot ( item , measures ) ,
38
- ) ,
39
- tap ( ( snapshot ) => {
40
- element . innerHTML = ""
41
- element . appendChild ( snapshot )
42
- } ) ,
43
- )
44
- } , [ readerWithGalleryEnhancer , item , measures , element ] )
23
+ useAttachSnapshot ( element , item , measures )
45
24
46
25
useSubscribe (
47
26
( ) => reader ?. spine . spineItemsLoader . forceOpen ( [ item ] ) ,
@@ -57,11 +36,9 @@ const GalleryItem = ({ item }: { item: SpineItem }) => {
57
36
borderColor = "border"
58
37
borderRadius = "md"
59
38
data-grid-item
60
- >
61
- { item . item . id }
62
- </ Box >
39
+ />
63
40
)
64
- }
41
+ } )
65
42
66
43
export const GalleryDialog = memo (
67
44
( {
@@ -87,19 +64,21 @@ export const GalleryDialog = memo(
87
64
< DialogHeader >
88
65
< DialogTitle > Gallery</ DialogTitle >
89
66
</ DialogHeader >
90
- < DialogBody
91
- gridTemplateColumns = { [
92
- "repeat(2, minmax(0, 1fr))" ,
93
- "repeat(2, minmax(0, 1fr))" ,
94
- ] }
95
- display = "grid"
96
- gap = { 2 }
97
- pt = { 2 }
98
- data-grid
99
- >
100
- { items ?. map ( ( item ) => (
101
- < GalleryItem key = { item . item . id } item = { item } />
102
- ) ) }
67
+ < DialogBody >
68
+ < Box
69
+ gridTemplateColumns = { [
70
+ "repeat(2, minmax(0, 1fr))" ,
71
+ "repeat(3, minmax(0, 1fr))" ,
72
+ ] }
73
+ display = "grid"
74
+ gap = { [ 2 , 4 ] }
75
+ pt = { 2 }
76
+ data-grid
77
+ >
78
+ { items ?. map ( ( item ) => (
79
+ < GalleryItem key = { item . item . id } item = { item } />
80
+ ) ) }
81
+ </ Box >
103
82
</ DialogBody >
104
83
< DialogFooter >
105
84
< DialogActionTrigger asChild >
0 commit comments