import { eventQueries } from "@/entities/event";
import { cn } from "@/shared/lib/utils";
import { useQuery } from "@tanstack/react-query";
import { useAuthSlice } from "@/app/providers";
import type { LatLng } from "@/entities/geodata";
import { StatusBage } from "@/features/events-list/ui/StatusBage";
import { MaybeManageEvent } from "@/features/manage-event";
import { Ticket } from "@/features/ticket";
import { getTicketPriceRangeDisplay } from "@/shared/lib/formatTicketPriceRange";
import { formatTimestamp } from "@/shared/lib/formatTimestamp";
import { getTimeString } from "@/shared/lib/getTimeString";
import { pluralDays, pluralTickets } from "@/shared/lib/pluralDays";
import { ErrorMessage } from "@/shared/ui/ErrorMessage";
import { Loader } from "@/shared/ui/Loader";
import { Button } from "@/shared/ui/button";
import { useNavigate } from "react-router";
import { DetailsBlock } from "./DetailsBlock";
import { useLogin } from "@/features/login";
import { checkPermission } from "@/shared/lib/RBAC";
type EventDetailsProps = {
eventId: number;
};
export const EventDetails: React.FC<EventDetailsProps> = ({ eventId }) => {
const navigate = useNavigate();
const { user } = useAuthSlice();
const { LoginBtn, buttonProps } = useLogin();
const {
data: event,
error,
isLoading,
} = useQuery(eventQueries.detail(eventId));
if (isLoading) return <Loader />;
if (error) return <ErrorMessage errors={error} />;
if (!event) return <ErrorMessage errors={error} />;
const {
imageUrl,
title,
description,
place,
ticketPriceRange,
ticketsBought,
startDateTimestamp,
daysAmount,
status,
website,
} = event;
const priceMinDisplay = getTicketPriceRangeDisplay(ticketPriceRange);
function placeClickHandler() {
const location = place.geometry.coordinates[0] as LatLng;
const url = `/map/?lat=${location.lat}&lng=${location.lng}`;
navigate(url);
}
const isCreator = user?.address === event.creator.address;
const isPermitted = checkPermission(user?.roles, "event:edit");
return (
<div className="flex flex-col">
<div className="relative">
<a
href={website || undefined}
target="_blank"
className="absolute top-3 right-2 aspect-square h-10 rounded-full flex items-center justify-center bg-black"
rel="noreferrer"
>
<p className="text-3xl font-bold text-primary">?</p>
</a>
<img
className="w-full aspect-video object-cover object-center"
src={imageUrl ?? "/event_default.jpg"}
alt={title}
/>
<div className="absolute top-3 left-2">
{status === "approved" ? (
<div className="px-3 py-1 text-primary text-md font-semibold rounded-full self-start bg-black">
{pluralTickets(place.maxTickets - (ticketsBought || 0))} available
</div>
) : (
<StatusBage status={status} />
)}
</div>
</div>
<div className="bg-secondary py-10 px-4 text-black space-y-8">
<h2 className="font-semibold text-3xl">{title}</h2>
<p className="text-xl break-words">{description}</p>
</div>
<div className="px-4 pt-5">
<DetailsBlock
icon="/icons/event place_2.svg"
title="Location"
information={
<button
type="button"
className="underline underline-offset-2 text-secondary"
onClick={placeClickHandler}
>
{place.title}
</button>
}
/>
</div>
<div className="grid grid-cols-2 gap-3 px-4 py-3">
<DetailsBlock
icon="/icons/calendar.svg"
title="Date and time"
information={`${formatTimestamp(startDateTimestamp)} (${getTimeString(startDateTimestamp)})`}
className={cn(isCreator || isPermitted || "col-span-2")}
/>
<DetailsBlock
icon="/icons/duration_2.svg"
title="Duration"
information={`${daysAmount} ${pluralDays(daysAmount)}`}
/>
{(isCreator || isPermitted) && (
<DetailsBlock
icon="/icons/Attendees_2.svg"
title="Tickets available"
information={pluralTickets(
place.maxTickets - Number(ticketsBought),
)}
/>
)}
<DetailsBlock
icon="/icons/price_2.svg"
title={priceMinDisplay ? "Price from" : "Price"}
information={priceMinDisplay ?? "Sold out"}
/>
</div>
{status !== "submitted" && (
<Button
filling="outline"
className="m-5"
onClick={() => navigate("attendees")}
>
Event Attendees
</Button>
)}
{user ? (
<>
<MaybeManageEvent
eventId={eventId}
canEdit={isPermitted}
roles={user.roles}
status={event.status}
/>
<div className="sticky bottom-2 mt-2 px-4">
<Ticket event={event} user={user} />
</div>
</>
) : (
<div className="p-5">
<LoginBtn {...buttonProps} title="Login to get the ticket" />
</div>
)}
</div>
);
};