@@ -10,7 +10,7 @@ import { createEffectWrapper } from './createEffectWrapper';
1010import { createReactiveWrapper } from './createReactiveWrapper' ;
1111import { getDefaultOptions } from './getDefaultOptions' ;
1212import { getPanelPositionStyle } from './getPanelPositionStyle' ;
13- import { render } from './render' ;
13+ import { renderPanel , renderSearchBox } from './render' ;
1414import {
1515 AutocompleteApi ,
1616 AutocompleteOptions ,
@@ -50,6 +50,9 @@ export function autocomplete<TItem extends BaseItem>(
5050 status : 'idle' ,
5151 ...props . value . core . initialState ,
5252 } ) ;
53+ const isTouch = reactive (
54+ ( ) => window . matchMedia ( props . value . renderer . touchMediaQuery ) . matches
55+ ) ;
5356
5457 const propGetters : AutocompletePropGetters < TItem > = {
5558 getEnvironmentProps : props . value . renderer . getEnvironmentProps ,
@@ -73,6 +76,8 @@ export function autocomplete<TItem extends BaseItem>(
7376
7477 const dom = reactive ( ( ) =>
7578 createAutocompleteDom ( {
79+ placeholder : props . value . core . placeholder ,
80+ isTouch : isTouch . value ,
7681 state : lastStateRef . current ,
7782 autocomplete : autocomplete . value ,
7883 classNames : props . value . renderer . classNames ,
@@ -83,25 +88,33 @@ export function autocomplete<TItem extends BaseItem>(
8388
8489 function setPanelPosition ( ) {
8590 setProperties ( dom . value . panel , {
86- style : getPanelPositionStyle ( {
87- panelPlacement : props . value . renderer . panelPlacement ,
88- container : dom . value . root ,
89- form : dom . value . form ,
90- environment : props . value . core . environment ,
91- } ) ,
91+ style : isTouch . value
92+ ? { }
93+ : getPanelPositionStyle ( {
94+ panelPlacement : props . value . renderer . panelPlacement ,
95+ container : dom . value . root ,
96+ form : dom . value . form ,
97+ environment : props . value . core . environment ,
98+ } ) ,
9299 } ) ;
93100 }
94101
95102 function runRender ( ) {
96- render ( props . value . renderer . render , {
103+ const renderProps = {
104+ isTouch : isTouch . value ,
97105 state : lastStateRef . current ,
98106 autocomplete : autocomplete . value ,
99107 propGetters,
100108 dom : dom . value ,
101109 classNames : props . value . renderer . classNames ,
102- panelContainer : props . value . renderer . panelContainer ,
110+ panelContainer : isTouch . value
111+ ? dom . value . touchOverlay
112+ : props . value . renderer . panelContainer ,
103113 autocompleteScopeApi,
104- } ) ;
114+ } ;
115+
116+ renderSearchBox ( renderProps ) ;
117+ renderPanel ( props . value . renderer . render , renderProps ) ;
105118 }
106119
107120 function scheduleRender ( state : AutocompleteState < TItem > ) {
@@ -135,6 +148,27 @@ export function autocomplete<TItem extends BaseItem>(
135148 } ;
136149 } ) ;
137150
151+ runEffect ( ( ) => {
152+ const panelContainerElement = isTouch . value
153+ ? document . body
154+ : props . value . renderer . panelContainer ;
155+ const panelElement = isTouch . value
156+ ? dom . value . touchOverlay
157+ : dom . value . panel ;
158+
159+ if ( isTouch . value && lastStateRef . current . isOpen ) {
160+ dom . value . openTouchOverlay ( ) ;
161+ }
162+
163+ scheduleRender ( lastStateRef . current ) ;
164+
165+ return ( ) => {
166+ if ( panelContainerElement . contains ( panelElement ) ) {
167+ panelContainerElement . removeChild ( panelElement ) ;
168+ }
169+ } ;
170+ } ) ;
171+
138172 runEffect ( ( ) => {
139173 const containerElement = props . value . renderer . container ;
140174 invariant (
@@ -148,17 +182,6 @@ export function autocomplete<TItem extends BaseItem>(
148182 } ;
149183 } ) ;
150184
151- runEffect ( ( ) => {
152- const panelContainerElement = props . value . renderer . panelContainer ;
153- scheduleRender ( lastStateRef . current ) ;
154-
155- return ( ) => {
156- if ( panelContainerElement . contains ( dom . value . panel ) ) {
157- panelContainerElement . removeChild ( dom . value . panel ) ;
158- }
159- } ;
160- } ) ;
161-
162185 runEffect ( ( ) => {
163186 const debouncedRender = debounce < {
164187 state : AutocompleteState < TItem > ;
@@ -185,7 +208,16 @@ export function autocomplete<TItem extends BaseItem>(
185208
186209 runEffect ( ( ) => {
187210 const onResize = debounce < Event > ( ( ) => {
188- requestAnimationFrame ( setPanelPosition ) ;
211+ const previousIsTouch = isTouch . value ;
212+ isTouch . value = window . matchMedia (
213+ props . value . renderer . touchMediaQuery
214+ ) . matches ;
215+
216+ if ( previousIsTouch !== isTouch . value ) {
217+ update ( { } ) ;
218+ } else {
219+ requestAnimationFrame ( setPanelPosition ) ;
220+ }
189221 } , 20 ) ;
190222 window . addEventListener ( 'resize' , onResize ) ;
191223
0 commit comments