221 lines
7.3 KiB
JavaScript
221 lines
7.3 KiB
JavaScript
import { useState } from "react";
|
|
import {
|
|
Select,
|
|
SelectContent,
|
|
SelectItem,
|
|
SelectTrigger,
|
|
SelectValue,
|
|
} from "@/components/ui/select";
|
|
import { chanegItemStatusApi } from "@/utils/api";
|
|
import { toast } from "sonner";
|
|
import SoldOutModal from "./SoldOutModal";
|
|
import ReusableAlertDialog from "@/components/Common/ReusableAlertDialog";
|
|
import { t } from "@/utils";
|
|
import { useNavigate } from "@/components/Common/useNavigate";
|
|
|
|
const AdsStatusChangeCards = ({
|
|
productDetails,
|
|
setProductDetails,
|
|
status,
|
|
setStatus,
|
|
}) => {
|
|
const { navigate } = useNavigate();
|
|
const [IsChangingStatus, setIsChangingStatus] = useState(false);
|
|
const [showSoldOut, setShowSoldOut] = useState(false);
|
|
const [showConfirmModal, setShowConfirmModal] = useState(false);
|
|
const [selectedRadioValue, setSelectedRadioValue] = useState(null);
|
|
|
|
const isJobAd = productDetails?.category?.is_job_category === 1;
|
|
|
|
const isSoftRejected =
|
|
productDetails?.status === "soft rejected" ||
|
|
productDetails?.status === "resubmitted";
|
|
|
|
const IsDisableSelect = !(
|
|
productDetails?.status === "approved" ||
|
|
productDetails?.status === "inactive"
|
|
);
|
|
|
|
const isShowRejectedReason =
|
|
productDetails?.rejected_reason &&
|
|
(productDetails?.status === "soft rejected" ||
|
|
productDetails?.status === "permanent rejected");
|
|
const resubmitAdForReview = async () => {
|
|
try {
|
|
const res = await chanegItemStatusApi.changeItemStatus({
|
|
item_id: productDetails?.id,
|
|
status: "resubmitted",
|
|
});
|
|
|
|
if (res?.data?.error === false) {
|
|
toast(t("adResubmitted"));
|
|
setProductDetails((prev) => ({ ...prev, status: "resubmitted" }));
|
|
}
|
|
} catch (error) {
|
|
console.log(error);
|
|
toast(error.message);
|
|
}
|
|
};
|
|
|
|
const handleStatusChange = (newStatus) => {
|
|
setStatus(newStatus);
|
|
};
|
|
|
|
const updateItemStatus = async () => {
|
|
if (productDetails?.status === status) {
|
|
toast.error(t("changeStatusToSave"));
|
|
return;
|
|
}
|
|
if (status === "sold out") {
|
|
setShowSoldOut(true);
|
|
return;
|
|
}
|
|
try {
|
|
setIsChangingStatus(true);
|
|
const res = await chanegItemStatusApi.changeItemStatus({
|
|
item_id: productDetails?.id,
|
|
status: status === "approved" ? "active" : status,
|
|
});
|
|
if (res?.data?.error === false) {
|
|
setProductDetails((prev) => ({ ...prev, status }));
|
|
toast.success(t("statusUpdated"));
|
|
navigate("/my-ads");
|
|
} else {
|
|
toast.error(res?.data?.message);
|
|
}
|
|
} catch (error) {
|
|
console.log("error", error);
|
|
} finally {
|
|
setIsChangingStatus(false);
|
|
}
|
|
};
|
|
|
|
const makeItemSoldOut = async () => {
|
|
try {
|
|
setIsChangingStatus(true);
|
|
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
const res = await chanegItemStatusApi.changeItemStatus({
|
|
item_id: productDetails?.id,
|
|
status: "sold out",
|
|
sold_to: selectedRadioValue,
|
|
});
|
|
if (res?.data?.error === false) {
|
|
toast.success(t("statusUpdated"));
|
|
setProductDetails((prev) => ({ ...prev, status: "sold out" }));
|
|
setShowConfirmModal(false);
|
|
} else {
|
|
toast.error(t("failedToUpdateStatus"));
|
|
}
|
|
} catch (error) {
|
|
console.error(error);
|
|
} finally {
|
|
setIsChangingStatus(false);
|
|
}
|
|
};
|
|
|
|
return (
|
|
<>
|
|
{isSoftRejected ? (
|
|
<div className="border rounded-md gap-4">
|
|
<div className="flex flex-col">
|
|
<div className="p-4 text-xl font-medium border-b">
|
|
{t("adWasRejectedResubmitNow")}
|
|
</div>
|
|
{productDetails?.rejected_reason && (
|
|
<p className="bg-red-100 text-[#dc3545] px-2 py-1 rounded text-sm mt-[7px] font-medium">
|
|
<span className="font-medium">{t("rejectedReason")}:</span>{" "}
|
|
{productDetails?.rejected_reason}
|
|
</p>
|
|
)}
|
|
<div className="w-full p-4 ">
|
|
<button
|
|
className="bg-primary text-white font-medium w-full p-2 rounded-md"
|
|
disabled={productDetails?.status === "resubmitted"}
|
|
onClick={resubmitAdForReview}
|
|
>
|
|
{productDetails?.status === "resubmitted"
|
|
? t("resubmitted")
|
|
: t("resubmit")}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
) : (
|
|
<div className="flex flex-col border rounded-md ">
|
|
<div className="p-4 border-b font-semibold">{t("changeStatus")}</div>
|
|
<div className="p-4 flex flex-col gap-4 ">
|
|
<Select
|
|
className="outline-none "
|
|
value={status}
|
|
onValueChange={handleStatusChange}
|
|
disabled={IsChangingStatus || IsDisableSelect}
|
|
>
|
|
<SelectTrigger className="outline-none">
|
|
<SelectValue placeholder={t("status")} />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="approved">{t("active")}</SelectItem>
|
|
<SelectItem value="inactive">{t("deactivate")}</SelectItem>
|
|
<SelectItem value="review" disabled>
|
|
{" "}
|
|
{t("review")}
|
|
</SelectItem>
|
|
<SelectItem value="permanent rejected" disabled>
|
|
{" "}
|
|
{t("permanentRejected")}
|
|
</SelectItem>
|
|
<SelectItem value="expired" disabled>
|
|
{t("expired")}
|
|
</SelectItem>
|
|
<SelectItem
|
|
value="sold out"
|
|
disabled={productDetails?.status === "inactive"}
|
|
>
|
|
{isJobAd ? t("jobClosed") : t("soldOut")}
|
|
</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
|
|
{isShowRejectedReason && (
|
|
<p className="bg-red-100 text-[#dc3545] px-2 py-1 rounded text-sm mt-[7px] font-medium">
|
|
<span className="font-medium">{t("rejectedReason")}:</span>{" "}
|
|
{productDetails?.rejected_reason}
|
|
</p>
|
|
)}
|
|
<button
|
|
className="bg-primary text-white font-medium w-full p-2 rounded-md disabled:opacity-80"
|
|
onClick={updateItemStatus}
|
|
disabled={IsChangingStatus || IsDisableSelect}
|
|
>
|
|
{t("save")}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
)}
|
|
<SoldOutModal
|
|
productDetails={productDetails}
|
|
showSoldOut={showSoldOut}
|
|
setShowSoldOut={setShowSoldOut}
|
|
selectedRadioValue={selectedRadioValue}
|
|
setSelectedRadioValue={setSelectedRadioValue}
|
|
setShowConfirmModal={setShowConfirmModal}
|
|
/>
|
|
|
|
<ReusableAlertDialog
|
|
open={showConfirmModal}
|
|
onCancel={() => setShowConfirmModal(false)}
|
|
onConfirm={makeItemSoldOut}
|
|
title={isJobAd ? t("confirmHire") : t("confirmSoldOut")}
|
|
description={
|
|
isJobAd ? t("markAsClosedDescription") : t("cantUndoChanges")
|
|
}
|
|
cancelText={t("cancel")}
|
|
confirmText={t("confirm")}
|
|
confirmDisabled={IsChangingStatus}
|
|
/>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default AdsStatusChangeCards;
|