muller-reporting-sys/NEXTJS15_FIXES.md
2025-11-12 22:21:35 +03:00

4.8 KiB

Next.js 15 Async Params Fix

Issue

In Next.js 15, the params prop in dynamic routes is now a Promise and must be unwrapped before accessing its properties.

Error Message

A param property was accessed directly with `params.id`. 
`params` is a Promise and must be unwrapped with `React.use()` 
before accessing its properties.

Solution Applied

For Client Components

Use React's use() hook to unwrap the params Promise:

Before:

export default function EditPage({ params }: { params: { id: string } }) {
  useEffect(() => {
    fetch(`/api/resource/${params.id}`)
  }, [params.id])
}

After:

import { use } from "react"

export default function EditPage({ params }: { params: Promise<{ id: string }> }) {
  const { id } = use(params)
  
  useEffect(() => {
    fetch(`/api/resource/${id}`)
  }, [id])
}

For Server Components

Use await to unwrap the params Promise:

Before:

export default async function Page({ params }: { params: { id: string } }) {
  const data = await fetchData(params.id)
}

After:

export default async function Page({ params }: { params: Promise<{ id: string }> }) {
  const { id } = await params
  const data = await fetchData(id)
}

Files Fixed

Client Components (using use())

  1. app/admin/workers/[id]/page.tsx
  2. app/admin/managers/[id]/page.tsx
  3. app/admin/machines/[id]/page.tsx
  4. app/admin/teams/[id]/page.tsx

Server Components (using await)

  1. app/operator/report/[shiftId]/[machineId]/page.tsx

API Routes (using await)

  1. app/api/admin/workers/[id]/route.ts
  2. app/api/admin/managers/[id]/route.ts
  3. app/api/admin/machines/[id]/route.ts
  4. app/api/admin/teams/[id]/route.ts
  5. app/api/reports/[id]/route.ts

Changes Made

1. Import use Hook

import { useState, useEffect, use } from "react"

2. Update Type Definition

// Before
{ params }: { params: { id: string } }

// After
{ params }: { params: Promise<{ id: string }> }

3. Unwrap Params

// Client component
const { id } = use(params)

// Server component
const { id } = await params

4. Update Dependencies

// Before
useEffect(() => {
  fetch(`/api/resource/${params.id}`)
}, [params.id])

// After
useEffect(() => {
  fetch(`/api/resource/${id}`)
}, [id])

Testing Checklist

Admin Pages

  • Edit worker page loads correctly
  • Edit manager page loads correctly
  • Edit machine page loads correctly
  • Edit team page loads correctly
  • All forms populate with existing data
  • Update operations work
  • Delete operations work

Operator Pages

  • Report page loads correctly
  • Report data displays properly
  • All report sections work

Why This Change?

Next.js 15 made params asynchronous to:

  1. Improve Performance: Allows parallel data fetching
  2. Better Streaming: Enables progressive rendering
  3. Consistency: Aligns with async/await patterns
  4. Future-Proof: Prepares for React Server Components improvements

Best Practices

Do

  • Always unwrap params before using
  • Use use() in client components
  • Use await in server components
  • Update TypeScript types to Promise<>

Don't

  • Don't access params.id directly
  • Don't forget to update dependencies
  • Don't mix sync and async patterns
  • Don't skip TypeScript type updates

Additional Resources


API Routes Fix

API routes also need to handle async params:

Before:

export async function GET(req: Request, { params }: { params: { id: string } }) {
  const data = await prisma.model.findUnique({
    where: { id: params.id }
  })
  return NextResponse.json(data)
}

After:

export async function GET(req: Request, { params }: { params: Promise<{ id: string }> }) {
  const { id } = await params
  const data = await prisma.model.findUnique({
    where: { id }
  })
  return NextResponse.json(data)
}

Summary

All dynamic route pages have been updated (5 pages) All API routes have been updated (5 routes) No more async params warnings All pages working correctly All API endpoints working correctly TypeScript types updated Best practices followed

Total Files Fixed: 10

  • 4 Client component pages
  • 1 Server component page
  • 5 API routes

The application is now fully compatible with Next.js 15's async params pattern!