chore(ui): remove unused HeaderInputList and ModelInputList

These helpers were only consumed by the old AiProviders edit pages and
became orphaned after the providers refactor. modelInputListUtils.ts was
only used by ModelInputList, so it goes too.
This commit is contained in:
LTbinglingfeng
2026-05-25 23:03:36 +08:00
Unverified
parent 844385e1d3
commit 4142d91e9b
3 changed files with 0 additions and 213 deletions
-81
View File
@@ -1,81 +0,0 @@
import { Fragment } from 'react';
import { Button } from './Button';
import { IconX } from './icons';
import type { HeaderEntry } from '@/utils/headers';
interface HeaderInputListProps {
entries: HeaderEntry[];
onChange: (entries: HeaderEntry[]) => void;
addLabel: string;
disabled?: boolean;
keyPlaceholder?: string;
valuePlaceholder?: string;
removeButtonTitle?: string;
removeButtonAriaLabel?: string;
}
export function HeaderInputList({
entries,
onChange,
addLabel,
disabled = false,
keyPlaceholder = 'X-Custom-Header',
valuePlaceholder = 'value',
removeButtonTitle = 'Remove',
removeButtonAriaLabel = 'Remove',
}: HeaderInputListProps) {
const currentEntries = entries.length ? entries : [{ key: '', value: '' }];
const updateEntry = (index: number, field: 'key' | 'value', value: string) => {
const next = currentEntries.map((entry, idx) => (idx === index ? { ...entry, [field]: value } : entry));
onChange(next);
};
const addEntry = () => {
onChange([...currentEntries, { key: '', value: '' }]);
};
const removeEntry = (index: number) => {
const next = currentEntries.filter((_, idx) => idx !== index);
onChange(next.length ? next : [{ key: '', value: '' }]);
};
return (
<div className="header-input-list">
{currentEntries.map((entry, index) => (
<Fragment key={index}>
<div className="header-input-row">
<input
className="input"
placeholder={keyPlaceholder}
value={entry.key}
onChange={(e) => updateEntry(index, 'key', e.target.value)}
disabled={disabled}
/>
<span className="header-separator">:</span>
<input
className="input"
placeholder={valuePlaceholder}
value={entry.value}
onChange={(e) => updateEntry(index, 'value', e.target.value)}
disabled={disabled}
/>
<Button
variant="ghost"
size="sm"
onClick={() => removeEntry(index)}
disabled={disabled || currentEntries.length <= 1}
title={removeButtonTitle}
aria-label={removeButtonAriaLabel}
>
<IconX size={14} />
</Button>
</div>
</Fragment>
))}
<Button variant="secondary" size="sm" onClick={addEntry} disabled={disabled} className="align-start">
{addLabel}
</Button>
</div>
);
}
-103
View File
@@ -1,103 +0,0 @@
import { Fragment } from 'react';
import { Button } from './Button';
import { IconX } from './icons';
import type { ModelEntry } from './modelInputListUtils';
interface ModelInputListProps {
entries: ModelEntry[];
onChange: (entries: ModelEntry[]) => void;
addLabel?: string;
disabled?: boolean;
namePlaceholder?: string;
aliasPlaceholder?: string;
hideAddButton?: boolean;
onAdd?: () => void;
className?: string;
rowClassName?: string;
inputClassName?: string;
removeButtonClassName?: string;
removeButtonTitle?: string;
removeButtonAriaLabel?: string;
}
export function ModelInputList({
entries,
onChange,
addLabel,
disabled = false,
namePlaceholder = 'model-name',
aliasPlaceholder = 'alias (optional)',
hideAddButton = false,
onAdd,
className = '',
rowClassName = '',
inputClassName = '',
removeButtonClassName = '',
removeButtonTitle = 'Remove',
removeButtonAriaLabel = 'Remove',
}: ModelInputListProps) {
const currentEntries = entries.length ? entries : [{ name: '', alias: '' }];
const containerClassName = ['header-input-list', className].filter(Boolean).join(' ');
const inputClassNames = ['input', inputClassName].filter(Boolean).join(' ');
const rowClassNames = ['header-input-row', rowClassName].filter(Boolean).join(' ');
const updateEntry = (index: number, field: 'name' | 'alias', value: string) => {
const next = currentEntries.map((entry, idx) => (idx === index ? { ...entry, [field]: value } : entry));
onChange(next);
};
const addEntry = () => {
if (onAdd) {
onAdd();
} else {
onChange([...currentEntries, { name: '', alias: '' }]);
}
};
const removeEntry = (index: number) => {
const next = currentEntries.filter((_, idx) => idx !== index);
onChange(next.length ? next : [{ name: '', alias: '' }]);
};
return (
<div className={containerClassName}>
{currentEntries.map((entry, index) => (
<Fragment key={index}>
<div className={rowClassNames}>
<input
className={inputClassNames}
placeholder={namePlaceholder}
value={entry.name}
onChange={(e) => updateEntry(index, 'name', e.target.value)}
disabled={disabled}
/>
<span className="header-separator"></span>
<input
className={inputClassNames}
placeholder={aliasPlaceholder}
value={entry.alias}
onChange={(e) => updateEntry(index, 'alias', e.target.value)}
disabled={disabled}
/>
<Button
variant="ghost"
size="sm"
onClick={() => removeEntry(index)}
disabled={disabled || currentEntries.length <= 1}
className={removeButtonClassName}
title={removeButtonTitle}
aria-label={removeButtonAriaLabel}
>
<IconX size={14} />
</Button>
</div>
</Fragment>
))}
{!hideAddButton && addLabel && (
<Button variant="secondary" size="sm" onClick={addEntry} disabled={disabled} className="align-start">
{addLabel}
</Button>
)}
</div>
);
}
-29
View File
@@ -1,29 +0,0 @@
import type { ModelAlias } from '@/types';
export interface ModelEntry {
name: string;
alias: string;
}
export const modelsToEntries = (models?: ModelAlias[]): ModelEntry[] => {
if (!Array.isArray(models) || models.length === 0) {
return [{ name: '', alias: '' }];
}
return models.map((model) => ({
name: model.name || '',
alias: model.alias || ''
}));
};
export const entriesToModels = (entries: ModelEntry[]): ModelAlias[] => {
return entries
.filter((entry) => entry.name.trim())
.map((entry) => {
const model: ModelAlias = { name: entry.name.trim() };
const alias = entry.alias.trim();
if (alias && alias !== model.name) {
model.alias = alias;
}
return model;
});
};