-
Notifications
You must be signed in to change notification settings - Fork 4.3k
/
Copy pathcaption.js
108 lines (103 loc) · 2.61 KB
/
caption.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
* External dependencies
*/
import classnames from 'classnames';
/**
* WordPress dependencies
*/
import { useState, useEffect, useCallback } from '@wordpress/element';
import { usePrevious } from '@wordpress/compose';
import { __ } from '@wordpress/i18n';
import {
RichText,
BlockControls,
__experimentalGetElementClassName,
} from '@wordpress/block-editor';
import { ToolbarButton } from '@wordpress/components';
import { caption as captionIcon } from '@wordpress/icons';
import { createBlock, getDefaultBlockName } from '@wordpress/blocks';
export function Caption( {
key = 'caption',
attributes,
setAttributes,
isSelected,
insertBlocksAfter,
placeholder = __( 'Add caption' ),
label = __( 'Caption text' ),
showToolbarButton = true,
className,
} ) {
const caption = attributes[ key ];
const prevCaption = usePrevious( caption );
const isCaptionEmpty = RichText.isEmpty( caption );
const isPrevCaptionEmpty = RichText.isEmpty( prevCaption );
const [ showCaption, setShowCaption ] = useState( ! isCaptionEmpty );
// We need to show the caption when changes come from
// history navigation(undo/redo).
useEffect( () => {
if ( ! isCaptionEmpty && isPrevCaptionEmpty ) {
setShowCaption( true );
}
}, [ isCaptionEmpty, isPrevCaptionEmpty ] );
useEffect( () => {
if ( ! isSelected && isCaptionEmpty ) {
setShowCaption( false );
}
}, [ isSelected, isCaptionEmpty ] );
// Focus the caption when we click to add one.
const ref = useCallback(
( node ) => {
if ( node && isCaptionEmpty ) {
node.focus();
}
},
[ isCaptionEmpty ]
);
return (
<>
{ showToolbarButton && (
<BlockControls group="block">
<ToolbarButton
onClick={ () => {
setShowCaption( ! showCaption );
if ( showCaption && caption ) {
setAttributes( { caption: undefined } );
}
} }
icon={ captionIcon }
isPressed={ showCaption }
label={
showCaption
? __( 'Remove caption' )
: __( 'Add caption' )
}
/>
</BlockControls>
) }
{ showCaption &&
( ! RichText.isEmpty( caption ) || isSelected ) && (
<RichText
identifier={ key }
tagName="figcaption"
className={ classnames(
className,
__experimentalGetElementClassName( 'caption' )
) }
ref={ ref }
aria-label={ label }
placeholder={ placeholder }
value={ caption }
onChange={ ( value ) =>
setAttributes( { caption: value } )
}
inlineToolbar
__unstableOnSplitAtEnd={ () =>
insertBlocksAfter(
createBlock( getDefaultBlockName() )
)
}
/>
) }
</>
);
}