简体   繁体   中英

Updating Apollo store when mutating list filter

I have a graphql schema that looks like this :

type User {
    entries(status: EntryStatus): [Entry]
}

type Mutation {    
    updateEntry(status: EntryStatus): Entry
}

I can filter the list of entries by status (which is an enum) and I can update the status of an entry. I'd like to update the store when the status is updated so that the entry appears in the right list ( entries(status: FOO) to entries(status: BAR) ).

I know I can update the store with the update method.

const withMutation = graphql(updateEntryMutation, {
  props: ({ mutate }) => ({
    updateEntry: updateEntryInput =>
      mutate({
        variables: { updateEntryInput },
        update: (proxy, newData) => {

          // update data here
          // Which would involve removing the entry from its previous filtered "list", and adding it to the one with the new status

      })
  })
});

But how can I know from which list to remove the entry since I don't have access to the old data (previous entry.status) from update ?

(apart from enumerating all lists by status and removing the updated entry if I find it...)

You need to store.readQuery() first, then write the new data to the store.

Kinda like this:

const EntriesQuery = 'yourQueryHere';

const withMutation = graphql(updateEntryMutation, {
  props: ({ mutate }) => ({
    updateEntry: updateEntryInput =>
      mutate({
        variables: { updateEntryInput },
        update: (store, { data: { updateEntry }}) => {

          const data = store.readQuery({ query: EntriesQuery });
          data.entries.push(updateEntry)

          store.writeQuery({ query: EntriesQuery, data })
      })
  })
});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM