Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
a3fd0a1
phase 1: replace framer-motion with motion, update radix ui, add reac…
pettinarip Mar 13, 2026
7d2ba3b
phase 2: upgrade to next.js 15 + react 19, async params, caching fixe…
pettinarip Mar 16, 2026
0c4db82
fix next 15 build: add use client to ssr:false dynamic imports, split…
pettinarip Mar 16, 2026
b4c2bad
split i18n into routing.ts and navigation.ts per next-intl official s…
pettinarip Mar 16, 2026
22c40c1
Merge branch 'dev' into next-15
pettinarip Mar 16, 2026
743ebef
bump @netlify/plugin-nextjs to latest
pettinarip Mar 16, 2026
6b36298
fix language picker not rendering: move button inside client componen…
pettinarip Mar 16, 2026
a5d25f3
replace htmr with html-react-parser to restore build-time type checking
pettinarip Mar 16, 2026
7ddf01e
rename server.tsx to lazy.tsx for client-side dynamic import wrappers
pettinarip Mar 16, 2026
e61afdb
add explicit force-cache to bare fetch calls for next.js 15 compatibi…
pettinarip Mar 16, 2026
877aeab
fix naming and pattern inconsistencies across next 15 migration
pettinarip Mar 16, 2026
0a829ba
remove force-dynamic from homepage, ab testing no longer used
pettinarip Mar 16, 2026
28dfdfa
remove redundant clientTraceMetadata, already set by @sentry/nextjs w…
pettinarip Mar 17, 2026
ab920e3
Merge branch 'dev' into next-15
pettinarip Mar 17, 2026
1fe7a69
Merge branch 'dev' into next-15
pettinarip Mar 19, 2026
efc48e0
restore staleTimes.static to next 14 default (300s)
pettinarip Mar 19, 2026
5f65555
fix: restore async params pattern in events search page for next 15 +…
pettinarip Mar 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .storybook/preview.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import isChromatic from "chromatic/isChromatic"
import { MotionGlobalConfig } from "framer-motion"
import { MotionGlobalConfig } from "motion/react"
import { IBM_Plex_Mono, Inter } from "next/font/google"
import type { Preview } from "@storybook/react"

Expand Down
2 changes: 2 additions & 0 deletions app/[locale]/10years/_components/AdoptionSwiper/lazy.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"use client"

import dynamic from "next/dynamic"

import Loading from "./loading"
Expand Down
2 changes: 2 additions & 0 deletions app/[locale]/10years/_components/InnovationSwiper/lazy.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"use client"

import dynamic from "next/dynamic"

import Loading from "./loading"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"use client"

import dynamic from "next/dynamic"

import Loading from "./loading"
Expand Down
2 changes: 2 additions & 0 deletions app/[locale]/10years/_components/UserStories/lazy.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"use client"

import dynamic from "next/dynamic"

import Loading from "./loading"
Expand Down
10 changes: 5 additions & 5 deletions app/[locale]/10years/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ import Curved10YearsText from "@/public/images/10-year-anniversary/10y-torch-hea

const zIndexClasses = ["z-50", "z-40", "z-30", "z-20", "z-10", "z-0"]

const Page = async ({ params }: { params: PageParams }) => {
const Page = async (props: { params: Promise<PageParams> }) => {
const params = await props.params
const { locale } = params

setRequestLocale(locale)
Expand Down Expand Up @@ -375,11 +376,10 @@ const Page = async ({ params }: { params: PageParams }) => {
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string }>
}) {
const params = await props.params
const { locale } = params

const t = await getTranslations({
Expand Down
10 changes: 6 additions & 4 deletions app/[locale]/[...slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ import { componentsMapping, layoutMapping } from "@/layouts"
import { getPageData } from "@/lib/md/data"
import { getMdMetadata } from "@/lib/md/metadata"

export default async function Page({ params }: { params: SlugPageParams }) {
export default async function Page(props: { params: Promise<SlugPageParams> }) {
const params = await props.params
const { locale, slug: slugArray } = params

// Check if this specific path is in our valid paths
Expand Down Expand Up @@ -56,8 +57,6 @@ export default async function Page({ params }: { params: SlugPageParams }) {
} = await getPageData({
locale,
slug,
// TODO: Address component typing error here (flip `FC` types to prop object types)
// @ts-expect-error Incompatible component function signatures
baseComponents: mdComponents,
componentsMapping,
scope: {
Expand Down Expand Up @@ -122,7 +121,10 @@ export async function generateStaticParams() {
}
}

export async function generateMetadata({ params }: { params: SlugPageParams }) {
export async function generateMetadata(props: {
params: Promise<SlugPageParams>
}) {
const params = await props.params
const { locale, slug } = params

try {
Expand Down
40 changes: 40 additions & 0 deletions app/[locale]/_components/HomepageLazyImports.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"use client"

import dynamic from "next/dynamic"

import ValuesMarqueeFallback from "@/components/Homepage/ValuesMarquee/Fallback"
import { Skeleton, SkeletonCardGrid } from "@/components/ui/skeleton"

export const BentoCardSwiper = dynamic(
() => import("@/components/Homepage/BentoCardSwiper"),
{
ssr: false,
loading: () => (
<div className="flex flex-col items-center gap-4">
<Skeleton className="mx-auto mt-4 h-[476px] w-[512px] max-w-128 rounded-2xl border-primary/10 bg-background bg-gradient-to-b from-primary/10 from-20% to-primary/5 to-60% p-4 opacity-50 shadow-card-hover lg:hidden dark:from-primary/20 dark:to-primary/10" />
<Skeleton className="h-6 w-[12rem] rounded-full" />
</div>
),
}
)

export const RecentPostsSwiper = dynamic(
() => import("@/components/Homepage/RecentPostsSwiper"),
{
ssr: false,
loading: () => (
<div className="flex flex-col items-center gap-4">
<SkeletonCardGrid className="mt-4 w-full md:mt-16" />
<Skeleton className="h-4 w-20 rounded-full" />
</div>
),
}
)

export const ValuesMarquee = dynamic(
() => import("@/components/Homepage/ValuesMarquee"),
{
ssr: false,
loading: () => <ValuesMarqueeFallback />,
}
)
14 changes: 6 additions & 8 deletions app/[locale]/apps/[application]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,10 @@ import AppsAppJsonLD from "./page-jsonld"

import { getAppsData } from "@/lib/data"

const Page = async ({
params,
}: {
params: PageParams & { application: string }
const Page = async (props: {
params: Promise<PageParams & { application: string }>
}) => {
const params = await props.params
const { locale, application } = params
setRequestLocale(locale)

Expand Down Expand Up @@ -403,11 +402,10 @@ const Page = async ({
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string; application: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string; application: string }>
}) {
const params = await props.params
const { locale, application } = params

// Fetch apps data using the new data-layer function (already cached)
Expand Down
14 changes: 6 additions & 8 deletions app/[locale]/apps/categories/[catetgoryName]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,10 @@ const VALID_CATEGORIES = Object.values(AppCategoryEnum)
const isValidCategory = (category: string): category is AppCategoryEnum =>
VALID_CATEGORIES.includes(category as AppCategoryEnum)

const Page = async ({
params,
}: {
params: PageParams & { catetgoryName: string }
const Page = async (props: {
params: Promise<PageParams & { catetgoryName: string }>
}) => {
const params = await props.params
const { locale, catetgoryName } = params
setRequestLocale(locale)

Expand Down Expand Up @@ -180,11 +179,10 @@ const Page = async ({
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string; catetgoryName: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string; catetgoryName: string }>
}) {
const params = await props.params
const { locale, catetgoryName } = params
const t = await getTranslations({ locale, namespace: "page-apps" })

Expand Down
10 changes: 5 additions & 5 deletions app/[locale]/apps/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ import AppsJsonLD from "./page-jsonld"

import { getAppsData, getCommunityPicks } from "@/lib/data"

const Page = async ({ params }: { params: PageParams }) => {
const Page = async (props: { params: Promise<PageParams> }) => {
const params = await props.params
const { locale } = params

setRequestLocale(locale)
Expand Down Expand Up @@ -168,11 +169,10 @@ const Page = async ({ params }: { params: PageParams }) => {
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string }>
}) {
const params = await props.params
const { locale } = params
const t = await getTranslations({ locale, namespace: "page-apps" })

Expand Down
10 changes: 5 additions & 5 deletions app/[locale]/assets/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ import { getRequiredNamespacesForPage } from "@/lib/utils/translations"
import AssetsPage from "./_components/assets"
import AssetsJsonLD from "./page-jsonld"

export default async function Page({ params }: { params: PageParams }) {
export default async function Page(props: { params: Promise<PageParams> }) {
const params = await props.params
const { locale } = params

setRequestLocale(locale)
Expand All @@ -41,11 +42,10 @@ export default async function Page({ params }: { params: PageParams }) {
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string }>
}) {
const params = await props.params
const { locale } = params

const t = await getTranslations({ locale, namespace: "page-assets" })
Expand Down
12 changes: 6 additions & 6 deletions app/[locale]/bug-bounty/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,9 @@ const sortBountyHuntersFn = (a: BountyHuntersArg, b: BountyHuntersArg) => {
return b.score - a.score
}

export default async function Page({ params }: { params: Promise<Params> }) {
const { locale } = await params
export default async function Page(props: { params: Promise<Params> }) {
const params = await props.params
const { locale } = params

const t = await getTranslations({ namespace: "page-bug-bounty" })
const tCommon = await getTranslations({ namespace: "common" })
Expand Down Expand Up @@ -833,11 +834,10 @@ export default async function Page({ params }: { params: Promise<Params> }) {
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string }>
}) {
const params = await props.params
const { locale } = params

const t = await getTranslations({ locale, namespace: "page-bug-bounty" })
Expand Down
2 changes: 2 additions & 0 deletions app/[locale]/collectibles/_components/Collectibles/lazy.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"use client"

import dynamic from "next/dynamic"

import Loading from "./loading"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"use client"

import dynamic from "next/dynamic"

import Loading from "./loading"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"use client"

import dynamic from "next/dynamic"

import Loading from "../Collectibles/loading"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"use client"

import dynamic from "next/dynamic"

import Loading from "./loading"
Expand Down
14 changes: 7 additions & 7 deletions app/[locale]/collectibles/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,18 @@ const STATS_API = `${COLLECTIBLES_BASE_URL}/api/stats`

// Data fetching
async function fetchBadges() {
const res = await fetch(BADGES_API)
const res = await fetch(BADGES_API, { cache: "force-cache" })
if (!res.ok) throw new Error("Failed to fetch badges")
return res.json()
}
async function fetchStats() {
const res = await fetch(STATS_API)
const res = await fetch(STATS_API, { cache: "force-cache" })
if (!res.ok) throw new Error("Failed to fetch stats")
return res.json()
}

export default async function Page({ params }: { params: PageParams }) {
export default async function Page(props: { params: Promise<PageParams> }) {
const params = await props.params
const { locale } = params
const t = await getTranslations({ locale, namespace: "page-collectibles" })
setRequestLocale(locale)
Expand Down Expand Up @@ -146,11 +147,10 @@ export default async function Page({ params }: { params: PageParams }) {
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string }>
}) {
const params = await props.params
const { locale } = params
const t = await getTranslations({ locale, namespace: "page-collectibles" })
return await getMetadata({
Expand Down
10 changes: 5 additions & 5 deletions app/[locale]/community/events/conferences/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ import { mapEventTranslations } from "../utils"

import { getEventsData } from "@/lib/data"

const Page = async ({ params }: { params: PageParams }) => {
const Page = async (props: { params: Promise<PageParams> }) => {
const params = await props.params
const { locale } = params

const _events = (await getEventsData()) ?? []
Expand Down Expand Up @@ -134,11 +135,10 @@ const Page = async ({ params }: { params: PageParams }) => {
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string }>
}) {
const params = await props.params
const { locale } = params
const t = await getTranslations({
locale,
Expand Down
10 changes: 5 additions & 5 deletions app/[locale]/community/events/meetups/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ import FilterMeetups from "./_components/FilterMeetups"

import { getEventsData } from "@/lib/data"

const Page = async ({ params }: { params: PageParams }) => {
const Page = async (props: { params: Promise<PageParams> }) => {
const params = await props.params
const { locale } = params

const _events = (await getEventsData()) ?? []
Expand Down Expand Up @@ -76,11 +77,10 @@ const Page = async ({ params }: { params: PageParams }) => {
)
}

export async function generateMetadata({
params,
}: {
params: { locale: string }
export async function generateMetadata(props: {
params: Promise<{ locale: string }>
}) {
const params = await props.params
const { locale } = params
const t = await getTranslations({
locale,
Expand Down
Loading
Loading