From f7f0c4d3e3e0860da58922e3f2d183697c932375 Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Fri, 29 May 2026 17:36:38 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=82(frontend)=20add=20guard=20before?= =?UTF-8?q?=20importing=20a=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We could still have 400 error when importing ".markdown", because the backend only accepts ".md" for markdown files. We added another guard on the extensions to prevent this error and make sure the user send acceptable formats. --- .../docs/docs-grid/api/useImportDoc.tsx | 2 +- .../docs/docs-grid/hooks/useImport.tsx | 42 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/frontend/apps/impress/src/features/docs/docs-grid/api/useImportDoc.tsx b/src/frontend/apps/impress/src/features/docs/docs-grid/api/useImportDoc.tsx index 956e79c0b..6ba185daa 100644 --- a/src/frontend/apps/impress/src/features/docs/docs-grid/api/useImportDoc.tsx +++ b/src/frontend/apps/impress/src/features/docs/docs-grid/api/useImportDoc.tsx @@ -33,7 +33,7 @@ export const ContentTypes: { }, Markdown: { mime: 'text/markdown', - extensions: ['.md', '.markdown'], + extensions: ['.md'], }, OctetStream: { mime: 'application/octet-stream', diff --git a/src/frontend/apps/impress/src/features/docs/docs-grid/hooks/useImport.tsx b/src/frontend/apps/impress/src/features/docs/docs-grid/hooks/useImport.tsx index 1440eac52..a9a682f8c 100644 --- a/src/frontend/apps/impress/src/features/docs/docs-grid/hooks/useImport.tsx +++ b/src/frontend/apps/impress/src/features/docs/docs-grid/hooks/useImport.tsx @@ -3,7 +3,7 @@ import { useToastProvider, } from '@gouvfr-lasuite/cunningham-react'; import { t } from 'i18next'; -import { useMemo } from 'react'; +import { useCallback, useMemo } from 'react'; import { useDropzone } from 'react-dropzone'; import { useConfig } from '@/core'; @@ -61,12 +61,37 @@ export const useImport = ({ onDragOver }: UseImportProps) => { ); }, [config?.CONVERSION_FILE_EXTENSIONS_ALLOWED]); + const toastInvalidFileType = useCallback( + (fileName: string) => { + const allowedExtensions = Object.values(ACCEPT).flat().join(', '); + toast( + t( + allowedExtensions + ? `The document "{{documentName}}" import has failed (only {{allowedExtensions}} files are allowed)` + : `The document "{{documentName}}" import has failed`, + { + documentName: fileName, + allowedExtensions, + }, + ), + VariantType.ERROR, + ); + }, + [ACCEPT, toast], + ); + const { getRootProps, getInputProps, open } = useDropzone({ accept: ACCEPT, maxSize: MAX_FILE_SIZE.bytes, onDrop(acceptedFiles) { onDragOver(false); + const allowedExtensions = Object.values(ACCEPT).flat(); for (const file of acceptedFiles) { + const ext = `.${file.name.split('.').pop()?.toLowerCase()}`; + if (!allowedExtensions.includes(ext)) { + toastInvalidFileType(file.name); + continue; + } importDoc([file, file.type]); } }, @@ -94,20 +119,7 @@ export const useImport = ({ onDragOver }: UseImportProps) => { VariantType.ERROR, ); } else { - const allowedExtensions = Object.values(ACCEPT).flat().join(', '); - - toast( - t( - allowedExtensions - ? `The document "{{documentName}}" import has failed (only {{allowedExtensions}} files are allowed)` - : `The document "{{documentName}}" import has failed`, - { - documentName: rejection.file.name, - allowedExtensions, - }, - ), - VariantType.ERROR, - ); + toastInvalidFileType(rejection.file.name); } }); },