11

this my code

const NewVerificationCode = () => {
  const { loading, error, data = {}, refetch } = useQuery(CONFIRMATION_CODE, {
    skip: true,
    onError: (err) => {},
  });
  console.log(loading, error, data);

  if (loading || error) {
    return <ErrorLoadingHandler {...{ loading, error }} />;
  }

  return (
    <form
      onSubmit={(e) => {
        refetch();
        e.preventDefault();
      }}
    >
      <div>
        <button type="submit" className="signUpbutton">
          {"Send the message again"}
        </button>
      </div>
    </form>
  );
};

const CONFIRMATION_CODE = gql`
  query {
    my {
      sendNewTokenForConfirmation
    }
  }
`;

when i make a request i get a warning

Cache data may be lost when replacing the my field of a Query object.

To address this problem (which is not a bug in Apollo Client), either ensure all >objects of type My have IDs, or define a custom merge function for the Query.my >field, so InMemoryCache can safely merge these objects existing:

    {"__typename":"My","getUser{"__typename":"User","email":"shakizriker0022@gmail.com"}}

incoming: {"__typename":"My","sendNewTokenForConfirmation":"SUCCESS"}

For more information about these options, please refer to the documentation:

I followed the links.

I read the documentation and realized that the problem is in the apollo client cache (typePolicies).

But how should I solve this problem I just can't figure out.

What should i write in typePolicies to get rid of the warning ?.

Edgar
  • 6,022
  • 8
  • 33
  • 66

2 Answers2

12

You may need to return an id for Apollo to uniquely identify that object in the cache. I think this issue is similar to yours: link

const CONFIRMATION_CODE = gql`
  query {
    my {
      id
      sendNewTokenForConfirmation
    }
  }
`;
  • 9
    If I understood you correctly, my should return id.I tried it but that doesn't work either. – Edgar Aug 16 '20 at 09:36
4

Every object should return id, _id or alternatively a custom id field (https://www.apollographql.com/docs/react/caching/cache-configuration) for automatic merges to function.

const cache = new InMemoryCache({
  typePolicies: {
    Product: {
      keyFields: ["custom-id-field"],
    },
  },
});

(!)People often forget that cache operations require the same variables used for the initial query (!)

Mutation Sample (adding a purchase):

update(cache, { data: NewPurchase } }) => {
  let productCache = cache.readQuery({
    query: productQuery,
    variables: {
      id: productId
    }
  })
 
  cache.writeQuery({
    query: productQuery,
    variables: { id: productId },
    data: {
      Product: {
        ...productCache.Product,
        purchases: productCache.Product.purchases.concat(NewPurchase)
      }
    }
  });
 };
}

(Important: Each Purchase also requires it's own individual id that needs to be returned)

Dharman
  • 30,962
  • 25
  • 85
  • 135
Matt Brandt
  • 581
  • 1
  • 4
  • 20