-
Notifications
You must be signed in to change notification settings - Fork 4.2k
/
view.js
72 lines (71 loc) · 1.89 KB
/
view.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
/**
* WordPress dependencies
*/
import { store, getContext, getElement } from '@wordpress/interactivity';
const { actions } = store(
'core/search',
{
state: {
get ariaLabel() {
const {
isSearchInputVisible,
ariaLabelCollapsed,
ariaLabelExpanded,
} = getContext();
return isSearchInputVisible
? ariaLabelExpanded
: ariaLabelCollapsed;
},
get ariaControls() {
const { isSearchInputVisible, inputId } = getContext();
return isSearchInputVisible ? null : inputId;
},
get type() {
const { isSearchInputVisible } = getContext();
return isSearchInputVisible ? 'submit' : 'button';
},
get tabindex() {
const { isSearchInputVisible } = getContext();
return isSearchInputVisible ? '0' : '-1';
},
},
actions: {
openSearchInput( event ) {
const ctx = getContext();
const { ref } = getElement();
if ( ! ctx.isSearchInputVisible ) {
event.preventDefault();
ctx.isSearchInputVisible = true;
ref.parentElement.querySelector( 'input' ).focus();
}
},
closeSearchInput() {
const ctx = getContext();
ctx.isSearchInputVisible = false;
},
handleSearchKeydown( event ) {
const { ref } = getElement();
// If Escape close the menu.
if ( event?.key === 'Escape' ) {
actions.closeSearchInput();
ref.querySelector( 'button' ).focus();
}
},
handleSearchFocusout( event ) {
const { ref } = getElement();
// If focus is outside search form, and in the document, close menu
// event.target === The element losing focus
// event.relatedTarget === The element receiving focus (if any)
// When focusout is outside the document,
// `window.document.activeElement` doesn't change.
if (
! ref.contains( event.relatedTarget ) &&
event.target !== window.document.activeElement
) {
actions.closeSearchInput();
}
},
},
},
{ lock: true }
);