import React, { useState, useEffect } from 'react'; import { updateAsset, getTaxonomyMeta } from '../../../services/assets-api'; import type { Asset, TaxonomyMeta } from '../../../types/assets'; import Modal from '../../../components/ui/Modal'; import Button from '../../../components/ui/Button'; import { useToast } from '../../../hooks/use-toast'; interface EditAssetModalProps { isOpen: boolean; onClose: () => void; asset: Asset | null; onSuccess: () => void; } export const EditAssetModal: React.FC = ({ isOpen, onClose, asset, onSuccess }) => { const { success, error } = useToast(); const [taxonomyMeta, setTaxonomyMeta] = useState(null); const [editVerticalIds, setEditVerticalIds] = useState([]); const [editTechStackIds, setEditTechStackIds] = useState([]); const [editEngagementTypeIds, setEditEngagementTypeIds] = useState([]); const [editComplianceIds, setEditComplianceIds] = useState([]); const [editTitle, setEditTitle] = useState(''); const [editDescription, setEditDescription] = useState(''); const [editCategory, setEditCategory] = useState('Marketing'); const [editSubcategory, setEditSubcategory] = useState(''); const [editTags, setEditTags] = useState(''); const [editGithubUrl, setEditGithubUrl] = useState(''); const [editIsDownloadable, setEditIsDownloadable] = useState(true); const [isSavingEdit, setIsSavingEdit] = useState(false); useEffect(() => { getTaxonomyMeta().then(setTaxonomyMeta).catch(console.error); }, []); useEffect(() => { if (asset) { setEditTitle(asset.title); setEditDescription(asset.description || ''); setEditCategory(asset.categoryId || 'Marketing'); setEditSubcategory(asset.subcategory || ''); setEditTags(asset.tags.join(', ')); setEditGithubUrl(asset.githubUrl || ''); setEditIsDownloadable(asset.isDownloadable); setEditVerticalIds(asset.verticals ? asset.verticals.map(v => v.id) : []); setEditTechStackIds(asset.techStacks ? asset.techStacks.map(t => t.id) : []); setEditEngagementTypeIds(asset.engagementTypes ? asset.engagementTypes.map(e => e.id) : []); setEditComplianceIds(asset.complianceStandards ? asset.complianceStandards.map(c => c.id) : []); } }, [asset]); const toggleSelection = (list: string[], item: string) => { return list.includes(item) ? list.filter(i => i !== item) : [...list, item]; }; const handleEditSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!asset) return; setIsSavingEdit(true); try { await updateAsset(asset.id, { title: editTitle, description: editDescription, categoryId: editCategory, subcategory: editSubcategory, verticalIds: editVerticalIds, techStackIds: editTechStackIds, engagementTypeIds: editEngagementTypeIds, complianceIds: editComplianceIds, tags: editTags.split(',').map(t => t.trim()).filter(Boolean), githubUrl: editGithubUrl, isDownloadable: editIsDownloadable, }); success('Changes saved successfully', 'Asset details have been updated.'); onSuccess(); onClose(); } catch (err: any) { console.error('Failed to save asset details', err); error('Failed to save changes', err.response?.data?.error || 'Something went wrong.'); } finally { setIsSavingEdit(false); } }; return ( } > {asset && (
setEditTitle(e.target.value)} required className="w-full bg-ink-50 border border-ink-200 rounded-lg px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ink-900/10 text-ink-900 placeholder-ink-400" />
{/* 4-Group Taxonomy Demarcation Selection */}

Taxonomy Classification (Strict Admin-Managed)

{/* Group 1: Industry Verticals */}
{(taxonomyMeta?.verticals || []).map(v => { const isSelected = editVerticalIds.includes(v.id); return ( ); })}
{/* Group 2: Tech Stack */}
{['Languages & Frameworks', 'AI & ML', 'Data & Backend', 'Cloud & Infra'].map(catName => { const items = (taxonomyMeta?.techStacks || []).filter(t => t.category === catName || (!t.category && catName === 'Languages & Frameworks')); if (items.length === 0) return null; return (
{catName}
{items.map(t => { const isSelected = editTechStackIds.includes(t.id); return ( ); })}
); })}
{/* Group 3 & Group 4 Grid */}
{/* Group 3: Engagement Type */}
{(taxonomyMeta?.engagementTypes || []).map(e => { const isSelected = editEngagementTypeIds.includes(e.id); return ( ); })}
{/* Group 4: Compliance Standards */}
{(taxonomyMeta?.complianceStandards || []).map(c => { const isSelected = editComplianceIds.includes(c.id); return ( ); })}