اذهب إلى المحتوى

السؤال

نشر
"use client";
import React, { useEffect } from "react";
import { Formik, Field, Form, ErrorMessage } from "formik";
import * as Yup from "yup";
import { LoadingView } from "../common";
import {
  useGetProductZoneQuery,
  useUpdateProductZoneMutation,
  useAddProductZoneMutation,
  useGetAllZoneMutation,
  useGetAllDeliveryTypesQuery,
  useGetAllProductsMutation,
} from "@/services";
import { useRouter } from "next/navigation";
import Swal from "sweetalert2";
import { cloneDeep } from "lodash";

const EditProductZone = ({ id }) => {
  const router = useRouter();
  const { data: { data = {} } = {}, isFetching: isFetchingProductZone } = useGetProductZoneQuery(id, {
    skip: isNaN(id),
    refetchOnMountOrArgChange: true,
  });
  const [getAllZones, { isLoading: isFetchingZones, data: zones }] = useGetAllZoneMutation();
  const [getAllProducts, { isLoading: isFetchingProducts, data: products }] = useGetAllProductsMutation();
  const { data: deliveryTypes, isFetching: isFetchingDeliveryTypes } =
    useGetAllDeliveryTypesQuery();
  const [updateProductZone, { isLoading: isUpdatingProductZone }] =
    useUpdateProductZoneMutation();
  const [addProductZone, { isLoading: isAddingProductZone }] = useAddProductZoneMutation();

  useEffect(() => {
    const getZones = async () => {
      const { data: { items = [] } = {} } = await getAllZones({ body: {} });
    };
    getZones();
  }, []);

  useEffect(() => {
    const getProducts = async () => {
      const { data: { items = [], itemsCount, pageNumber, pageSize } = {} } = await getAllProducts({ body: {} });
      let noOfPages = Math.ceil(itemsCount / pageSize);
      let currentPage = pageNumber;

      let productOptions = cloneDeep(items);
  
      while (currentPage < noOfPages - 1) {
        currentPage += 1;
        const { data: { items: additionalItems = [] } = {} } = await getAllProducts({
          body: { pageNumber: currentPage },
        });
  
        productOptions.push(...additionalItems);
      }
      console.log("All products:", productOptions);
    };
    getProducts();
  }, []);
  

  const validationSchema = Yup.object({
    productId: Yup.number().required("product is required"),
    zoneId: Yup.number().required("zone is required"),
    deliveryMethodId: Yup.number().required("delivery type is required"),
  });

  const initialValues = {
    productId: data?.productId || "",
    zoneId: data?.zoneId || "",
    deliveryMethodId: data?.deliveryMethodId || "",
  };

  const onResponse = (response, type) => {
    if (!response.error) {
      Swal.fire({
        icon: "success",
        title: "Success.",
        text:
          type == "add" ? "ProductZone has been created" : "ProductZone has been updated",
        showConfirmButton: false,
        timer: 1000,
      });
      router.push("/home/productZones");
    }
    if (response?.error) {
      Swal.fire({
        icon: "error",
        title: "Oops...",
        text: "Something went wrong!",
      });
    }
  };

  const onSubmit = async (values, { setSubmitting }) => {
    setSubmitting(true);
    if (!isNaN(id)) {
      const response = await updateProductZone({
        id: data?.id,
        body: {
          id: data?.id,
          ...values,
          productId: Number(values.productId),
          zoneId: Number(values.zoneId),
          deliveryMethodId: Number(values.deliveryMethodId),
        },
      });
      onResponse(response, "update");
    } else if (id === "add") {
      const response = await addProductZone({
        body: {
          ...values,
          productId: Number(values.productId),
          zoneId: Number(values.zoneId),
          deliveryMethodId: Number(values.deliveryMethodId),
        },
      });
      onResponse(response, "add");
    }
    setSubmitting(false);
  };

  return (
    <LoadingView
      isLoading={isFetchingProductZone || isUpdatingProductZone || isAddingProductZone || isFetchingZones
        || isFetchingProducts
        || isFetchingDeliveryTypes}
    >
      <Formik
        initialValues={initialValues}
        validationSchema={validationSchema}
        onSubmit={onSubmit}
      >
        <Form className="w-full">
          <div className="flex flex-wrap -mx-3 mb-6">
            <div className="w-full md:w-1/3 px-3 mb-6 md:mb-0">
              <label
                className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2"
                htmlFor="zoneId"
              >
                Zone
              </label>
              <Field
                as="select"
                id="zoneId"
                name="zoneId"
                className="appearance-none block w-full bg-gray-200 text-gray-700 border border-gray-200 rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-gray-500"
              >
                <option value="">Select a Zone</option>
                {zones &&
                  zones.items.map((zone) => (
                    <option key={zone.id} value={zone.id}>
                      {zone.name}
                    </option>
                  ))}
              </Field>
              <ErrorMessage
                name="zoneId"
                component="div"
                className="text-[red]"
              />
            </div>
            <div className="w-full md:w-1/3 px-3 mb-6 md:mb-0">
              <label
                className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2"
                htmlFor="productId"
              >
                Product
              </label>
              <Field
                as="select"
                id="productId"
                name="productId"
                className="appearance-none block w-full bg-gray-200 text-gray-700 border border-gray-200 rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-gray-500"
              >
                <option value="">Select a Product</option>
                {products &&
                  products.items.map((product) => (
                    <option key={product.id} value={product.id}>
                      {product.name}
                    </option>
                  ))}
              </Field>
              <ErrorMessage
                name="productId"
                component="div"
                className="text-[red]"
              />
            </div>
            <div className="w-full md:w-1/3 px-3 mb-6 md:mb-0">
              <label
                className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2"
                htmlFor="deliveryMethodId"
              >
                Delivery Type
              </label>
              <Field
                as="select"
                id="deliveryMethodId"
                name="deliveryMethodId"
                className="appearance-none block w-full bg-gray-200 text-gray-700 border border-gray-200 rounded py-3 px-4 leading-tight focus:outline-none focus:bg-white focus:border-gray-500"
              >
                <option value="">Select a Delivery type</option>
                {deliveryTypes &&
                  deliveryTypes.map((dt) => (
                    <option key={dt.value} value={dt.value}>
                      {dt.label}
                    </option>
                  ))}
              </Field>
              <ErrorMessage
                name="deliveryMethodId"
                component="div"
                className="text-[red]"
              />
            </div>
          </div>

          <div className="flex justify-center items-center mb-[2rem]">
            <button
              type="submit"
              className="bg-[#005CE6] py-[0.5rem] px-[1rem] w-[30%] text-[white] transition-all hover:bg-[green]"
            >
              Submit
            </button>
          </div>
        </Form>
      </Formik>
    </LoadingView>
  );
};

export default EditProductZone;

المشكلة ان products.items يرجع بها data في اخر page of pagination فقط وانا اريد data في كل الصفحات!!

Recommended Posts

  • 0
نشر

يبدو أنك تواجه مشكلة في تحميل جميع المنتجات عبر التمرير عند استخدام getAllProducts في عملية الترقيم (pagination). في الوقت الحالي، الكود الخاص بك يسترجع البيانات من آخر صفحة فقط، بينما تحتاج إلى جمع البيانات من كل الصفحات.

للقيام بذلك، تحتاج إلى تعديل الكود الخاص بك بحيث يواصل تحميل البيانات من الصفحات التالية حتى يتم الحصول على كل المنتجات. سأقوم بتقديم مثال لكيفية فعل ذلك:

useEffect(() => {
  const getProducts = async () => {
    const { data: { items = [], itemsCount, pageNumber, pageSize } = {} } = await getAllProducts({ body: {} });
    let noOfPages = Math.ceil(itemsCount / pageSize);
    let currentPage = pageNumber;

    let productOptions = [...items];
  
    while (currentPage < noOfPages) {
      currentPage += 1;
      const { data: { items: additionalItems = [] } = {} } = await getAllProducts({
        body: { pageNumber: currentPage },
      });

      productOptions = [...productOptions, ...additionalItems];
    }

    console.log("All products:", productOptions);
  };
  getProducts();
}, []);

في هذا التعديل:

تحويل المتغير productOptions إلى مصفوفة جديدة: بدأنا بتخزين العناصر من الصفحة الأولى في productOptions واستخدمنا التمديد عبر ... لتجميع البيانات من الصفحات اللاحقة.

استخدام حلقة while لتحميل الصفحات التالية: قمنا بتكرار استرجاع البيانات من الصفحات التالية حتى نغطي جميع الصفحات المتاحة.

جمع البيانات من جميع الصفحات في مصفوفة واحدة: بعد كل استرجاع بيانات من صفحة جديدة، ندمجها مع البيانات السابقة في productOptions.

هذا سيضمن أنك تحصل على جميع المنتجات من جميع الصفحات وليس فقط من آخر صفحة.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...