Я реализую OAuth с пользовательским провайдером.
Таким образом, у меня есть Auth
компонент, где внутри 'componentDidMount:
client.mutate({
mutation: CURRENT_USER_MUTATION,
variables: {
token: (response.data.token.value) || null,
},
});
Моя мутация выглядит так:
gql`
mutation($token: String!) {
CurrentUser(token: $token) @client
}
`;
И у меня есть резольвер:
defaults: {
current_user: null,
},
resolvers: {
Mutation: {
CurrentUser: (_: any, { token }: { token: string }, { cache }: { cache: Object }): null => {
const { user } = decodeJWT(token);
cache.writeQuery({
query: CURRENT_USER,
data: {
current_user: {
__typename: 'user',
id: user.id,
name: user.name,
level: user.level,
email: user.email,
},
},
});
return cache.readQuery({ query: CURRENT_USER });
},
},
А потом что-то происходит, когда я заглядываю внутрь отладчика Chrome Apollo, я ясно вижу это:
Таким образом, данные уже находятся в кэше Apollo, но ROOT_QUERY
по-прежнему имеет значение null в качестве текущего пользователя.
Также, когда я пытаюсь использовать react-apollo
Mutation
компонент, подобный этому:
<Mutation mutation={CURRENT_USER_MUTATION}>
{(mutate: Function,): React.Node => {
return (
<button type="button" onClick={(): Function => mutate(({ variables: { token: '123' } }: Object))}>
Do it
</button>
);
}}
</Mutation>
Тогда все работает отлично.
Так выглядит после использования cache.writeQuery
другой компонент / кеш не уведомляет о запущенной мутации.
Буду благодарен за помощь:)