Implement the Members management page under /members.
Priority: P0
API endpoints used
| Method |
Endpoint |
Description |
| GET |
/members |
List all members (MemberSummary[]) |
| POST |
/members |
Create a new member (MemberCreate) |
| GET |
/members/{member_id} |
Get full member details (Member) |
| PATCH |
/members/{member_id} |
Update member fields (MemberPartialUpdate) |
| DELETE |
/members/{member_id} |
Delete a member |
Tasks
- Add
src/features/members/api/queries.ts with useListMembers and useGetMember hooks using TanStack Query; expose memberListQueryOptions and memberDetailQueryOptions for use in the route loader
- Add
src/features/members/api/mutations.ts with useCreateMember, useUpdateMember, and useDeleteMember hooks; on success invalidate memberListQueryOptions
- Add
src/features/members/api/query-keys.ts for structured query keys
- Wire a React Router v7 loader on the
/members route that calls queryClient.ensureQueryData(memberListQueryOptions())
- Add Zod schema for
MemberCreate and MemberPartialUpdate derived from the generated types in src/api.ts
- Add Zustand slice for UI state only: selected member ID, detail sheet open/closed
- Build a members list view (shadcn/ui Table with columns:
first_name, last_name, email)
- Add a member detail Sheet that opens on row click showing all
Member fields
- Add a "New Member" Dialog with a React Hook Form + Zod validated form for
MemberCreate
- Support edit (PATCH) and delete with confirmation from the detail Sheet
Acceptance criteria
- Members list loads from
GET /members before the page renders (via loader prefetch)
- Creating, editing, and deleting a member reflects in the list without a full page reload
- Form validates required fields (
first_name, last_name) before submitting and shows inline errors
- Loading, empty, and API-error states are visible in the members list view
Implement the Members management page under
/members.Priority: P0
API endpoints used
MemberSummary[])MemberCreate)Member)MemberPartialUpdate)Tasks
src/features/members/api/queries.tswithuseListMembersanduseGetMemberhooks using TanStack Query; exposememberListQueryOptionsandmemberDetailQueryOptionsfor use in the route loadersrc/features/members/api/mutations.tswithuseCreateMember,useUpdateMember, anduseDeleteMemberhooks; on success invalidatememberListQueryOptionssrc/features/members/api/query-keys.tsfor structured query keys/membersroute that callsqueryClient.ensureQueryData(memberListQueryOptions())MemberCreateandMemberPartialUpdatederived from the generated types insrc/api.tsfirst_name,last_name,email)MemberfieldsMemberCreateAcceptance criteria
GET /membersbefore the page renders (via loader prefetch)first_name,last_name) before submitting and shows inline errors