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