11import { 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'
23import { PBPointerEventsResult } from '../components/generated/pb/decentraland/sdk/components/pointer_events_result.gen'
34import { PointerEventType } from '../components/generated/pb/decentraland/sdk/components/common/input_action.gen'
45import * 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
2729export 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