diff --git a/App.tsx b/App.tsx index 42d55b4..f81e51d 100644 --- a/App.tsx +++ b/App.tsx @@ -4,7 +4,7 @@ * @format */ -import {ApolloProvider} from '@apollo/client'; +import {ApolloProvider} from '@apollo/client/react'; import { DarkTheme, DefaultTheme, diff --git a/bun.lock b/bun.lock index a1ca5d6..bc16f9a 100644 --- a/bun.lock +++ b/bun.lock @@ -5,7 +5,7 @@ "": { "name": "Culpeos", "dependencies": { - "@apollo/client": "^3.11.0", + "@apollo/client": "^4.0.0", "@bam.tech/react-native-image-resizer": "^3.0.11", "@maplibre/maplibre-react-native": "^11.2.1", "@react-native/new-app-screen": "0.85.3", @@ -46,7 +46,7 @@ }, }, "packages": { - "@apollo/client": ["@apollo/client@3.14.1", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "hoist-non-react-statics": "^3.3.2", "optimism": "^0.18.0", "prop-types": "^15.7.2", "rehackt": "^0.1.0", "symbol-observable": "^4.0.0", "ts-invariant": "^0.10.3", "tslib": "^2.3.0", "zen-observable-ts": "^1.2.5" }, "peerDependencies": { "graphql": "^15.0.0 || ^16.0.0", "graphql-ws": "^5.5.5 || ^6.0.3", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-SgGX6E23JsZhUdG2anxiyHvEvvN6CUaI4ZfMsndZFeuHPXL3H0IsaiNAhLITSISbeyeYd+CBd9oERXQDdjXWZw=="], + "@apollo/client": ["@apollo/client@4.2.2", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", "@wry/equality": "^0.5.6", "@wry/trie": "^0.5.0", "graphql-tag": "^2.12.6", "optimism": "^0.18.0", "tslib": "^2.3.0" }, "peerDependencies": { "graphql": "^16.0.0", "graphql-ws": "^5.5.5 || ^6.0.3", "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "react-dom": "^17.0.0 || ^18.0.0 || >=19.0.0-rc", "rxjs": "^7.3.0", "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" }, "optionalPeers": ["graphql-ws", "react", "react-dom", "subscriptions-transport-ws"] }, "sha512-tiI91oRHFB43QBDy1Y9gaBYYcz+0YmU7qtziHZfVAdXYyaI+y5NIvfT7fYPUzeAYfT6gXU6/lndcdmsr4MsOBQ=="], "@ardatan/relay-compiler": ["@ardatan/relay-compiler@13.0.1", "", { "dependencies": { "@babel/runtime": "^7.29.2", "immutable": "^5.1.5", "invariant": "^2.2.4" }, "peerDependencies": { "graphql": "*" } }, "sha512-afG3YPwuSA0E5foouZusz5GlXKs74dObv4cuWyLyfKsYFj2r7oGRNB28v18HvwuLSQtQFCi+DpIe0TZkgQDYyg=="], @@ -968,8 +968,6 @@ "hermes-parser": ["hermes-parser@0.33.3", "", { "dependencies": { "hermes-estree": "0.33.3" } }, "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA=="], - "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], - "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], @@ -1268,8 +1266,6 @@ "ob1": ["ob1@0.84.4", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA=="], - "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], - "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], @@ -1338,8 +1334,6 @@ "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], - "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], - "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], "qs": ["qs@6.15.2", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw=="], @@ -1392,8 +1386,6 @@ "regjsparser": ["regjsparser@0.13.1", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw=="], - "rehackt": ["rehackt@0.1.0", "", { "peerDependencies": { "@types/react": "*", "react": "*" }, "optionalPeers": ["@types/react", "react"] }, "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw=="], - "remedial": ["remedial@1.0.8", "", {}, "sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg=="], "remove-trailing-separator": ["remove-trailing-separator@1.1.0", "", {}, "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw=="], @@ -1522,8 +1514,6 @@ "swap-case": ["swap-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-kc6S2YS/2yXbtkSMunBtKdah4VFETZ8Oh6ONSmSd9bRxhqTrtARUCBUiWXH3xVPpvR7tz2CSnkuXVE42EcGnMw=="], - "symbol-observable": ["symbol-observable@4.0.0", "", {}, "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ=="], - "sync-fetch": ["sync-fetch@0.6.0", "", { "dependencies": { "node-fetch": "^3.3.2", "timeout-signal": "^2.0.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-IELLEvzHuCfc1uTsshPK58ViSdNqXxlml1U+fmwJIKLYKOr/rAtBrorE2RYm5IHaMpDNlmC0fr1LAvdXvyheEQ=="], "terser": ["terser@5.47.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw=="], @@ -1550,8 +1540,6 @@ "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], - "ts-invariant": ["ts-invariant@0.10.3", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ=="], - "ts-log": ["ts-log@2.2.7", "", {}, "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -1648,10 +1636,6 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zen-observable": ["zen-observable@0.8.15", "", {}, "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="], - - "zen-observable-ts": ["zen-observable-ts@1.2.5", "", { "dependencies": { "zen-observable": "0.8.15" } }, "sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg=="], - "@babel/plugin-transform-runtime/babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], "@graphql-codegen/add/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="], @@ -1788,8 +1772,6 @@ "graphql-config/jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], - "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "inquirer/lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="], @@ -1824,8 +1806,6 @@ "pretty-format/react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], - "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - "react-native/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], "react-native/semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="], diff --git a/codegen.ts b/codegen.ts index 935066d..e8fe1d9 100644 --- a/codegen.ts +++ b/codegen.ts @@ -22,6 +22,14 @@ const config: CodegenConfig = { ], config: { withHooks: true, + // NOTE: @graphql-codegen/typescript-react-apollo has no Apollo Client + // v4 support (latest is 4.x, still v3-oriented). After regenerating, + // the output needs manual fixups to compile against @apollo/client v4: + // - `import * as Apollo from '@apollo/client'` -> '@apollo/client/react' + // - `Apollo.MutationFunction` -> `Apollo.useMutation.MutationFunction` + // - `Apollo.BaseMutationOptions` -> `Apollo.MutationHookOptions` + // - the generated *SuspenseQuery hooks need @ts-ignore (unused here) + // Longer term, migrate to @graphql-codegen/client-preset. reactApolloVersion: 3, scalars: { // Map GraphQL scalars to TS types as you add them in the schema. diff --git a/package.json b/package.json index 97c2d06..fccf3e4 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "postinstall": "git rev-parse --git-dir > /dev/null 2>&1 && git config core.hooksPath .githooks || true" }, "dependencies": { - "@apollo/client": "^3.11.0", + "@apollo/client": "^4.0.0", "@bam.tech/react-native-image-resizer": "^3.0.11", "@maplibre/maplibre-react-native": "^11.2.1", "@react-native/new-app-screen": "0.85.3", diff --git a/src/auth/authClient.ts b/src/auth/authClient.ts index 8b3ba4d..44c1c9a 100644 --- a/src/auth/authClient.ts +++ b/src/auth/authClient.ts @@ -7,10 +7,11 @@ import { InMemoryCache, makeVar, Observable, - useReactiveVar, } from '@apollo/client'; +import {CombinedGraphQLErrors} from '@apollo/client/errors'; import {setContext} from '@apollo/client/link/context'; import {onError} from '@apollo/client/link/error'; +import {useReactiveVar} from '@apollo/client/react'; import {config} from '../config'; import { type LoginMutation, @@ -108,13 +109,11 @@ async function doRefresh(): Promise { } function extractAuthErrorCode(err: unknown): string | undefined { - // Apollo wraps GraphQL errors in an ApolloError with a graphQLErrors array. - const graphQLErrors = - err && typeof err === 'object' && 'graphQLErrors' in err - ? (err as {graphQLErrors?: ReadonlyArray<{extensions?: {code?: string}}>}) - .graphQLErrors - : undefined; - return graphQLErrors?.[0]?.extensions?.code; + // Apollo Client 4 wraps GraphQL errors thrown from an operation in a + // CombinedGraphQLErrors instance, exposing them as an `errors` array. + if (!CombinedGraphQLErrors.is(err)) return undefined; + const code = err.errors[0]?.extensions?.code; + return typeof code === 'string' ? code : undefined; } function isAuthHousekeepingOperation(operation: Operation): boolean { @@ -150,8 +149,10 @@ const authLink = setContext(async (request, prevContext) => { // 2. Handle auth-related GraphQL error codes. On TOKEN_EXPIRED, refresh and // replay the original operation once. On TOKEN_REUSE_DETECTED / REVOKED / // INVALID, clear tokens (and optionally raise a security warning). -const errorLink = onError(({graphQLErrors, operation, forward}) => { - if (!graphQLErrors || graphQLErrors.length === 0) return; +const errorLink = onError(({error, operation, forward}) => { + if (!CombinedGraphQLErrors.is(error)) return; + const graphQLErrors = error.errors; + if (graphQLErrors.length === 0) return; const code = graphQLErrors[0]?.extensions?.code; if (typeof code !== 'string') return; diff --git a/src/auth/deepLinks.ts b/src/auth/deepLinks.ts index 1b10de1..b9c8da8 100644 --- a/src/auth/deepLinks.ts +++ b/src/auth/deepLinks.ts @@ -1,4 +1,5 @@ -import {makeVar, useReactiveVar} from '@apollo/client'; +import {makeVar} from '@apollo/client'; +import {useReactiveVar} from '@apollo/client/react'; import {useEffect} from 'react'; import {Linking} from 'react-native'; diff --git a/src/auth/tokenStore.ts b/src/auth/tokenStore.ts index 6bbd31b..7668085 100644 --- a/src/auth/tokenStore.ts +++ b/src/auth/tokenStore.ts @@ -1,4 +1,5 @@ -import {makeVar, useReactiveVar} from '@apollo/client'; +import {makeVar} from '@apollo/client'; +import {useReactiveVar} from '@apollo/client/react'; import EncryptedStorage from 'react-native-encrypted-storage'; // Persistent auth store backed by EncryptedSharedPreferences (Android) / diff --git a/src/graphql/__generated__/types.ts b/src/graphql/__generated__/types.ts index 505b84c..f7c13dc 100644 --- a/src/graphql/__generated__/types.ts +++ b/src/graphql/__generated__/types.ts @@ -1,5 +1,5 @@ import { gql } from '@apollo/client'; -import * as Apollo from '@apollo/client'; +import * as Apollo from '@apollo/client/react'; export type Maybe = T | null; export type InputMaybe = Maybe; export type Exact = { [K in keyof T]: T[K] }; @@ -657,7 +657,7 @@ export const CreatePhotoDocument = gql` } } `; -export type CreatePhotoMutationFn = Apollo.MutationFunction; +export type CreatePhotoMutationFn = Apollo.useMutation.MutationFunction; /** * __useCreatePhotoMutation__ @@ -682,7 +682,7 @@ export function useCreatePhotoMutation(baseOptions?: Apollo.MutationHookOptions< } export type CreatePhotoMutationHookResult = ReturnType; export type CreatePhotoMutationResult = Apollo.MutationResult; -export type CreatePhotoMutationOptions = Apollo.BaseMutationOptions; +export type CreatePhotoMutationOptions = Apollo.MutationHookOptions; export const CreateUploadUrlDocument = gql` query CreateUploadUrl($bustCache: Int) { createUploadUrl(bustCache: $bustCache) { @@ -718,9 +718,11 @@ export function useCreateUploadUrlLazyQuery(baseOptions?: Apollo.LazyQueryHookOp } // @ts-ignore export function useCreateUploadUrlSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +// @ts-ignore typescript-react-apollo (v3 plugin) emits suspense hooks incompatible with Apollo Client v4 option/result types; these hooks are unused. export function useCreateUploadUrlSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; export function useCreateUploadUrlSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} + // @ts-ignore typescript-react-apollo (v3 plugin) emits suspense hooks incompatible with Apollo Client v4 option/result types; these hooks are unused. return Apollo.useSuspenseQuery(CreateUploadUrlDocument, options); } export type CreateUploadUrlQueryHookResult = ReturnType; @@ -793,9 +795,11 @@ export function useElementDetailLazyQuery(baseOptions?: Apollo.LazyQueryHookOpti } // @ts-ignore export function useElementDetailSuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; +// @ts-ignore typescript-react-apollo (v3 plugin) emits suspense hooks incompatible with Apollo Client v4 option/result types; these hooks are unused. export function useElementDetailSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; export function useElementDetailSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} + // @ts-ignore typescript-react-apollo (v3 plugin) emits suspense hooks incompatible with Apollo Client v4 option/result types; these hooks are unused. return Apollo.useSuspenseQuery(ElementDetailDocument, options); } export type ElementDetailQueryHookResult = ReturnType; @@ -852,9 +856,11 @@ export function useElementsLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions): Apollo.UseSuspenseQueryResult; +// @ts-ignore typescript-react-apollo (v3 plugin) emits suspense hooks incompatible with Apollo Client v4 option/result types; these hooks are unused. export function useElementsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; export function useElementsSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} + // @ts-ignore typescript-react-apollo (v3 plugin) emits suspense hooks incompatible with Apollo Client v4 option/result types; these hooks are unused. return Apollo.useSuspenseQuery(ElementsDocument, options); } export type ElementsQueryHookResult = ReturnType; @@ -875,7 +881,7 @@ export const LoginDocument = gql` } } `; -export type LoginMutationFn = Apollo.MutationFunction; +export type LoginMutationFn = Apollo.useMutation.MutationFunction; /** * __useLoginMutation__ @@ -900,7 +906,7 @@ export function useLoginMutation(baseOptions?: Apollo.MutationHookOptions; export type LoginMutationResult = Apollo.MutationResult; -export type LoginMutationOptions = Apollo.BaseMutationOptions; +export type LoginMutationOptions = Apollo.MutationHookOptions; export const LogoutDocument = gql` mutation Logout($input: LogoutInput!) { logout(input: $input) { @@ -908,7 +914,7 @@ export const LogoutDocument = gql` } } `; -export type LogoutMutationFn = Apollo.MutationFunction; +export type LogoutMutationFn = Apollo.useMutation.MutationFunction; /** * __useLogoutMutation__ @@ -933,7 +939,7 @@ export function useLogoutMutation(baseOptions?: Apollo.MutationHookOptions; export type LogoutMutationResult = Apollo.MutationResult; -export type LogoutMutationOptions = Apollo.BaseMutationOptions; +export type LogoutMutationOptions = Apollo.MutationHookOptions; export const RenewTokenDocument = gql` mutation RenewToken($input: RenewTokenInput!) { renewToken(input: $input) { @@ -948,7 +954,7 @@ export const RenewTokenDocument = gql` } } `; -export type RenewTokenMutationFn = Apollo.MutationFunction; +export type RenewTokenMutationFn = Apollo.useMutation.MutationFunction; /** * __useRenewTokenMutation__ @@ -973,7 +979,7 @@ export function useRenewTokenMutation(baseOptions?: Apollo.MutationHookOptions; export type RenewTokenMutationResult = Apollo.MutationResult; -export type RenewTokenMutationOptions = Apollo.BaseMutationOptions; +export type RenewTokenMutationOptions = Apollo.MutationHookOptions; export const SearchDocument = gql` query Search($query: String!) { elements(search: $query) { @@ -1031,9 +1037,11 @@ export function useSearchLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions): Apollo.UseSuspenseQueryResult; +// @ts-ignore typescript-react-apollo (v3 plugin) emits suspense hooks incompatible with Apollo Client v4 option/result types; these hooks are unused. export function useSearchSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions): Apollo.UseSuspenseQueryResult; export function useSearchSuspenseQuery(baseOptions?: Apollo.SkipToken | Apollo.SuspenseQueryHookOptions) { const options = baseOptions === Apollo.skipToken ? baseOptions : {...defaultOptions, ...baseOptions} + // @ts-ignore typescript-react-apollo (v3 plugin) emits suspense hooks incompatible with Apollo Client v4 option/result types; these hooks are unused. return Apollo.useSuspenseQuery(SearchDocument, options); } export type SearchQueryHookResult = ReturnType; @@ -1079,7 +1087,7 @@ export const UpdateElementDocument = gql` } } `; -export type UpdateElementMutationFn = Apollo.MutationFunction; +export type UpdateElementMutationFn = Apollo.useMutation.MutationFunction; /** * __useUpdateElementMutation__ @@ -1104,4 +1112,4 @@ export function useUpdateElementMutation(baseOptions?: Apollo.MutationHookOption } export type UpdateElementMutationHookResult = ReturnType; export type UpdateElementMutationResult = Apollo.MutationResult; -export type UpdateElementMutationOptions = Apollo.BaseMutationOptions; \ No newline at end of file +export type UpdateElementMutationOptions = Apollo.MutationHookOptions; \ No newline at end of file diff --git a/src/photos/photoUpload.ts b/src/photos/photoUpload.ts index 6fe9808..e475c7b 100644 --- a/src/photos/photoUpload.ts +++ b/src/photos/photoUpload.ts @@ -1,4 +1,4 @@ -import {useApolloClient} from '@apollo/client'; +import {useApolloClient} from '@apollo/client/react'; import ImageResizer from '@bam.tech/react-native-image-resizer'; import {useCallback, useState} from 'react'; import {launchImageLibrary} from 'react-native-image-picker'; @@ -137,6 +137,7 @@ export function usePhotoUploader(): { CreateUploadUrlQuery, CreateUploadUrlQueryVariables >({query: CreateUploadUrlDocument, fetchPolicy: 'no-cache'}); + if (!urlData) throw new Error('Failed to get a photo upload URL'); const {url, key} = urlData.createUploadUrl; // Step 2: upload the bytes to S3.