переопределить subscribeToMore при изменении реквизита - PullRequest
0 голосов
/ 29 декабря 2018

Мне нужна помощь с изменением функции subscribeToMore в функции клиента Apollo при изменении реквизита.Поэтому я разработал одноразовый веб-сайт электронной почты, который использует query для получения писем, связанных с определенным адресом электронной почты, и у меня также работает subscription, который получает уведомление при получении нового электронного письма и автоматически обновляет почтовый ящик.Тем не менее, я также даю пользователям возможность изменить адрес электронной почты, и мне нужен способ перезапустить subscribeToMore, связанный с новым адресом электронной почты, и закрыть подписку, связанную со старым адресом электронной почты.Вот как выглядит мой код:

const InboxManagementWithData = ({address}) => (
  <Query
  query={GET_EMAILS}
  variables={{address}}>
  {({subscribeToMore, ...result}) => 
      <InboxManagement 
      {...result}
      subscribeToNewEmails={() => 
        subscribeToMore({
          document: GET_NEW_EMAILS,
          variables: {address},
          updateQuery: (prev, { subscriptionData }) => {
            console.log(prev, subscriptionData)
            if (!subscriptionData.data) return prev;
            const newEmail = subscriptionData.data.emailAdded;
            return Object.assign({}, prev, {
              emails: [newEmail, ...prev.emails]
            });
          }
        })
      }

      />
  }
  </Query>
)

class InboxManagement extends React.Component{
  componentDidMount() {
    this.props.subscribeToNewEmails()
  }
  render(){
    let {loading, error, data} = this.props
    return (
      <div>
        {loading &&
          <div className="inbox-loading">
            <Spin size="large"/>
          </div>
        }

        {error &&
        <div className="inbox-empty">
          <Icon type="inbox" style={{ fontSize: '100px'}}/>
          <h3>Error loading inbox :(</h3>
        </div>
        }

        {!loading && data.emails && data.emails.length == 0 &&
          <div className="inbox-empty">
            <Icon type="inbox" style={{ fontSize: '100px'}}/>
            <h3>Inbox empty</h3>
          </div>
        }

        {!loading && data.emails && data.emails.length > 0 &&
          <div>
            {data.emails.map(email => <Email email={email} key={email.token} />)}
          </div>
        }

      </div>
    )
  }
}

Как вы можете видеть, <InboxManagement /> получает адрес электронной почты в качестве реквизита, и я вызываю функцию subscribeToMore, чтобы создать подписку, связанную с адресом электронной почты пользователя.,Однако, если пользователь изменил свой адрес электронной почты, subscribeToMore фиксируется, и его переменные остаются такими же, поэтому он все еще подключен к подписке со старым адресом электронной почты.Можно ли отменить текущую подписку?

...