mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-08-08 21:45:33 +00:00
50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import { useMemo } from 'react';
|
|
|
|
/**
|
|
* Hook to convert a File object to { file: File; url: string } format
|
|
* Creates blob URL on-demand and handles cleanup
|
|
*/
|
|
export function useFileWithUrl(file: File | null): { file: File; url: string } | null {
|
|
return useMemo(() => {
|
|
if (!file) return null;
|
|
|
|
// Validate that file is a proper File or Blob object
|
|
if (!(file instanceof File) && !(file instanceof Blob)) {
|
|
console.warn('useFileWithUrl: Expected File or Blob, got:', file);
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
const url = URL.createObjectURL(file);
|
|
|
|
// Return object with cleanup function
|
|
const result = { file, url };
|
|
|
|
// Store cleanup function for later use
|
|
(result as any)._cleanup = () => URL.revokeObjectURL(url);
|
|
|
|
return result;
|
|
} catch (error) {
|
|
console.error('useFileWithUrl: Failed to create object URL:', error, file);
|
|
return null;
|
|
}
|
|
}, [file]);
|
|
}
|
|
|
|
/**
|
|
* Hook variant that returns cleanup function separately
|
|
*/
|
|
export function useFileWithUrlAndCleanup(file: File | null): {
|
|
fileObj: { file: File; url: string } | null;
|
|
cleanup: () => void;
|
|
} {
|
|
return useMemo(() => {
|
|
if (!file) return { fileObj: null, cleanup: () => {} };
|
|
|
|
const url = URL.createObjectURL(file);
|
|
const fileObj = { file, url };
|
|
const cleanup = () => URL.revokeObjectURL(url);
|
|
|
|
return { fileObj, cleanup };
|
|
}, [file]);
|
|
} |