import { useTranslation } from 'react-i18next'; import { SettingDefinition } from '../../api/adminSettings'; import { cn } from '../../lib/utils'; import { StarIcon, LockIcon, RefreshIcon } from './icons'; import { SettingInput } from './SettingInput'; import { Toggle } from './Toggle'; import { formatSettingKey, stripHtml } from './utils'; interface SettingsTableRowProps { setting: SettingDefinition; isFavorite: boolean; onToggleFavorite: () => void; onUpdate: (value: string) => void; onReset: () => void; isUpdating?: boolean; isResetting?: boolean; isLast?: boolean; className?: string; } export function SettingsTableRow({ setting, isFavorite, onToggleFavorite, onUpdate, onReset, isUpdating, isResetting, isLast, className, }: SettingsTableRowProps) { const { t } = useTranslation(); const formattedKey = formatSettingKey(setting.name || setting.key); const displayName = t(`admin.settings.settingNames.${formattedKey}`, formattedKey); const description = setting.hint?.description ? stripHtml(setting.hint.description) : null; const isModified = setting.has_override; const isBool = setting.type === 'bool'; const boolChecked = setting.current === true || setting.current === 'true'; // env-locked keys are pinned in .env and shadow the DB — show value, no input. const locked = setting.read_only || setting.env_locked; const isLongValue = (() => { const val = String(setting.current ?? ''); const key = setting.key.toLowerCase(); return ( val.length > 50 || val.includes('\n') || val.startsWith('[') || val.startsWith('{') || key.includes('_items') || key.includes('_config') || key.includes('_keywords') || key.includes('_template') || key.includes('_packages') || key.includes('_list') || key.includes('_json') || key.includes('_periods') || key.includes('_discounts') ); })(); return (
{setting.key}
{description}
)}