/** * Set current user to given value * * @param {Object|void} user * @return {void} */ function setUser(value = null) { let changedState if (!!user !== !!value) { changedState = true } user = value app.set('user', user) events.emit('change', user) if (changedState) { events.emit('change-state', changedState) } }
useCallback((event, hits) => { state.current.pointer.emit('pointerCancel', event); if (!hits) hits = handleIntersects(event, () => null); Array.from(hovered.values()).forEach(data => { if (hits && (!hits.length || !hits.find(i => i.object === data.object))) { const object = data.object; const handlers = object.__handlers; if (handlers && handlers.pointerOut) handlers.pointerOut(_extends({}, data, { type: 'pointerout' })); hovered.delete(makeId(data)); } }); }, [])
useCallback(name => event => { state.current.pointer.emit(name, event); // Collect hits const hits = handleIntersects(event, data => { const object = data.object; const handlers = object.__handlers; if (handlers && handlers[name]) { // Forward all events back to their respective handlers with the exception of click, // which must must the initial target if (name !== 'click' || state.current.initialHits.includes(object)) handlers[name](data); } }); // If a click yields no results, pass it back to the user as a miss if (name === 'pointerDown') { state.current.initialClick = [event.clientX, event.clientY]; state.current.initialHits = hits.map(hit => hit.object); } if (name === 'click' && !hits.length && onPointerMissed) { let dx = event.clientX - state.current.initialClick[0]; let dy = event.clientY - state.current.initialClick[1]; let distance = Math.round(Math.sqrt(dx * dx + dy * dy)); if (distance <= 2) onPointerMissed(); } }, [onPointerMissed])
useCallback(event => { state.current.pointer.emit('pointerMove', event); const hits = handleIntersects(event, data => { const object = data.object;