feat: add validation for invalid status code entries in channel modal

- Introduced a new function to collect invalid status code entries from the status code mapping.
- Updated the EditChannelModal to display an error message if invalid status codes are detected.
- Enhanced localization files to include new error messages for invalid status codes in multiple languages.
- Removed unused styles from the RiskAcknowledgementModal for cleaner UI.
This commit is contained in:
CaIon
2026-02-22 21:36:38 +08:00
parent 7bc0bf21f3
commit bf03f277ac
10 changed files with 55 additions and 15 deletions

View File

@@ -44,8 +44,6 @@ const RiskMarkdownBlock = React.memo(function RiskMarkdownBlock({
className='rounded-lg'
style={{
border: '1px solid var(--semi-color-warning-light-hover)',
background:
'linear-gradient(180deg, var(--semi-color-warning-light-default) 0%, var(--semi-color-fill-0) 100%)',
padding: '12px',
contentVisibility: 'auto',
}}
@@ -136,15 +134,6 @@ const RiskAcknowledgementModal = React.memo(function RiskAcknowledgementModal({
}
>
<div className='flex flex-col gap-4'>
<div
className='rounded-lg'
style={{
border: '1px solid var(--semi-color-warning-light-hover)',
background: 'var(--semi-color-warning-light-default)',
padding: isMobile ? '10px 12px' : '12px 14px',
}}
>
</div>
<RiskMarkdownBlock markdownContent={markdownContent} />

View File

@@ -65,7 +65,10 @@ import StatusCodeRiskGuardModal from './StatusCodeRiskGuardModal';
import ChannelKeyDisplay from '../../../common/ui/ChannelKeyDisplay';
import { useSecureVerification } from '../../../../hooks/common/useSecureVerification';
import { createApiCalls } from '../../../../services/secureVerification';
import { collectNewDisallowedStatusCodeRedirects } from './statusCodeRiskGuard';
import {
collectInvalidStatusCodeEntries,
collectNewDisallowedStatusCodeRedirects,
} from './statusCodeRiskGuard';
import {
IconSave,
IconClose,
@@ -1377,6 +1380,16 @@ const EditChannelModal = (props) => {
}
}
const invalidStatusCodeEntries = collectInvalidStatusCodeEntries(
localInputs.status_code_mapping,
);
if (invalidStatusCodeEntries.length > 0) {
showError(
`${t('状态码复写包含无效的状态码')}: ${invalidStatusCodeEntries.join(', ')}`,
);
return;
}
const riskyStatusCodeRedirects = collectNewDisallowedStatusCodeRedirects(
initialStatusCodeMappingRef.current,
localInputs.status_code_mapping,

View File

@@ -44,6 +44,37 @@ function parseStatusCodeMappingTarget(rawValue) {
return null;
}
export function collectInvalidStatusCodeEntries(statusCodeMappingStr) {
if (
typeof statusCodeMappingStr !== 'string' ||
statusCodeMappingStr.trim() === ''
) {
return [];
}
let parsed;
try {
parsed = JSON.parse(statusCodeMappingStr);
} catch {
return [];
}
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
return [];
}
const invalid = [];
for (const [rawKey, rawValue] of Object.entries(parsed)) {
const fromCode = parseStatusCodeKey(rawKey);
const toCode = parseStatusCodeMappingTarget(rawValue);
if (fromCode === null || toCode === null) {
invalid.push(`${rawKey}${rawValue}`);
}
}
return invalid;
}
export function collectDisallowedStatusCodeRedirects(statusCodeMappingStr) {
if (
typeof statusCodeMappingStr !== 'string' ||