"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
import Link from "next/link";
import { joinTripAction, cancelJoinAction } from "@/features/trip/actions";
import { markParticipantPaidAction } from "@/features/booking/actions";
interface JoinTripButtonProps {
tripId: string;
isLoggedIn: boolean;
isOrganizer: boolean;
isJoined: boolean;
/** Status partisipasi user saat isJoined (bukan organizer) */
participationStatus?: "PENDING" | "CONFIRMED" | null;
/** Status pembayaran manual (peserta) */
participantPayment?: {
markedPaidAt: string | Date | null;
paymentConfirmedAt: string | Date | null;
} | null;
isFull: boolean;
tripStatus: string;
/** Tanggal berangkat trip sudah lewat */
isDeparturePast?: boolean;
}
export function JoinTripButton({
tripId,
isLoggedIn,
isOrganizer,
isJoined,
participationStatus,
participantPayment,
isFull,
tripStatus,
isDeparturePast,
}: 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();
}
}
async function handleMarkPaid() {
setLoading(true);
setError("");
const result = await markParticipantPaidAction(tripId);
setLoading(false);
if (result.error) {
setError(result.error);
} else {
router.refresh();
}
}
const pay = participantPayment;
const showMarkPaid =
isJoined &&
pay &&
!pay.paymentConfirmedAt &&
!pay.markedPaidAt &&
!isDeparturePast;
const waitingPaymentConfirm =
isJoined && pay && pay.markedPaidAt && !pay.paymentConfirmedAt;
const paymentDone = 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.
)}
{waitingPaymentConfirm && (
Kamu sudah menandai sudah bayar.
Tunggu organizer mengonfirmasi pembayaran.
)}
{paymentDone && (
Pembayaran kamu sudah{" "}
dikonfirmasi organizer.
)}
{showMarkPaid && (
)}
{isJoined ? (
) : (
)}
);
}