This commit is contained in:
2026-07-15 18:40:04 -05:00
parent 5c69c40453
commit 84b7ee0a47
2 changed files with 98 additions and 86 deletions

View File

@@ -39,10 +39,8 @@ class PdfViewer {
}
_setState(state) {
this.loadingDiv.hidden = true;
this.errorDiv.hidden = true;
if (state === "loading") this.loadingDiv.hidden = false;
if (state === "error") this.errorDiv.hidden = false;
this.loadingDiv.hidden = state !== "loading";
this.errorDiv.hidden = state !== "error";
this._viewerState = state;
}
@@ -59,7 +57,6 @@ class PdfViewer {
`[BizMatch QC] PDF viewer load started: generation ${generation}`,
);
// Await cleanup of previous document (promises may be involved)
await this._disposeCurrentDocument();
if (generation !== this.generation) return;
@@ -90,14 +87,14 @@ class PdfViewer {
const viewerWidth = this._getViewportWidth();
console.log(`[BizMatch QC] PDF usable render width: ${viewerWidth}px`);
const pageStart = performance.now();
// Render page 1 -- MUST succeed before we show ready state
await this._renderPage(doc, 1, viewerWidth, generation);
if (generation !== this.generation) return;
this._setState(null); // Remove loading overlay
const firstPageMs = Math.round(performance.now() - pageStart);
this._setState("ready");
console.log(
`[BizMatch QC] PDF page 1 rendered in ${firstPageMs}ms`,
`[BizMatch QC] PDF page 1 rendered in ${
Math.round(performance.now() - loadStart)
}ms`,
);
console.log(
`[BizMatch QC] First page visible after ${
@@ -127,15 +124,12 @@ class PdfViewer {
);
} catch (err) {
if (generation !== this.generation) return;
// Distinguish cancellation from real errors
if (isCancellationError(err)) {
console.log(
`[BizMatch QC] PDF generation ${generation} cancelled`,
);
console.log(`[BizMatch QC] PDF generation ${generation} cancelled`);
return;
}
const msg = errorMsg(err);
console.error(`[BizMatch QC] PDF load failed:`, msg);
console.error(`[BizMatch QC] PDF load failed:`, msg, err?.stack);
this.errorMsg.textContent = `Unable to open PDF: ${msg}`;
this._setState("error");
}
@@ -197,19 +191,20 @@ class PdfViewer {
const fitScale = viewerWidth / vp1.width;
const viewport = page.getViewport({ scale: fitScale });
const dpr = Math.min(globalThis.devicePixelRatio || 1, 2);
// Use DPR 1 for initial diagnosis; restore DPR scaling after content renders
const dpr = 1;
canvas.width = Math.floor(viewport.width * dpr);
canvas.height = Math.floor(viewport.height * dpr);
canvas.style.width = `${Math.floor(viewport.width)}px`;
canvas.style.height = `${Math.floor(viewport.height)}px`;
const ctx = canvas.getContext("2d");
const transform = dpr !== 1 ? [dpr, 0, 0, dpr, 0, 0] : undefined;
if (!ctx) throw new Error("2D canvas context is unavailable");
const renderTask = page.render({
canvasContext: ctx,
canvas,
viewport,
transform,
transform: undefined,
});
this.renderTasks.add(renderTask);
@@ -220,21 +215,27 @@ class PdfViewer {
pageDiv.dataset.renderState = "rendered";
} catch (err) {
if (generation !== this.generation) return;
if (isCancellationError(err)) return;
pageDiv.dataset.renderState = "error";
if (isCancellationError(err)) throw err;
console.error(
`[BizMatch QC] Failed to render PDF page ${pageNum}`,
`[BizMatch QC] Page ${pageNum} render failed`,
err,
err?.stack,
);
if (pageNum === 1) {
this.errorMsg.textContent = `Unable to open PDF: ${errorMsg(err)}`;
this._setState("error");
} else {
pageDiv.textContent = `Error rendering page ${pageNum}`;
pageDiv.style.padding = "20px";
pageDiv.style.color = "#f88";
pageDiv.style.textAlign = "center";
throw new Error(
`Failed to render page 1: ${errorMsg(err)}`,
{ cause: err },
);
}
// Inline error for later pages
pageDiv.textContent = `Error rendering page ${pageNum}`;
pageDiv.style.padding = "20px";
pageDiv.style.color = "#f88";
pageDiv.style.textAlign = "center";
pageDiv.dataset.renderState = "error";
}
}