web/plugins/bottomSheet/BottomSheetAddress.jsx

406 lines
12 KiB
React
Raw Normal View History

2024-02-16 18:23:02 +03:30
"use client";
import AppContext from "@ctx/AppContext";
import { iranCities } from "iranCities";
import { iranProvince } from "iranProvince";
import Chapar from "plugins/Chapar";
2024-02-22 20:45:50 +03:30
import validateIranPhone from "plugins/IranPhoneRegex";
2024-02-16 19:36:30 +03:30
import { useContext, useEffect, useRef, useState } from "react";
2024-02-16 18:23:02 +03:30
import { BottomSheet } from "react-spring-bottom-sheet";
import { toast } from "react-toastify";
import SimpleReactValidator from "simple-react-validator";
const BottomSheetAddress = () => {
const CTX = useContext(AppContext);
const provinceData = iranProvince();
const citiesData = iranCities();
const [province, setProvince] = useState(null);
const [city, setCity] = useState(null);
const [cityData, setCityData] = useState([]);
const [plaque, setPlaque] = useState("");
const [address, setAddress] = useState("");
const [buildingUnit, setBuildingUnit] = useState("");
const [postalCode, setPostalCode] = useState("");
const [receiverFullName, setReceiverFullName] = useState("");
const [receiverPhoneNumber, setReceiverPhoneNumber] = useState("");
const validator = useRef(
new SimpleReactValidator({
messages: {
required: "پر کردن این فیلد الزامی میباشد",
},
element: (message) => (
<>
<div className="text-right px-1 ">
<small className="text-red-600 t-ig-small ">{message}</small>
</div>
</>
),
})
);
const body = {
address,
province: provinceData?.find((e) => e.id == province)?.title,
city: citiesData?.find((e) => e.id == city)?.title,
plaque,
buildingUnit,
receiverFullName,
receiverPhoneNumber,
postalCode,
};
const handleCreateAddress = async () => {
2024-02-22 20:45:50 +03:30
if (validateIranPhone(receiverPhoneNumber)) {
if (validator.current.allValid()) {
try {
const data = await Chapar.post(
`${process.env.NEXT_PUBLIC_API_URL}/user/address`,
JSON.stringify(body),
{
headers: {
Authorization: localStorage.getItem("token"),
},
}
);
2024-02-16 18:23:02 +03:30
2024-02-22 20:45:50 +03:30
toast.success(`آدرس اضافه شد`, {
position: "bottom-right",
closeOnClick: true,
});
2024-02-16 18:23:02 +03:30
2024-02-22 20:45:50 +03:30
CTX.setBottomSheetAddressOpen(false);
CTX.fetchAddressUser();
} catch ({ error, status }) {
toast.error(`${error?.response?.data?.message}`, {
position: "bottom-right",
closeOnClick: true,
});
}
} else {
toast.error("پرکردن همه ی فیلد ها واجب است", {
2024-02-16 18:23:02 +03:30
position: "bottom-right",
2024-02-22 20:45:50 +03:30
autoClose: 2000,
hideProgressBar: false,
2024-02-16 18:23:02 +03:30
closeOnClick: true,
2024-02-22 20:45:50 +03:30
pauseOnHover: true,
draggable: true,
progress: undefined,
2024-02-16 18:23:02 +03:30
});
}
} else {
2024-02-22 20:45:50 +03:30
toast.error("شماره تماس را درست وارد کنید", {
2024-02-16 18:23:02 +03:30
position: "bottom-right",
autoClose: 2000,
hideProgressBar: false,
closeOnClick: true,
pauseOnHover: true,
draggable: true,
progress: undefined,
});
}
};
useEffect(() => {
setCityData(citiesData.filter((city) => city.province_id == province));
}, [province]);
return (
<BottomSheet
open={CTX.state.bottomSheetAddressOpen}
onDismiss={() => CTX.setBottomSheetAddressOpen(false)}
className={"z-50 relative "}
>
<div className="xs:w-full lg:w-4/12 mx-auto">
<div className="text-center p-3">
<p className="mb-0 text-sm pb-3">اقزودن آدرس جدید </p>
</div>
<div className="p-3">
<label className="float-right mx-3 text-sm my-2 rtl">
استان
<small className="text-red-500 mx-1">*</small>
</label>
<select
type="text"
name="province"
className="form-control bg-white !border-[1px] focus:!border-[1px] border-gray-400 focus:!border-gray-300 rounded-lg text-right !text-sm tr03 "
placeholder="نام استان"
onChange={(e) => {
setProvince(e.target.value);
validator.current.showMessageFor("province");
}}
defaultValue=""
>
<option value="" disabled hidden>
انتخاب کنید
</option>
{provinceData?.map((c, index) => (
<option key={index} value={c.id}>
{c.title}
</option>
))}
</select>
<div className="flex justify-start w-full">
<small className=" ">
{" "}
{validator ? (
<>
{validator.current.message("province", province, "required")}
</>
) : (
""
)}
</small>
</div>
</div>
<div className="p-3">
<label className="float-right mx-3 text-sm my-2 rtl">
شهر
<small className="text-red-500 mx-1">*</small>
</label>
<select
type="text"
name="city"
className="form-control bg-white !border-[1px] focus:!border-[1px] border-gray-400 focus:!border-gray-300 rounded-lg text-right !text-sm tr03 "
placeholder="نام استان"
onChange={(e) => {
setCity(e.target.value);
validator.current.showMessageFor("city");
}}
>
{cityData?.map((c, index) => (
<option key={index} value={c.id}>
{c.title}
</option>
))}
</select>
<div className="flex justify-start w-full">
<small className=" ">
{" "}
{validator ? (
<>{validator.current.message("city", city, "required")}</>
) : (
""
)}
</small>
</div>
</div>
<div className="p-3">
<label className="float-right mx-3 text-sm my-2 rtl">
آدرس
<small className="text-red-500 mx-1">*</small>
</label>
<input
type="text"
name="address"
className="form-control bg-white !border-[1px] focus:!border-[1px] border-gray-400 focus:!border-gray-300 rounded-lg text-right !text-sm tr03 "
2024-04-29 00:10:33 +03:30
placeholder="اسم محله , خیابان , کوچه"
2024-02-16 18:23:02 +03:30
onChange={(e) => {
setAddress(e.target.value);
validator.current.showMessageFor("address");
}}
/>
<div className="flex justify-start w-full">
<small className=" ">
{" "}
{validator ? (
<>{validator.current.message("address", address, "required")}</>
) : (
""
)}
</small>
</div>
</div>
<div className="p-3">
<label className="float-right mx-3 text-sm my-2 rtl">
پلاک
<small className="text-red-500 mx-1">*</small>
</label>
<input
type="text"
name="plaque"
className="form-control bg-white !border-[1px] focus:!border-[1px] border-gray-400 focus:!border-gray-300 rounded-lg text-right !text-sm tr03 "
2024-04-29 00:10:33 +03:30
placeholder=" 10"
2024-02-16 18:23:02 +03:30
onChange={(e) => {
setPlaque(e.target.value);
validator.current.showMessageFor("plaque");
}}
/>
<div className="flex justify-start w-full">
<small className=" ">
{" "}
{validator ? (
<>{validator.current.message("plaque", plaque, "required")}</>
) : (
""
)}
</small>
</div>
</div>
<div className="p-3">
<label className="float-right mx-3 text-sm my-2 rtl">
واحد
<small className="text-red-500 mx-1">*</small>
</label>
<input
type="text"
name="buildingUnit"
className="form-control bg-white !border-[1px] focus:!border-[1px] border-gray-400 focus:!border-gray-300 rounded-lg text-right !text-sm tr03 "
placeholder="2"
onChange={(e) => {
setBuildingUnit(e.target.value);
validator.current.showMessageFor("buildingUnit");
}}
/>
<div className="flex justify-start w-full">
<small className=" ">
{" "}
{validator ? (
<>
{validator.current.message(
"buildingUnit",
buildingUnit,
"required"
)}
</>
) : (
""
)}
</small>
</div>
</div>
<div className="p-3">
<label className="float-right mx-3 text-sm my-2 rtl">
کد پستی
<small className="text-red-500 mx-1">*</small>
</label>
<input
type="text"
name="postalCode"
className="form-control bg-white !border-[1px] focus:!border-[1px] border-gray-400 focus:!border-gray-300 rounded-lg text-right !text-sm tr03 "
placeholder="2"
onChange={(e) => {
setPostalCode(e.target.value);
validator.current.showMessageFor("postalCode");
}}
/>
<div className="flex justify-start w-full">
<small className=" ">
{" "}
{validator ? (
<>
{validator.current.message(
"postalCode",
postalCode,
"required"
)}
</>
) : (
""
)}
</small>
</div>
</div>
<div className="p-3">
<label className="float-right mx-3 text-sm my-2 rtl">
نام گرینده
2024-04-29 00:10:33 +03:30
<small className="text-red-500 mx-1">*</small>
2024-02-16 18:23:02 +03:30
</label>
<input
type="text"
name="receiverFullName"
className="form-control bg-white !border-[1px] focus:!border-[1px] border-gray-400 focus:!border-gray-300 rounded-lg text-right !text-sm tr03 "
placeholder="علی احمدی"
onChange={(e) => {
setReceiverFullName(e.target.value);
validator.current.showMessageFor("receiverFullName");
}}
/>
<div className="flex justify-start w-full">
<small className=" ">
{" "}
{validator ? (
<>
{validator.current.message(
"receiverFullName",
receiverFullName,
"required"
)}
</>
) : (
""
)}
</small>
</div>
</div>
<div className="p-3">
<label className="float-right mx-3 text-sm my-2 rtl">
شماره گرینده
2024-04-29 00:10:33 +03:30
<small className="text-red-500 mx-1">*</small>
2024-02-16 18:23:02 +03:30
</label>
<input
type="text"
name="receiverPhoneNumber"
onChange={(e) => {
setReceiverPhoneNumber(e.target.value);
validator.current.showMessageFor("receiverPhoneNumber");
}}
className="form-control bg-white !border-[1px] focus:!border-[1px] border-gray-400 focus:!border-gray-300 rounded-lg text-right !text-sm tr03 "
placeholder="0912......"
/>
<div className="flex justify-start w-full">
<small className=" ">
{" "}
{validator ? (
<>
{validator.current.message(
"receiverPhoneNumber",
receiverPhoneNumber,
"required"
)}
</>
) : (
""
)}
</small>
</div>
</div>
<div className="w-full p-3 ">
<button
className="btn btn-primary text-sm w-full py-3 rounded-3xl"
onClick={() => handleCreateAddress()}
>
ساخت آدرس جدید{" "}
</button>
</div>
</div>
</BottomSheet>
);
};
export default BottomSheetAddress;