typescript
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
import { openOcrTextInNewTab } from '../utils/ocr';
|
||||
|
||||
type ResolveApiPath = (path: string) => string;
|
||||
type EnsurePreviewData = (id: string | number) => Promise<void>;
|
||||
type EnsureAssetUrl = (id: string | number, asset: unknown, options?: unknown) => Promise<unknown>;
|
||||
type GetDocumentAsset = (document: DocumentLike, type: string) => unknown;
|
||||
|
||||
interface DocumentVersion {
|
||||
download_path?: string | null;
|
||||
}
|
||||
|
||||
export interface DocumentLike {
|
||||
id?: string | number;
|
||||
current_version?: DocumentVersion | null;
|
||||
}
|
||||
|
||||
const asyncFalse = async () => false;
|
||||
|
||||
const resolveDocumentDownloadHref = (document: DocumentLike | null | undefined, resolveApiPath?: ResolveApiPath | null): string | null => {
|
||||
if (!document || !resolveApiPath) {
|
||||
return null;
|
||||
}
|
||||
const downloadPath = document.current_version?.download_path;
|
||||
if (!downloadPath) {
|
||||
return null;
|
||||
}
|
||||
return resolveApiPath(downloadPath);
|
||||
};
|
||||
|
||||
const hasDocumentOcrAsset = (document: DocumentLike | null | undefined, getDocumentAsset?: GetDocumentAsset | null): boolean => {
|
||||
if (!document || !getDocumentAsset) {
|
||||
return false;
|
||||
}
|
||||
return Boolean(getDocumentAsset(document, 'ocr-text'));
|
||||
};
|
||||
|
||||
interface CreateDocumentActionStateArgs {
|
||||
document: DocumentLike | null;
|
||||
resolveApiPath?: ResolveApiPath | null;
|
||||
ensurePreviewData: EnsurePreviewData;
|
||||
ensureAssetUrl: EnsureAssetUrl;
|
||||
getDocumentAsset?: GetDocumentAsset | null;
|
||||
notifyApiError?: (error: unknown, message: string) => void;
|
||||
ocrErrorMessage?: string;
|
||||
}
|
||||
|
||||
export const createDocumentActionState = ({
|
||||
document,
|
||||
resolveApiPath,
|
||||
ensurePreviewData,
|
||||
ensureAssetUrl,
|
||||
getDocumentAsset,
|
||||
notifyApiError,
|
||||
ocrErrorMessage = 'Unable to open OCR text.',
|
||||
}: CreateDocumentActionStateArgs) => {
|
||||
if (!document) {
|
||||
return {
|
||||
downloadHref: null,
|
||||
hasOcr: false,
|
||||
openOcr: asyncFalse,
|
||||
};
|
||||
}
|
||||
|
||||
const downloadHref = resolveDocumentDownloadHref(document, resolveApiPath);
|
||||
const hasOcr = hasDocumentOcrAsset(document, getDocumentAsset);
|
||||
|
||||
const openOcr = hasOcr
|
||||
? async () => {
|
||||
try {
|
||||
const success = await openOcrTextInNewTab({
|
||||
document,
|
||||
ensurePreviewData,
|
||||
getDocumentAsset,
|
||||
ensureAssetUrl,
|
||||
});
|
||||
if (!success) {
|
||||
notifyApiError?.(new Error('OCR text URL unavailable.'), ocrErrorMessage);
|
||||
}
|
||||
return success;
|
||||
} catch (error) {
|
||||
notifyApiError?.(error, ocrErrorMessage);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
: asyncFalse;
|
||||
|
||||
return {
|
||||
downloadHref,
|
||||
hasOcr,
|
||||
openOcr,
|
||||
};
|
||||
};
|
||||
|
||||
export const documentActionsTestExports = {
|
||||
resolveDocumentDownloadHref,
|
||||
hasDocumentOcrAsset,
|
||||
};
|
||||
Reference in New Issue
Block a user