@@ -7,6 +7,12 @@ import { handleScriptError } from '@components/scripts/errors/handler'
77import { addScriptBreadcrumb } from '@components/scripts/errors'
88import { getSearchBarElements , getSearchBarOptionalElements } from './selectors'
99import type { SearchHit } from '@actions/search/@types'
10+ import {
11+ closeHeaderSearch ,
12+ getHeaderSearchExpanded ,
13+ openHeaderSearch ,
14+ subscribeHeaderSearchExpanded ,
15+ } from '@components/scripts/store'
1016
1117export class SearchBarElement extends LitElement {
1218 static registeredName = 'search-bar'
@@ -21,6 +27,7 @@ export class SearchBarElement extends LitElement {
2127 private isExpanded = true
2228
2329 private isOutsideListenersAttached = false
30+ private unsubscribeHeaderSearchExpanded : ( ( ) => void ) | null = null
2431
2532 private debounceHandle : ReturnType < typeof setTimeout > | null = null
2633 private latestRequestId = 0
@@ -32,6 +39,7 @@ export class SearchBarElement extends LitElement {
3239 override connectedCallback ( ) : void {
3340 super . connectedCallback ( )
3441 this . cacheElements ( )
42+ this . initHeaderExpandedState ( )
3543 this . attachListeners ( )
3644 }
3745
@@ -41,6 +49,11 @@ export class SearchBarElement extends LitElement {
4149 this . debounceHandle = null
4250 }
4351
52+ if ( this . unsubscribeHeaderSearchExpanded ) {
53+ this . unsubscribeHeaderSearchExpanded ( )
54+ this . unsubscribeHeaderSearchExpanded = null
55+ }
56+
4457 this . detachOutsideListeners ( )
4558
4659 super . disconnectedCallback ( )
@@ -57,7 +70,43 @@ export class SearchBarElement extends LitElement {
5770
5871 this . toggleBtn = toggleBtn
5972 this . panel = panel
60- this . isExpanded = this . getIsExpandedFromDom ( )
73+ this . isExpanded = this . toggleBtn ? getHeaderSearchExpanded ( ) : this . getIsExpandedFromDom ( )
74+ }
75+
76+ private initHeaderExpandedState ( ) : void {
77+ if ( ! this . toggleBtn ) {
78+ return
79+ }
80+
81+ const query = this . getQuery ( )
82+ const storeExpanded = getHeaderSearchExpanded ( )
83+
84+ // If the input is pre-populated, force-open so the user can see/edit it.
85+ const desiredExpanded = query . length > 0 ? true : storeExpanded
86+
87+ if ( desiredExpanded && ! storeExpanded ) {
88+ openHeaderSearch ( )
89+ }
90+
91+ if ( ! desiredExpanded && storeExpanded ) {
92+ closeHeaderSearch ( )
93+ }
94+
95+ this . setExpandedState ( desiredExpanded , { updateStore : false } )
96+
97+ if ( ! this . unsubscribeHeaderSearchExpanded ) {
98+ this . unsubscribeHeaderSearchExpanded = subscribeHeaderSearchExpanded ( nextExpanded => {
99+ if ( ! this . toggleBtn ) {
100+ return
101+ }
102+
103+ if ( nextExpanded === this . isExpanded ) {
104+ return
105+ }
106+
107+ this . setExpandedState ( nextExpanded , { updateStore : false } )
108+ } )
109+ }
61110 }
62111
63112 private getIsExpandedFromDom ( ) : boolean {
@@ -101,9 +150,17 @@ export class SearchBarElement extends LitElement {
101150 }
102151 }
103152
104- private setExpandedState ( isExpanded : boolean ) : void {
153+ private setExpandedState ( isExpanded : boolean , { updateStore = true } : { updateStore ?: boolean } = { } ) : void {
105154 this . isExpanded = isExpanded
106155
156+ if ( updateStore && this . toggleBtn ) {
157+ if ( isExpanded ) {
158+ openHeaderSearch ( )
159+ } else {
160+ closeHeaderSearch ( )
161+ }
162+ }
163+
107164 if ( this . toggleBtn ) {
108165 this . toggleBtn . setAttribute ( 'aria-expanded' , isExpanded ? 'true' : 'false' )
109166 this . toggleBtn . setAttribute ( 'data-state' , isExpanded ? 'open' : 'closed' )
0 commit comments