"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 : (
)
) : (
)}
);
}