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

إضافة تقييم للواجهة البرمجية

محمود سعداوي2

السؤال

السلام عليكم.

بعد تقييم منتج محدد أريد إظهار التقييم على الواجهة البرمجية.

Slice

import { createSlice } from "@reduxjs/toolkit";

const bookSlice = createSlice({
    name: "book",
    initialState: {
        books: [],
        reviews: [],
        error: false,
        loading: false,
    },
    reducers: {
        addReviews(state, action) {
            state.books = action.payload
        },
        getReviews(state, action) {
            state.reviews = action.payload;
        },
        setLoading(state) {
            state.loading = true;
        },
        clearLoading(state) {
            state.loading = false;
        },
    }
})

const bookReducer = bookSlice.reducer;
const bookActions = bookSlice.actions;

export {bookActions, bookReducer}

apiCall

// Get Book Reviews
export function getBookReviews(bookId) {
  return async (dispatch, getState) => {
    try {
      dispatch(bookActions.setLoading())
      const {data} = await axios.get(`${BOOK_URL}/${bookId}/reviews`, {
        headers: {
          "authorization": getState().auth.user.accessToken
        }
      });
      dispatch(bookActions.getReviews(data));
      dispatch(bookActions.clearLoading());
    } catch (error) {
      toast.error(error?.response?.data.message);
      dispatch(bookActions.clearLoading());
    }
  };
}

// Post Review
export function postReview(bookId, review) {
  return async (dispatch, getState) => {
    try {
      dispatch(bookActions.setLoading())
      const {data} = await axios.post(`${BOOK_URL}/${bookId}/reviews`, review, {
        headers: {
          "authorization": getState().auth.user.accessToken
        }
      });
      toast.success(data?.message)
      dispatch(bookActions.addReviews())
      dispatch(bookActions.getReviews(review));
      dispatch(bookActions.clearLoading());
    } catch (error) {
      toast.error(error?.response?.data.message);
      dispatch(bookActions.clearLoading());
    }
  };
}

React Component

// Get Book Reviews
export function getBookReviews(bookId) {
  return async (dispatch, getState) => {
    try {
      dispatch(bookActions.setLoading())
      const {data} = await axios.get(`${BOOK_URL}/${bookId}/reviews`, {
        headers: {
          "authorization": getState().auth.user.accessToken
        }
      });
      dispatch(bookActions.getReviews(data));
      dispatch(bookActions.clearLoading());
    } catch (error) {
      toast.error(error?.response?.data.message);
      dispatch(bookActions.clearLoading());
    }
  };
}

// Post Review
export function postReview(bookId, review) {
  return async (dispatch, getState) => {
    try {
      dispatch(bookActions.setLoading())
      const {data} = await axios.post(`${BOOK_URL}/${bookId}/reviews`, review, {
        headers: {
          "authorization": getState().auth.user.accessToken
        }
      });
      toast.success(data?.message)
      dispatch(bookActions.addReviews())
      dispatch(bookActions.getReviews(review));
      dispatch(bookActions.clearLoading());
    } catch (error) {
      toast.error(error?.response?.data.message);
      dispatch(bookActions.clearLoading());
    }
  };
}

Review.jsx

import moment from "moment";
import React from "react";
import Rating from "../rating/Rating";
import { Oval } from "react-loader-spinner";
import { useSelector } from "react-redux";

function Reviews() {
  const { loading, reviews } = useSelector((state) => state.book);


  return (
    <div className="get-reviews">
      <h2 className="get-reviews-title">Reviews ({reviews?.length})</h2>
      <div className="reviews">
        {loading ? (
          <Oval
            height={120}
            width={120}
            color="rgb(247, 96, 14)"
            wrapperStyle={{
              height: "90vh",
              display: "flex",
              alignItems: "center",
              justifyContent: "center",
            }}
            wrapperClass=""
            visible={true}
            ariaLabel="oval-loading"
            secondaryColor="#E2E2E2"
            strokeWidth={3}
            strokeWidthSecondary={3}
          />
        ) : (
          Array.isArray(reviews) && reviews.map((el, key) => (
            <div className="user-review" key={key}>
              <p>
                <span>{el?.username ? el?.username : "Unknown User"}</span>{" "}
                {`-  `}
                {moment(el?.createdAt).format("DD MMM YYYY")}
              </p>
              <Rating rating={el?.rate} />
              <p>{el?.comment}</p>
            </div>
          ))
        )}
      </div>
    </div>
  );
}

export default Reviews;

شكرا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

في الكود الذي أرفقته لقد عالجت اضافة التقييم و جلب التقييمات من السيرفر , و الأن لكي تحدث المعلومات التي لديك و تعرض التقييم الجديد على الواجهة

  • قم بطلب api الذي يجلب التقييمات الخاصة بالكتاب الذي أضفت تقييم جديد له في حال نجحت عملية الاضافة (قم بتنفيذ هذه العملية في المكان الذي تستدعي فيه PostReview)
  • وعندما تعود النتيجة سيتم تخزين البيانات في  ال redux و بالتالي سيتم اعادة تنفيذ ال Reviews component و تظهر البيانات الجديدة
رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...