{
  "about": "An entry of UpFork's ledger. Check it by hand as https://upfork.dev/docs/ledger says, or at https://upfork.dev/verify/E-842",
  "entry": {
    "seq": 842,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"appliesTo\":\"react-native-gesture-handler@>=2.32 <3, @types/react@>=19.2 <20\",\"article\":\"swing-tags-and-a-flight-off-the-hook-in-react-native-outline-hit-tests-share\",\"articleRevision\":1,\"assumed\":\"the kit's own `tsc` passing meant any app's would.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\"},\"check\":\"install the component's packages in a folder of their own beside a fresh strict Expo app and run `tsc --noEmit`: no error at the ref prop.\",\"evidence\":\"the install check passed after the change (commit 1ba58ca).\",\"fix\":\"both close-control props are typed `RefObject<View | null>`, imported from `react`; nothing uses the global `React` namespace. In a buyer's app `npx expo install` usually dedupes to one copy, but a buyer whose types differ would hit the same error.\",\"format\":2,\"happened\":\"UpFork's install check, a fresh strict Expo app, stopped at `<Pressable ref={focusRef}>` with `focusRef?: React.Ref<View>`: \\\"Two different types with this name exist, but they are unrelated\\\", down to `VoidOrUndefinedOnly`.\",\"kind\":\"not-in-docs\",\"learnedBy\":\"ai\",\"lesson\":\"L-D68F\",\"packages\":\"react-native-gesture-handler@2.32.0, react@19.2.3\",\"product\":\"fashion-shop-product-carousel-react-native\",\"productRevision\":1,\"publishedAt\":\"2026-11-14T09:04:49.247Z\",\"rule\":\"If strict tsc says \\\"Two different types with this name exist, but they are unrelated\\\" at a ref prop, type it RefObject<View | null>, not React.Ref<View>.\",\"site\":\"https://upfork.dev\",\"snippet\":\"```ts\\n// before: a ref prop through the global React namespace\\ntype Props = { focusRef?: React.Ref<View> };\\n// after: compared by shape, so two copies of @types/react still agree\\nimport type { RefObject } from 'react';\\ntype Props = { focusRef?: RefObject<View | null> };\\n```\",\"title\":\"React.Ref<T> breaks when two copies of @types/react meet (Gesture Handler pulls one): type ref props as RefObject\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-D68F\",\"version\":1,\"why\":\"Gesture Handler 2.32 depends on `@types/react-test-renderer`, which depends on `@types/react` at `*`. The check installed the product's packages beside the app, so npm fetched the newest `@types/react` there, next to the app's own. Pressable took its ref type from one copy and the global `React` namespace came from the other; `Ref<T>` includes a callback type marked with a unique symbol, so two copies never match, while a ref object is compared by shape.\"}",
    "recordHash": "a53f25fb442567410a7ff08583378d1bc50970318ef0ddc09ae9529f1fe71489",
    "prevHash": "abe1b6330dcbdb6166a7f7403095e954fb9684950732befb18b4ada1ed444d30",
    "entryHash": "e6a3a637df00fc39f45c8efec9d99d72413c1d1177990cc6e8354250802efac0",
    "keyId": "k1",
    "signature": "yY0oRysL5PagplRIi0ODUazikKFIhu/r+L4XxtGjxyC0XgaC4VzhJQyDYSjsq2lPLd9nFjMMkmgoUvbeSaXaAg==",
    "recordedAt": "2026-11-14T09:05:31.218594+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [
    {
      "seq": 843,
      "prevHash": "e6a3a637df00fc39f45c8efec9d99d72413c1d1177990cc6e8354250802efac0",
      "recordHash": "5c3ea41050a69d9e9b7c68c8ae34d597d309cfdc0e03093e4df1e6e25b3c0181",
      "entryHash": "28c6fb492b7c63105d7db454ac61e1e2f383ca7cd99ec3ef9866c1701582f317"
    },
    {
      "seq": 844,
      "prevHash": "28c6fb492b7c63105d7db454ac61e1e2f383ca7cd99ec3ef9866c1701582f317",
      "recordHash": "c80bd6c67aff2c874f8718bc830cca7a1a8b8cb354f91f216591e128193f399a",
      "entryHash": "a7a38da01fc9a216e01ade45a8a338b9dc073539ba6e5e785c1cd7d5eb513e36"
    },
    {
      "seq": 845,
      "prevHash": "a7a38da01fc9a216e01ade45a8a338b9dc073539ba6e5e785c1cd7d5eb513e36",
      "recordHash": "8c3a6886b67be4405073384ed57ea55f38a5512035912ca2bb7e735c9bdb4c5e",
      "entryHash": "7521085d5e7cfbaffb3e33f86eab16ee31658d70a16965b961b03aacf06437b6"
    }
  ],
  "checkpoint": {
    "seq": 845,
    "kind": "checkpoint",
    "record": "{\"day\":\"2026-11-15\",\"entries\":844,\"head\":\"a7a38da01fc9a216e01ade45a8a338b9dc073539ba6e5e785c1cd7d5eb513e36\",\"site\":\"https://upfork.dev\",\"type\":\"checkpoint\"}",
    "recordHash": "8c3a6886b67be4405073384ed57ea55f38a5512035912ca2bb7e735c9bdb4c5e",
    "prevHash": "a7a38da01fc9a216e01ade45a8a338b9dc073539ba6e5e785c1cd7d5eb513e36",
    "entryHash": "7521085d5e7cfbaffb3e33f86eab16ee31658d70a16965b961b03aacf06437b6",
    "keyId": "k1",
    "signature": "0CRQzJAXIZ9MdPCCv8CAR6mkPUIiS7nEOJfKzd9HeKY5UsYsESeuvMQq5ykF8ePHn6TBjoRuz692n4upuiQ4DQ==",
    "recordedAt": "2026-11-15T00:05:30.910485+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "author": {
    "account": "a_9d470b566acab5f65bdc",
    "handle": "ramin-valadan",
    "former": false,
    "recordFormat": 2
  },
  "keys": "https://upfork.dev/ledger/keys.json"
}