From 01eb776187dd2d69a564ed8dc1c6d02948cebd3a Mon Sep 17 00:00:00 2001 From: Talha Amjad Date: Mon, 1 Jun 2026 12:46:57 +0500 Subject: [PATCH 1/2] Add repo urls and stra them --- app/admin/dsoc/projects/[id]/edit/page.tsx | 86 ++++++++++++++-------- app/admin/dsoc/projects/new/page.tsx | 79 ++++++++++++-------- app/dsoc/page.tsx | 10 ++- app/dsoc/projects/[id]/page.tsx | 75 +++++++++++++++---- app/dsoc/projects/page.tsx | 10 ++- models/DSOCProject.ts | 6 +- 6 files changed, 185 insertions(+), 81 deletions(-) diff --git a/app/admin/dsoc/projects/[id]/edit/page.tsx b/app/admin/dsoc/projects/[id]/edit/page.tsx index 3bc6e6b..36e8bc2 100644 --- a/app/admin/dsoc/projects/[id]/edit/page.tsx +++ b/app/admin/dsoc/projects/[id]/edit/page.tsx @@ -44,7 +44,7 @@ export default function EditProjectPage() { description: '', longDescription: '', organization: '', - repositoryUrl: '', + repositoryUrls: [''], websiteUrl: '', timelineUrl: '', difficulty: 'intermediate', @@ -103,7 +103,9 @@ export default function EditProjectPage() { description: project.description || '', longDescription: project.longDescription || '', organization: project.organization || '', - repositoryUrl: project.repositoryUrl || '', + repositoryUrls: Array.isArray(project.repositoryUrls) && project.repositoryUrls.length > 0 + ? project.repositoryUrls + : (project.repositoryUrl ? [project.repositoryUrl] : ['']), websiteUrl: project.websiteUrl || '', timelineUrl: project.timelineUrl || '', difficulty: project.difficulty || 'intermediate', @@ -138,7 +140,7 @@ export default function EditProjectPage() { setFormData({ ...formData, [e.target.name]: e.target.value }); }; - const handleArrayChange = (field: 'requirements' | 'learningOutcomes', index: number, value: string) => { + const handleArrayChange = (field: 'requirements' | 'learningOutcomes' | 'repositoryUrls', index: number, value: string) => { const updated = [...formData[field]]; updated[index] = value; setFormData({ ...formData, [field]: updated }); @@ -157,11 +159,11 @@ export default function EditProjectPage() { }); }; - const addArrayItem = (field: 'requirements' | 'learningOutcomes') => { + const addArrayItem = (field: 'requirements' | 'learningOutcomes' | 'repositoryUrls') => { setFormData({ ...formData, [field]: [...formData[field], ''] }); }; - const removeArrayItem = (field: 'requirements' | 'learningOutcomes', index: number) => { + const removeArrayItem = (field: 'requirements' | 'learningOutcomes' | 'repositoryUrls', index: number) => { const updated = formData[field].filter((_, i) => i !== index); setFormData({ ...formData, [field]: updated }); }; @@ -221,7 +223,7 @@ export default function EditProjectPage() { description: formData.description, longDescription: formData.longDescription, organization: formData.organization, - repositoryUrl: formData.repositoryUrl, + repositoryUrls: formData.repositoryUrls.filter(Boolean), websiteUrl: formData.websiteUrl, timelineUrl: formData.timelineUrl, difficulty: formData.difficulty, @@ -379,32 +381,52 @@ export default function EditProjectPage() { {/* Links */}
-

Links

- -
-
- - -
-
- - -
+

Links & Repositories

+ +
+ + {formData.repositoryUrls.map((repoUrl, index) => ( +
+ handleArrayChange('repositoryUrls', index, e.target.value)} + required={index === 0} + className="neo-brutal-input flex-1" + placeholder="https://github.com/org/repo" + /> + {formData.repositoryUrls.length > 1 && ( + + )} +
+ ))} + + +
+ +
+ +
diff --git a/app/admin/dsoc/projects/new/page.tsx b/app/admin/dsoc/projects/new/page.tsx index 39c5357..05cc430 100644 --- a/app/admin/dsoc/projects/new/page.tsx +++ b/app/admin/dsoc/projects/new/page.tsx @@ -38,7 +38,7 @@ export default function NewProjectPage() { description: '', longDescription: '', organization: '', - repositoryUrl: '', + repositoryUrls: [''], websiteUrl: '', timelineUrl: '', difficulty: 'intermediate', @@ -90,7 +90,7 @@ export default function NewProjectPage() { }; const handleArrayChange = ( - field: 'requirements' | 'learningOutcomes', + field: 'requirements' | 'learningOutcomes' | 'repositoryUrls', index: number, value: string, ) => { @@ -99,11 +99,11 @@ export default function NewProjectPage() { setFormData({ ...formData, [field]: updated }); }; - const addArrayItem = (field: 'requirements' | 'learningOutcomes') => { + const addArrayItem = (field: 'requirements' | 'learningOutcomes' | 'repositoryUrls') => { setFormData({ ...formData, [field]: [...formData[field], ''] }); }; - const removeArrayItem = (field: 'requirements' | 'learningOutcomes', index: number) => { + const removeArrayItem = (field: 'requirements' | 'learningOutcomes' | 'repositoryUrls', index: number) => { const updated = formData[field].filter((_, i) => i !== index); setFormData({ ...formData, [field]: updated }); }; @@ -176,6 +176,7 @@ export default function NewProjectPage() { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ ...formData, + repositoryUrls: formData.repositoryUrls.filter(Boolean), technologies: formData.technologies.split(',').map((s) => s.trim()).filter(Boolean), tags: formData.tags.split(',').map((s) => s.trim()).filter(Boolean), mentors: formData.mentors, @@ -388,32 +389,52 @@ export default function NewProjectPage() { {/* Links */}
-

Links

+

Links & Repositories

+ +
+ + {formData.repositoryUrls.map((repoUrl, index) => ( +
+ handleArrayChange('repositoryUrls', index, e.target.value)} + required={index === 0} + className="neo-brutal-input flex-1" + placeholder="https://github.com/org/repo" + /> + {formData.repositoryUrls.length > 1 && ( + + )} +
+ ))} + + +
-
-
- - -
-
- - -
+
+ +
diff --git a/app/dsoc/page.tsx b/app/dsoc/page.tsx index e0b4079..8c6bbfc 100644 --- a/app/dsoc/page.tsx +++ b/app/dsoc/page.tsx @@ -43,6 +43,7 @@ interface Project { featuredImage?: string; imageUrl?: string; repositoryUrl?: string; + repositoryUrls?: string[]; wikiUrl?: string; } @@ -567,10 +568,15 @@ export default function DSOCPage() { {project.duration}
- {project.repositoryUrl && ( + {(project.repositoryUrl || (project.repositoryUrls && project.repositoryUrls.length > 0)) && (
-
- - - Repository - +
+ {repoUrls.map((url, i) => ( + + + {getRepoLabel(url)} + + ))} {project.timelineUrl && (
+ {/* Star Card */} +
+
+ +

Support This Project

+
+

+ Love this project? Show your support by starring the repository on GitHub! It helps increase visibility, motivates the mentors, and grows our open-source community. ⭐ +

+
+ {repoUrls.map((url, i) => ( + + + Star {getRepoLabel(url)} + + ))} +
+
+ {project.timelineUrl && (
@@ -773,7 +822,7 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st {/* Discord Card */}
-
+

Have Questions?

@@ -787,7 +836,7 @@ export default function ProjectDetailPage({ params }: { params: Promise<{ id: st > Join Discord -

+
{/* Tags */} diff --git a/app/dsoc/projects/page.tsx b/app/dsoc/projects/page.tsx index a6e10aa..ce0b53d 100644 --- a/app/dsoc/projects/page.tsx +++ b/app/dsoc/projects/page.tsx @@ -24,6 +24,7 @@ interface Project { description: string; organization: string; repositoryUrl: string; + repositoryUrls?: string[]; websiteUrl?: string; difficulty: 'beginner' | 'intermediate' | 'advanced'; duration: string; @@ -491,10 +492,15 @@ export default function ProjectsPage() { {/* GitHub and Wiki Links */}
- {project.repositoryUrl && ( + {(project.repositoryUrl || (project.repositoryUrls && project.repositoryUrls.length > 0)) && (