fix: unwrap async params with React.use() for Next.js 15 compatibility

All client-side dynamic route pages were accessing params directly
instead of unwrapping the Promise, which Next.js 15 now requires.
This commit is contained in:
Atash03 2026-01-26 11:07:42 +05:00
parent 9863f27c6f
commit 236ded1a82
5 changed files with 33 additions and 26 deletions

View File

@ -13,21 +13,22 @@ import { dehydrate, useQuery } from '@tanstack/react-query';
import { data } from 'autoprefixer';
import Head from 'next/head';
import Image from 'next/image';
import { useContext } from 'react';
import { use, useContext } from 'react';
import { useMediaQuery } from 'usehooks-ts';
interface IParams {
params: {
params: Promise<{
page_id: string;
};
}>;
}
const PageItem = ({ params }: IParams) => {
const { page_id } = use(params);
const responsive = useMediaQuery('(max-width: 768px)');
const { data, isFetching, error } = useQuery({
queryKey: ['page_item'],
queryFn: () => Queries.getPage(params.page_id),
queryFn: () => Queries.getPage(page_id),
});
if (isFetching) return <Loader height={'100%'} />;

View File

@ -13,16 +13,17 @@ import { useQuizSearchActive, useSteps } from "@/store/store";
import { Validator } from "@/utils/validator";
import Image from "next/image";
import Link from "next/link";
import { useEffect, useState } from "react";
import { use, useEffect, useState } from "react";
import { useMediaQuery } from "usehooks-ts";
interface IParams {
params: {
params: Promise<{
quiz_id: string;
};
}>;
}
const page = ({ params }: IParams) => {
const { quiz_id } = use(params);
const [quizFinished, setQuizFinished] = useState<boolean>(false);
const [data, setData] = useState<IQuizQuestions>();
const { active } = useQuizSearchActive();
@ -31,7 +32,7 @@ const page = ({ params }: IParams) => {
useEffect(() => {
const local_info = sessionStorage.getItem("TURKMENTV_QUIZ_INFO");
if (!params.quiz_id) {
if (!quiz_id) {
Queries.getQuizQuestions().then((res) => {
setData(res);
if (res.data.questions) {
@ -63,7 +64,7 @@ const page = ({ params }: IParams) => {
}
});
} else {
Queries.getQuiz(params.quiz_id).then((res) => {
Queries.getQuiz(quiz_id).then((res) => {
setData(res);
if (res.data.questions) {
res.data.questions.map((question) =>
@ -201,7 +202,7 @@ const page = ({ params }: IParams) => {
</button>
))}
<Link
href={`/quiz/${params.quiz_id}/results`}
href={`/quiz/${quiz_id}/results`}
className={`flex-1 py-[5px] rounded-lg transition-all duration-300 bg-lightPrimaryContainer text-center text-textLight`}
>
Netije
@ -212,7 +213,7 @@ const page = ({ params }: IParams) => {
{data?.data && !active ? (
<QuizQuestionList
paramsId={params.quiz_id}
paramsId={quiz_id}
initialQuestionsData={data}
setQuizFinished={setQuizFinished}
quizFinished={quizFinished}

View File

@ -8,15 +8,16 @@ import QuizTapgyrWinners from "@/components/quiz/QuizTapgyrWinners";
import { Data } from "@/models/quizQuestions.model";
import { useQuizResults } from "@/store/store";
import { notFound } from "next/navigation";
import React, { useEffect, useState } from "react";
import React, { use, useEffect, useState } from "react";
interface IParams {
params: {
params: Promise<{
quiz_id: string;
};
}>;
}
const Page = ({ params }: IParams) => {
const { quiz_id } = use(params);
const [data, setData] = useState<Data>();
const [tab, setTab] = useState<number | string>(0);
const [loading, setLoading] = useState<boolean>(false);
@ -26,7 +27,7 @@ const Page = ({ params }: IParams) => {
const local_info = sessionStorage.getItem("TURKMENTV_QUIZ_RESULTS");
if (!resultData.length && !error) {
setLoading(true);
Queries.getQuizById(params.quiz_id)
Queries.getQuizById(quiz_id)
.then((res) => {
setData(res.data);
if (res.data.steps?.length) {
@ -68,7 +69,7 @@ const Page = ({ params }: IParams) => {
<section className="container py-[40px]">
<div className="flex flex-col w-full py-[40px] gap-[80px]">
<QuizHeader data={data} />
<QuizResultsSearch id={params.quiz_id} />
<QuizResultsSearch id={quiz_id} />
<QuizResultsTabs
steps={data?.steps ? data?.steps : []}
tab={tab}
@ -77,7 +78,7 @@ const Page = ({ params }: IParams) => {
/>
{tab === "results" && (
<QuizTapgyrResults
id={params.quiz_id}
id={quiz_id}
steps={
data?.steps ? data?.steps?.map((item) => String(item.tapgyr)) : []
}
@ -89,7 +90,7 @@ const Page = ({ params }: IParams) => {
tab !== "results" && (
<QuizTapgyrWinners
key={data.steps[Number(tab)].tapgyr}
id={params.quiz_id}
id={quiz_id}
tapgyr={data.steps[Number(tab)].tapgyr}
questions={data.steps[Number(tab)].questions}
/>

View File

@ -1,20 +1,23 @@
'use client';
import ParticipantsList from '@/components/vote/ParticipantsList';
import VoteProvider from '@/providers/VoteProvider';
import { use } from 'react';
interface IParams {
params: {
params: Promise<{
vote_id: string;
};
}>;
}
const page = ({ params }: IParams) => {
const { vote_id } = use(params);
return (
<main className="pt-[60px] pb-[120px]">
<div className="container">
<VoteProvider>
<div className="flex flex-col items-center w-full">
<ParticipantsList vote_id={params.vote_id} />
<ParticipantsList vote_id={vote_id} />
</div>
</VoteProvider>
</div>

View File

@ -1,6 +1,6 @@
'use client';
import PrizeCard from '@/components/prizes/PrizeCard';
import { useState, useEffect } from 'react';
import { use, useState, useEffect } from 'react';
import axios from 'axios';
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { GiftsType } from '@/typings/gifts/gifts.type';
@ -15,7 +15,8 @@ interface Prize {
description: string;
}
const PrizesPage = ({ params }: { params: { user_id: string } }) => {
const PrizesPage = ({ params }: { params: Promise<{ user_id: string }> }) => {
const { user_id } = use(params);
const [selectedPrize, setSelectedPrize] = useState<null | number>(null);
const queryClient = useQueryClient();
const router = useRouter();
@ -23,10 +24,10 @@ const PrizesPage = ({ params }: { params: { user_id: string } }) => {
// Fetching data using TanStack Query
const { data, isLoading, error } = useQuery<GiftsType, Error>({
queryKey: [`gifts-${params.user_id}`, params.user_id],
queryKey: [`gifts-${user_id}`, user_id],
queryFn: () =>
axios
.get(`https://sms.turkmentv.gov.tm/api/gifts/${params.user_id}`)
.get(`https://sms.turkmentv.gov.tm/api/gifts/${user_id}`)
.then((response) => response.data),
});
@ -90,7 +91,7 @@ const PrizesPage = ({ params }: { params: { user_id: string } }) => {
}
setSelectedPrize={setSelectedPrize}
id={prize.id}
code={params.user_id}
code={user_id}
{...prize}
/>
))}