"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import DatePicker from "react-datepicker"; import "react-datepicker/dist/react-datepicker.css"; import { createTripAction } from "@/features/trip/actions"; import { ImageUrlInput } from "@/features/trip/components/image-url-input"; import { formatLocalCalendarYmd } from "@/lib/trip-dates"; import { ACTIVITY_CATEGORIES, categoryMeta, } from "@/lib/activity-category"; import type { ActivityCategory } from "@/app/generated/prisma/enums"; function formatRupiahInput(value: string): string { const num = value.replace(/\D/g, ""); return num.replace(/\B(?=(\d{3})+(?!\d))/g, "."); } function parseRupiahInput(value: string): string { return value.replace(/\./g, ""); } interface CreateTripFormProps { isVerifiedOrganizer: boolean; } export function CreateTripForm({ isVerifiedOrganizer }: CreateTripFormProps) { const router = useRouter(); const [error, setError] = useState(""); const [loading, setLoading] = useState(false); const [category, setCategory] = useState("HIKING"); const [startDate, setStartDate] = useState(null); const [endDate, setEndDate] = useState(null); const [priceDisplay, setPriceDisplay] = useState(""); const meta = categoryMeta(category); const priceNumber = Number(parseRupiahInput(priceDisplay) || "0"); const isPaidTrip = priceNumber > 0; const blockedByVerification = isPaidTrip && !isVerifiedOrganizer; async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(""); if (!startDate) { setError("Tanggal berangkat harus diisi"); return; } setLoading(true); const formData = new FormData(e.currentTarget); formData.set("date", formatLocalCalendarYmd(startDate)); if (endDate) { const startYmd = formatLocalCalendarYmd(startDate); const endYmd = formatLocalCalendarYmd(endDate); if (endYmd !== startYmd) { formData.set("endDate", endYmd); } } formData.set("price", parseRupiahInput(priceDisplay)); const result = await createTripAction(formData); setLoading(false); if (result.error) { setError(result.error); } else if (result.tripId) { router.push(`/trips/${result.tripId}`); } } function handleDateChange(dates: [Date | null, Date | null]) { const [start, end] = dates; setStartDate(start); setEndDate(end); } function handlePriceChange(e: React.ChangeEvent) { const raw = e.target.value.replace(/\D/g, ""); setPriceDisplay(raw ? formatRupiahInput(raw) : ""); } return (
{error && (
{error}
)}
{/* Category Chips */}
{ACTIVITY_CATEGORIES.map((c) => { const m = categoryMeta(c); const active = c === category; return ( ); })}