diff --git a/frontend/src/contexts/FileContext.tsx b/frontend/src/contexts/FileContext.tsx index 9b28b1b98..f2f304b1e 100644 --- a/frontend/src/contexts/FileContext.tsx +++ b/frontend/src/contexts/FileContext.tsx @@ -81,7 +81,7 @@ function FileContextInner({ // File operations using unified addFiles helper with persistence const addRawFiles = useCallback(async (files: File[], options?: { insertAfterPageId?: string; selectFiles?: boolean }): Promise => { - const addedFilesWithIds = await addFiles('raw', { files, ...options }, stateRef, filesRef, dispatch, lifecycleManager); + const addedFilesWithIds = await addFiles({ files, ...options }, stateRef, filesRef, dispatch, lifecycleManager); // Auto-select the newly added files if requested if (options?.selectFiles && addedFilesWithIds.length > 0) { @@ -124,12 +124,6 @@ function FileContextInner({ return addedFilesWithIds.map(({ file, id }) => createStirlingFile(file, id)); }, [indexedDB, enablePersistence]); - const addProcessedFiles = useCallback(async (filesWithThumbnails: Array<{ file: File; thumbnail?: string; pageCount?: number }>): Promise => { - const result = await addFiles('processed', { filesWithThumbnails }, stateRef, filesRef, dispatch, lifecycleManager); - return result.map(({ file, id }) => createStirlingFile(file, id)); - }, []); - - const addStirlingFileStubsAction = useCallback(async (stirlingFileStubs: StirlingFileStub[], options?: { insertAfterPageId?: string; selectFiles?: boolean }): Promise => { // StirlingFileStubs preserve all metadata - perfect for FileManager use case! const result = await addStirlingFileStubs(stirlingFileStubs, options, stateRef, filesRef, dispatch, lifecycleManager); @@ -173,7 +167,6 @@ function FileContextInner({ const actions = useMemo(() => ({ ...baseActions, addFiles: addRawFiles, - addProcessedFiles, addStirlingFileStubs: addStirlingFileStubsAction, removeFiles: async (fileIds: FileId[], deleteFromStorage?: boolean) => { // Remove from memory and cleanup resources @@ -229,7 +222,6 @@ function FileContextInner({ }), [ baseActions, addRawFiles, - addProcessedFiles, addStirlingFileStubsAction, lifecycleManager, setHasUnsavedChanges, diff --git a/frontend/src/contexts/file/fileActions.ts b/frontend/src/contexts/file/fileActions.ts index de5c32370..cde32ee58 100644 --- a/frontend/src/contexts/file/fileActions.ts +++ b/frontend/src/contexts/file/fileActions.ts @@ -146,10 +146,9 @@ export interface AddedFile { } /** - * Unified file addition helper - replaces addFiles/addProcessedFiles/addStoredFiles + * Unified file addition helper - replaces addFiles */ export async function addFiles( - kind: AddFileKind, options: AddFileOptions, stateRef: React.MutableRefObject, filesRef: React.MutableRefObject>, @@ -165,10 +164,7 @@ export async function addFiles( // Build quickKey lookup from existing files for deduplication const existingQuickKeys = buildQuickKeySet(stateRef.current.files.byId); - if (DEBUG) console.log(`📄 addFiles(${kind}): Existing quickKeys for deduplication:`, Array.from(existingQuickKeys)); - switch (kind) { - case 'raw': { const { files = [] } = options; if (DEBUG) console.log(`📄 addFiles(raw): Adding ${files.length} files with immediate thumbnail generation`); @@ -239,57 +235,10 @@ export async function addFiles( stirlingFileStubs.push(record); addedFiles.push({ file, id: fileId, thumbnail }); } - break; - } - - case 'processed': { - const { filesWithThumbnails = [] } = options; - if (DEBUG) console.log(`📄 addFiles(processed): Adding ${filesWithThumbnails.length} processed files with pre-existing thumbnails`); - - for (const { file, thumbnail, pageCount = 1 } of filesWithThumbnails) { - const quickKey = createQuickKey(file); - - if (existingQuickKeys.has(quickKey)) { - if (DEBUG) console.log(`📄 Skipping duplicate processed file: ${file.name}`); - continue; - } - - const fileId = createFileId(); - filesRef.current.set(fileId, file); - - const record = toStirlingFileStub(file, fileId, thumbnail); - if (thumbnail) { - // Track blob URLs for cleanup (images return blob URLs that need revocation) - if (thumbnail.startsWith('blob:')) { - lifecycleManager.trackBlobUrl(thumbnail); - } - } - - // Store insertion position if provided - if (options.insertAfterPageId !== undefined) { - record.insertAfterPageId = options.insertAfterPageId; - } - - // Create processedFile with provided metadata - if (pageCount > 0) { - record.processedFile = createProcessedFile(pageCount, thumbnail); - if (DEBUG) console.log(`📄 addFiles(processed): Created initial processedFile metadata for ${file.name} with ${pageCount} pages`); - } - - // History metadata is now managed in IndexedDB, not in PDF metadata - - existingQuickKeys.add(quickKey); - stirlingFileStubs.push(record); - addedFiles.push({ file, id: fileId, thumbnail }); - } - break; - } - } // Dispatch ADD_FILES action if we have new files if (stirlingFileStubs.length > 0) { dispatch({ type: 'ADD_FILES', payload: { stirlingFileStubs } }); - if (DEBUG) console.log(`📄 addFiles(${kind}): Successfully added ${stirlingFileStubs.length} files`); } return addedFiles; @@ -547,11 +496,11 @@ export async function addStirlingFileStubs( // Check if processedFile data needs regeneration for proper Page Editor support if (stirlingFile.type.startsWith('application/pdf')) { - const needsProcessing = !record.processedFile || - !record.processedFile.pages || + const needsProcessing = !record.processedFile || + !record.processedFile.pages || record.processedFile.pages.length === 0 || record.processedFile.totalPages !== record.processedFile.pages.length; - + if (needsProcessing) { if (DEBUG) console.log(`📄 addStirlingFileStubs: Regenerating processedFile for ${record.name}`); try { diff --git a/frontend/src/types/fileContext.ts b/frontend/src/types/fileContext.ts index 195b354d1..485c7ad27 100644 --- a/frontend/src/types/fileContext.ts +++ b/frontend/src/types/fileContext.ts @@ -294,7 +294,6 @@ export type FileContextAction = export interface FileContextActions { // File management - lightweight actions only addFiles: (files: File[], options?: { insertAfterPageId?: string; selectFiles?: boolean }) => Promise; - addProcessedFiles: (filesWithThumbnails: Array<{ file: File; thumbnail?: string; pageCount?: number }>) => Promise; addStirlingFileStubs: (stirlingFileStubs: StirlingFileStub[], options?: { insertAfterPageId?: string; selectFiles?: boolean }) => Promise; removeFiles: (fileIds: FileId[], deleteFromStorage?: boolean) => Promise; updateStirlingFileStub: (id: FileId, updates: Partial) => void;