import { useState, useMemo } from "react" import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" import { Plus, Trash2, Clock, FileText, Tag } from "lucide-react" import { api } from "../lib/api" export default function TimeEntryTemplates() { const queryClient = useQueryClient() const [name, setName] = useState("") const [description, setDescription] = useState("") const [projectId, setProjectId] = useState("") const [duration, setDuration] = useState("") const { data: templates, isLoading, isError } = useQuery({ queryKey: ["timeEntryTemplates"], queryFn: () => api.listTimeEntryTemplates() }) const { data: projects } = useQuery({ queryKey: ["projects"], queryFn: () => api.listProjects() }) const createMutation = useMutation({ mutationFn: (payload: { name: string; description: string; projectId: string | null; defaultDurationMinutes: number | null }) => api.createTimeEntryTemplate(payload), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["timeEntryTemplates"] }) setName("") setDescription("") setProjectId("") setDuration("") } }) const deleteMutation = useMutation({ mutationFn: (id: string) => api.deleteTimeEntryTemplate(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["timeEntryTemplates"] }) } }) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (!name.trim()) return createMutation.mutate({ name, description, projectId: projectId || null, defaultDurationMinutes: duration ? parseInt(duration, 10) : null }) } if (isLoading) return
Loading templates...
if (isError) return
Error loading templates.
return (

Time Entry Templates

Create New Template
setName(e.target.value)} placeholder="e.g. Weekly Sync" className="border rounded px-3 py-2 focus:ring-2 focus:ring-blue-500 outline-none" />
setDuration(e.target.value)} placeholder="60" className="border rounded px-3 py-2 focus:ring-2 focus:ring-blue-500 outline-none" />
setDescription(e.target.value)} placeholder="Brief description..." className="border rounded px-3 py-2 focus:ring-2 focus:ring-blue-500 outline-none" />
{templates?.length === 0 && (
No templates found. Create one above to speed up your time tracking.
)} {templates?.map(template => (
{template.name}
{template.defaultDurationMinutes && ( {template.defaultDurationMinutes} min )} {template.projectId && ( Project ID: {template.projectId} )} {template.description && ( {template.description} )}
))}
) }