import type { Event, EventDto } from "@/entities/event";
import { eventQueries } from "@/entities/event";
import type { EventPlace } from "@/entities/place";
import { EventForm } from "@/features/event-form";
import { ErrorMessage } from "@/shared/ui/ErrorMessage";
import { Loader } from "@/shared/ui/Loader";
import { useQuery } from "@tanstack/react-query";
import { EventDataProvider } from "./EventDataProvider";
type EditEventProps = {
editEventId: number;
onSubmit: (event: EventDto) => void;
canEdit: (event: Event) => boolean;
};
type EditEventsWithDataProps = EditEventProps & {
events: Event[];
places: EventPlace[];
};
const EditEventWithData: React.FC<EditEventsWithDataProps> = ({
onSubmit,
editEventId,
canEdit,
events,
places,
}) => {
const foundEvent = events.find((event) => event.id === editEventId);
const {
data: existingCategories,
isLoading: isCategoriesLoading,
error: categoriesError,
} = useQuery({
...eventQueries.categories(editEventId),
enabled: !!foundEvent,
});
if (!foundEvent) {
return (
<ErrorMessage
errors={new Error("Event you are trying to edit is not found")}
/>
);
}
if (!canEdit(foundEvent)) {
return (
<ErrorMessage
errors={new Error("You have no permissions to edit this event")}
/>
);
}
if (isCategoriesLoading) return <Loader />;
if (categoriesError) return <ErrorMessage errors={categoriesError} />;
if (!existingCategories) return <ErrorMessage errors={categoriesError} />;
const boundedQuotaTotal = existingCategories.reduce((sum, c) => {
return c.hasQuota ? sum + c.quota : sum;
}, 0);
const remainingForLegacyUnlimited = Math.max(
1,
foundEvent.place.maxTickets - boundedQuotaTotal,
);
return (
<EventForm
existingEvent={foundEvent}
existingCategories={existingCategories.map((c) => ({
id: crypto.randomUUID(),
name: c.name,
// Backend stores discount in basis points. Form uses percent.
discount: Math.round((c.discount / 100) * 100) / 100,
quota: c.hasQuota ? c.quota : remainingForLegacyUnlimited,
}))}
events={events}
places={places}
onSumbit={onSubmit}
/>
);
};
export const EditEvent: React.FC<EditEventProps> = ({
onSubmit,
editEventId,
canEdit,
}) => {
return (
<EventDataProvider>
{({ events, places }) => (
<EditEventWithData
events={events}
places={places}
onSubmit={onSubmit}
canEdit={canEdit}
editEventId={editEventId}
/>
)}
</EventDataProvider>
);
};