Merge branch 'feature/v2/multiselect' of https://github.com/Stirling-Tools/Stirling-PDF into feature/v2/multiselect

This commit is contained in:
Reece 2025-07-23 10:46:28 +01:00
commit 1192e3b5d5

View File

@ -14,33 +14,27 @@ interface FileSelectionProviderProps {
const FileSelectionContext = createContext<FileSelectionContextValue | undefined>(undefined); const FileSelectionContext = createContext<FileSelectionContextValue | undefined>(undefined);
export function FileSelectionProvider({ children }: FileSelectionProviderProps) { export function FileSelectionProvider({ children }: FileSelectionProviderProps) {
// State
const [selectedFiles, setSelectedFiles] = useState<File[]>([]); const [selectedFiles, setSelectedFiles] = useState<File[]>([]);
const [maxFiles, setMaxFiles] = useState<MaxFiles>(-1); // Default: unlimited const [maxFiles, setMaxFiles] = useState<MaxFiles>(-1);
const [isToolMode, setIsToolMode] = useState<boolean>(false); const [isToolMode, setIsToolMode] = useState<boolean>(false);
// Actions
const clearSelection = useCallback(() => { const clearSelection = useCallback(() => {
setSelectedFiles([]); setSelectedFiles([]);
}, []); }, []);
// Computed properties
const selectionCount = selectedFiles.length; const selectionCount = selectedFiles.length;
const canSelectMore = maxFiles === -1 || selectionCount < maxFiles; const canSelectMore = maxFiles === -1 || selectionCount < maxFiles;
const isAtLimit = maxFiles > 0 && selectionCount >= maxFiles; const isAtLimit = maxFiles > 0 && selectionCount >= maxFiles;
const isMultiFileMode = maxFiles !== 1; const isMultiFileMode = maxFiles !== 1;
const contextValue: FileSelectionContextValue = { const contextValue: FileSelectionContextValue = {
// State
selectedFiles, selectedFiles,
maxFiles, maxFiles,
isToolMode, isToolMode,
// Actions
setSelectedFiles, setSelectedFiles,
setMaxFiles, setMaxFiles,
setIsToolMode, setIsToolMode,
clearSelection, clearSelection,
// Computed
canSelectMore, canSelectMore,
isAtLimit, isAtLimit,
selectionCount, selectionCount,
@ -54,7 +48,6 @@ export function FileSelectionProvider({ children }: FileSelectionProviderProps)
); );
} }
// Custom hook to use the context
export function useFileSelection(): FileSelectionContextValue { export function useFileSelection(): FileSelectionContextValue {
const context = useContext(FileSelectionContext); const context = useContext(FileSelectionContext);
if (!context) { if (!context) {
@ -63,7 +56,6 @@ export function useFileSelection(): FileSelectionContextValue {
return context; return context;
} }
// Helper hooks for specific use cases with strict typing
export function useToolFileSelection(): Pick<FileSelectionContextValue, 'selectedFiles' | 'maxFiles' | 'canSelectMore' | 'isAtLimit' | 'selectionCount'> { export function useToolFileSelection(): Pick<FileSelectionContextValue, 'selectedFiles' | 'maxFiles' | 'canSelectMore' | 'isAtLimit' | 'selectionCount'> {
const { selectedFiles, maxFiles, canSelectMore, isAtLimit, selectionCount } = useFileSelection(); const { selectedFiles, maxFiles, canSelectMore, isAtLimit, selectionCount } = useFileSelection();
return { selectedFiles, maxFiles, canSelectMore, isAtLimit, selectionCount }; return { selectedFiles, maxFiles, canSelectMore, isAtLimit, selectionCount };
@ -82,4 +74,4 @@ export function useFileSelectionState(): Pick<FileSelectionContextValue, 'select
export function useFileSelectionComputed(): Pick<FileSelectionContextValue, 'canSelectMore' | 'isAtLimit' | 'selectionCount' | 'isMultiFileMode'> { export function useFileSelectionComputed(): Pick<FileSelectionContextValue, 'canSelectMore' | 'isAtLimit' | 'selectionCount' | 'isMultiFileMode'> {
const { canSelectMore, isAtLimit, selectionCount, isMultiFileMode } = useFileSelection(); const { canSelectMore, isAtLimit, selectionCount, isMultiFileMode } = useFileSelection();
return { canSelectMore, isAtLimit, selectionCount, isMultiFileMode }; return { canSelectMore, isAtLimit, selectionCount, isMultiFileMode };
} }