Skip to content

Feat/crowdfunding#619

Closed
0xdevcollins wants to merge 11 commits into
mainfrom
feat/crowdfunding
Closed

Feat/crowdfunding#619
0xdevcollins wants to merge 11 commits into
mainfrom
feat/crowdfunding

Conversation

@0xdevcollins

Copy link
Copy Markdown
Collaborator

No description provided.

0xdevcollins and others added 10 commits June 11, 2026 07:37
…eceipts/send

Winners: new task-first Winners section (pick winner per prize with engine default, inline stacking confirm, deliberate 'Don't award' + unawarded-funds acknowledgement); /rewards redirects to /winners; staged Pick -> Confirm -> Pay.

Judging: slimmed Results tab to read-only standings + 'Go to Winners'; criterionId name fix; AI scorecards, recommendation thresholds, CSV judge import, tracks + custom questions wizard sections; validation + empty-state polish.

Public: private + password access gate, community links, card private badge. Treasury: receipts + Send funds. Removed the stacking toggle from prize setup.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…599) (#611)

The net-new bounty UI with no hackathon analog: the two-axis mode picker and
the mode-conditional submission settings that drive all six combinations.

- modeSchema.ts: plain taxonomy unions (entryType x claimType), the
  computeBountyModeLabel helper, and getModeFields — the mode -> field matrix
  derived functionally from the publish gate (validateTwoAxisMode) so it cannot
  drift from the backend.
- submissionModelSchema.ts: makeSubmissionModelSchema(mode), a mode-aware Zod
  factory whose required fields and the >=2 floors (maxApplicants for open
  competition, shortlistSize for application competition) mirror the server gate.
- ModeTab.tsx: entry x claim picker, a winners stepper (1-3) for competitions,
  and a live computed mode label.
- SubmissionModelTab.tsx: renders each field per the matrix (required / optional
  / hidden) and shows submissionVisibility read-only, forced by the mode
  (HIDDEN_UNTIL_DEADLINE for competitions).

Standalone components (props: mode, onSave, onContinue, initialData, isLoading);
they wire into the wizard shell + routes in #597 / #598.
…ow) (#596)

Adds the features/bounties/ data layer for the v1 app, mirroring
features/hackathons/. REST-only via the typed openapi-fetch client; every
server shape is aliased from the backend-generated schema so it cannot drift.

- types.ts: aliases the generated draft + escrow DTOs (BountyDraft,
  UpdateBountyDraftBody, the four section types, BountyEscrowOpResponse,
  PublishBountyEscrowRequest, ...). Derives the two-axis taxonomy from the
  generated mode DTO, superseding the local stubs in the ModeTab.
- api/keys.ts: bountyKeys factory.
- api/draft-client.ts + use-draft.ts: imperative CRUD plus the
  useDraft / useDraftList / useCreateDraft / useUpdateDraft / useDeleteDraft
  hooks against /organizations/{organizationId}/bounties/draft[/{id}] + /drafts.
- api/escrow-client.ts + use-escrow.ts: organizer escrow calls (publish /
  cancel / select-winners / submit-signed / poll) plus useEscrowOp +
  useEscrowOpRunner, mirroring the hackathon machinery (MANAGED polls; EXTERNAL
  signs -> submit -> poll) bounty-scoped.
- index.ts: public surface.

Regenerates lib/api/generated/schema.d.ts from the v2 backend so the bounty
draft paths/DTOs are present.
Adds the bounty Configure wizard orchestrator and its step + draft state,
mirroring the hackathon wizard. No AI assist.

- components/organization/bounties/new/constants.ts: StepKey
  (scope/mode/submission/reward/review), STEP_ORDER, BountyFormData, and
  isBountyStepDataValid.
- hooks/use-bounty-steps.ts: URL ?step= navigation (free-roam) with a
  presentational step-status map.
- hooks/use-bounty-draft.ts: lazy create (ensureDraftId) then per-section PATCH,
  resume via useDraft, and transformBountyFromApi (sections -> form state;
  winnerCount derived from prize tiers, ISO dates trimmed for the inputs).
- components/organization/bounties/new/NewBountyTab.tsx: orchestrator wiring
  steps + draft + per-step save, persisting ?draftId= for resume, and threading
  the chosen mode from ModeTab into SubmissionModelTab.

Scope/Reward/Review tabs (#600) and the publish + funding flow (#601) are left
as marked placeholders with their save/navigate/draftId seams in place; this
satisfies the acceptance criteria (navigate, autosave, resume) without
speculative publish UI that depends on the unbuilt publish hook.
…cking

- Redesigned public listing (ProjectCard) and detail page with proper
  lifecycle states, voting panel, contributor list, and fully-funded detection
- Added public milestone list + detail pages under /crowdfunding/[slug]/milestones
- Builder per-campaign management: tabbed layout (overview / milestones /
  contributions) with shared header showing milestone X/Y progress and
  Fully Funded badge once fundingRaised >= fundingGoal
- Milestone status sourced from milestoneState() utility: claimedAt-based
  "paid out" detection replaces stale reviewStatus === 'completed' checks
- CampaignStatusBanner: shows milestone delivery bar and Fully Funded label
  during the FUNDING phase when goal is reached
- milestones-metrics: completedAmount correctly sums paid-out milestones;
  inProgress checks SUBMITTED/UNDER_REVIEW enum values
- ProjectCard: switches from funding bar to milestone X/Y bar on fully funded;
  footer and status badge update to Fully Funded (green)
- lib/crowdfunding/status.ts: single source of truth for all campaign and
  milestone status copy and tone

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
boundless-kd16 Ready Ready Preview, Comment Jun 24, 2026 9:50am

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 275 files, which is 125 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a171b747-507c-48bc-8c00-98b26d997030

📥 Commits

Reviewing files that changed from the base of the PR and between fd2b990 and 17402a7.

⛔ Files ignored due to path filters (2)
  • lib/api/generated/schema.d.ts is excluded by !**/generated/**
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (275)
  • .claude/launch.json
  • .env.example
  • .husky/pre-push
  • app/(landing)/crowdfunding/[slug]/milestones/[id]/page.tsx
  • app/(landing)/crowdfunding/[slug]/milestones/page.tsx
  • app/(landing)/crowdfunding/[slug]/page.tsx
  • app/(landing)/crowdfunding/new/page.tsx
  • app/(landing)/crowdfunding/page.tsx
  • app/(landing)/hackathons/[slug]/components/AccessGate.tsx
  • app/(landing)/hackathons/[slug]/components/RegistrationQuestionsDialog.tsx
  • app/(landing)/hackathons/[slug]/components/SponsorsSection.tsx
  • app/(landing)/hackathons/[slug]/components/header/ActionButtons.tsx
  • app/(landing)/hackathons/[slug]/components/sidebar/CommunityLinks.tsx
  • app/(landing)/hackathons/[slug]/components/sidebar/MySubmissionPanel.tsx
  • app/(landing)/hackathons/[slug]/components/sidebar/PoolAndAction.tsx
  • app/(landing)/hackathons/[slug]/components/sidebar/index.tsx
  • app/(landing)/hackathons/[slug]/components/tabs/contents/Overview.tsx
  • app/(landing)/hackathons/[slug]/components/tabs/contents/index.tsx
  • app/(landing)/hackathons/[slug]/components/tabs/contents/submissions/SubmissionCard.tsx
  • app/(landing)/hackathons/[slug]/page.tsx
  • app/(landing)/hackathons/[slug]/submit/page.tsx
  • app/(landing)/hackathons/layout.tsx
  • app/(landing)/hackathons/preview/[orgId]/[draftId]/page.tsx
  • app/(landing)/organizations/[id]/hackathons/[hackathonId]/judging/page.tsx
  • app/(landing)/organizations/[id]/hackathons/[hackathonId]/page.tsx
  • app/(landing)/organizations/[id]/hackathons/[hackathonId]/participants/page.tsx
  • app/(landing)/organizations/[id]/hackathons/[hackathonId]/rewards/page.tsx
  • app/(landing)/organizations/[id]/hackathons/[hackathonId]/settings/page.tsx
  • app/(landing)/organizations/[id]/hackathons/[hackathonId]/winners/page.tsx
  • app/(landing)/organizations/[id]/hackathons/drafts/[draftId]/page.tsx
  • app/(landing)/organizations/[id]/hackathons/new/page.tsx
  • app/(landing)/organizations/[id]/hackathons/page.tsx
  • app/(landing)/organizations/[id]/treasury/page.tsx
  • app/(landing)/organizations/[id]/treasury/receipts/[receiptId]/page.tsx
  • app/(landing)/organizations/layout.tsx
  • app/(landing)/projects/[slug]/page.tsx
  • app/judge/[hackathonId]/submissions/[submissionId]/page.tsx
  • app/layout.tsx
  • app/me/crowdfunding/[slug]/components/CampaignBanner.tsx
  • app/me/crowdfunding/[slug]/components/CampaignTabs.tsx
  • app/me/crowdfunding/[slug]/components/FundingProgress.tsx
  • app/me/crowdfunding/[slug]/components/ProjectDetails.tsx
  • app/me/crowdfunding/[slug]/components/index.ts
  • app/me/crowdfunding/[slug]/contributions/page.tsx
  • app/me/crowdfunding/[slug]/edit/components/BasicInfoSection.tsx
  • app/me/crowdfunding/[slug]/edit/components/ContactSocialSection.old.tsx
  • app/me/crowdfunding/[slug]/edit/components/ContactSocialSection.tsx
  • app/me/crowdfunding/[slug]/edit/components/DetailsFundingSection.tsx
  • app/me/crowdfunding/[slug]/edit/components/MilestonesSection.tsx
  • app/me/crowdfunding/[slug]/edit/components/ProjectLinksSection.tsx
  • app/me/crowdfunding/[slug]/edit/components/RepoLinksSection.tsx
  • app/me/crowdfunding/[slug]/edit/components/TeamSection.tsx
  • app/me/crowdfunding/[slug]/edit/components/index.ts
  • app/me/crowdfunding/[slug]/edit/components/md-editor-custom.css
  • app/me/crowdfunding/[slug]/edit/page.tsx
  • app/me/crowdfunding/[slug]/layout.tsx
  • app/me/crowdfunding/[slug]/milestones/[milestoneIndex]/page.tsx
  • app/me/crowdfunding/[slug]/milestones/page.tsx
  • app/me/crowdfunding/[slug]/page.tsx
  • app/me/crowdfunding/new/page.tsx
  • app/me/crowdfunding/page.tsx
  • app/me/layout.tsx
  • app/partners/contribute/[token]/page.tsx
  • app/providers.tsx
  • components/app-sidebar.tsx
  • components/auth/LoginWrapper.tsx
  • components/auth/OtpForm.tsx
  • components/crowdfunding-table-columns.tsx
  • components/crowdfunding-table-toolbar.tsx
  • components/crowdfunding/CampaignStatusBanner.tsx
  • components/crowdfunding/ContributeSheet.tsx
  • components/crowdfunding/MilestoneSubmitForm.tsx
  • components/crowdfunding/VotePanel.tsx
  • components/crowdfunding/campaign-funding-tab.tsx
  • components/crowdfunding/campaign-milestones-tab.tsx
  • components/crowdfunding/campaign-stats.tsx
  • components/crowdfunding/milestone-card.tsx
  • components/crowdfunding/milestones-metrics.tsx
  • components/crowdfunding/new/NewCampaignSidebar.tsx
  • components/crowdfunding/new/NewCampaignWizard.tsx
  • components/crowdfunding/new/WizardHelpButton.tsx
  • components/crowdfunding/new/constants.ts
  • components/crowdfunding/new/fee.ts
  • components/crowdfunding/new/milestone-templates.ts
  • components/crowdfunding/new/steps/BasicsStep.tsx
  • components/crowdfunding/new/steps/FundingStep.tsx
  • components/crowdfunding/new/steps/LinksStep.tsx
  • components/crowdfunding/new/steps/MilestonesStep.tsx
  • components/crowdfunding/new/steps/ReviewStep.tsx
  • components/crowdfunding/new/steps/StoryStep.tsx
  • components/crowdfunding/new/steps/TeamStep.tsx
  • components/crowdfunding/quick-links.tsx
  • components/crowdfunding/submit-evidence-modal.tsx
  • components/hackathons/HackathonsPage.tsx
  • components/hackathons/overview/RegisterHackathonModal.tsx
  • components/hackathons/submissions/SubmissionAnchorProgress.tsx
  • components/hackathons/submissions/SubmissionForm.tsx
  • components/judge/JudgeAiAssist.tsx
  • components/landing-page/hackathon/HackathonCard.tsx
  • components/landing-page/navbar.tsx
  • components/me-dashboard.tsx
  • components/organization/OrganizationSettings.tsx
  • components/organization/OrganizationSidebar.tsx
  • components/organization/bounties/new/NewBountyTab.tsx
  • components/organization/bounties/new/constants.ts
  • components/organization/bounties/new/tabs/ModeTab.tsx
  • components/organization/bounties/new/tabs/SubmissionModelTab.tsx
  • components/organization/bounties/new/tabs/schemas/modeSchema.ts
  • components/organization/bounties/new/tabs/schemas/submissionModelSchema.ts
  • components/organization/cards/ReviewSubmissionModal/SubmissionModalHeader.tsx
  • components/organization/hackathons/HackathonPublishStatusBanner.tsx
  • components/organization/hackathons/ParticipantsGrid.tsx
  • components/organization/hackathons/ParticipantsTable.tsx
  • components/organization/hackathons/details/HackathonSidebar.tsx
  • components/organization/hackathons/judging/AiScorecardsPanel.tsx
  • components/organization/hackathons/judging/AllocationPreviewCard.tsx
  • components/organization/hackathons/judging/ImportJudgesCsvDialog.tsx
  • components/organization/hackathons/judging/JudgingResultsTable.tsx
  • components/organization/hackathons/judging/OrganizerJudgesPanel.tsx
  • components/organization/hackathons/judging/RecommendationThresholdsCard.tsx
  • components/organization/hackathons/new/FundingConfirmationModal.tsx
  • components/organization/hackathons/new/FundingProgressModal.tsx
  • components/organization/hackathons/new/GenerateWithAiDialog.tsx
  • components/organization/hackathons/new/HackathonTabsNavigation.tsx
  • components/organization/hackathons/new/NewHackathonTab.tsx
  • components/organization/hackathons/new/PrePublishAnnounceDialog.tsx
  • components/organization/hackathons/new/RegenerateSectionButton.tsx
  • components/organization/hackathons/new/constants.ts
  • components/organization/hackathons/new/tabs/CustomQuestionsTab.tsx
  • components/organization/hackathons/new/tabs/InfoTab.tsx
  • components/organization/hackathons/new/tabs/JudgingTab.tsx
  • components/organization/hackathons/new/tabs/ReviewTab.tsx
  • components/organization/hackathons/new/tabs/RewardsTab.tsx
  • components/organization/hackathons/new/tabs/TimelineTab.tsx
  • components/organization/hackathons/new/tabs/TracksTab.tsx
  • components/organization/hackathons/new/tabs/components/CategorySelection.tsx
  • components/organization/hackathons/new/tabs/components/review/EscrowSummary.tsx
  • components/organization/hackathons/new/tabs/components/review/HackathonPublishedModal.tsx
  • components/organization/hackathons/new/tabs/components/review/PublishSection.tsx
  • components/organization/hackathons/new/tabs/components/review/WalletConnectionWarning.tsx
  • components/organization/hackathons/new/tabs/schemas/rewardsSchema.ts
  • components/organization/hackathons/rewards/CreateMilestonesDialog.tsx
  • components/organization/hackathons/rewards/EscrowStatusCard.tsx
  • components/organization/hackathons/rewards/PublishWinnersWizard.tsx
  • components/organization/hackathons/rewards/RewardDistributionStatusBanner.tsx
  • components/organization/hackathons/rewards/RewardPayoutProgressModal.tsx
  • components/organization/hackathons/rewards/RewardsPageContent.tsx
  • components/organization/hackathons/rewards/RewardsPageHeader.tsx
  • components/organization/hackathons/rewards/SubmissionListItem.tsx
  • components/organization/hackathons/rewards/SubmissionsList.tsx
  • components/organization/hackathons/rewards/WinnerFormItem.tsx
  • components/organization/hackathons/rewards/WinnersBoard.tsx
  • components/organization/hackathons/settings/AdvancedSettingsTab.tsx
  • components/organization/hackathons/settings/AllocateContributionModal.tsx
  • components/organization/hackathons/settings/PartnersSettingsTab.tsx
  • components/organization/hackathons/settings/RewardsSettingsTab.tsx
  • components/organization/hackathons/settings/TracksSettingsTab.tsx
  • components/organization/tabs/MembersTab.tsx
  • components/organization/tabs/MembersTab/MemberCard.tsx
  • components/organization/tabs/MembersTab/PermissionsTable.tsx
  • components/organization/treasury/AuditLog.tsx
  • components/organization/treasury/Receipts.tsx
  • components/organization/treasury/SendFunds.tsx
  • components/organization/treasury/WalletsSection.tsx
  • components/project-details/project-sidebar/ProjectSidebarLinks.tsx
  • components/providers/auth-provider.tsx
  • features/bounties/api/draft-client.ts
  • features/bounties/api/escrow-client.ts
  • features/bounties/api/keys.ts
  • features/bounties/api/use-draft.ts
  • features/bounties/api/use-escrow.ts
  • features/bounties/index.ts
  • features/bounties/types.ts
  • features/crowdfunding/api/campaign-client.ts
  • features/crowdfunding/api/keys.ts
  • features/crowdfunding/api/milestone-client.ts
  • features/crowdfunding/api/use-campaign.ts
  • features/crowdfunding/api/use-milestone.ts
  • features/crowdfunding/components/CrowdfundingExplore.tsx
  • features/crowdfunding/components/CrowdfundingPageHero.tsx
  • features/crowdfunding/index.ts
  • features/crowdfunding/types.ts
  • features/hackathons/api/draft-client.ts
  • features/hackathons/api/escrow-client.ts
  • features/hackathons/api/keys.ts
  • features/hackathons/api/use-draft.ts
  • features/hackathons/api/use-escrow.ts
  • features/hackathons/api/use-generate-from-brief.ts
  • features/hackathons/api/use-regenerate-section.ts
  • features/hackathons/api/use-submission-anchor.ts
  • features/hackathons/api/use-submission.ts
  • features/hackathons/index.ts
  • features/hackathons/types.ts
  • features/projects/api/index.ts
  • features/projects/components/ProjectCard.tsx
  • features/projects/types/index.ts
  • features/treasury/api.ts
  • features/treasury/index.ts
  • features/treasury/keys.ts
  • features/treasury/types.ts
  • features/treasury/use-treasury-audit.ts
  • features/treasury/use-treasury-policy.ts
  • features/treasury/use-treasury-receipts.ts
  • features/treasury/use-treasury-spend.ts
  • features/treasury/use-treasury-wallets.ts
  • hooks/hackathon/use-cancel-hackathon.ts
  • hooks/hackathon/use-delete-hackathon.ts
  • hooks/hackathon/use-hackathon-queries.ts
  • hooks/hackathon/use-hackathons-list.ts
  • hooks/hackathon/use-register-hackathon.ts
  • hooks/hackathon/use-team-posts.ts
  • hooks/use-auth.ts
  • hooks/use-bounty-draft.ts
  • hooks/use-bounty-steps.ts
  • hooks/use-follow.ts
  • hooks/use-hackathon-draft.ts
  • hooks/use-hackathon-publish.ts
  • hooks/use-hackathon-rewards.ts
  • hooks/use-hackathon-step-save.ts
  • hooks/use-hackathon-steps.ts
  • hooks/use-hackathons.ts
  • hooks/use-publish-winners.ts
  • hooks/use-rank-assignment.ts
  • hooks/use-reward-distribution-status.ts
  • hooks/use-winners-board.ts
  • hooks/use-wizard-steps.ts
  • instrumentation-client.ts
  • instrumentation.ts
  • lib/api/api.ts
  • lib/api/auth.ts
  • lib/api/client.ts
  • lib/api/hackathon.ts
  • lib/api/hackathons.ts
  • lib/api/hackathons/custom-questions.ts
  • lib/api/hackathons/draft.ts
  • lib/api/hackathons/index.ts
  • lib/api/hackathons/judging.ts
  • lib/api/hackathons/participants.ts
  • lib/api/hackathons/partners.ts
  • lib/api/hackathons/rewards.ts
  • lib/api/hackathons/tracks.ts
  • lib/api/hackathons/winners.ts
  • lib/api/index.ts
  • lib/api/judge.ts
  • lib/api/openapi.ts
  • lib/api/organization.ts
  • lib/api/types.ts
  • lib/api/user/earnings.ts
  • lib/api/wallet.ts
  • lib/auth/logger.ts
  • lib/config/tokens.ts
  • lib/config/wallet-kit.ts
  • lib/crowdfunding/status.ts
  • lib/error-reporting.ts
  • lib/providers/OrganizationProvider.tsx
  • lib/providers/hackathonProvider.tsx
  • lib/stores/auth-store.ts
  • lib/utils/effective-prize-tiers.ts
  • lib/utils/hackathon-escrow.ts
  • lib/utils/hackathon-form-transforms.ts
  • lib/utils/hackathon-step-validation.ts
  • lib/utils/hackathon-winner-distribution.ts
  • lib/utils/prize-tier-matcher.ts
  • lib/utils/publish-op-storage.ts
  • lib/wallet/wallet-kit.ts
  • next.config.ts
  • openapi.snapshot.json
  • package.json
  • sentry.edge.config.ts
  • sentry.server.config.ts
  • types/earnings.ts
  • types/hackathon/core.ts
  • types/hackathon/draft.ts
  • types/hackathon/index.ts
  • types/hackathon/rewards.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/crowdfunding

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants