'use client'
import { useState } from 'react'
interface ChecklistItemProps {
id: string
itemName: string
status: string
owner: { id: string; name: string } | null
phase: string
onUpdate: () => void
}
export function InteractiveChecklistItem({
id,
itemName,
status,
owner,
phase,
onUpdate,
}: ChecklistItemProps) {
const [isEditing, setIsEditing] = useState(false)
const [editName, setEditName] = useState(itemName)
const [isUpdating, setIsUpdating] = useState(false)
const handleStatusChange = async (newStatus: string) => {
setIsUpdating(true)
try {
const response = await fetch(`/api/checklist/${id}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ status: newStatus }),
})
if (response.ok) {
onUpdate()
}
} catch (error) {
console.error('Failed to update status:', error)
} finally {
setIsUpdating(false)
}
}
const handleNameUpdate = async () => {
if (editName.trim() === itemName) {
setIsEditing(false)
return
}
setIsUpdating(true)
try {
const response = await fetch(`/api/checklist/${id}`, {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ itemName: editName.trim() }),
})
if (response.ok) {
setIsEditing(false)
onUpdate()
}
} catch (error) {
console.error('Failed to update name:', error)
} finally {
setIsUpdating(false)
}
}
const handleDelete = async () => {
if (!confirm('Delete this checklist item?')) return
setIsUpdating(true)
try {
const response = await fetch(`/api/checklist/${id}`, {
method: 'DELETE',
})
if (response.ok) {
onUpdate()
}
} catch (error) {
console.error('Failed to delete item:', error)
} finally {
setIsUpdating(false)
}
}
const statusOptions = ['Not Started', 'In Progress', 'Blocked', 'Complete']
return (
{/* Status Dropdown */}
{/* Item Name - Editable */}
{isEditing ? (
setEditName(e.target.value)}
onKeyDown={(e) => {
if (e.key === 'Enter') handleNameUpdate()
if (e.key === 'Escape') {
setEditName(itemName)
setIsEditing(false)
}
}}
className="flex-1 px-3 py-2 rounded-lg border-2 border-blue-500 focus:outline-none"
autoFocus
/>
) : (
setIsEditing(true)}
>
{itemName}
✏️ Click to edit
)}
{/* Owner */}
Owner: {owner?.name || 'Unassigned'}
{/* Delete Button */}
)
}
interface AddChecklistItemProps {
rfpId: string
phase: string
onAdd: () => void
}
export function AddChecklistItem({ rfpId, phase, onAdd }: AddChecklistItemProps) {
const [isAdding, setIsAdding] = useState(false)
const [newItemName, setNewItemName] = useState('')
const [isSubmitting, setIsSubmitting] = useState(false)
const handleAdd = async () => {
if (!newItemName.trim()) return
setIsSubmitting(true)
try {
const response = await fetch('/api/checklist', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
rfpId,
itemName: newItemName.trim(),
phase,
status: 'Not Started',
}),
})
if (response.ok) {
setNewItemName('')
setIsAdding(false)
onAdd()
}
} catch (error) {
console.error('Failed to add item:', error)
} finally {
setIsSubmitting(false)
}
}
if (!isAdding) {
return (
)
}
return (
setNewItemName(e.target.value)}
onKeyDown={(e) => {
if (e.key === 'Enter') handleAdd()
if (e.key === 'Escape') {
setNewItemName('')
setIsAdding(false)
}
}}
placeholder="Enter checklist item name..."
className="flex-1 px-3 py-2 rounded-lg border-2 border-gray-300 focus:border-blue-500 focus:outline-none"
autoFocus
/>
)
}