export const useRefreshingToken = ({ ixId, learnerId, registrationId }: UseRefreshingTokenProps) => {
const [timeoutId, setTimeoutId] = useState<number | null>(null);
const { error, loading, reload, result } = useFetchData(gqlSdk.getToken, {
itemId,
userId,
registrationId,
});
// Effect to refresh token ${tokenRefreshOffsetSeconds} before it expires
useEffect(() => {
if (!result?.token) {
return;
}
// if there is already a scheduled reload dont need to set it again
if (timeoutId || loading) {
return;
}
const id = window.setTimeout(() => {
reload();
setTimeoutId(null);
// Multiply by 1000 to go from seconds to milliseconds
}, getRefreshTimeInMilliseconds(result.token.lifetimeSeconds));
setTimeoutId(id);
}, [reload, result, timeoutId, loading]);
return {
authToken: result?.token.tokenValue,
loading: loading,
error: error,
};
Я написал этот хук, который обновляет значение моего authtoken всякий раз, когда он истекает. Мне интересно, как я могу проверить refre sh logi c здесь.
Я могу протестировать с помощью библиотеки реагирования на крючки для первого рендера этого хука.
it('Fetches a token from the gql api', async () => {
mockedSdk.getToken.mockResolvedValueOnce({
token: { lifetimeSeconds: 10, tokenValue: 'some-token' },
});
const { result, waitForNextUpdate } = renderHook(() =>
useRefreshingToken({ id: 'ix1', userId: 'learner1', registrationId: 'registration1' }),
);
await waitForNextUpdate();
expect(result.current.authToken).toEqual('some-token');
});
Я попытался добавить кусок кода, ожидая сна (10), чтобы спать в течение 10 секунд, затем проверил значение результата ловушки. Однако это не похоже на работу. Вернее, происходит обновление состояния, но я могу выдавать ошибки о том, как я выполняю обновления состояния за пределами act ().