feat(08-05-interaction-pattern-unification): 统一前端交互与反馈模式

这个提交包含在:
2026-08-07 06:50:40 +08:00
父节点 d4e9597b37
当前提交 94f1bad336
共修改 97 个文件,包含 784 行新增和 836 行删除
@@ -1,4 +1,5 @@
import { useCallback, useEffect, useRef, useState } from "react";
import { resolveErrorMessage } from "../../lib/resolveErrorMessage";
import { Button } from "../ui/button";
type BarcodeScannerPanelProps = {
@@ -22,13 +23,6 @@ type BrowserWithBarcodeDetector = Window & {
const SCAN_FORMATS = ["qr_code", "code_128", "code_39", "ean_13", "ean_8", "upc_a", "upc_e"];
function resolveErrorMessage(error: unknown) {
if (error instanceof Error && error.message) {
return error.message;
}
return "无法启动相机扫码,请改用手工输入。";
}
export function BarcodeScannerPanel({ disabled = false, onDetected }: BarcodeScannerPanelProps) {
const videoRef = useRef<HTMLVideoElement | null>(null);
const mediaStreamRef = useRef<MediaStream | null>(null);
@@ -166,9 +160,9 @@ export function BarcodeScannerPanel({ disabled = false, onDetected }: BarcodeSca
await startWithBarcodeDetector();
setIsStarting(false);
return;
} catch (detectorError) {
} catch {
stopScanner();
setError(`BarcodeDetector 启动失败,已回退到 ZXing:${resolveErrorMessage(detectorError)}`);
setError("");
}
}
@@ -176,7 +170,7 @@ export function BarcodeScannerPanel({ disabled = false, onDetected }: BarcodeSca
await startWithZxing();
} catch (fallbackError) {
stopScanner();
setError(resolveErrorMessage(fallbackError));
setError(resolveErrorMessage(fallbackError, "无法启动相机扫码,请改用手工输入。"));
}
setIsStarting(false);