Merge branch 'dev' into 'main'
Dev See merge request frontend/marketplace!61
This commit is contained in:
commit
e20247cacb
@ -14,7 +14,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/react": "^11.10.5",
|
"@emotion/react": "^11.10.5",
|
||||||
"@emotion/styled": "^11.10.5",
|
"@emotion/styled": "^11.10.5",
|
||||||
"@frontend/kitui": "1.0.52",
|
"@frontend/kitui": "1.0.53",
|
||||||
"@mui/icons-material": "^5.10.14",
|
"@mui/icons-material": "^5.10.14",
|
||||||
"@mui/material": "^5.10.14",
|
"@mui/material": "^5.10.14",
|
||||||
"@popperjs/core": "^2.11.8",
|
"@popperjs/core": "^2.11.8",
|
||||||
|
@ -37,6 +37,7 @@ export default function TariffPage() {
|
|||||||
const discounts = useDiscountStore((state) => state.discounts);
|
const discounts = useDiscountStore((state) => state.discounts);
|
||||||
const purchasesAmount = useUserStore((state) => state.userAccount?.wallet.purchasesAmount) ?? 0;
|
const purchasesAmount = useUserStore((state) => state.userAccount?.wallet.purchasesAmount) ?? 0;
|
||||||
const cartTariffMap = useCartStore((state) => state.cartTariffMap);
|
const cartTariffMap = useCartStore((state) => state.cartTariffMap);
|
||||||
|
const isUserNko = useUserStore(state => state.userAccount?.status) === "nko";
|
||||||
|
|
||||||
const handleCustomBackNavigation = usePrevLocation(location);
|
const handleCustomBackNavigation = usePrevLocation(location);
|
||||||
|
|
||||||
@ -82,7 +83,8 @@ export default function TariffPage() {
|
|||||||
tariff,
|
tariff,
|
||||||
discounts,
|
discounts,
|
||||||
purchasesAmount,
|
purchasesAmount,
|
||||||
currentTariffs
|
currentTariffs,
|
||||||
|
isUserNko,
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -47,7 +47,7 @@ export const setCartTariffStatus = (tariffId: string, status: "loading" | "not f
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
export const addCartTariffs = (tariffs: Tariff[], discounts: Discount[], purchasesAmount: number) =>
|
export const addCartTariffs = (tariffs: Tariff[], discounts: Discount[], purchasesAmount: number, isUserNko: boolean) =>
|
||||||
useCartStore.setState(
|
useCartStore.setState(
|
||||||
produce<CartStore>((state) => {
|
produce<CartStore>((state) => {
|
||||||
tariffs.forEach((tariff) => {
|
tariffs.forEach((tariff) => {
|
||||||
@ -60,7 +60,7 @@ export const addCartTariffs = (tariffs: Tariff[], discounts: Discount[], purchas
|
|||||||
const cartTariffs = Object.values(state.cartTariffMap).filter(
|
const cartTariffs = Object.values(state.cartTariffMap).filter(
|
||||||
(tariff): tariff is Tariff => typeof tariff === "object"
|
(tariff): tariff is Tariff => typeof tariff === "object"
|
||||||
);
|
);
|
||||||
state.cart = calcCart(cartTariffs, discounts, purchasesAmount);
|
state.cart = calcCart(cartTariffs, discounts, purchasesAmount, isUserNko);
|
||||||
}),
|
}),
|
||||||
false,
|
false,
|
||||||
{
|
{
|
||||||
@ -69,7 +69,7 @@ export const addCartTariffs = (tariffs: Tariff[], discounts: Discount[], purchas
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
export const removeMissingCartTariffs = (tariffIds: string[], discounts: Discount[], purchasesAmount: number) =>
|
export const removeMissingCartTariffs = (tariffIds: string[], discounts: Discount[], purchasesAmount: number, isUserNko: boolean) =>
|
||||||
useCartStore.setState(
|
useCartStore.setState(
|
||||||
produce<CartStore>((state) => {
|
produce<CartStore>((state) => {
|
||||||
for (const key in state.cartTariffMap) {
|
for (const key in state.cartTariffMap) {
|
||||||
@ -78,7 +78,7 @@ export const removeMissingCartTariffs = (tariffIds: string[], discounts: Discoun
|
|||||||
const cartTariffs = Object.values(state.cartTariffMap).filter(
|
const cartTariffs = Object.values(state.cartTariffMap).filter(
|
||||||
(tariff): tariff is Tariff => typeof tariff === "object"
|
(tariff): tariff is Tariff => typeof tariff === "object"
|
||||||
);
|
);
|
||||||
state.cart = calcCart(cartTariffs, discounts, purchasesAmount);
|
state.cart = calcCart(cartTariffs, discounts, purchasesAmount, isUserNko);
|
||||||
}),
|
}),
|
||||||
false,
|
false,
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { CartData, Discount, PrivilegeCartData, Tariff, TariffCartData, applyCartDiscount, applyLoyaltyDiscount, applyPrivilegeDiscounts, applyServiceDiscounts } from "@frontend/kitui";
|
import { CartData, Discount, PrivilegeCartData, Tariff, TariffCartData, applyCartDiscount, applyLoyaltyDiscount, applyPrivilegeDiscounts, applyServiceDiscounts } from "@frontend/kitui";
|
||||||
|
|
||||||
|
|
||||||
export function calcCart(tariffs: Tariff[], discounts: Discount[], purchasesAmount: number): CartData {
|
export function calcCart(tariffs: Tariff[], discounts: Discount[], purchasesAmount: number, isUserNko?: boolean): CartData {
|
||||||
const cartData: CartData = {
|
const cartData: CartData = {
|
||||||
services: [],
|
services: [],
|
||||||
priceBeforeDiscounts: 0,
|
priceBeforeDiscounts: 0,
|
||||||
@ -55,12 +55,34 @@ export function calcCart(tariffs: Tariff[], discounts: Discount[], purchasesAmou
|
|||||||
serviceData.price += tariffCartData.price;
|
serviceData.price += tariffCartData.price;
|
||||||
});
|
});
|
||||||
|
|
||||||
applyPrivilegeDiscounts(cartData, discounts);
|
const nkoDiscount = findNkoDiscount(discounts);
|
||||||
applyServiceDiscounts(cartData, discounts);
|
if (isUserNko && nkoDiscount) {
|
||||||
applyCartDiscount(cartData, discounts);
|
applyNkoDiscount(cartData, nkoDiscount);
|
||||||
applyLoyaltyDiscount(cartData, discounts, purchasesAmount);
|
} else {
|
||||||
|
applyPrivilegeDiscounts(cartData, discounts);
|
||||||
|
applyServiceDiscounts(cartData, discounts);
|
||||||
|
applyCartDiscount(cartData, discounts);
|
||||||
|
applyLoyaltyDiscount(cartData, discounts, purchasesAmount);
|
||||||
|
}
|
||||||
|
|
||||||
cartData.allAppliedDiscounts = Array.from(new Set(cartData.allAppliedDiscounts));
|
cartData.allAppliedDiscounts = Array.from(new Set(cartData.allAppliedDiscounts));
|
||||||
|
|
||||||
return cartData;
|
return cartData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function applyNkoDiscount(cartData: CartData, discount: Discount) {
|
||||||
|
cartData.priceAfterDiscounts *= discount.Target.Factor;
|
||||||
|
cartData.allAppliedDiscounts.push(discount);
|
||||||
|
}
|
||||||
|
|
||||||
|
function findNkoDiscount(discounts: Discount[]): Discount | null {
|
||||||
|
const applicableDiscounts = discounts.filter(discount => discount.Condition.UserType === "nko");
|
||||||
|
|
||||||
|
if (!applicableDiscounts.length) return null;
|
||||||
|
|
||||||
|
const maxValueDiscount = applicableDiscounts.reduce((prev, current) => {
|
||||||
|
return current.Condition.CartPurchasesAmount > prev.Condition.CartPurchasesAmount ? current : prev;
|
||||||
|
});
|
||||||
|
|
||||||
|
return maxValueDiscount;
|
||||||
|
}
|
||||||
|
@ -5,7 +5,8 @@ export function calcIndividualTariffPrices(
|
|||||||
tariff: Tariff,
|
tariff: Tariff,
|
||||||
discounts: Discount[],
|
discounts: Discount[],
|
||||||
purchasesAmount: number,
|
purchasesAmount: number,
|
||||||
currentTariffs: Tariff[]
|
currentTariffs: Tariff[],
|
||||||
|
isUserNko?: boolean,
|
||||||
): {
|
): {
|
||||||
priceBeforeDiscounts: number;
|
priceBeforeDiscounts: number;
|
||||||
priceAfterDiscounts: number;
|
priceAfterDiscounts: number;
|
||||||
@ -14,7 +15,7 @@ export function calcIndividualTariffPrices(
|
|||||||
tariff.price || tariff.privileges.reduce((sum, privilege) => sum + privilege.amount * privilege.price, 0);
|
tariff.price || tariff.privileges.reduce((sum, privilege) => sum + privilege.amount * privilege.price, 0);
|
||||||
let priceAfterDiscounts = priceBeforeDiscounts;
|
let priceAfterDiscounts = priceBeforeDiscounts;
|
||||||
|
|
||||||
const cart = calcCart([...currentTariffs, tariff], discounts, purchasesAmount);
|
const cart = calcCart([...currentTariffs, tariff], discounts, purchasesAmount, isUserNko);
|
||||||
|
|
||||||
cart.allAppliedDiscounts.forEach((discount) => {
|
cart.allAppliedDiscounts.forEach((discount) => {
|
||||||
priceAfterDiscounts *= findDiscountFactor(discount);
|
priceAfterDiscounts *= findDiscountFactor(discount);
|
||||||
|
@ -1,82 +1,83 @@
|
|||||||
import { Tariff, devlog } from "@frontend/kitui";
|
import { Tariff, devlog } from "@frontend/kitui";
|
||||||
import { getTariffById } from "@root/api/tariff";
|
import { getTariffById } from "@root/api/tariff";
|
||||||
|
import {
|
||||||
|
addCartTariffs,
|
||||||
|
removeMissingCartTariffs,
|
||||||
|
setCartTariffStatus,
|
||||||
|
useCartStore,
|
||||||
|
} from "@root/stores/cart";
|
||||||
|
import { useDiscountStore } from "@root/stores/discounts";
|
||||||
import { useTariffStore } from "@root/stores/tariffs";
|
import { useTariffStore } from "@root/stores/tariffs";
|
||||||
import { removeTariffFromCart, useUserStore } from "@root/stores/user";
|
import { removeTariffFromCart, useUserStore } from "@root/stores/user";
|
||||||
import { useEffect } from "react";
|
import { useEffect } from "react";
|
||||||
import {
|
|
||||||
addCartTariffs,
|
|
||||||
removeMissingCartTariffs,
|
|
||||||
setCartTariffStatus,
|
|
||||||
useCartStore,
|
|
||||||
} from "@root/stores/cart";
|
|
||||||
import { isAxiosError } from "axios";
|
|
||||||
import { useDiscountStore } from "@root/stores/discounts";
|
|
||||||
|
|
||||||
export function useCart() {
|
export function useCart() {
|
||||||
const tariffs = useTariffStore((state) => state.tariffs);
|
const tariffs = useTariffStore((state) => state.tariffs);
|
||||||
const cartTariffMap = useCartStore((state) => state.cartTariffMap);
|
const cartTariffMap = useCartStore((state) => state.cartTariffMap);
|
||||||
const cartTariffIds = useUserStore((state) => state.userAccount?.cart);
|
const cartTariffIds = useUserStore((state) => state.userAccount?.cart);
|
||||||
const cart = useCartStore((state) => state.cart);
|
const cart = useCartStore((state) => state.cart);
|
||||||
const discounts = useDiscountStore((state) => state.discounts);
|
const discounts = useDiscountStore((state) => state.discounts);
|
||||||
const purchasesAmount =
|
const purchasesAmount =
|
||||||
useUserStore((state) => state.userAccount?.wallet.purchasesAmount) ?? 0;
|
useUserStore((state) => state.userAccount?.wallet.purchasesAmount) ?? 0;
|
||||||
|
const isUserNko = useUserStore(state => state.userAccount?.status) === "nko";
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
function addTariffsToCart() {
|
function addTariffsToCart() {
|
||||||
const knownTariffs: Tariff[] = [];
|
const knownTariffs: Tariff[] = [];
|
||||||
|
|
||||||
console.log(cartTariffIds)
|
console.log(cartTariffIds)
|
||||||
cartTariffIds?.forEach(async (tariffId) => {
|
cartTariffIds?.forEach(async (tariffId) => {
|
||||||
if (typeof cartTariffMap[tariffId] === "object") return;
|
if (typeof cartTariffMap[tariffId] === "object") return;
|
||||||
|
|
||||||
const tariff = tariffs.find((tariff) => tariff._id === tariffId);
|
const tariff = tariffs.find((tariff) => tariff._id === tariffId);
|
||||||
if (tariff) return knownTariffs.push(tariff);
|
if (tariff) return knownTariffs.push(tariff);
|
||||||
|
|
||||||
if (!cartTariffMap[tariffId]) {
|
if (!cartTariffMap[tariffId]) {
|
||||||
setCartTariffStatus(tariffId, "loading");
|
setCartTariffStatus(tariffId, "loading");
|
||||||
|
|
||||||
const [tariffByIdResponse, tariffByIdError, tariffByIdStatus] =
|
const [tariffByIdResponse, tariffByIdError, tariffByIdStatus] =
|
||||||
await getTariffById(tariffId);
|
await getTariffById(tariffId);
|
||||||
|
|
||||||
if (tariffByIdError) {
|
if (tariffByIdError) {
|
||||||
devlog(tariffByIdError);
|
devlog(tariffByIdError);
|
||||||
setCartTariffStatus(tariffId, "not found");
|
setCartTariffStatus(tariffId, "not found");
|
||||||
|
|
||||||
if (tariffByIdStatus === 404) {
|
if (tariffByIdStatus === 404) {
|
||||||
try {
|
try {
|
||||||
await removeTariffFromCart(tariffId);
|
await removeTariffFromCart(tariffId);
|
||||||
|
|
||||||
devlog(
|
devlog(
|
||||||
`Unexistant tariff with id ${tariffId} deleted from cart`
|
`Unexistant tariff with id ${tariffId} deleted from cart`
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
devlog("Error deleting unexistant tariff from cart", error);
|
devlog("Error deleting unexistant tariff from cart", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tariffByIdResponse) {
|
if (tariffByIdResponse) {
|
||||||
addCartTariffs([tariffByIdResponse], discounts, purchasesAmount);
|
addCartTariffs([tariffByIdResponse], discounts, purchasesAmount, isUserNko);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (knownTariffs.length > 0)
|
||||||
|
addCartTariffs(knownTariffs, discounts, purchasesAmount, isUserNko);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
if (knownTariffs.length > 0)
|
addTariffsToCart();
|
||||||
addCartTariffs(knownTariffs, discounts, purchasesAmount);
|
}, [cartTariffIds, cartTariffMap, discounts, isUserNko, purchasesAmount, tariffs]);
|
||||||
}
|
|
||||||
|
|
||||||
addTariffsToCart();
|
useEffect(
|
||||||
}, [cartTariffIds, cartTariffMap, discounts, purchasesAmount, tariffs]);
|
function cleanUpCart() {
|
||||||
|
if (cartTariffIds)
|
||||||
|
removeMissingCartTariffs(cartTariffIds, discounts, purchasesAmount, isUserNko);
|
||||||
|
},
|
||||||
|
[cartTariffIds, discounts, isUserNko, purchasesAmount]
|
||||||
|
);
|
||||||
|
|
||||||
useEffect(
|
return cart;
|
||||||
function cleanUpCart() {
|
|
||||||
if (cartTariffIds)
|
|
||||||
removeMissingCartTariffs(cartTariffIds, discounts, purchasesAmount);
|
|
||||||
},
|
|
||||||
[cartTariffIds, discounts, purchasesAmount]
|
|
||||||
);
|
|
||||||
|
|
||||||
return cart;
|
|
||||||
}
|
}
|
||||||
|
@ -1532,10 +1532,10 @@
|
|||||||
minimatch "^3.1.2"
|
minimatch "^3.1.2"
|
||||||
strip-json-comments "^3.1.1"
|
strip-json-comments "^3.1.1"
|
||||||
|
|
||||||
"@frontend/kitui@1.0.52":
|
"@frontend/kitui@1.0.53":
|
||||||
version "1.0.52"
|
version "1.0.53"
|
||||||
resolved "https://penahub.gitlab.yandexcloud.net/api/v4/projects/21/packages/npm/@frontend/kitui/-/@frontend/kitui-1.0.52.tgz#3b1c28f889da80ab325ab2b511108632fa925f1c"
|
resolved "https://penahub.gitlab.yandexcloud.net/api/v4/projects/21/packages/npm/@frontend/kitui/-/@frontend/kitui-1.0.53.tgz#a663052d300b9e3c588346c646f276c9aec7de5d"
|
||||||
integrity sha1-Oxwo+InagKsyWrK1ERCGMvqSXxw=
|
integrity sha1-pmMFLTALnjxYg0bGRvJ2ya7H3l0=
|
||||||
dependencies:
|
dependencies:
|
||||||
immer "^10.0.2"
|
immer "^10.0.2"
|
||||||
reconnecting-eventsource "^1.6.2"
|
reconnecting-eventsource "^1.6.2"
|
||||||
|
Loading…
Reference in New Issue
Block a user