Merge branch 'dev' into 'main'

Dev

See merge request frontend/marketplace!61
This commit is contained in:
Nastya 2023-10-15 18:01:56 +00:00
commit e20247cacb
7 changed files with 103 additions and 77 deletions

@ -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;
}); });
const nkoDiscount = findNkoDiscount(discounts);
if (isUserNko && nkoDiscount) {
applyNkoDiscount(cartData, nkoDiscount);
} else {
applyPrivilegeDiscounts(cartData, discounts); applyPrivilegeDiscounts(cartData, discounts);
applyServiceDiscounts(cartData, discounts); applyServiceDiscounts(cartData, discounts);
applyCartDiscount(cartData, discounts); applyCartDiscount(cartData, discounts);
applyLoyaltyDiscount(cartData, discounts, purchasesAmount); 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,16 +1,16 @@
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 { useTariffStore } from "@root/stores/tariffs";
import { removeTariffFromCart, useUserStore } from "@root/stores/user";
import { useEffect } from "react";
import { import {
addCartTariffs, addCartTariffs,
removeMissingCartTariffs, removeMissingCartTariffs,
setCartTariffStatus, setCartTariffStatus,
useCartStore, useCartStore,
} from "@root/stores/cart"; } from "@root/stores/cart";
import { isAxiosError } from "axios";
import { useDiscountStore } from "@root/stores/discounts"; import { useDiscountStore } from "@root/stores/discounts";
import { useTariffStore } from "@root/stores/tariffs";
import { removeTariffFromCart, useUserStore } from "@root/stores/user";
import { useEffect } from "react";
export function useCart() { export function useCart() {
const tariffs = useTariffStore((state) => state.tariffs); const tariffs = useTariffStore((state) => state.tariffs);
@ -20,6 +20,7 @@ export function useCart() {
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() {
@ -58,24 +59,24 @@ export function useCart() {
} }
if (tariffByIdResponse) { if (tariffByIdResponse) {
addCartTariffs([tariffByIdResponse], discounts, purchasesAmount); addCartTariffs([tariffByIdResponse], discounts, purchasesAmount, isUserNko);
} }
} }
}); });
if (knownTariffs.length > 0) if (knownTariffs.length > 0)
addCartTariffs(knownTariffs, discounts, purchasesAmount); addCartTariffs(knownTariffs, discounts, purchasesAmount, isUserNko);
} }
addTariffsToCart(); addTariffsToCart();
}, [cartTariffIds, cartTariffMap, discounts, purchasesAmount, tariffs]); }, [cartTariffIds, cartTariffMap, discounts, isUserNko, purchasesAmount, tariffs]);
useEffect( useEffect(
function cleanUpCart() { function cleanUpCart() {
if (cartTariffIds) if (cartTariffIds)
removeMissingCartTariffs(cartTariffIds, discounts, purchasesAmount); removeMissingCartTariffs(cartTariffIds, discounts, purchasesAmount, isUserNko);
}, },
[cartTariffIds, discounts, purchasesAmount] [cartTariffIds, discounts, isUserNko, purchasesAmount]
); );
return cart; 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"