Add support for fetching events by slug in context

Introduced `fetchEventBySlug` method and `event` state to the events context, enabling retrieval of event data via slugs. Updated context state to handle related loading and error states (`isLoadingEvent` and `eventError`), and integrated query logic for slug-based event fetching.
This commit is contained in:
2025-03-12 09:21:45 +01:00
parent 082c1dc585
commit d8980e18ce

View File

@@ -28,16 +28,19 @@ import {
// Events context state interface
interface EventsContextState {
// Query access methods
event: EventResponse | undefined;
userEvents: PaginatedResponseEventResponse | undefined;
upcomingEvents: PaginatedResponseEventResponse | undefined;
publicEvents: PaginatedResponseEventResponse | undefined;
isLoadingUserEvents: boolean;
isLoadingUpcomingEvents: boolean;
isLoadingPublicEvents: boolean;
isLoadingEvent: boolean;
// Single event methods
getEvent: (id: string) => Promise<EventResponse | undefined>;
getEventBySlug: (slug: string) => Promise<EventResponse | undefined>;
fetchEventBySlug: (slug: string) => void;
// Mutation methods
createEvent: (event: EventCreate) => Promise<EventResponse>;
@@ -55,19 +58,23 @@ interface EventsContextState {
isUpdating: boolean;
isDeleting: boolean;
error: Error | null;
eventError: Error | null;
}
// Default context state
const defaultEventsState: EventsContextState = {
event: undefined,
userEvents: undefined,
upcomingEvents: undefined,
publicEvents: undefined,
isLoadingUserEvents: false,
isLoadingUpcomingEvents: false,
isLoadingPublicEvents: false,
isLoadingEvent: false,
getEvent: async () => undefined,
getEventBySlug: async () => undefined,
fetchEventBySlug: () => {},
createEvent: async () => {
throw new Error("EventsProvider not initialized");
@@ -88,6 +95,7 @@ const defaultEventsState: EventsContextState = {
isUpdating: false,
isDeleting: false,
error: null,
eventError: null,
};
// Create context
@@ -112,6 +120,20 @@ export const EventsProvider: React.FC<EventsProviderProps> = ({ children }) => {
const queryClient = useQueryClient();
const [currentPage, setCurrentPage] = useState(1);
const [pageSize, setPageSize] = useState(10);
const [currentSlug, setCurrentSlug] = useState<string | null>(null);
const {
data: event,
isLoading: isLoadingEvent,
error: eventError,
} = useQuery({
...getEventBySlugOptions({ path: { slug: currentSlug || "" } }),
enabled: !!currentSlug,
});
const fetchEventBySlug = useCallback((slug: string) => {
setCurrentSlug(slug);
}, []);
// Query options with pagination
const paginationParams = {
@@ -229,15 +251,18 @@ export const EventsProvider: React.FC<EventsProviderProps> = ({ children }) => {
// Context value
const value: EventsContextState = {
event,
userEvents,
upcomingEvents,
publicEvents,
isLoadingUserEvents,
isLoadingUpcomingEvents,
isLoadingPublicEvents,
isLoadingEvent,
getEvent,
getEventBySlug,
fetchEventBySlug,
createEvent,
updateEvent,
@@ -252,6 +277,7 @@ export const EventsProvider: React.FC<EventsProviderProps> = ({ children }) => {
isUpdating: updateEventMutationHook.isPending,
isDeleting: deleteEventMutationHook.isPending,
error,
eventError,
};
return (