/* eslint-disable @typescript-eslint/no-explicit-any */
import { useState } from "react";
import { getStatusToken } from "../../lib/bookingStatus";
import { useBookingFor, useChatUIOptions } from "../../providers/ChatUIOptions";
import useChatUIStore from "../../stores/Zustant";
import { Booking, BookingField } from "../../types/type";
const Accordion = ({ title, rows }: { title: string; rows: BookingField[] }) => {
const [open, setOpen] = useState(false);
return (
{open && (
{rows.map((row) => (
{row.label}
{row.value}
))}
)}
);
};
const Field = ({
label,
value,
mono,
accent,
}: {
label: string;
value: string;
mono?: boolean;
accent?: boolean;
}) => (
{label}
{value}
);
/**
* Right-hand detail panel. Seeds itself from the selected conversation
* (bookingId, serviceTitle, participant) and layers the host app's richer
* `booking` on top, so it still shows something useful with no props at all.
*/
const BookingPanel = () => {
const selectedConversation = useChatUIStore((s) => s.selectedConversation) as any;
const supplied = useBookingFor(selectedConversation?._id);
const { onAcceptBooking, onCancelBooking } = useChatUIOptions();
if (!selectedConversation) return null;
const bookingId = supplied?.id || selectedConversation.bookingId;
// Only service conversations carry a booking; personal chats have none.
if (!bookingId) return null;
const booking: Booking = {
id: bookingId,
status: supplied?.status,
service: supplied?.service || selectedConversation.serviceTitle,
customer: supplied?.customer,
date: supplied?.date,
time: supplied?.time,
total: supplied?.total,
paymentDetails: supplied?.paymentDetails,
history: supplied?.history,
actionable: supplied?.actionable,
};
const status = getStatusToken(booking.status);
const actionable = booking.actionable ?? status.label === "Pending";
const showFooter = actionable && (onAcceptBooking || onCancelBooking);
return (
);
};
export default BookingPanel;