"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { joinTripAction, cancelJoinAction } from "@/features/trip/actions"; type BookingStatus = | "PENDING" | "AWAITING_PAY" | "PAID" | "CANCELLED" | "REFUNDED" | "PARTIALLY_REFUNDED" | "EXPIRED"; 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 booking peserta (hanya relevan untuk trip berbayar). */ bookingStatus?: BookingStatus | 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, bookingStatus, 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 needsPayment = !isFree && isJoined && bookingStatus === "AWAITING_PAY"; const paymentDone = !isFree && isJoined && bookingStatus === "PAID"; const showPaymentLink = (needsPayment || paymentDone) && !isDeparturePast; 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}.
)} {needsPayment && (
Selesaikan pembayaran lewat{" "} Midtrans untuk mengamankan slot kamu.
)} {paymentDone && (
Pembayaran kamu sudah{" "} terkonfirmasi.
)} {showPaymentLink && ( {paymentDone ? "Lihat detail pembayaran" : "Bayar sekarang"} )} {isJoined ? ( hideCancelButton ? null : ( ) ) : ( )}
); }