Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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":"[email protected]"}}

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 ?.

like image 593
Silicum Silium Avatar asked Aug 15 '20 07:08

Silicum Silium


2 Answers

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
    }
  }
`;
like image 170
Miguel Ángel Torres Avatar answered Oct 27 '22 06:10

Miguel Ángel Torres


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)

like image 21
Matt Brandt Avatar answered Oct 27 '22 06:10

Matt Brandt