fix(editor): save-on-close & correct image tracking
Some checks failed
CI / Lint, Test & Build (push) Failing after 1m7s
CI / Deploy production (on server) (push) Has been skipped

- Auto-sauvegarde à la fermeture de l'éditeur fullPage si isDirty (évite
  que la vignette reste après suppression d'image sans Ctrl+S)
- Correction de resolveImagesForSave : fusion des images contenu HTML +
  images standalone (hors éditeur) en excluant les removedImageUrls,
  pour ne pas perdre les images uploadées séparément à la sauvegarde
This commit is contained in:
Antigravity
2026-05-24 21:37:09 +00:00
parent 36336e6b0d
commit ecd7e57c2e
2 changed files with 27 additions and 12 deletions

View File

@@ -313,19 +313,27 @@ export function NoteEditorProvider({ note, readOnly = false, fullPage = false, o
}, [content, isMarkdown]) }, [content, isMarkdown])
const resolveImagesForSave = useCallback((contentToSave: string): string[] => { const resolveImagesForSave = useCallback((contentToSave: string): string[] => {
if (!contentToSave) return [] // Images présentes dans le contenu de l'éditeur (inline dans le HTML ou Markdown)
if (!isMarkdown) { let contentImages: string[] = []
return extractImagesFromHTML(contentToSave) if (contentToSave) {
} else { if (!isMarkdown) {
const urls = new Set<string>() contentImages = extractImagesFromHTML(contentToSave)
const matches = contentToSave.matchAll(/!\[.*?\]\((.*?)\)/g) } else {
for (const match of matches) { const urls = new Set<string>()
const src = match[1]?.trim() const matches = contentToSave.matchAll(/!\[.*?\]\((.*?)\)/g)
if (src) urls.add(src) for (const match of matches) {
const src = match[1]?.trim()
if (src) urls.add(src)
}
contentImages = Array.from(urls)
} }
return Array.from(urls)
} }
}, [isMarkdown]) // Images "standalone" uploadées séparément (hors contenu éditeur), non supprimées
const standaloneImages = images.filter(url => !removedImageUrls.includes(url) && !contentImages.includes(url))
// Fusion dédupliquée : images du contenu + images standalone conservées
return Array.from(new Set([...contentImages, ...standaloneImages]))
}, [isMarkdown, images, removedImageUrls])
const handleGenerateTitles = async () => { const handleGenerateTitles = async () => {
const fullContentForAI = [ const fullContentForAI = [

View File

@@ -91,10 +91,17 @@ export function NoteEditorToolbar({ mode, onClose, onToggleAttachments, attachme
} }
if (mode === 'fullPage') { if (mode === 'fullPage') {
const handleCloseWithSave = async () => {
if (state.isDirty && !state.isSaving) {
await actions.handleSaveInPlace()
}
onClose()
}
return ( return (
<div className="px-4 sm:px-8 md:px-12 py-4 sm:py-6 md:py-8 flex items-center justify-between sticky top-0 bg-white/95 dark:bg-background/95 backdrop-blur-sm z-40 border-b border-border dark:border-white/10"> <div className="px-4 sm:px-8 md:px-12 py-4 sm:py-6 md:py-8 flex items-center justify-between sticky top-0 bg-white/95 dark:bg-background/95 backdrop-blur-sm z-40 border-b border-border dark:border-white/10">
<button <button
onClick={onClose} onClick={handleCloseWithSave}
className="flex items-center gap-2 text-foreground hover:opacity-60 transition-opacity" className="flex items-center gap-2 text-foreground hover:opacity-60 transition-opacity"
> >
<ArrowLeft size={18} /> <ArrowLeft size={18} />