wahnsinn vibe
This commit is contained in:
60
frontend/shared/src/api.ts
Normal file
60
frontend/shared/src/api.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
import axios, { type AxiosInstance } from "axios";
|
||||
|
||||
const STORAGE_KEY_ACCESS = "shop_access_token";
|
||||
const STORAGE_KEY_REFRESH = "shop_refresh_token";
|
||||
|
||||
export function createApi(baseURL: string): AxiosInstance {
|
||||
// 10 min — LLM plan calls over many items on a local CPU can take several minutes.
|
||||
const api = axios.create({ baseURL, timeout: 600000 });
|
||||
|
||||
api.interceptors.request.use((cfg) => {
|
||||
const token = localStorage.getItem(STORAGE_KEY_ACCESS);
|
||||
if (token) {
|
||||
cfg.headers = cfg.headers || {};
|
||||
cfg.headers["Authorization"] = `Bearer ${token}`;
|
||||
}
|
||||
return cfg;
|
||||
});
|
||||
|
||||
api.interceptors.response.use(
|
||||
(r) => r,
|
||||
async (err) => {
|
||||
const original = err.config;
|
||||
if (err.response?.status === 401 && !original._retry) {
|
||||
const refresh = localStorage.getItem(STORAGE_KEY_REFRESH);
|
||||
if (refresh) {
|
||||
original._retry = true;
|
||||
try {
|
||||
const resp = await axios.post(`${baseURL}/api/auth/refresh`, {
|
||||
refresh_token: refresh,
|
||||
});
|
||||
localStorage.setItem(STORAGE_KEY_ACCESS, resp.data.access_token);
|
||||
localStorage.setItem(STORAGE_KEY_REFRESH, resp.data.refresh_token);
|
||||
original.headers.Authorization = `Bearer ${resp.data.access_token}`;
|
||||
return api(original);
|
||||
} catch {
|
||||
localStorage.removeItem(STORAGE_KEY_ACCESS);
|
||||
localStorage.removeItem(STORAGE_KEY_REFRESH);
|
||||
}
|
||||
}
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
);
|
||||
|
||||
return api;
|
||||
}
|
||||
|
||||
export function saveTokens(access: string, refresh: string): void {
|
||||
localStorage.setItem(STORAGE_KEY_ACCESS, access);
|
||||
localStorage.setItem(STORAGE_KEY_REFRESH, refresh);
|
||||
}
|
||||
|
||||
export function clearTokens(): void {
|
||||
localStorage.removeItem(STORAGE_KEY_ACCESS);
|
||||
localStorage.removeItem(STORAGE_KEY_REFRESH);
|
||||
}
|
||||
|
||||
export function hasAccess(): boolean {
|
||||
return !!localStorage.getItem(STORAGE_KEY_ACCESS);
|
||||
}
|
||||
Reference in New Issue
Block a user