Use stubs instead of files

This commit is contained in:
James Brunton 2025-09-16 15:05:39 +01:00
parent 85742d4e1a
commit a4db51a67b
3 changed files with 17 additions and 38 deletions

View File

@ -5,7 +5,6 @@ import RotateLeftIcon from "@mui/icons-material/RotateLeft";
import RotateRightIcon from "@mui/icons-material/RotateRight"; import RotateRightIcon from "@mui/icons-material/RotateRight";
import { RotateParametersHook } from "../../../hooks/tools/rotate/useRotateParameters"; import { RotateParametersHook } from "../../../hooks/tools/rotate/useRotateParameters";
import { useSelectedFiles } from "../../../contexts/file/fileHooks"; import { useSelectedFiles } from "../../../contexts/file/fileHooks";
import { useThumbnailGeneration } from "../../../hooks/useThumbnailGeneration";
import DocumentThumbnail from "../../shared/filePreview/DocumentThumbnail"; import DocumentThumbnail from "../../shared/filePreview/DocumentThumbnail";
interface RotateSettingsProps { interface RotateSettingsProps {
@ -15,39 +14,19 @@ interface RotateSettingsProps {
const RotateSettings = ({ parameters, disabled = false }: RotateSettingsProps) => { const RotateSettings = ({ parameters, disabled = false }: RotateSettingsProps) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { selectedFiles } = useSelectedFiles(); const { selectedFileStubs } = useSelectedFiles();
const { getThumbnailFromCache, requestThumbnail } = useThumbnailGeneration();
// Get the first selected file for preview // Get the first selected file for preview
const selectedFile = useMemo(() => { const selectedStub = useMemo(() => {
return selectedFiles.length > 0 ? selectedFiles[0] : null; return selectedFileStubs.length > 0 ? selectedFileStubs[0] : null;
}, [selectedFiles]); }, [selectedFileStubs]);
// Get thumbnail for the selected file // Get thumbnail for the selected file
const [thumbnail, setThumbnail] = useState<string | null>(null); const [thumbnail, setThumbnail] = useState<string | null>(null);
useEffect(() => { useEffect(() => {
if (!selectedFile) { setThumbnail(selectedStub?.thumbnailUrl || null);
setThumbnail(null); }, [selectedStub]);
return;
}
const pageId = `${selectedFile.fileId}-1`;
// Try to get cached thumbnail first
const cached = getThumbnailFromCache(pageId);
if (cached) {
setThumbnail(cached);
return;
}
// Request thumbnail if not cached
requestThumbnail(pageId, selectedFile, 1).then((result) => {
setThumbnail(result);
}).catch(() => {
setThumbnail(null);
});
}, [selectedFile, getThumbnailFromCache, requestThumbnail]);
// Calculate current angle display // Calculate current angle display
const currentAngle = parameters.parameters.angle; const currentAngle = parameters.parameters.angle;
@ -86,7 +65,7 @@ const RotateSettings = ({ parameters, disabled = false }: RotateSettingsProps) =
}} }}
> >
<DocumentThumbnail <DocumentThumbnail
file={selectedFile} file={selectedStub}
thumbnail={thumbnail} thumbnail={thumbnail}
/> />
</Box> </Box>

View File

@ -123,12 +123,12 @@ export function useStirlingFileStub(fileId: FileId): { file?: File; record?: Sti
/** /**
* Hook for all files (use sparingly - causes re-renders on file list changes) * Hook for all files (use sparingly - causes re-renders on file list changes)
*/ */
export function useAllFiles(): { files: StirlingFile[]; records: StirlingFileStub[]; fileIds: FileId[] } { export function useAllFiles(): { files: StirlingFile[]; fileStubs: StirlingFileStub[]; fileIds: FileId[] } {
const { state, selectors } = useFileState(); const { state, selectors } = useFileState();
return useMemo(() => ({ return useMemo(() => ({
files: selectors.getFiles(), files: selectors.getFiles(),
records: selectors.getStirlingFileStubs(), fileStubs: selectors.getStirlingFileStubs(),
fileIds: state.files.ids fileIds: state.files.ids
}), [state.files.ids, selectors]); }), [state.files.ids, selectors]);
} }
@ -136,12 +136,12 @@ export function useAllFiles(): { files: StirlingFile[]; records: StirlingFileStu
/** /**
* Hook for selected files (optimized for selection-based UI) * Hook for selected files (optimized for selection-based UI)
*/ */
export function useSelectedFiles(): { selectedFiles: StirlingFile[]; selectedRecords: StirlingFileStub[]; selectedFileIds: FileId[] } { export function useSelectedFiles(): { selectedFiles: StirlingFile[]; selectedFileStubs: StirlingFileStub[]; selectedFileIds: FileId[] } {
const { state, selectors } = useFileState(); const { state, selectors } = useFileState();
return useMemo(() => ({ return useMemo(() => ({
selectedFiles: selectors.getSelectedFiles(), selectedFiles: selectors.getSelectedFiles(),
selectedRecords: selectors.getSelectedStirlingFileStubs(), selectedFileStubs: selectors.getSelectedStirlingFileStubs(),
selectedFileIds: state.ui.selectedFileIds selectedFileIds: state.ui.selectedFileIds
}), [state.ui.selectedFileIds, selectors]); }), [state.ui.selectedFileIds, selectors]);
} }

View File

@ -16,7 +16,7 @@ const Merge = (props: BaseToolProps) => {
// File selection hooks for custom sorting // File selection hooks for custom sorting
const { fileIds } = useAllFiles(); const { fileIds } = useAllFiles();
const { selectedRecords } = useSelectedFiles(); const { selectedFileStubs } = useSelectedFiles();
const { reorderFiles } = useFileManagement(); const { reorderFiles } = useFileManagement();
const base = useBaseTool( const base = useBaseTool(
@ -29,23 +29,23 @@ const Merge = (props: BaseToolProps) => {
// Custom file sorting logic for merge tool // Custom file sorting logic for merge tool
const sortFiles = useCallback((sortType: 'filename' | 'dateModified', ascending: boolean = true) => { const sortFiles = useCallback((sortType: 'filename' | 'dateModified', ascending: boolean = true) => {
const sortedRecords = [...selectedRecords].sort((recordA, recordB) => { const sortedStubs = [...selectedFileStubs].sort((stubA, stubB) => {
let comparison = 0; let comparison = 0;
switch (sortType) { switch (sortType) {
case 'filename': case 'filename':
comparison = recordA.name.localeCompare(recordB.name); comparison = stubA.name.localeCompare(stubB.name);
break; break;
case 'dateModified': case 'dateModified':
comparison = recordA.lastModified - recordB.lastModified; comparison = stubA.lastModified - stubB.lastModified;
break; break;
} }
return ascending ? comparison : -comparison; return ascending ? comparison : -comparison;
}); });
const selectedIds = sortedRecords.map(record => record.id); const selectedIds = sortedStubs.map(record => record.id);
const deselectedIds = fileIds.filter(id => !selectedIds.includes(id)); const deselectedIds = fileIds.filter(id => !selectedIds.includes(id));
reorderFiles([...selectedIds, ...deselectedIds]); reorderFiles([...selectedIds, ...deselectedIds]);
}, [selectedRecords, fileIds, reorderFiles]); }, [selectedFileStubs, fileIds, reorderFiles]);
return createToolFlow({ return createToolFlow({
files: { files: {