feat(web): /projects/:slug/buzz/new — log-buzz form (closes #83 engineering scope)#105
Merged
Conversation
Closes the <ComingSoon /> placeholder at /projects/:slug/buzz/new. The API endpoint (POST /api/projects/:slug/buzz, per specs/api/projects-buzz.md) is fully implemented + tested; this PR ships the SPA form that closes the loop. Form fields match the spec request body: headline required, 1-200 chars url required, HTTPS, surfaces inline 409 on duplicate_url publishedAt required date, defaults to today, max=today summary optional, ≤2000 chars markdown Successful POST navigates to /projects/:slug#activity so the new buzz appears in the activity feed. Anonymous callers redirect to /login with a return-to back to the form so post-login lands them where they started. Image upload is out of scope for v1 — the spec carve-out for imageUpload.key references a general-media upload endpoint that doesn't exist yet. 5 tests: anonymous→login redirect, form renders, submit disabled until required fields filled, submit enabled once both filled, success navigates to project page. The lingering ComingSoon import in App.tsx (now unused after the last /pages/:slug → StaticPage swap in #104) is also dropped here. Closes #83 (engineering scope). Content-port follow-up tracked separately. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
All 5 validation checkboxes ticked. Notes covers the useAuth.loading naming mismatch, the ComingSoon dead-import cleanup, and the native-required submit gating choice. Follow-ups: #83 is now fully closed engineering-wise (4 phased PRs land the umbrella). Only the legacy-content port stays as a content task; image upload for buzz is out of v1 scope per the spec. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.
Summary
Last phase of #83. The API endpoint (`POST /api/projects/:slug/buzz`, per specs/api/projects-buzz.md) is fully implemented + tested; this PR ships the SPA form that closes the loop.
Form fields match the spec request body:
Successful POST navigates to `/projects/:slug#activity` so the new buzz appears in the activity feed. Anonymous callers redirect to `/login` with a return-to query so post-login drops them back on the form.
Image upload is out of v1 scope — the spec's `imageUpload.key` references a general-media upload endpoint that doesn't exist yet.
The lingering `ComingSoon` import in `App.tsx` (now unused after the last `/pages/:slug → StaticPage` swap in #104) is also dropped here.
What this closes
#83 is now done engineering-wise:
Only the legacy-content port for /pages/* remains as a follow-up content PR.
Test plan
🤖 Generated with Claude Code