From 76039f7bf3247ef9711113608f5ec2d01a7fa56f Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Thu, 8 Oct 2026 03:06:55 +0500 Subject: [PATCH] fix: image decode error i18n --- docs/backlog.md | 2 -- web/src/lib/core/io.ts | 12 ++++++++++-- web/src/lib/i18n/en.ts | 2 ++ web/src/lib/i18n/ru.ts | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/backlog.md b/docs/backlog.md index 22258a1..36dde27 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -176,8 +176,6 @@ в дизайне, а где должен быть 0 - [ ] Component-тесты `SchemaToolView`/`SchemaPreview` требуют отдельного решения: node Vitest не имеет DOM/canvas, а e2e уже покрывает поведение. -- [ ] Ошибка декодирования изображения из `createImageBitmap` пока показывается - сырым сообщением браузера; нужен `ToolError`-маппер и i18n-ключ. - [ ] **Идея 13. Контраст текста на акцентных кнопках — частично закрыт**. Тона `--color-main`/`--color-accent` подняты под текущий порог `palette.test.ts`; targeted-тест проходит. Light-тема всё ещё ниже AA 4.5 diff --git a/web/src/lib/core/io.ts b/web/src/lib/core/io.ts index 2f02e30..1e20eff 100644 --- a/web/src/lib/core/io.ts +++ b/web/src/lib/core/io.ts @@ -59,6 +59,14 @@ export function unsupportedImageError(file: File): ToolError { }); } +async function toBitmap(source: Blob | File): Promise { + try { + return await createImageBitmap(source); + } catch { + throw new ToolError("errors.imageDecode"); + } +} + async function decodeBitmap(bitmap: ImageBitmap): Promise { const canvas = document.createElement("canvas"); canvas.width = bitmap.width; @@ -77,7 +85,7 @@ async function decodeBitmap(bitmap: ImageBitmap): Promise { } export async function decodeFile(file: File): Promise { - const bitmap = await createImageBitmap(file); + const bitmap = await toBitmap(file); try { return await decodeBitmap(bitmap); } finally { @@ -89,7 +97,7 @@ export async function decodeBytes( bytes: Uint8Array, ): Promise { const blob = new Blob([bytes]); - const bitmap = await createImageBitmap(blob); + const bitmap = await toBitmap(blob); try { return await decodeBitmap(bitmap); } finally { diff --git a/web/src/lib/i18n/en.ts b/web/src/lib/i18n/en.ts index cf4d7d3..b1d562c 100644 --- a/web/src/lib/i18n/en.ts +++ b/web/src/lib/i18n/en.ts @@ -192,6 +192,8 @@ export const en: Dict = { "Crop area doesn't fit: offset plus size exceeds the image bounds", noCanvasCtx: "Canvas 2D context is unavailable in this environment", badBase64: "Expected a base64 string or a data-uri of an image", + imageDecode: + "Can't read the image — the file is corrupted or the format is unsupported", qualityRange: "quality must be within 0..1", svgSize: "Could not determine SVG dimensions", svgLoad: "Failed to load SVG — check the markup", diff --git a/web/src/lib/i18n/ru.ts b/web/src/lib/i18n/ru.ts index 82b3d96..d574f26 100644 --- a/web/src/lib/i18n/ru.ts +++ b/web/src/lib/i18n/ru.ts @@ -193,6 +193,8 @@ export const ru: Dict = { "Область не помещается: смещение + размер превышают границы изображения", noCanvasCtx: "Canvas 2D context недоступен в этом окружении", badBase64: "Ожидается base64-строка или data-uri изображения", + imageDecode: + "Не удалось прочитать изображение — файл повреждён или формат не поддерживается", qualityRange: "quality должно быть в диапазоне 0..1", svgSize: "Не удалось определить размер SVG", svgLoad: "Не удалось загрузить SVG — проверьте разметку",