add payment, trust badge, handle race condition, fix booking schema

This commit is contained in:
arifal
2026-04-20 23:57:31 +07:00
parent ba5f64ae0e
commit fcdca34460
33 changed files with 1781 additions and 138 deletions
@@ -0,0 +1,72 @@
interface TripProgramBlockProps {
meetingPoint: string | null;
itinerary: string | null;
whatsIncluded: string | null;
whatsExcluded: string | null;
}
export function TripProgramBlock({
meetingPoint,
itinerary,
whatsIncluded,
whatsExcluded,
}: TripProgramBlockProps) {
const hasAny =
meetingPoint || itinerary || whatsIncluded || whatsExcluded;
if (!hasAny) return null;
return (
<div className="space-y-4 rounded-xl border border-neutral-200 bg-neutral-50/50 p-4 sm:p-5">
<h2 className="text-xs font-bold text-neutral-800 sm:text-sm">
Detail perjalanan
</h2>
{meetingPoint && (
<div>
<h3 className="mb-1 text-[11px] font-bold uppercase tracking-wide text-primary-700 sm:text-xs">
Meeting point
</h3>
<p className="whitespace-pre-wrap text-xs leading-relaxed text-neutral-700 sm:text-sm">
{meetingPoint}
</p>
</div>
)}
{itinerary && (
<div>
<h3 className="mb-1 text-[11px] font-bold uppercase tracking-wide text-primary-700 sm:text-xs">
Itinerary
</h3>
<p className="whitespace-pre-wrap text-xs leading-relaxed text-neutral-700 sm:text-sm">
{itinerary}
</p>
</div>
)}
{(whatsIncluded || whatsExcluded) && (
<div className="grid gap-4 sm:grid-cols-2">
{whatsIncluded && (
<div className="rounded-lg border border-secondary-200 bg-white p-3">
<h3 className="mb-2 text-[11px] font-bold uppercase tracking-wide text-secondary-800 sm:text-xs">
Termasuk
</h3>
<p className="whitespace-pre-wrap text-xs leading-relaxed text-neutral-700 sm:text-sm">
{whatsIncluded}
</p>
</div>
)}
{whatsExcluded && (
<div className="rounded-lg border border-neutral-200 bg-white p-3">
<h3 className="mb-2 text-[11px] font-bold uppercase tracking-wide text-neutral-600 sm:text-xs">
Tidak termasuk
</h3>
<p className="whitespace-pre-wrap text-xs leading-relaxed text-neutral-700 sm:text-sm">
{whatsExcluded}
</p>
</div>
)}
</div>
)}
</div>
);
}