From dc40129034bc2def5b1f41eff768f57134077335 Mon Sep 17 00:00:00 2001 From: Ehsan Date: Fri, 5 Sep 2025 23:05:02 +0330 Subject: [PATCH] handle change data in doctor model, set previous data when user close modal, update list doctor after update data and change key name in url --- app/component/modalSearchCity/index.js | 1 + app/doctors/page.js | 8 +- .../cards/comments/modal/ModalAnswer.js | 5 - components/doctor/index.js | 2 +- components/doctors/index.js | 29 +++--- components/doctors/modal/ButtonApply.js | 94 +++++++++++++++++++ components/doctors/modal/Content.js | 13 --- components/doctors/modal/FilterModal.js | 42 ++++++--- components/doctors/modal/form/CateSelector.js | 2 +- components/doctors/modal/form/index.js | 1 - components/doctors/search/index.js | 21 ++++- components/home/search/modal/index.js | 4 +- services/response.js | 9 +- 13 files changed, 175 insertions(+), 56 deletions(-) create mode 100644 components/doctors/modal/ButtonApply.js diff --git a/app/component/modalSearchCity/index.js b/app/component/modalSearchCity/index.js index 26d3c4b..bb57861 100644 --- a/app/component/modalSearchCity/index.js +++ b/app/component/modalSearchCity/index.js @@ -24,6 +24,7 @@ function ModalSearchCity({ const states = addLabelToList(statesData); const cities = addLabelToList(citiesData); const [filteredCities, setFilteredCities] = useState([]); + state; const handleClose = () => setOpen(false); diff --git a/app/doctors/page.js b/app/doctors/page.js index bb42ce3..3ccb8b8 100644 --- a/app/doctors/page.js +++ b/app/doctors/page.js @@ -10,8 +10,8 @@ async function Doctors({ searchParams }) { try { const params = {}; - if (matchedCity) params.city = matchedCity; - if (matchedState) params.state = matchedState; + if (matchedCity) params.city = matchedCity?.id || null; + if (matchedState) params.state = matchedState?.id || null; const response = await axios.get( "https://back-dev.clinic-pro.ir/api/v1/doctors", { @@ -19,9 +19,7 @@ async function Doctors({ searchParams }) { } ); doctors = response.data.data; - } catch (error) { - // console.error("problem with req:", error.message); - } + } catch (error) {} return ( diff --git a/components/doctor/detailDoctor/cards/comments/modal/ModalAnswer.js b/components/doctor/detailDoctor/cards/comments/modal/ModalAnswer.js index 6c75749..7de8bf9 100644 --- a/components/doctor/detailDoctor/cards/comments/modal/ModalAnswer.js +++ b/components/doctor/detailDoctor/cards/comments/modal/ModalAnswer.js @@ -51,7 +51,6 @@ function ModalAnswer({ doctor }) { request .postDoctorComment(comment.detail) .then((res) => { - console.log(res); let newComment = comment.rate; newComment = { correct_diagnosis: newComment[1].progress, @@ -62,25 +61,21 @@ function ModalAnswer({ doctor }) { doctor: doctor?.id, rate: averageRate, }; - console.log(newComment); request .postDoctorRate(newComment) .then((res) => { setLoading(false); setOpen(false); - console.log(res); }) .catch((err) => { setLoading(false); setOpen(false); - console.log(err); }); }) .catch((err) => { setLoading(false); setOpen(false); - console.log(err); }); }; diff --git a/components/doctor/index.js b/components/doctor/index.js index ee4c22c..2970d68 100644 --- a/components/doctor/index.js +++ b/components/doctor/index.js @@ -4,7 +4,7 @@ import Share from "./detailDoctor/Share"; import CustomLoading from "@/app/component/loading/Custom"; function DoctorPage({ doctor, doctors, comments }) { - console.log(comments); + comments; return (
diff --git a/components/doctors/index.js b/components/doctors/index.js index d26adbe..f319dcb 100644 --- a/components/doctors/index.js +++ b/components/doctors/index.js @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useState } from "react"; import SearchBar from "./search"; import SortList from "./sortlist"; import { Button } from "@mui/material"; @@ -14,6 +14,7 @@ import specialties from "@/data/specialties.json"; function DoctorsPage({ params, matchedCity, matchedState, list }) { const fieldId = params.field; const [loading, setLoading] = useState(true); + const [doctors, setDoctors] = useState(list); const [open, setOpen] = useState(false); const [selected, setSelected] = useState({ province: matchedState?.name || params?.province, @@ -22,20 +23,16 @@ function DoctorsPage({ params, matchedCity, matchedState, list }) { const findItem = (id) => specialties.find((item) => item.id === id); const isParent = findItem(fieldId) && findItem(fieldId).parent; - - const [data, setData] = useState({ + const defaultData = { category: isParent ? findItem(isParent) : findItem(fieldId), specialties: isParent && findItem(fieldId), turn: params && params.hasOwnProperty("turn") ? JSON.parse(params.turn) : 1, gender: params.gender || "هر دو", degree: params.degree || "همه موارد", - }); + }; - useEffect(() => { - setTimeout(() => { - setLoading(false); - }, 2000); - }, []); + const [data, setData] = useState(defaultData); + const [confirmedData, setConfirmedData] = useState(defaultData); return (
@@ -44,6 +41,7 @@ function DoctorsPage({ params, matchedCity, matchedState, list }) { open={open} setOpen={setOpen} selected={selected} + state={matchedState} setSelected={setSelected} >
- +
); } diff --git a/components/doctors/modal/ButtonApply.js b/components/doctors/modal/ButtonApply.js new file mode 100644 index 0000000..758aa49 --- /dev/null +++ b/components/doctors/modal/ButtonApply.js @@ -0,0 +1,94 @@ +import { Button } from "@mui/material"; +import specialties from "@/data/specialties.json"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; +import { request } from "@/services/response"; + +function ButtonApply({ + data, + setConfirmedData, + matchedCity, + matchedState, + setOpen, + setDoctors, +}) { + const router = useRouter(); + const [loading, setLoading] = useState(false); + + const sendReq = () => { + setLoading(true); + + const params = new URLSearchParams(window.location.search); + const field = params.get("field"); + const gender = params.get("gender"); + const degree = params.get("degree"); + const turn = params.get("turn"); + + const requestData = { + field: field === "null" ? null : field, + gender, + degree, + turn, + city: matchedCity?.id || null, + state: matchedState?.id || null, + }; + + request + .getDoctors(requestData) + .then((res) => { + if (res && res.data) setDoctors(res.data); + }) + .catch((err) => {}) + .finally(() => { + setOpen(false); + setLoading(false); + }); + }; + + const applyFilters = () => { + const current = new URLSearchParams(); + + const mappings = [ + { + key: "field", + getValue: () => { + if (data.category) { + const children = specialties.filter( + (item) => item.parent === data.category.id + ); + return children.length > 0 ? children[0].id : data.category.id; + } + return null; + }, + }, + { key: "gender", getValue: () => data.gender || null }, + { key: "degree", getValue: () => data.degree || null }, + { key: "turn", getValue: () => data.turn }, + ]; + + mappings.forEach(({ key, getValue }) => { + const value = getValue(); + current.set(key, value); + }); + + const queryString = current.toString(); + setConfirmedData(data); + sendReq(); + router.push(`/doctors?${queryString}`); + }; + + return ( +
+ +
+ ); +} + +export default ButtonApply; diff --git a/components/doctors/modal/Content.js b/components/doctors/modal/Content.js index 9845a7d..c9a954b 100644 --- a/components/doctors/modal/Content.js +++ b/components/doctors/modal/Content.js @@ -1,17 +1,7 @@ -import { useRouter } from "next/navigation"; import specialties from "@/data/specialties.json"; import Form from "./form"; function Content({ data, setData }) { - const router = useRouter(); - - const changeUrl = (value, name) => { - const current = new URLSearchParams(window.location.search); - current.set(name, value.id || value); - const queryString = current.toString(); - router.push(`/doctors?${queryString}`); - }; - const changeData = (value, name, isCategory, key) => { const newData = { ...data, [name]: value }; @@ -23,9 +13,6 @@ function Content({ data, setData }) { const firstChildren = filteredChildrenList[0]; newData.specialties = firstChildren || ""; - changeUrl(firstChildren || value, key); - } else { - changeUrl(value, key); } setData(newData); diff --git a/components/doctors/modal/FilterModal.js b/components/doctors/modal/FilterModal.js index 60717ee..e713595 100644 --- a/components/doctors/modal/FilterModal.js +++ b/components/doctors/modal/FilterModal.js @@ -7,29 +7,44 @@ import { useState } from "react"; import Content from "./Content"; import { useRouter } from "next/navigation"; import { clearFilterParams } from "@/helper"; +import ButtonApply from "./ButtonApply"; -function FilterModal({ data, setData, children }) { +function FilterModal({ + data, + setData, + children, + setDoctors, + matchedCity, + matchedState, + confirmedData, + setConfirmedData, +}) { const router = useRouter(); const [open, setOpen] = useState(false); const handleOpen = () => setOpen(true); - const handleClose = () => setOpen(false); + const handleClose = () => { + setOpen(false); + setData(confirmedData); + }; const deleteData = () => { clearFilterParams(router, [ "turn", - "specialties", + "field", "degree", "category", "gender", ]); - setData({ + const defaultData = { category: "", specialties: "", turn: true, gender: "هر دو", degree: "متخصص", - }); + }; + setData(defaultData); + setConfirmedData(defaultData); handleClose(); }; @@ -61,15 +76,14 @@ function FilterModal({ data, setData, children }) { -
- -
+ diff --git a/components/doctors/modal/form/CateSelector.js b/components/doctors/modal/form/CateSelector.js index 9249d01..66f6dbc 100644 --- a/components/doctors/modal/form/CateSelector.js +++ b/components/doctors/modal/form/CateSelector.js @@ -6,7 +6,7 @@ function CateSelector({ list, value, isError, updateData, label }) { return ( option?.name} className="!w-full !rounded-lg auto-complete-selector" diff --git a/components/doctors/modal/form/index.js b/components/doctors/modal/form/index.js index 3b41711..22c2616 100644 --- a/components/doctors/modal/form/index.js +++ b/components/doctors/modal/form/index.js @@ -1,7 +1,6 @@ import SwitchContent from "./SwitchContent"; import RadioContent from "./RadioContent"; import { filterList } from "@/helper"; -import { useState } from "react"; import CateSelector from "./CateSelector"; const gender = ["زن", "مرد", "هر دو"]; diff --git a/components/doctors/search/index.js b/components/doctors/search/index.js index d42d9df..803ea01 100644 --- a/components/doctors/search/index.js +++ b/components/doctors/search/index.js @@ -4,7 +4,16 @@ import ArrowBottomD from "@/components/icons/ArrowBottomD"; import SearchD from "@/components/icons/SearchD"; import FilterModal from "../modal/FilterModal"; -function SearchBar({ data, setData, params }) { +function SearchBar({ + data, + setData, + params, + setDoctors, + matchedCity, + matchedState, + confirmedData, + setConfirmedData, +}) { return ( - +