import React, { useState, useEffect, useRef } from "react" import { api } from "../lib/api" import { useMutation, useQueryClient } from "@tanstack/react-query" export default function QuickAdd() { const [isOpen, setIsOpen] = useState(false) const [description, setDescription] = useState("") const [duration, setDuration] = useState("") const inputRef = useRef(null) const queryClient = useQueryClient() const mutation = useMutation({ mutationFn: (data: any) => api.createTimeEntry(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["time-entries"] }) setIsOpen(false) setDescription("") setDuration("") }, }) useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) return if (e.key === "n" && (e.metaKey || e.ctrlKey)) { e.preventDefault() setIsOpen(true) } } window.addEventListener("keydown", handleKeyDown) return () => window.removeEventListener("keydown", handleKeyDown) }, []) useEffect(() => { if (isOpen) { setTimeout(() => inputRef.current?.focus(), 10) } }, [isOpen]) const parseDuration = (input: string): number => { const regex = /(\d+)\s*(h|m|min)/g let totalMinutes = 0 let match while ((match = regex.exec(input.toLowerCase())) !== null) { const value = parseInt(match[1], 10) const unit = match[2] if (unit === "h") totalMinutes += value * 60 else totalMinutes += value } return totalMinutes } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!description) return const minutes = parseDuration(duration) || 0 const end = new Date() const start = new Date(end.getTime() - minutes * 60000) mutation.mutate({ description, startTime: start.toISOString(), endTime: end.toISOString(), }) } if (!isOpen) return null return (
setIsOpen(false)} >
e.stopPropagation()} >

Quick Add Entry

setDescription(e.target.value)} onKeyDown={(e) => e.key === "Escape" && setIsOpen(false)} />
setDuration(e.target.value)} onKeyDown={(e) => e.key === "Escape" && setIsOpen(false)} />
) }