"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { updateProfileAction } from "@/features/profile/actions"; import { LIMITS } from "@/lib/limits"; interface ProfileEditorProps { userId: string; initial: { bio: string | null; city: string | null; interests: string[]; instagram: string | null; } | null; } export function ProfileEditor({ userId, initial }: ProfileEditorProps) { const router = useRouter(); const [open, setOpen] = useState(initial === null); const [error, setError] = useState(""); const [success, setSuccess] = useState(""); const [loading, setLoading] = useState(false); const [bio, setBio] = useState(initial?.bio ?? ""); const [city, setCity] = useState(initial?.city ?? ""); const [instagram, setInstagram] = useState(initial?.instagram ?? ""); const [interests, setInterests] = useState(initial?.interests ?? []); const [interestDraft, setInterestDraft] = useState(""); function addInterest() { const v = interestDraft.trim().toLowerCase(); if (!v) return; if (interests.includes(v)) { setInterestDraft(""); return; } if (interests.length >= LIMITS.MAX_PROFILE_INTERESTS_COUNT) { setError(`Maksimal ${LIMITS.MAX_PROFILE_INTERESTS_COUNT} minat`); return; } setInterests([...interests, v]); setInterestDraft(""); setError(""); } function removeInterest(tag: string) { setInterests(interests.filter((t) => t !== tag)); } function handleInterestKeyDown(e: React.KeyboardEvent) { if (e.key === "Enter" || e.key === ",") { e.preventDefault(); addInterest(); } } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(""); setSuccess(""); setLoading(true); const formData = new FormData(); if (bio.trim()) formData.set("bio", bio.trim()); if (city.trim()) formData.set("city", city.trim()); if (instagram.trim()) formData.set("instagram", instagram.trim()); interests.forEach((t) => formData.append("interests", t)); const result = await updateProfileAction(formData); setLoading(false); if (result.error) { setError(result.error); } else { setSuccess("Profil berhasil disimpan"); router.refresh(); } } if (!open) { return (

Profil sosial

{initial?.city || initial?.bio ? "Profil terisi — klik untuk edit" : "Lengkapi profil supaya orang lain mengenalmu"}

Lihat publik ↗
); } return (

Edit profil sosial

{error && (
{error}
)} {success && (
{success}
)}