import { useEffect, useRef } from 'react'; import SwaggerUI from 'swagger-ui-react'; import 'swagger-ui-react/swagger-ui.css'; import { env } from '@/config/env'; import { logger } from '@/utils/logger'; interface SwaggerUIProps { specUrl?: string; spec?: object; } /** * Composant Swagger UI pour afficher la documentation API * Charge le fichier OpenAPI depuis le backend ou utilise un spec fourni */ export function SwaggerUIDoc({ specUrl, spec }: SwaggerUIProps) { const containerRef = useRef(null); // Construire l'URL du fichier OpenAPI/Swagger const getOpenApiUrl = () => { if (specUrl) return specUrl; // Si API_URL est relatif, construire l'URL complète const apiBase = env.API_URL.startsWith('http') ? env.API_URL : `${window.location.origin}${env.API_URL}`; // Le backend sert Swagger à /swagger/doc.json ou /docs/swagger.json // Retirer /api/v1 et ajouter /swagger/doc.json const baseUrl = apiBase.replace(/\/api\/v1$/, ''); // Essayer d'abord /swagger/doc.json (endpoint Swagger standard) return `${baseUrl}/swagger/doc.json`; }; useEffect(() => { if (containerRef.current) { logger.debug('Swagger UI initialized', { specUrl: specUrl || getOpenApiUrl(), hasSpec: !!spec, }); } }, [specUrl, spec]); const swaggerConfig = { url: spec ? undefined : getOpenApiUrl(), spec: spec, deepLinking: true, displayOperationId: false, defaultModelsExpandDepth: 1, defaultModelExpandDepth: 1, docExpansion: 'list' as const, filter: true, showExtensions: true, showCommonExtensions: true, tryItOutEnabled: true, supportedSubmitMethods: ['get', 'post', 'put', 'delete', 'patch'], requestInterceptor: (request: any) => { // Ajouter le token d'authentification si disponible const token = localStorage.getItem('access_token'); if (token && request.headers) { request.headers['Authorization'] = `Bearer ${token}`; } // Ajouter le CSRF token si disponible const csrfToken = localStorage.getItem('csrf_token'); if (csrfToken && request.headers) { request.headers['X-CSRF-Token'] = csrfToken; } return request; }, onComplete: () => { logger.debug('Swagger UI loaded successfully', { url: getOpenApiUrl(), }); }, onFailure: (error: Error) => { logger.error('Failed to load Swagger UI', { error: error.message, stack: error.stack, url: getOpenApiUrl(), }); }, }; return (
); }