обновление кэша в apollo graphql

#javascript #reactjs #graphql #react-apollo #apollo-client

#javascript #reactjs #graphql #реагировать-apollo #apollo-клиент

Вопрос:

У меня есть список контактов, в который я могу добавить новый контакт. Как только добавляется новый контакт, мне нужно показать его в списке контактов без использования refetchQueries . Я пытался сделать это, просматривая документацию apollo

 addContact(
  data: ContactInputData
): ContactPayload

type ContactPayload {
  status: Int!
  error: ErrorData
  data: ContactResponseData
}

type ContactResponseData {
  id: String!
}

type ContactInputData {
  country: String!
  address: String!
  company: String!
  number: String!
  name: String!
  email: String!
  visibility: Boolean
}

// list of contacts

contacts: ContactListPayload!
type ContactListPayload {
  status: Int!
  error: ErrorData
  data: [Client]!
}
type Client {
  id: ID!
  email: String!
  number: String!
  visibility: String!
  client_id: String!
  country: String!
  profile_picture: String!
  tags: [Tag]!
  notes: [Note]!
}

const formSubmit = async (val: AddContactInputs) => {
    console.log('val', val);
    const response = await addContact({
      variables: {
        data: {
          ...val,
          country: '',
          address: '',
          company: ''
        }
      },
      optimisticResponse: {
        __typename: 'Mutation',
        addContact: {
          __typename: 'ContactPayload',
          data: {
            // not sure the shape of data
          }
        }
      },
      update: (client, { data: { addContact } }) => {
        console.log('client', client);
        console.log('addContact', addContact);
        // if (addContact.status === 201) {}
        // read data from our cache
        const data: any = client.readQuery({ query: CONTACTS });
        console.log('data from cache', data);
        // write our data back to cache with the new contacts in it
        const newData: any = {
          ...data,
          contacts: { ...data.contacts, data: [...data.contacts.data, addContact.data] }
        };
        console.log('newData to write', newData);
        client.writeQuery({ query: CONTACTS, data: newData });
      }
    });
    console.log('response', response)
  };
 

Тем не менее, я запутался в форме данных optimisticResponse . Если вы видите модель ответа addContact, она просто отправляет мне идентификатор. Как я должен обновлять список контактов, где в основном требуется имя, адрес электронной почты, номер?

Комментарии:

1. странные требования, поскольку обычно тип ответа — расширенный тип ввода ( id) и содержит все необходимые для обновления данные… более того, обычно для удаленной записи / объекта (передается только идентификатор) полные данные / могут быть возвращены / запрошены… но вы можете попробовать использовать переданные переменные (просто data: {...data, id:randomID} ) в оптимистичном ответе