fix(editor): save-on-close & correct image tracking
- 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:
@@ -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 = [
|
||||||
|
|||||||
@@ -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} />
|
||||||
|
|||||||
Reference in New Issue
Block a user