📋 What Was Accomplished Backend Changes: - ✅ Enhanced API Endpoint: Updated GET /api/v1/events to accept optional date query parameter - ✅ Input Validation: Added YYYY-MM-DD format validation to PaginationQueryDto - ✅ Database Filtering: Implemented timezone-aware date filtering in EventsService - ✅ Controller Integration: Updated EventsController to pass date parameter to service Frontend Changes: - ✅ Date Picker Component: Created reusable DatePicker component following project design system - ✅ Gallery UI Enhancement: Integrated date picker into gallery page with clear labeling - ✅ State Management: Implemented reactive date state with automatic re-fetching - ✅ Clear Filter Functionality: Added "Clear Filter" button for easy reset - ✅ Enhanced UX: Improved empty states for filtered vs unfiltered views 🔍 Technical Implementation API Design: GET /api/v1/events?date=2025-08-02&limit=20&cursor=xxx Key Files Modified: - meteor-web-backend/src/events/dto/pagination-query.dto.ts - meteor-web-backend/src/events/events.service.ts - meteor-web-backend/src/events/events.controller.ts - meteor-frontend/src/components/ui/date-picker.tsx (new) - meteor-frontend/src/app/gallery/page.tsx - meteor-frontend/src/hooks/use-events.ts - meteor-frontend/src/services/events.ts ✅ All Acceptance Criteria Met 1. ✅ Backend API Enhancement: Accepts optional date parameter 2. ✅ Date Filtering Logic: Returns events for specific calendar date 3. ✅ Date Picker UI: Clean, accessible interface component 4. ✅ Automatic Re-fetching: Immediate data updates on date selection 5. ✅ Filtered Display: Correctly shows only events for selected date 6. ✅ Clear Filter: One-click reset to view all events 🧪 Quality Assurance - ✅ Backend Build: Successful compilation with no errors - ✅ Frontend Build: Successful Next.js build with no warnings - ✅ Linting: All ESLint checks pass - ✅ Functionality: Feature working as specified 🎉 Epic 2 Complete! With Story 2.9 completion, Epic 2: Commercialization & Core User Experience is now DONE! Epic 2 Achievements: - 🔐 Full-stack device status monitoring - 💳 Robust payment and subscription system - 🛡️ Subscription-based access control - 📊 Enhanced data browsing with detail pages - 📅 Date-based event filtering
59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
import { useInfiniteQuery, useQuery } from "@tanstack/react-query"
|
|
import { eventsApi, EventDto } from "@/services/events"
|
|
|
|
const EVENTS_LIMIT = 20
|
|
|
|
export function useEvents(date?: string | null) {
|
|
return useInfiniteQuery({
|
|
queryKey: ["events", date],
|
|
queryFn: ({ pageParam }) => eventsApi.getEvents({
|
|
limit: EVENTS_LIMIT,
|
|
cursor: pageParam,
|
|
date: date || undefined
|
|
}),
|
|
initialPageParam: undefined as string | undefined,
|
|
getNextPageParam: (lastPage) => lastPage.nextCursor,
|
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
})
|
|
}
|
|
|
|
export function useAllEvents(date?: string | null): {
|
|
events: EventDto[]
|
|
isLoading: boolean
|
|
isError: boolean
|
|
error: Error | null
|
|
hasNextPage: boolean
|
|
fetchNextPage: () => void
|
|
isFetchingNextPage: boolean
|
|
} {
|
|
const {
|
|
data,
|
|
isLoading,
|
|
isError,
|
|
error,
|
|
hasNextPage,
|
|
fetchNextPage,
|
|
isFetchingNextPage,
|
|
} = useEvents(date)
|
|
|
|
const events = data?.pages.flatMap(page => page.data) ?? []
|
|
|
|
return {
|
|
events,
|
|
isLoading,
|
|
isError,
|
|
error,
|
|
hasNextPage: hasNextPage ?? false,
|
|
fetchNextPage,
|
|
isFetchingNextPage,
|
|
}
|
|
}
|
|
|
|
export function useEvent(eventId: string) {
|
|
return useQuery({
|
|
queryKey: ["event", eventId],
|
|
queryFn: () => eventsApi.getEventById(eventId),
|
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
enabled: !!eventId, // Only run query if eventId is provided
|
|
})
|
|
} |