@@ -125,6 +125,25 @@ const getPointedIds = (position: Position, takeFirst: boolean = false): InfoIds
125125 }
126126}
127127
128+ export const getTouchedIds = ( touches : TouchList , takeFirst : boolean = false ) => {
129+ const ids : Set < string > = new Set ( )
130+ const touchesLength = touches . length
131+
132+ for ( let index = 0 ; index < touchesLength ; index += 1 ) {
133+ const touch = touches [ index ]
134+ const elements = getElementsFromPoint ( { x : touch . clientX , y : touch . clientY } )
135+ const touchedElementIDs = takeFirst
136+ ? findTouchFirstId ( elements )
137+ : findTouchIds ( elements )
138+
139+ for ( const touchedElementID of touchedElementIDs ) {
140+ ids . add ( touchedElementID )
141+ }
142+ }
143+
144+ return ids
145+ }
146+
128147export const getTouchedIdsMap = ( touches : TouchList , takeFirst : boolean = false ) => {
129148 const touchIDs : Map < number , InfoIds > = new Map ( )
130149 const touchesLength = touches . length
@@ -152,7 +171,8 @@ export const getTouchedIdsMap = (touches: TouchList, takeFirst: boolean = false)
152171}
153172
154173export const useGlobalTouchEmitter = ( options : UseGlobalTouchEmitterOptions = { } ) => {
155- let savedDownIds : Map < number , Set < string > > = new Map ( )
174+ let savedDownIdsMap : Map < number , Set < string > > = new Map ( )
175+ const savedDownIds : Set < string > = new Set ( )
156176 let mouseDown : boolean = false
157177 const mouseId = - 1
158178 const { topLevelElementOnly : takeFirst = false , preventTouchContext} = options
@@ -172,7 +192,7 @@ export const useGlobalTouchEmitter = (options: UseGlobalTouchEmitterOptions = {}
172192 mouseDown = true
173193 const { ids, point} = getPointedIds ( { x : event . pageX , y : event . pageY } , takeFirst )
174194
175- savedDownIds = new Map < number , Set < string > > ( [ [ mouseId , ids ] ] )
195+ savedDownIdsMap = new Map < number , Set < string > > ( [ [ mouseId , ids ] ] )
176196 emitAllIds ( ids , true )
177197 emitAllDragIds ( { ids, point, state : 'start' } )
178198 } )
@@ -185,8 +205,8 @@ export const useGlobalTouchEmitter = (options: UseGlobalTouchEmitterOptions = {}
185205
186206 mouseDown = false
187207 //
188- emitAllMultiIDs ( savedDownIds , false )
189- savedDownIds = new Map ( )
208+ emitAllMultiIDs ( savedDownIdsMap , false )
209+ savedDownIdsMap = new Map ( )
190210 } )
191211
192212 useEvent ( getWindow , 'pointermove' , ( event : PointerEvent ) => {
@@ -195,15 +215,15 @@ export const useGlobalTouchEmitter = (options: UseGlobalTouchEmitterOptions = {}
195215 return
196216 }
197217
198- const downedIds = savedDownIds . get ( mouseId )
218+ const downedIds = savedDownIdsMap . get ( mouseId )
199219 const upTouchIds : Set < string > = new Set ( downedIds )
200220 const { ids : newDownIds , point} = getPointedIds (
201221 { x : event . pageX , y : event . pageY } ,
202222 takeFirst ,
203223 )
204224 const downTouchIds = new Set ( newDownIds )
205225
206- savedDownIds = new Map < number , Set < string > > ( [ [ mouseId , new Set ( newDownIds ) ] ] )
226+ savedDownIdsMap = new Map < number , Set < string > > ( [ [ mouseId , new Set ( newDownIds ) ] ] )
207227
208228 for ( const id of newDownIds ) {
209229 if ( upTouchIds . has ( id ) ) {
@@ -218,65 +238,46 @@ export const useGlobalTouchEmitter = (options: UseGlobalTouchEmitterOptions = {}
218238 } )
219239
220240 useEvent ( getWindow , 'touchstart' , ( event ) => {
221- const touches = event . changedTouches
222- const touchIds = getTouchedIdsMap ( touches , takeFirst )
223-
224- for ( const [ identifier , { ids, point} ] of touchIds . entries ( ) ) {
225- savedDownIds . set ( identifier , ids )
226- emitAllIds ( ids , true )
227- emitAllDragIds ( { ids, point, state : 'start' } )
228- }
229- } )
241+ const { touches} = event
242+ const touchIds = getTouchedIds ( touches , takeFirst )
243+ const downIds = new Set < string > ( touchIds )
230244
231- useEvent ( getWindow , 'touchmove' , ( event ) => {
232- const touches = event . changedTouches
233- const touchIdsMap = getTouchedIdsMap ( touches , takeFirst )
234-
235- for ( const [ identifier , downedIds ] of savedDownIds ) {
236- const { ids : newDownIds = new Set < string > ( ) , point} =
237- touchIdsMap . get ( identifier ) ?? { }
238- const upTouchIds = new Set < string > ( downedIds )
239- const downTouchIds = new Set ( newDownIds )
240- const touchMoveIds = new Set < string > ( )
241-
242- for ( const id of newDownIds ) {
243- if ( downedIds . has ( id ) ) {
244- upTouchIds . delete ( id )
245- downTouchIds . delete ( id )
246- touchMoveIds . add ( id )
247- }
245+ for ( const id of touchIds ) {
246+ if ( savedDownIds . has ( id ) ) {
247+ downIds . delete ( id )
248248 }
249249
250- savedDownIds . set ( identifier , newDownIds )
251- emitAllIds ( downTouchIds , true )
252- emitAllIds ( upTouchIds , false )
253- // emitAllDragIds({ids: upTouchIds, point, state: 'end'})
254- emitAllDragIds ( { ids : touchMoveIds , point, state : 'move' } )
255- emitAllDragIds ( { ids : downTouchIds , point, state : 'start' } )
250+ savedDownIds . add ( id )
256251 }
257- } )
258-
259- useEvent ( getWindow , 'touchend' , ( event ) => {
260- event . preventDefault ( )
261252
262- const touches = event . changedTouches
263- const touchIdsMap = getTouchedIdsMap ( touches , takeFirst )
253+ emitAllIds ( downIds , true )
254+ } )
264255
265- for ( const [ identifier , { ids} ] of touchIdsMap . entries ( ) ) {
266- const downedIds = savedDownIds . get ( identifier )
267- const downTouchIds : Set < string > = new Set ( downedIds )
268- const upTouchIds : Set < string > = new Set ( ids )
256+ const updateDownIds = ( event : TouchEvent ) => {
257+ const { touches} = event
258+ const touchIds = getTouchedIds ( touches , takeFirst )
259+ const downIds = new Set < string > ( touchIds )
260+ const upIds = new Set < string > ( savedDownIds )
269261
270- for ( const id of upTouchIds ) {
271- // down 된 목록에서 up 할 id 제거
272- downTouchIds . delete ( id )
262+ for ( const id of touchIds ) {
263+ if ( savedDownIds . has ( id ) ) {
264+ downIds . delete ( id )
273265 }
274266
275- savedDownIds . set ( identifier , downTouchIds )
276- emitAllIds ( upTouchIds , false )
277- // emitAllDragIds({ids, point, state: 'end'})
267+ upIds . delete ( id )
268+ savedDownIds . add ( id )
278269 }
279- } )
270+
271+ for ( const id of upIds ) {
272+ savedDownIds . delete ( id )
273+ }
274+
275+ emitAllIds ( downIds , true )
276+ emitAllIds ( upIds , false )
277+ }
278+
279+ useEvent ( getWindow , 'touchmove' , updateDownIds )
280+ useEvent ( getWindow , 'touchend' , updateDownIds )
280281}
281282
282283export const useGlobalDown = ( id : string ) : Accessor < DownEventPayload > => {
0 commit comments