Add event watch and media surfaces#153
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Storybook Image DiffOutcome: success Changed Storybook baselines: none in this PR. This check compares design-system component screenshots against committed baselines. Inline images show only added or modified Storybook baseline PNGs. |
Storybook Component Screenshot PreviewOutcome: success Screenshots: primitive component stories captured on desktop and mobile. This lane is separate from full-route Playwright screenshots and focuses on design-system component regressions. |
Playwright Hosted Data-FlowOutcome: success This optional check runs the mutation-backed profile flow against a configured hosted dev/staging target with isolated E2E test data. |
Playwright Data-Flow PreviewOutcome: success Captured flow:
Artifacts include screenshots, traces, and recorded video for the flow run. |
Playwright Image DiffOutcome: success Changed screenshot baselines: 8 This check compares public route screenshots against committed baselines. Inline images show only added or modified baseline PNGs. |
Playwright Public Screenshot PreviewOutcome: success Screenshots: all public route checks passed on desktop and mobile. Full screenshot set is available in the artifact. Pixel diff baselines are handled by the separate Playwright Image Diff check. |
Vercel Preview DeploymentPreview: https://vr-dex-lypjg6fjv-basicbit.vercel.app |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fd262e6061
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Greptile SummaryThis PR adds three new event fields —
Confidence Score: 4/5Safe to merge — new fields are all additive and optional, old events degrade gracefully through the fallback chains, and the watch-surface gate defaults off so no existing event accidentally gains an exposed player. The implementation is clean and well-tested. Profile visibility gating on discovery surfaces is correctly applied. The one thing worth a follow-up is
Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
subgraph Image Slots ["Event Image Slot Resolution"]
B["bannerImageUrl\n(hero)"] -->|"missing"| BP["posterImageUrl"]
T["thumbnailImageUrl\n(card / search)"] -->|"missing"| TP["posterImageUrl"]
TP -->|"missing"| TB["bannerImageUrl"]
end
subgraph ProfileImages ["Profile Card Image (discovery surface)"]
PA["avatarImageUrl"] -->|"unlisted or private"| PB["bannerImageUrl"]
PB -->|"unlisted or private"| PNone["(none)"]
end
subgraph WatchGate ["Watch Surface Gate"]
WE{"watchSurfaceEnabled\n(default: false)"} -->|"true"| WW{"In schedule\nwindow?"}
WE -->|"false"| WNull["Surface hidden\nLinks still visible"]
WW -->|"yes + primary link"| WShow["Render watch surface"]
WW -->|"no"| WNull
end
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
subgraph Image Slots ["Event Image Slot Resolution"]
B["bannerImageUrl\n(hero)"] -->|"missing"| BP["posterImageUrl"]
T["thumbnailImageUrl\n(card / search)"] -->|"missing"| TP["posterImageUrl"]
TP -->|"missing"| TB["bannerImageUrl"]
end
subgraph ProfileImages ["Profile Card Image (discovery surface)"]
PA["avatarImageUrl"] -->|"unlisted or private"| PB["bannerImageUrl"]
PB -->|"unlisted or private"| PNone["(none)"]
end
subgraph WatchGate ["Watch Surface Gate"]
WE{"watchSurfaceEnabled\n(default: false)"} -->|"true"| WW{"In schedule\nwindow?"}
WE -->|"false"| WNull["Surface hidden\nLinks still visible"]
WW -->|"yes + primary link"| WShow["Render watch surface"]
WW -->|"no"| WNull
end
Prompt To Fix All With AIFix the following 1 code review issue. Work through them one at a time, proposing concise fixes.
---
### Issue 1 of 1
convex/_searchDocuments.ts:369-381
**`firstSafeHttpsUrl` defined in three places**
`firstSafeHttpsUrl` is copy-pasted verbatim into `_eventPublic.ts`, `_searchDocuments.ts`, and `_worldEvents.ts`. Since `safeHttpsUrl` already lives in `_publicFields.ts`, this helper would be a natural peer export there, keeping all three callers in sync if the validation logic ever needs to change.
Reviews (1): Last reviewed commit: "Update public route screenshot baselines" | Re-trigger Greptile |








Summary
watchSurfaceEnabledopt-in so promoted watch surfaces default off while normal media links stay visible.Closes #139.
Closes #133.
Validation
Local backend/web/docs checks passed. Desktop and mobile visual smoke plus updated public route snapshots passed for the event-related surfaces.