Skip to content

Commit 5f7f8a0

Browse files
chore: update @dcl/protocol version (#1356)
- Updated @dcl/protocol dependency to version 1.0.0-23348796189.commit-2417808 in package.json and package-lock.json. - Added new interaction types and corresponding methods for proximity events in the PointerEventsSystem. - Enhanced event options to include priority and interaction type in the event handling system. - Updated tests and snapshots to reflect changes in pointer event handling. Co-authored-by: Nicolas Earnshaw <nearnshaw@decentraland.org>
1 parent 0228887 commit 5f7f8a0

22 files changed

Lines changed: 288 additions & 111 deletions

package-lock.json

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"bugs": "https://github.com/decentraland/js-sdk-toolchain/issues",
77
"dependencies": {
88
"@actions/core": "^1.10.0",
9-
"@dcl/protocol": "^1.0.0-22669986637.commit-fb11819",
9+
"@dcl/protocol": "^1.0.0-23348796189.commit-2417808",
1010
"@dcl/quickjs-emscripten": "^0.21.0-3680274614.commit-1808aa1",
1111
"@dcl/ts-proto": "1.153.0",
1212
"@types/fs-extra": "^9.0.12",

packages/@dcl/ecs/package-lock.json

Lines changed: 0 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/@dcl/ecs/src/systems/events.ts

Lines changed: 152 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { InputAction } from '../components/generated/pb/decentraland/sdk/components/common/input_action.gen'
2+
import { InteractionType } from '../components/generated/pb/decentraland/sdk/components/common/input_action.gen'
23
import { PBPointerEventsResult } from '../components/generated/pb/decentraland/sdk/components/pointer_events_result.gen'
34
import { PointerEventType } from '../components/generated/pb/decentraland/sdk/components/common/input_action.gen'
45
import * as components from '../components'
@@ -22,6 +23,7 @@ export type EventSystemOptions = {
2223
showFeedback?: boolean
2324
showHighlight?: boolean
2425
maxPlayerDistance?: number
26+
priority?: number
2527
}
2628

2729
export const getDefaultOpts = (opts: Partial<EventSystemOptions> = {}): EventSystemOptions => ({
@@ -67,6 +69,34 @@ export interface PointerEventsSystem {
6769
*/
6870
removeOnPointerHoverLeave(entity: Entity): void
6971

72+
/**
73+
* @public
74+
* Remove the callback for onProximityDown event
75+
* @param entity - Entity where the callback was attached
76+
*/
77+
removeOnProximityDown(entity: Entity): void
78+
79+
/**
80+
* @public
81+
* Remove the callback for onProximityUp event
82+
* @param entity - Entity where the callback was attached
83+
*/
84+
removeOnProximityUp(entity: Entity): void
85+
86+
/**
87+
* @public
88+
* Remove the callback for onProximityEnter event
89+
* @param entity - Entity where the callback was attached
90+
*/
91+
removeOnProximityEnter(entity: Entity): void
92+
93+
/**
94+
* @public
95+
* Remove the callback for onProximityLeave event
96+
* @param entity - Entity where the callback was attached
97+
*/
98+
removeOnProximityLeave(entity: Entity): void
99+
70100
/**
71101
* @internal
72102
* Execute callback when the user clicks the entity.
@@ -125,6 +155,38 @@ export interface PointerEventsSystem {
125155
pointerData: { entity: Entity; opts?: Partial<EventSystemOptions> },
126156
cb: EventSystemCallback
127157
): void
158+
159+
/**
160+
* @public
161+
* Execute callback when the user presses the proximity button on the entity
162+
* @param pointerData - Entity to attach the callback - Opts to trigger Feedback and Button
163+
* @param cb - Function to execute when click fires
164+
*/
165+
onProximityDown(pointerData: { entity: Entity; opts?: Partial<EventSystemOptions> }, cb: EventSystemCallback): void
166+
167+
/**
168+
* @public
169+
* Execute callback when the user releases the proximity button on the entity
170+
* @param pointerData - Entity to attach the callback - Opts to trigger Feedback and Button
171+
* @param cb - Function to execute when event fires
172+
*/
173+
onProximityUp(pointerData: { entity: Entity; opts?: Partial<EventSystemOptions> }, cb: EventSystemCallback): void
174+
175+
/**
176+
* @public
177+
* Execute callback when the entity enters the proximity zone of the user
178+
* @param pointerData - Entity to attach the callback - Opts to trigger Feedback and Button
179+
* @param cb - Function to execute when event fires
180+
*/
181+
onProximityEnter(pointerData: { entity: Entity; opts?: Partial<EventSystemOptions> }, cb: EventSystemCallback): void
182+
183+
/**
184+
* @public
185+
* Execute callback when the entity leaves the proximity zone of the user
186+
* @param pointerData - Entity to attach the callback - Opts to trigger Feedback and Button
187+
* @param cb - Function to execute when event fires
188+
*/
189+
onProximityLeave(pointerData: { entity: Entity; opts?: Partial<EventSystemOptions> }, cb: EventSystemCallback): void
128190
}
129191

130192
/**
@@ -139,7 +201,9 @@ export function createPointerEventsSystem(engine: IEngine, inputSystem: IInputSy
139201
Down,
140202
Up,
141203
HoverEnter,
142-
HoverLeave
204+
HoverLeave,
205+
ProximityEnter,
206+
ProximityLeave
143207
}
144208
type EventMapType = Map<EventType, { cb: EventSystemCallback; opts: EventSystemOptions }>
145209

@@ -149,7 +213,12 @@ export function createPointerEventsSystem(engine: IEngine, inputSystem: IInputSy
149213
return eventsMap.get(entity) || eventsMap.set(entity, new Map()).get(entity)!
150214
}
151215

152-
function setPointerEvent(entity: Entity, type: PointerEventType, opts: EventSystemOptions) {
216+
function setPointerEvent(
217+
entity: Entity,
218+
type: PointerEventType,
219+
opts: EventSystemOptions,
220+
interactionType: InteractionType = InteractionType.CURSOR
221+
) {
153222
const pointerEvent = PointerEvents.getMutableOrNull(entity) || PointerEvents.create(entity)
154223
pointerEvent.pointerEvents.push({
155224
eventType: type,
@@ -159,16 +228,28 @@ export function createPointerEventsSystem(engine: IEngine, inputSystem: IInputSy
159228
showHighlight: opts.showHighlight,
160229
hoverText: opts.hoverText,
161230
maxDistance: opts.maxDistance,
162-
maxPlayerDistance: opts.maxPlayerDistance
163-
}
231+
maxPlayerDistance: opts.maxPlayerDistance,
232+
priority: opts.priority
233+
},
234+
interactionType: interactionType ?? InteractionType.CURSOR
164235
})
165236
}
166237

167-
function removePointerEvent(entity: Entity, type: PointerEventType, button: InputAction) {
238+
function removePointerEvent(
239+
entity: Entity,
240+
type: PointerEventType,
241+
button: InputAction,
242+
interactionType: InteractionType = InteractionType.CURSOR
243+
) {
168244
const pointerEvent = PointerEvents.getMutableOrNull(entity)
169245
if (!pointerEvent) return
170246
pointerEvent.pointerEvents = pointerEvent.pointerEvents.filter(
171-
(pointer) => !(pointer.eventInfo?.button === button && pointer.eventType === type)
247+
(pointer) =>
248+
!(
249+
pointer.eventInfo?.button === button &&
250+
pointer.eventType === type &&
251+
pointer.interactionType === interactionType
252+
)
172253
)
173254
}
174255

@@ -179,11 +260,15 @@ export function createPointerEventsSystem(engine: IEngine, inputSystem: IInputSy
179260
return PointerEventType.PET_HOVER_LEAVE
180261
} else if (eventType === EventType.HoverEnter) {
181262
return PointerEventType.PET_HOVER_ENTER
263+
} else if (eventType === EventType.ProximityEnter) {
264+
return PointerEventType.PET_PROXIMITY_ENTER
265+
} else if (eventType === EventType.ProximityLeave) {
266+
return PointerEventType.PET_PROXIMITY_LEAVE
182267
}
183268
return PointerEventType.PET_DOWN
184269
}
185270

186-
function removeEvent(entity: Entity, type: EventType) {
271+
function removeEvent(entity: Entity, type: EventType, interactionType: InteractionType = InteractionType.CURSOR) {
187272
const event = getEvent(entity)
188273
const pointerEvent = event.get(type)
189274

@@ -212,7 +297,9 @@ export function createPointerEventsSystem(engine: IEngine, inputSystem: IInputSy
212297
eventType === EventType.Down ||
213298
eventType === EventType.Up ||
214299
eventType === EventType.HoverEnter ||
215-
eventType === EventType.HoverLeave
300+
eventType === EventType.HoverLeave ||
301+
eventType === EventType.ProximityEnter ||
302+
eventType === EventType.ProximityLeave
216303
) {
217304
const command = inputSystem.getInputCommand(opts.button, getPointerEvent(eventType), entity)
218305
if (command) {
@@ -265,6 +352,42 @@ export function createPointerEventsSystem(engine: IEngine, inputSystem: IInputSy
265352
setPointerEvent(entity, PointerEventType.PET_HOVER_LEAVE, options)
266353
}
267354

355+
const onProximityDown: PointerEventsSystem['onProximityDown'] = (...args) => {
356+
const [data, cb] = args
357+
const { entity, opts } = data
358+
const options = getDefaultOpts(opts)
359+
removeEvent(entity, EventType.Down, InteractionType.PROXIMITY)
360+
getEvent(entity).set(EventType.Down, { cb, opts: options })
361+
setPointerEvent(entity, PointerEventType.PET_DOWN, options, InteractionType.PROXIMITY)
362+
}
363+
364+
const onProximityUp: PointerEventsSystem['onProximityUp'] = (...args) => {
365+
const [data, cb] = args
366+
const { entity, opts } = data
367+
const options = getDefaultOpts(opts)
368+
removeEvent(entity, EventType.Up, InteractionType.PROXIMITY)
369+
getEvent(entity).set(EventType.Up, { cb, opts: options })
370+
setPointerEvent(entity, PointerEventType.PET_UP, options, InteractionType.PROXIMITY)
371+
}
372+
373+
const onProximityEnter: PointerEventsSystem['onProximityEnter'] = (...args) => {
374+
const [data, cb] = args
375+
const { entity, opts } = data
376+
const options = getDefaultOpts(opts)
377+
removeEvent(entity, EventType.ProximityEnter, InteractionType.PROXIMITY)
378+
getEvent(entity).set(EventType.ProximityEnter, { cb, opts: options })
379+
setPointerEvent(entity, PointerEventType.PET_PROXIMITY_ENTER, options, InteractionType.PROXIMITY)
380+
}
381+
382+
const onProximityLeave: PointerEventsSystem['onProximityLeave'] = (...args) => {
383+
const [data, cb] = args
384+
const { entity, opts } = data
385+
const options = getDefaultOpts(opts)
386+
removeEvent(entity, EventType.ProximityLeave, InteractionType.PROXIMITY)
387+
getEvent(entity).set(EventType.ProximityLeave, { cb, opts: options })
388+
setPointerEvent(entity, PointerEventType.PET_PROXIMITY_LEAVE, options, InteractionType.PROXIMITY)
389+
}
390+
268391
return {
269392
removeOnClick(entity: Entity) {
270393
removeEvent(entity, EventType.Click)
@@ -286,6 +409,22 @@ export function createPointerEventsSystem(engine: IEngine, inputSystem: IInputSy
286409
removeEvent(entity, EventType.HoverLeave)
287410
},
288411

412+
removeOnProximityDown(entity: Entity) {
413+
removeEvent(entity, EventType.Down, InteractionType.PROXIMITY)
414+
},
415+
416+
removeOnProximityUp(entity: Entity) {
417+
removeEvent(entity, EventType.Up, InteractionType.PROXIMITY)
418+
},
419+
420+
removeOnProximityEnter(entity: Entity) {
421+
removeEvent(entity, EventType.ProximityEnter, InteractionType.PROXIMITY)
422+
},
423+
424+
removeOnProximityLeave(entity: Entity) {
425+
removeEvent(entity, EventType.ProximityLeave, InteractionType.PROXIMITY)
426+
},
427+
289428
onClick(value, cb) {
290429
const { entity } = value
291430
const options = getDefaultOpts(value.opts)
@@ -300,6 +439,10 @@ export function createPointerEventsSystem(engine: IEngine, inputSystem: IInputSy
300439
onPointerDown,
301440
onPointerUp,
302441
onPointerHoverEnter,
303-
onPointerHoverLeave
442+
onPointerHoverLeave,
443+
onProximityDown,
444+
onProximityUp,
445+
onProximityEnter,
446+
onProximityLeave
304447
}
305448
}

0 commit comments

Comments
 (0)