Fix modal overflow and search timeout warning
build-push / docker (push) Successful in 4m1s

This commit is contained in:
AI Assistant
2026-03-17 12:05:44 +09:00
parent 70c975c231
commit 0b68feff80
11 changed files with 367 additions and 45 deletions
+40 -2
View File
@@ -80,9 +80,11 @@ let cropEnd = 0;
let cropMax = 0;
let activeThumb = null;
let activeResultItem = null;
let activeResultModalSummaryRequest = 0;
const activePlatforms = new Set(["envato", "artgrid", "google video"]);
const hlsInstances = new WeakMap();
const debugEntries = [];
const summaryTranslationCache = new Map();
const PREVIEW_PLACEHOLDER = "https://placehold.co/1280x720/0a0a0a/ffffff?text=Preview";
function proxiedPreviewURL(src) {
@@ -484,10 +486,41 @@ function showResultModalGooglePanel(item, message = "") {
resultModalFallbackLabel.textContent = item.source || "Preview Fallback";
resultModalGoogleImage.src = hasUsableThumbnail(item.thumbnailUrl) ? item.thumbnailUrl : PREVIEW_PLACEHOLDER;
resultModalGoogleImage.alt = item.title || "";
resultModalGoogleText.textContent = message || item.previewBlockedReason || item.snippet || item.reason || "Open source page or use the primary action.";
resultModalGoogleText.textContent = summarizeReason(message || item.previewBlockedReason || item.snippet || item.reason || "Open source page or use the primary action.");
setHidden(resultModalGooglePanel, false, "flex");
}
async function translateSummaryForModal(item, originalText, requestId) {
const trimmed = String(originalText || "").trim();
if (!trimmed) {
return;
}
if (summaryTranslationCache.has(trimmed)) {
if (activeResultItem?.link === item.link && activeResultModalSummaryRequest === requestId) {
resultModalSnippet.textContent = summaryTranslationCache.get(trimmed);
}
return;
}
try {
const data = await api("/api/translate/summary", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text: trimmed }),
});
const translated = String(data.translatedText || "").trim();
if (!translated) {
return;
}
summaryTranslationCache.set(trimmed, translated);
if (activeResultItem?.link === item.link && activeResultModalSummaryRequest === requestId) {
resultModalSnippet.textContent = translated;
logEvent("result:modal:summary_translated", { title: item.title, source: item.source });
}
} catch (error) {
logEvent("result:modal:summary_translate_failed", { title: item.title, source: item.source, message: error.message });
}
}
function fallbackResultModalMedia(item, reason) {
logEvent("result:modal:fallback", { title: item.title, source: item.source, reason, mediaMode: item.mediaMode });
if (item.previewVideoUrl) {
@@ -582,10 +615,13 @@ function openResultModal(item) {
return;
}
activeResultItem = item;
activeResultModalSummaryRequest += 1;
const summaryRequestId = activeResultModalSummaryRequest;
resultModalTitle.textContent = item.title || "Untitled";
resultModalSource.textContent = item.source || "";
resultModalReason.textContent = summarizeReason(item.reason) || "AI 노트가 없습니다.";
resultModalSnippet.textContent = item.snippet || "원본 페이지에서 사용할 수 있는 설명이 없습니다.";
const originalSummary = item.snippet || "원본 페이지에서 사용할 수 있는 설명이 없습니다.";
resultModalSnippet.textContent = originalSummary;
resultModalOpenExternal.href = item.link || "#";
resultModalDownload.classList.toggle("hidden", !item.actionType);
resultModalDownload.textContent = item.actionLabel || "Open Source";
@@ -617,6 +653,7 @@ function openResultModal(item) {
fallbackResultModalMedia(item, fallbackReason);
}
showModal(resultModal);
void translateSummaryForModal(item, item.snippet, summaryRequestId);
logEvent("result:modal:open", { title: item.title, source: item.source, link: item.link });
}
@@ -627,6 +664,7 @@ function closeResultViewer() {
if (!resultModal.classList.contains("hidden")) {
logEvent("result:modal:close", { title: activeResultItem?.title || "" });
}
activeResultModalSummaryRequest += 1;
activeResultItem = null;
resetResultModalMedia();
hideModal(resultModal);