Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
57b8630
Modify project (#319)
Benjtalkshow Oct 10, 2025
5aa1b5e
Merge branch 'production' of https://github.com/0xdevcollins/boundless
0xdevcollins Oct 10, 2025
5873a4e
Collins (#321)
0xdevcollins Oct 12, 2025
321231a
Organization (#320)
Benjtalkshow Oct 12, 2025
a606af6
Collins (#322)
0xdevcollins Oct 12, 2025
1037842
Collins (#323)
0xdevcollins Oct 12, 2025
8201452
Collins (#324)
0xdevcollins Oct 12, 2025
5215963
Collins (#325)
0xdevcollins Oct 12, 2025
650bfeb
Collins (#327)
0xdevcollins Oct 12, 2025
864beef
Collins (#328)
0xdevcollins Oct 14, 2025
f97e40e
fix: modify api.ts (#329)
Benjtalkshow Oct 14, 2025
0490d86
Collins (#330)
0xdevcollins Oct 16, 2025
a54a1a3
feat: fj
0xdevcollins Oct 16, 2025
6ea3ee7
Mod (#331)
Benjtalkshow Oct 18, 2025
1e184eb
Collins (#333)
0xdevcollins Oct 19, 2025
be2dbfe
Collins (#334)
0xdevcollins Oct 19, 2025
931dc45
Collins (#335)
0xdevcollins Oct 20, 2025
a5d9046
Collins (#336)
0xdevcollins Oct 20, 2025
1c80425
fix: update api
0xdevcollins Oct 20, 2025
20a035f
Organization fixes (#337)
Benjtalkshow Oct 20, 2025
73997b1
feat: Enhance organization components and navbar layout
0xdevcollins Oct 22, 2025
64d76c0
feat: Add new hackathon management features and update dependencies
0xdevcollins Oct 22, 2025
f8d0404
feat: Implement new tabs and forms for hackathon management
0xdevcollins Nov 5, 2025
001a49d
feat: Add media-chrome dependency and enhance hackathon management co…
0xdevcollins Nov 6, 2025
72ab253
chore: update package-lock.json with dependency version upgrades
0xdevcollins Nov 6, 2025
6694ee9
feat: Implement rewards management for hackathons
0xdevcollins Nov 7, 2025
187ba1b
Organization fixes (#338)
Benjtalkshow Nov 8, 2025
3dd43ca
Organization fixes (#339)
Benjtalkshow Nov 8, 2025
66327be
feat: hackathon and trustless work integration
0xdevcollins Nov 9, 2025
df10310
fix: minor fixes
0xdevcollins Nov 9, 2025
edbfe1a
feat: updated the org
0xdevcollins Nov 9, 2025
89f304b
feat: updated the org
0xdevcollins Nov 9, 2025
883868b
feat: updated the org
0xdevcollins Nov 9, 2025
de31da1
Feat/hackthon features (#340)
0xdevcollins Nov 15, 2025
730c794
Feat/hackthon features (#341)
0xdevcollins Nov 15, 2025
d9ee18b
Feat/hackthon features (#342)
0xdevcollins Nov 15, 2025
07ca664
Feat/hackthon features (#343)
0xdevcollins Nov 15, 2025
697857a
Feat/hackthon features (#344)
0xdevcollins Nov 15, 2025
99d436d
Hackathon details (#345)
Benjtalkshow Nov 15, 2025
4e8d0bc
Feat/hackthon features (#346)
0xdevcollins Nov 15, 2025
17694d4
Hackathon details (#347)
Benjtalkshow Nov 15, 2025
49a6124
Hackathon details (#348)
Benjtalkshow Nov 16, 2025
c1cd960
fix: Refactor authentication system to use Better Auth; remove NextAu…
0xdevcollins Nov 16, 2025
404e0de
Merge branch 'main' of github.com:0xdevcollins/boundless
0xdevcollins Nov 16, 2025
0c798be
refactor: streamline middleware logging, adjust layout margins, and e…
0xdevcollins Nov 16, 2025
2b13007
feat: add hackathon preview page and enhance organization management …
0xdevcollins Nov 16, 2025
951d107
chore: update API base URL to production endpoint for Better Auth int…
0xdevcollins Nov 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
55 changes: 55 additions & 0 deletions .cursor/rules/trustless-rule.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
alwaysApply: true
---
You are a **Senior Front-End Developer** and **Expert** in:
- ReactJS, NextJS, JavaScript, TypeScript
- TailwindCSS, Shadcn, Radix UI
- HTML, CSS, and modern UI/UX best practices

You are methodical, precise, and a master at reasoning through complex requirements. You always provide correct, DRY, bug-free, production-ready code.

## General Rules
- Follow the user’s requirements **exactly** as stated.
- Think step-by-step:
1. **Analyze** the requirement.
2. **Write detailed pseudocode** describing the implementation plan.
3. **Confirm** the plan (if asked).
4. **Write complete code** that matches the plan.
- Never guess. If something is unclear, ask for clarification.
- If an external library is mentioned, always refer to its official documentation before implementation.
- Always ensure the final code is fully functional, with no placeholders, `TODO`s, or missing parts.
- Prefer readability over performance.
- Use best practices for React & Next.js development.
- Do not use cd in order to access to determinate root, neither use &&, | or something like that in shell actions.
- Do not verify the build during the Trustless Work implementations.
- In each npm i, the name of the dependency must be enclosed in double quotation marks (“”).
- Do not ask for 2 o more ways to implement, just do it the best way possible.
- Do not plan or ask for steps; just implement the code without asking questions.

## Trustless Work Integration Context
When working with Trustless Work:
- Documentation (I'll provide you the docs in the cursor docs management):
- React Library → <https://docs.trustlesswork.com/trustless-work/react-library>
- Wallet Kit → <https://docs.trustlesswork.com/trustless-work/developer-resources/stellar-wallet-kit-quick-integration>
- Types → <https://docs.trustlesswork.com/trustless-work/developer-resources/types>
- Ensure proper installation and configuration before usage.
- Use provided Types from the documentation when applicable.
- Follow the API and component usage exactly as described in the docs.
- Do not use any, instead always you must search for the Trustless Work entities.

## Code Implementation Guidelines
- Use **TailwindCSS classes** for styling; avoid plain CSS.
- For conditional classes, prefer `clsx` or similar helper functions over ternary operators in JSX.
- Use **descriptive** variable, function, and component names.
- Event handlers start with `handle` (e.g., `handleClick`, `handleSubmit`).
- Prefer **const** arrow functions with explicit type annotations over `function` declarations.
- Always include all necessary imports at the top.
- Use early returns to improve code clarity.

## Verification Before Delivery
Before finalizing:
1. Check that all required imports are present.
2. Ensure the code compiles in a Next.js 14+ environment.
3. Confirm that Tailwind and Shadcn styles render correctly.
4. Verify that Trustless Work components or hooks are properly initialized.
5. Ensure TypeScript types are correct and there are no type errors.
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"liveServer.settings.port": 5501
}
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,10 @@ Before you begin, ensure you have the following installed:
# Stellar Configuration
NEXT_PUBLIC_STELLAR_NETWORK=testnet
NEXT_PUBLIC_APP_URL=http://localhost:3000

# Trustless Work Configuration (optional)
# Get your API key from: https://docs.trustlesswork.com
NEXT_PUBLIC_TRUSTLESS_WORK_API_KEY=your-trustless-work-api-key
```

6. **Run the development server:**
Expand Down
15 changes: 15 additions & 0 deletions app/(landing)/bounties/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import React from 'react';
import { Metadata } from 'next';
import { generatePageMetadata } from '@/lib/metadata';

export const metadata: Metadata = generatePageMetadata('grants');

const GrantPage = () => {
return (
<div className='mx-auto mt-10 max-w-[1440px] px-5 py-5 text-center text-4xl font-bold text-white md:px-[50px] lg:px-[100px]'>
Bounties Page
</div>
);
};

export default GrantPage;
133 changes: 133 additions & 0 deletions app/(landing)/hackathons/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
'use client';

import { useState, useEffect, useMemo } from 'react';
import { useRouter, useSearchParams, useParams } from 'next/navigation';
import { useHackathonData } from '@/lib/providers/hackathonProvider';

import { HackathonBanner } from '@/components/hackathons/hackathonBanner';
import { HackathonNavTabs } from '@/components/hackathons/hackathonNavTabs';
import { HackathonOverview } from '@/components/hackathons/overview/hackathonOverview';
import { HackathonParticipants } from '@/components/hackathons/participants/hackathonParticipant';
import { HackathonResources } from '@/components/hackathons/resources/resources';
import SubmissionTab from '@/components/hackathons/submissions/submissionTab';
import { HackathonDiscussions } from '@/components/hackathons/discussion/comment';
import LoadingScreen from '@/components/landing-page/project/CreateProjectModal/LoadingScreen';

export default function HackathonPage() {
const router = useRouter();
const searchParams = useSearchParams();
const params = useParams();

const {
currentHackathon,
content,
timelineEvents,
participants,
submissions,
prizes,
loading,
setCurrentHackathon,
} = useHackathonData();

const hackathonTabs = useMemo(
() => [
{ id: 'overview', label: 'Overview' },
{ id: 'participants', label: 'Participants', badge: participants.length },
{ id: 'resources', label: 'Resources' },
{
id: 'submission',
label: 'Submissions',
badge: submissions.filter(p => p.status === 'Approved').length,
},
{ id: 'discussions', label: 'Discussions' },
],
[participants.length, submissions]
);

const hackathonId = params.slug as string;
const [activeTab, setActiveTab] = useState('overview');

useEffect(() => {
if (hackathonId) {
setCurrentHackathon(hackathonId);
}
}, [hackathonId, setCurrentHackathon]);

useEffect(() => {
const tabFromUrl = searchParams.get('tab');
if (tabFromUrl && hackathonTabs.some(tab => tab.id === tabFromUrl)) {
setActiveTab(tabFromUrl);
}
}, [searchParams, hackathonTabs]);

const handleTabChange = (tabId: string) => {
setActiveTab(tabId);
const params = new URLSearchParams(searchParams.toString());
params.set('tab', tabId);
router.push(`?${params.toString()}`, { scroll: false });
};

if (loading) {
return <LoadingScreen />;
}

if (!currentHackathon) {
return (
<div className='flex min-h-screen items-center justify-center'>
<div className='text-center'>
<h1 className='mb-4 text-2xl font-bold text-white'>
Hackathon not found
</h1>
<p className='text-gray-400'>
The hackathon you're looking for doesn't exist.
</p>
</div>
</div>
);
}

return (
<div className='mx-auto mt-10 max-w-[1440px] px-5 py-5 text-center text-4xl font-bold text-white md:px-[50px] lg:px-[100px]'>
{/* Banner */}
<HackathonBanner
title={currentHackathon.title}
subtitle={currentHackathon.subtitle}
deadline={currentHackathon.deadline}
categories={currentHackathon.categories}
status={currentHackathon.status}
participants={currentHackathon.participants}
totalPrizePool={currentHackathon.totalPrizePool}
imageUrl={currentHackathon.imageUrl}
startDate={currentHackathon.startDate} // if upcoming
/>

{/* Tabs */}
<HackathonNavTabs
tabs={hackathonTabs}
activeTab={activeTab}
onTabChange={handleTabChange}
/>

{/* Content */}
<div className='mx-auto max-w-7xl px-6 py-12 text-white'>
{activeTab === 'overview' && (
<HackathonOverview
content={content}
timelineEvents={timelineEvents}
prizes={prizes}
/>
)}

{activeTab === 'participants' && <HackathonParticipants />}

{activeTab === 'resources' && <HackathonResources />}

{activeTab === 'submission' && <SubmissionTab />}

{activeTab === 'discussions' && (
<HackathonDiscussions hackathonId={hackathonId} />
)}
</div>
</div>
);
}
22 changes: 22 additions & 0 deletions app/(landing)/hackathons/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { HackathonDataProvider } from '@/lib/providers/hackathonProvider';
import { use } from 'react';

interface HackathonLayoutProps {
children: React.ReactNode;
params: Promise<{
slug?: string;
}>;
}

export default function HackathonLayout({
children,
params,
}: HackathonLayoutProps) {
const resolvedParams = use(params);

return (
<HackathonDataProvider hackathonSlug={resolvedParams.slug}>
{children}
</HackathonDataProvider>
);
}
14 changes: 7 additions & 7 deletions app/(landing)/hackathons/page.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import React from 'react';
import { Metadata } from 'next';
import { generatePageMetadata } from '@/lib/metadata';
import HackathonsPageHero from '@/components/hackathons/HackathonsPageHero';
import HackathonsPage from '@/components/hackathons/HackathonsPage';

export const metadata: Metadata = generatePageMetadata('hackathons');

const HackathonsPage = () => {
export default function HackathonsPageRoute() {
return (
<div className='mx-auto mt-10 max-w-[1440px] px-5 py-5 text-center text-4xl font-bold text-white md:px-[50px] lg:px-[100px]'>
Hackathons Page
<div className='relative mx-auto min-h-screen max-w-[1440px] px-5 py-5 md:px-[50px] lg:px-[100px]'>
<HackathonsPageHero />
<HackathonsPage />
</div>
);
};

export default HackathonsPage;
}
Loading
Loading