diff --git a/app/assets/css/style.css b/app/assets/css/style.css index bf1593f..c99610d 100644 --- a/app/assets/css/style.css +++ b/app/assets/css/style.css @@ -1,3 +1,7 @@ a { text-decoration: none!important; +} + +html body .navbar .navbar-collapsable .navbar-nav li.nav-item a.nav-link[data-focus-mouse="true"], .navbar .navbar-collapsable .navbar-nav li.nav-item button.nav-link[data-focus-mouse="true"] { + border-color: inherit !important } \ No newline at end of file diff --git a/app/composables/useApiFetch.ts b/app/composables/useApiFetch.ts index 2a8899f..8d209e8 100644 --- a/app/composables/useApiFetch.ts +++ b/app/composables/useApiFetch.ts @@ -2,14 +2,48 @@ import { defu } from 'defu' export const useApiFetch = (request: string, options: Parameters[1] = {}) => { const config = useRuntimeConfig() - const token = useCookie('auth_token') // Make sure this matches the cookie name you use on login + const tokenCookie = useCookie('auth_token') + const tokenState = useState('auth_token_state') + + const tokenValue = tokenState.value ?? tokenCookie.value const defaults: Parameters[1] = { baseURL: config.public.api as string, - headers: token.value ? { Authorization: `Bearer ${token.value}` } : {}, + headers: tokenValue ? { Authorization: `Bearer ${tokenValue}` } : {}, } const params = defu(options, defaults) - return $fetch(request, params) + try { + if (params?.body && typeof FormData !== 'undefined' && params.body instanceof FormData) { + if (params.headers && 'Content-Type' in params.headers) { + delete params.headers['Content-Type'] + } + } + } catch (e) {} + + return $fetch(request, params).catch((err: any) => { + const status = err?.statusCode || err?.status || err?.response?.status + + if (status === 401 || status === 403) { + try { + tokenCookie.value = null + tokenState.value = null + const authUser = useState('auth_user') + authUser.value = null + + console.error(`[API] Authentication error (${status}) - token cleared`) + } catch (e) { + console.error('[API] Error clearing auth state:', e) + } + + try { + navigateTo('/auth/login') + } catch (e) { + console.error('[API] Error navigating to login:', e) + } + } + + throw err + }) } \ No newline at end of file diff --git a/app/plugins/bootstrap-italia.client.ts b/app/plugins/bootstrap-italia.client.ts index 0ec5159..bf0af3e 100644 --- a/app/plugins/bootstrap-italia.client.ts +++ b/app/plugins/bootstrap-italia.client.ts @@ -1,3 +1,4 @@ export default defineNuxtPlugin(async (nuxtApp) => { + // @ts-expect-error await import('bootstrap-italia/dist/js/bootstrap-italia.bundle.min.js') }) \ No newline at end of file diff --git a/nuxt.config.ts b/nuxt.config.ts index f6a2371..afdf876 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -20,6 +20,29 @@ export default defineNuxtConfig({ url: 'http://localhost:3000', name: 'Visione - Un\'occhio per la sicurezza del cittadino.', }, + + nitro: { + devProxy: { + '/api/v1': { + target: 'https://bk.visione.studentindipendenti.it/api/v1', + changeOrigin: true, + headers: { + host: 'bk.visione.studentindipendenti.it', + origin: 'https://visione.studentindipendenti.it', + referer: 'https://visione.studentindipendenti.it/' + } + }, + '/uploads': { + target: 'https://bk.visione.studentindipendenti.it/uploads', + changeOrigin: true, + headers: { + host: 'bk.visione.studentindipendenti.it', + origin: 'https://visione.studentindipendenti.it', + referer: 'https://visione.studentindipendenti.it/' + } + } + } + }, css: [ '@/assets/css/style.css',