error handeling on the pagination

This commit is contained in:
Arezoo
2025-10-22 17:38:29 +03:30
parent 74d142e86e
commit 34188ab366
9 changed files with 76 additions and 34 deletions
+6 -1
View File
@@ -1,6 +1,7 @@
import ItemDoctor from "@/app/component/ItemDoctor"; import ItemDoctor from "@/app/component/ItemDoctor";
import Pagination from "@/app/component/Pagination"; import Pagination from "@/app/component/Pagination";
import { QueryForDoctorsClinicReq } from "@/helper"; import { QueryForDoctorsClinicReq } from "@/helper";
import { getClinicDoctors } from "@/services/clinicApi";
import { request } from "@/services/response"; import { request } from "@/services/response";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useState } from "react"; import { useState } from "react";
@@ -14,6 +15,7 @@ function List({
setDoctors, setDoctors,
totalPages, totalPages,
slug, slug,
setTotalPage,
}) { }) {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const router = useRouter(); const router = useRouter();
@@ -31,7 +33,10 @@ function List({
limit, limit,
}; };
const doctors = await getClinicDoctors(slug, params); const doctors = await getClinicDoctors(slug, params);
setDoctors(doctors); setDoctors(doctors.data);
setTotalPage(doctors?.page?.total_pages || 1);
setPage(num);
}; };
const doctorList = Array.isArray(doctors?.data) ? doctors.data : doctors; const doctorList = Array.isArray(doctors?.data) ? doctors.data : doctors;
return ( return (
@@ -44,7 +44,7 @@ function Head({ setDoctors, slug, filter, setFilter,setPage,setTotalPage }) {
}; };
const updateData = (name, value, isReq) => { const updateData = (name, value) => {
const newFilter = { ...filter, [name]: value }; const newFilter = { ...filter, [name]: value };
setDataInURL(newFilter); setDataInURL(newFilter);
setFilter(newFilter); setFilter(newFilter);
@@ -52,9 +52,11 @@ function Head({ setDoctors, slug, filter, setFilter,setPage,setTotalPage }) {
}; };
const sendReq = async (newFilter) => { const sendReq = async (newFilter) => {
try {
const data = newFilter || filter; const data = newFilter || filter;
let params = QueryForDoctorsClinicReq(data); let params = QueryForDoctorsClinicReq(data);
if ( if (
data?.name === data.specialty?.name || data?.name === data.specialty?.name ||
data?.name === data.category?.name data?.name === data.category?.name
@@ -63,12 +65,28 @@ function Head({ setDoctors, slug, filter, setFilter,setPage,setTotalPage }) {
} }
params.page = 1; params.page = 1;
params.limit =50; params.limit = 50;
setTotalPage(data?.pages?.total_pages)
setPage(data?.pages?.current); // دریافت دکترها از API
const doctors = await getClinicDoctors(slug, params); const doctors = await getClinicDoctors(slug, params);
setDoctors(doctors);
// تنظیم داده‌ها در state
setDoctors(doctors);
// ✅ حالا که جواب API اومده، مقدار صفحات مشخصه
if (doctors?.page) {
setPage(doctors.page.current || 1);
setTotalPage(doctors.page.total_pages || 1);
} else {
setPage(1);
setTotalPage(1);
}
return doctors;
} catch (err) {
console.error("❌ خطا در sendReq:", err);
throw err;
}
}; };
@@ -81,6 +99,8 @@ function Head({ setDoctors, slug, filter, setFilter,setPage,setTotalPage }) {
setFilter={setFilter} setFilter={setFilter}
updateData={updateData} updateData={updateData}
setDataInURL={setDataInURL} setDataInURL={setDataInURL}
setPage={setPage}
setTotalPage={setTotalPage}
/> />
<SortList <SortList
filter={filter} filter={filter}
@@ -4,18 +4,20 @@ import { useRouter } from "next/navigation";
import { clearDoctorClinicParams, clearFilterParams } from "@/helper"; import { clearDoctorClinicParams, clearFilterParams } from "@/helper";
import { useState } from "react"; import { useState } from "react";
function DeleteAllButton({slug, filter, sendReq, setFilter, handleClose }) { function DeleteAllButton({slug, filter, sendReq, setFilter, handleClose, setPage }) {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const router = useRouter(); const router = useRouter();
const resetFilter = () => { const resetFilter = async() => {
setLoading(true); try{
setLoading(true);
clearDoctorClinicParams(router,slug, [ clearDoctorClinicParams(router,slug, [
"category", "category",
"specialty", "specialty",
"active", "active",
"gender", "gender",
"degree", "degree",
"page"
]); ]);
const newFilter = { const newFilter = {
@@ -28,11 +30,15 @@ function DeleteAllButton({slug, filter, sendReq, setFilter, handleClose }) {
degree: "همه موارد", degree: "همه موارد",
}, },
}; };
sendReq(newFilter).finally(() => { const res = await sendReq({ ...newFilter});
setLoading(false);
handleClose();
setFilter(newFilter); setFilter(newFilter);
}); setPage(1);
handleClose(false);
}catch (err) {
console.error("❌ خطا در ریست فیلترها:", err);
} finally {
setLoading(false);
}
}; };
return ( return (
@@ -1,4 +1,4 @@
"use client";
import { styleDefault } from "@/mui"; import { styleDefault } from "@/mui";
import { Modal } from "@mui/material"; import { Modal } from "@mui/material";
@@ -6,23 +6,28 @@ import { useState } from "react";
import Content from "./Content"; import Content from "./Content";
import ButtonApply from "./ButtonApply"; import ButtonApply from "./ButtonApply";
import DeleteAllButton from "./DeleteAllButton"; import DeleteAllButton from "./DeleteAllButton";
import { useParams } from "next/navigation";
function FilterModal({ function FilterModal({
slug, slug: propSlug,
filter, filter,
sendReq, sendReq,
children, children,
setFilter, setFilter,
updateData, updateData,
setDataInURL, setDataInURL,
setPage,
setTotalPage,
}) { }) {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const handleOpen = () => setOpen(true); const handleOpen = () => setOpen(true);
const handleClose = () => { const handleClose = () => {
setOpen(false); setOpen(false);
}; };
const params = useParams()
const slug = propSlug || params?.slug;
return ( return (
<> <>
{/* Button Modal */} {/* Button Modal */}
@@ -42,6 +47,8 @@ function FilterModal({
sendReq={sendReq} sendReq={sendReq}
setFilter={setFilter} setFilter={setFilter}
handleClose={handleClose} handleClose={handleClose}
setPage={setPage}
setTotalPage={setTotalPage}
/> />
<Content <Content
filter={filter} filter={filter}
@@ -5,7 +5,8 @@ import SendReq from "./SendReq";
import SearchField from "./SearchField"; import SearchField from "./SearchField";
import FilterModal from "../modal/FilterModal"; import FilterModal from "../modal/FilterModal";
function SearchBar({ slug,filter, sendReq, setFilter, updateData, setDataInURL }) { function SearchBar({ slug,filter, sendReq, setFilter, updateData, setDataInURL,setPage,setTotalPage }) {
return ( return (
<ButtonGroup <ButtonGroup
variant="contained" variant="contained"
@@ -20,6 +21,8 @@ function SearchBar({ slug,filter, sendReq, setFilter, updateData, setDataInURL }
setFilter={setFilter} setFilter={setFilter}
updateData={updateData} updateData={updateData}
setDataInURL={setDataInURL} setDataInURL={setDataInURL}
setPage={setPage}
setTotalPage={setTotalPage}
> >
<Button <Button
color="secondary" color="secondary"
@@ -4,10 +4,12 @@ import FilterModal from "../modal/FilterModal";
import FilterBtn from "./FilterBtn"; import FilterBtn from "./FilterBtn";
import SelectSort from "./SelectSort"; import SelectSort from "./SelectSort";
function SortList({ filter, sendReq, setFilter, updateData, setDataInURL }) { function SortList({ filter, sendReq, setFilter, updateData, setDataInURL,slug }) {
return ( return (
<div className="flex flex-wrap items-center lg:!w-[25%] gap-[20px] gap-y-[12px] lg:gap-0"> <div className="flex flex-wrap items-center lg:!w-[25%] gap-[20px] gap-y-[12px] lg:gap-0">
<FilterModal <FilterModal
slug={slug}
filter={filter} filter={filter}
sendReq={sendReq} sendReq={sendReq}
setFilter={setFilter} setFilter={setFilter}
@@ -5,10 +5,10 @@ import List from "./List";
import Head from "./head"; import Head from "./head";
import page from "@/app/panel/(layout)/turns/page"; import page from "@/app/panel/(layout)/turns/page";
function Doctors({ slug, doctors, data, pages }) { function Doctors({ slug, doctors, pages }) {
const [page, setPage] = useState(pages?.current || 1); const [page, setPage] = useState(pages?.current || 1);
const [totalPage, setTotalPage] = useState(pages?.total_pages); const [totalPage, setTotalPage] = useState(pages?.total_pages||1);
const [filter, setFilter] = useState({}); const [filter, setFilter] = useState({});
const [filteredSpecialties, setFilteredSpecialties] = useState(doctors); const [filteredSpecialties, setFilteredSpecialties] = useState(doctors);
@@ -32,6 +32,7 @@ function Doctors({ slug, doctors, data, pages }) {
page={page} page={page}
limit={50} limit={50}
setPage={setPage} setPage={setPage}
setTotalPage={setTotalPage}
/> />
</div> </div>
); );
+3 -6
View File
@@ -153,13 +153,10 @@ export function clearFilterParams(router, listRemove) {
router.push(newUrl); router.push(newUrl);
} }
export function clearDoctorClinicParams(router,slug,listRemove){ export function clearDoctorClinicParams(router,slug){
const currentParams=new URLSearchParams(window.location.search);
const clinicslug=slug; const clinicslug=slug;
const keysToRemove=listRemove; const newUrl = `/clinic/${clinicslug}`;
keysToRemove.forEach((key)=>currentParams.delete(key));
const queryString=currentParams.toString();
const newUrl=queryString? `/clinic/${clinicslug}?${queryString}`:`/clinic/${clinicslug}`;
router.push(newUrl) router.push(newUrl)
} }
export const filterList = (data) => { export const filterList = (data) => {
+4 -3
View File
@@ -16,9 +16,10 @@ export async function getClinicDoctors(slug, params = {}) {
} }
const json = await response.json(); const json = await response.json();
return {
const doctorsList = json?.data || json || []; data: json?.data || [],
return Array.isArray(doctorsList) ? doctorsList : []; page: json?.page || json?.pages || { total_pages: 1, current: 1 },
};
} catch (error) { } catch (error) {
console.error("خطا در دریافت دکترهای کلینیک:", error); console.error("خطا در دریافت دکترهای کلینیک:", error);
return []; return [];