import { createRouter, createWebHistory } from 'vue-router'; import { useAuthStore } from '../stores/auth'; // Type du layout choisi par App.vue : 'bare' (login, plein écran) ou 'ide' (la coquille unique). // L'ancienne coquille (AppShell, layouts 'shell'/'fullbleed') a été retirée : tout vit dans l'IDE. // Les champs `overlay`/`panel`/`terminal` portent l'intention des anciennes routes (rétro-compat) : // l'IdeShell les lit à l'arrivée pour ouvrir l'overlay, le panneau ou le terminal correspondant. declare module 'vue-router' { interface RouteMeta { layout?: 'bare' | 'ide'; overlay?: 'settings' | 'help'; panel?: 'sessions' | 'groups'; terminal?: boolean; } } const IdeShell = () => import('../components/ide/IdeShell.vue'); export const router = createRouter({ history: createWebHistory(), routes: [ { path: '/login', name: 'login', component: () => import('../views/LoginView.vue'), meta: { layout: 'bare' } }, // L'IDE est l'unique coquille, sur tous les gabarits (dégrade en panneau unique sous 768px). { path: '/', redirect: { name: 'ide' } }, { path: '/ide', name: 'ide', component: IdeShell, meta: { layout: 'ide' } }, { path: '/workspace/:repoId/:wt', name: 'workspace', component: IdeShell, meta: { layout: 'ide' } }, // Rétro-compatibilité (bookmarks, PWA, deep-links, notifications, extension VS Code) : les // anciens chemins rendent l'IDE et ouvrent l'élément correspondant via `meta`. IdeShell étant le // même composant que /ide, vue-router réutilise l'instance sans démonter le dock (terminaux // préservés). `/workspace/:repoId/:wt` reste inchangé (contrat de l'extension VS Code). { path: '/dashboard', redirect: { name: 'ide' } }, { path: '/sessions', name: 'sessions', component: IdeShell, meta: { layout: 'ide', panel: 'sessions' } }, { path: '/sessions/:id', name: 'session', component: IdeShell, meta: { layout: 'ide', terminal: true } }, { path: '/groups', name: 'groups', component: IdeShell, meta: { layout: 'ide', panel: 'groups' } }, { path: '/groups/:id', name: 'group', component: IdeShell, meta: { layout: 'ide', panel: 'groups' } }, { path: '/settings', name: 'settings', component: IdeShell, meta: { layout: 'ide', overlay: 'settings' } }, { path: '/help', name: 'help', component: IdeShell, meta: { layout: 'ide', overlay: 'help' } }, { path: '/:pathMatch(.*)*', redirect: '/' }, ], }); // Garde globale : tout sauf /login exige une session valide (GET /api/v1/auth/me, 401 → /login) router.beforeEach(async (to) => { const auth = useAuthStore(); if (auth.authenticated === null) await auth.check(); if (to.name === 'login') return auth.authenticated ? { name: 'ide' } : true; return auth.authenticated ? true : { name: 'login', query: { redirect: to.fullPath } }; });