Skip to content

Commit 0f73255

Browse files
committed
fix: remove unused id field from Experience interface and update related components; add DevpostIcon component
1 parent 069c649 commit 0f73255

File tree

5 files changed

+141
-37
lines changed

5 files changed

+141
-37
lines changed

app/experience/experiences.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export interface Experience {
2-
id: number;
32
title: string;
43
company: string;
54
location: string;
@@ -13,7 +12,6 @@ export interface Experience {
1312

1413
export const experiences: Experience[] = [
1514
{
16-
id: 3,
1715
title: 'Rust Developer',
1816
company: 'Sphyrna Security Inc.',
1917
location: 'Ottawa, ON',
@@ -39,7 +37,6 @@ export const experiences: Experience[] = [
3937
website: 'https://sphyrnasecurity.com'
4038
},
4139
{
42-
id: 2,
4340
title: 'Software Developer Intern',
4441
company: 'Sphyrna Security Inc.',
4542
location: 'Ottawa, ON',
@@ -53,7 +50,6 @@ export const experiences: Experience[] = [
5350
website: 'https://sphyrnasecurity.com'
5451
},
5552
{
56-
id: 1,
5753
title: 'Web Developer Intern',
5854
company: 'Sphyrna Security Inc.',
5955
location: 'Ottawa, ON',
@@ -74,7 +70,6 @@ export const experiences: Experience[] = [
7470
website: 'https://sphyrnasecurity.com'
7571
},
7672
{
77-
id: 0,
7873
title: 'Software Developer Intern',
7974
company: 'Sphyrna Security Inc.',
8075
location: 'Ottawa, ON',

app/experience/page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ export default function ExperiencePage() {
1818
</div>
1919

2020
<div className="space-y-6">
21-
{experiences.map((experience) => (
22-
<Card key={experience.id} className="w-full">
21+
{experiences.map((experience, index) => (
22+
<Card key={index} className="w-full">
2323
<CardHeader>
2424
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4">
2525
<div className="space-y-1">

app/projects/page.tsx

Lines changed: 63 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
1+
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card";
22
import { Badge } from "@/components/ui/badge";
33
import { Button } from "@/components/ui/button";
44
import { ExternalLink, Calendar } from "lucide-react";
55
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
6-
import {faGithubSquare as GitHub} from '@fortawesome/free-brands-svg-icons';
6+
import { faGithubSquare as GitHub } from '@fortawesome/free-brands-svg-icons';
7+
import { DevpostIcon } from "@/components/devpost-icon";
78
import Link from "next/link";
89
import { projects } from "./projects";
10+
import Image from "next/image";
911

1012
const statusColors = {
1113
completed: "bg-green-500",
@@ -33,17 +35,23 @@ export default function ProjectsPage() {
3335
<div className="space-y-6">
3436
<h2 className="text-2xl font-bold">Featured Projects</h2>
3537
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
36-
{featuredProjects.map((project) => (
37-
<Card key={project.id} className="overflow-hidden hover:shadow-lg transition-shadow">
38+
{featuredProjects.map((project, index) => (
39+
<Card key={index} className="overflow-hidden hover:shadow-lg transition-shadow flex flex-col">
3840
{project.imageUrl && (
3941
<div className="aspect-video relative bg-muted">
4042
{/* Placeholder for project image */}
4143
<div className="absolute inset-0 flex items-center justify-center text-muted-foreground">
42-
Project Screenshot
44+
<Image
45+
src={project.imageUrl}
46+
alt={project.title}
47+
layout="fill"
48+
objectFit="cover"
49+
className="object-cover"
50+
/>
4351
</div>
4452
</div>
4553
)}
46-
<CardHeader>
54+
<CardHeader className="flex-grow">
4755
<div className="flex items-start justify-between">
4856
<div className="space-y-1">
4957
<CardTitle className="flex items-center gap-2">
@@ -57,13 +65,21 @@ export default function ProjectsPage() {
5765
{new Date(project.createdAt).getFullYear()}
5866
</div>
5967
</div>
68+
<div className="space-y-2 mt-4">
69+
<ul className="list-disc list-inside space-y-1 text-sm text-muted-foreground">
70+
{project.longDescription.map((point, idx) => (
71+
<li key={idx}>{point}</li>
72+
))}
73+
</ul>
74+
</div>
6075
</CardHeader>
61-
<CardContent className="space-y-4">
62-
<p className="text-sm text-muted-foreground line-clamp-3">
63-
{project.longDescription}
64-
</p>
65-
76+
<CardContent className="space-y-4 mt-auto">
6677
<div className="flex flex-wrap gap-1">
78+
{project.role && (
79+
<Badge variant="outline" className="text-xs">
80+
{project.role}
81+
</Badge>
82+
)}
6783
{project.technologies.slice(0, 4).map((tech, idx) => (
6884
<Badge key={idx} variant="secondary" className="text-xs">
6985
{tech}
@@ -75,8 +91,8 @@ export default function ProjectsPage() {
7591
</Badge>
7692
)}
7793
</div>
78-
79-
<div className="flex gap-2">
94+
</CardContent>
95+
<CardFooter className="flex gap-2 items-center">
8096
{project.githubUrl && (
8197
<Button variant="outline" size="sm" asChild>
8298
<Link href={project.githubUrl} target="_blank" rel="noopener noreferrer">
@@ -93,8 +109,15 @@ export default function ProjectsPage() {
93109
</Link>
94110
</Button>
95111
)}
96-
</div>
97-
</CardContent>
112+
{project.devpostUrl && (
113+
<Button variant="outline" size="sm" asChild>
114+
<Link href={project.devpostUrl} target="_blank" rel="noopener noreferrer">
115+
<DevpostIcon className="h-4 w-4 mr-2" />
116+
Devpost
117+
</Link>
118+
</Button>
119+
)}
120+
</CardFooter>
98121
</Card>
99122
))}
100123
</div>
@@ -106,9 +129,9 @@ export default function ProjectsPage() {
106129
<div className="space-y-6">
107130
<h2 className="text-2xl font-bold">Other Projects</h2>
108131
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
109-
{otherProjects.map((project) => (
110-
<Card key={project.id} className="hover:shadow-md transition-shadow">
111-
<CardHeader className="pb-3">
132+
{otherProjects.map((project, index) => (
133+
<Card key={index} className="hover:shadow-md transition-shadow flex flex-col">
134+
<CardHeader className="pb-3 flex-grow">
112135
<div className="flex items-start justify-between">
113136
<CardTitle className="text-lg flex items-center gap-2">
114137
{project.title}
@@ -123,8 +146,13 @@ export default function ProjectsPage() {
123146
{project.description}
124147
</CardDescription>
125148
</CardHeader>
126-
<CardContent className="space-y-3">
149+
<CardContent className="space-y-3 mt-auto">
127150
<div className="flex flex-wrap gap-1">
151+
{project.role && (
152+
<Badge variant="outline" className="text-xs shrink-0">
153+
{project.role}
154+
</Badge>
155+
)}
128156
{project.technologies.slice(0, 3).map((tech, idx) => (
129157
<Badge key={idx} variant="secondary" className="text-xs">
130158
{tech}
@@ -136,26 +164,33 @@ export default function ProjectsPage() {
136164
</Badge>
137165
)}
138166
</div>
139-
140-
<div className="flex gap-2">
167+
</CardContent>
168+
<CardFooter className="flex gap-2 items-center">
141169
{project.githubUrl && (
142-
<Button variant="outline" size="sm" asChild className="flex-1">
170+
<Button variant="outline" size="sm" asChild>
143171
<Link href={project.githubUrl} target="_blank" rel="noopener noreferrer">
144-
<FontAwesomeIcon icon={GitHub} className="h-3 w-3 mr-1" />
172+
<FontAwesomeIcon icon={GitHub} className="h-4 w-4 mr-2" />
145173
Code
146174
</Link>
147175
</Button>
148176
)}
149177
{project.liveUrl && (
150-
<Button size="sm" asChild className="flex-1">
178+
<Button size="sm" asChild>
151179
<Link href={project.liveUrl} target="_blank" rel="noopener noreferrer">
152-
<ExternalLink className="h-3 w-3 mr-1" />
153-
Demo
180+
<ExternalLink className="h-4 w-4 mr-2" />
181+
Live Demo
154182
</Link>
155183
</Button>
156184
)}
157-
</div>
158-
</CardContent>
185+
{project.devpostUrl && (
186+
<Button variant="outline" size="sm" asChild>
187+
<Link href={project.devpostUrl} target="_blank" rel="noopener noreferrer">
188+
<DevpostIcon className="h-4 w-4 mr-2" />
189+
Devpost
190+
</Link>
191+
</Button>
192+
)}
193+
</CardFooter>
159194
</Card>
160195
))}
161196
</div>

app/projects/projects.ts

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,83 @@
11
export interface Project {
2-
id: string;
32
title: string;
43
description: string;
5-
longDescription: string;
4+
longDescription: string[];
65
technologies: string[];
76
githubUrl?: string;
87
liveUrl?: string;
8+
devpostUrl?: string;
99
imageUrl?: string;
1010
featured: boolean;
1111
createdAt: string;
1212
status: "completed" | "in-progress" | "planning";
13+
role?: string;
1314
}
1415

1516
// You can easily extend this array to add more projects
1617
export const projects: Project[] = [
18+
{
19+
title: 'Capstone: LEO Satelite Routing and Load Balancing',
20+
description: 'A capstone project focused on developing a conceptual routing and load balancing system for LEO satellites, and simulating its performance.',
21+
longDescription: [
22+
'Developed a routing and load balancing system for Low Earth Orbit (LEO) satellites',
23+
'Enhanced LEOSIM, a Python Low Earth Orbit (LEO) network simulation tool, by implementing key features to address LEO Satellite network challenges',
24+
'Integrated traffic generation and simulation capabilities from multiple ground stations, improving the tool\'s representation of real-world scenarios.',
25+
'Led and organized regular team meetings, ensuring effective communication and collaboration among team members.',
26+
'Maintained clear and concise communication with the supervising professor, providing project updates, addressing concerns, and seeking guidance.'
27+
],
28+
technologies: ['Python', 'Pandas', 'h3', 'Panda3D', 'NetworkX', 'Network Simulation', 'Routing Algorithms'],
29+
imageUrl: 'https://capstone.bitdegree.ca/NET/images/2024/GRP9_Simulation.jpg',
30+
featured: true,
31+
createdAt: '2023-09-01',
32+
status: 'completed',
33+
role: 'Team Lead & Developer'
34+
},
35+
{
36+
title: 'foodpad',
37+
description: 'An app that allows user to keep track of their pantries, using React Native',
38+
longDescription: [
39+
'Implemented dynamic features that enable users to add groceries, select storage methods (fridge, pantry, freezer), and receive automated expiry date suggestions.',
40+
'Awarded Top 5 Hacks at McHacks, showcasing the project\'s innovation and technical merit within the hackathon environment.',
41+
'Received the Tree Hugger award, recognizing the project as the most environmentally conscious hack, highlighting its positive impact.'
42+
],
43+
technologies: ['React Native', 'Expo', 'JavaScript'],
44+
githubUrl: 'https://github.com/ke-noel/foodpad',
45+
imageUrl: 'https://d112y698adiu2z.cloudfront.net/photos/production/software_photos/001/802/858/datas/medium.png',
46+
devpostUrl: 'https://devpost.com/software/foodpad',
47+
featured: true,
48+
createdAt: '2022-01-01',
49+
status: 'completed',
50+
role: 'Frontend Developer'
51+
},
52+
{
53+
title: 'PlagueSim',
54+
description: 'A simulation tool for modeling the spread of computer viruses',
55+
longDescription: [
56+
'Designed the general structure of the application through the use of UML diagrams',
57+
'Implemented core data structures and functionality in Java'
58+
],
59+
technologies: ['Java', 'UML', 'Data Structures'],
60+
githubUrl: 'https://github.com/FusionStreak/MST_TermProject',
61+
featured: false,
62+
createdAt: '2021-10-26',
63+
status: 'completed',
64+
role: 'Lead Developer'
65+
},
66+
{
67+
title: 'FusionStreak',
68+
description: 'A personal portfolio website showcasing my projects, experiences, and blog posts.',
69+
longDescription: [
70+
'Developed a modern, responsive portfolio website to showcase software development skills',
71+
'Implemented dynamic project and experience displays with filtering capabilities',
72+
'Created an integrated blog system for sharing technical insights and tutorials',
73+
'Designed with accessibility and performance optimization in mind'
74+
],
75+
technologies: ['Next.js', 'React', 'TypeScript', 'Tailwind CSS'],
76+
githubUrl: 'https://github.com/FusionStreak.github.io',
77+
liveUrl: 'https://sayfullaheid.me',
78+
featured: false,
79+
createdAt: '2022-12-25',
80+
status: 'completed'
81+
}
1782

1883
];

components/devpost-icon.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import React from "react";
2+
3+
export const DevpostIcon = (props: React.JSX.IntrinsicAttributes & React.SVGProps<SVGSVGElement>) => (
4+
<svg xmlns="http://www.w3.org/2000/svg" width={24} height={24}
5+
fill={"currentColor"} viewBox="0 0 24 24" {...props} >
6+
{/* Boxicons v3.0 https://boxicons.com | License https://docs.boxicons.com/free */}
7+
<path d="M11.54 8.79h-1.12v6.42h1.05A2.91 2.91 0 0 0 14.69 12c0-2.15-.92-3.21-3.15-3.21"></path><path d="M7 3.37 2 12l5 8.63h10L22 12l-5-8.63zm4.47 13.91H8.35V6.72h3.27c3 0 5.23 1.43 5.23 5.28 0 3.7-2.68 5.28-5.38 5.28"></path>
8+
</svg>
9+
);

0 commit comments

Comments
 (0)