"use client"; import React, { useState } from 'react'; import { X, Plus, Tag } from 'lucide-react'; import { catalogService } from '@/services/api/catalogService'; interface CreateAttributeModalProps { isOpen: boolean; onClose: () => void; onSuccess: (newAttr: { attribute_id: string; name: string; code: string }) => void; } export const CreateAttributeModal: React.FC = ({ isOpen, onClose, onSuccess }) => { const [name, setName] = useState(''); const [code, setCode] = useState(''); const [presetValuesStr, setPresetValuesStr] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); if (!isOpen) return null; const handleNameChange = (val: string) => { setName(val); if (!code) { setCode(val.toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '')); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!name.trim() || !code.trim()) { setError('Name and Code are required.'); return; } setLoading(true); setError(''); try { const presets = presetValuesStr .split(',') .map(v => v.trim()) .filter(Boolean); const created = await catalogService.createAttribute({ name: name.trim(), code: code.trim(), preset_values: presets.length ? presets : undefined }); onSuccess({ attribute_id: created.attribute_id, name: created.name, code: created.code }); setName(''); setCode(''); setPresetValuesStr(''); onClose(); } catch (err: any) { console.error('Failed to create attribute type:', err); setError(err?.message || 'Failed to create attribute type.'); } finally { setLoading(false); } }; return (

Create New Attribute Type

{error && (
{error}
)}
handleNameChange(e.target.value)} placeholder="e.g. Screen Quality, Storage Capacity" className="w-full bg-slate-850 border border-slate-700/70 rounded-xl px-3.5 py-2 text-xs text-white focus:outline-none focus:border-red-500 transition-colors" />
setCode(e.target.value)} placeholder="e.g. screen_quality, storage" className="w-full bg-slate-850 border border-slate-700/70 rounded-xl px-3.5 py-2 text-xs text-white focus:outline-none focus:border-red-500 transition-colors font-mono" />
setPresetValuesStr(e.target.value)} placeholder="e.g. OLED, Incell, Original" className="w-full bg-slate-850 border border-slate-700/70 rounded-xl px-3.5 py-2 text-xs text-white focus:outline-none focus:border-red-500 transition-colors" />
); };