From 37ff9b9e12cc1625d3160050df583db650eb7805 Mon Sep 17 00:00:00 2001 From: M Gilang Januar Date: Thu, 16 Sep 2021 23:55:26 +0700 Subject: [PATCH] implement refresh token in fetcher --- web/src/pages/components/Navbar.tsx | 1 + web/src/utils/Fetcher.ts | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/web/src/pages/components/Navbar.tsx b/web/src/pages/components/Navbar.tsx index d902bd2f3..b11c4bfaa 100644 --- a/web/src/pages/components/Navbar.tsx +++ b/web/src/pages/components/Navbar.tsx @@ -20,6 +20,7 @@ const Navbar: React.FC = ({ user }) => { const logout = async () => { await req.post('/auth/logout') JSCookie.remove('authorization') + localStorage.removeItem('refreshToken') location.replace('/') } diff --git a/web/src/utils/Fetcher.ts b/web/src/utils/Fetcher.ts index adb01a41e..2051f05b2 100644 --- a/web/src/utils/Fetcher.ts +++ b/web/src/utils/Fetcher.ts @@ -8,12 +8,25 @@ export const req = axios.create({ }) export const fetcher = async (url: string, authorization?: string): Promise => { - try { + const fetch = async () => { const { data } = await req.get(url, { ...authorization ? { headers: { authorization: `Bearer ${authorization}` } } : {}, withCredentials: true }) return data + } + + try { + return await fetch() } catch ({ response }) { + if ((response as any)?.status === 401 && localStorage.getItem('refreshToken')) { + try { + const { data } = await req.post('/auth/refreshToken', { refreshToken: localStorage.getItem('refreshToken') }) + localStorage.setItem('refreshToken', data.refreshToken) + return await fetch() + } catch (error) { + throw response + } + } throw response } } \ No newline at end of file