diff --git a/components/BeamCalls.tsx b/components/BeamCalls.tsx
index aee80e6..3962f5d 100644
--- a/components/BeamCalls.tsx
+++ b/components/BeamCalls.tsx
@@ -3,7 +3,7 @@ import { ExternalLink, FileText, ListChecks, Play, Presentation } from 'lucide-r
import { Card, CardContent, CardFooter } from '@/components/ui/primitives';
import { Button } from '@/components/ui/Button';
import Link from 'next/link';
-import { BeamCall, beamCallsData } from '@/data/beam-calls';
+import { BeamCall, beamCallsData, determineBeamCallStatus } from '@/data/beam-calls';
// Helper function to extract YouTube video ID from URL
function getYoutubeVideoId(url: string): string | null {
@@ -33,101 +33,107 @@ export function BeamCalls() {
return (
{beamCallsData.map((call) => (
-
-
- {call.youtubeUrl !== '#' && getYoutubeVideoId(call.youtubeUrl) ? (
-
-
-
- ) : (
- <>
-
- {call.youtubeUrl !== '#' && (
-
- )}
- >
- )}
+
+ ))}
+
+ );
+}
+
+function BeamCallCard({ call }: { call: BeamCall }) {
+ const status = determineBeamCallStatus(call.date);
+
+ return (
+
+
+ {call.youtubeUrl !== '#' && getYoutubeVideoId(call.youtubeUrl) ? (
+
+
-
- {call.youtubeUrl !== '#' ? (
-
- {call.title}
-
- ) : (
-
-
{call.title}
- {call.status === 'upcoming' && (
-
- Soon!
-
- )}
-
- )}
- {call.date}
- {call.summary}
- {call.resources && call.resources.length > 0 && (
-
-
Resources:
-
- {call.resources.map((resource, index) => (
-
- {getResourceIcon(resource.type)}
- {resource.title}
-
- ))}
-
+ ) : (
+ <>
+
+ {call.youtubeUrl !== '#' && (
+
)}
-
-
- {call.youtubeUrl !== '#' ? (
-
- Watch on YouTube
-
- ) : (
- Recording not yet available.
+ >
+ )}
+
+
+ {call.youtubeUrl !== '#' ? (
+
+ {call.title}
+
+ ) : (
+
+
{call.title}
+ {status === 'upcoming' && (
+
Soon!
)}
-
-
- ))}
-
+
+ )}
+ {call.date}
+ {call.summary}
+ {call.resources && call.resources.length > 0 && (
+
+
Resources:
+
+ {call.resources.map((resource, index) => (
+
+ {getResourceIcon(resource.type)}
+ {resource.title}
+
+ ))}
+
+
+ )}
+
+
+ {call.youtubeUrl !== '#' ? (
+
+ Watch on YouTube
+
+ ) : (
+ Recording not yet available.
+ )}
+
+
);
}
diff --git a/data/beam-calls.tsx b/data/beam-calls.tsx
index 5a15e49..93b1962 100644
--- a/data/beam-calls.tsx
+++ b/data/beam-calls.tsx
@@ -1,10 +1,11 @@
+export type BeamCallStatus = 'completed' | 'upcoming' | 'scheduled' | 'unscheduled';
+
export interface BeamCall {
id: string;
title: string;
- status: 'completed' | 'upcoming' | 'unscheduled';
date: string;
summary: string;
- thumbnail: string;
+ thumbnail: string | null;
youtubeUrl: string;
resources?: {
title: string;
@@ -13,11 +14,23 @@ export interface BeamCall {
}[];
}
+export function determineBeamCallStatus(date: string): BeamCallStatus {
+ if (date === 'TBD') return 'unscheduled';
+
+ const callDate = new Date(date);
+ const today = new Date();
+ const oneMonthFromNow = new Date();
+ oneMonthFromNow.setMonth(today.getMonth() + 1);
+
+ if (callDate < today) return 'completed';
+ if (callDate <= oneMonthFromNow) return 'upcoming';
+ return 'scheduled';
+}
+
export const beamCallsData: BeamCall[] = [
{
id: 'call-1',
title: 'Beam Call #1: Social Layer Updates',
- status: 'completed',
date: 'February 14, 2025',
summary:
'The kickoff call covering social layer progress, funding structures, legal updates, introductions of research specialists and client teams, and coordinator presentations',
@@ -39,7 +52,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-2',
title: 'Beam Call #2: Post-Quantum Security',
- status: 'completed',
date: 'February 28, 2025',
summary:
'Technical updates on post-quantum cryptography solutions, featuring technical presentations from researchers on signature schemes, hash functions, minimal zkVMs, and formal verification.',
@@ -81,7 +93,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-3',
title: 'Beam Call #3: P2P Networking',
- status: 'completed',
date: 'April 4, 2025',
summary: 'Discussion on the latest developments in peer-to-peer networking.',
thumbnail: null,
@@ -142,7 +153,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-4',
title: 'Beam Call #4: Exit Queue',
- status: 'completed',
date: 'April 18, 2025',
summary:
'Discussion of Ethereum validator exit mechanisms and proposals to improve exit queue flexibility while maintaining protocol security.',
@@ -169,7 +179,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-5',
title: 'Beam Call #5: APS (Attester-Proposer Separation)',
- status: 'completed',
date: 'May 2, 2025',
summary:
'Exploration of the Attester-Proposer Separation (APS) concept, its benefits, and potential applications for the Beam Chain.',
@@ -191,7 +200,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-6',
title: 'Beam Call #6: 3SF (Finality)',
- status: 'upcoming',
date: 'May 16, 2025',
summary:
'Discussion on the finality of the 3SF protocol, including its implementation and implications on the network.',
@@ -213,7 +221,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-7',
title: 'Beam Call #7: Rainbow Staking',
- status: 'upcoming',
date: 'May 30, 2025',
summary:
'Introduction to Rainbow Staking, a novel staking mechanism designed to enhance network security and decentralization.',
@@ -223,7 +230,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-8',
title: 'Beam Call #8: PQ Sub-Spec',
- status: 'unscheduled',
date: 'TBD',
summary:
'In-depth discussion on the Post-Quantum (PQ) sub-specification, focusing on its cryptographic aspects and integration into the Beam Chain.',
@@ -233,7 +239,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-9',
title: 'Beam Call #9: P2P Sub-Spec',
- status: 'unscheduled',
date: 'TBD',
summary:
'Examination of the Peer-to-Peer (P2P) sub-specification, covering its role in facilitating decentralized communication within the Beam Chain.',
@@ -243,7 +248,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-10',
title: 'Beam Call #10: APS Sub-Spec',
- status: 'unscheduled',
date: 'TBD',
summary:
'Exploring the Attester-Proposer Separation (APS) sub-specification, its benefits, and potential applications in the Beam Chain.',
@@ -253,7 +257,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-11',
title: 'Beam Call #11: 3SF Sub-Spec',
- status: 'unscheduled',
date: 'TBD',
summary:
"Delving into the 3SF sub-specification, including its technical details and implications for the network's finality.",
@@ -263,7 +266,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-12',
title: 'Beam Call #12: Beam Spec (Part 1)',
- status: 'unscheduled',
date: 'TBD',
summary:
'First part of the Beam specification discussion, covering the overall architecture and core components of the Beam Chain.',
@@ -273,7 +275,6 @@ export const beamCallsData: BeamCall[] = [
{
id: 'call-13',
title: 'Beam Call #13: Beam Spec (Part 2)',
- status: 'upcoming',
date: 'December 26, 2025',
summary:
"Second part of the Beam specification discussion, focusing on the protocol's advanced features, security considerations, and future development plans.",