import React, { useEffect, useMemo, useState } from "react"; import { createPortal } from "react-dom"; export default function AddCustomCategoryModal({ open, onClose, onSubmit }) { const [name, setName] = useState(""); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); // Reset the form whenever the modal is opened. // NOTE: Hooks must be called in the same order on every render; do not early-return before hooks. useEffect(() => { if (!open) return; setName(""); setError(null); setSubmitting(false); }, [open]); const canSubmit = useMemo(() => { return name.trim().length > 0 && name.trim().length <= 100 && !submitting; }, [name, submitting]); async function handleSubmit(e) { e.preventDefault(); if (!canSubmit) return; setSubmitting(true); setError(null); try { await onSubmit({ name: name.trim() }); onClose?.(); } catch (err) { setError( err?.response?.data?.message || err?.message || "Failed to create custom category" ); setSubmitting(false); } } if (!open) return null; return createPortal(
setName(e.target.value)} maxLength={100} autoFocus className="w-full rounded-lg border border-white/10 bg-black/40 px-3 py-2 text-sm outline-none focus:border-green-400" placeholder="e.g. My Habit Tracking" />
{name.trim().length}/100
{error ? (
{error}
) : null}
, document.body ); }