{bgImage && (
)}
{bgImage && isImage && (
预览效果
)}
{bgImage && isTheme && (
当前为自适应纯色背景
)}
{bgImage && isSolidColor && (
纯色背景 ({bgImage})
)}
);
};
const renderBrandPreview = (key: BrandPreviewKey) => {
const previewUrl = (configs[key] || "").trim();
const appNamePreview = (configs.app_name || "").trim() || "应用名称";
const failed = previewLoadFailed[key] === true;
const showImage = previewUrl.length > 0 && !failed;
return (
实时预览
{key === "app_logo" ? (
{showImage ? (

setPreviewLoadFailed((prev) => ({ ...prev, [key]: true }))
}
onLoad={() =>
setPreviewLoadFailed((prev) => ({ ...prev, [key]: false }))
}
/>
) : (
LOGO
)}
{appNamePreview}
) : (
{showImage ? (

setPreviewLoadFailed((prev) => ({ ...prev, [key]: true }))
}
onLoad={() =>
setPreviewLoadFailed((prev) => ({ ...prev, [key]: false }))
}
/>
) : (
)}
{appNamePreview}
)}
{previewUrl.length === 0 ? (
上传图片后会实时显示预览
) : null}
{previewUrl.length > 0 && failed ? (
图片加载失败,请重新上传
) : null}
{previewUrl.length > 0 && !isPngDataURL(previewUrl) ? (
当前是旧版 URL 配置,建议重新上传图片以启用无闪烁加载
) : null}
);
};
const renderBrandAssetUploader = (
key: BrandPreviewKey,
isChanged: boolean,
) => {
const value = (configs[key] || "").trim();
const uploading = brandUploading[key] === true;
const isLogo = key === "app_logo";
const isCommercialDisabled = configs.is_commercial !== "true";
return (
{
void handleBrandFileChange(key, event);
}}
/>
仅支持图片文件,自动转换为 PNG
{isLogo
? "建议上传方形图片,系统会统一转换为 96x96 PNG"
: "建议上传方形图片,系统会统一转换为 64x64 PNG"}
{renderBrandPreview(key)}
);
};
// 渲染不同类型的配置项
const renderConfigItem = (item: ConfigItem) => {
const isChanged =
hasChanges && configs[item.key] !== originalConfigs[item.key];
const isCommercialDisabled =
["app_name", "app_logo", "app_favicon", "hide_footer_brand"].includes(
item.key,
) && configs.is_commercial !== "true";
switch (item.type) {
case "bg_image":
return renderBgImageUploader();
case "input":
if (isBrandPreviewKey(item.key)) {
return renderBrandAssetUploader(item.key, isChanged);
}
return (