1
0
mirror of https://github.com/kremalicious/portfolio.git synced 2025-02-14 21:10:41 +01:00
portfolio/src/pages/[slug].tsx
Matthias Kretschmann 447cada700
Migrate to Next.js + TypeScript (#1038)
* next.js + typescript

* more testing

* script updates

* fixes

* favicon generation

* testing

* readme updates

* tweaks

* tweaks

* move tests

* image tweaks

* ci tweaks

* commit next-env.d.ts for ci

* migrations

* fixes

* fixes

* ci tweaks

* new animations

* project preview tweaks

* add codeclimate config

* dark mode refactor, test tweaks

* readme updates

* animation tweaks

* animate in loaded images

* test update

* update humans.txt
2022-11-15 23:14:59 +00:00

62 lines
1.5 KiB
TypeScript

import { GetStaticPaths, GetStaticProps } from 'next/types'
import {
getProjectBySlug,
getAllProjects,
getProjectSlugs
} from '../lib/content'
import type ProjectType from '../interfaces/project'
import Project from '../components/Project'
import resume from '../../_content/resume.json'
import ProjectNav from '../components/ProjectNav'
import Page from '../layouts/Page'
type Props = {
project: ProjectType
projects: { slug: string }[]
}
export default function ProjectPage({ project, projects }: Props) {
const pageMeta = {
title: `${
project.title
} // ${resume.basics.name.toLowerCase()} { ${resume.basics.label.toLowerCase()} }`,
description: project.description,
image: project.images[0].src,
slug: project.slug
}
return (
<Page {...pageMeta}>
<Project project={project} />
<ProjectNav projects={projects} currentSlug={project.slug} />
</Page>
)
}
type Params = {
params: {
slug: string
}
}
export const getStaticProps: GetStaticProps = async ({ params }: Params) => {
const project = await getProjectBySlug(params.slug, [
'title',
'description',
'slug',
'images',
'techstack',
'links'
])
const projects = await getAllProjects(['slug', 'title', 'images'])
return { props: { project, projects } }
}
export const getStaticPaths: GetStaticPaths = () => {
const slugs = getProjectSlugs()
return {
paths: slugs.map((slug) => ({ params: { slug } })),
fallback: false
}
}