'use client' import { useState } from 'react' import { useSortable } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' import { useUpdateKeyword, useDeleteKeyword } from '@/hooks/useKeywords' import type { Keyword } from '@/lib/types' interface Props { keyword: Keyword } export default function KeywordRow({ keyword }: Props) { const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: keyword.id }) const updateKw = useUpdateKeyword() const deleteKw = useDeleteKeyword() const [editTerm, setEditTerm] = useState(false) const [editWeight, setEditWeight] = useState(false) const [termVal, setTermVal] = useState(keyword.term) const [weightVal, setWeightVal] = useState(String(keyword.weight)) const saveTerm = () => { updateKw.mutate({ id: keyword.id, data: { term: termVal } }); setEditTerm(false) } const saveWeight = () => { updateKw.mutate({ id: keyword.id, data: { weight: parseFloat(weightVal) } }); setEditWeight(false) } const style = { transform: CSS.Transform.toString(transform), transition } return ( {/* Drag handle */} ⋮⋮ {/* Term */} {editTerm ? ( setTermVal(e.target.value)} onBlur={saveTerm} onKeyDown={(e) => e.key === 'Enter' && saveTerm()} className="g-input h-7 text-sm py-0 w-full" /> ) : ( )} {/* Weight */} {editWeight ? ( setWeightVal(e.target.value)} onBlur={saveWeight} onKeyDown={(e) => e.key === 'Enter' && saveWeight()} className="g-input h-7 text-sm py-0 w-16 text-center font-mono" /> ) : ( )} {/* AI description */} {keyword.ai_target ? ( {keyword.ai_target.length > 48 ? keyword.ai_target.slice(0, 48) + '…' : keyword.ai_target} ) : ( Not set )} {/* Price range */} {(keyword.min_price || keyword.max_price) ? ( {[keyword.min_price ? `≥$${keyword.min_price}` : '', keyword.max_price ? `≤$${keyword.max_price}` : ''].filter(Boolean).join(' ')} ) : ( )} {/* Delete */} ) }