/* eslint-disable react/jsx-no-constructed-context-values */ import type { Dispatch, ReactNode, SetStateAction } from "react"; import { createContext, useContext, useState } from "react"; import type { ProviderProps } from "@/@types/types/provider-props.types"; type DiscountType = { type: "CouponCode" | "CreditCard"; price: number; title: string; currency: string; code: string; extras?: { type: "Loyalty"; productCode: string; value: number; }[]; }; type CampaignType = { type: "CreditCard"; price: number; title: string; currency: string; code: string; }; type MilesValue = { type: "Miles"; value: number; }; type CoreSummaryContextStateType = { discounts: DiscountType[]; campaigns: CampaignType[]; miles?: MilesValue; }; type CoreSummaryContextType = { state: CoreSummaryContextStateType; setState: Dispatch>; }; const CoreSummaryContext = createContext( {} as CoreSummaryContextType, ); export const CoreSummaryCtxProvider = (props: { children: | ProviderProps["children"] | ((data: CoreSummaryContextStateType) => ReactNode); }) => { const [state, setState] = useState({ discounts: [], campaigns: [], miles: undefined, } as CoreSummaryContextStateType); return ( {typeof props.children === "function" ? props.children(state) : props.children} ); }; export const useCoreSummaryCtx = () => { const { state, setState } = useContext(CoreSummaryContext); function addDiscount(discount: DiscountType) { setState?.((prevState) => ({ ...prevState, discounts: [...prevState.discounts, discount], })); } function removeDiscount(discountCode: DiscountType["code"]) { setState?.((prevState) => ({ ...prevState, discounts: prevState.discounts.filter((d) => d.code !== discountCode), })); } function addCampaign(campaign: CampaignType) { setState((prevState) => ({ ...prevState, campaigns: [...prevState.campaigns, campaign], })); } function clearCreditCardCampaigns() { setState?.((prevState) => ({ ...prevState, campaigns: prevState.campaigns.filter((c) => c.type !== "CreditCard"), })); } function clearCreditCardDiscounts() { setState?.((prevState) => ({ ...prevState, discounts: prevState.discounts.filter((d) => d.type !== "CreditCard"), })); } return { state: { discounts: state?.discounts || [], campaigns: state?.campaigns || [], hasCouponCode: Boolean( state?.discounts.find((d) => d.type === "CouponCode"), ), hasCreditCardCampaign: Boolean( state?.campaigns.find((c) => c.type === "CreditCard"), ), hasCreditCardDiscount: Boolean( state?.discounts.find((d) => d.type === "CreditCard"), ), }, actions: { addDiscount, removeDiscount, addCampaign, clearCreditCardCampaigns, clearCreditCardDiscounts, }, }; };