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:
@@ -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 (
|
||||
|
||||
Reference in New Issue
Block a user