Skip to content

Commit

Permalink
feat(app): integrate project db data into web app. Also set up suspen…
Browse files Browse the repository at this point in the history
…se for projects.
  • Loading branch information
dubscode committed Sep 2, 2024
1 parent dd6a2cc commit 0904d75
Show file tree
Hide file tree
Showing 13 changed files with 187 additions and 193 deletions.
12 changes: 12 additions & 0 deletions app/projects/actions/get-projects-action.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
'use server';

import { Project } from '@/models';
import { revalidatePath } from 'next/cache';

export const action = async () => {
const projects = await Project.getProjects();

revalidatePath('/projects');

return projects;
};
19 changes: 19 additions & 0 deletions app/projects/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import Loading from './loading';
import { Suspense } from 'react';

type ProjectsLayoutProps = {
children: React.ReactNode;
};

export default async function ProjectsLayout({
children
}: ProjectsLayoutProps) {
return (
<div className='container mx-auto px-4 py-8'>
<h1 className='mb-8 text-3xl font-bold'>My Projects</h1>
<div className='grid grid-cols-1 gap-6 md:grid-cols-2'>
<Suspense fallback={<Loading />}>{children}</Suspense>
</div>
</div>
);
}
5 changes: 5 additions & 0 deletions app/projects/loading.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { ProjectSkeleton } from '@/components/project-skeleton';

export default async function Loading() {
return <ProjectSkeleton />;
}
214 changes: 41 additions & 173 deletions app/projects/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,183 +9,51 @@ import { ExternalLink, Github } from 'lucide-react';

import { Badge } from '@/components/ui/badge';
import Link from 'next/link';
import { action } from './actions/get-projects-action';

const projects = [
{
title: 'Personal Portfolio Website',
description:
'Designed and developed a modern, responsive portfolio website to showcase professional experience and projects.',
achievements: [
'Implemented a sleek, user-friendly design using Next.js and Tailwind CSS',
'Integrated dynamic content management for easy updates and maintenance',
'Optimized performance and accessibility to ensure a great user experience across devices',
'Implemented serverless functions for backend operations like contact form submission'
],
technologies: [
'Next.js',
'React',
'TypeScript',
'Tailwind CSS',
'Vercel',
'AWS Lambda'
],
repoUrl: 'https://github.com/wiseiodev/portfolio',
siteUrl: 'https://danwise.dev'
},
{
title: 'Mary Woodward PSO Dynamic Calendar Application',
description:
"Developed a modern, serverless calendar application for Mary Woodward Parent Support Organization (PSO) that transforms the school's public Google Calendar into an interactive, user-friendly interface for parents and staff.",
achievements: [
"Architected and implemented a serverless application using SST (Serverless Stack) and AWS services to fetch and process iCal data from the PSO's public Google Calendar",
'Created a responsive, dynamic web interface that displays up-to-date school events in an easily digestible format',
'Implemented a feature allowing users to download a PDF version of the calendar for offline access',
'Designed the application to be embeddable within the existing PSO website, ensuring seamless integration'
],
technologies: [
'SST (Serverless Stack)',
'AWS Lambda',
'AWS CDK',
'TypeScript',
'React',
'Node.js',
'date-fns-tz',
'iCal processing',
'PDF generation'
],
repoUrl: 'https://github.com/mwpso/calendar',
siteUrl: 'https://marywoodwardpso.com/pso-event-calendar'
},
{
title: 'Enterprise Application Serverless Migration',
description:
'Led the migration of a legacy application to a complete serverless architecture on AWS, significantly improving performance and reducing costs.',
achievements: [
'Migrated monolithic API to a GraphQL-based microservices architecture on AWS Lambda',
'Implemented a modern React-based frontend hosted on AWS S3 and CloudFront',
'Transitioned from traditional RDS to a serverless database solution',
'Achieved 50% reduction in monthly infrastructure costs while improving application performance'
],
technologies: [
'AWS Lambda',
'GraphQL',
'Apollo Server',
'React',
'S3',
'CloudFront',
'RDS Serverless'
],
repoUrl: null,
siteUrl: null
},
{
title: 'B2B SaaS Platform for Hospitality Industry',
description:
'Co-founded and developed a B2B SaaS solution that became a market leader in providing real-time market data for the hospitality sector.',
achievements: [
'Rapidly grew customer base to over 3,000 within the first month of launch',
'Architected a scalable backend using AWS, Ruby on Rails, and PostgreSQL',
'Developed innovative algorithms for real-time data analysis and reporting',
'Successfully positioned the company for acquisition through consistent growth and market leadership'
],
technologies: ['AWS', 'Ruby on Rails', 'PostgreSQL', 'SaaS'],
repoUrl: null,
siteUrl: null
},
{
title: 'Data Centralization and Analytics Dashboard',
description:
'Designed and implemented a comprehensive dashboard application to centralize data from multiple sources and improve decision-making processes.',
achievements: [
'Developed an efficient web-crawler for automated data collection from various sources',
'Implemented RESTful APIs to integrate data with internal tools and Excel',
'Migrated from static Excel-based reporting to a dynamic, cloud-native application',
'Significantly improved data consistency and accessibility across the organization'
],
technologies: [
'Ruby on Rails',
'Sidekiq',
'REST APIs',
'AWS',
'Excel Integration'
],
repoUrl: null,
siteUrl: null
},
{
title: 'Multi-Tenant Serverless Database Architecture',
description:
'Architected and implemented a shared serverless database cluster to support multiple applications across different cloud accounts, optimizing resource utilization and cost efficiency.',
achievements: [
'Designed a scalable multi-tenant architecture supporting both production and non-production environments',
'Consolidated multiple database instances into a single, efficient cluster',
'Optimized high-traffic queries for improved performance across all tenants',
'Achieved significant cost savings and performance improvements through resource sharing and optimization'
],
technologies: [
'AWS RDS Serverless',
'PostgreSQL',
'Multi-Account Architecture'
],
repoUrl: null,
siteUrl: null
}
];
export default async function ProjectsPage() {
const projects = await action();

export default function ProjectsPage() {
return (
<div className='container mx-auto px-4 py-8'>
<h1 className='mb-8 text-3xl font-bold'>My Projects</h1>
<div className='grid grid-cols-1 gap-6 md:grid-cols-2'>
{projects.map((project, index) => (
<Card key={index} className='flex flex-col'>
<CardHeader>
<CardTitle className='flex items-center justify-between'>
{project.title}
<div className='flex flex-row space-x-2'>
{project.siteUrl ? (
<Link
href={project.siteUrl}
target='_blank'
rel='noreferrer'
>
<ExternalLink className='h-4 w-4 text-muted-foreground' />
</Link>
) : null}
{project.repoUrl ? (
<Link
href={project.repoUrl}
target='_blank'
rel='noreferrer'
>
<Github className='h-4 w-4 text-muted-foreground' />
</Link>
) : null}
</div>
</CardTitle>
<CardDescription>{project.description}</CardDescription>
</CardHeader>
<CardContent className='flex-grow'>
<h3 className='mb-2 font-semibold'>Key Achievements:</h3>
<ul className='mb-4 list-inside list-disc space-y-1 text-muted-foreground'>
{project.achievements.map((achievement, i) => (
<li key={i}>{achievement}</li>
<>
{projects.map((project, index) => (
<Card key={index} className='flex flex-col'>
<CardHeader>
<CardTitle className='flex items-center justify-between'>
{project.title}
<div className='flex flex-row space-x-2'>
{project.siteUrl ? (
<Link href={project.siteUrl} target='_blank' rel='noreferrer'>
<ExternalLink className='h-4 w-4 text-muted-foreground' />
</Link>
) : null}
{project.repoUrl ? (
<Link href={project.repoUrl} target='_blank' rel='noreferrer'>
<Github className='h-4 w-4 text-muted-foreground' />
</Link>
) : null}
</div>
</CardTitle>
<CardDescription>{project.description}</CardDescription>
</CardHeader>
<CardContent className='flex-grow'>
<h3 className='mb-2 font-semibold'>Key Achievements:</h3>
<ul className='mb-4 list-inside list-disc space-y-1 text-muted-foreground'>
{project.achievements.map((achievement, i) => (
<li key={i}>{achievement}</li>
))}
</ul>
<div>
<h3 className='mb-2 font-semibold'>Technologies Used:</h3>
<div className='flex flex-wrap gap-2'>
{project.technologies.map((tech) => (
<Badge key={tech.technologyId}>{tech.technology?.name}</Badge>
))}
</ul>
<div>
<h3 className='mb-2 font-semibold'>Technologies Used:</h3>
<div className='flex flex-wrap gap-2'>
{project.technologies.map((tech, i) => (
<Badge key={i} variant='secondary'>
{tech}
</Badge>
))}
</div>
</div>
</CardContent>
</Card>
))}
</div>
</div>
</div>
</CardContent>
</Card>
))}
</>
);
}
36 changes: 23 additions & 13 deletions app/skills/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,41 @@ const skillCategories = [
{
name: 'Frontend Development',
skills: [
{ name: 'React', level: 90 },
{ name: 'Apollo Client', level: 85 },
{ name: 'Data Grids', level: 95 },
{ name: 'Next.js', level: 85 },
{ name: 'TypeScript', level: 80 },
{ name: 'HTML/CSS', level: 95 }
{ name: 'React', level: 95 },
{ name: 'Tailwind CSS', level: 90 },
{ name: 'Tanstack Query (fka React Query)', level: 75 },
{ name: 'TypeScript', level: 80 }
]
},
{
name: 'Backend Development',
skills: [
{ name: 'Apollo Server', level: 80 },
{ name: 'GraphQL', level: 80 },
{ name: 'MongoDB', level: 70 },
{ name: 'Node.js', level: 85 },
{ name: 'Express', level: 80 },
{ name: 'Python', level: 75 },
{ name: 'SQL', level: 70 }
{ name: 'Postgres', level: 90 },
{ name: 'REST APIs', level: 90 },
{ name: 'Redis', level: 75 },
{ name: 'Ruby on Rails', level: 85 },
{ name: 'SQL', level: 70 },
{ name: 'Serverless Infrastructure', level: 90 }
]
},
{
name: 'DevOps & Tools',
name: 'DevOps & Cloud Providers',
skills: [
{ name: 'AWS CDK', level: 90 },
{ name: 'AWS Codepipelines', level: 80 },
{ name: 'AWS', level: 99 },
{ name: 'Azure', level: 60 },
{ name: 'Git', level: 90 },
{ name: 'Docker', level: 75 },
{ name: 'AWS', level: 70 },
{ name: 'CI/CD', level: 65 }
{ name: 'Github Actions', level: 65 },
{ name: 'SST', level: 80 },
{ name: 'Vercel', level: 75 }
]
}
];
Expand All @@ -47,9 +60,6 @@ export default function SkillsPage() {
<Card key={category.name}>
<CardHeader>
<CardTitle>{category.name}</CardTitle>
<CardDescription>
My proficiency in various {category.name.toLowerCase()} skills
</CardDescription>
</CardHeader>
<CardContent>
<ul className='space-y-4'>
Expand Down
48 changes: 48 additions & 0 deletions components/project-skeleton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle
} from '@/components/ui/card';

import { Skeleton } from '@/components/ui/skeleton';

export const ProjectSkeleton = () => (
<Card className='flex flex-col'>
<CardHeader>
<CardTitle className='flex items-center justify-between'>
<Skeleton className='animate-shimmer h-6 w-3/4' />
<div className='flex flex-row space-x-2'>
<Skeleton className='animate-shimmer h-4 w-4 rounded-full' />
<Skeleton className='animate-shimmer h-4 w-4 rounded-full' />
</div>
</CardTitle>
<CardDescription>
<Skeleton className='animate-shimmer h-4 w-full' />
</CardDescription>
</CardHeader>
<CardContent className='flex-grow'>
<h3 className='mb-2 font-semibold'>Key Achievements:</h3>
<ul className='mb-4 list-inside list-disc space-y-1'>
<li>
<Skeleton className='animate-shimmer h-4 w-full' />
</li>
<li>
<Skeleton className='animate-shimmer h-4 w-11/12' />
</li>
<li>
<Skeleton className='animate-shimmer h-4 w-10/12' />
</li>
</ul>
<div>
<h3 className='mb-2 font-semibold'>Technologies Used:</h3>
<div className='flex flex-wrap gap-2'>
{[1, 2, 3, 4].map((i) => (
<Skeleton key={i} className='animate-shimmer h-6 w-16' />
))}
</div>
</div>
</CardContent>
</Card>
);
6 changes: 4 additions & 2 deletions components/responsive-header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ export function ResponsiveHeader() {
<div className='flex items-center space-x-2'>
<ThemeToggle />
<Link
href='https://github.com/wiseiodev/portfolio'
href='https://github.com/dubscode'
aria-label='Personal GitHub'
target='_blank'
rel='noopener noreferrer'
>
Expand Down Expand Up @@ -81,7 +82,8 @@ export function ResponsiveHeader() {
<NavItems />
<ThemeToggle />
<Link
href='https://github.com/wiseiodev/portfolio'
href='https://github.com/dubscode'
aria-label='Personal GitHub'
target='_blank'
rel='noopener noreferrer'
>
Expand Down
Loading

0 comments on commit 0904d75

Please sign in to comment.