"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { joinTripAction, cancelJoinAction } from "@/features/trip/actions"; interface JoinTripButtonProps { tripId: string; isLoggedIn: boolean; isOrganizer: boolean; isJoined: boolean; /** Trip gratis (price <= 0) — sembunyikan flow pembayaran */ isFree: boolean; /** Status partisipasi user saat isJoined (bukan organizer) */ participationStatus?: "PENDING" | "CONFIRMED" | null; /** Status pembayaran manual (peserta). Hanya relevan untuk trip berbayar. */ participantPayment?: { markedPaidAt: string | Date | null; paymentConfirmedAt: string | Date | null; } | null; isFull: boolean; tripStatus: string; /** Tanggal berangkat trip sudah lewat */ isDeparturePast?: boolean; /** Sembunyikan tombol cancel — dipakai saat booking PAID dan parent * menampilkan CancelBookingButton (refund flow) di tempat terpisah. */ hideCancelButton?: boolean; } export function JoinTripButton({ tripId, isLoggedIn, isOrganizer, isJoined, isFree, participationStatus, participantPayment, isFull, tripStatus, isDeparturePast, hideCancelButton, }: JoinTripButtonProps) { const router = useRouter(); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); if (!isLoggedIn) { return ( Login untuk Join Trip ); } if (isOrganizer) { return (
Kamu adalah organizer trip ini
); } if (isJoined && isDeparturePast) { return (
Kamu terdaftar di trip ini. Setelah tanggal berangkat lewat,{" "} pembatalan ditutup . Jika trip sudah selesai, isi ulasan di bagian bawah halaman.
); } if (isDeparturePast && !isJoined) { return (
Trip sudah lewat tanggal berangkat
); } if (tripStatus !== "OPEN" && !isJoined) { return (
Trip tidak tersedia untuk pendaftaran
); } async function handleJoin() { setLoading(true); setError(""); const result = await joinTripAction(tripId); setLoading(false); if (result.error) { setError(result.error); } else { router.refresh(); } } async function handleCancel() { setLoading(true); setError(""); const result = await cancelJoinAction(tripId); setLoading(false); if (result.error) { setError(result.error); } else { router.refresh(); } } const pay = participantPayment; const showPaymentLink = !isFree && isJoined && !isDeparturePast; const waitingPaymentConfirm = !isFree && isJoined && pay && pay.markedPaidAt && !pay.paymentConfirmedAt; const paymentDone = !isFree && isJoined && pay && pay.paymentConfirmedAt; return (
{error && (
{error}
)} {isJoined && participationStatus === "PENDING" && (
Permintaan ikut trip kamu{" "} menunggu persetujuan organizer. Kamu bisa membatalkan kapan saja sebelum disetujui.
)} {isJoined && participationStatus === "CONFIRMED" && (
Kamu sudah{" "} terkonfirmasi sebagai peserta trip ini {isFree && — trip gratis, tidak ada pembayaran 🎉}.
)} {waitingPaymentConfirm && (
Kamu sudah menandai sudah bayar. Tunggu organizer mengonfirmasi pembayaran.
)} {paymentDone && (
Pembayaran kamu sudah{" "} dikonfirmasi organizer.
)} {showPaymentLink && ( {paymentDone ? "Lihat detail pembayaran" : pay?.markedPaidAt ? "Lihat status pembayaran" : "Buka detail pembayaran"} )} {isJoined ? ( hideCancelButton ? null : ( ) ) : ( )}
); }