Refresh token when token has expired
This commit is contained in:
@ -1,32 +0,0 @@
|
||||
import { render, waitFor } from '@testing-library/react';
|
||||
import { useHasAccessToken } from '../useHasAccessToken';
|
||||
|
||||
function TestComponent() {
|
||||
const hasAccessToken = useHasAccessToken();
|
||||
|
||||
return (
|
||||
<div>{hasAccessToken && <div data-testid="has-access-token"></div>}</div>
|
||||
);
|
||||
}
|
||||
|
||||
test('useHasAccessToken works properly if access token is present', async () => {
|
||||
localStorage.setItem('accessToken', 'test-access-token');
|
||||
const { getByTestId } = render(<TestComponent />);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(getByTestId('has-access-token')).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
test('useHasAccessToken works properly if access token is not present', async () => {
|
||||
localStorage.removeItem('accessToken');
|
||||
const { container } = render(<TestComponent />);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(container.firstChild).toBeEmptyDOMElement();
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
@ -1,38 +0,0 @@
|
||||
import { render, waitFor } from '@testing-library/react';
|
||||
import { useRefreshToken } from '../useRefreshToken';
|
||||
|
||||
function TestComponent() {
|
||||
const { loading } = useRefreshToken();
|
||||
|
||||
return <div>{!loading && <div>Refreshed</div>}</div>;
|
||||
}
|
||||
|
||||
jest.mock('@apollo/client', () => {
|
||||
return {
|
||||
__esModule: true,
|
||||
...jest.requireActual('@apollo/client'),
|
||||
useQuery: () => ({
|
||||
data: {
|
||||
token: {
|
||||
accessToken: 'test-access-token',
|
||||
},
|
||||
},
|
||||
isLoading: false,
|
||||
error: null,
|
||||
}),
|
||||
};
|
||||
});
|
||||
|
||||
test('useRefreshToken works properly', async () => {
|
||||
localStorage.setItem('refreshToken', 'test-refresh-token');
|
||||
render(<TestComponent />);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(localStorage.getItem('accessToken')).toBe('test-access-token');
|
||||
});
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.clearAllMocks();
|
||||
localStorage.removeItem('refreshToken');
|
||||
});
|
||||
@ -1,5 +0,0 @@
|
||||
export const useHasAccessToken = () => {
|
||||
const accessToken = localStorage.getItem('accessToken');
|
||||
|
||||
return accessToken ? true : false;
|
||||
};
|
||||
@ -1,32 +0,0 @@
|
||||
import { gql, useQuery } from '@apollo/client';
|
||||
import { useEffect } from 'react';
|
||||
import { authClient } from '../../apollo';
|
||||
|
||||
export const GET_TOKEN = gql`
|
||||
fragment Payload on REST {
|
||||
refreshToken: String
|
||||
}
|
||||
query jwt($input: Payload) {
|
||||
token(input: $input) @rest(type: "string", path: "/token", method: "POST") {
|
||||
accessToken
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export const useRefreshToken = () => {
|
||||
const refreshToken = localStorage.getItem('refreshToken');
|
||||
const { data, loading, error } = useQuery(GET_TOKEN, {
|
||||
client: authClient,
|
||||
variables: { input: { refreshToken } },
|
||||
});
|
||||
useEffect(() => {
|
||||
if (!loading && !error) {
|
||||
const accessToken = data.token.accessToken;
|
||||
if (accessToken) {
|
||||
localStorage.setItem('accessToken', accessToken || '');
|
||||
}
|
||||
}
|
||||
}, [data, refreshToken, loading, error]);
|
||||
|
||||
return { loading, error };
|
||||
};
|
||||
Reference in New Issue
Block a user