Skip to content

Commit 62b3eb0

Browse files
authored
Merge pull request #102 from 4Furki4/develop
[codex] Improve portfolio project page performance
2 parents 50cb9fa + 7072c8e commit 62b3eb0

56 files changed

Lines changed: 123 additions & 102 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/[locale]/projects/[endpoint]/page.tsx

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,47 @@
11
import React from "react";
22
import projectsData from "@/db/static/projects";
3+
import { getProjectImageBlurData } from "@/db/static/projectImageBlurData";
34
import ProjectCard from "@/features/Projects/Cards/ProjectCard";
45
import { Metadata } from "next";
5-
import { getBase64 } from "@/lib/getBase64ImageUrl";
66
import { getTranslations, setRequestLocale } from "next-intl/server";
77
import { notFound } from "next/navigation";
88
import { locales } from "@/navigation";
9+
10+
export const dynamic = "force-static";
11+
export const dynamicParams = false;
12+
913
export async function generateMetadata({
1014
params,
1115
}: {
1216
params: Promise<{ endpoint: string; locale: string }>;
1317
}): Promise<Metadata> {
1418
const { locale, endpoint } = await params;
15-
const project = projectsData.filter(
19+
const project = projectsData.find(
1620
(project) => project.endpoint === endpoint
17-
)[0];
21+
);
22+
if (!project) notFound();
23+
1824
return {
19-
title: project?.title[locale as "en" | "tr"],
20-
description: project?.description[locale as "en" | "tr"],
25+
title: project.title[locale as "en" | "tr"],
26+
description: project.description[locale as "en" | "tr"],
2127
openGraph: {
2228
type: "website",
2329
locale: locale,
24-
url: `/projects/${project?.endpoint}`,
25-
title: `${project?.title[locale as "en" | "tr"]} | Furkan Cengiz`,
26-
description: project?.description[locale as "en" | "tr"],
30+
url: `/projects/${project.endpoint}`,
31+
title: `${project.title[locale as "en" | "tr"]} | Furkan Cengiz`,
32+
description: project.description[locale as "en" | "tr"],
2733
images: [
2834
{
29-
url: project?.images[0].src,
30-
alt: project?.images[0].alt,
35+
url: project.images[0].src,
36+
alt: project.images[0].alt,
3137
},
3238
],
3339
},
3440
alternates: {
35-
canonical: `/projects/${project?.endpoint}`,
41+
canonical: `/projects/${project.endpoint}`,
3642
languages: {
37-
en: `/projects/${project?.endpoint}`,
38-
tr: `/tr/projeler/${project?.endpoint}`,
43+
en: `/projects/${project.endpoint}`,
44+
tr: `/tr/projeler/${project.endpoint}`,
3945
},
4046
},
4147
};
@@ -54,18 +60,17 @@ export default async function Project({
5460
}) {
5561
const { endpoint, locale } = await params;
5662
setRequestLocale(locale);
57-
const project = projectsData.filter(
63+
const project = projectsData.find(
5864
(project) => project.endpoint === endpoint
59-
)[0];
65+
);
6066

6167
if (!project) notFound();
6268
const t = await getTranslations("Project");
63-
const blurredImage = await getBase64(project.images[0].src);
6469
return (
6570
<section className="relative z-20 mx-auto mb-auto w-full max-w-7xl px-4 py-10 sm:px-6 sm:py-14 lg:px-8">
6671
<ProjectCard
6772
project={project}
68-
blurredImage={blurredImage}
73+
blurredImage={getProjectImageBlurData(project.endpoint)}
6974
repoLinkText={
7075
endpoint === "Turkish-Dictionary"
7176
? t("repo-link.contribute")

app/[locale]/projects/page.tsx

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react";
22
import projectsData from "@/db/static/projects";
3+
import { getProjectImageBlurData } from "@/db/static/projectImageBlurData";
34
import ProjectCards from "@/features/Projects/Cards/ProjectsCard";
4-
import { getBase64 } from "@/lib/getBase64ImageUrl";
55
import { getTranslations, setRequestLocale } from "next-intl/server";
66
export async function generateMetadata({
77
params,
@@ -32,7 +32,6 @@ export async function generateMetadata({
3232
},
3333
};
3434
}
35-
const images = projectsData.map((project) => project.images[0].src);
3635
export default async function Projects({
3736
params,
3837
}: {
@@ -42,9 +41,6 @@ export default async function Projects({
4241
setRequestLocale(locale);
4342
const t = await getTranslations("Projects");
4443
const statusT = await getTranslations("Project.status");
45-
const blurredImage = await Promise.all(
46-
images.map((image) => getBase64(image))
47-
);
4844

4945
return (
5046
<section className="relative z-20 mb-auto w-full">
@@ -67,15 +63,15 @@ export default async function Projects({
6763
</header>
6864
<div className="grid gap-5">
6965
{projectsData.map((project, index) => (
70-
<ProjectCards
71-
project={project}
72-
blurredImage={blurredImage[index]}
73-
key={index}
74-
index={index}
75-
locale={locale}
76-
statusText={statusT(project.status)}
77-
/>
78-
))}
66+
<ProjectCards
67+
project={project}
68+
blurredImage={getProjectImageBlurData(project.endpoint)}
69+
key={index}
70+
index={index}
71+
locale={locale}
72+
statusText={statusT(project.status)}
73+
/>
74+
))}
7975
</div>
8076
</div>
8177
</section>

db/static/projectImageBlurData.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
export const projectImageBlurData = {
2+
"Turkish-Dictionary":
3+
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAYAAAC09K7GAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAPklEQVR4nAEzAMz/AL62s/8fCgb/GgAA/7uxr/8A7ezt/8LCwv++ubb/5+Xl/wD4+Pj/5uXm/+jp6f//////SxIluim5dtkAAAAASUVORK5CYII=",
4+
Learnification:
5+
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAYAAAB/qH1jAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAKElEQVR4nGPg4OT5HxER/n/tlr3/+6bO/c+gqKz6v6629v/0uYvBGAAaYRKKSxGBHQAAAABJRU5ErkJggg==",
6+
"Turkish-Dictionary-using-TDK-API":
7+
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAYAAAB/qH1jAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAKUlEQVR4nGNQUlL+f+XSlf9vXn/4r69v8J+BmZn5v7GR8X9HB8f/IDYAKB8PmxDPeTkAAAAASUVORK5CYII=",
8+
"Meme-Generator":
9+
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAYAAAB/qH1jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAK0lEQVR4nGNwUxP4/+zo0v827nH/GVlE/zOkWQn9///55H+3kJz/DAwC/wETexBD+9k3IgAAAABJRU5ErkJggg==",
10+
"Frontend-Mentor-Challenges":
11+
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAYAAAB/qH1jAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAALUlEQVR4nAEiAN3/AKKSy/8AAFb/QUlX//b7/f8A/P7//0JHVP86QEn/+P3//1gtFaro6jYOAAAAAElFTkSuQmCC",
12+
} as const satisfies Record<Project["endpoint"], string>;
13+
14+
export function getProjectImageBlurData(endpoint: Project["endpoint"]) {
15+
const blurData =
16+
projectImageBlurData[endpoint as keyof typeof projectImageBlurData];
17+
18+
if (!blurData) {
19+
throw new Error(`Missing project image blur data for "${endpoint}"`);
20+
}
21+
22+
return blurData;
23+
}

0 commit comments

Comments
 (0)