/* 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;