@tamagui/react-native-use-responder-events 1.0.1-beta.219 → 1.0.1-beta.221

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/ResponderTouchHistoryStore.ts"],
4
- "sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { Touch, TouchEvent } from './types'\nimport { isEndish, isMoveish, isStartish } from './types'\n\ntype TouchRecord = {\n currentPageX: number\n currentPageY: number\n currentTimeStamp: number\n previousPageX: number\n previousPageY: number\n previousTimeStamp: number\n startPageX: number\n startPageY: number\n startTimeStamp: number\n touchActive: boolean\n}\n\nexport type TouchHistory = {\n indexOfSingleActiveTouch: number\n mostRecentTimeStamp: number\n numberActiveTouches: number\n touchBank: Array<TouchRecord>\n}\n\n/**\n * Tracks the position and time of each active touch by `touch.identifier`. We\n * should typically only see IDs in the range of 1-20 because IDs get recycled\n * when touches end and start again.\n */\n\nconst MAX_TOUCH_BANK = 20\n\nfunction timestampForTouch(touch: Touch): number {\n // The legacy internal implementation provides \"timeStamp\", which has been\n // renamed to \"timestamp\".\n return touch['timeStamp'] || touch.timestamp\n}\n\n/**\n * TODO: Instead of making gestures recompute filtered velocity, we could\n * include a built in velocity computation that can be reused globally.\n */\nfunction createTouchRecord(touch: Touch): TouchRecord {\n return {\n touchActive: true,\n startPageX: touch.pageX,\n startPageY: touch.pageY,\n startTimeStamp: timestampForTouch(touch),\n currentPageX: touch.pageX,\n currentPageY: touch.pageY,\n currentTimeStamp: timestampForTouch(touch),\n previousPageX: touch.pageX,\n previousPageY: touch.pageY,\n previousTimeStamp: timestampForTouch(touch),\n }\n}\n\nfunction resetTouchRecord(touchRecord: TouchRecord, touch: Touch): void {\n touchRecord.touchActive = true\n touchRecord.startPageX = touch.pageX\n touchRecord.startPageY = touch.pageY\n touchRecord.startTimeStamp = timestampForTouch(touch)\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchRecord.previousPageX = touch.pageX\n touchRecord.previousPageY = touch.pageY\n touchRecord.previousTimeStamp = timestampForTouch(touch)\n}\n\nfunction getTouchIdentifier({ identifier }: Touch): number {\n if (identifier == null) {\n // eslint-disable-next-line no-console\n console.error('Touch object is missing identifier.')\n }\n if (process.env.NODE_ENV === 'development') {\n if (identifier > MAX_TOUCH_BANK) {\n // eslint-disable-next-line no-console\n console.error(\n 'Touch identifier %s is greater than maximum supported %s which causes ' +\n 'performance issues backfilling array locations for all of the indices.',\n identifier,\n MAX_TOUCH_BANK\n )\n }\n }\n return identifier\n}\n\nfunction recordTouchStart(touch: Touch, touchHistory): void {\n const identifier = getTouchIdentifier(touch)\n const touchRecord = touchHistory.touchBank[identifier]\n if (touchRecord) {\n resetTouchRecord(touchRecord, touch)\n } else {\n touchHistory.touchBank[identifier] = createTouchRecord(touch)\n }\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n}\n\nfunction recordTouchMove(touch: Touch, touchHistory): void {\n const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)]\n if (touchRecord) {\n touchRecord.touchActive = true\n touchRecord.previousPageX = touchRecord.currentPageX\n touchRecord.previousPageY = touchRecord.currentPageY\n touchRecord.previousTimeStamp = touchRecord.currentTimeStamp\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n } else {\n console.warn(\n 'Cannot record touch move without a touch start.\\n',\n `Touch Move: ${printTouch(touch)}\\n`,\n `Touch Bank: ${printTouchBank(touchHistory)}`\n )\n }\n}\n\nfunction recordTouchEnd(touch: Touch, touchHistory): void {\n const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)]\n if (touchRecord) {\n touchRecord.touchActive = false\n touchRecord.previousPageX = touchRecord.currentPageX\n touchRecord.previousPageY = touchRecord.currentPageY\n touchRecord.previousTimeStamp = touchRecord.currentTimeStamp\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n } else {\n console.warn(\n 'Cannot record touch end without a touch start.\\n',\n `Touch End: ${printTouch(touch)}\\n`,\n `Touch Bank: ${printTouchBank(touchHistory)}`\n )\n }\n}\n\nfunction printTouch(touch: Touch): string {\n return JSON.stringify({\n identifier: touch.identifier,\n pageX: touch.pageX,\n pageY: touch.pageY,\n timestamp: timestampForTouch(touch),\n })\n}\n\nfunction printTouchBank(touchHistory): string {\n const { touchBank } = touchHistory\n let printed = JSON.stringify(touchBank.slice(0, MAX_TOUCH_BANK))\n if (touchBank.length > MAX_TOUCH_BANK) {\n printed += ' (original size: ' + touchBank.length + ')'\n }\n return printed\n}\n\nexport class ResponderTouchHistoryStore {\n _touchHistory = {\n touchBank: [], //Array<TouchRecord>\n numberActiveTouches: 0,\n // If there is only one active touch, we remember its location. This prevents\n // us having to loop through all of the touches all the time in the most\n // common case.\n indexOfSingleActiveTouch: -1,\n mostRecentTimeStamp: 0,\n }\n\n recordTouchTrack(topLevelType: string, nativeEvent: TouchEvent): void {\n const touchHistory = this._touchHistory\n if (isMoveish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchMove(touch, touchHistory))\n } else if (isStartish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchStart(touch, touchHistory))\n touchHistory.numberActiveTouches = nativeEvent.touches.length\n if (touchHistory.numberActiveTouches === 1) {\n touchHistory.indexOfSingleActiveTouch = nativeEvent.touches[0].identifier\n }\n } else if (isEndish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchEnd(touch, touchHistory))\n touchHistory.numberActiveTouches = nativeEvent.touches.length\n if (touchHistory.numberActiveTouches === 1) {\n const { touchBank } = touchHistory\n for (let i = 0; i < touchBank.length; i++) {\n const touchTrackToCheck = touchBank[i]\n // @ts-ignore\n if (touchTrackToCheck != null && touchTrackToCheck.touchActive) {\n touchHistory.indexOfSingleActiveTouch = i\n break\n }\n }\n if (process.env.NODE_ENV === 'development') {\n const activeRecord = touchBank[touchHistory.indexOfSingleActiveTouch]\n // @ts-ignore\n if (!(activeRecord != null && activeRecord.touchActive)) {\n console.error('Cannot find single active touch.')\n }\n }\n }\n }\n }\n\n get touchHistory(): TouchHistory {\n return this._touchHistory\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { Touch, TouchEvent } from './types'\nimport { isEndish, isMoveish, isStartish } from './types'\n\ntype TouchRecord = {\n currentPageX: number\n currentPageY: number\n currentTimeStamp: number\n previousPageX: number\n previousPageY: number\n previousTimeStamp: number\n startPageX: number\n startPageY: number\n startTimeStamp: number\n touchActive: boolean\n}\n\nexport type TouchHistory = {\n indexOfSingleActiveTouch: number\n mostRecentTimeStamp: number\n numberActiveTouches: number\n touchBank: Array<TouchRecord>\n}\n\n/**\n * Tracks the position and time of each active touch by `touch.identifier`. We\n * should typically only see IDs in the range of 1-20 because IDs get recycled\n * when touches end and start again.\n */\n\nconst MAX_TOUCH_BANK = 20\n\nfunction timestampForTouch(touch: Touch): number {\n // The legacy internal implementation provides \"timeStamp\", which has been\n // renamed to \"timestamp\".\n return touch['timeStamp'] || touch.timestamp\n}\n\n/**\n * TODO: Instead of making gestures recompute filtered velocity, we could\n * include a built in velocity computation that can be reused globally.\n */\nfunction createTouchRecord(touch: Touch): TouchRecord {\n return {\n touchActive: true,\n startPageX: touch.pageX,\n startPageY: touch.pageY,\n startTimeStamp: timestampForTouch(touch),\n currentPageX: touch.pageX,\n currentPageY: touch.pageY,\n currentTimeStamp: timestampForTouch(touch),\n previousPageX: touch.pageX,\n previousPageY: touch.pageY,\n previousTimeStamp: timestampForTouch(touch),\n }\n}\n\nfunction resetTouchRecord(touchRecord: TouchRecord, touch: Touch): void {\n touchRecord.touchActive = true\n touchRecord.startPageX = touch.pageX\n touchRecord.startPageY = touch.pageY\n touchRecord.startTimeStamp = timestampForTouch(touch)\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchRecord.previousPageX = touch.pageX\n touchRecord.previousPageY = touch.pageY\n touchRecord.previousTimeStamp = timestampForTouch(touch)\n}\n\nfunction getTouchIdentifier({ identifier }: Touch): number {\n if (identifier == null) {\n // eslint-disable-next-line no-console\n console.error('Touch object is missing identifier.')\n }\n if (process.env.NODE_ENV === 'development') {\n if (identifier > MAX_TOUCH_BANK) {\n // eslint-disable-next-line no-console\n console.error(\n 'Touch identifier %s is greater than maximum supported %s which causes ' +\n 'performance issues backfilling array locations for all of the indices.',\n identifier,\n MAX_TOUCH_BANK\n )\n }\n }\n return identifier\n}\n\nfunction recordTouchStart(touch: Touch, touchHistory): void {\n const identifier = getTouchIdentifier(touch)\n const touchRecord = touchHistory.touchBank[identifier]\n if (touchRecord) {\n resetTouchRecord(touchRecord, touch)\n } else {\n touchHistory.touchBank[identifier] = createTouchRecord(touch)\n }\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n}\n\nfunction recordTouchMove(touch: Touch, touchHistory): void {\n const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)]\n if (touchRecord) {\n touchRecord.touchActive = true\n touchRecord.previousPageX = touchRecord.currentPageX\n touchRecord.previousPageY = touchRecord.currentPageY\n touchRecord.previousTimeStamp = touchRecord.currentTimeStamp\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n 'Cannot record touch move without a touch start.\\n',\n `Touch Move: ${printTouch(touch)}\\n`,\n `Touch Bank: ${printTouchBank(touchHistory)}`\n )\n }\n}\n\nfunction recordTouchEnd(touch: Touch, touchHistory): void {\n const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)]\n if (touchRecord) {\n touchRecord.touchActive = false\n touchRecord.previousPageX = touchRecord.currentPageX\n touchRecord.previousPageY = touchRecord.currentPageY\n touchRecord.previousTimeStamp = touchRecord.currentTimeStamp\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n 'Cannot record touch end without a touch start.\\n',\n `Touch End: ${printTouch(touch)}\\n`,\n `Touch Bank: ${printTouchBank(touchHistory)}`\n )\n }\n}\n\nfunction printTouch(touch: Touch): string {\n return JSON.stringify({\n identifier: touch.identifier,\n pageX: touch.pageX,\n pageY: touch.pageY,\n timestamp: timestampForTouch(touch),\n })\n}\n\nfunction printTouchBank(touchHistory): string {\n const { touchBank } = touchHistory\n let printed = JSON.stringify(touchBank.slice(0, MAX_TOUCH_BANK))\n if (touchBank.length > MAX_TOUCH_BANK) {\n printed += ' (original size: ' + touchBank.length + ')'\n }\n return printed\n}\n\nexport class ResponderTouchHistoryStore {\n _touchHistory = {\n touchBank: [], //Array<TouchRecord>\n numberActiveTouches: 0,\n // If there is only one active touch, we remember its location. This prevents\n // us having to loop through all of the touches all the time in the most\n // common case.\n indexOfSingleActiveTouch: -1,\n mostRecentTimeStamp: 0,\n }\n\n recordTouchTrack(topLevelType: string, nativeEvent: TouchEvent): void {\n const touchHistory = this._touchHistory\n if (isMoveish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchMove(touch, touchHistory))\n } else if (isStartish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchStart(touch, touchHistory))\n touchHistory.numberActiveTouches = nativeEvent.touches.length\n if (touchHistory.numberActiveTouches === 1) {\n touchHistory.indexOfSingleActiveTouch = nativeEvent.touches[0].identifier\n }\n } else if (isEndish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchEnd(touch, touchHistory))\n touchHistory.numberActiveTouches = nativeEvent.touches.length\n if (touchHistory.numberActiveTouches === 1) {\n const { touchBank } = touchHistory\n for (let i = 0; i < touchBank.length; i++) {\n const touchTrackToCheck = touchBank[i]\n // @ts-ignore\n if (touchTrackToCheck != null && touchTrackToCheck.touchActive) {\n touchHistory.indexOfSingleActiveTouch = i\n break\n }\n }\n if (process.env.NODE_ENV === 'development') {\n const activeRecord = touchBank[touchHistory.indexOfSingleActiveTouch]\n // @ts-ignore\n if (!(activeRecord != null && activeRecord.touchActive)) {\n // eslint-disable-next-line no-console\n console.error('Cannot find single active touch.')\n }\n }\n }\n }\n }\n\n get touchHistory(): TouchHistory {\n return this._touchHistory\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils.ts"],
4
- "sourcesContent": ["/**\n * Copyright (c) Nicolas Gallagher\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nconst keyName = '__reactResponderId'\n\nexport const canUseDOM = !!(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n)\n\nexport const getBoundingClientRect = (node: HTMLElement | null): void | DOMRect => {\n if (!node) return\n if (node.nodeType !== 1) return\n if (node.getBoundingClientRect) {\n return node.getBoundingClientRect()\n }\n}\n\nfunction getEventPath(domEvent: any): Array<any> {\n // The 'selectionchange' event always has the 'document' as the target.\n // Use the anchor node as the initial target to reconstruct a path.\n // (We actually only need the first \"responder\" node in practice.)\n if (domEvent.type === 'selectionchange') {\n const target = window.getSelection()?.anchorNode\n return composedPathFallback(target)\n } else {\n const path =\n domEvent.composedPath != null\n ? domEvent.composedPath()\n : composedPathFallback(domEvent.target)\n return path\n }\n}\n\nfunction composedPathFallback(target: any): Array<any> {\n const path: any[] = []\n while (target != null && target !== document.body) {\n path.push(target)\n target = target.parentNode\n }\n return path\n}\n\n/**\n * Retrieve the responderId from a host node\n */\nfunction getResponderId(node: any): number | null {\n if (node != null) {\n return node[keyName]\n }\n return null\n}\n\n/**\n * Store the responderId on a host node\n */\nexport function setResponderId(node: any, id: number) {\n if (node != null) {\n node[keyName] = id\n }\n}\n\n/**\n * Filter the event path to contain only the nodes attached to the responder system\n */\nexport function getResponderPaths(domEvent: any): {\n idPath: Array<number>\n nodePath: Array<any>\n} {\n const idPath: any[] = []\n const nodePath: any[] = []\n const eventPath = getEventPath(domEvent)\n for (let i = 0; i < eventPath.length; i++) {\n const node = eventPath[i]\n const id = getResponderId(node)\n if (id != null) {\n idPath.push(id)\n nodePath.push(node)\n }\n }\n return { idPath, nodePath }\n}\n\n/**\n * Walk the paths and find the first common ancestor\n */\nexport function getLowestCommonAncestor(pathA: Array<any>, pathB: Array<any>): any {\n let pathALength = pathA.length\n let pathBLength = pathB.length\n if (\n // If either path is empty\n pathALength === 0 ||\n pathBLength === 0 ||\n // If the last elements aren't the same there can't be a common ancestor\n // that is connected to the responder system\n pathA[pathALength - 1] !== pathB[pathBLength - 1]\n ) {\n return null\n }\n\n let itemA = pathA[0]\n let indexA = 0\n let itemB = pathB[0]\n let indexB = 0\n\n // If A is deeper, skip indices that can't match.\n if (pathALength - pathBLength > 0) {\n indexA = pathALength - pathBLength\n itemA = pathA[indexA]\n pathALength = pathBLength\n }\n\n // If B is deeper, skip indices that can't match\n if (pathBLength - pathALength > 0) {\n indexB = pathBLength - pathALength\n itemB = pathB[indexB]\n pathBLength = pathALength\n }\n\n // Walk in lockstep until a match is found\n let depth = pathALength\n while (depth--) {\n if (itemA === itemB) {\n return itemA\n }\n itemA = pathA[indexA++]\n itemB = pathB[indexB++]\n }\n return null\n}\n\n/**\n * Determine whether any of the active touches are within the current responder.\n * This cannot rely on W3C `targetTouches`, as neither IE11 nor Safari implement it.\n */\nexport function hasTargetTouches(target: any, touches: any): boolean {\n if (!touches || touches.length === 0) {\n return false\n }\n for (let i = 0; i < touches.length; i++) {\n const node = touches[i].target\n if (node != null) {\n if (target.contains(node)) {\n return true\n }\n }\n }\n return false\n}\n\n/**\n * Ignore 'selectionchange' events that don't correspond with a person's intent to\n * select text.\n */\nexport function hasValidSelection(domEvent: any): boolean {\n if (domEvent.type === 'selectionchange') {\n return isSelectionValid()\n }\n return domEvent.type === 'select'\n}\n\n/**\n * Events are only valid if the primary button was used without specific modifier keys.\n */\nexport function isPrimaryPointerDown(domEvent: any): boolean {\n const { altKey, button, buttons, ctrlKey, type } = domEvent\n const isTouch = type === 'touchstart' || type === 'touchmove'\n const isPrimaryMouseDown = type === 'mousedown' && (button === 0 || buttons === 1)\n const isPrimaryMouseMove = type === 'mousemove' && buttons === 1\n const noModifiers = altKey === false && ctrlKey === false\n\n if (isTouch || (isPrimaryMouseDown && noModifiers) || (isPrimaryMouseMove && noModifiers)) {\n return true\n }\n return false\n}\n\nexport function isSelectionValid(): boolean {\n const selection = window.getSelection()\n if (!selection) return false\n const string = selection.toString()\n const anchorNode = selection.anchorNode\n const focusNode = selection.focusNode\n const isTextNode =\n (anchorNode && anchorNode.nodeType === window.Node.TEXT_NODE) ||\n (focusNode && focusNode.nodeType === window.Node.TEXT_NODE)\n return string.length >= 1 && string !== '\\n' && !!isTextNode\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Copyright (c) Nicolas Gallagher\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nconst keyName = '__reactResponderId'\n\nexport const canUseDOM = !!(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n)\n\nexport const getBoundingClientRect = (node: HTMLElement | null): void | DOMRect => {\n if (!node) return\n if (node.nodeType !== 1) return\n if (node.getBoundingClientRect) {\n return node.getBoundingClientRect()\n }\n}\n\nfunction getEventPath(domEvent: any): Array<any> {\n // The 'selectionchange' event always has the 'document' as the target.\n // Use the anchor node as the initial target to reconstruct a path.\n // (We actually only need the first \"responder\" node in practice.)\n if (domEvent.type === 'selectionchange') {\n const target = window.getSelection()?.anchorNode\n return composedPathFallback(target)\n } else {\n const path =\n domEvent.composedPath != null\n ? domEvent.composedPath()\n : composedPathFallback(domEvent.target)\n return path\n }\n}\n\nfunction composedPathFallback(target: any): Array<any> {\n const path: any[] = []\n while (target != null && target !== document.body) {\n path.push(target)\n target = target.parentNode\n }\n return path\n}\n\n/**\n * Retrieve the responderId from a host node\n */\nfunction getResponderId(node: any): number | null {\n if (node != null) {\n return node[keyName]\n }\n return null\n}\n\n/**\n * Store the responderId on a host node\n */\nexport function setResponderId(node: any, id: any) {\n if (node != null) {\n node[keyName] = id\n }\n}\n\n/**\n * Filter the event path to contain only the nodes attached to the responder system\n */\nexport function getResponderPaths(domEvent: any): {\n idPath: Array<number>\n nodePath: Array<any>\n} {\n const idPath: any[] = []\n const nodePath: any[] = []\n const eventPath = getEventPath(domEvent)\n for (let i = 0; i < eventPath.length; i++) {\n const node = eventPath[i]\n const id = getResponderId(node)\n if (id != null) {\n idPath.push(id)\n nodePath.push(node)\n }\n }\n return { idPath, nodePath }\n}\n\n/**\n * Walk the paths and find the first common ancestor\n */\nexport function getLowestCommonAncestor(pathA: Array<any>, pathB: Array<any>): any {\n let pathALength = pathA.length\n let pathBLength = pathB.length\n if (\n // If either path is empty\n pathALength === 0 ||\n pathBLength === 0 ||\n // If the last elements aren't the same there can't be a common ancestor\n // that is connected to the responder system\n pathA[pathALength - 1] !== pathB[pathBLength - 1]\n ) {\n return null\n }\n\n let itemA = pathA[0]\n let indexA = 0\n let itemB = pathB[0]\n let indexB = 0\n\n // If A is deeper, skip indices that can't match.\n if (pathALength - pathBLength > 0) {\n indexA = pathALength - pathBLength\n itemA = pathA[indexA]\n pathALength = pathBLength\n }\n\n // If B is deeper, skip indices that can't match\n if (pathBLength - pathALength > 0) {\n indexB = pathBLength - pathALength\n itemB = pathB[indexB]\n pathBLength = pathALength\n }\n\n // Walk in lockstep until a match is found\n let depth = pathALength\n while (depth--) {\n if (itemA === itemB) {\n return itemA\n }\n itemA = pathA[indexA++]\n itemB = pathB[indexB++]\n }\n return null\n}\n\n/**\n * Determine whether any of the active touches are within the current responder.\n * This cannot rely on W3C `targetTouches`, as neither IE11 nor Safari implement it.\n */\nexport function hasTargetTouches(target: any, touches: any): boolean {\n if (!touches || touches.length === 0) {\n return false\n }\n for (let i = 0; i < touches.length; i++) {\n const node = touches[i].target\n if (node != null) {\n if (target.contains(node)) {\n return true\n }\n }\n }\n return false\n}\n\n/**\n * Ignore 'selectionchange' events that don't correspond with a person's intent to\n * select text.\n */\nexport function hasValidSelection(domEvent: any): boolean {\n if (domEvent.type === 'selectionchange') {\n return isSelectionValid()\n }\n return domEvent.type === 'select'\n}\n\n/**\n * Events are only valid if the primary button was used without specific modifier keys.\n */\nexport function isPrimaryPointerDown(domEvent: any): boolean {\n const { altKey, button, buttons, ctrlKey, type } = domEvent\n const isTouch = type === 'touchstart' || type === 'touchmove'\n const isPrimaryMouseDown = type === 'mousedown' && (button === 0 || buttons === 1)\n const isPrimaryMouseMove = type === 'mousemove' && buttons === 1\n const noModifiers = altKey === false && ctrlKey === false\n\n if (isTouch || (isPrimaryMouseDown && noModifiers) || (isPrimaryMouseMove && noModifiers)) {\n return true\n }\n return false\n}\n\nexport function isSelectionValid(): boolean {\n const selection = window.getSelection()\n if (!selection) return false\n const string = selection.toString()\n const anchorNode = selection.anchorNode\n const focusNode = selection.focusNode\n const isTextNode =\n (anchorNode && anchorNode.nodeType === window.Node.TEXT_NODE) ||\n (focusNode && focusNode.nodeType === window.Node.TEXT_NODE)\n return string.length >= 1 && string !== '\\n' && !!isTextNode\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/ResponderTouchHistoryStore.ts"],
4
- "sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { Touch, TouchEvent } from './types'\nimport { isEndish, isMoveish, isStartish } from './types'\n\ntype TouchRecord = {\n currentPageX: number\n currentPageY: number\n currentTimeStamp: number\n previousPageX: number\n previousPageY: number\n previousTimeStamp: number\n startPageX: number\n startPageY: number\n startTimeStamp: number\n touchActive: boolean\n}\n\nexport type TouchHistory = {\n indexOfSingleActiveTouch: number\n mostRecentTimeStamp: number\n numberActiveTouches: number\n touchBank: Array<TouchRecord>\n}\n\n/**\n * Tracks the position and time of each active touch by `touch.identifier`. We\n * should typically only see IDs in the range of 1-20 because IDs get recycled\n * when touches end and start again.\n */\n\nconst MAX_TOUCH_BANK = 20\n\nfunction timestampForTouch(touch: Touch): number {\n // The legacy internal implementation provides \"timeStamp\", which has been\n // renamed to \"timestamp\".\n return touch['timeStamp'] || touch.timestamp\n}\n\n/**\n * TODO: Instead of making gestures recompute filtered velocity, we could\n * include a built in velocity computation that can be reused globally.\n */\nfunction createTouchRecord(touch: Touch): TouchRecord {\n return {\n touchActive: true,\n startPageX: touch.pageX,\n startPageY: touch.pageY,\n startTimeStamp: timestampForTouch(touch),\n currentPageX: touch.pageX,\n currentPageY: touch.pageY,\n currentTimeStamp: timestampForTouch(touch),\n previousPageX: touch.pageX,\n previousPageY: touch.pageY,\n previousTimeStamp: timestampForTouch(touch),\n }\n}\n\nfunction resetTouchRecord(touchRecord: TouchRecord, touch: Touch): void {\n touchRecord.touchActive = true\n touchRecord.startPageX = touch.pageX\n touchRecord.startPageY = touch.pageY\n touchRecord.startTimeStamp = timestampForTouch(touch)\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchRecord.previousPageX = touch.pageX\n touchRecord.previousPageY = touch.pageY\n touchRecord.previousTimeStamp = timestampForTouch(touch)\n}\n\nfunction getTouchIdentifier({ identifier }: Touch): number {\n if (identifier == null) {\n // eslint-disable-next-line no-console\n console.error('Touch object is missing identifier.')\n }\n if (process.env.NODE_ENV === 'development') {\n if (identifier > MAX_TOUCH_BANK) {\n // eslint-disable-next-line no-console\n console.error(\n 'Touch identifier %s is greater than maximum supported %s which causes ' +\n 'performance issues backfilling array locations for all of the indices.',\n identifier,\n MAX_TOUCH_BANK\n )\n }\n }\n return identifier\n}\n\nfunction recordTouchStart(touch: Touch, touchHistory): void {\n const identifier = getTouchIdentifier(touch)\n const touchRecord = touchHistory.touchBank[identifier]\n if (touchRecord) {\n resetTouchRecord(touchRecord, touch)\n } else {\n touchHistory.touchBank[identifier] = createTouchRecord(touch)\n }\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n}\n\nfunction recordTouchMove(touch: Touch, touchHistory): void {\n const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)]\n if (touchRecord) {\n touchRecord.touchActive = true\n touchRecord.previousPageX = touchRecord.currentPageX\n touchRecord.previousPageY = touchRecord.currentPageY\n touchRecord.previousTimeStamp = touchRecord.currentTimeStamp\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n } else {\n console.warn(\n 'Cannot record touch move without a touch start.\\n',\n `Touch Move: ${printTouch(touch)}\\n`,\n `Touch Bank: ${printTouchBank(touchHistory)}`\n )\n }\n}\n\nfunction recordTouchEnd(touch: Touch, touchHistory): void {\n const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)]\n if (touchRecord) {\n touchRecord.touchActive = false\n touchRecord.previousPageX = touchRecord.currentPageX\n touchRecord.previousPageY = touchRecord.currentPageY\n touchRecord.previousTimeStamp = touchRecord.currentTimeStamp\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n } else {\n console.warn(\n 'Cannot record touch end without a touch start.\\n',\n `Touch End: ${printTouch(touch)}\\n`,\n `Touch Bank: ${printTouchBank(touchHistory)}`\n )\n }\n}\n\nfunction printTouch(touch: Touch): string {\n return JSON.stringify({\n identifier: touch.identifier,\n pageX: touch.pageX,\n pageY: touch.pageY,\n timestamp: timestampForTouch(touch),\n })\n}\n\nfunction printTouchBank(touchHistory): string {\n const { touchBank } = touchHistory\n let printed = JSON.stringify(touchBank.slice(0, MAX_TOUCH_BANK))\n if (touchBank.length > MAX_TOUCH_BANK) {\n printed += ' (original size: ' + touchBank.length + ')'\n }\n return printed\n}\n\nexport class ResponderTouchHistoryStore {\n _touchHistory = {\n touchBank: [], //Array<TouchRecord>\n numberActiveTouches: 0,\n // If there is only one active touch, we remember its location. This prevents\n // us having to loop through all of the touches all the time in the most\n // common case.\n indexOfSingleActiveTouch: -1,\n mostRecentTimeStamp: 0,\n }\n\n recordTouchTrack(topLevelType: string, nativeEvent: TouchEvent): void {\n const touchHistory = this._touchHistory\n if (isMoveish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchMove(touch, touchHistory))\n } else if (isStartish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchStart(touch, touchHistory))\n touchHistory.numberActiveTouches = nativeEvent.touches.length\n if (touchHistory.numberActiveTouches === 1) {\n touchHistory.indexOfSingleActiveTouch = nativeEvent.touches[0].identifier\n }\n } else if (isEndish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchEnd(touch, touchHistory))\n touchHistory.numberActiveTouches = nativeEvent.touches.length\n if (touchHistory.numberActiveTouches === 1) {\n const { touchBank } = touchHistory\n for (let i = 0; i < touchBank.length; i++) {\n const touchTrackToCheck = touchBank[i]\n // @ts-ignore\n if (touchTrackToCheck != null && touchTrackToCheck.touchActive) {\n touchHistory.indexOfSingleActiveTouch = i\n break\n }\n }\n if (process.env.NODE_ENV === 'development') {\n const activeRecord = touchBank[touchHistory.indexOfSingleActiveTouch]\n // @ts-ignore\n if (!(activeRecord != null && activeRecord.touchActive)) {\n console.error('Cannot find single active touch.')\n }\n }\n }\n }\n }\n\n get touchHistory(): TouchHistory {\n return this._touchHistory\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { Touch, TouchEvent } from './types'\nimport { isEndish, isMoveish, isStartish } from './types'\n\ntype TouchRecord = {\n currentPageX: number\n currentPageY: number\n currentTimeStamp: number\n previousPageX: number\n previousPageY: number\n previousTimeStamp: number\n startPageX: number\n startPageY: number\n startTimeStamp: number\n touchActive: boolean\n}\n\nexport type TouchHistory = {\n indexOfSingleActiveTouch: number\n mostRecentTimeStamp: number\n numberActiveTouches: number\n touchBank: Array<TouchRecord>\n}\n\n/**\n * Tracks the position and time of each active touch by `touch.identifier`. We\n * should typically only see IDs in the range of 1-20 because IDs get recycled\n * when touches end and start again.\n */\n\nconst MAX_TOUCH_BANK = 20\n\nfunction timestampForTouch(touch: Touch): number {\n // The legacy internal implementation provides \"timeStamp\", which has been\n // renamed to \"timestamp\".\n return touch['timeStamp'] || touch.timestamp\n}\n\n/**\n * TODO: Instead of making gestures recompute filtered velocity, we could\n * include a built in velocity computation that can be reused globally.\n */\nfunction createTouchRecord(touch: Touch): TouchRecord {\n return {\n touchActive: true,\n startPageX: touch.pageX,\n startPageY: touch.pageY,\n startTimeStamp: timestampForTouch(touch),\n currentPageX: touch.pageX,\n currentPageY: touch.pageY,\n currentTimeStamp: timestampForTouch(touch),\n previousPageX: touch.pageX,\n previousPageY: touch.pageY,\n previousTimeStamp: timestampForTouch(touch),\n }\n}\n\nfunction resetTouchRecord(touchRecord: TouchRecord, touch: Touch): void {\n touchRecord.touchActive = true\n touchRecord.startPageX = touch.pageX\n touchRecord.startPageY = touch.pageY\n touchRecord.startTimeStamp = timestampForTouch(touch)\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchRecord.previousPageX = touch.pageX\n touchRecord.previousPageY = touch.pageY\n touchRecord.previousTimeStamp = timestampForTouch(touch)\n}\n\nfunction getTouchIdentifier({ identifier }: Touch): number {\n if (identifier == null) {\n // eslint-disable-next-line no-console\n console.error('Touch object is missing identifier.')\n }\n if (process.env.NODE_ENV === 'development') {\n if (identifier > MAX_TOUCH_BANK) {\n // eslint-disable-next-line no-console\n console.error(\n 'Touch identifier %s is greater than maximum supported %s which causes ' +\n 'performance issues backfilling array locations for all of the indices.',\n identifier,\n MAX_TOUCH_BANK\n )\n }\n }\n return identifier\n}\n\nfunction recordTouchStart(touch: Touch, touchHistory): void {\n const identifier = getTouchIdentifier(touch)\n const touchRecord = touchHistory.touchBank[identifier]\n if (touchRecord) {\n resetTouchRecord(touchRecord, touch)\n } else {\n touchHistory.touchBank[identifier] = createTouchRecord(touch)\n }\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n}\n\nfunction recordTouchMove(touch: Touch, touchHistory): void {\n const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)]\n if (touchRecord) {\n touchRecord.touchActive = true\n touchRecord.previousPageX = touchRecord.currentPageX\n touchRecord.previousPageY = touchRecord.currentPageY\n touchRecord.previousTimeStamp = touchRecord.currentTimeStamp\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n 'Cannot record touch move without a touch start.\\n',\n `Touch Move: ${printTouch(touch)}\\n`,\n `Touch Bank: ${printTouchBank(touchHistory)}`\n )\n }\n}\n\nfunction recordTouchEnd(touch: Touch, touchHistory): void {\n const touchRecord = touchHistory.touchBank[getTouchIdentifier(touch)]\n if (touchRecord) {\n touchRecord.touchActive = false\n touchRecord.previousPageX = touchRecord.currentPageX\n touchRecord.previousPageY = touchRecord.currentPageY\n touchRecord.previousTimeStamp = touchRecord.currentTimeStamp\n touchRecord.currentPageX = touch.pageX\n touchRecord.currentPageY = touch.pageY\n touchRecord.currentTimeStamp = timestampForTouch(touch)\n touchHistory.mostRecentTimeStamp = timestampForTouch(touch)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n 'Cannot record touch end without a touch start.\\n',\n `Touch End: ${printTouch(touch)}\\n`,\n `Touch Bank: ${printTouchBank(touchHistory)}`\n )\n }\n}\n\nfunction printTouch(touch: Touch): string {\n return JSON.stringify({\n identifier: touch.identifier,\n pageX: touch.pageX,\n pageY: touch.pageY,\n timestamp: timestampForTouch(touch),\n })\n}\n\nfunction printTouchBank(touchHistory): string {\n const { touchBank } = touchHistory\n let printed = JSON.stringify(touchBank.slice(0, MAX_TOUCH_BANK))\n if (touchBank.length > MAX_TOUCH_BANK) {\n printed += ' (original size: ' + touchBank.length + ')'\n }\n return printed\n}\n\nexport class ResponderTouchHistoryStore {\n _touchHistory = {\n touchBank: [], //Array<TouchRecord>\n numberActiveTouches: 0,\n // If there is only one active touch, we remember its location. This prevents\n // us having to loop through all of the touches all the time in the most\n // common case.\n indexOfSingleActiveTouch: -1,\n mostRecentTimeStamp: 0,\n }\n\n recordTouchTrack(topLevelType: string, nativeEvent: TouchEvent): void {\n const touchHistory = this._touchHistory\n if (isMoveish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchMove(touch, touchHistory))\n } else if (isStartish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchStart(touch, touchHistory))\n touchHistory.numberActiveTouches = nativeEvent.touches.length\n if (touchHistory.numberActiveTouches === 1) {\n touchHistory.indexOfSingleActiveTouch = nativeEvent.touches[0].identifier\n }\n } else if (isEndish(topLevelType)) {\n nativeEvent.changedTouches.forEach((touch) => recordTouchEnd(touch, touchHistory))\n touchHistory.numberActiveTouches = nativeEvent.touches.length\n if (touchHistory.numberActiveTouches === 1) {\n const { touchBank } = touchHistory\n for (let i = 0; i < touchBank.length; i++) {\n const touchTrackToCheck = touchBank[i]\n // @ts-ignore\n if (touchTrackToCheck != null && touchTrackToCheck.touchActive) {\n touchHistory.indexOfSingleActiveTouch = i\n break\n }\n }\n if (process.env.NODE_ENV === 'development') {\n const activeRecord = touchBank[touchHistory.indexOfSingleActiveTouch]\n // @ts-ignore\n if (!(activeRecord != null && activeRecord.touchActive)) {\n // eslint-disable-next-line no-console\n console.error('Cannot find single active touch.')\n }\n }\n }\n }\n }\n\n get touchHistory(): TouchHistory {\n return this._touchHistory\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils.ts"],
4
- "sourcesContent": ["/**\n * Copyright (c) Nicolas Gallagher\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nconst keyName = '__reactResponderId'\n\nexport const canUseDOM = !!(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n)\n\nexport const getBoundingClientRect = (node: HTMLElement | null): void | DOMRect => {\n if (!node) return\n if (node.nodeType !== 1) return\n if (node.getBoundingClientRect) {\n return node.getBoundingClientRect()\n }\n}\n\nfunction getEventPath(domEvent: any): Array<any> {\n // The 'selectionchange' event always has the 'document' as the target.\n // Use the anchor node as the initial target to reconstruct a path.\n // (We actually only need the first \"responder\" node in practice.)\n if (domEvent.type === 'selectionchange') {\n const target = window.getSelection()?.anchorNode\n return composedPathFallback(target)\n } else {\n const path =\n domEvent.composedPath != null\n ? domEvent.composedPath()\n : composedPathFallback(domEvent.target)\n return path\n }\n}\n\nfunction composedPathFallback(target: any): Array<any> {\n const path: any[] = []\n while (target != null && target !== document.body) {\n path.push(target)\n target = target.parentNode\n }\n return path\n}\n\n/**\n * Retrieve the responderId from a host node\n */\nfunction getResponderId(node: any): number | null {\n if (node != null) {\n return node[keyName]\n }\n return null\n}\n\n/**\n * Store the responderId on a host node\n */\nexport function setResponderId(node: any, id: number) {\n if (node != null) {\n node[keyName] = id\n }\n}\n\n/**\n * Filter the event path to contain only the nodes attached to the responder system\n */\nexport function getResponderPaths(domEvent: any): {\n idPath: Array<number>\n nodePath: Array<any>\n} {\n const idPath: any[] = []\n const nodePath: any[] = []\n const eventPath = getEventPath(domEvent)\n for (let i = 0; i < eventPath.length; i++) {\n const node = eventPath[i]\n const id = getResponderId(node)\n if (id != null) {\n idPath.push(id)\n nodePath.push(node)\n }\n }\n return { idPath, nodePath }\n}\n\n/**\n * Walk the paths and find the first common ancestor\n */\nexport function getLowestCommonAncestor(pathA: Array<any>, pathB: Array<any>): any {\n let pathALength = pathA.length\n let pathBLength = pathB.length\n if (\n // If either path is empty\n pathALength === 0 ||\n pathBLength === 0 ||\n // If the last elements aren't the same there can't be a common ancestor\n // that is connected to the responder system\n pathA[pathALength - 1] !== pathB[pathBLength - 1]\n ) {\n return null\n }\n\n let itemA = pathA[0]\n let indexA = 0\n let itemB = pathB[0]\n let indexB = 0\n\n // If A is deeper, skip indices that can't match.\n if (pathALength - pathBLength > 0) {\n indexA = pathALength - pathBLength\n itemA = pathA[indexA]\n pathALength = pathBLength\n }\n\n // If B is deeper, skip indices that can't match\n if (pathBLength - pathALength > 0) {\n indexB = pathBLength - pathALength\n itemB = pathB[indexB]\n pathBLength = pathALength\n }\n\n // Walk in lockstep until a match is found\n let depth = pathALength\n while (depth--) {\n if (itemA === itemB) {\n return itemA\n }\n itemA = pathA[indexA++]\n itemB = pathB[indexB++]\n }\n return null\n}\n\n/**\n * Determine whether any of the active touches are within the current responder.\n * This cannot rely on W3C `targetTouches`, as neither IE11 nor Safari implement it.\n */\nexport function hasTargetTouches(target: any, touches: any): boolean {\n if (!touches || touches.length === 0) {\n return false\n }\n for (let i = 0; i < touches.length; i++) {\n const node = touches[i].target\n if (node != null) {\n if (target.contains(node)) {\n return true\n }\n }\n }\n return false\n}\n\n/**\n * Ignore 'selectionchange' events that don't correspond with a person's intent to\n * select text.\n */\nexport function hasValidSelection(domEvent: any): boolean {\n if (domEvent.type === 'selectionchange') {\n return isSelectionValid()\n }\n return domEvent.type === 'select'\n}\n\n/**\n * Events are only valid if the primary button was used without specific modifier keys.\n */\nexport function isPrimaryPointerDown(domEvent: any): boolean {\n const { altKey, button, buttons, ctrlKey, type } = domEvent\n const isTouch = type === 'touchstart' || type === 'touchmove'\n const isPrimaryMouseDown = type === 'mousedown' && (button === 0 || buttons === 1)\n const isPrimaryMouseMove = type === 'mousemove' && buttons === 1\n const noModifiers = altKey === false && ctrlKey === false\n\n if (isTouch || (isPrimaryMouseDown && noModifiers) || (isPrimaryMouseMove && noModifiers)) {\n return true\n }\n return false\n}\n\nexport function isSelectionValid(): boolean {\n const selection = window.getSelection()\n if (!selection) return false\n const string = selection.toString()\n const anchorNode = selection.anchorNode\n const focusNode = selection.focusNode\n const isTextNode =\n (anchorNode && anchorNode.nodeType === window.Node.TEXT_NODE) ||\n (focusNode && focusNode.nodeType === window.Node.TEXT_NODE)\n return string.length >= 1 && string !== '\\n' && !!isTextNode\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Copyright (c) Nicolas Gallagher\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nconst keyName = '__reactResponderId'\n\nexport const canUseDOM = !!(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n)\n\nexport const getBoundingClientRect = (node: HTMLElement | null): void | DOMRect => {\n if (!node) return\n if (node.nodeType !== 1) return\n if (node.getBoundingClientRect) {\n return node.getBoundingClientRect()\n }\n}\n\nfunction getEventPath(domEvent: any): Array<any> {\n // The 'selectionchange' event always has the 'document' as the target.\n // Use the anchor node as the initial target to reconstruct a path.\n // (We actually only need the first \"responder\" node in practice.)\n if (domEvent.type === 'selectionchange') {\n const target = window.getSelection()?.anchorNode\n return composedPathFallback(target)\n } else {\n const path =\n domEvent.composedPath != null\n ? domEvent.composedPath()\n : composedPathFallback(domEvent.target)\n return path\n }\n}\n\nfunction composedPathFallback(target: any): Array<any> {\n const path: any[] = []\n while (target != null && target !== document.body) {\n path.push(target)\n target = target.parentNode\n }\n return path\n}\n\n/**\n * Retrieve the responderId from a host node\n */\nfunction getResponderId(node: any): number | null {\n if (node != null) {\n return node[keyName]\n }\n return null\n}\n\n/**\n * Store the responderId on a host node\n */\nexport function setResponderId(node: any, id: any) {\n if (node != null) {\n node[keyName] = id\n }\n}\n\n/**\n * Filter the event path to contain only the nodes attached to the responder system\n */\nexport function getResponderPaths(domEvent: any): {\n idPath: Array<number>\n nodePath: Array<any>\n} {\n const idPath: any[] = []\n const nodePath: any[] = []\n const eventPath = getEventPath(domEvent)\n for (let i = 0; i < eventPath.length; i++) {\n const node = eventPath[i]\n const id = getResponderId(node)\n if (id != null) {\n idPath.push(id)\n nodePath.push(node)\n }\n }\n return { idPath, nodePath }\n}\n\n/**\n * Walk the paths and find the first common ancestor\n */\nexport function getLowestCommonAncestor(pathA: Array<any>, pathB: Array<any>): any {\n let pathALength = pathA.length\n let pathBLength = pathB.length\n if (\n // If either path is empty\n pathALength === 0 ||\n pathBLength === 0 ||\n // If the last elements aren't the same there can't be a common ancestor\n // that is connected to the responder system\n pathA[pathALength - 1] !== pathB[pathBLength - 1]\n ) {\n return null\n }\n\n let itemA = pathA[0]\n let indexA = 0\n let itemB = pathB[0]\n let indexB = 0\n\n // If A is deeper, skip indices that can't match.\n if (pathALength - pathBLength > 0) {\n indexA = pathALength - pathBLength\n itemA = pathA[indexA]\n pathALength = pathBLength\n }\n\n // If B is deeper, skip indices that can't match\n if (pathBLength - pathALength > 0) {\n indexB = pathBLength - pathALength\n itemB = pathB[indexB]\n pathBLength = pathALength\n }\n\n // Walk in lockstep until a match is found\n let depth = pathALength\n while (depth--) {\n if (itemA === itemB) {\n return itemA\n }\n itemA = pathA[indexA++]\n itemB = pathB[indexB++]\n }\n return null\n}\n\n/**\n * Determine whether any of the active touches are within the current responder.\n * This cannot rely on W3C `targetTouches`, as neither IE11 nor Safari implement it.\n */\nexport function hasTargetTouches(target: any, touches: any): boolean {\n if (!touches || touches.length === 0) {\n return false\n }\n for (let i = 0; i < touches.length; i++) {\n const node = touches[i].target\n if (node != null) {\n if (target.contains(node)) {\n return true\n }\n }\n }\n return false\n}\n\n/**\n * Ignore 'selectionchange' events that don't correspond with a person's intent to\n * select text.\n */\nexport function hasValidSelection(domEvent: any): boolean {\n if (domEvent.type === 'selectionchange') {\n return isSelectionValid()\n }\n return domEvent.type === 'select'\n}\n\n/**\n * Events are only valid if the primary button was used without specific modifier keys.\n */\nexport function isPrimaryPointerDown(domEvent: any): boolean {\n const { altKey, button, buttons, ctrlKey, type } = domEvent\n const isTouch = type === 'touchstart' || type === 'touchmove'\n const isPrimaryMouseDown = type === 'mousedown' && (button === 0 || buttons === 1)\n const isPrimaryMouseMove = type === 'mousemove' && buttons === 1\n const noModifiers = altKey === false && ctrlKey === false\n\n if (isTouch || (isPrimaryMouseDown && noModifiers) || (isPrimaryMouseMove && noModifiers)) {\n return true\n }\n return false\n}\n\nexport function isSelectionValid(): boolean {\n const selection = window.getSelection()\n if (!selection) return false\n const string = selection.toString()\n const anchorNode = selection.anchorNode\n const focusNode = selection.focusNode\n const isTextNode =\n (anchorNode && anchorNode.nodeType === window.Node.TEXT_NODE) ||\n (focusNode && focusNode.nodeType === window.Node.TEXT_NODE)\n return string.length >= 1 && string !== '\\n' && !!isTextNode\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/react-native-use-responder-events",
3
- "version": "1.0.1-beta.219",
3
+ "version": "1.0.1-beta.221",
4
4
  "types": "./types/index.d.ts",
5
5
  "main": "dist/cjs",
6
6
  "module": "dist/esm",
@@ -12,7 +12,7 @@
12
12
  "scripts": {
13
13
  "build": "tamagui-build",
14
14
  "watch": "tamagui-build --watch",
15
- "lint": "eslint",
15
+ "lint": "eslint src",
16
16
  "lint:fix": "yarn lint --fix",
17
17
  "clean": "tamagui-build clean",
18
18
  "clean:build": "tamagui-build clean:build"
@@ -21,7 +21,7 @@
21
21
  "react": ">=18"
22
22
  },
23
23
  "devDependencies": {
24
- "@tamagui/build": "^1.0.1-beta.219",
24
+ "@tamagui/build": "^1.0.1-beta.221",
25
25
  "@types/react": "^18.0.15"
26
26
  },
27
27
  "publishConfig": {
@@ -116,6 +116,7 @@ function recordTouchMove(touch: Touch, touchHistory): void {
116
116
  touchRecord.currentTimeStamp = timestampForTouch(touch)
117
117
  touchHistory.mostRecentTimeStamp = timestampForTouch(touch)
118
118
  } else {
119
+ // eslint-disable-next-line no-console
119
120
  console.warn(
120
121
  'Cannot record touch move without a touch start.\n',
121
122
  `Touch Move: ${printTouch(touch)}\n`,
@@ -136,6 +137,7 @@ function recordTouchEnd(touch: Touch, touchHistory): void {
136
137
  touchRecord.currentTimeStamp = timestampForTouch(touch)
137
138
  touchHistory.mostRecentTimeStamp = timestampForTouch(touch)
138
139
  } else {
140
+ // eslint-disable-next-line no-console
139
141
  console.warn(
140
142
  'Cannot record touch end without a touch start.\n',
141
143
  `Touch End: ${printTouch(touch)}\n`,
@@ -200,6 +202,7 @@ export class ResponderTouchHistoryStore {
200
202
  const activeRecord = touchBank[touchHistory.indexOfSingleActiveTouch]
201
203
  // @ts-ignore
202
204
  if (!(activeRecord != null && activeRecord.touchActive)) {
205
+ // eslint-disable-next-line no-console
203
206
  console.error('Cannot find single active touch.')
204
207
  }
205
208
  }
package/src/utils.ts CHANGED
@@ -58,7 +58,7 @@ function getResponderId(node: any): number | null {
58
58
  /**
59
59
  * Store the responderId on a host node
60
60
  */
61
- export function setResponderId(node: any, id: number) {
61
+ export function setResponderId(node: any, id: any) {
62
62
  if (node != null) {
63
63
  node[keyName] = id
64
64
  }
package/types/utils.d.ts CHANGED
@@ -8,7 +8,7 @@ export declare const getBoundingClientRect: (node: HTMLElement | null) => void |
8
8
  /**
9
9
  * Store the responderId on a host node
10
10
  */
11
- export declare function setResponderId(node: any, id: number): void;
11
+ export declare function setResponderId(node: any, id: any): void;
12
12
  /**
13
13
  * Filter the event path to contain only the nodes attached to the responder system
14
14
  */
@@ -1,373 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var PressResponder_exports = {};
20
- __export(PressResponder_exports, {
21
- PressResponder: () => PressResponder
22
- });
23
- module.exports = __toCommonJS(PressResponder_exports);
24
- var States = /* @__PURE__ */ ((States2) => {
25
- States2[States2["DELAY"] = 0] = "DELAY";
26
- States2[States2["ERROR"] = 1] = "ERROR";
27
- States2[States2["LONG_PRESS_DETECTED"] = 2] = "LONG_PRESS_DETECTED";
28
- States2[States2["NOT_RESPONDER"] = 3] = "NOT_RESPONDER";
29
- States2[States2["RESPONDER_ACTIVE_LONG_PRESS_START"] = 4] = "RESPONDER_ACTIVE_LONG_PRESS_START";
30
- States2[States2["RESPONDER_ACTIVE_PRESS_START"] = 5] = "RESPONDER_ACTIVE_PRESS_START";
31
- States2[States2["RESPONDER_INACTIVE_PRESS_START"] = 6] = "RESPONDER_INACTIVE_PRESS_START";
32
- States2[States2["RESPONDER_GRANT"] = 7] = "RESPONDER_GRANT";
33
- States2[States2["RESPONDER_RELEASE"] = 8] = "RESPONDER_RELEASE";
34
- States2[States2["RESPONDER_TERMINATED"] = 9] = "RESPONDER_TERMINATED";
35
- return States2;
36
- })(States || {});
37
- const Transitions = Object.freeze({
38
- [3 /* NOT_RESPONDER */]: {
39
- [0 /* DELAY */]: 1 /* ERROR */,
40
- [7 /* RESPONDER_GRANT */]: 6 /* RESPONDER_INACTIVE_PRESS_START */,
41
- [8 /* RESPONDER_RELEASE */]: 1 /* ERROR */,
42
- [9 /* RESPONDER_TERMINATED */]: 1 /* ERROR */,
43
- [2 /* LONG_PRESS_DETECTED */]: 1 /* ERROR */
44
- },
45
- [6 /* RESPONDER_INACTIVE_PRESS_START */]: {
46
- [0 /* DELAY */]: 5 /* RESPONDER_ACTIVE_PRESS_START */,
47
- [7 /* RESPONDER_GRANT */]: 1 /* ERROR */,
48
- [8 /* RESPONDER_RELEASE */]: 3 /* NOT_RESPONDER */,
49
- [9 /* RESPONDER_TERMINATED */]: 3 /* NOT_RESPONDER */,
50
- [2 /* LONG_PRESS_DETECTED */]: 1 /* ERROR */
51
- },
52
- [5 /* RESPONDER_ACTIVE_PRESS_START */]: {
53
- [0 /* DELAY */]: 1 /* ERROR */,
54
- [7 /* RESPONDER_GRANT */]: 1 /* ERROR */,
55
- [8 /* RESPONDER_RELEASE */]: 3 /* NOT_RESPONDER */,
56
- [9 /* RESPONDER_TERMINATED */]: 3 /* NOT_RESPONDER */,
57
- [2 /* LONG_PRESS_DETECTED */]: 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */
58
- },
59
- [4 /* RESPONDER_ACTIVE_LONG_PRESS_START */]: {
60
- [0 /* DELAY */]: 1 /* ERROR */,
61
- [7 /* RESPONDER_GRANT */]: 1 /* ERROR */,
62
- [8 /* RESPONDER_RELEASE */]: 3 /* NOT_RESPONDER */,
63
- [9 /* RESPONDER_TERMINATED */]: 3 /* NOT_RESPONDER */,
64
- [2 /* LONG_PRESS_DETECTED */]: 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */
65
- },
66
- [1 /* ERROR */]: {
67
- [0 /* DELAY */]: 3 /* NOT_RESPONDER */,
68
- [7 /* RESPONDER_GRANT */]: 6 /* RESPONDER_INACTIVE_PRESS_START */,
69
- [8 /* RESPONDER_RELEASE */]: 3 /* NOT_RESPONDER */,
70
- [9 /* RESPONDER_TERMINATED */]: 3 /* NOT_RESPONDER */,
71
- [2 /* LONG_PRESS_DETECTED */]: 3 /* NOT_RESPONDER */
72
- }
73
- });
74
- const isActiveSignal = (signal) => signal === 5 /* RESPONDER_ACTIVE_PRESS_START */ || signal === 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */;
75
- const isButtonRole = (element) => element.getAttribute("role") === "button";
76
- const isPressStartSignal = (signal) => signal === 6 /* RESPONDER_INACTIVE_PRESS_START */ || signal === 5 /* RESPONDER_ACTIVE_PRESS_START */ || signal === 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */;
77
- const isTerminalSignal = (signal) => signal === 9 /* RESPONDER_TERMINATED */ || signal === 8 /* RESPONDER_RELEASE */;
78
- const isValidKeyPress = (event) => {
79
- const { key, target } = event;
80
- const role = target.getAttribute("role");
81
- const isSpacebar = key === " " || key === "Spacebar";
82
- return key === "Enter" || isSpacebar && role === "button";
83
- };
84
- const DEFAULT_LONG_PRESS_DELAY_MS = 450;
85
- const DEFAULT_PRESS_DELAY_MS = 50;
86
- class PressResponder {
87
- constructor(config) {
88
- this._eventHandlers = null;
89
- this._isPointerTouch = false;
90
- this._longPressDelayTimeout = null;
91
- this._longPressDispatched = false;
92
- this._pressDelayTimeout = null;
93
- this._pressOutDelayTimeout = null;
94
- this._touchState = 3 /* NOT_RESPONDER */;
95
- this._config = config;
96
- }
97
- configure(config) {
98
- this._config = config;
99
- }
100
- reset() {
101
- this._cancelLongPressDelayTimeout();
102
- this._cancelPressDelayTimeout();
103
- this._cancelPressOutDelayTimeout();
104
- }
105
- getEventHandlers() {
106
- if (this._eventHandlers == null) {
107
- this._eventHandlers = this._createEventHandlers();
108
- }
109
- return this._eventHandlers;
110
- }
111
- _createEventHandlers() {
112
- const start = (event, shouldDelay) => {
113
- event.persist();
114
- this._cancelPressOutDelayTimeout();
115
- this._longPressDispatched = false;
116
- this._selectionTerminated = false;
117
- this._touchState = 3 /* NOT_RESPONDER */;
118
- this._isPointerTouch = event.nativeEvent.type === "touchstart";
119
- this._receiveSignal(7 /* RESPONDER_GRANT */, event);
120
- const delayPressStart = normalizeDelay(
121
- this._config.delayPressStart,
122
- 0,
123
- DEFAULT_PRESS_DELAY_MS
124
- );
125
- if (shouldDelay !== false && delayPressStart > 0) {
126
- this._pressDelayTimeout = setTimeout(() => {
127
- this._receiveSignal(0 /* DELAY */, event);
128
- }, delayPressStart);
129
- } else {
130
- this._receiveSignal(0 /* DELAY */, event);
131
- }
132
- const delayLongPress = normalizeDelay(
133
- this._config.delayLongPress,
134
- 10,
135
- DEFAULT_LONG_PRESS_DELAY_MS
136
- );
137
- this._longPressDelayTimeout = setTimeout(() => {
138
- this._handleLongPress(event);
139
- }, delayLongPress + delayPressStart);
140
- };
141
- const end = (event) => {
142
- this._receiveSignal(8 /* RESPONDER_RELEASE */, event);
143
- };
144
- const keyupHandler = (event) => {
145
- const { onPress } = this._config;
146
- const { target } = event;
147
- if (this._touchState !== 3 /* NOT_RESPONDER */ && isValidKeyPress(event)) {
148
- end(event);
149
- document.removeEventListener("keyup", keyupHandler);
150
- const role = target.getAttribute("role");
151
- const elementType = target.tagName.toLowerCase();
152
- const isNativeInteractiveElement = role === "link" || elementType === "a" || elementType === "button" || elementType === "input" || elementType === "select" || elementType === "textarea";
153
- if (onPress != null && !isNativeInteractiveElement) {
154
- onPress(event);
155
- }
156
- }
157
- };
158
- return {
159
- onStartShouldSetResponder: (event) => {
160
- const { disabled } = this._config;
161
- if (disabled && isButtonRole(event.currentTarget)) {
162
- event.stopPropagation();
163
- }
164
- if (disabled == null) {
165
- return true;
166
- }
167
- return !disabled;
168
- },
169
- onKeyDown: (event) => {
170
- const { disabled } = this._config;
171
- const { key, target } = event;
172
- if (!disabled && isValidKeyPress(event)) {
173
- if (this._touchState === 3 /* NOT_RESPONDER */) {
174
- start(event, false);
175
- document.addEventListener("keyup", keyupHandler);
176
- }
177
- const role = target.getAttribute("role");
178
- const isSpacebarKey = key === " " || key === "Spacebar";
179
- const isButtonRole2 = role === "button" || role === "menuitem";
180
- if (isSpacebarKey && isButtonRole2) {
181
- event.preventDefault();
182
- }
183
- event.stopPropagation();
184
- }
185
- },
186
- onResponderGrant: (event) => start(event),
187
- onResponderMove: (event) => {
188
- if (this._config.onPressMove != null) {
189
- this._config.onPressMove(event);
190
- }
191
- const touch = getTouchFromResponderEvent(event);
192
- if (this._touchActivatePosition != null) {
193
- const deltaX = this._touchActivatePosition.pageX - touch.pageX;
194
- const deltaY = this._touchActivatePosition.pageY - touch.pageY;
195
- if (Math.hypot(deltaX, deltaY) > 10) {
196
- this._cancelLongPressDelayTimeout();
197
- }
198
- }
199
- },
200
- onResponderRelease: (event) => end(event),
201
- onResponderTerminate: (event) => {
202
- if (event.nativeEvent.type === "selectionchange") {
203
- this._selectionTerminated = true;
204
- }
205
- this._receiveSignal(9 /* RESPONDER_TERMINATED */, event);
206
- },
207
- onResponderTerminationRequest: (event) => {
208
- const { cancelable, disabled, onLongPress } = this._config;
209
- if (!disabled && onLongPress != null && this._isPointerTouch && event.nativeEvent.type === "contextmenu") {
210
- return false;
211
- }
212
- if (cancelable == null) {
213
- return true;
214
- }
215
- return cancelable;
216
- },
217
- onClick: (event) => {
218
- const { disabled, onPress } = this._config;
219
- if (!disabled) {
220
- event.stopPropagation();
221
- if (this._longPressDispatched || this._selectionTerminated) {
222
- event.preventDefault();
223
- } else if (onPress != null && event.altKey === false) {
224
- onPress(event);
225
- }
226
- } else {
227
- if (isButtonRole(event.currentTarget)) {
228
- event.stopPropagation();
229
- }
230
- }
231
- },
232
- onContextMenu: (event) => {
233
- const { disabled, onLongPress } = this._config;
234
- if (!disabled) {
235
- if (onLongPress != null && this._isPointerTouch && !event.defaultPrevented) {
236
- event.preventDefault();
237
- event.stopPropagation();
238
- }
239
- } else {
240
- if (isButtonRole(event.currentTarget)) {
241
- event.stopPropagation();
242
- }
243
- }
244
- }
245
- };
246
- }
247
- _receiveSignal(signal, event) {
248
- const prevState = this._touchState;
249
- let nextState = null;
250
- if (Transitions[prevState] != null) {
251
- nextState = Transitions[prevState][signal];
252
- }
253
- if (this._touchState === 3 /* NOT_RESPONDER */ && signal === 8 /* RESPONDER_RELEASE */) {
254
- return;
255
- }
256
- if (nextState == null || nextState === 1 /* ERROR */) {
257
- console.error(`PressResponder: Invalid signal ${signal} for state ${prevState} on responder`);
258
- } else if (prevState !== nextState) {
259
- this._performTransitionSideEffects(prevState, nextState, signal, event);
260
- this._touchState = nextState;
261
- }
262
- }
263
- _performTransitionSideEffects(prevState, nextState, signal, event) {
264
- if (isTerminalSignal(signal)) {
265
- setTimeout(() => {
266
- this._isPointerTouch = false;
267
- }, 0);
268
- this._touchActivatePosition = null;
269
- this._cancelLongPressDelayTimeout();
270
- }
271
- if (isPressStartSignal(prevState) && signal === 2 /* LONG_PRESS_DETECTED */) {
272
- const { onLongPress } = this._config;
273
- if (onLongPress != null && event.nativeEvent.key == null) {
274
- onLongPress(event);
275
- this._longPressDispatched = true;
276
- }
277
- }
278
- const isPrevActive = isActiveSignal(prevState);
279
- const isNextActive = isActiveSignal(nextState);
280
- if (!isPrevActive && isNextActive) {
281
- this._activate(event);
282
- } else if (isPrevActive && !isNextActive) {
283
- this._deactivate(event);
284
- }
285
- if (isPressStartSignal(prevState) && signal === 8 /* RESPONDER_RELEASE */) {
286
- const { onLongPress, onPress } = this._config;
287
- if (onPress != null) {
288
- const isPressCanceledByLongPress = onLongPress != null && prevState === 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */;
289
- if (!isPressCanceledByLongPress) {
290
- if (!isNextActive && !isPrevActive) {
291
- this._activate(event);
292
- this._deactivate(event);
293
- }
294
- }
295
- }
296
- }
297
- this._cancelPressDelayTimeout();
298
- }
299
- _activate(event) {
300
- const { onPressChange, onPressStart } = this._config;
301
- const touch = getTouchFromResponderEvent(event);
302
- this._touchActivatePosition = {
303
- pageX: touch.pageX,
304
- pageY: touch.pageY
305
- };
306
- if (onPressStart != null) {
307
- onPressStart(event);
308
- }
309
- if (onPressChange != null) {
310
- onPressChange(true);
311
- }
312
- }
313
- _deactivate(event) {
314
- const { onPressChange, onPressEnd } = this._config;
315
- function end() {
316
- if (onPressEnd != null) {
317
- onPressEnd(event);
318
- }
319
- if (onPressChange != null) {
320
- onPressChange(false);
321
- }
322
- }
323
- const delayPressEnd = normalizeDelay(this._config.delayPressEnd);
324
- if (delayPressEnd > 0) {
325
- this._pressOutDelayTimeout = setTimeout(() => {
326
- end();
327
- }, delayPressEnd);
328
- } else {
329
- end();
330
- }
331
- }
332
- _handleLongPress(event) {
333
- if (this._touchState === 5 /* RESPONDER_ACTIVE_PRESS_START */ || this._touchState === 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */) {
334
- this._receiveSignal(2 /* LONG_PRESS_DETECTED */, event);
335
- }
336
- }
337
- _cancelLongPressDelayTimeout() {
338
- if (this._longPressDelayTimeout != null) {
339
- clearTimeout(this._longPressDelayTimeout);
340
- this._longPressDelayTimeout = null;
341
- }
342
- }
343
- _cancelPressDelayTimeout() {
344
- if (this._pressDelayTimeout != null) {
345
- clearTimeout(this._pressDelayTimeout);
346
- this._pressDelayTimeout = null;
347
- }
348
- }
349
- _cancelPressOutDelayTimeout() {
350
- if (this._pressOutDelayTimeout != null) {
351
- clearTimeout(this._pressOutDelayTimeout);
352
- this._pressOutDelayTimeout = null;
353
- }
354
- }
355
- }
356
- function normalizeDelay(delay, min = 0, fallback = 0) {
357
- return Math.max(min, delay ?? fallback);
358
- }
359
- function getTouchFromResponderEvent(event) {
360
- const { changedTouches, touches } = event.nativeEvent;
361
- if (touches != null && touches.length > 0) {
362
- return touches[0];
363
- }
364
- if (changedTouches != null && changedTouches.length > 0) {
365
- return changedTouches[0];
366
- }
367
- return event.nativeEvent;
368
- }
369
- // Annotate the CommonJS export names for ESM import in node:
370
- 0 && (module.exports = {
371
- PressResponder
372
- });
373
- //# sourceMappingURL=PressResponder.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/PressResponder.ts"],
4
- "sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\ntype ClickEvent = any\ntype KeyboardEvent = any\ntype ResponderEvent = any\n\nexport type PressResponderConfig = {\n // The gesture can be interrupted by a parent gesture, e.g., scroll.\n // Defaults to true.\n cancelable?: boolean | null\n // Whether to disable initialization of the press gesture.\n disabled?: boolean | null\n // Duration (in addition to `delayPressStart`) after which a press gesture is\n // considered a long press gesture. Defaults to 500 (milliseconds).\n delayLongPress?: number | null\n // Duration to wait after press down before calling `onPressStart`.\n delayPressStart?: number | null\n // Duration to wait after letting up before calling `onPressEnd`.\n delayPressEnd?: number | null\n // Called when a long press gesture has been triggered.\n onLongPress?: ((event: ResponderEvent) => void) | null\n // Called when a press gestute has been triggered.\n onPress?: ((event: ClickEvent) => void) | null\n // Called when the press is activated to provide visual feedback.\n onPressChange?: ((event: ResponderEvent) => void) | null\n // Called when the press is activated to provide visual feedback.\n onPressStart?: ((event: ResponderEvent) => void) | null\n // Called when the press location moves. (This should rarely be used.)\n onPressMove?: ((event: ResponderEvent) => void) | null\n // Called when the press is deactivated to undo visual feedback.\n onPressEnd?: ((event: ResponderEvent) => void) | null\n}\n\nexport type EventHandlers = {\n onClick: (event: ClickEvent) => void\n onContextMenu: (event: ClickEvent) => void\n onKeyDown: (event: KeyboardEvent) => void\n onResponderGrant: (event: ResponderEvent) => void\n onResponderMove: (event: ResponderEvent) => void\n onResponderRelease: (event: ResponderEvent) => void\n onResponderTerminate: (event: ResponderEvent) => void\n onResponderTerminationRequest: (event: ResponderEvent) => boolean\n onStartShouldSetResponder: (event: ResponderEvent) => boolean\n}\n\nenum States {\n DELAY,\n ERROR,\n LONG_PRESS_DETECTED,\n NOT_RESPONDER,\n RESPONDER_ACTIVE_LONG_PRESS_START,\n RESPONDER_ACTIVE_PRESS_START,\n RESPONDER_INACTIVE_PRESS_START,\n RESPONDER_GRANT,\n RESPONDER_RELEASE,\n RESPONDER_TERMINATED,\n}\n\ntype TouchState =\n | States.NOT_RESPONDER\n | States.RESPONDER_INACTIVE_PRESS_START\n | States.RESPONDER_ACTIVE_PRESS_START\n | States.RESPONDER_ACTIVE_LONG_PRESS_START\n | States.ERROR\n\ntype TouchSignal =\n | States.DELAY\n | States.RESPONDER_GRANT\n | States.RESPONDER_RELEASE\n | States.RESPONDER_TERMINATED\n | States.LONG_PRESS_DETECTED\n\nconst Transitions = Object.freeze({\n [States.NOT_RESPONDER]: {\n [States.DELAY]: States.ERROR,\n [States.RESPONDER_GRANT]: States.RESPONDER_INACTIVE_PRESS_START,\n [States.RESPONDER_RELEASE]: States.ERROR,\n [States.RESPONDER_TERMINATED]: States.ERROR,\n [States.LONG_PRESS_DETECTED]: States.ERROR,\n },\n [States.RESPONDER_INACTIVE_PRESS_START]: {\n [States.DELAY]: States.RESPONDER_ACTIVE_PRESS_START,\n [States.RESPONDER_GRANT]: States.ERROR,\n [States.RESPONDER_RELEASE]: States.NOT_RESPONDER,\n [States.RESPONDER_TERMINATED]: States.NOT_RESPONDER,\n [States.LONG_PRESS_DETECTED]: States.ERROR,\n },\n [States.RESPONDER_ACTIVE_PRESS_START]: {\n [States.DELAY]: States.ERROR,\n [States.RESPONDER_GRANT]: States.ERROR,\n [States.RESPONDER_RELEASE]: States.NOT_RESPONDER,\n [States.RESPONDER_TERMINATED]: States.NOT_RESPONDER,\n [States.LONG_PRESS_DETECTED]: States.RESPONDER_ACTIVE_LONG_PRESS_START,\n },\n [States.RESPONDER_ACTIVE_LONG_PRESS_START]: {\n [States.DELAY]: States.ERROR,\n [States.RESPONDER_GRANT]: States.ERROR,\n [States.RESPONDER_RELEASE]: States.NOT_RESPONDER,\n [States.RESPONDER_TERMINATED]: States.NOT_RESPONDER,\n [States.LONG_PRESS_DETECTED]: States.RESPONDER_ACTIVE_LONG_PRESS_START,\n },\n [States.ERROR]: {\n [States.DELAY]: States.NOT_RESPONDER,\n [States.RESPONDER_GRANT]: States.RESPONDER_INACTIVE_PRESS_START,\n [States.RESPONDER_RELEASE]: States.NOT_RESPONDER,\n [States.RESPONDER_TERMINATED]: States.NOT_RESPONDER,\n [States.LONG_PRESS_DETECTED]: States.NOT_RESPONDER,\n },\n})\n\nconst isActiveSignal = (signal) =>\n signal === States.RESPONDER_ACTIVE_PRESS_START ||\n signal === States.RESPONDER_ACTIVE_LONG_PRESS_START\n\nconst isButtonRole = (element) => element.getAttribute('role') === 'button'\n\nconst isPressStartSignal = (signal) =>\n signal === States.RESPONDER_INACTIVE_PRESS_START ||\n signal === States.RESPONDER_ACTIVE_PRESS_START ||\n signal === States.RESPONDER_ACTIVE_LONG_PRESS_START\n\nconst isTerminalSignal = (signal) =>\n signal === States.RESPONDER_TERMINATED || signal === States.RESPONDER_RELEASE\n\nconst isValidKeyPress = (event) => {\n const { key, target } = event\n const role = target.getAttribute('role')\n const isSpacebar = key === ' ' || key === 'Spacebar'\n\n return key === 'Enter' || (isSpacebar && role === 'button')\n}\n\nconst DEFAULT_LONG_PRESS_DELAY_MS = 450 // 500 - 50\nconst DEFAULT_PRESS_DELAY_MS = 50\n\ntype TimeoutID = NodeJS.Timer | null\n\nexport class PressResponder {\n _config: PressResponderConfig\n _eventHandlers?: EventHandlers | null = null\n _isPointerTouch?: boolean = false\n _longPressDelayTimeout?: TimeoutID = null\n _longPressDispatched?: boolean = false\n _pressDelayTimeout?: TimeoutID = null\n _pressOutDelayTimeout?: TimeoutID = null\n _selectionTerminated?: boolean\n _touchActivatePosition?: {\n pageX: number\n pageY: number\n } | null\n _touchState: TouchState = States.NOT_RESPONDER\n\n constructor(config: PressResponderConfig) {\n this._config = config\n }\n\n configure(config: PressResponderConfig) {\n this._config = config\n }\n\n /**\n * Resets any pending timers. This should be called on unmount.\n */\n reset(): void {\n this._cancelLongPressDelayTimeout()\n this._cancelPressDelayTimeout()\n this._cancelPressOutDelayTimeout()\n }\n\n /**\n * Returns a set of props to spread into the interactive element.\n */\n getEventHandlers(): EventHandlers {\n if (this._eventHandlers == null) {\n this._eventHandlers = this._createEventHandlers()\n }\n return this._eventHandlers\n }\n\n _createEventHandlers(): EventHandlers {\n const start = (event: ResponderEvent, shouldDelay?: boolean): void => {\n event.persist()\n\n this._cancelPressOutDelayTimeout()\n\n this._longPressDispatched = false\n this._selectionTerminated = false\n this._touchState = States.NOT_RESPONDER\n this._isPointerTouch = event.nativeEvent.type === 'touchstart'\n\n this._receiveSignal(States.RESPONDER_GRANT, event)\n\n const delayPressStart = normalizeDelay(\n // @ts-ignore\n this._config.delayPressStart,\n 0,\n DEFAULT_PRESS_DELAY_MS\n )\n\n if (shouldDelay !== false && delayPressStart > 0) {\n this._pressDelayTimeout = setTimeout(() => {\n this._receiveSignal(States.DELAY, event)\n }, delayPressStart)\n } else {\n this._receiveSignal(States.DELAY, event)\n }\n\n const delayLongPress = normalizeDelay(\n this._config.delayLongPress,\n 10,\n DEFAULT_LONG_PRESS_DELAY_MS\n )\n this._longPressDelayTimeout = setTimeout(() => {\n this._handleLongPress(event)\n }, delayLongPress + delayPressStart)\n }\n\n const end = (event: ResponderEvent): void => {\n this._receiveSignal(States.RESPONDER_RELEASE, event)\n }\n\n const keyupHandler = (event: KeyboardEvent) => {\n const { onPress } = this._config\n const { target } = event\n\n if (this._touchState !== States.NOT_RESPONDER && isValidKeyPress(event)) {\n end(event)\n document.removeEventListener('keyup', keyupHandler)\n\n const role = target.getAttribute('role')\n const elementType = target.tagName.toLowerCase()\n\n const isNativeInteractiveElement =\n role === 'link' ||\n elementType === 'a' ||\n elementType === 'button' ||\n elementType === 'input' ||\n elementType === 'select' ||\n elementType === 'textarea'\n\n if (onPress != null && !isNativeInteractiveElement) {\n onPress(event)\n }\n }\n }\n\n return {\n onStartShouldSetResponder: (event): boolean => {\n const { disabled } = this._config\n if (disabled && isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n if (disabled == null) {\n return true\n }\n return !disabled\n },\n\n onKeyDown: (event) => {\n const { disabled } = this._config\n const { key, target } = event\n if (!disabled && isValidKeyPress(event)) {\n if (this._touchState === States.NOT_RESPONDER) {\n start(event, false)\n // Listen to 'keyup' on document to account for situations where\n // focus is moved to another element during 'keydown'.\n document.addEventListener('keyup', keyupHandler)\n }\n const role = target.getAttribute('role')\n const isSpacebarKey = key === ' ' || key === 'Spacebar'\n const isButtonRole = role === 'button' || role === 'menuitem'\n if (isSpacebarKey && isButtonRole) {\n // Prevent spacebar scrolling the window\n event.preventDefault()\n }\n event.stopPropagation()\n }\n },\n\n onResponderGrant: (event) => start(event),\n\n onResponderMove: (event) => {\n if (this._config.onPressMove != null) {\n this._config.onPressMove(event)\n }\n const touch = getTouchFromResponderEvent(event)\n if (this._touchActivatePosition != null) {\n const deltaX = this._touchActivatePosition.pageX - touch.pageX\n const deltaY = this._touchActivatePosition.pageY - touch.pageY\n if (Math.hypot(deltaX, deltaY) > 10) {\n this._cancelLongPressDelayTimeout()\n }\n }\n },\n\n onResponderRelease: (event) => end(event),\n\n onResponderTerminate: (event) => {\n if (event.nativeEvent.type === 'selectionchange') {\n this._selectionTerminated = true\n }\n this._receiveSignal(States.RESPONDER_TERMINATED, event)\n },\n\n onResponderTerminationRequest: (event): boolean => {\n const { cancelable, disabled, onLongPress } = this._config\n // If `onLongPress` is provided, don't terminate on `contextmenu` as default\n // behavior will be prevented for non-mouse pointers.\n if (\n !disabled &&\n onLongPress != null &&\n this._isPointerTouch &&\n event.nativeEvent.type === 'contextmenu'\n ) {\n return false\n }\n if (cancelable == null) {\n return true\n }\n return cancelable\n },\n\n // NOTE: this diverges from react-native in 3 significant ways:\n // * The `onPress` callback is not connected to the responder system (the native\n // `click` event must be used but is dispatched in many scenarios where no pointers\n // are on the screen.) Therefore, it's possible for `onPress` to be called without\n // `onPress{Start,End}` being called first.\n // * The `onPress` callback is only be called on the first ancestor of the native\n // `click` target that is using the PressResponder.\n // * The event's `nativeEvent` is a `MouseEvent` not a `TouchEvent`.\n onClick: (event: any): void => {\n const { disabled, onPress } = this._config\n if (!disabled) {\n // If long press dispatched, cancel default click behavior.\n // If the responder terminated because text was selected during the gesture,\n // cancel the default click behavior.\n event.stopPropagation()\n if (this._longPressDispatched || this._selectionTerminated) {\n event.preventDefault()\n } else if (onPress != null && event.altKey === false) {\n onPress(event)\n }\n } else {\n if (isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n }\n },\n\n // If `onLongPress` is provided and a touch pointer is being used, prevent the\n // default context menu from opening.\n onContextMenu: (event: any): void => {\n const { disabled, onLongPress } = this._config\n if (!disabled) {\n if (onLongPress != null && this._isPointerTouch && !event.defaultPrevented) {\n event.preventDefault()\n event.stopPropagation()\n }\n } else {\n if (isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n }\n },\n }\n }\n\n /**\n * Receives a state machine signal, performs side effects of the transition\n * and stores the new state. Validates the transition as well.\n */\n _receiveSignal(signal: TouchSignal, event: ResponderEvent): void {\n const prevState = this._touchState\n let nextState: TouchState | null = null\n if (Transitions[prevState] != null) {\n nextState = Transitions[prevState][signal] as TouchState\n }\n if (this._touchState === States.NOT_RESPONDER && signal === States.RESPONDER_RELEASE) {\n return\n }\n if (nextState == null || nextState === States.ERROR) {\n // eslint-disable-next-line no-console\n console.error(`PressResponder: Invalid signal ${signal} for state ${prevState} on responder`)\n } else if (prevState !== nextState) {\n this._performTransitionSideEffects(prevState, nextState, signal, event)\n this._touchState = nextState\n }\n }\n\n /**\n * Performs a transition between touchable states and identify any activations\n * or deactivations (and callback invocations).\n */\n _performTransitionSideEffects(\n prevState: TouchState,\n nextState: TouchState,\n signal: TouchSignal,\n event: ResponderEvent\n ): void {\n if (isTerminalSignal(signal)) {\n // Pressable suppression of contextmenu on windows.\n // On Windows, the contextmenu is displayed after pointerup.\n // https://github.com/necolas/react-native-web/issues/2296\n setTimeout(() => {\n this._isPointerTouch = false\n }, 0)\n this._touchActivatePosition = null\n this._cancelLongPressDelayTimeout()\n }\n\n if (isPressStartSignal(prevState) && signal === States.LONG_PRESS_DETECTED) {\n const { onLongPress } = this._config\n // Long press is not supported for keyboards because 'click' can be dispatched\n // immediately (and multiple times) after 'keydown'.\n if (onLongPress != null && event.nativeEvent.key == null) {\n onLongPress(event)\n this._longPressDispatched = true\n }\n }\n\n const isPrevActive = isActiveSignal(prevState)\n const isNextActive = isActiveSignal(nextState)\n\n if (!isPrevActive && isNextActive) {\n this._activate(event)\n } else if (isPrevActive && !isNextActive) {\n this._deactivate(event)\n }\n\n if (isPressStartSignal(prevState) && signal === States.RESPONDER_RELEASE) {\n const { onLongPress, onPress } = this._config\n if (onPress != null) {\n const isPressCanceledByLongPress =\n onLongPress != null && prevState === States.RESPONDER_ACTIVE_LONG_PRESS_START\n if (!isPressCanceledByLongPress) {\n // If we never activated (due to delays), activate and deactivate now.\n if (!isNextActive && !isPrevActive) {\n this._activate(event)\n this._deactivate(event)\n }\n }\n }\n }\n\n this._cancelPressDelayTimeout()\n }\n\n _activate(event: ResponderEvent): void {\n const { onPressChange, onPressStart } = this._config\n const touch = getTouchFromResponderEvent(event)\n this._touchActivatePosition = {\n pageX: touch.pageX,\n pageY: touch.pageY,\n }\n if (onPressStart != null) {\n onPressStart(event)\n }\n if (onPressChange != null) {\n onPressChange(true)\n }\n }\n\n _deactivate(event: ResponderEvent): void {\n const { onPressChange, onPressEnd } = this._config\n function end() {\n if (onPressEnd != null) {\n onPressEnd(event)\n }\n if (onPressChange != null) {\n onPressChange(false)\n }\n }\n const delayPressEnd = normalizeDelay(this._config.delayPressEnd)\n if (delayPressEnd > 0) {\n this._pressOutDelayTimeout = setTimeout(() => {\n end()\n }, delayPressEnd)\n } else {\n end()\n }\n }\n\n _handleLongPress(event: ResponderEvent): void {\n if (\n this._touchState === States.RESPONDER_ACTIVE_PRESS_START ||\n this._touchState === States.RESPONDER_ACTIVE_LONG_PRESS_START\n ) {\n this._receiveSignal(States.LONG_PRESS_DETECTED, event)\n }\n }\n\n _cancelLongPressDelayTimeout(): void {\n if (this._longPressDelayTimeout != null) {\n clearTimeout(this._longPressDelayTimeout)\n this._longPressDelayTimeout = null\n }\n }\n\n _cancelPressDelayTimeout(): void {\n if (this._pressDelayTimeout != null) {\n clearTimeout(this._pressDelayTimeout)\n this._pressDelayTimeout = null\n }\n }\n\n _cancelPressOutDelayTimeout(): void {\n if (this._pressOutDelayTimeout != null) {\n clearTimeout(this._pressOutDelayTimeout)\n this._pressOutDelayTimeout = null\n }\n }\n}\n\nfunction normalizeDelay(delay: number | null | undefined, min = 0, fallback = 0): number {\n return Math.max(min, delay ?? fallback)\n}\n\nfunction getTouchFromResponderEvent(event: ResponderEvent) {\n const { changedTouches, touches } = event.nativeEvent\n if (touches != null && touches.length > 0) {\n return touches[0]\n }\n if (changedTouches != null && changedTouches.length > 0) {\n return changedTouches[0]\n }\n return event.nativeEvent\n}\n"],
5
- "mappings": "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",
6
- "names": ["States", "isButtonRole"]
7
- }
@@ -1,349 +0,0 @@
1
- var States = /* @__PURE__ */ ((States2) => {
2
- States2[States2["DELAY"] = 0] = "DELAY";
3
- States2[States2["ERROR"] = 1] = "ERROR";
4
- States2[States2["LONG_PRESS_DETECTED"] = 2] = "LONG_PRESS_DETECTED";
5
- States2[States2["NOT_RESPONDER"] = 3] = "NOT_RESPONDER";
6
- States2[States2["RESPONDER_ACTIVE_LONG_PRESS_START"] = 4] = "RESPONDER_ACTIVE_LONG_PRESS_START";
7
- States2[States2["RESPONDER_ACTIVE_PRESS_START"] = 5] = "RESPONDER_ACTIVE_PRESS_START";
8
- States2[States2["RESPONDER_INACTIVE_PRESS_START"] = 6] = "RESPONDER_INACTIVE_PRESS_START";
9
- States2[States2["RESPONDER_GRANT"] = 7] = "RESPONDER_GRANT";
10
- States2[States2["RESPONDER_RELEASE"] = 8] = "RESPONDER_RELEASE";
11
- States2[States2["RESPONDER_TERMINATED"] = 9] = "RESPONDER_TERMINATED";
12
- return States2;
13
- })(States || {});
14
- const Transitions = Object.freeze({
15
- [3 /* NOT_RESPONDER */]: {
16
- [0 /* DELAY */]: 1 /* ERROR */,
17
- [7 /* RESPONDER_GRANT */]: 6 /* RESPONDER_INACTIVE_PRESS_START */,
18
- [8 /* RESPONDER_RELEASE */]: 1 /* ERROR */,
19
- [9 /* RESPONDER_TERMINATED */]: 1 /* ERROR */,
20
- [2 /* LONG_PRESS_DETECTED */]: 1 /* ERROR */
21
- },
22
- [6 /* RESPONDER_INACTIVE_PRESS_START */]: {
23
- [0 /* DELAY */]: 5 /* RESPONDER_ACTIVE_PRESS_START */,
24
- [7 /* RESPONDER_GRANT */]: 1 /* ERROR */,
25
- [8 /* RESPONDER_RELEASE */]: 3 /* NOT_RESPONDER */,
26
- [9 /* RESPONDER_TERMINATED */]: 3 /* NOT_RESPONDER */,
27
- [2 /* LONG_PRESS_DETECTED */]: 1 /* ERROR */
28
- },
29
- [5 /* RESPONDER_ACTIVE_PRESS_START */]: {
30
- [0 /* DELAY */]: 1 /* ERROR */,
31
- [7 /* RESPONDER_GRANT */]: 1 /* ERROR */,
32
- [8 /* RESPONDER_RELEASE */]: 3 /* NOT_RESPONDER */,
33
- [9 /* RESPONDER_TERMINATED */]: 3 /* NOT_RESPONDER */,
34
- [2 /* LONG_PRESS_DETECTED */]: 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */
35
- },
36
- [4 /* RESPONDER_ACTIVE_LONG_PRESS_START */]: {
37
- [0 /* DELAY */]: 1 /* ERROR */,
38
- [7 /* RESPONDER_GRANT */]: 1 /* ERROR */,
39
- [8 /* RESPONDER_RELEASE */]: 3 /* NOT_RESPONDER */,
40
- [9 /* RESPONDER_TERMINATED */]: 3 /* NOT_RESPONDER */,
41
- [2 /* LONG_PRESS_DETECTED */]: 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */
42
- },
43
- [1 /* ERROR */]: {
44
- [0 /* DELAY */]: 3 /* NOT_RESPONDER */,
45
- [7 /* RESPONDER_GRANT */]: 6 /* RESPONDER_INACTIVE_PRESS_START */,
46
- [8 /* RESPONDER_RELEASE */]: 3 /* NOT_RESPONDER */,
47
- [9 /* RESPONDER_TERMINATED */]: 3 /* NOT_RESPONDER */,
48
- [2 /* LONG_PRESS_DETECTED */]: 3 /* NOT_RESPONDER */
49
- }
50
- });
51
- const isActiveSignal = (signal) => signal === 5 /* RESPONDER_ACTIVE_PRESS_START */ || signal === 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */;
52
- const isButtonRole = (element) => element.getAttribute("role") === "button";
53
- const isPressStartSignal = (signal) => signal === 6 /* RESPONDER_INACTIVE_PRESS_START */ || signal === 5 /* RESPONDER_ACTIVE_PRESS_START */ || signal === 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */;
54
- const isTerminalSignal = (signal) => signal === 9 /* RESPONDER_TERMINATED */ || signal === 8 /* RESPONDER_RELEASE */;
55
- const isValidKeyPress = (event) => {
56
- const { key, target } = event;
57
- const role = target.getAttribute("role");
58
- const isSpacebar = key === " " || key === "Spacebar";
59
- return key === "Enter" || isSpacebar && role === "button";
60
- };
61
- const DEFAULT_LONG_PRESS_DELAY_MS = 450;
62
- const DEFAULT_PRESS_DELAY_MS = 50;
63
- class PressResponder {
64
- constructor(config) {
65
- this._eventHandlers = null;
66
- this._isPointerTouch = false;
67
- this._longPressDelayTimeout = null;
68
- this._longPressDispatched = false;
69
- this._pressDelayTimeout = null;
70
- this._pressOutDelayTimeout = null;
71
- this._touchState = 3 /* NOT_RESPONDER */;
72
- this._config = config;
73
- }
74
- configure(config) {
75
- this._config = config;
76
- }
77
- reset() {
78
- this._cancelLongPressDelayTimeout();
79
- this._cancelPressDelayTimeout();
80
- this._cancelPressOutDelayTimeout();
81
- }
82
- getEventHandlers() {
83
- if (this._eventHandlers == null) {
84
- this._eventHandlers = this._createEventHandlers();
85
- }
86
- return this._eventHandlers;
87
- }
88
- _createEventHandlers() {
89
- const start = (event, shouldDelay) => {
90
- event.persist();
91
- this._cancelPressOutDelayTimeout();
92
- this._longPressDispatched = false;
93
- this._selectionTerminated = false;
94
- this._touchState = 3 /* NOT_RESPONDER */;
95
- this._isPointerTouch = event.nativeEvent.type === "touchstart";
96
- this._receiveSignal(7 /* RESPONDER_GRANT */, event);
97
- const delayPressStart = normalizeDelay(
98
- this._config.delayPressStart,
99
- 0,
100
- DEFAULT_PRESS_DELAY_MS
101
- );
102
- if (shouldDelay !== false && delayPressStart > 0) {
103
- this._pressDelayTimeout = setTimeout(() => {
104
- this._receiveSignal(0 /* DELAY */, event);
105
- }, delayPressStart);
106
- } else {
107
- this._receiveSignal(0 /* DELAY */, event);
108
- }
109
- const delayLongPress = normalizeDelay(
110
- this._config.delayLongPress,
111
- 10,
112
- DEFAULT_LONG_PRESS_DELAY_MS
113
- );
114
- this._longPressDelayTimeout = setTimeout(() => {
115
- this._handleLongPress(event);
116
- }, delayLongPress + delayPressStart);
117
- };
118
- const end = (event) => {
119
- this._receiveSignal(8 /* RESPONDER_RELEASE */, event);
120
- };
121
- const keyupHandler = (event) => {
122
- const { onPress } = this._config;
123
- const { target } = event;
124
- if (this._touchState !== 3 /* NOT_RESPONDER */ && isValidKeyPress(event)) {
125
- end(event);
126
- document.removeEventListener("keyup", keyupHandler);
127
- const role = target.getAttribute("role");
128
- const elementType = target.tagName.toLowerCase();
129
- const isNativeInteractiveElement = role === "link" || elementType === "a" || elementType === "button" || elementType === "input" || elementType === "select" || elementType === "textarea";
130
- if (onPress != null && !isNativeInteractiveElement) {
131
- onPress(event);
132
- }
133
- }
134
- };
135
- return {
136
- onStartShouldSetResponder: (event) => {
137
- const { disabled } = this._config;
138
- if (disabled && isButtonRole(event.currentTarget)) {
139
- event.stopPropagation();
140
- }
141
- if (disabled == null) {
142
- return true;
143
- }
144
- return !disabled;
145
- },
146
- onKeyDown: (event) => {
147
- const { disabled } = this._config;
148
- const { key, target } = event;
149
- if (!disabled && isValidKeyPress(event)) {
150
- if (this._touchState === 3 /* NOT_RESPONDER */) {
151
- start(event, false);
152
- document.addEventListener("keyup", keyupHandler);
153
- }
154
- const role = target.getAttribute("role");
155
- const isSpacebarKey = key === " " || key === "Spacebar";
156
- const isButtonRole2 = role === "button" || role === "menuitem";
157
- if (isSpacebarKey && isButtonRole2) {
158
- event.preventDefault();
159
- }
160
- event.stopPropagation();
161
- }
162
- },
163
- onResponderGrant: (event) => start(event),
164
- onResponderMove: (event) => {
165
- if (this._config.onPressMove != null) {
166
- this._config.onPressMove(event);
167
- }
168
- const touch = getTouchFromResponderEvent(event);
169
- if (this._touchActivatePosition != null) {
170
- const deltaX = this._touchActivatePosition.pageX - touch.pageX;
171
- const deltaY = this._touchActivatePosition.pageY - touch.pageY;
172
- if (Math.hypot(deltaX, deltaY) > 10) {
173
- this._cancelLongPressDelayTimeout();
174
- }
175
- }
176
- },
177
- onResponderRelease: (event) => end(event),
178
- onResponderTerminate: (event) => {
179
- if (event.nativeEvent.type === "selectionchange") {
180
- this._selectionTerminated = true;
181
- }
182
- this._receiveSignal(9 /* RESPONDER_TERMINATED */, event);
183
- },
184
- onResponderTerminationRequest: (event) => {
185
- const { cancelable, disabled, onLongPress } = this._config;
186
- if (!disabled && onLongPress != null && this._isPointerTouch && event.nativeEvent.type === "contextmenu") {
187
- return false;
188
- }
189
- if (cancelable == null) {
190
- return true;
191
- }
192
- return cancelable;
193
- },
194
- onClick: (event) => {
195
- const { disabled, onPress } = this._config;
196
- if (!disabled) {
197
- event.stopPropagation();
198
- if (this._longPressDispatched || this._selectionTerminated) {
199
- event.preventDefault();
200
- } else if (onPress != null && event.altKey === false) {
201
- onPress(event);
202
- }
203
- } else {
204
- if (isButtonRole(event.currentTarget)) {
205
- event.stopPropagation();
206
- }
207
- }
208
- },
209
- onContextMenu: (event) => {
210
- const { disabled, onLongPress } = this._config;
211
- if (!disabled) {
212
- if (onLongPress != null && this._isPointerTouch && !event.defaultPrevented) {
213
- event.preventDefault();
214
- event.stopPropagation();
215
- }
216
- } else {
217
- if (isButtonRole(event.currentTarget)) {
218
- event.stopPropagation();
219
- }
220
- }
221
- }
222
- };
223
- }
224
- _receiveSignal(signal, event) {
225
- const prevState = this._touchState;
226
- let nextState = null;
227
- if (Transitions[prevState] != null) {
228
- nextState = Transitions[prevState][signal];
229
- }
230
- if (this._touchState === 3 /* NOT_RESPONDER */ && signal === 8 /* RESPONDER_RELEASE */) {
231
- return;
232
- }
233
- if (nextState == null || nextState === 1 /* ERROR */) {
234
- console.error(`PressResponder: Invalid signal ${signal} for state ${prevState} on responder`);
235
- } else if (prevState !== nextState) {
236
- this._performTransitionSideEffects(prevState, nextState, signal, event);
237
- this._touchState = nextState;
238
- }
239
- }
240
- _performTransitionSideEffects(prevState, nextState, signal, event) {
241
- if (isTerminalSignal(signal)) {
242
- setTimeout(() => {
243
- this._isPointerTouch = false;
244
- }, 0);
245
- this._touchActivatePosition = null;
246
- this._cancelLongPressDelayTimeout();
247
- }
248
- if (isPressStartSignal(prevState) && signal === 2 /* LONG_PRESS_DETECTED */) {
249
- const { onLongPress } = this._config;
250
- if (onLongPress != null && event.nativeEvent.key == null) {
251
- onLongPress(event);
252
- this._longPressDispatched = true;
253
- }
254
- }
255
- const isPrevActive = isActiveSignal(prevState);
256
- const isNextActive = isActiveSignal(nextState);
257
- if (!isPrevActive && isNextActive) {
258
- this._activate(event);
259
- } else if (isPrevActive && !isNextActive) {
260
- this._deactivate(event);
261
- }
262
- if (isPressStartSignal(prevState) && signal === 8 /* RESPONDER_RELEASE */) {
263
- const { onLongPress, onPress } = this._config;
264
- if (onPress != null) {
265
- const isPressCanceledByLongPress = onLongPress != null && prevState === 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */;
266
- if (!isPressCanceledByLongPress) {
267
- if (!isNextActive && !isPrevActive) {
268
- this._activate(event);
269
- this._deactivate(event);
270
- }
271
- }
272
- }
273
- }
274
- this._cancelPressDelayTimeout();
275
- }
276
- _activate(event) {
277
- const { onPressChange, onPressStart } = this._config;
278
- const touch = getTouchFromResponderEvent(event);
279
- this._touchActivatePosition = {
280
- pageX: touch.pageX,
281
- pageY: touch.pageY
282
- };
283
- if (onPressStart != null) {
284
- onPressStart(event);
285
- }
286
- if (onPressChange != null) {
287
- onPressChange(true);
288
- }
289
- }
290
- _deactivate(event) {
291
- const { onPressChange, onPressEnd } = this._config;
292
- function end() {
293
- if (onPressEnd != null) {
294
- onPressEnd(event);
295
- }
296
- if (onPressChange != null) {
297
- onPressChange(false);
298
- }
299
- }
300
- const delayPressEnd = normalizeDelay(this._config.delayPressEnd);
301
- if (delayPressEnd > 0) {
302
- this._pressOutDelayTimeout = setTimeout(() => {
303
- end();
304
- }, delayPressEnd);
305
- } else {
306
- end();
307
- }
308
- }
309
- _handleLongPress(event) {
310
- if (this._touchState === 5 /* RESPONDER_ACTIVE_PRESS_START */ || this._touchState === 4 /* RESPONDER_ACTIVE_LONG_PRESS_START */) {
311
- this._receiveSignal(2 /* LONG_PRESS_DETECTED */, event);
312
- }
313
- }
314
- _cancelLongPressDelayTimeout() {
315
- if (this._longPressDelayTimeout != null) {
316
- clearTimeout(this._longPressDelayTimeout);
317
- this._longPressDelayTimeout = null;
318
- }
319
- }
320
- _cancelPressDelayTimeout() {
321
- if (this._pressDelayTimeout != null) {
322
- clearTimeout(this._pressDelayTimeout);
323
- this._pressDelayTimeout = null;
324
- }
325
- }
326
- _cancelPressOutDelayTimeout() {
327
- if (this._pressOutDelayTimeout != null) {
328
- clearTimeout(this._pressOutDelayTimeout);
329
- this._pressOutDelayTimeout = null;
330
- }
331
- }
332
- }
333
- function normalizeDelay(delay, min = 0, fallback = 0) {
334
- return Math.max(min, delay ?? fallback);
335
- }
336
- function getTouchFromResponderEvent(event) {
337
- const { changedTouches, touches } = event.nativeEvent;
338
- if (touches != null && touches.length > 0) {
339
- return touches[0];
340
- }
341
- if (changedTouches != null && changedTouches.length > 0) {
342
- return changedTouches[0];
343
- }
344
- return event.nativeEvent;
345
- }
346
- export {
347
- PressResponder
348
- };
349
- //# sourceMappingURL=PressResponder.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/PressResponder.ts"],
4
- "sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\ntype ClickEvent = any\ntype KeyboardEvent = any\ntype ResponderEvent = any\n\nexport type PressResponderConfig = {\n // The gesture can be interrupted by a parent gesture, e.g., scroll.\n // Defaults to true.\n cancelable?: boolean | null\n // Whether to disable initialization of the press gesture.\n disabled?: boolean | null\n // Duration (in addition to `delayPressStart`) after which a press gesture is\n // considered a long press gesture. Defaults to 500 (milliseconds).\n delayLongPress?: number | null\n // Duration to wait after press down before calling `onPressStart`.\n delayPressStart?: number | null\n // Duration to wait after letting up before calling `onPressEnd`.\n delayPressEnd?: number | null\n // Called when a long press gesture has been triggered.\n onLongPress?: ((event: ResponderEvent) => void) | null\n // Called when a press gestute has been triggered.\n onPress?: ((event: ClickEvent) => void) | null\n // Called when the press is activated to provide visual feedback.\n onPressChange?: ((event: ResponderEvent) => void) | null\n // Called when the press is activated to provide visual feedback.\n onPressStart?: ((event: ResponderEvent) => void) | null\n // Called when the press location moves. (This should rarely be used.)\n onPressMove?: ((event: ResponderEvent) => void) | null\n // Called when the press is deactivated to undo visual feedback.\n onPressEnd?: ((event: ResponderEvent) => void) | null\n}\n\nexport type EventHandlers = {\n onClick: (event: ClickEvent) => void\n onContextMenu: (event: ClickEvent) => void\n onKeyDown: (event: KeyboardEvent) => void\n onResponderGrant: (event: ResponderEvent) => void\n onResponderMove: (event: ResponderEvent) => void\n onResponderRelease: (event: ResponderEvent) => void\n onResponderTerminate: (event: ResponderEvent) => void\n onResponderTerminationRequest: (event: ResponderEvent) => boolean\n onStartShouldSetResponder: (event: ResponderEvent) => boolean\n}\n\nenum States {\n DELAY,\n ERROR,\n LONG_PRESS_DETECTED,\n NOT_RESPONDER,\n RESPONDER_ACTIVE_LONG_PRESS_START,\n RESPONDER_ACTIVE_PRESS_START,\n RESPONDER_INACTIVE_PRESS_START,\n RESPONDER_GRANT,\n RESPONDER_RELEASE,\n RESPONDER_TERMINATED,\n}\n\ntype TouchState =\n | States.NOT_RESPONDER\n | States.RESPONDER_INACTIVE_PRESS_START\n | States.RESPONDER_ACTIVE_PRESS_START\n | States.RESPONDER_ACTIVE_LONG_PRESS_START\n | States.ERROR\n\ntype TouchSignal =\n | States.DELAY\n | States.RESPONDER_GRANT\n | States.RESPONDER_RELEASE\n | States.RESPONDER_TERMINATED\n | States.LONG_PRESS_DETECTED\n\nconst Transitions = Object.freeze({\n [States.NOT_RESPONDER]: {\n [States.DELAY]: States.ERROR,\n [States.RESPONDER_GRANT]: States.RESPONDER_INACTIVE_PRESS_START,\n [States.RESPONDER_RELEASE]: States.ERROR,\n [States.RESPONDER_TERMINATED]: States.ERROR,\n [States.LONG_PRESS_DETECTED]: States.ERROR,\n },\n [States.RESPONDER_INACTIVE_PRESS_START]: {\n [States.DELAY]: States.RESPONDER_ACTIVE_PRESS_START,\n [States.RESPONDER_GRANT]: States.ERROR,\n [States.RESPONDER_RELEASE]: States.NOT_RESPONDER,\n [States.RESPONDER_TERMINATED]: States.NOT_RESPONDER,\n [States.LONG_PRESS_DETECTED]: States.ERROR,\n },\n [States.RESPONDER_ACTIVE_PRESS_START]: {\n [States.DELAY]: States.ERROR,\n [States.RESPONDER_GRANT]: States.ERROR,\n [States.RESPONDER_RELEASE]: States.NOT_RESPONDER,\n [States.RESPONDER_TERMINATED]: States.NOT_RESPONDER,\n [States.LONG_PRESS_DETECTED]: States.RESPONDER_ACTIVE_LONG_PRESS_START,\n },\n [States.RESPONDER_ACTIVE_LONG_PRESS_START]: {\n [States.DELAY]: States.ERROR,\n [States.RESPONDER_GRANT]: States.ERROR,\n [States.RESPONDER_RELEASE]: States.NOT_RESPONDER,\n [States.RESPONDER_TERMINATED]: States.NOT_RESPONDER,\n [States.LONG_PRESS_DETECTED]: States.RESPONDER_ACTIVE_LONG_PRESS_START,\n },\n [States.ERROR]: {\n [States.DELAY]: States.NOT_RESPONDER,\n [States.RESPONDER_GRANT]: States.RESPONDER_INACTIVE_PRESS_START,\n [States.RESPONDER_RELEASE]: States.NOT_RESPONDER,\n [States.RESPONDER_TERMINATED]: States.NOT_RESPONDER,\n [States.LONG_PRESS_DETECTED]: States.NOT_RESPONDER,\n },\n})\n\nconst isActiveSignal = (signal) =>\n signal === States.RESPONDER_ACTIVE_PRESS_START ||\n signal === States.RESPONDER_ACTIVE_LONG_PRESS_START\n\nconst isButtonRole = (element) => element.getAttribute('role') === 'button'\n\nconst isPressStartSignal = (signal) =>\n signal === States.RESPONDER_INACTIVE_PRESS_START ||\n signal === States.RESPONDER_ACTIVE_PRESS_START ||\n signal === States.RESPONDER_ACTIVE_LONG_PRESS_START\n\nconst isTerminalSignal = (signal) =>\n signal === States.RESPONDER_TERMINATED || signal === States.RESPONDER_RELEASE\n\nconst isValidKeyPress = (event) => {\n const { key, target } = event\n const role = target.getAttribute('role')\n const isSpacebar = key === ' ' || key === 'Spacebar'\n\n return key === 'Enter' || (isSpacebar && role === 'button')\n}\n\nconst DEFAULT_LONG_PRESS_DELAY_MS = 450 // 500 - 50\nconst DEFAULT_PRESS_DELAY_MS = 50\n\ntype TimeoutID = NodeJS.Timer | null\n\nexport class PressResponder {\n _config: PressResponderConfig\n _eventHandlers?: EventHandlers | null = null\n _isPointerTouch?: boolean = false\n _longPressDelayTimeout?: TimeoutID = null\n _longPressDispatched?: boolean = false\n _pressDelayTimeout?: TimeoutID = null\n _pressOutDelayTimeout?: TimeoutID = null\n _selectionTerminated?: boolean\n _touchActivatePosition?: {\n pageX: number\n pageY: number\n } | null\n _touchState: TouchState = States.NOT_RESPONDER\n\n constructor(config: PressResponderConfig) {\n this._config = config\n }\n\n configure(config: PressResponderConfig) {\n this._config = config\n }\n\n /**\n * Resets any pending timers. This should be called on unmount.\n */\n reset(): void {\n this._cancelLongPressDelayTimeout()\n this._cancelPressDelayTimeout()\n this._cancelPressOutDelayTimeout()\n }\n\n /**\n * Returns a set of props to spread into the interactive element.\n */\n getEventHandlers(): EventHandlers {\n if (this._eventHandlers == null) {\n this._eventHandlers = this._createEventHandlers()\n }\n return this._eventHandlers\n }\n\n _createEventHandlers(): EventHandlers {\n const start = (event: ResponderEvent, shouldDelay?: boolean): void => {\n event.persist()\n\n this._cancelPressOutDelayTimeout()\n\n this._longPressDispatched = false\n this._selectionTerminated = false\n this._touchState = States.NOT_RESPONDER\n this._isPointerTouch = event.nativeEvent.type === 'touchstart'\n\n this._receiveSignal(States.RESPONDER_GRANT, event)\n\n const delayPressStart = normalizeDelay(\n // @ts-ignore\n this._config.delayPressStart,\n 0,\n DEFAULT_PRESS_DELAY_MS\n )\n\n if (shouldDelay !== false && delayPressStart > 0) {\n this._pressDelayTimeout = setTimeout(() => {\n this._receiveSignal(States.DELAY, event)\n }, delayPressStart)\n } else {\n this._receiveSignal(States.DELAY, event)\n }\n\n const delayLongPress = normalizeDelay(\n this._config.delayLongPress,\n 10,\n DEFAULT_LONG_PRESS_DELAY_MS\n )\n this._longPressDelayTimeout = setTimeout(() => {\n this._handleLongPress(event)\n }, delayLongPress + delayPressStart)\n }\n\n const end = (event: ResponderEvent): void => {\n this._receiveSignal(States.RESPONDER_RELEASE, event)\n }\n\n const keyupHandler = (event: KeyboardEvent) => {\n const { onPress } = this._config\n const { target } = event\n\n if (this._touchState !== States.NOT_RESPONDER && isValidKeyPress(event)) {\n end(event)\n document.removeEventListener('keyup', keyupHandler)\n\n const role = target.getAttribute('role')\n const elementType = target.tagName.toLowerCase()\n\n const isNativeInteractiveElement =\n role === 'link' ||\n elementType === 'a' ||\n elementType === 'button' ||\n elementType === 'input' ||\n elementType === 'select' ||\n elementType === 'textarea'\n\n if (onPress != null && !isNativeInteractiveElement) {\n onPress(event)\n }\n }\n }\n\n return {\n onStartShouldSetResponder: (event): boolean => {\n const { disabled } = this._config\n if (disabled && isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n if (disabled == null) {\n return true\n }\n return !disabled\n },\n\n onKeyDown: (event) => {\n const { disabled } = this._config\n const { key, target } = event\n if (!disabled && isValidKeyPress(event)) {\n if (this._touchState === States.NOT_RESPONDER) {\n start(event, false)\n // Listen to 'keyup' on document to account for situations where\n // focus is moved to another element during 'keydown'.\n document.addEventListener('keyup', keyupHandler)\n }\n const role = target.getAttribute('role')\n const isSpacebarKey = key === ' ' || key === 'Spacebar'\n const isButtonRole = role === 'button' || role === 'menuitem'\n if (isSpacebarKey && isButtonRole) {\n // Prevent spacebar scrolling the window\n event.preventDefault()\n }\n event.stopPropagation()\n }\n },\n\n onResponderGrant: (event) => start(event),\n\n onResponderMove: (event) => {\n if (this._config.onPressMove != null) {\n this._config.onPressMove(event)\n }\n const touch = getTouchFromResponderEvent(event)\n if (this._touchActivatePosition != null) {\n const deltaX = this._touchActivatePosition.pageX - touch.pageX\n const deltaY = this._touchActivatePosition.pageY - touch.pageY\n if (Math.hypot(deltaX, deltaY) > 10) {\n this._cancelLongPressDelayTimeout()\n }\n }\n },\n\n onResponderRelease: (event) => end(event),\n\n onResponderTerminate: (event) => {\n if (event.nativeEvent.type === 'selectionchange') {\n this._selectionTerminated = true\n }\n this._receiveSignal(States.RESPONDER_TERMINATED, event)\n },\n\n onResponderTerminationRequest: (event): boolean => {\n const { cancelable, disabled, onLongPress } = this._config\n // If `onLongPress` is provided, don't terminate on `contextmenu` as default\n // behavior will be prevented for non-mouse pointers.\n if (\n !disabled &&\n onLongPress != null &&\n this._isPointerTouch &&\n event.nativeEvent.type === 'contextmenu'\n ) {\n return false\n }\n if (cancelable == null) {\n return true\n }\n return cancelable\n },\n\n // NOTE: this diverges from react-native in 3 significant ways:\n // * The `onPress` callback is not connected to the responder system (the native\n // `click` event must be used but is dispatched in many scenarios where no pointers\n // are on the screen.) Therefore, it's possible for `onPress` to be called without\n // `onPress{Start,End}` being called first.\n // * The `onPress` callback is only be called on the first ancestor of the native\n // `click` target that is using the PressResponder.\n // * The event's `nativeEvent` is a `MouseEvent` not a `TouchEvent`.\n onClick: (event: any): void => {\n const { disabled, onPress } = this._config\n if (!disabled) {\n // If long press dispatched, cancel default click behavior.\n // If the responder terminated because text was selected during the gesture,\n // cancel the default click behavior.\n event.stopPropagation()\n if (this._longPressDispatched || this._selectionTerminated) {\n event.preventDefault()\n } else if (onPress != null && event.altKey === false) {\n onPress(event)\n }\n } else {\n if (isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n }\n },\n\n // If `onLongPress` is provided and a touch pointer is being used, prevent the\n // default context menu from opening.\n onContextMenu: (event: any): void => {\n const { disabled, onLongPress } = this._config\n if (!disabled) {\n if (onLongPress != null && this._isPointerTouch && !event.defaultPrevented) {\n event.preventDefault()\n event.stopPropagation()\n }\n } else {\n if (isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n }\n },\n }\n }\n\n /**\n * Receives a state machine signal, performs side effects of the transition\n * and stores the new state. Validates the transition as well.\n */\n _receiveSignal(signal: TouchSignal, event: ResponderEvent): void {\n const prevState = this._touchState\n let nextState: TouchState | null = null\n if (Transitions[prevState] != null) {\n nextState = Transitions[prevState][signal] as TouchState\n }\n if (this._touchState === States.NOT_RESPONDER && signal === States.RESPONDER_RELEASE) {\n return\n }\n if (nextState == null || nextState === States.ERROR) {\n // eslint-disable-next-line no-console\n console.error(`PressResponder: Invalid signal ${signal} for state ${prevState} on responder`)\n } else if (prevState !== nextState) {\n this._performTransitionSideEffects(prevState, nextState, signal, event)\n this._touchState = nextState\n }\n }\n\n /**\n * Performs a transition between touchable states and identify any activations\n * or deactivations (and callback invocations).\n */\n _performTransitionSideEffects(\n prevState: TouchState,\n nextState: TouchState,\n signal: TouchSignal,\n event: ResponderEvent\n ): void {\n if (isTerminalSignal(signal)) {\n // Pressable suppression of contextmenu on windows.\n // On Windows, the contextmenu is displayed after pointerup.\n // https://github.com/necolas/react-native-web/issues/2296\n setTimeout(() => {\n this._isPointerTouch = false\n }, 0)\n this._touchActivatePosition = null\n this._cancelLongPressDelayTimeout()\n }\n\n if (isPressStartSignal(prevState) && signal === States.LONG_PRESS_DETECTED) {\n const { onLongPress } = this._config\n // Long press is not supported for keyboards because 'click' can be dispatched\n // immediately (and multiple times) after 'keydown'.\n if (onLongPress != null && event.nativeEvent.key == null) {\n onLongPress(event)\n this._longPressDispatched = true\n }\n }\n\n const isPrevActive = isActiveSignal(prevState)\n const isNextActive = isActiveSignal(nextState)\n\n if (!isPrevActive && isNextActive) {\n this._activate(event)\n } else if (isPrevActive && !isNextActive) {\n this._deactivate(event)\n }\n\n if (isPressStartSignal(prevState) && signal === States.RESPONDER_RELEASE) {\n const { onLongPress, onPress } = this._config\n if (onPress != null) {\n const isPressCanceledByLongPress =\n onLongPress != null && prevState === States.RESPONDER_ACTIVE_LONG_PRESS_START\n if (!isPressCanceledByLongPress) {\n // If we never activated (due to delays), activate and deactivate now.\n if (!isNextActive && !isPrevActive) {\n this._activate(event)\n this._deactivate(event)\n }\n }\n }\n }\n\n this._cancelPressDelayTimeout()\n }\n\n _activate(event: ResponderEvent): void {\n const { onPressChange, onPressStart } = this._config\n const touch = getTouchFromResponderEvent(event)\n this._touchActivatePosition = {\n pageX: touch.pageX,\n pageY: touch.pageY,\n }\n if (onPressStart != null) {\n onPressStart(event)\n }\n if (onPressChange != null) {\n onPressChange(true)\n }\n }\n\n _deactivate(event: ResponderEvent): void {\n const { onPressChange, onPressEnd } = this._config\n function end() {\n if (onPressEnd != null) {\n onPressEnd(event)\n }\n if (onPressChange != null) {\n onPressChange(false)\n }\n }\n const delayPressEnd = normalizeDelay(this._config.delayPressEnd)\n if (delayPressEnd > 0) {\n this._pressOutDelayTimeout = setTimeout(() => {\n end()\n }, delayPressEnd)\n } else {\n end()\n }\n }\n\n _handleLongPress(event: ResponderEvent): void {\n if (\n this._touchState === States.RESPONDER_ACTIVE_PRESS_START ||\n this._touchState === States.RESPONDER_ACTIVE_LONG_PRESS_START\n ) {\n this._receiveSignal(States.LONG_PRESS_DETECTED, event)\n }\n }\n\n _cancelLongPressDelayTimeout(): void {\n if (this._longPressDelayTimeout != null) {\n clearTimeout(this._longPressDelayTimeout)\n this._longPressDelayTimeout = null\n }\n }\n\n _cancelPressDelayTimeout(): void {\n if (this._pressDelayTimeout != null) {\n clearTimeout(this._pressDelayTimeout)\n this._pressDelayTimeout = null\n }\n }\n\n _cancelPressOutDelayTimeout(): void {\n if (this._pressOutDelayTimeout != null) {\n clearTimeout(this._pressOutDelayTimeout)\n this._pressOutDelayTimeout = null\n }\n }\n}\n\nfunction normalizeDelay(delay: number | null | undefined, min = 0, fallback = 0): number {\n return Math.max(min, delay ?? fallback)\n}\n\nfunction getTouchFromResponderEvent(event: ResponderEvent) {\n const { changedTouches, touches } = event.nativeEvent\n if (touches != null && touches.length > 0) {\n return touches[0]\n }\n if (changedTouches != null && changedTouches.length > 0) {\n return changedTouches[0]\n }\n return event.nativeEvent\n}\n"],
5
- "mappings": "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",
6
- "names": ["States", "isButtonRole"]
7
- }
@@ -1,92 +0,0 @@
1
- /**
2
- * Copyright (c) Meta Platforms, Inc. and affiliates.
3
- * This source code is licensed under the MIT license found in the
4
- * LICENSE file in the root directory of this source tree.
5
- */
6
- /// <reference types="node" />
7
- declare type ClickEvent = any;
8
- declare type KeyboardEvent = any;
9
- declare type ResponderEvent = any;
10
- export declare type PressResponderConfig = {
11
- cancelable?: boolean | null;
12
- disabled?: boolean | null;
13
- delayLongPress?: number | null;
14
- delayPressStart?: number | null;
15
- delayPressEnd?: number | null;
16
- onLongPress?: ((event: ResponderEvent) => void) | null;
17
- onPress?: ((event: ClickEvent) => void) | null;
18
- onPressChange?: ((event: ResponderEvent) => void) | null;
19
- onPressStart?: ((event: ResponderEvent) => void) | null;
20
- onPressMove?: ((event: ResponderEvent) => void) | null;
21
- onPressEnd?: ((event: ResponderEvent) => void) | null;
22
- };
23
- export declare type EventHandlers = {
24
- onClick: (event: ClickEvent) => void;
25
- onContextMenu: (event: ClickEvent) => void;
26
- onKeyDown: (event: KeyboardEvent) => void;
27
- onResponderGrant: (event: ResponderEvent) => void;
28
- onResponderMove: (event: ResponderEvent) => void;
29
- onResponderRelease: (event: ResponderEvent) => void;
30
- onResponderTerminate: (event: ResponderEvent) => void;
31
- onResponderTerminationRequest: (event: ResponderEvent) => boolean;
32
- onStartShouldSetResponder: (event: ResponderEvent) => boolean;
33
- };
34
- declare enum States {
35
- DELAY = 0,
36
- ERROR = 1,
37
- LONG_PRESS_DETECTED = 2,
38
- NOT_RESPONDER = 3,
39
- RESPONDER_ACTIVE_LONG_PRESS_START = 4,
40
- RESPONDER_ACTIVE_PRESS_START = 5,
41
- RESPONDER_INACTIVE_PRESS_START = 6,
42
- RESPONDER_GRANT = 7,
43
- RESPONDER_RELEASE = 8,
44
- RESPONDER_TERMINATED = 9
45
- }
46
- declare type TouchState = States.NOT_RESPONDER | States.RESPONDER_INACTIVE_PRESS_START | States.RESPONDER_ACTIVE_PRESS_START | States.RESPONDER_ACTIVE_LONG_PRESS_START | States.ERROR;
47
- declare type TouchSignal = States.DELAY | States.RESPONDER_GRANT | States.RESPONDER_RELEASE | States.RESPONDER_TERMINATED | States.LONG_PRESS_DETECTED;
48
- declare type TimeoutID = NodeJS.Timer | null;
49
- export declare class PressResponder {
50
- _config: PressResponderConfig;
51
- _eventHandlers?: EventHandlers | null;
52
- _isPointerTouch?: boolean;
53
- _longPressDelayTimeout?: TimeoutID;
54
- _longPressDispatched?: boolean;
55
- _pressDelayTimeout?: TimeoutID;
56
- _pressOutDelayTimeout?: TimeoutID;
57
- _selectionTerminated?: boolean;
58
- _touchActivatePosition?: {
59
- pageX: number;
60
- pageY: number;
61
- } | null;
62
- _touchState: TouchState;
63
- constructor(config: PressResponderConfig);
64
- configure(config: PressResponderConfig): void;
65
- /**
66
- * Resets any pending timers. This should be called on unmount.
67
- */
68
- reset(): void;
69
- /**
70
- * Returns a set of props to spread into the interactive element.
71
- */
72
- getEventHandlers(): EventHandlers;
73
- _createEventHandlers(): EventHandlers;
74
- /**
75
- * Receives a state machine signal, performs side effects of the transition
76
- * and stores the new state. Validates the transition as well.
77
- */
78
- _receiveSignal(signal: TouchSignal, event: ResponderEvent): void;
79
- /**
80
- * Performs a transition between touchable states and identify any activations
81
- * or deactivations (and callback invocations).
82
- */
83
- _performTransitionSideEffects(prevState: TouchState, nextState: TouchState, signal: TouchSignal, event: ResponderEvent): void;
84
- _activate(event: ResponderEvent): void;
85
- _deactivate(event: ResponderEvent): void;
86
- _handleLongPress(event: ResponderEvent): void;
87
- _cancelLongPressDelayTimeout(): void;
88
- _cancelPressDelayTimeout(): void;
89
- _cancelPressOutDelayTimeout(): void;
90
- }
91
- export {};
92
- //# sourceMappingURL=PressResponder.d.ts.map