[codex] community voting notifications and controls - #42

Merged
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications
Jun 25, 2026
Merged

[codex] community voting notifications and controls#42
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jun 25, 2026

Copy link
Copy Markdown
Member

What changed

  • Sends NIP-04 voting-start DMs from the env LACRYPTA_NSEC to every eligible voter when an admin opens or refreshes community voting.
  • Ensures the sender has a kind-0 profile on relays, cloning the configured source profile when available and falling back to La Crypta Dev metadata.
  • Moves ballot controls into the existing hackathon project list so users do not see duplicate project lists while voting.
  • Adds an inscription-window helper so Inscribite gratis disappears after the registration deadline, including Gaming after its pitch-final date.

Why

Community voting needed a direct Nostr notification path when admins start voting, and the voting UI had two separate project lists. The inscription CTA also used the full hackathon lifecycle, so it remained visible after registration had already ended.

Validation

  • pnpm exec tsc --noEmit
  • git diff --check
  • Browser check at http://localhost:3001/hackathons/gaming#votar: voting controls are attached to the project list, no duplicate voting project list remains, and no Inscribite button appears after the inscription deadline.
  • Manual NIP-04 self-test published successfully to 6/6 configured relays.

Summary by CodeRabbit

  • New Features

    • Added voting-start notifications so admins can alert eligible voters when voting opens.
    • Introduced a more interactive voting experience with per-project vote controls and a clear publish action.
  • Bug Fixes

    • Improved hackathon inscription button visibility so it appears only when registration is actually open.
    • Updated voting and inscription timing rules to better match event dates.
  • UI Improvements

    • Refined voting page layout, including better scrolling behavior and clearer voting status messaging.

@vercel

vercelBot commented Jun 25, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJun 25, 2026 8:02pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 666ffc75-41fd-483c-a961-79faa93d9e5c

📥 Commits

Reviewing files that changed from the base of the PR and between 82861e4 and e99a8fb.

📒 Files selected for processing (6)
  • app/api/hackathons/[id]/voting/route.ts
  • app/hackathons/[id]/HackathonProjectsList.tsx
  • app/hackathons/[id]/VotingSection.tsx
  • app/hackathons/[id]/page.tsx
  • app/hackathons/page.tsx
  • lib/hackathons.ts

📝 Walkthrough

Walkthrough

Hackathon inscription buttons now follow date-based open-window checks, and the voting flow was refactored around a shared provider. The voting API can now publish Nostr voting-start notifications and report delivery counts to the client.

Changes

Hackathon Inscription Window

Layer / File(s)Summary
Date helpers
lib/hackathons.ts
New helpers derive the inscription deadline and open state from hackathon event dates.
CTA gating
app/hackathons/page.tsx, app/hackathons/[id]/page.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The home card, hackathon hero, and projects section now gate inscription actions with isHackathonInscriptionOpen, and the projects section adds the votar anchor with scroll offset classes.

Voting Provider and Notifications

Layer / File(s)Summary
Notification helpers
app/api/hackathons/[id]/voting/route.ts
The route adds profile and notification result types, parses profile JSON, resolves sender/source profiles, and builds encrypted voting-start DMs.
Open action notifications
app/api/hackathons/[id]/voting/route.ts
Opening voting now computes shouldNotifyVotingStart, publishes notifications after the voting event, logs misses, and returns a notifications summary.
Voting context and toast
app/hackathons/[id]/VotingSection.tsx
VotingSection now exposes voting state through VotingContext, can reuse or create VotingProvider, and appends notification delivery counts to the admin success toast.
Voting controls and page wiring
app/hackathons/[id]/page.tsx, app/hackathons/[id]/VotingSection.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The projects page wraps VotingProvider, and the list renders ProjectVotingToolbar and ProjectVotingControls in the revised row layout.

Sequence Diagram(s)

sequenceDiagram
participant Route as POST /app/api/hackathons/[id]/voting/route.ts
participant Profile as ensureSenderProfile
participant Relays as publishToRelays
participant Voters as eligible voters
Route->>Route: compute shouldNotifyVotingStart
Route->>Profile: load or create sender profile
Profile-->>Route: sender profile result
Route->>Relays: publish encrypted voting-start DMs
Relays-->>Route: RelayPublishResult[]
Route->>Voters: record attempted, delivered, failed counts
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • lacrypta/lacrypta-dev#2: Also changes hackathon inscription CTA rendering in app/hackathons/page.tsx and app/hackathons/[id]/page.tsx.
  • lacrypta/lacrypta-dev#36: Introduces the hackathon voting flow that this PR extends with a provider refactor and voting-start notification delivery.
  • lacrypta/lacrypta-dev#41: Touches app/hackathons/[id]/VotingSection.tsx, overlapping with the provider/context changes in this PR.

Poem

I hop where the opening dates align,
and nibble votes from clover vine.
A relayed whisper, bright and true,
sends voting-start DMs through.
🐇✨ The burrow cheers in tiny bytes!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/community-voting-notifications

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 freeto 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.

1 participant

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[codex] community voting notifications and controls - #42

Merged
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications
Jun 25, 2026
Merged

[codex] community voting notifications and controls#42
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jun 25, 2026

Copy link
Copy Markdown
Member

What changed

  • Sends NIP-04 voting-start DMs from the env LACRYPTA_NSEC to every eligible voter when an admin opens or refreshes community voting.
  • Ensures the sender has a kind-0 profile on relays, cloning the configured source profile when available and falling back to La Crypta Dev metadata.
  • Moves ballot controls into the existing hackathon project list so users do not see duplicate project lists while voting.
  • Adds an inscription-window helper so Inscribite gratis disappears after the registration deadline, including Gaming after its pitch-final date.

Why

Community voting needed a direct Nostr notification path when admins start voting, and the voting UI had two separate project lists. The inscription CTA also used the full hackathon lifecycle, so it remained visible after registration had already ended.

Validation

  • pnpm exec tsc --noEmit
  • git diff --check
  • Browser check at http://localhost:3001/hackathons/gaming#votar: voting controls are attached to the project list, no duplicate voting project list remains, and no Inscribite button appears after the inscription deadline.
  • Manual NIP-04 self-test published successfully to 6/6 configured relays.

Summary by CodeRabbit

  • New Features

    • Added voting-start notifications so admins can alert eligible voters when voting opens.
    • Introduced a more interactive voting experience with per-project vote controls and a clear publish action.
  • Bug Fixes

    • Improved hackathon inscription button visibility so it appears only when registration is actually open.
    • Updated voting and inscription timing rules to better match event dates.
  • UI Improvements

    • Refined voting page layout, including better scrolling behavior and clearer voting status messaging.

@vercel

vercelBot commented Jun 25, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJun 25, 2026 8:02pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 666ffc75-41fd-483c-a961-79faa93d9e5c

📥 Commits

Reviewing files that changed from the base of the PR and between 82861e4 and e99a8fb.

📒 Files selected for processing (6)
  • app/api/hackathons/[id]/voting/route.ts
  • app/hackathons/[id]/HackathonProjectsList.tsx
  • app/hackathons/[id]/VotingSection.tsx
  • app/hackathons/[id]/page.tsx
  • app/hackathons/page.tsx
  • lib/hackathons.ts

📝 Walkthrough

Walkthrough

Hackathon inscription buttons now follow date-based open-window checks, and the voting flow was refactored around a shared provider. The voting API can now publish Nostr voting-start notifications and report delivery counts to the client.

Changes

Hackathon Inscription Window

Layer / File(s)Summary
Date helpers
lib/hackathons.ts
New helpers derive the inscription deadline and open state from hackathon event dates.
CTA gating
app/hackathons/page.tsx, app/hackathons/[id]/page.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The home card, hackathon hero, and projects section now gate inscription actions with isHackathonInscriptionOpen, and the projects section adds the votar anchor with scroll offset classes.

Voting Provider and Notifications

Layer / File(s)Summary
Notification helpers
app/api/hackathons/[id]/voting/route.ts
The route adds profile and notification result types, parses profile JSON, resolves sender/source profiles, and builds encrypted voting-start DMs.
Open action notifications
app/api/hackathons/[id]/voting/route.ts
Opening voting now computes shouldNotifyVotingStart, publishes notifications after the voting event, logs misses, and returns a notifications summary.
Voting context and toast
app/hackathons/[id]/VotingSection.tsx
VotingSection now exposes voting state through VotingContext, can reuse or create VotingProvider, and appends notification delivery counts to the admin success toast.
Voting controls and page wiring
app/hackathons/[id]/page.tsx, app/hackathons/[id]/VotingSection.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The projects page wraps VotingProvider, and the list renders ProjectVotingToolbar and ProjectVotingControls in the revised row layout.

Sequence Diagram(s)

sequenceDiagram
participant Route as POST /app/api/hackathons/[id]/voting/route.ts
participant Profile as ensureSenderProfile
participant Relays as publishToRelays
participant Voters as eligible voters
Route->>Route: compute shouldNotifyVotingStart
Route->>Profile: load or create sender profile
Profile-->>Route: sender profile result
Route->>Relays: publish encrypted voting-start DMs
Relays-->>Route: RelayPublishResult[]
Route->>Voters: record attempted, delivered, failed counts
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • lacrypta/lacrypta-dev#2: Also changes hackathon inscription CTA rendering in app/hackathons/page.tsx and app/hackathons/[id]/page.tsx.
  • lacrypta/lacrypta-dev#36: Introduces the hackathon voting flow that this PR extends with a provider refactor and voting-start notification delivery.
  • lacrypta/lacrypta-dev#41: Touches app/hackathons/[id]/VotingSection.tsx, overlapping with the provider/context changes in this PR.

Poem

I hop where the opening dates align,
and nibble votes from clover vine.
A relayed whisper, bright and true,
sends voting-start DMs through.
🐇✨ The burrow cheers in tiny bytes!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/community-voting-notifications

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 freeto 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.

1 participant

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[codex] community voting notifications and controls - #42

Merged
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications
Jun 25, 2026
Merged

[codex] community voting notifications and controls#42
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jun 25, 2026

Copy link
Copy Markdown
Member

What changed

  • Sends NIP-04 voting-start DMs from the env LACRYPTA_NSEC to every eligible voter when an admin opens or refreshes community voting.
  • Ensures the sender has a kind-0 profile on relays, cloning the configured source profile when available and falling back to La Crypta Dev metadata.
  • Moves ballot controls into the existing hackathon project list so users do not see duplicate project lists while voting.
  • Adds an inscription-window helper so Inscribite gratis disappears after the registration deadline, including Gaming after its pitch-final date.

Why

Community voting needed a direct Nostr notification path when admins start voting, and the voting UI had two separate project lists. The inscription CTA also used the full hackathon lifecycle, so it remained visible after registration had already ended.

Validation

  • pnpm exec tsc --noEmit
  • git diff --check
  • Browser check at http://localhost:3001/hackathons/gaming#votar: voting controls are attached to the project list, no duplicate voting project list remains, and no Inscribite button appears after the inscription deadline.
  • Manual NIP-04 self-test published successfully to 6/6 configured relays.

Summary by CodeRabbit

  • New Features

    • Added voting-start notifications so admins can alert eligible voters when voting opens.
    • Introduced a more interactive voting experience with per-project vote controls and a clear publish action.
  • Bug Fixes

    • Improved hackathon inscription button visibility so it appears only when registration is actually open.
    • Updated voting and inscription timing rules to better match event dates.
  • UI Improvements

    • Refined voting page layout, including better scrolling behavior and clearer voting status messaging.

@vercel

vercelBot commented Jun 25, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJun 25, 2026 8:02pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 666ffc75-41fd-483c-a961-79faa93d9e5c

📥 Commits

Reviewing files that changed from the base of the PR and between 82861e4 and e99a8fb.

📒 Files selected for processing (6)
  • app/api/hackathons/[id]/voting/route.ts
  • app/hackathons/[id]/HackathonProjectsList.tsx
  • app/hackathons/[id]/VotingSection.tsx
  • app/hackathons/[id]/page.tsx
  • app/hackathons/page.tsx
  • lib/hackathons.ts

📝 Walkthrough

Walkthrough

Hackathon inscription buttons now follow date-based open-window checks, and the voting flow was refactored around a shared provider. The voting API can now publish Nostr voting-start notifications and report delivery counts to the client.

Changes

Hackathon Inscription Window

Layer / File(s)Summary
Date helpers
lib/hackathons.ts
New helpers derive the inscription deadline and open state from hackathon event dates.
CTA gating
app/hackathons/page.tsx, app/hackathons/[id]/page.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The home card, hackathon hero, and projects section now gate inscription actions with isHackathonInscriptionOpen, and the projects section adds the votar anchor with scroll offset classes.

Voting Provider and Notifications

Layer / File(s)Summary
Notification helpers
app/api/hackathons/[id]/voting/route.ts
The route adds profile and notification result types, parses profile JSON, resolves sender/source profiles, and builds encrypted voting-start DMs.
Open action notifications
app/api/hackathons/[id]/voting/route.ts
Opening voting now computes shouldNotifyVotingStart, publishes notifications after the voting event, logs misses, and returns a notifications summary.
Voting context and toast
app/hackathons/[id]/VotingSection.tsx
VotingSection now exposes voting state through VotingContext, can reuse or create VotingProvider, and appends notification delivery counts to the admin success toast.
Voting controls and page wiring
app/hackathons/[id]/page.tsx, app/hackathons/[id]/VotingSection.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The projects page wraps VotingProvider, and the list renders ProjectVotingToolbar and ProjectVotingControls in the revised row layout.

Sequence Diagram(s)

sequenceDiagram
participant Route as POST /app/api/hackathons/[id]/voting/route.ts
participant Profile as ensureSenderProfile
participant Relays as publishToRelays
participant Voters as eligible voters
Route->>Route: compute shouldNotifyVotingStart
Route->>Profile: load or create sender profile
Profile-->>Route: sender profile result
Route->>Relays: publish encrypted voting-start DMs
Relays-->>Route: RelayPublishResult[]
Route->>Voters: record attempted, delivered, failed counts
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • lacrypta/lacrypta-dev#2: Also changes hackathon inscription CTA rendering in app/hackathons/page.tsx and app/hackathons/[id]/page.tsx.
  • lacrypta/lacrypta-dev#36: Introduces the hackathon voting flow that this PR extends with a provider refactor and voting-start notification delivery.
  • lacrypta/lacrypta-dev#41: Touches app/hackathons/[id]/VotingSection.tsx, overlapping with the provider/context changes in this PR.

Poem

I hop where the opening dates align,
and nibble votes from clover vine.
A relayed whisper, bright and true,
sends voting-start DMs through.
🐇✨ The burrow cheers in tiny bytes!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/community-voting-notifications

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 freeto 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.

1 participant

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[codex] community voting notifications and controls - #42

Merged
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications
Jun 25, 2026
Merged

[codex] community voting notifications and controls#42
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jun 25, 2026

Copy link
Copy Markdown
Member

What changed

  • Sends NIP-04 voting-start DMs from the env LACRYPTA_NSEC to every eligible voter when an admin opens or refreshes community voting.
  • Ensures the sender has a kind-0 profile on relays, cloning the configured source profile when available and falling back to La Crypta Dev metadata.
  • Moves ballot controls into the existing hackathon project list so users do not see duplicate project lists while voting.
  • Adds an inscription-window helper so Inscribite gratis disappears after the registration deadline, including Gaming after its pitch-final date.

Why

Community voting needed a direct Nostr notification path when admins start voting, and the voting UI had two separate project lists. The inscription CTA also used the full hackathon lifecycle, so it remained visible after registration had already ended.

Validation

  • pnpm exec tsc --noEmit
  • git diff --check
  • Browser check at http://localhost:3001/hackathons/gaming#votar: voting controls are attached to the project list, no duplicate voting project list remains, and no Inscribite button appears after the inscription deadline.
  • Manual NIP-04 self-test published successfully to 6/6 configured relays.

Summary by CodeRabbit

  • New Features

    • Added voting-start notifications so admins can alert eligible voters when voting opens.
    • Introduced a more interactive voting experience with per-project vote controls and a clear publish action.
  • Bug Fixes

    • Improved hackathon inscription button visibility so it appears only when registration is actually open.
    • Updated voting and inscription timing rules to better match event dates.
  • UI Improvements

    • Refined voting page layout, including better scrolling behavior and clearer voting status messaging.

@vercel

vercelBot commented Jun 25, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJun 25, 2026 8:02pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 666ffc75-41fd-483c-a961-79faa93d9e5c

📥 Commits

Reviewing files that changed from the base of the PR and between 82861e4 and e99a8fb.

📒 Files selected for processing (6)
  • app/api/hackathons/[id]/voting/route.ts
  • app/hackathons/[id]/HackathonProjectsList.tsx
  • app/hackathons/[id]/VotingSection.tsx
  • app/hackathons/[id]/page.tsx
  • app/hackathons/page.tsx
  • lib/hackathons.ts

📝 Walkthrough

Walkthrough

Hackathon inscription buttons now follow date-based open-window checks, and the voting flow was refactored around a shared provider. The voting API can now publish Nostr voting-start notifications and report delivery counts to the client.

Changes

Hackathon Inscription Window

Layer / File(s)Summary
Date helpers
lib/hackathons.ts
New helpers derive the inscription deadline and open state from hackathon event dates.
CTA gating
app/hackathons/page.tsx, app/hackathons/[id]/page.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The home card, hackathon hero, and projects section now gate inscription actions with isHackathonInscriptionOpen, and the projects section adds the votar anchor with scroll offset classes.

Voting Provider and Notifications

Layer / File(s)Summary
Notification helpers
app/api/hackathons/[id]/voting/route.ts
The route adds profile and notification result types, parses profile JSON, resolves sender/source profiles, and builds encrypted voting-start DMs.
Open action notifications
app/api/hackathons/[id]/voting/route.ts
Opening voting now computes shouldNotifyVotingStart, publishes notifications after the voting event, logs misses, and returns a notifications summary.
Voting context and toast
app/hackathons/[id]/VotingSection.tsx
VotingSection now exposes voting state through VotingContext, can reuse or create VotingProvider, and appends notification delivery counts to the admin success toast.
Voting controls and page wiring
app/hackathons/[id]/page.tsx, app/hackathons/[id]/VotingSection.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The projects page wraps VotingProvider, and the list renders ProjectVotingToolbar and ProjectVotingControls in the revised row layout.

Sequence Diagram(s)

sequenceDiagram
participant Route as POST /app/api/hackathons/[id]/voting/route.ts
participant Profile as ensureSenderProfile
participant Relays as publishToRelays
participant Voters as eligible voters
Route->>Route: compute shouldNotifyVotingStart
Route->>Profile: load or create sender profile
Profile-->>Route: sender profile result
Route->>Relays: publish encrypted voting-start DMs
Relays-->>Route: RelayPublishResult[]
Route->>Voters: record attempted, delivered, failed counts
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • lacrypta/lacrypta-dev#2: Also changes hackathon inscription CTA rendering in app/hackathons/page.tsx and app/hackathons/[id]/page.tsx.
  • lacrypta/lacrypta-dev#36: Introduces the hackathon voting flow that this PR extends with a provider refactor and voting-start notification delivery.
  • lacrypta/lacrypta-dev#41: Touches app/hackathons/[id]/VotingSection.tsx, overlapping with the provider/context changes in this PR.

Poem

I hop where the opening dates align,
and nibble votes from clover vine.
A relayed whisper, bright and true,
sends voting-start DMs through.
🐇✨ The burrow cheers in tiny bytes!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/community-voting-notifications

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 freeto 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.

1 participant

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[codex] community voting notifications and controls - #42

Merged
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications
Jun 25, 2026
Merged

[codex] community voting notifications and controls#42
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jun 25, 2026

Copy link
Copy Markdown
Member

What changed

  • Sends NIP-04 voting-start DMs from the env LACRYPTA_NSEC to every eligible voter when an admin opens or refreshes community voting.
  • Ensures the sender has a kind-0 profile on relays, cloning the configured source profile when available and falling back to La Crypta Dev metadata.
  • Moves ballot controls into the existing hackathon project list so users do not see duplicate project lists while voting.
  • Adds an inscription-window helper so Inscribite gratis disappears after the registration deadline, including Gaming after its pitch-final date.

Why

Community voting needed a direct Nostr notification path when admins start voting, and the voting UI had two separate project lists. The inscription CTA also used the full hackathon lifecycle, so it remained visible after registration had already ended.

Validation

  • pnpm exec tsc --noEmit
  • git diff --check
  • Browser check at http://localhost:3001/hackathons/gaming#votar: voting controls are attached to the project list, no duplicate voting project list remains, and no Inscribite button appears after the inscription deadline.
  • Manual NIP-04 self-test published successfully to 6/6 configured relays.

Summary by CodeRabbit

  • New Features

    • Added voting-start notifications so admins can alert eligible voters when voting opens.
    • Introduced a more interactive voting experience with per-project vote controls and a clear publish action.
  • Bug Fixes

    • Improved hackathon inscription button visibility so it appears only when registration is actually open.
    • Updated voting and inscription timing rules to better match event dates.
  • UI Improvements

    • Refined voting page layout, including better scrolling behavior and clearer voting status messaging.

@vercel

vercelBot commented Jun 25, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJun 25, 2026 8:02pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 666ffc75-41fd-483c-a961-79faa93d9e5c

📥 Commits

Reviewing files that changed from the base of the PR and between 82861e4 and e99a8fb.

📒 Files selected for processing (6)
  • app/api/hackathons/[id]/voting/route.ts
  • app/hackathons/[id]/HackathonProjectsList.tsx
  • app/hackathons/[id]/VotingSection.tsx
  • app/hackathons/[id]/page.tsx
  • app/hackathons/page.tsx
  • lib/hackathons.ts

📝 Walkthrough

Walkthrough

Hackathon inscription buttons now follow date-based open-window checks, and the voting flow was refactored around a shared provider. The voting API can now publish Nostr voting-start notifications and report delivery counts to the client.

Changes

Hackathon Inscription Window

Layer / File(s)Summary
Date helpers
lib/hackathons.ts
New helpers derive the inscription deadline and open state from hackathon event dates.
CTA gating
app/hackathons/page.tsx, app/hackathons/[id]/page.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The home card, hackathon hero, and projects section now gate inscription actions with isHackathonInscriptionOpen, and the projects section adds the votar anchor with scroll offset classes.

Voting Provider and Notifications

Layer / File(s)Summary
Notification helpers
app/api/hackathons/[id]/voting/route.ts
The route adds profile and notification result types, parses profile JSON, resolves sender/source profiles, and builds encrypted voting-start DMs.
Open action notifications
app/api/hackathons/[id]/voting/route.ts
Opening voting now computes shouldNotifyVotingStart, publishes notifications after the voting event, logs misses, and returns a notifications summary.
Voting context and toast
app/hackathons/[id]/VotingSection.tsx
VotingSection now exposes voting state through VotingContext, can reuse or create VotingProvider, and appends notification delivery counts to the admin success toast.
Voting controls and page wiring
app/hackathons/[id]/page.tsx, app/hackathons/[id]/VotingSection.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The projects page wraps VotingProvider, and the list renders ProjectVotingToolbar and ProjectVotingControls in the revised row layout.

Sequence Diagram(s)

sequenceDiagram
participant Route as POST /app/api/hackathons/[id]/voting/route.ts
participant Profile as ensureSenderProfile
participant Relays as publishToRelays
participant Voters as eligible voters
Route->>Route: compute shouldNotifyVotingStart
Route->>Profile: load or create sender profile
Profile-->>Route: sender profile result
Route->>Relays: publish encrypted voting-start DMs
Relays-->>Route: RelayPublishResult[]
Route->>Voters: record attempted, delivered, failed counts
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • lacrypta/lacrypta-dev#2: Also changes hackathon inscription CTA rendering in app/hackathons/page.tsx and app/hackathons/[id]/page.tsx.
  • lacrypta/lacrypta-dev#36: Introduces the hackathon voting flow that this PR extends with a provider refactor and voting-start notification delivery.
  • lacrypta/lacrypta-dev#41: Touches app/hackathons/[id]/VotingSection.tsx, overlapping with the provider/context changes in this PR.

Poem

I hop where the opening dates align,
and nibble votes from clover vine.
A relayed whisper, bright and true,
sends voting-start DMs through.
🐇✨ The burrow cheers in tiny bytes!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/community-voting-notifications

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 freeto 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.

1 participant

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[codex] community voting notifications and controls - #42

Merged
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications
Jun 25, 2026
Merged

[codex] community voting notifications and controls#42
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jun 25, 2026

Copy link
Copy Markdown
Member

What changed

  • Sends NIP-04 voting-start DMs from the env LACRYPTA_NSEC to every eligible voter when an admin opens or refreshes community voting.
  • Ensures the sender has a kind-0 profile on relays, cloning the configured source profile when available and falling back to La Crypta Dev metadata.
  • Moves ballot controls into the existing hackathon project list so users do not see duplicate project lists while voting.
  • Adds an inscription-window helper so Inscribite gratis disappears after the registration deadline, including Gaming after its pitch-final date.

Why

Community voting needed a direct Nostr notification path when admins start voting, and the voting UI had two separate project lists. The inscription CTA also used the full hackathon lifecycle, so it remained visible after registration had already ended.

Validation

  • pnpm exec tsc --noEmit
  • git diff --check
  • Browser check at http://localhost:3001/hackathons/gaming#votar: voting controls are attached to the project list, no duplicate voting project list remains, and no Inscribite button appears after the inscription deadline.
  • Manual NIP-04 self-test published successfully to 6/6 configured relays.

Summary by CodeRabbit

  • New Features

    • Added voting-start notifications so admins can alert eligible voters when voting opens.
    • Introduced a more interactive voting experience with per-project vote controls and a clear publish action.
  • Bug Fixes

    • Improved hackathon inscription button visibility so it appears only when registration is actually open.
    • Updated voting and inscription timing rules to better match event dates.
  • UI Improvements

    • Refined voting page layout, including better scrolling behavior and clearer voting status messaging.

@vercel

vercelBot commented Jun 25, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJun 25, 2026 8:02pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 666ffc75-41fd-483c-a961-79faa93d9e5c

📥 Commits

Reviewing files that changed from the base of the PR and between 82861e4 and e99a8fb.

📒 Files selected for processing (6)
  • app/api/hackathons/[id]/voting/route.ts
  • app/hackathons/[id]/HackathonProjectsList.tsx
  • app/hackathons/[id]/VotingSection.tsx
  • app/hackathons/[id]/page.tsx
  • app/hackathons/page.tsx
  • lib/hackathons.ts

📝 Walkthrough

Walkthrough

Hackathon inscription buttons now follow date-based open-window checks, and the voting flow was refactored around a shared provider. The voting API can now publish Nostr voting-start notifications and report delivery counts to the client.

Changes

Hackathon Inscription Window

Layer / File(s)Summary
Date helpers
lib/hackathons.ts
New helpers derive the inscription deadline and open state from hackathon event dates.
CTA gating
app/hackathons/page.tsx, app/hackathons/[id]/page.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The home card, hackathon hero, and projects section now gate inscription actions with isHackathonInscriptionOpen, and the projects section adds the votar anchor with scroll offset classes.

Voting Provider and Notifications

Layer / File(s)Summary
Notification helpers
app/api/hackathons/[id]/voting/route.ts
The route adds profile and notification result types, parses profile JSON, resolves sender/source profiles, and builds encrypted voting-start DMs.
Open action notifications
app/api/hackathons/[id]/voting/route.ts
Opening voting now computes shouldNotifyVotingStart, publishes notifications after the voting event, logs misses, and returns a notifications summary.
Voting context and toast
app/hackathons/[id]/VotingSection.tsx
VotingSection now exposes voting state through VotingContext, can reuse or create VotingProvider, and appends notification delivery counts to the admin success toast.
Voting controls and page wiring
app/hackathons/[id]/page.tsx, app/hackathons/[id]/VotingSection.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The projects page wraps VotingProvider, and the list renders ProjectVotingToolbar and ProjectVotingControls in the revised row layout.

Sequence Diagram(s)

sequenceDiagram
participant Route as POST /app/api/hackathons/[id]/voting/route.ts
participant Profile as ensureSenderProfile
participant Relays as publishToRelays
participant Voters as eligible voters
Route->>Route: compute shouldNotifyVotingStart
Route->>Profile: load or create sender profile
Profile-->>Route: sender profile result
Route->>Relays: publish encrypted voting-start DMs
Relays-->>Route: RelayPublishResult[]
Route->>Voters: record attempted, delivered, failed counts
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • lacrypta/lacrypta-dev#2: Also changes hackathon inscription CTA rendering in app/hackathons/page.tsx and app/hackathons/[id]/page.tsx.
  • lacrypta/lacrypta-dev#36: Introduces the hackathon voting flow that this PR extends with a provider refactor and voting-start notification delivery.
  • lacrypta/lacrypta-dev#41: Touches app/hackathons/[id]/VotingSection.tsx, overlapping with the provider/context changes in this PR.

Poem

I hop where the opening dates align,
and nibble votes from clover vine.
A relayed whisper, bright and true,
sends voting-start DMs through.
🐇✨ The burrow cheers in tiny bytes!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/community-voting-notifications

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 freeto 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.

1 participant

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[codex] community voting notifications and controls - #42

Merged
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications
Jun 25, 2026
Merged

[codex] community voting notifications and controls#42
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jun 25, 2026

Copy link
Copy Markdown
Member

What changed

  • Sends NIP-04 voting-start DMs from the env LACRYPTA_NSEC to every eligible voter when an admin opens or refreshes community voting.
  • Ensures the sender has a kind-0 profile on relays, cloning the configured source profile when available and falling back to La Crypta Dev metadata.
  • Moves ballot controls into the existing hackathon project list so users do not see duplicate project lists while voting.
  • Adds an inscription-window helper so Inscribite gratis disappears after the registration deadline, including Gaming after its pitch-final date.

Why

Community voting needed a direct Nostr notification path when admins start voting, and the voting UI had two separate project lists. The inscription CTA also used the full hackathon lifecycle, so it remained visible after registration had already ended.

Validation

  • pnpm exec tsc --noEmit
  • git diff --check
  • Browser check at http://localhost:3001/hackathons/gaming#votar: voting controls are attached to the project list, no duplicate voting project list remains, and no Inscribite button appears after the inscription deadline.
  • Manual NIP-04 self-test published successfully to 6/6 configured relays.

Summary by CodeRabbit

  • New Features

    • Added voting-start notifications so admins can alert eligible voters when voting opens.
    • Introduced a more interactive voting experience with per-project vote controls and a clear publish action.
  • Bug Fixes

    • Improved hackathon inscription button visibility so it appears only when registration is actually open.
    • Updated voting and inscription timing rules to better match event dates.
  • UI Improvements

    • Refined voting page layout, including better scrolling behavior and clearer voting status messaging.

@vercel

vercelBot commented Jun 25, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJun 25, 2026 8:02pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 666ffc75-41fd-483c-a961-79faa93d9e5c

📥 Commits

Reviewing files that changed from the base of the PR and between 82861e4 and e99a8fb.

📒 Files selected for processing (6)
  • app/api/hackathons/[id]/voting/route.ts
  • app/hackathons/[id]/HackathonProjectsList.tsx
  • app/hackathons/[id]/VotingSection.tsx
  • app/hackathons/[id]/page.tsx
  • app/hackathons/page.tsx
  • lib/hackathons.ts

📝 Walkthrough

Walkthrough

Hackathon inscription buttons now follow date-based open-window checks, and the voting flow was refactored around a shared provider. The voting API can now publish Nostr voting-start notifications and report delivery counts to the client.

Changes

Hackathon Inscription Window

Layer / File(s)Summary
Date helpers
lib/hackathons.ts
New helpers derive the inscription deadline and open state from hackathon event dates.
CTA gating
app/hackathons/page.tsx, app/hackathons/[id]/page.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The home card, hackathon hero, and projects section now gate inscription actions with isHackathonInscriptionOpen, and the projects section adds the votar anchor with scroll offset classes.

Voting Provider and Notifications

Layer / File(s)Summary
Notification helpers
app/api/hackathons/[id]/voting/route.ts
The route adds profile and notification result types, parses profile JSON, resolves sender/source profiles, and builds encrypted voting-start DMs.
Open action notifications
app/api/hackathons/[id]/voting/route.ts
Opening voting now computes shouldNotifyVotingStart, publishes notifications after the voting event, logs misses, and returns a notifications summary.
Voting context and toast
app/hackathons/[id]/VotingSection.tsx
VotingSection now exposes voting state through VotingContext, can reuse or create VotingProvider, and appends notification delivery counts to the admin success toast.
Voting controls and page wiring
app/hackathons/[id]/page.tsx, app/hackathons/[id]/VotingSection.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The projects page wraps VotingProvider, and the list renders ProjectVotingToolbar and ProjectVotingControls in the revised row layout.

Sequence Diagram(s)

sequenceDiagram
participant Route as POST /app/api/hackathons/[id]/voting/route.ts
participant Profile as ensureSenderProfile
participant Relays as publishToRelays
participant Voters as eligible voters
Route->>Route: compute shouldNotifyVotingStart
Route->>Profile: load or create sender profile
Profile-->>Route: sender profile result
Route->>Relays: publish encrypted voting-start DMs
Relays-->>Route: RelayPublishResult[]
Route->>Voters: record attempted, delivered, failed counts
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • lacrypta/lacrypta-dev#2: Also changes hackathon inscription CTA rendering in app/hackathons/page.tsx and app/hackathons/[id]/page.tsx.
  • lacrypta/lacrypta-dev#36: Introduces the hackathon voting flow that this PR extends with a provider refactor and voting-start notification delivery.
  • lacrypta/lacrypta-dev#41: Touches app/hackathons/[id]/VotingSection.tsx, overlapping with the provider/context changes in this PR.

Poem

I hop where the opening dates align,
and nibble votes from clover vine.
A relayed whisper, bright and true,
sends voting-start DMs through.
🐇✨ The burrow cheers in tiny bytes!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/community-voting-notifications

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 freeto 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.

1 participant

@agustinkassis
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[codex] community voting notifications and controls - #42

Merged
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications
Jun 25, 2026
Merged

[codex] community voting notifications and controls#42
agustinkassis merged 1 commit into
mainfrom
codex/community-voting-notifications

Conversation

@agustinkassis

@agustinkassisagustinkassis commented Jun 25, 2026

Copy link
Copy Markdown
Member

What changed

  • Sends NIP-04 voting-start DMs from the env LACRYPTA_NSEC to every eligible voter when an admin opens or refreshes community voting.
  • Ensures the sender has a kind-0 profile on relays, cloning the configured source profile when available and falling back to La Crypta Dev metadata.
  • Moves ballot controls into the existing hackathon project list so users do not see duplicate project lists while voting.
  • Adds an inscription-window helper so Inscribite gratis disappears after the registration deadline, including Gaming after its pitch-final date.

Why

Community voting needed a direct Nostr notification path when admins start voting, and the voting UI had two separate project lists. The inscription CTA also used the full hackathon lifecycle, so it remained visible after registration had already ended.

Validation

  • pnpm exec tsc --noEmit
  • git diff --check
  • Browser check at http://localhost:3001/hackathons/gaming#votar: voting controls are attached to the project list, no duplicate voting project list remains, and no Inscribite button appears after the inscription deadline.
  • Manual NIP-04 self-test published successfully to 6/6 configured relays.

Summary by CodeRabbit

  • New Features

    • Added voting-start notifications so admins can alert eligible voters when voting opens.
    • Introduced a more interactive voting experience with per-project vote controls and a clear publish action.
  • Bug Fixes

    • Improved hackathon inscription button visibility so it appears only when registration is actually open.
    • Updated voting and inscription timing rules to better match event dates.
  • UI Improvements

    • Refined voting page layout, including better scrolling behavior and clearer voting status messaging.

@vercel

vercelBot commented Jun 25, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
lacrypta-devReadyReadyPreview, CommentJun 25, 2026 8:02pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 666ffc75-41fd-483c-a961-79faa93d9e5c

📥 Commits

Reviewing files that changed from the base of the PR and between 82861e4 and e99a8fb.

📒 Files selected for processing (6)
  • app/api/hackathons/[id]/voting/route.ts
  • app/hackathons/[id]/HackathonProjectsList.tsx
  • app/hackathons/[id]/VotingSection.tsx
  • app/hackathons/[id]/page.tsx
  • app/hackathons/page.tsx
  • lib/hackathons.ts

📝 Walkthrough

Walkthrough

Hackathon inscription buttons now follow date-based open-window checks, and the voting flow was refactored around a shared provider. The voting API can now publish Nostr voting-start notifications and report delivery counts to the client.

Changes

Hackathon Inscription Window

Layer / File(s)Summary
Date helpers
lib/hackathons.ts
New helpers derive the inscription deadline and open state from hackathon event dates.
CTA gating
app/hackathons/page.tsx, app/hackathons/[id]/page.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The home card, hackathon hero, and projects section now gate inscription actions with isHackathonInscriptionOpen, and the projects section adds the votar anchor with scroll offset classes.

Voting Provider and Notifications

Layer / File(s)Summary
Notification helpers
app/api/hackathons/[id]/voting/route.ts
The route adds profile and notification result types, parses profile JSON, resolves sender/source profiles, and builds encrypted voting-start DMs.
Open action notifications
app/api/hackathons/[id]/voting/route.ts
Opening voting now computes shouldNotifyVotingStart, publishes notifications after the voting event, logs misses, and returns a notifications summary.
Voting context and toast
app/hackathons/[id]/VotingSection.tsx
VotingSection now exposes voting state through VotingContext, can reuse or create VotingProvider, and appends notification delivery counts to the admin success toast.
Voting controls and page wiring
app/hackathons/[id]/page.tsx, app/hackathons/[id]/VotingSection.tsx, app/hackathons/[id]/HackathonProjectsList.tsx
The projects page wraps VotingProvider, and the list renders ProjectVotingToolbar and ProjectVotingControls in the revised row layout.

Sequence Diagram(s)

sequenceDiagram
participant Route as POST /app/api/hackathons/[id]/voting/route.ts
participant Profile as ensureSenderProfile
participant Relays as publishToRelays
participant Voters as eligible voters
Route->>Route: compute shouldNotifyVotingStart
Route->>Profile: load or create sender profile
Profile-->>Route: sender profile result
Route->>Relays: publish encrypted voting-start DMs
Relays-->>Route: RelayPublishResult[]
Route->>Voters: record attempted, delivered, failed counts
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • lacrypta/lacrypta-dev#2: Also changes hackathon inscription CTA rendering in app/hackathons/page.tsx and app/hackathons/[id]/page.tsx.
  • lacrypta/lacrypta-dev#36: Introduces the hackathon voting flow that this PR extends with a provider refactor and voting-start notification delivery.
  • lacrypta/lacrypta-dev#41: Touches app/hackathons/[id]/VotingSection.tsx, overlapping with the provider/context changes in this PR.

Poem

I hop where the opening dates align,
and nibble votes from clover vine.
A relayed whisper, bright and true,
sends voting-start DMs through.
🐇✨ The burrow cheers in tiny bytes!

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/community-voting-notifications

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 freeto 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.

1 participant

@agustinkassis