diff --git a/src/features/auth/ui/Login.tsx b/src/features/auth/ui/Login.tsx index fb0f704..d60d8fb 100644 --- a/src/features/auth/ui/Login.tsx +++ b/src/features/auth/ui/Login.tsx @@ -1,7 +1,7 @@ 'use client'; import { Link, useRouter } from '@/shared/config/i18n/navigation'; -import { setToken, setUser } from '@/shared/lib/token'; +import { setRefToken, setToken, setUser } from '@/shared/lib/token'; import { Button } from '@/shared/ui/button'; import { Form, @@ -42,6 +42,7 @@ const Login = () => { }) => auth_api.login(body), onSuccess: (res) => { setToken(res.data.access); + setRefToken(res.data.refresh); setUser(form.getValues('username')); router.push('/'); queryClient.refetchQueries({ queryKey: ['product_list'] }); diff --git a/src/shared/config/api/URLs.ts b/src/shared/config/api/URLs.ts index 81084cc..cdc33fd 100644 --- a/src/shared/config/api/URLs.ts +++ b/src/shared/config/api/URLs.ts @@ -21,4 +21,5 @@ export const API_URLS = { CartItemDelete: (id: string) => `${API_V}orders/cart-item/${id}/delete/`, CreateOrder: `${API_V}orders/order/create/`, OrderList: `${API_V}orders/order/list/`, + Refresh_Token: `${API_V}accounts/refresh/token/`, }; diff --git a/src/shared/config/api/httpClient.ts b/src/shared/config/api/httpClient.ts index 1da7141..f80ca2b 100644 --- a/src/shared/config/api/httpClient.ts +++ b/src/shared/config/api/httpClient.ts @@ -1,5 +1,12 @@ import getLocaleCS from '@/shared/lib/getLocaleCS'; -import { getToken, removeToken } from '@/shared/lib/token'; +import { + getRefToken, + getToken, + removeRefToken, + removeToken, + setRefToken, + setToken, +} from '@/shared/lib/token'; import axios, { AxiosError } from 'axios'; import { getLocale } from 'next-intl/server'; import { LanguageRoutes } from '../i18n/types'; @@ -32,13 +39,47 @@ httpClient.interceptors.request.use( ); httpClient.interceptors.response.use( - (response) => response, - (error) => { + async (response) => response, + async (error) => { console.error('API error:', error); if ((error as AxiosError)?.status === 403) { - removeToken(); + try { + const refToken = getRefToken(); + if (!refToken) { + removeToken(); + removeRefToken(); + window.location.href = '/'; + } + const { data } = await axios.post( + `${BASE_URL}api/v1/accounts/refresh/token/`, + { refresh: refToken }, + ); + setToken(data.access); + setRefToken(data.refresh); + } catch { + removeToken(); + removeRefToken(); + window.location.href = '/'; + } } else if ((error as AxiosError)?.status === 401) { - removeToken(); + try { + const refToken = getRefToken(); + if (!refToken) { + removeToken(); + removeRefToken(); + window.location.href = '/'; + } + const { data } = await axios.post( + `${BASE_URL}api/v1/accounts/refresh/token/`, + { refresh: refToken }, + ); + setToken(data.access); + setRefToken(data.refresh); + } catch { + removeToken(); + removeRefToken(); + window.location.href = '/'; + } } return Promise.reject(error); }, diff --git a/src/shared/lib/token.ts b/src/shared/lib/token.ts index 1bc199d..bef79fb 100644 --- a/src/shared/lib/token.ts +++ b/src/shared/lib/token.ts @@ -2,6 +2,7 @@ import cookie from 'js-cookie'; const TOKEN = 'gastro-token'; const USER = 'gastro-user'; +const REF_TOKEN = 'gastro-refresh'; export const getToken = () => { return cookie.get(TOKEN); @@ -26,3 +27,15 @@ export const setToken = (value: string) => { export const setUser = (value: string) => { cookie.set(USER, value); }; + +export const setRefToken = (value: string) => { + cookie.set(REF_TOKEN, value); +}; + +export const removeRefToken = () => { + cookie.remove(REF_TOKEN); +}; + +export const getRefToken = () => { + return cookie.get(REF_TOKEN); +};