1
- import { useEffect , useRef , useState } from 'react' ;
1
+ import { useEffect , useMemo , useRef , useState } from 'react' ;
2
2
3
3
import { getStyles } from '@diplodoc/html-extension' ;
4
4
import type { IHTMLIFrameElementConfig } from '@diplodoc/html-extension/runtime' ;
5
5
import { Ellipsis as DotsIcon , Eye } from '@gravity-ui/icons' ;
6
6
import { Button , Icon , Label , Menu , Popup } from '@gravity-ui/uikit' ;
7
- import debounce from 'lodash/debounce' ;
8
7
import type { Node } from 'prosemirror-model' ;
9
8
import type { EditorView } from 'prosemirror-view' ;
10
9
11
- import { cn } from '../../../../classname' ;
12
- import { TextAreaFixed as TextArea } from '../../../../forms/TextInput' ;
13
- import { i18n } from '../../../../i18n/common' ;
14
- import { useBooleanState , useElementState } from '../../../../react-utils/hooks' ;
15
- import { removeNode } from '../../../../utils/remove-node' ;
10
+ import { cn } from 'src/classname' ;
11
+ import { SharedStateKey } from 'src/extensions/behavior/SharedState' ;
12
+ import { TextAreaFixed as TextArea } from 'src/forms/TextInput' ;
13
+ import { i18n } from 'src/i18n/common' ;
14
+ import { debounce } from 'src/lodash' ;
15
+ import { useBooleanState , useElementState } from 'src/react-utils/hooks' ;
16
+ import { useSharedEditingState } from 'src/react-utils/useSharedEditingState' ;
17
+ import { removeNode } from 'src/utils/remove-node' ;
18
+
16
19
import { YfmHtmlBlockConsts } from '../YfmHtmlBlockSpecs/const' ;
17
20
import type { YfmHtmlBlockOptions } from '../index' ;
21
+ import type { YfmHtmlBlockEntitySharedState } from '../types' ;
18
22
19
23
import './YfmHtmlBlock.scss' ;
20
24
@@ -25,7 +29,7 @@ const b = cnYfmHtmlBlock;
25
29
26
30
interface YfmHtmlBlockViewProps {
27
31
html : string ;
28
- onСlick : ( ) => void ;
32
+ onClick : ( ) => void ;
29
33
config ?: IHTMLIFrameElementConfig ;
30
34
}
31
35
@@ -48,7 +52,7 @@ const createLinkCLickHandler = (value: Element, document: Document) => (event: E
48
52
}
49
53
} ;
50
54
51
- const YfmHtmlBlockPreview : React . FC < YfmHtmlBlockViewProps > = ( { html, onСlick , config} ) => {
55
+ const YfmHtmlBlockPreview : React . FC < YfmHtmlBlockViewProps > = ( { html, onClick , config} ) => {
52
56
const ref = useRef < HTMLIFrameElement > ( null ) ;
53
57
const styles = useRef < Record < string , string > > ( { } ) ;
54
58
const classNames = useRef < string [ ] > ( [ ] ) ;
@@ -69,7 +73,7 @@ const YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onСlick, c
69
73
if ( contentWindow ) {
70
74
const frameDocument = contentWindow . document ;
71
75
frameDocument . addEventListener ( 'dblclick' , ( ) => {
72
- onСlick ( ) ;
76
+ onClick ( ) ;
73
77
} ) ;
74
78
}
75
79
} ;
@@ -235,19 +239,18 @@ export const YfmHtmlBlockView: React.FC<{
235
239
view,
236
240
options : { useConfig, sanitize, styles, baseTarget = '_parent' , head : headContent = '' } ,
237
241
} ) => {
238
- const [ editing , setEditing , unsetEditing , toggleEditing ] = useBooleanState (
239
- Boolean ( node . attrs [ YfmHtmlBlockConsts . NodeAttrs . newCreated ] ) ,
242
+ const entityId : string = node . attrs [ YfmHtmlBlockConsts . NodeAttrs . EntityId ] ;
243
+ const entityKey = useMemo (
244
+ ( ) => SharedStateKey . define < YfmHtmlBlockEntitySharedState > ( { name : entityId } ) ,
245
+ [ entityId ] ,
240
246
) ;
241
247
242
248
const config = useConfig ?.( ) ;
243
249
250
+ const [ editing , setEditing , unsetEditing ] = useSharedEditingState ( view , entityKey ) ;
244
251
const [ menuOpen , _openMenu , closeMenu , toggleMenuOpen ] = useBooleanState ( false ) ;
245
252
const [ anchorElement , setAnchorElement ] = useElementState ( ) ;
246
253
247
- const handleClick = ( ) => {
248
- setEditing ( ) ;
249
- } ;
250
-
251
254
if ( editing ) {
252
255
return (
253
256
< CodeEditMode
@@ -283,7 +286,7 @@ export const YfmHtmlBlockView: React.FC<{
283
286
< Label className = { b ( 'label' ) } icon = { < Icon size = { 16 } data = { Eye } /> } >
284
287
{ i18n ( 'preview' ) }
285
288
</ Label >
286
- < YfmHtmlBlockPreview html = { resultHtml } onСlick = { handleClick } config = { config } />
289
+ < YfmHtmlBlockPreview html = { resultHtml } onClick = { setEditing } config = { config } />
287
290
288
291
< div className = { b ( 'menu' ) } >
289
292
< Button
@@ -303,7 +306,7 @@ export const YfmHtmlBlockView: React.FC<{
303
306
< Menu >
304
307
< Menu . Item
305
308
onClick = { ( ) => {
306
- toggleEditing ( ) ;
309
+ setEditing ( ) ;
307
310
closeMenu ( ) ;
308
311
} }
309
312
>
0 commit comments