Files
nnterp-react-admin/resources/js/bootstrap.ts
2026-03-13 20:49:46 +08:00

42 lines
1.7 KiB
TypeScript

import axios from "axios";
window.axios = axios;
window.axios.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
// Set CSRF token from meta tag
const token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.getAttribute('content');
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-token');
}
// CSRF token refresh with auto-retry
window.axios.interceptors.response.use(
(response) => response,
async (error) => {
if (error.response?.status === 419) {
try {
const response = await fetch(window.location.href, { method: 'GET' });
const html = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
const newToken = doc.querySelector('meta[name="csrf-token"]')?.getAttribute('content');
if (newToken) {
document.querySelector('meta[name="csrf-token"]')?.setAttribute('content', newToken);
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = newToken;
// Update the original request with new token
if (error.config && error.config.headers) {
error.config.headers['X-CSRF-TOKEN'] = newToken;
}
// Retry the original request
return window.axios.request(error.config);
}
} catch (e) {}
}
return Promise.reject(error);
}
);