{"record":{"id":"545747fefcc2d3e5","repo":"necolas/react-native-web","slug":"unrecognized-signal-signal-or-state-cursta","errorCode":null,"errorMessage":"Unrecognized signal `${signal}` or state `${curState}` for Touchable responder `${responderID}`","messagePattern":"Unrecognized signal `(.+?)` or state `(.+?)` for Touchable responder `(.+?)`","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/react-native-web/src/exports/Touchable/index.js","lineNumber":767,"sourceCode":"  },\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   * @param {Signals} signal State machine signal.\n   * @throws Error if invalid state transition or unrecognized signal.\n   * @sideeffects\n   */\n  _receiveSignal: function (signal: Signal, e: PressEvent) {\n    const responderID = this.state.touchable.responderID;\n    const curState = this.state.touchable.touchState;\n    const nextState = Transitions[curState] && Transitions[curState][signal];\n    if (!responderID && signal === Signals.RESPONDER_RELEASE) {\n      return;\n    }\n    if (!nextState) {\n      throw new Error(\n        'Unrecognized signal `' +\n          signal +\n          '` or state `' +\n          curState +\n          '` for Touchable responder `' +\n          responderID +\n          '`'\n      );\n    }\n    if (nextState === States.ERROR) {\n      throw new Error(\n        'Touchable cannot transition from `' +\n          curState +\n          '` to `' +\n          signal +\n          '` for responder `' +\n          responderID +\n          '`'","sourceCodeStart":749,"sourceCodeEnd":785,"githubUrl":"https://github.com/necolas/react-native-web/blob/a9de220ba9e65bdea540fb5322ffb1da2b0bf442/packages/react-native-web/src/exports/Touchable/index.js#L749-L785","documentation":"Touchable implements an explicit responder state machine; _receiveSignal looks up Transitions[curState][signal] to find the next state. If the (state, signal) pair has no defined transition, internal invariants are broken and it throws. This is almost always a library bug or an unbalanced responder event sequence, not user error.","triggerScenarios":"Dispatching a touch signal (e.g. RESPONDER_RELEASE, RESPONDER_GRANT, RESPONDER_TERMINATE) while the Touchable is in a state with no registered transition for it — e.g. a release arriving in a state where it wasn't granted, or duplicate grant signals.","commonSituations":"Programmatically invoking internal responder methods; synthetic event sequences from nested/overlapping touchables or third-party gesture handling; edge cases during rapid taps where grant/release interleave unexpectedly.","solutions":["Report the (signal, state, responderID) pair to react-native-web — likely a state-machine bug; include reproduction steps.","Check for custom code that calls Touchable internals (responder callbacks) out of order.","Verify no overlapping touch handling (nested Touchables/gesture layers) dispatches events on the same responder twice.","Update react-native-web; the fix may already exist."],"exampleFix":"// before\ntouchable._receiveSignal(Signals.RESPONDER_RELEASE, id); // called without a grant\n// after\n// drive the responder only through real pointer events; remove manual signal dispatch","handlingStrategy":"try-catch","validationCode":"// Ensure responder events come only from real pointer handlers:\nif (!isNativePointerEvent(event)) throw new Error('Do not dispatch Touchable signals manually');","typeGuard":"const hasValidTransition = (state, signal) => Boolean(Transitions[state] && Transitions[state][signal]);","tryCatchPattern":"try { touchable._receiveSignal(signal, id); } catch (e) { if (/Unrecognized signal/.test(e.message)) resetTouchableState(touchable); else throw e; }","preventionTips":["Never call Touchable internals; use pressable public props (onPressIn/out etc.)","Keep react-native-web updated — state-machine races get patched","Avoid overlapping/nested touch handlers on the same responder"],"tags":["react-native-web","touchable","state-machine","invariant"],"backgroundTag":"invalid-state-transition","analyzedSha":"a9de220ba9e65bdea540fb5322ffb1da2b0bf442","analyzedAt":"2026-09-01T10:01:09.883Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}