| 191 | * of dealing with pointer and keyboard events. |
| 192 | */ |
| 193 | export function usePress(props: PressHookProps): PressResult { |
| 194 | let { |
| 195 | onPress, |
| 196 | onPressChange, |
| 197 | onPressStart, |
| 198 | onPressEnd, |
| 199 | onPressUp, |
| 200 | onClick, |
| 201 | isDisabled, |
| 202 | isPressed: isPressedProp, |
| 203 | preventFocusOnPress, |
| 204 | shouldCancelOnPointerExit, |
| 205 | allowTextSelectionOnPress, |
| 206 | ref: domRef, |
| 207 | ...domProps |
| 208 | } = usePressResponderContext(props); |
| 209 | |
| 210 | let [isPressed, setPressed] = useState(false); |
| 211 | let ref = useRef<PressState>({ |
| 212 | isPressed: false, |
| 213 | ignoreEmulatedMouseEvents: false, |
| 214 | didFirePressStart: false, |
| 215 | isTriggeringEvent: false, |
| 216 | activePointerId: null, |
| 217 | target: null, |
| 218 | isOverTarget: false, |
| 219 | pointerType: null, |
| 220 | disposables: [] |
| 221 | }); |
| 222 | |
| 223 | let {addGlobalListener, removeAllGlobalListeners} = useGlobalListeners(); |
| 224 | |
| 225 | let triggerPressStart = useCallback( |
| 226 | (originalEvent: EventBase, pointerType: PointerType) => { |
| 227 | let state = ref.current; |
| 228 | if (isDisabled || state.didFirePressStart) { |
| 229 | return false; |
| 230 | } |
| 231 | |
| 232 | let shouldStopPropagation = true; |
| 233 | state.isTriggeringEvent = true; |
| 234 | if (onPressStart) { |
| 235 | let event = new PressEvent('pressstart', pointerType, originalEvent); |
| 236 | onPressStart(event); |
| 237 | shouldStopPropagation = event.shouldStopPropagation; |
| 238 | } |
| 239 | |
| 240 | if (onPressChange) { |
| 241 | onPressChange(true); |
| 242 | } |
| 243 | |
| 244 | state.isTriggeringEvent = false; |
| 245 | state.didFirePressStart = true; |
| 246 | setPressed(true); |
| 247 | return shouldStopPropagation; |
| 248 | }, |
| 249 | [isDisabled, onPressStart, onPressChange] |
| 250 | ); |