@@ -3,24 +3,63 @@ import React from 'react';
3
3
import { isElement } from 'react-is' ;
4
4
import { ScrollSyncPane } from 'react-scroll-sync' ;
5
5
import { FrameContextConsumer } from 'react-frame-component' ;
6
+ import { vercelStegaDecode } from '@vercel/stega' ;
6
7
7
8
/**
8
- * We need to create a lightweight component here so that we can access the
9
- * context within the Frame. This allows us to attach the ScrollSyncPane to the
10
- * body.
9
+ * PreviewContent renders the preview component and optionally handles visual editing interactions.
10
+ * By default it uses scroll sync, but can be configured to use visual editing instead.
11
11
*/
12
12
class PreviewContent extends React . Component {
13
- render ( ) {
13
+ handleClick = e => {
14
+ const { previewProps, onFieldClick } = this . props ;
15
+ const visualEditing = previewProps ?. collection ?. getIn ( [ 'editor' , 'visualEditing' ] , false ) ;
16
+
17
+ if ( ! visualEditing ) {
18
+ return ;
19
+ }
20
+
21
+ try {
22
+ const text = e . target . textContent ;
23
+ const decoded = vercelStegaDecode ( text ) ;
24
+ if ( decoded ?. decap ) {
25
+ if ( onFieldClick ) {
26
+ onFieldClick ( decoded . decap ) ;
27
+ }
28
+ }
29
+ } catch ( err ) {
30
+ console . log ( 'Visual editing error:' , err ) ;
31
+ }
32
+ } ;
33
+
34
+ renderPreview ( ) {
14
35
const { previewComponent, previewProps } = this . props ;
36
+ return (
37
+ < div onClick = { this . handleClick } >
38
+ { isElement ( previewComponent )
39
+ ? React . cloneElement ( previewComponent , previewProps )
40
+ : React . createElement ( previewComponent , previewProps ) }
41
+ </ div >
42
+ ) ;
43
+ }
44
+
45
+ render ( ) {
46
+ const { previewProps } = this . props ;
47
+ const visualEditing = previewProps ?. collection ?. getIn ( [ 'editor' , 'visualEditing' ] , false ) ;
48
+ const showScrollSync = ! visualEditing ;
49
+
15
50
return (
16
51
< FrameContextConsumer >
17
- { context => (
18
- < ScrollSyncPane attachTo = { context . document . scrollingElement } >
19
- { isElement ( previewComponent )
20
- ? React . cloneElement ( previewComponent , previewProps )
21
- : React . createElement ( previewComponent , previewProps ) }
22
- </ ScrollSyncPane >
23
- ) }
52
+ { context => {
53
+ const preview = this . renderPreview ( ) ;
54
+ if ( showScrollSync ) {
55
+ return (
56
+ < ScrollSyncPane attachTo = { context . document . scrollingElement } >
57
+ { preview }
58
+ </ ScrollSyncPane >
59
+ ) ;
60
+ }
61
+ return preview ;
62
+ } }
24
63
</ FrameContextConsumer >
25
64
) ;
26
65
}
@@ -29,6 +68,7 @@ class PreviewContent extends React.Component {
29
68
PreviewContent . propTypes = {
30
69
previewComponent : PropTypes . func . isRequired ,
31
70
previewProps : PropTypes . object ,
71
+ onFieldClick : PropTypes . func ,
32
72
} ;
33
73
34
74
export default PreviewContent ;
0 commit comments