Ratings, event chat and announcements, no negative spots, and a real design system - #19
Merged
Merged
Conversation
…l design tokens Spots remaining: - Every capacity display now routes through one clamped helper, so an over-subscribed event reads "Full" instead of "-6 spots left". Seed capacities that sat below their own RSVP counts were given headroom, leaving a handful genuinely sold out. Past events and ratings: - My Events opens on Past, where each event carries a 1-5 star rating with an optional note, saved per user on the device. Upcoming events are behind the same control rather than shown by default, plus a "Not yet rated" filter and search over past events. The event page grows the same rating card once the event is over. Chat and announcements: - Each event has a thread for the people going: attendees message each other, hosts post announcements that pin above the conversation. Access is gated to going/maybe/host in the UI and enforced in the database by new RLS policies (supabase/migrations/004_event_messages.sql). With no Supabase project the thread falls back to device storage so the feature still works end to end. Design system: - New constants/design.ts holds the tokens the app was missing: an 8pt spacing scale with 4pt half-steps, a fixed type scale modelled on Apple's HIG text styles (each step with its own weight, line height and tracking), radii, a shadow ramp that goes flat in dark mode, and a 44pt minimum tap target. useAppTheme() now hands screens colours, type, space, radii and elevation. - Home, Find, My Events, the agenda and both card components were rebuilt on those tokens: one card language (date tile, headline title, quiet metadata), emoji icons replaced with real icon glyphs, staggered entrances and press feedback everywhere, and a tab bar that respects the home indicator. - Browsing leads with upcoming events; past ones stay findable below. 18 new unit tests cover the capacity clamp, the rating store and the message store; the suite is 62/62. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
1. No more negative spots
EventCardprintedcapacity - RSVPsraw, so an over-subscribed event advertised "-6 spots left". Every capacity display now goes through one clamped helper (getAvailableSpots/getClaimedSpots/isEventFull) and reads "Full" at zero. Seed capacities that sat below their own RSVP counts were given headroom, leaving 17 events genuinely sold out.2. Past events, with ratings
My Events now opens on Past — the tab with something to do. Each past event carries a 1–5 star rating with an optional note, saved per user on the device, plus:
3. Upcoming events aren't the default
Upcoming lives behind the same segmented control (with its count), so the list you land on is never mixed with events that haven't happened. Browsing (Find) leads with upcoming events and keeps past ones below rather than at the top.
4. Chat and announcements for people who signed up
Every event has a thread: attendees message each other, hosts post announcements that pin above the conversation. Access is gated to going/maybe/host in the UI and enforced in the database — new RLS policies in
supabase/migrations/004_event_messages.sqlmean a non-attendee cannot read or write the thread even by calling the API directly. With no Supabase project configured the thread falls back to device storage, so the feature works end to end in demo mode (and says so).5. Design system
The UI had no shared vocabulary — every screen invented its own font sizes, paddings and radii, and several used emoji as icons. Research-backed tokens now live in
constants/design.tsand reach components throughuseAppTheme():Applied across Home, Find, My Events, the agenda and both card components: one card language (date tile → headline title → quiet metadata → footer), real icon glyphs instead of emoji, staggered entrances and press feedback, and a tab bar that respects the home indicator.
Verification
tsc0 errors, ESLint clean, 62/62 unit tests (18 new: capacity clamp, rating store, message store).pnpm buildsucceeds; postexport flattens 37 vendor assets.America/New_York, light and dark: sign in → RSVP → rate a past event → post to an event thread, with screenshots at each step.🤖 Generated with Claude Code
https://claude.ai/code/session_011nrgpkJbvZ9JCf2VA2kKvJ
Generated by Claude Code