|
1 | | -import { Container, InProperties, BaseOutProperties, RenderContext } from '@pmndrs/uikit' |
| 1 | +import { Container, InProperties, BaseOutProperties, RenderContext, abortableEffect } from '@pmndrs/uikit' |
2 | 2 | import { signal, computed } from '@preact/signals-core' |
3 | 3 | import { colors, componentDefaults } from '../theme.js' |
4 | 4 | import { Object3DEventMap, Vector3 } from 'three' |
@@ -49,54 +49,53 @@ export class Slider extends Container<SliderOutProperties> { |
49 | 49 | height: 8, |
50 | 50 | width: '100%', |
51 | 51 | alignItems: 'center', |
52 | | - onPointerDown: computed(() => { |
53 | | - const disabled = this.properties.value.disabled ?? false |
54 | | - return disabled |
55 | | - ? undefined |
56 | | - : (e: Object3DEventMap['pointerdown']) => { |
57 | | - if (this.downPointerId != null) { |
58 | | - return |
59 | | - } |
60 | | - this.downPointerId = e.pointerId |
61 | | - this.handleSetValue(e) |
62 | | - if ( |
63 | | - 'target' in e && |
64 | | - e.target != null && |
65 | | - typeof e.target === 'object' && |
66 | | - 'setPointerCapture' in e.target && |
67 | | - typeof e.target.setPointerCapture === 'function' |
68 | | - ) { |
69 | | - e.target.setPointerCapture(e.pointerId) |
70 | | - } |
71 | | - } |
72 | | - }), |
73 | | - onPointerMove: computed(() => { |
74 | | - const disabled = this.properties.value.disabled ?? false |
75 | | - return disabled |
76 | | - ? undefined |
77 | | - : (e: Object3DEventMap['pointermove']) => { |
78 | | - if (this.downPointerId != e.pointerId) { |
79 | | - return |
80 | | - } |
81 | | - this.handleSetValue(e) |
82 | | - } |
83 | | - }), |
84 | | - onPointerUp: computed(() => { |
85 | | - const disabled = this.properties.value.disabled ?? false |
86 | | - return disabled |
87 | | - ? undefined |
88 | | - : (e: Object3DEventMap['pointerup']) => { |
89 | | - if (this.downPointerId == null) { |
90 | | - return |
91 | | - } |
92 | | - this.downPointerId = undefined |
93 | | - e.stopPropagation?.() |
94 | | - } |
95 | | - }), |
96 | 52 | ...config?.defaultOverrides, |
97 | 53 | }, |
98 | 54 | }) |
99 | 55 |
|
| 56 | + abortableEffect(() => { |
| 57 | + if (this.properties.value.disabled ?? false) { |
| 58 | + return |
| 59 | + } |
| 60 | + const pointerUpListener = (e: Object3DEventMap['pointerup']) => { |
| 61 | + if (this.downPointerId == null) { |
| 62 | + return |
| 63 | + } |
| 64 | + this.downPointerId = undefined |
| 65 | + e.stopPropagation?.() |
| 66 | + } |
| 67 | + const pointerDownListener = (e: Object3DEventMap['pointerdown']) => { |
| 68 | + if (this.downPointerId != null) { |
| 69 | + return |
| 70 | + } |
| 71 | + this.downPointerId = e.pointerId |
| 72 | + this.handleSetValue(e) |
| 73 | + if ( |
| 74 | + 'target' in e && |
| 75 | + e.target != null && |
| 76 | + typeof e.target === 'object' && |
| 77 | + 'setPointerCapture' in e.target && |
| 78 | + typeof e.target.setPointerCapture === 'function' |
| 79 | + ) { |
| 80 | + e.target.setPointerCapture(e.pointerId) |
| 81 | + } |
| 82 | + } |
| 83 | + const pointerMoveListener = (e: Object3DEventMap['pointermove']) => { |
| 84 | + if (this.downPointerId != e.pointerId) { |
| 85 | + return |
| 86 | + } |
| 87 | + this.handleSetValue(e) |
| 88 | + } |
| 89 | + this.addEventListener('pointermove', pointerMoveListener) |
| 90 | + this.addEventListener('pointerup', pointerUpListener) |
| 91 | + this.addEventListener('pointerdown', pointerDownListener) |
| 92 | + return () => { |
| 93 | + this.removeEventListener('pointermove', pointerMoveListener) |
| 94 | + this.removeEventListener('pointerup', pointerUpListener) |
| 95 | + this.removeEventListener('pointerdown', pointerDownListener) |
| 96 | + } |
| 97 | + }, this.abortSignal) |
| 98 | + |
100 | 99 | const percentage = computed(() => { |
101 | 100 | const min = this.properties.value.min ?? 0 |
102 | 101 | const max = this.properties.value.max ?? 100 |
|
0 commit comments