Implement the Feedback page under /feedback.
Priority: P1
API endpoints used
| Method |
Endpoint |
Description |
| GET |
/feedback |
List all feedback (FeedbackSummary[]) |
| POST |
/feedback |
Create feedback (FeedbackCreate) |
| GET |
/feedback/{feedback_id} |
Get feedback details (Feedback) |
| PATCH |
/feedback/{feedback_id} |
Update feedback (FeedbackPartialUpdate) |
| DELETE |
/feedback/{feedback_id} |
Delete feedback |
Tasks
- Add
src/features/feedback/api/queries.ts with useListFeedback and useGetFeedback hooks using TanStack Query; expose query options for the route loader
- Add
src/features/feedback/api/mutations.ts with useCreateFeedback, useUpdateFeedback, and useDeleteFeedback hooks; on success invalidate feedbackListQueryOptions
- Add
src/features/feedback/api/query-keys.ts for structured query keys
- Wire a React Router v7 loader on the
/feedback route that calls queryClient.ensureQueryData(feedbackListQueryOptions())
- Add Zod schema for
FeedbackCreate and FeedbackPartialUpdate derived from the generated types in src/api.ts
- Add Zustand slice for UI state only: selected feedback ID, detail sheet open/closed
- Build a feedback list view (shadcn/ui Table with columns:
event, member, creator, created_at)
- Add a detail Sheet showing the full
feedback text
- Add a "New Feedback" Dialog with a React Hook Form + Zod validated form for
FeedbackCreate (required: event, member, feedback)
- Support edit (PATCH) and delete with confirmation from the detail Sheet
Acceptance criteria
- Feedback list loads before the page renders (via loader prefetch)
- Creating, editing, and deleting feedback reflects in the list without a full page reload
- Form validates required fields (
event, member, feedback) before submitting and shows inline errors
- Loading, empty, and error states are visible in list/detail views
Implement the Feedback page under
/feedback.Priority: P1
API endpoints used
FeedbackSummary[])FeedbackCreate)Feedback)FeedbackPartialUpdate)Tasks
src/features/feedback/api/queries.tswithuseListFeedbackanduseGetFeedbackhooks using TanStack Query; expose query options for the route loadersrc/features/feedback/api/mutations.tswithuseCreateFeedback,useUpdateFeedback, anduseDeleteFeedbackhooks; on success invalidatefeedbackListQueryOptionssrc/features/feedback/api/query-keys.tsfor structured query keys/feedbackroute that callsqueryClient.ensureQueryData(feedbackListQueryOptions())FeedbackCreateandFeedbackPartialUpdatederived from the generated types insrc/api.tsevent,member,creator,created_at)feedbacktextFeedbackCreate(required:event,member,feedback)Acceptance criteria
event,member,feedback) before submitting and shows inline errors