@agrada_digital/pbm 0.0.49 → 0.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +7 -42
- package/dist/index.d.ts +7 -42
- package/dist/index.js +101 -103
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +86 -88
- package/dist/index.mjs.map +1 -1
- package/dist-wc/pbm-wc.js +81 -81
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/Header/index.tsx","../src/components/UI/Container/index.tsx","../src/components/Footer/index.tsx","../src/schema/validation-schema.ts","../src/utils/format.ts","../src/components/Form/index.tsx","../src/libs/zustand/usePBM.tsx","../src/components/UI/Loading/index.tsx","../src/components/UI/Button/index.tsx","../src/components/BenefitsTable/index.tsx","../src/mocks/benefits.ts","../src/components/UI/Title/index.tsx","../src/components/BenefitsTable/Item.tsx","../src/components/UI/Text/index.tsx","../src/components/Iframe/index.tsx","../src/components/SecurityNumberInvalid/index.tsx","../src/PBM.tsx","../src/components/UI/Link/index.tsx","../src/utils/getParams.ts","../src/components/SecurityNumberRegitered/index.tsx","../src/services/authorization.ts","../src/services/get-product-by-ean.ts","../src/libs/zustand/useTargetProduct.tsx"],"sourcesContent":["// Estilos\r\nimport './index.css';\r\n\r\n// Componente Principal\r\nexport { default as PBM } from \"./PBM\";\r\n\r\n// Tipos\r\nexport type { PBMProps } from \"./PBM\";\r\nexport type { PBMStore } from \"./libs/zustand/usePBM\";\r\n\r\n// Hooks\r\nexport { usePBMStore } from \"./libs/zustand/usePBM\"; \r\n","function Header({ originalProductPrice }: { originalProductPrice: number }) {\r\n return (\r\n <header\r\n className=\"flex items-center justify-between w-full p-0.5 rounded-full bg-[#44c2c0]/30\"\r\n id=\"header_pbm\"\r\n >\r\n <span\r\n className=\"py-1 px-6 rounded-full bg-[#44c2c0] shrink-0 text-white text-sm font-bold\"\r\n data-testid=\"test_id_header_price\"\r\n id=\"header_price\"\r\n >\r\n {Number(originalProductPrice)?.toLocaleString(\"pt-BR\", {\r\n currency: \"BRL\",\r\n currencyDisplay: \"symbol\",\r\n currencySign: \"standard\",\r\n style: \"currency\",\r\n })}\r\n </span>\r\n <h1 id=\"header_title\" className=\"text-center w-full text-[#339c9b] font-bold text-xs px-4 md:text-sm\">\r\n Benefício de Laboratório\r\n </h1>\r\n </header>\r\n );\r\n}\r\n\r\nexport default Header;\r\n","import classNames from \"classnames\";\r\nimport React from \"react\";\r\n\r\nfunction Container({\r\n children,\r\n variant,\r\n}: {\r\n children: React.ReactNode;\r\n variant: \"simple\" | \"main\";\r\n}) {\r\n return (\r\n <main\r\n className={classNames({\r\n \"flex flex-col items-center justify-center min-w-[var(--min-container)] max-w-[var(--max-container)] w-full h-auto rounded-2xl p-4 bg-gray-100 gap-4\":\r\n variant === \"main\",\r\n \"w-full h-auto relative\": variant === \"simple\",\r\n })}\r\n data-testid=\"test_id_container\"\r\n data-variant={variant}\r\n id=\"container_pbm\"\r\n >\r\n {children}\r\n </main>\r\n );\r\n}\r\n\r\nexport default Container;\r\n","function Footer({ industryLogo }: { industryLogo?: string }) {\r\n return (\r\n <footer className=\"w-full h-auto relative\" id=\"footer_pbm\">\r\n <section className=\"flex items-center justify-center w-full h-auto gap-4\">\r\n <section className=\"w-4/5 h-auto\">\r\n <h3 className=\"text-start font-semibold text-sm\">\r\n Economize com o benefício do laboratório.\r\n </h3>\r\n <p className=\"text-start font-normal text-sm\">\r\n Este produto tem preço exclusivo para clientes cadastrados no\r\n programa.\r\n </p>\r\n </section>\r\n {industryLogo && (\r\n <img\r\n src={industryLogo}\r\n alt=\"parceiro\"\r\n className=\"w-1/5 min-w-20 h-auto aspect-square\"\r\n loading=\"eager\"\r\n id=\"footer_industry_logo_pbm\"\r\n data-testid=\"footer_industry_logo_pbm\"\r\n />\r\n )}\r\n </section>\r\n </footer>\r\n );\r\n}\r\n\r\nexport default Footer;\r\n","import { z } from \"zod\";\r\n\r\nexport const validationSchema = z.strictObject({\r\n securityNumber: z\r\n .string({\r\n required_error: 'CPF é obrigatório.',\r\n })\r\n .refine((doc) => {\r\n const replacedDoc = doc.replace(/\\D/g, '');\r\n return replacedDoc.length >= 11;\r\n }, 'CPF deve conter no mínimo 11 caracteres.')\r\n .refine((doc) => {\r\n const replacedDoc = doc.replace(/\\D/g, '');\r\n return !!Number(replacedDoc);\r\n }, 'CPF deve conter apenas números.'),\r\n});\r\n\r\nexport type validationSchemaType = z.infer<typeof validationSchema>","export const toFormat = (value: string) => {\r\n const cleanedValue = value.replace(/\\D/g, '');\r\n\r\n if (cleanedValue.length <= 11) {\r\n return cleanedValue\r\n .replace(/(\\d{3})(\\d)/, '$1.$2')\r\n .replace(/(\\d{3})(\\d)/, '$1.$2')\r\n .replace(/(\\d{3})(\\d{1,2})/, '$1-$2')\r\n .replace(/(-\\d{2})\\d+?$/, '$1');\r\n }\r\n};","import {\r\n validationSchema,\r\n validationSchemaType,\r\n} from \"../../schema/validation-schema\";\r\nimport { toFormat } from \"../../utils/format\";\r\n\r\nimport classNames from \"classnames\";\r\nimport { zodResolver } from \"@hookform/resolvers/zod\";\r\nimport { useForm } from \"react-hook-form\";\r\n\r\nimport { ArrowRight } from \"lucide-react\";\r\nimport { Dispatch, SetStateAction } from \"react\";\r\nimport { ISecurityNumber } from \"../../types/globals\";\r\n\r\nimport { usePBMStore } from \"../../libs/zustand/usePBM\";\r\n\r\ninterface IForm {\r\n setLoading: Dispatch<SetStateAction<boolean>>;\r\n}\r\n\r\nfunction Form({ setLoading }: IForm) {\r\n const { setSecurityNumber, setState, securityNumber } = usePBMStore();\r\n\r\n const {\r\n handleSubmit,\r\n register,\r\n setValue,\r\n formState: { errors },\r\n } = useForm<validationSchemaType>({\r\n resolver: zodResolver(validationSchema),\r\n defaultValues: {\r\n securityNumber: securityNumber || \"\",\r\n },\r\n });\r\n\r\n const onSubmitDefault = (values: validationSchemaType) => {\r\n setLoading(true);\r\n\r\n new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve({\r\n securityNumber: values.securityNumber,\r\n state: \"isActivated\",\r\n });\r\n }, 2000);\r\n })\r\n .then((result) => {\r\n const response = result as ISecurityNumber;\r\n\r\n setSecurityNumber(response.securityNumber);\r\n setState(response.state);\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={handleSubmit(onSubmitDefault)}\r\n className={classNames(\r\n \"w-full h-auto flex items-center justify-center mb-0 transition-all duration-150\",\r\n { \"mb-4\": errors.securityNumber }\r\n )}\r\n id=\"form_security_number_pbm\"\r\n >\r\n <label\r\n htmlFor=\"cpf\"\r\n className=\"w-4/5 h-auto flex items-start flex-col justify-center relative py-2\"\r\n id=\"label_security_number_pbm\"\r\n >\r\n <input\r\n type=\"text\"\r\n className={classNames(\r\n \"w-full h-8 bg-[#44c2c0]/20 rounded-s-full text-sm font-semibold focus:outline focus:outline-[#339c9b] focus:bg-[#44c2c0]/30 text-zinc-600 placeholder:text-zinc-600 px-4 placeholder:text-sm placeholder:font-semibold\",\r\n { \"outline outline-red-600\": errors.securityNumber }\r\n )}\r\n placeholder=\"Digite seu CPF aqui...\"\r\n required\r\n maxLength={14}\r\n {...register(\"securityNumber\", {\r\n onChange: (e) => {\r\n const formatted = toFormat(e.target.value);\r\n setValue(\"securityNumber\", formatted as string, {\r\n shouldValidate: true,\r\n });\r\n },\r\n })}\r\n defaultValue={securityNumber || \"\"}\r\n id=\"input_security_number_pbm\"\r\n />\r\n {errors.securityNumber && (\r\n <span className=\"text-red-400 text-xs font-semibold absolute -bottom-3 left-2 text-nowrap\" id=\"security_number_form_error\">\r\n {errors.securityNumber.message}\r\n </span>\r\n )}\r\n </label>\r\n <button\r\n type=\"submit\"\r\n className=\"bg-gray-400 w-1/5 h-8 flex items-center justify-center rounded-e-full cursor-pointer\"\r\n id=\"button_submit_security_number_pbm\"\r\n >\r\n <ArrowRight size={24} color=\"white\" strokeWidth={2} />\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\nexport default Form;\r\n","import { create, createStore, StateCreator, StoreApi } from \"zustand\";\r\nimport { usePBMTypes } from \"../../types/globals\";\r\n\r\nexport interface PBMStore extends usePBMTypes {\r\n setSecurityNumber: (securityNumber: string) => void;\r\n setState: (state: usePBMTypes[\"state\"]) => void;\r\n setAvailableDiscountSelected: (\r\n availableDiscount: usePBMTypes[\"availableDiscountSelected\"]\r\n ) => void;\r\n setTargetProduct: (targetProduct: usePBMTypes[\"targetProduct\"]) => void;\r\n}\r\n\r\nconst initialPBMState: usePBMTypes = {\r\n securityNumber: \"\",\r\n state: \"isEmpty\",\r\n availableDiscountSelected: {\r\n quantity: 0,\r\n discount: {\r\n unit: 0,\r\n total: 0,\r\n },\r\n totalPrice: 0,\r\n },\r\n targetProduct: null,\r\n campaign: \"pbm_campaign\",\r\n};\r\n\r\n// ✅ TIPANDO a função corretamente com StateCreator\r\nconst createPBMStore: StateCreator<PBMStore> = (set) => ({\r\n ...initialPBMState,\r\n\r\n setSecurityNumber: (securityNumber: string) => set({ securityNumber }),\r\n setState: (state: usePBMTypes[\"state\"]) => set({ state }),\r\n setTargetProduct: (targetProduct: usePBMTypes[\"targetProduct\"]) =>\r\n set({ targetProduct }),\r\n setAvailableDiscountSelected: (\r\n availableDiscount: usePBMTypes[\"availableDiscountSelected\"]\r\n ) => set({ availableDiscountSelected: availableDiscount }),\r\n});\r\n\r\n// React hook (usado dentro de componentes React)\r\nexport const usePBMStore = create<PBMStore>(createPBMStore);\r\n\r\n// Store para uso em Vanilla JS\r\nexport const pbmStore: StoreApi<PBMStore> =\r\n createStore<PBMStore>(createPBMStore);\r\n","interface LoadingProps {\r\n textColor?: string;\r\n}\r\n\r\nfunction Loading({ textColor }: LoadingProps) {\r\n return (\r\n <main className=\"flex items-center justify-center gap-4\" id=\"loading_pbm\">\r\n <div\r\n data-testid=\"test_id_spin\"\r\n className=\"w-8 h-8 border-4 border-t-gray-700 border-gray-300 rounded-full animate-spin\"\r\n id=\"loading_spin\"\r\n ></div>\r\n <p\r\n className={\"text-sm font-semibold text-start text-zinc-900\"}\r\n style={{ color: textColor }}\r\n id=\"loading_label\"\r\n >\r\n Um momento... estamos verificando seus dados.\r\n </p>\r\n </main>\r\n );\r\n}\r\n\r\nexport default Loading;\r\n","import classNames from \"classnames\";\r\nimport React, { ButtonHTMLAttributes } from \"react\";\r\n\r\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction Button(props: ButtonProps) {\r\n return (\r\n <button\r\n {...props}\r\n className={classNames(\r\n \"w-3xs cursor-pointer h-10 rounded-full bg-blue-500 hover:bg-blue-400 text-white text-sm font-semibold transition-colors\",\r\n props.className\r\n )}\r\n >\r\n {props.children}\r\n </button>\r\n );\r\n}\r\n\r\nexport default Button;\r\n","import { useState } from \"react\";\r\n\r\nimport { BENEFITS_ITEMS } from \"../../mocks/benefits\";\r\n\r\nimport Title from \"../UI/Title\";\r\nimport Item from \"./Item\";\r\nimport { usePBMStore } from \"../../libs/zustand/usePBM\";\r\nimport Button from \"../UI/Button\";\r\n\r\nfunction BenefitsTable({\r\n originalProductPrice,\r\n}: {\r\n originalProductPrice: number;\r\n}) {\r\n const { securityNumber, setState } = usePBMStore();\r\n const [selectedDiscout, setSelectedDiscount] = useState<string | null>(null);\r\n\r\n return (\r\n <section\r\n className=\"flex items-start justify-center gap-4 w-full h-auto flex-col\"\r\n id=\"benefits_table_pbm\"\r\n >\r\n <Title>Descontos disponíveis:</Title>\r\n\r\n <form\r\n className=\"flex flex-col items-center justify-start w-full gap-3\"\r\n id=\"form_benefits_table_pbm\"\r\n >\r\n {BENEFITS_ITEMS.map((item, index) => {\r\n const ID_INPUT = \"unity_quantity_\" + item.authorizedQuantity;\r\n\r\n return (\r\n <Item\r\n key={index}\r\n data={item}\r\n checked={selectedDiscout === ID_INPUT}\r\n onChange={() => setSelectedDiscount(ID_INPUT)}\r\n originalProductPrice={originalProductPrice}\r\n />\r\n );\r\n })}\r\n </form>\r\n\r\n {!securityNumber && (\r\n <Button\r\n onClick={() => setState(\"isEmpty\")}\r\n className=\"bg-transparent p-0 pl-2 w-auto h-auto text-zinc-600 cursor-pointer hover:text-zinc-900 hover:bg-transparent text-start\"\r\n id=\"unauthorized_benefits_button\"\r\n >\r\n Atenção: não é possível utilizar os benefícos sem realizar a consulta\r\n do cpf, por favor{\" \"}\r\n <span className=\"underline\">\r\n insira seu cpf para utilizar os benefícios\r\n </span>\r\n </Button>\r\n )}\r\n\r\n {securityNumber && (\r\n <Button\r\n onClick={() => setState(\"isEmpty\")}\r\n className=\"bg-transparent p-0 pl-2 w-auto h-auto text-zinc-600 cursor-pointer hover:text-zinc-900 hover:bg-transparent text-start\"\r\n id=\"change_security_number\"\r\n >\r\n <span className=\"underline\">Deseja editar o cpf digitado?</span>\r\n </Button>\r\n )}\r\n </section>\r\n );\r\n}\r\n\r\nexport default BenefitsTable;\r\n","export interface IBenefitsItem {\r\n id: number;\r\n ean: string;\r\n authorizedQuantity: number;\r\n discountValue: number;\r\n discountPercentual: number;\r\n}\r\n\r\nexport const BENEFITS_ITEMS: IBenefitsItem[] = [\r\n {\r\n id: 1,\r\n ean: \"001\",\r\n authorizedQuantity: 1,\r\n discountValue: 4800,\r\n discountPercentual: 2400\r\n },\r\n {\r\n id: 2,\r\n ean: \"002\",\r\n authorizedQuantity: 2,\r\n discountValue: 4800,\r\n discountPercentual: 2400\r\n },\r\n {\r\n id: 3,\r\n ean: \"003\",\r\n authorizedQuantity: 3,\r\n discountValue: 9400,\r\n discountPercentual: 4700\r\n }\r\n\r\n]","import classNames from \"classnames\";\r\nimport React, { HTMLAttributes } from \"react\";\r\n\r\ninterface TitleProps extends HTMLAttributes<HTMLTitleElement> {\r\n children: React.ReactNode;\r\n textColor?: string;\r\n textSize?: string;\r\n}\r\n\r\nfunction Title(props: TitleProps) {\r\n return (\r\n <h2\r\n className={classNames(\r\n \"text-start font-semibold text-sm text-zinc-900\",\r\n props.className\r\n )}\r\n style={{ color: props.textColor, fontSize: props.textSize }}\r\n data-testid=\"test_id_title\"\r\n id=\"title_pbm\"\r\n >\r\n {props.children}\r\n </h2>\r\n );\r\n}\r\n\r\nexport default Title;\r\n","import { IBenefitsItem } from \"../../mocks/benefits\";\r\n\r\nimport { usePBMStore } from \"../../libs/zustand/usePBM\";\r\n\r\nimport { Badge, BadgeCheck } from \"lucide-react\";\r\nimport { useCallback, useEffect } from \"react\";\r\n\r\ninterface ItemProps {\r\n data: IBenefitsItem;\r\n onChange: VoidFunction;\r\n checked: boolean;\r\n originalProductPrice: number;\r\n}\r\n\r\nfunction Item({ data, onChange, checked, originalProductPrice }: ItemProps) {\r\n const { setAvailableDiscountSelected, securityNumber } = usePBMStore();\r\n\r\n const ID_INPUT = \"unity_quantity_\" + data.authorizedQuantity;\r\n\r\n const decimalDiscount = data.discountPercentual / 10000;\r\n\r\n const unitDiscountValue = originalProductPrice * decimalDiscount;\r\n\r\n const discountValue = unitDiscountValue * data.authorizedQuantity;\r\n\r\n const totalPriceProductWithDiscountBenefit =\r\n originalProductPrice * data.authorizedQuantity - discountValue;\r\n\r\n const updateStorageData = useCallback(() => {\r\n if (checked) {\r\n setAvailableDiscountSelected({\r\n discount: {\r\n total: discountValue,\r\n unit: unitDiscountValue,\r\n },\r\n quantity: data.authorizedQuantity,\r\n totalPrice: totalPriceProductWithDiscountBenefit,\r\n });\r\n }\r\n }, [\r\n checked,\r\n data.authorizedQuantity,\r\n setAvailableDiscountSelected,\r\n discountValue,\r\n totalPriceProductWithDiscountBenefit,\r\n unitDiscountValue,\r\n ]);\r\n\r\n useEffect(() => {\r\n updateStorageData();\r\n }, [updateStorageData]);\r\n\r\n return (\r\n <label\r\n htmlFor={ID_INPUT}\r\n className=\"label_benefits w-full flex items-center justify-start bg-zinc-300/60 border border-zinc-400/50 px-4 py-2 hover:bg-zinc-300 transition-colors cursor-pointer rounded-full gap-1\"\r\n id={\"label_benefits_\" + ID_INPUT}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"benefits_discount\"\r\n id={ID_INPUT}\r\n className=\"hidden\"\r\n checked={checked}\r\n onChange={onChange}\r\n disabled={!securityNumber}\r\n />\r\n\r\n {!checked ? (\r\n <Badge color=\"#9f9fa9\" size={20} />\r\n ) : (\r\n <BadgeCheck color=\"#32b316\" size={20} />\r\n )}\r\n\r\n <span className=\"text-zinc-900 font-semibold text-sm\">\r\n {data.authorizedQuantity}un\r\n </span>\r\n\r\n <section className=\"ml-auto relative\">\r\n <span className=\"absolute -top-4 text-emerald-900 py-0.5 font-semibold text-xs bg-[#32b316] px-2 w-auto text-nowrap rounded-2xl -right-4\">\r\n {discountValue.toLocaleString(\"pt-BR\", {\r\n currency: \"BRL\",\r\n currencyDisplay: \"symbol\",\r\n currencySign: \"standard\",\r\n style: \"currency\",\r\n })}{\" \"}\r\n OFF\r\n </span>\r\n <strong className=\"text-zinc-900 font-semibold text-sm text-center\">\r\n {totalPriceProductWithDiscountBenefit.toLocaleString(\"pt-BR\", {\r\n currency: \"BRL\",\r\n currencyDisplay: \"symbol\",\r\n currencySign: \"standard\",\r\n style: \"currency\",\r\n })}\r\n </strong>\r\n </section>\r\n </label>\r\n );\r\n}\r\n\r\nexport default Item;\r\n","import classNames from \"classnames\";\r\nimport React, { HTMLAttributes } from \"react\";\r\n\r\ninterface TextProps extends HTMLAttributes<HTMLParagraphElement> {\r\n children: React.ReactNode;\r\n textColor?: string;\r\n textSize?: string;\r\n}\r\n\r\nfunction Text(props: TextProps) {\r\n return (\r\n <p\r\n className={classNames(\r\n \"text-start font-normal text-sm text-zinc-900\",\r\n props.className\r\n )}\r\n style={{ color: props.textColor, fontSize: props.textSize }}\r\n data-testid=\"test_id_text\"\r\n id=\"text_pbm\"\r\n >\r\n {props.children}\r\n </p>\r\n );\r\n}\r\n\r\nexport default Text;\r\n","import classNames from \"classnames\";\r\nimport { TriangleAlert } from \"lucide-react\";\r\nimport { Dispatch, SetStateAction } from \"react\";\r\n\r\ninterface IFrameProps {\r\n url: string;\r\n title: string;\r\n openModal: boolean;\r\n setOpenModal: Dispatch<SetStateAction<boolean>>;\r\n}\r\n\r\nfunction Iframe({ url, title, openModal, setOpenModal }: IFrameProps) {\r\n return (\r\n <main\r\n className={classNames(\r\n \"fixed inset-0 flex items-center justify-center z-50 flex-col transition-all shadow\",\r\n {\r\n \"opacity-100 pointer-events-auto\": openModal,\r\n \"opacity-0 pointer-events-none\": !openModal,\r\n }\r\n )}\r\n data-testid=\"test_id_iframe\"\r\n id=\"iframe_pbm\"\r\n >\r\n <div\r\n className=\"bg-black/35 inset-0 absolute\"\r\n onClick={() => {\r\n setOpenModal(false);\r\n window.location.reload();\r\n }}\r\n ></div>\r\n <section className=\"w-4/5 h-auto bg-zinc-800 py-2 px-4 flex items-center justify-end rounded-ss-2xl rounded-se-2xl border-b-2 border-gray-100 z-10\">\r\n <button\r\n className=\"shadow-2xl cursor-pointer text-white font-bold bg-red-500 w-auto h-auto px-8 py-2 rounded-full\"\r\n aria-label=\"Fechar o modal\"\r\n data-testid=\"test_id_buttonclose\"\r\n onClick={() => {\r\n setOpenModal(false);\r\n window.location.reload();\r\n }}\r\n >\r\n Fechar\r\n </button>\r\n </section>\r\n <iframe\r\n src={url}\r\n title={title}\r\n width=\"80%\"\r\n height=\"80%\"\r\n allowFullScreen\r\n className=\"z-10\"\r\n ></iframe>\r\n <section className=\"items-center justify-center flex flex-wrap gap-1 bg-zinc-800 z-10 w-4/5 py-2 px-4 rounded-ee-2xl rounded-es-2xl border-t-2 border-gray-100\">\r\n <TriangleAlert size={20} className=\"shrink-0 text-red-500 \" />\r\n\r\n <p className=\"text-start text-sm text-white\">\r\n <span className=\"text-red-500 font-semibold text-base mr-1\">\r\n Atenção:\r\n </span>\r\n Após finalizar os termos de aceite, você já poderá fechar essa janela.\r\n Pode levar <strong>alguns minutos</strong> para os seus dados serem\r\n aprovados.\r\n </p>\r\n </section>\r\n </main>\r\n );\r\n}\r\n\r\nexport default Iframe;\r\n","import Title from \"../UI/Title\";\r\nimport Text from \"../UI/Text\";\r\nimport Button from \"../UI/Button\";\r\nimport Iframe from \"../Iframe\";\r\n\r\nimport { useState } from \"react\";\r\n\r\nfunction SecurityNumberInvalid({ textColor }: { textColor?: string }) {\r\n const [openModal, setOpenModal] = useState<boolean>(false);\r\n return (\r\n <section\r\n data-testid=\"test_id_invalid\"\r\n className=\"flex items-end justify-center gap-2 w-full h-auto flex-col border-y border-zinc-300 py-6\"\r\n id=\"security_number_invalid_container_pbm\"\r\n >\r\n <Title className=\"w-full\" textColor={textColor}>\r\n CPF não cadastrado!\r\n </Title>\r\n <Text className=\"w-full\" textColor={textColor}>\r\n Por favor, conclua seu cadastro para habilitar os benefícios deste\r\n laboratório.\r\n </Text>\r\n <Button\r\n data-testid=\"test_id_openiframe\"\r\n onClick={() => setOpenModal(true)}\r\n id=\"button_accept_terms_pbm\"\r\n >\r\n Aceitar os termos\r\n </Button>\r\n\r\n <Iframe\r\n url=\"https://termo.azurewebsites.net/\"\r\n title=\"Aceitar termos PBM\"\r\n openModal={openModal}\r\n setOpenModal={setOpenModal}\r\n />\r\n </section>\r\n );\r\n}\r\n\r\nexport default SecurityNumberInvalid;\r\n","import Header from \"./components/Header\";\nimport Container from \"./components/UI/Container\";\nimport Footer from \"./components/Footer\";\nimport Form from \"./components/Form\";\nimport Loading from \"./components/UI/Loading\";\nimport Button from \"./components/UI/Button\";\nimport BenefitsTable from \"./components/BenefitsTable\";\nimport SecurityNumberInvalid from \"./components/SecurityNumberInvalid\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport SecurityNumberRegitered from \"./components/SecurityNumberRegitered\";\nimport { GetAuthorization } from \"./services/authorization\";\nimport { ArrowRight } from \"lucide-react\";\nimport { usePBMStore } from \"./libs/zustand/usePBM\";\nimport { GetProductByEAN } from \"./services/get-product-by-ean\";\nimport { useTargetProducts } from \"./libs/zustand/useTargetProduct\";\n\nexport interface PBMProps {\n originalProductPrice: number;\n industryLogo: string;\n clientID: string;\n eanProduct: string;\n}\n\nfunction PBM({\n originalProductPrice,\n industryLogo,\n clientID,\n eanProduct,\n}: PBMProps) {\n const [loading, setLoading] = useState<boolean>(false);\n\n const { setState, state, setTargetProduct } = usePBMStore();\n const { setTargetProductInternal } = useTargetProducts();\n\n const handleGetProductByEAN = useCallback(async () => {\n try {\n const response = await GetProductByEAN({ PRODUCT_EAN: eanProduct });\n\n if (response.success) {\n // Pega a posição zero, pois a API sempre retorna um array, mesmo contendo somente um item.\n const productByEan = response.data.message.products[0];\n setTargetProduct(productByEan);\n setTargetProductInternal(productByEan);\n }\n } catch (error) {\n console.error(error);\n }\n }, [eanProduct, setTargetProduct, setTargetProductInternal]);\n\n const handleAuthorizationRequest = useCallback(async () => {\n try {\n const response = await GetAuthorization({ clientID: clientID });\n\n if (response.success && eanProduct) {\n handleGetProductByEAN();\n } else {\n console.error(\"Authorization failed:\", response.message);\n }\n } catch (error) {\n console.error(\"Error fetching authorization:\", error);\n }\n }, [clientID, handleGetProductByEAN, eanProduct]);\n\n useEffect(() => {\n handleAuthorizationRequest();\n }, [handleAuthorizationRequest]);\n\n return (\n <Container variant=\"main\">\n <Header originalProductPrice={originalProductPrice || 0} />\n\n <Container variant=\"simple\">\n {state === \"isEmpty\" && !loading && (\n <>\n <Form setLoading={setLoading} />\n <Button\n className=\"bg-transparent p-0 pl-2 w-auto h-auto text-zinc-600 underline cursor-pointer hover:text-zinc-900 hover:bg-transparent flex items-center justify-start gap-1\"\n onClick={() => setState(\"isActivated\")}\n id=\"check_benefits_button\"\n >\n <span>Consultar benefícios</span>\n <ArrowRight size={16} />\n </Button>\n </>\n )}\n\n {state === \"isEmpty\" && loading && <Loading />}\n\n {state === \"isInvalid\" && !loading && <SecurityNumberInvalid />}\n\n {state === \"isRegistered\" && !loading && <SecurityNumberRegitered />}\n\n {state === \"isActivated\" && !loading && (\n <BenefitsTable originalProductPrice={originalProductPrice} />\n )}\n </Container>\n\n <Footer industryLogo={industryLogo} />\n </Container>\n );\n}\n\nexport default PBM;\n","import { ILinkHref } from \"../../../types/globals\";\r\nimport classNames from \"classnames\";\r\nimport React from \"react\";\r\nimport { getParams } from \"../../../utils/getParams\";\r\n\r\ninterface LinkProps {\r\n className?: string;\r\n children: React.ReactNode;\r\n href: ILinkHref | string;\r\n}\r\n\r\nfunction Link(props: LinkProps) {\r\n return (\r\n <a\r\n {...props}\r\n target=\"_blank\"\r\n href={\r\n typeof props.href === \"string\"\r\n ? props.href\r\n : props.href.pathname + getParams(props.href.param)\r\n }\r\n className={classNames(\r\n \"w-3xs cursor-pointer h-10 rounded-full bg-blue-500 hover:bg-blue-400 text-white text-sm font-semibold transition-colors flex items-center justify-center\",\r\n props.className\r\n )}\r\n data-testid=\"test_id_link\"\r\n id=\"link_pbm\"\r\n >\r\n {props.children}\r\n </a>\r\n );\r\n}\r\n\r\nexport default Link;\r\n","export const getParams = (\r\n params: { [key: string]: string | number } | undefined\r\n) => {\r\n if (params === undefined) return \"\";\r\n\r\n return (\r\n \"?\" +\r\n Object.keys(params)\r\n .map((paramter) => paramter + \"=\" + params[paramter])\r\n .join(\"&\")\r\n );\r\n};","import Title from \"../UI/Title\";\r\nimport Text from \"../UI/Text\";\r\nimport Link from \"../UI/Link\";\r\n\r\nfunction SecurityNumberRegitered({ textColor }: { textColor?: string }) {\r\n return (\r\n <section\r\n data-testid=\"test_id_registered\"\r\n className=\"flex items-end justify-center gap-2 w-full h-auto flex-col border-y border-zinc-300 py-6\"\r\n id=\"security_number_registered_container_pbm\"\r\n >\r\n <Title className=\"w-full\" textColor={textColor}>\r\n CPF não habilitado no produto!\r\n </Title>\r\n <Text className=\"w-full\" textColor={textColor}>\r\n Por favor, conclua seu cadastro para habilitar os benefícios deste\r\n laboratório.\r\n </Text>\r\n <Link\r\n href={{\r\n pathname: \"https://gip-pd-app.interplayers.com.br/idp-pd-app/adesao\",\r\n param: { guid: \"f2aff249-51b4-49a4-b671-d6bee89da0f0\" },\r\n }}\r\n >\r\n Ativar CPF\r\n </Link>\r\n </section>\r\n );\r\n}\r\n\r\nexport default SecurityNumberRegitered;\r\n","import Cookies from \"js-cookie\";\r\nimport { IRequestDefault } from \"../types/requests\";\r\n\r\ninterface GetAuthorizationParams {\r\n clientID: string;\r\n}\r\n\r\ninterface IAuthData {\r\n expiresIn: string;\r\n store: {\r\n CNPJ: string;\r\n name: string;\r\n },\r\n token: string;\r\n refreshToken: string;\r\n}\r\n\r\ninterface IResponseAuth extends IRequestDefault {\r\n data: IAuthData;\r\n}\r\n\r\nexport const GetAuthorization = async ({ clientID }: GetAuthorizationParams): Promise<IResponseAuth> => {\r\n const API_URL = import.meta.env.VITE_API_URL;\r\n const STORE_ID = import.meta.env.VITE_STORE_ID;\r\n const STORE_NAME = import.meta.env.VITE_STORE_NAME;\r\n\r\n if (!API_URL) {\r\n throw new Error('API URL is not defined in environment variables');\r\n }\r\n\r\n if (!STORE_ID || !STORE_NAME) {\r\n throw new Error('Store ID or Store Name is not defined in environment variables');\r\n }\r\n\r\n const response = await fetch(`${API_URL}/auth`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n StoreID: STORE_ID,\r\n StoreName: STORE_NAME,\r\n ClientID: clientID\r\n })\r\n });\r\n\r\n const dataResponse: IResponseAuth = await response.json();\r\n\r\n if (!dataResponse.success) {\r\n throw new Error(dataResponse.message || 'Failed to fetch authorization');\r\n }\r\n\r\n Cookies.set('pbm-token', dataResponse.data.token, {\r\n expires: parseInt(dataResponse.data.expiresIn, 10) / (60 * 60),\r\n secure: true,\r\n sameSite: 'Strict'\r\n });\r\n\r\n Cookies.set('pbm-token-refresh', dataResponse.data.refreshToken, {\r\n secure: true,\r\n sameSite: 'Strict'\r\n });\r\n\r\n return dataResponse;\r\n}","import Cookies from \"js-cookie\";\r\nimport { IRequestDefault } from \"../types/requests\";\r\nimport { IProduct } from \"../types/globals\";\r\n\r\ninterface IPagination {\r\n page: number,\r\n limit: number,\r\n total: number,\r\n totalPages: number,\r\n hasNextPage: boolean,\r\n hasPrevPage: boolean\r\n}\r\n\r\ninterface IMessageData {\r\n products: IProduct[],\r\n pagination: IPagination\r\n}\r\n\r\ninterface IDataRequestListProducts {\r\n message: IMessageData,\r\n data: string,\r\n statusCode: number\r\n}\r\n\r\ninterface IResponseGetProducts extends IRequestDefault {\r\n data: IDataRequestListProducts\r\n}\r\n\r\nexport const GetProductByEAN = async ({ PRODUCT_EAN }: { PRODUCT_EAN: string }): Promise<IResponseGetProducts> => {\r\n const API_URL = import.meta.env.VITE_API_URL;\r\n\r\n const AUTH_TOKEN = Cookies.get(\"pbm-token\");\r\n\r\n if (!AUTH_TOKEN) {\r\n throw new Error('Token is not defined in cookies or is expired');\r\n }\r\n\r\n const response = await fetch(`${API_URL}/core/products?ean=${PRODUCT_EAN}`, {\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${AUTH_TOKEN}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n const dataResponse: IResponseGetProducts = await response.json();\r\n\r\n if (!dataResponse.success) {\r\n throw new Error(dataResponse.message || 'Failed to fetch authorization');\r\n }\r\n\r\n return dataResponse;\r\n}","import { create, StateCreator } from \"zustand\";\r\nimport { IProduct } from \"../../types/globals\";\r\n\r\ninterface targetProductDataType {\r\n targetProductInternal: IProduct | null;\r\n}\r\n\r\nexport interface useTargetProduct extends targetProductDataType {\r\n setTargetProductInternal: (\r\n targetProductInternal: useTargetProduct[\"targetProductInternal\"]\r\n ) => void;\r\n}\r\n\r\nconst initialTargetProductState: targetProductDataType = {\r\n targetProductInternal: null,\r\n};\r\n\r\n// ✅ TIPANDO a função corretamente com StateCreator\r\nconst createPBMStore: StateCreator<useTargetProduct> = (set) => ({\r\n ...initialTargetProductState,\r\n\r\n setTargetProductInternal: (\r\n targetProductInternal: useTargetProduct[\"targetProductInternal\"]\r\n ) => set({ targetProductInternal }),\r\n});\r\n\r\n// React hook (usado dentro de componentes React)\r\nexport const useTargetProducts = create<useTargetProduct>(createPBMStore);\r\n"],"mappings":"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","names":["import_jsx_runtime","classNames","import_jsx_runtime","import_classnames","import_zod","import_jsx_runtime","classNames","import_jsx_runtime","import_classnames","import_jsx_runtime","classNames","import_react","import_classnames","import_jsx_runtime","classNames","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_classnames","import_jsx_runtime","classNames","import_classnames","import_lucide_react","import_jsx_runtime","classNames","import_react","import_jsx_runtime","import_react","import_classnames","import_jsx_runtime","classNames","import_jsx_runtime","Cookies","import_lucide_react","import_js_cookie","import_meta","Cookies","import_zustand","createPBMStore","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/Header/index.tsx","../src/components/UI/Container/index.tsx","../src/components/Footer/index.tsx","../src/schema/validation-schema.ts","../src/utils/format.ts","../src/components/Form/index.tsx","../src/libs/zustand/usePBM.tsx","../src/services/validate-document.ts","../src/components/UI/Loading/index.tsx","../src/components/UI/Button/index.tsx","../src/components/BenefitsTable/index.tsx","../src/mocks/benefits.ts","../src/components/UI/Title/index.tsx","../src/components/BenefitsTable/Item.tsx","../src/components/UI/Text/index.tsx","../src/components/Iframe/index.tsx","../src/components/SecurityNumberInvalid/index.tsx","../src/PBM.tsx","../src/components/UI/Link/index.tsx","../src/utils/getParams.ts","../src/components/SecurityNumberRegitered/index.tsx","../src/services/authorization.ts"],"sourcesContent":["// Estilos\r\nimport './index.css';\r\n\r\n// Componente Principal\r\nexport { default as PBM } from \"./PBM\";\r\n\r\n// Tipos\r\nexport type { PBMProps } from \"./PBM\";\r\nexport type { PBMStore } from \"./libs/zustand/usePBM\";\r\n\r\n// Hooks\r\nexport { usePBMStore } from \"./libs/zustand/usePBM\"; \r\n","function Header({ originalProductPrice }: { originalProductPrice: number }) {\r\n return (\r\n <header\r\n className=\"flex items-center justify-between w-full p-0.5 rounded-full bg-[#44c2c0]/30\"\r\n id=\"header_pbm\"\r\n >\r\n <span\r\n className=\"py-1 px-6 rounded-full bg-[#44c2c0] shrink-0 text-white text-sm font-bold\"\r\n data-testid=\"test_id_header_price\"\r\n id=\"header_price\"\r\n >\r\n {Number(originalProductPrice)?.toLocaleString(\"pt-BR\", {\r\n currency: \"BRL\",\r\n currencyDisplay: \"symbol\",\r\n currencySign: \"standard\",\r\n style: \"currency\",\r\n })}\r\n </span>\r\n <h1 id=\"header_title\" className=\"text-center w-full text-[#339c9b] font-bold text-xs px-4 md:text-sm\">\r\n Benefício de Laboratório\r\n </h1>\r\n </header>\r\n );\r\n}\r\n\r\nexport default Header;\r\n","import classNames from \"classnames\";\r\nimport React from \"react\";\r\n\r\nfunction Container({\r\n children,\r\n variant,\r\n}: {\r\n children: React.ReactNode;\r\n variant: \"simple\" | \"main\";\r\n}) {\r\n return (\r\n <main\r\n className={classNames({\r\n \"flex flex-col items-center justify-center min-w-[var(--min-container)] max-w-[var(--max-container)] w-full h-auto rounded-2xl p-4 bg-gray-100 gap-4\":\r\n variant === \"main\",\r\n \"w-full h-auto relative\": variant === \"simple\",\r\n })}\r\n data-testid=\"test_id_container\"\r\n data-variant={variant}\r\n id=\"container_pbm\"\r\n >\r\n {children}\r\n </main>\r\n );\r\n}\r\n\r\nexport default Container;\r\n","import classNames from \"classnames\";\r\n\r\nfunction Footer({ industryLogo }: { industryLogo?: string }) {\r\n return (\r\n <footer className=\"w-full h-auto relative\" id=\"footer_pbm\">\r\n <section className={classNames(\"flex items-center w-full h-auto gap-4\", { \"justify-center\": industryLogo, \"justify-start\": !industryLogo })}>\r\n <section className=\"w-4/5 h-auto\">\r\n <h3 className=\"text-start font-semibold text-sm\">\r\n Economize com o benefício do laboratório.\r\n </h3>\r\n <p className=\"text-start font-normal text-sm\">\r\n Este produto tem preço exclusivo para clientes cadastrados no\r\n programa.\r\n </p>\r\n </section>\r\n {industryLogo && (\r\n <img\r\n src={industryLogo}\r\n alt=\"parceiro\"\r\n className=\"w-1/5 min-w-20 h-auto aspect-square\"\r\n loading=\"eager\"\r\n id=\"footer_industry_logo_pbm\"\r\n data-testid=\"footer_industry_logo_pbm\"\r\n />\r\n )}\r\n </section>\r\n </footer>\r\n );\r\n}\r\n\r\nexport default Footer;\r\n","import { z } from \"zod\";\r\n\r\nexport const validationSchema = z.strictObject({\r\n securityNumber: z\r\n .string({\r\n required_error: 'CPF é obrigatório.',\r\n })\r\n .refine((doc) => {\r\n const replacedDoc = doc.replace(/\\D/g, '');\r\n return replacedDoc.length >= 11;\r\n }, 'CPF deve conter no mínimo 11 caracteres.')\r\n .refine((doc) => {\r\n const replacedDoc = doc.replace(/\\D/g, '');\r\n return !!Number(replacedDoc);\r\n }, 'CPF deve conter apenas números.'),\r\n});\r\n\r\nexport type validationSchemaType = z.infer<typeof validationSchema>","export const toFormat = (value: string) => {\r\n const cleanedValue = value.replace(/\\D/g, '');\r\n\r\n if (cleanedValue.length <= 11) {\r\n return cleanedValue\r\n .replace(/(\\d{3})(\\d)/, '$1.$2')\r\n .replace(/(\\d{3})(\\d)/, '$1.$2')\r\n .replace(/(\\d{3})(\\d{1,2})/, '$1-$2')\r\n .replace(/(-\\d{2})\\d+?$/, '$1');\r\n }\r\n};","import {\r\n validationSchema,\r\n validationSchemaType,\r\n} from \"../../schema/validation-schema\";\r\nimport { toFormat } from \"../../utils/format\";\r\n\r\nimport classNames from \"classnames\";\r\nimport { zodResolver } from \"@hookform/resolvers/zod\";\r\nimport { useForm } from \"react-hook-form\";\r\n\r\nimport { ArrowRight } from \"lucide-react\";\r\nimport { Dispatch, SetStateAction } from \"react\";\r\nimport { IProduct, ISecurityNumber } from \"../../types/globals\";\r\n\r\nimport { usePBMStore } from \"../../libs/zustand/usePBM\";\r\nimport { ValidateDocument } from \"../../services/validate-document\";\r\n\r\ninterface IForm {\r\n setLoading: Dispatch<SetStateAction<boolean>>;\r\n}\r\n\r\nfunction Form({ setLoading }: IForm) {\r\n const { setSecurityNumber, setState, securityNumber, targetProduct } = usePBMStore();\r\n\r\n const {\r\n handleSubmit,\r\n register,\r\n setValue,\r\n formState: { errors },\r\n } = useForm<validationSchemaType>({\r\n resolver: zodResolver(validationSchema),\r\n defaultValues: {\r\n securityNumber: securityNumber || \"\",\r\n },\r\n });\r\n\r\n const onSubmitDefault = async (values: validationSchemaType) => {\r\n setLoading(true);\r\n\r\n try {\r\n if (targetProduct === null) {\r\n console.error(\"Product is not defined!\");\r\n return;\r\n }\r\n\r\n const response = await ValidateDocument({\r\n document: values.securityNumber.replace(/\\D/g, ''),\r\n products: [{ ean: targetProduct.ean, quantity: targetProduct.quantity }]\r\n });\r\n\r\n if (response.success) {\r\n const status: Record<string, \"isRegistered\" | \"isActivated\" | \"isInvalid\" | \"isEmpty\"> = {\r\n \"active\": \"isActivated\",\r\n \"nonexistent\": \"isInvalid\"\r\n }\r\n\r\n setSecurityNumber(values.securityNumber);\r\n setState(status[response.data.process_platform.status]);\r\n }\r\n } catch (error) {\r\n console.error(\"Error validating document:\", error);\r\n } finally {\r\n setLoading(false);\r\n };\r\n };\r\n\r\n return (\r\n <form\r\n onSubmit={handleSubmit(onSubmitDefault)}\r\n className={classNames(\r\n \"w-full h-auto flex items-center justify-center mb-0 transition-all duration-150\",\r\n { \"mb-4\": errors.securityNumber }\r\n )}\r\n id=\"form_security_number_pbm\"\r\n >\r\n <label\r\n htmlFor=\"cpf\"\r\n className=\"w-4/5 h-auto flex items-start flex-col justify-center relative py-2\"\r\n id=\"label_security_number_pbm\"\r\n >\r\n <input\r\n type=\"text\"\r\n className={classNames(\r\n \"w-full h-8 bg-[#44c2c0]/20 rounded-s-full text-sm font-semibold focus:outline focus:outline-[#339c9b] focus:bg-[#44c2c0]/30 text-zinc-600 placeholder:text-zinc-600 px-4 placeholder:text-sm placeholder:font-semibold\",\r\n { \"outline outline-red-600\": errors.securityNumber }\r\n )}\r\n placeholder=\"Digite seu CPF aqui...\"\r\n required\r\n maxLength={14}\r\n {...register(\"securityNumber\", {\r\n onChange: (e) => {\r\n const formatted = toFormat(e.target.value);\r\n setValue(\"securityNumber\", formatted as string, {\r\n shouldValidate: true,\r\n });\r\n },\r\n })}\r\n defaultValue={securityNumber || \"\"}\r\n id=\"input_security_number_pbm\"\r\n />\r\n {errors.securityNumber && (\r\n <span className=\"text-red-400 text-xs font-semibold absolute -bottom-3 left-2 text-nowrap\" id=\"security_number_form_error\">\r\n {errors.securityNumber.message}\r\n </span>\r\n )}\r\n </label>\r\n <button\r\n type=\"submit\"\r\n className=\"bg-gray-400 w-1/5 h-8 flex items-center justify-center rounded-e-full cursor-pointer\"\r\n id=\"button_submit_security_number_pbm\"\r\n >\r\n <ArrowRight size={24} color=\"white\" strokeWidth={2} />\r\n </button>\r\n </form>\r\n );\r\n}\r\n\r\nexport default Form;\r\n","import { createStore, StateCreator, StoreApi } from \"zustand\";\r\nimport { useStore } from \"zustand/react\";\r\nimport { usePBMTypes } from \"../../types/globals\";\r\n\r\nexport interface PBMStore extends usePBMTypes {\r\n setSecurityNumber: (securityNumber: string) => void;\r\n setState: (state: usePBMTypes[\"state\"]) => void;\r\n setAvailableDiscountSelected: (\r\n availableDiscount: usePBMTypes[\"availableDiscountSelected\"]\r\n ) => void;\r\n setTargetProduct: (targetProduct: usePBMTypes[\"targetProduct\"]) => void;\r\n}\r\n\r\nconst initialPBMState: usePBMTypes = {\r\n securityNumber: \"\",\r\n state: \"isEmpty\",\r\n availableDiscountSelected: {\r\n quantity: 0,\r\n discount: {\r\n unit: 0,\r\n total: 0,\r\n },\r\n totalPrice: 0,\r\n },\r\n targetProduct: null,\r\n campaign: \"pbm_campaign\",\r\n};\r\n\r\n// ✅ TIPANDO a função corretamente com StateCreator\r\nconst createPBMStore: StateCreator<PBMStore> = (set) => ({\r\n ...initialPBMState,\r\n\r\n setSecurityNumber: (securityNumber: string) => set({ securityNumber }),\r\n setState: (state: usePBMTypes[\"state\"]) => set({ state }),\r\n setTargetProduct: (targetProduct: usePBMTypes[\"targetProduct\"]) =>\r\n set({ targetProduct }),\r\n setAvailableDiscountSelected: (\r\n availableDiscount: usePBMTypes[\"availableDiscountSelected\"]\r\n ) => set({ availableDiscountSelected: availableDiscount }),\r\n});\r\n\r\n// Store base única (usada tanto no React quanto no webcomponent)\r\nexport const pbmStore: StoreApi<PBMStore> =\r\n createStore<PBMStore>(createPBMStore);\r\n\r\n// React hook (usado dentro de componentes React) - usa a mesma instância da store\r\nexport function usePBMStore(): PBMStore;\r\nexport function usePBMStore<T>(selector: (state: PBMStore) => T): T;\r\nexport function usePBMStore<T>(selector?: (state: PBMStore) => T): PBMStore | T {\r\n if (selector) {\r\n return useStore(pbmStore, selector);\r\n }\r\n return useStore(pbmStore, (state) => state);\r\n}\r\n","import Cookies from \"js-cookie\";\r\nimport { IRequestDefault } from \"../types/requests\";\r\n\r\ninterface IProcessBenefits {\r\n process: {\r\n error?: { returnCode: string; informativeText: string }[]\r\n },\r\n returnCode: string;\r\n}\r\n\r\ninterface IProcessPlatform {\r\n status: string;\r\n message: string;\r\n}\r\n\r\ninterface IRefreshAuthData {\r\n process_benefits: IProcessBenefits;\r\n process_platform: IProcessPlatform;\r\n}\r\n\r\ninterface IResponseValidateDocument extends IRequestDefault {\r\n data: IRefreshAuthData;\r\n}\r\n\r\ninterface IValidateDocumentParams {\r\n document: string;\r\n products: { ean: string; quantity: number }[];\r\n}\r\n\r\nexport const ValidateDocument = async ({ document, products }: IValidateDocumentParams): Promise<IResponseValidateDocument> => {\r\n const API_URL = import.meta.env.VITE_API_URL;\r\n\r\n if (!API_URL) {\r\n throw new Error('API URL is not defined in environment variables');\r\n }\r\n\r\n const AUTH_TOKEN = Cookies.get(\"pbm-token\");\r\n\r\n if (!AUTH_TOKEN) {\r\n throw new Error('Token is not defined in cookies or is expired');\r\n }\r\n\r\n const response = await fetch(`${API_URL}/transactions/validate`, {\r\n method: 'POST',\r\n headers: {\r\n Authorization: `Bearer ${AUTH_TOKEN}`,\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({ document, products })\r\n })\r\n\r\n const dataResponse: IResponseValidateDocument = await response.json();\r\n\r\n if (!dataResponse.success) {\r\n throw new Error(dataResponse.message || 'Failed to fetch document validation');\r\n }\r\n\r\n return dataResponse;\r\n}","interface LoadingProps {\r\n textColor?: string;\r\n}\r\n\r\nfunction Loading({ textColor }: LoadingProps) {\r\n return (\r\n <main className=\"flex items-center justify-center gap-4\" id=\"loading_pbm\">\r\n <div\r\n data-testid=\"test_id_spin\"\r\n className=\"w-8 h-8 border-4 border-t-gray-700 border-gray-300 rounded-full animate-spin\"\r\n id=\"loading_spin\"\r\n ></div>\r\n <p\r\n className={\"text-sm font-semibold text-start text-zinc-900\"}\r\n style={{ color: textColor }}\r\n id=\"loading_label\"\r\n >\r\n Um momento... estamos verificando seus dados.\r\n </p>\r\n </main>\r\n );\r\n}\r\n\r\nexport default Loading;\r\n","import classNames from \"classnames\";\r\nimport React, { ButtonHTMLAttributes } from \"react\";\r\n\r\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction Button(props: ButtonProps) {\r\n return (\r\n <button\r\n {...props}\r\n className={classNames(\r\n \"w-3xs cursor-pointer h-10 rounded-full bg-blue-500 hover:bg-blue-400 text-white text-sm font-semibold transition-colors\",\r\n props.className\r\n )}\r\n >\r\n {props.children}\r\n </button>\r\n );\r\n}\r\n\r\nexport default Button;\r\n","import { useState } from \"react\";\r\n\r\nimport { BENEFITS_ITEMS } from \"../../mocks/benefits\";\r\n\r\nimport Title from \"../UI/Title\";\r\nimport Item from \"./Item\";\r\nimport { usePBMStore } from \"../../libs/zustand/usePBM\";\r\nimport Button from \"../UI/Button\";\r\n\r\nfunction BenefitsTable({\r\n originalProductPrice,\r\n}: {\r\n originalProductPrice: number;\r\n}) {\r\n const { securityNumber, setState } = usePBMStore();\r\n const [selectedDiscout, setSelectedDiscount] = useState<string | null>(null);\r\n\r\n return (\r\n <section\r\n className=\"flex items-start justify-center gap-4 w-full h-auto flex-col\"\r\n id=\"benefits_table_pbm\"\r\n >\r\n <Title>Descontos disponíveis:</Title>\r\n\r\n <form\r\n className=\"flex flex-col items-center justify-start w-full gap-3\"\r\n id=\"form_benefits_table_pbm\"\r\n >\r\n {BENEFITS_ITEMS.map((item, index) => {\r\n const ID_INPUT = \"unity_quantity_\" + item.authorizedQuantity;\r\n\r\n return (\r\n <Item\r\n key={index}\r\n data={item}\r\n checked={selectedDiscout === ID_INPUT}\r\n onChange={() => setSelectedDiscount(ID_INPUT)}\r\n originalProductPrice={originalProductPrice}\r\n />\r\n );\r\n })}\r\n </form>\r\n\r\n {!securityNumber && (\r\n <Button\r\n onClick={() => setState(\"isEmpty\")}\r\n className=\"bg-transparent p-0 pl-2 w-auto h-auto text-zinc-600 cursor-pointer hover:text-zinc-900 hover:bg-transparent text-start\"\r\n id=\"unauthorized_benefits_button\"\r\n >\r\n Atenção: não é possível utilizar os benefícos sem realizar a consulta\r\n do cpf, por favor{\" \"}\r\n <span className=\"underline\">\r\n insira seu cpf para utilizar os benefícios\r\n </span>\r\n </Button>\r\n )}\r\n\r\n {securityNumber && (\r\n <Button\r\n onClick={() => setState(\"isEmpty\")}\r\n className=\"bg-transparent p-0 pl-2 w-auto h-auto text-zinc-600 cursor-pointer hover:text-zinc-900 hover:bg-transparent text-start\"\r\n id=\"change_security_number\"\r\n >\r\n <span className=\"underline\">Deseja editar o cpf digitado?</span>\r\n </Button>\r\n )}\r\n </section>\r\n );\r\n}\r\n\r\nexport default BenefitsTable;\r\n","export interface IBenefitsItem {\r\n id: number;\r\n ean: string;\r\n authorizedQuantity: number;\r\n discountValue: number;\r\n discountPercentual: number;\r\n}\r\n\r\nexport const BENEFITS_ITEMS: IBenefitsItem[] = [\r\n {\r\n id: 1,\r\n ean: \"001\",\r\n authorizedQuantity: 1,\r\n discountValue: 4800,\r\n discountPercentual: 2400\r\n },\r\n {\r\n id: 2,\r\n ean: \"002\",\r\n authorizedQuantity: 2,\r\n discountValue: 4800,\r\n discountPercentual: 2400\r\n },\r\n {\r\n id: 3,\r\n ean: \"003\",\r\n authorizedQuantity: 3,\r\n discountValue: 9400,\r\n discountPercentual: 4700\r\n }\r\n\r\n]","import classNames from \"classnames\";\r\nimport React, { HTMLAttributes } from \"react\";\r\n\r\ninterface TitleProps extends HTMLAttributes<HTMLTitleElement> {\r\n children: React.ReactNode;\r\n textColor?: string;\r\n textSize?: string;\r\n}\r\n\r\nfunction Title(props: TitleProps) {\r\n return (\r\n <h2\r\n className={classNames(\r\n \"text-start font-semibold text-sm text-zinc-900\",\r\n props.className\r\n )}\r\n style={{ color: props.textColor, fontSize: props.textSize }}\r\n data-testid=\"test_id_title\"\r\n id=\"title_pbm\"\r\n >\r\n {props.children}\r\n </h2>\r\n );\r\n}\r\n\r\nexport default Title;\r\n","import { IBenefitsItem } from \"../../mocks/benefits\";\r\n\r\nimport { usePBMStore } from \"../../libs/zustand/usePBM\";\r\n\r\nimport { Badge, BadgeCheck } from \"lucide-react\";\r\nimport { useCallback, useEffect } from \"react\";\r\n\r\ninterface ItemProps {\r\n data: IBenefitsItem;\r\n onChange: VoidFunction;\r\n checked: boolean;\r\n originalProductPrice: number;\r\n}\r\n\r\nfunction Item({ data, onChange, checked, originalProductPrice }: ItemProps) {\r\n const { setAvailableDiscountSelected, securityNumber } = usePBMStore();\r\n\r\n const ID_INPUT = \"unity_quantity_\" + data.authorizedQuantity;\r\n\r\n const decimalDiscount = data.discountPercentual / 10000;\r\n\r\n const unitDiscountValue = originalProductPrice * decimalDiscount;\r\n\r\n const discountValue = unitDiscountValue * data.authorizedQuantity;\r\n\r\n const totalPriceProductWithDiscountBenefit =\r\n originalProductPrice * data.authorizedQuantity - discountValue;\r\n\r\n const updateStorageData = useCallback(() => {\r\n if (checked) {\r\n setAvailableDiscountSelected({\r\n discount: {\r\n total: discountValue,\r\n unit: unitDiscountValue,\r\n },\r\n quantity: data.authorizedQuantity,\r\n totalPrice: totalPriceProductWithDiscountBenefit,\r\n });\r\n }\r\n }, [\r\n checked,\r\n data.authorizedQuantity,\r\n setAvailableDiscountSelected,\r\n discountValue,\r\n totalPriceProductWithDiscountBenefit,\r\n unitDiscountValue,\r\n ]);\r\n\r\n useEffect(() => {\r\n updateStorageData();\r\n }, [updateStorageData]);\r\n\r\n return (\r\n <label\r\n htmlFor={ID_INPUT}\r\n className=\"label_benefits w-full flex items-center justify-start bg-zinc-300/60 border border-zinc-400/50 px-4 py-2 hover:bg-zinc-300 transition-colors cursor-pointer rounded-full gap-1\"\r\n id={\"label_benefits_\" + ID_INPUT}\r\n >\r\n <input\r\n type=\"radio\"\r\n name=\"benefits_discount\"\r\n id={ID_INPUT}\r\n className=\"hidden\"\r\n checked={checked}\r\n onChange={onChange}\r\n disabled={!securityNumber}\r\n />\r\n\r\n {!checked ? (\r\n <Badge color=\"#9f9fa9\" size={20} />\r\n ) : (\r\n <BadgeCheck color=\"#32b316\" size={20} />\r\n )}\r\n\r\n <span className=\"text-zinc-900 font-semibold text-sm\">\r\n {data.authorizedQuantity}un\r\n </span>\r\n\r\n <section className=\"ml-auto relative\">\r\n <span className=\"absolute -top-4 text-emerald-900 py-0.5 font-semibold text-xs bg-[#32b316] px-2 w-auto text-nowrap rounded-2xl -right-4\">\r\n {discountValue.toLocaleString(\"pt-BR\", {\r\n currency: \"BRL\",\r\n currencyDisplay: \"symbol\",\r\n currencySign: \"standard\",\r\n style: \"currency\",\r\n })}{\" \"}\r\n OFF\r\n </span>\r\n <strong className=\"text-zinc-900 font-semibold text-sm text-center\">\r\n {totalPriceProductWithDiscountBenefit.toLocaleString(\"pt-BR\", {\r\n currency: \"BRL\",\r\n currencyDisplay: \"symbol\",\r\n currencySign: \"standard\",\r\n style: \"currency\",\r\n })}\r\n </strong>\r\n </section>\r\n </label>\r\n );\r\n}\r\n\r\nexport default Item;\r\n","import classNames from \"classnames\";\r\nimport React, { HTMLAttributes } from \"react\";\r\n\r\ninterface TextProps extends HTMLAttributes<HTMLParagraphElement> {\r\n children: React.ReactNode;\r\n textColor?: string;\r\n textSize?: string;\r\n}\r\n\r\nfunction Text(props: TextProps) {\r\n return (\r\n <p\r\n className={classNames(\r\n \"text-start font-normal text-sm text-zinc-900\",\r\n props.className\r\n )}\r\n style={{ color: props.textColor, fontSize: props.textSize }}\r\n data-testid=\"test_id_text\"\r\n id=\"text_pbm\"\r\n >\r\n {props.children}\r\n </p>\r\n );\r\n}\r\n\r\nexport default Text;\r\n","import classNames from \"classnames\";\r\nimport { TriangleAlert } from \"lucide-react\";\r\nimport { Dispatch, SetStateAction } from \"react\";\r\n\r\ninterface IFrameProps {\r\n url: string;\r\n title: string;\r\n openModal: boolean;\r\n setOpenModal: Dispatch<SetStateAction<boolean>>;\r\n}\r\n\r\nfunction Iframe({ url, title, openModal, setOpenModal }: IFrameProps) {\r\n return (\r\n <main\r\n className={classNames(\r\n \"fixed inset-0 flex items-center justify-center z-50 flex-col transition-all shadow\",\r\n {\r\n \"opacity-100 pointer-events-auto\": openModal,\r\n \"opacity-0 pointer-events-none\": !openModal,\r\n }\r\n )}\r\n data-testid=\"test_id_iframe\"\r\n id=\"iframe_pbm\"\r\n >\r\n <div\r\n className=\"bg-black/35 inset-0 absolute\"\r\n onClick={() => {\r\n setOpenModal(false);\r\n window.location.reload();\r\n }}\r\n ></div>\r\n <section className=\"w-4/5 h-auto bg-zinc-800 py-2 px-4 flex items-center justify-end rounded-ss-2xl rounded-se-2xl border-b-2 border-gray-100 z-10\">\r\n <button\r\n className=\"shadow-2xl cursor-pointer text-white font-bold bg-red-500 w-auto h-auto px-8 py-2 rounded-full\"\r\n aria-label=\"Fechar o modal\"\r\n data-testid=\"test_id_buttonclose\"\r\n onClick={() => {\r\n setOpenModal(false);\r\n window.location.reload();\r\n }}\r\n >\r\n Fechar\r\n </button>\r\n </section>\r\n <iframe\r\n src={url}\r\n title={title}\r\n width=\"80%\"\r\n height=\"80%\"\r\n allowFullScreen\r\n className=\"z-10\"\r\n ></iframe>\r\n <section className=\"items-center justify-center flex flex-wrap gap-1 bg-zinc-800 z-10 w-4/5 py-2 px-4 rounded-ee-2xl rounded-es-2xl border-t-2 border-gray-100\">\r\n <TriangleAlert size={20} className=\"shrink-0 text-red-500 \" />\r\n\r\n <p className=\"text-start text-sm text-white\">\r\n <span className=\"text-red-500 font-semibold text-base mr-1\">\r\n Atenção:\r\n </span>\r\n Após finalizar os termos de aceite, você já poderá fechar essa janela.\r\n Pode levar <strong>alguns minutos</strong> para os seus dados serem\r\n aprovados.\r\n </p>\r\n </section>\r\n </main>\r\n );\r\n}\r\n\r\nexport default Iframe;\r\n","import Title from \"../UI/Title\";\r\nimport Text from \"../UI/Text\";\r\nimport Button from \"../UI/Button\";\r\nimport Iframe from \"../Iframe\";\r\n\r\nimport { useState } from \"react\";\r\n\r\nfunction SecurityNumberInvalid({ textColor }: { textColor?: string }) {\r\n const [openModal, setOpenModal] = useState<boolean>(false);\r\n return (\r\n <section\r\n data-testid=\"test_id_invalid\"\r\n className=\"flex items-end justify-center gap-2 w-full h-auto flex-col border-y border-zinc-300 py-6\"\r\n id=\"security_number_invalid_container_pbm\"\r\n >\r\n <Title className=\"w-full\" textColor={textColor}>\r\n CPF não cadastrado!\r\n </Title>\r\n <Text className=\"w-full\" textColor={textColor}>\r\n Por favor, conclua seu cadastro para habilitar os benefícios deste\r\n laboratório.\r\n </Text>\r\n <Button\r\n data-testid=\"test_id_openiframe\"\r\n onClick={() => setOpenModal(true)}\r\n id=\"button_accept_terms_pbm\"\r\n >\r\n Aceitar os termos\r\n </Button>\r\n\r\n <Iframe\r\n url=\"https://termo.azurewebsites.net/\"\r\n title=\"Aceitar termos PBM\"\r\n openModal={openModal}\r\n setOpenModal={setOpenModal}\r\n />\r\n </section>\r\n );\r\n}\r\n\r\nexport default SecurityNumberInvalid;\r\n","import Header from \"./components/Header\";\nimport Container from \"./components/UI/Container\";\nimport Footer from \"./components/Footer\";\nimport Form from \"./components/Form\";\nimport Loading from \"./components/UI/Loading\";\nimport Button from \"./components/UI/Button\";\nimport BenefitsTable from \"./components/BenefitsTable\";\nimport SecurityNumberInvalid from \"./components/SecurityNumberInvalid\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport SecurityNumberRegitered from \"./components/SecurityNumberRegitered\";\nimport { GetAuthorization } from \"./services/authorization\";\nimport { ArrowRight } from \"lucide-react\";\nimport { usePBMStore } from \"./libs/zustand/usePBM\";\n\nexport interface PBMProps {\n originalProductPrice: number | string;\n industryLogo?: string;\n clientID: string;\n eanProduct: string;\n}\n\nfunction PBM({\n originalProductPrice,\n industryLogo,\n clientID,\n eanProduct,\n}: PBMProps) {\n const formatedOriginalProductPrice = Number(\n String(originalProductPrice).replace(',', '.')\n );\n\n const [loading, setLoading] = useState<boolean>(false);\n\n const { setState, state, setTargetProduct } = usePBMStore();\n\n const handleAuthorizationRequest = useCallback(async () => {\n try {\n const response = await GetAuthorization({ clientID: clientID });\n\n if (response.success) {\n setTargetProduct({ ean: eanProduct, quantity: 1 })\n console.log(\"Authorization successful:\", response.data);\n } else {\n console.error(\"Authorization failed:\", response.message);\n }\n } catch (error) {\n console.error(\"Error fetching authorization:\", error);\n }\n }, [clientID, eanProduct]);\n\n useEffect(() => {\n handleAuthorizationRequest();\n }, [handleAuthorizationRequest]);\n\n return (\n <Container variant=\"main\">\n <Header originalProductPrice={formatedOriginalProductPrice || 0} />\n\n <Container variant=\"simple\">\n {state === \"isEmpty\" && !loading && (\n <>\n <Form setLoading={setLoading} />\n <Button\n className=\"bg-transparent p-0 pl-2 w-auto h-auto text-zinc-600 underline cursor-pointer hover:text-zinc-900 hover:bg-transparent flex items-center justify-start gap-1\"\n onClick={() => setState(\"isActivated\")}\n id=\"check_benefits_button\"\n >\n <span>Consultar benefícios</span>\n <ArrowRight size={16} />\n </Button>\n </>\n )}\n\n {state === \"isEmpty\" && loading && <Loading />}\n\n {state === \"isInvalid\" && !loading && <SecurityNumberInvalid />}\n\n {state === \"isRegistered\" && !loading && <SecurityNumberRegitered />}\n\n {state === \"isActivated\" && !loading && (\n <BenefitsTable originalProductPrice={formatedOriginalProductPrice} />\n )}\n </Container>\n\n <Footer industryLogo={industryLogo || undefined} />\n </Container>\n );\n}\n\nexport default PBM;\n","import { ILinkHref } from \"../../../types/globals\";\r\nimport classNames from \"classnames\";\r\nimport React from \"react\";\r\nimport { getParams } from \"../../../utils/getParams\";\r\n\r\ninterface LinkProps {\r\n className?: string;\r\n children: React.ReactNode;\r\n href: ILinkHref | string;\r\n}\r\n\r\nfunction Link(props: LinkProps) {\r\n return (\r\n <a\r\n {...props}\r\n target=\"_blank\"\r\n href={\r\n typeof props.href === \"string\"\r\n ? props.href\r\n : props.href.pathname + getParams(props.href.param)\r\n }\r\n className={classNames(\r\n \"w-3xs cursor-pointer h-10 rounded-full bg-blue-500 hover:bg-blue-400 text-white text-sm font-semibold transition-colors flex items-center justify-center\",\r\n props.className\r\n )}\r\n data-testid=\"test_id_link\"\r\n id=\"link_pbm\"\r\n >\r\n {props.children}\r\n </a>\r\n );\r\n}\r\n\r\nexport default Link;\r\n","export const getParams = (\r\n params: { [key: string]: string | number } | undefined\r\n) => {\r\n if (params === undefined) return \"\";\r\n\r\n return (\r\n \"?\" +\r\n Object.keys(params)\r\n .map((paramter) => paramter + \"=\" + params[paramter])\r\n .join(\"&\")\r\n );\r\n};","import Title from \"../UI/Title\";\r\nimport Text from \"../UI/Text\";\r\nimport Link from \"../UI/Link\";\r\n\r\nfunction SecurityNumberRegitered({ textColor }: { textColor?: string }) {\r\n return (\r\n <section\r\n data-testid=\"test_id_registered\"\r\n className=\"flex items-end justify-center gap-2 w-full h-auto flex-col border-y border-zinc-300 py-6\"\r\n id=\"security_number_registered_container_pbm\"\r\n >\r\n <Title className=\"w-full\" textColor={textColor}>\r\n CPF não habilitado no produto!\r\n </Title>\r\n <Text className=\"w-full\" textColor={textColor}>\r\n Por favor, conclua seu cadastro para habilitar os benefícios deste\r\n laboratório.\r\n </Text>\r\n <Link\r\n href={{\r\n pathname: \"https://gip-pd-app.interplayers.com.br/idp-pd-app/adesao\",\r\n param: { guid: \"f2aff249-51b4-49a4-b671-d6bee89da0f0\" },\r\n }}\r\n >\r\n Ativar CPF\r\n </Link>\r\n </section>\r\n );\r\n}\r\n\r\nexport default SecurityNumberRegitered;\r\n","import Cookies from \"js-cookie\";\r\nimport { IRequestDefault } from \"../types/requests\";\r\n\r\ninterface GetAuthorizationParams {\r\n clientID: string;\r\n}\r\n\r\ninterface IAuthData {\r\n expiresIn: string;\r\n store: {\r\n CNPJ: string;\r\n name: string;\r\n },\r\n token: string;\r\n refreshToken: string;\r\n}\r\n\r\ninterface IResponseAuth extends IRequestDefault {\r\n data: IAuthData;\r\n}\r\n\r\nexport const GetAuthorization = async ({ clientID }: GetAuthorizationParams): Promise<IResponseAuth> => {\r\n const API_URL = import.meta.env.VITE_API_URL;\r\n const STORE_ID = import.meta.env.VITE_STORE_ID;\r\n const STORE_NAME = import.meta.env.VITE_STORE_NAME;\r\n\r\n if (!API_URL) {\r\n throw new Error('API URL is not defined in environment variables');\r\n }\r\n\r\n if (!STORE_ID || !STORE_NAME) {\r\n throw new Error('Store ID or Store Name is not defined in environment variables');\r\n }\r\n\r\n const response = await fetch(`${API_URL}/auth`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n StoreID: STORE_ID,\r\n StoreName: STORE_NAME,\r\n ClientID: clientID\r\n })\r\n });\r\n\r\n const dataResponse: IResponseAuth = await response.json();\r\n\r\n if (!dataResponse.success) {\r\n throw new Error(dataResponse.message || 'Failed to fetch authorization');\r\n }\r\n\r\n Cookies.set('pbm-token', dataResponse.data.token, {\r\n expires: parseInt(dataResponse.data.expiresIn, 10) / (60 * 60),\r\n secure: true,\r\n sameSite: 'Strict'\r\n });\r\n\r\n Cookies.set('pbm-token-refresh', dataResponse.data.refreshToken, {\r\n secure: true,\r\n sameSite: 'Strict'\r\n });\r\n\r\n return dataResponse;\r\n}"],"mappings":"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","names":["import_jsx_runtime","classNames","import_classnames","import_jsx_runtime","classNames","import_classnames","import_zod","Cookies","import_jsx_runtime","classNames","import_jsx_runtime","import_classnames","import_jsx_runtime","classNames","import_react","import_classnames","import_jsx_runtime","classNames","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime","import_classnames","import_jsx_runtime","classNames","import_classnames","import_lucide_react","import_jsx_runtime","classNames","import_react","import_jsx_runtime","import_react","import_classnames","import_jsx_runtime","classNames","import_jsx_runtime","import_js_cookie","import_meta","Cookies","import_lucide_react","import_jsx_runtime"]}
|
package/dist/index.mjs
CHANGED
|
@@ -52,9 +52,10 @@ function Container({
|
|
|
52
52
|
var Container_default = Container;
|
|
53
53
|
|
|
54
54
|
// src/components/Footer/index.tsx
|
|
55
|
+
import classNames2 from "classnames";
|
|
55
56
|
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
56
57
|
function Footer({ industryLogo }) {
|
|
57
|
-
return /* @__PURE__ */ jsx3("footer", { className: "w-full h-auto relative", id: "footer_pbm", children: /* @__PURE__ */ jsxs2("section", { className: "flex items-center
|
|
58
|
+
return /* @__PURE__ */ jsx3("footer", { className: "w-full h-auto relative", id: "footer_pbm", children: /* @__PURE__ */ jsxs2("section", { className: classNames2("flex items-center w-full h-auto gap-4", { "justify-center": industryLogo, "justify-start": !industryLogo }), children: [
|
|
58
59
|
/* @__PURE__ */ jsxs2("section", { className: "w-4/5 h-auto", children: [
|
|
59
60
|
/* @__PURE__ */ jsx3("h3", { className: "text-start font-semibold text-sm", children: "Economize com o benef\xEDcio do laborat\xF3rio." }),
|
|
60
61
|
/* @__PURE__ */ jsx3("p", { className: "text-start font-normal text-sm", children: "Este produto tem pre\xE7o exclusivo para clientes cadastrados no programa." })
|
|
@@ -97,13 +98,14 @@ var toFormat = (value) => {
|
|
|
97
98
|
};
|
|
98
99
|
|
|
99
100
|
// src/components/Form/index.tsx
|
|
100
|
-
import
|
|
101
|
+
import classNames3 from "classnames";
|
|
101
102
|
import { zodResolver } from "@hookform/resolvers/zod";
|
|
102
103
|
import { useForm } from "react-hook-form";
|
|
103
104
|
import { ArrowRight } from "lucide-react";
|
|
104
105
|
|
|
105
106
|
// src/libs/zustand/usePBM.tsx
|
|
106
|
-
import {
|
|
107
|
+
import { createStore } from "zustand";
|
|
108
|
+
import { useStore } from "zustand/react";
|
|
107
109
|
var initialPBMState = {
|
|
108
110
|
securityNumber: "",
|
|
109
111
|
state: "isEmpty",
|
|
@@ -125,13 +127,44 @@ var createPBMStore = (set) => ({
|
|
|
125
127
|
setTargetProduct: (targetProduct) => set({ targetProduct }),
|
|
126
128
|
setAvailableDiscountSelected: (availableDiscount) => set({ availableDiscountSelected: availableDiscount })
|
|
127
129
|
});
|
|
128
|
-
var usePBMStore = create(createPBMStore);
|
|
129
130
|
var pbmStore = createStore(createPBMStore);
|
|
131
|
+
function usePBMStore(selector) {
|
|
132
|
+
if (selector) {
|
|
133
|
+
return useStore(pbmStore, selector);
|
|
134
|
+
}
|
|
135
|
+
return useStore(pbmStore, (state) => state);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// src/services/validate-document.ts
|
|
139
|
+
import Cookies from "js-cookie";
|
|
140
|
+
var ValidateDocument = async ({ document, products }) => {
|
|
141
|
+
const API_URL = import.meta.env.VITE_API_URL;
|
|
142
|
+
if (!API_URL) {
|
|
143
|
+
throw new Error("API URL is not defined in environment variables");
|
|
144
|
+
}
|
|
145
|
+
const AUTH_TOKEN = Cookies.get("pbm-token");
|
|
146
|
+
if (!AUTH_TOKEN) {
|
|
147
|
+
throw new Error("Token is not defined in cookies or is expired");
|
|
148
|
+
}
|
|
149
|
+
const response = await fetch(`${API_URL}/transactions/validate`, {
|
|
150
|
+
method: "POST",
|
|
151
|
+
headers: {
|
|
152
|
+
Authorization: `Bearer ${AUTH_TOKEN}`,
|
|
153
|
+
"Content-Type": "application/json"
|
|
154
|
+
},
|
|
155
|
+
body: JSON.stringify({ document, products })
|
|
156
|
+
});
|
|
157
|
+
const dataResponse = await response.json();
|
|
158
|
+
if (!dataResponse.success) {
|
|
159
|
+
throw new Error(dataResponse.message || "Failed to fetch document validation");
|
|
160
|
+
}
|
|
161
|
+
return dataResponse;
|
|
162
|
+
};
|
|
130
163
|
|
|
131
164
|
// src/components/Form/index.tsx
|
|
132
165
|
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
133
166
|
function Form({ setLoading }) {
|
|
134
|
-
const { setSecurityNumber, setState, securityNumber } = usePBMStore();
|
|
167
|
+
const { setSecurityNumber, setState, securityNumber, targetProduct } = usePBMStore();
|
|
135
168
|
const {
|
|
136
169
|
handleSubmit,
|
|
137
170
|
register,
|
|
@@ -143,28 +176,37 @@ function Form({ setLoading }) {
|
|
|
143
176
|
securityNumber: securityNumber || ""
|
|
144
177
|
}
|
|
145
178
|
});
|
|
146
|
-
const onSubmitDefault = (values) => {
|
|
179
|
+
const onSubmitDefault = async (values) => {
|
|
147
180
|
setLoading(true);
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
181
|
+
try {
|
|
182
|
+
if (targetProduct === null) {
|
|
183
|
+
console.error("Product is not defined!");
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const response = await ValidateDocument({
|
|
187
|
+
document: values.securityNumber.replace(/\D/g, ""),
|
|
188
|
+
products: [{ ean: targetProduct.ean, quantity: targetProduct.quantity }]
|
|
189
|
+
});
|
|
190
|
+
if (response.success) {
|
|
191
|
+
const status = {
|
|
192
|
+
"active": "isActivated",
|
|
193
|
+
"nonexistent": "isInvalid"
|
|
194
|
+
};
|
|
195
|
+
setSecurityNumber(values.securityNumber);
|
|
196
|
+
setState(status[response.data.process_platform.status]);
|
|
197
|
+
}
|
|
198
|
+
} catch (error) {
|
|
199
|
+
console.error("Error validating document:", error);
|
|
200
|
+
} finally {
|
|
160
201
|
setLoading(false);
|
|
161
|
-
}
|
|
202
|
+
}
|
|
203
|
+
;
|
|
162
204
|
};
|
|
163
205
|
return /* @__PURE__ */ jsxs3(
|
|
164
206
|
"form",
|
|
165
207
|
{
|
|
166
208
|
onSubmit: handleSubmit(onSubmitDefault),
|
|
167
|
-
className:
|
|
209
|
+
className: classNames3(
|
|
168
210
|
"w-full h-auto flex items-center justify-center mb-0 transition-all duration-150",
|
|
169
211
|
{ "mb-4": errors.securityNumber }
|
|
170
212
|
),
|
|
@@ -181,7 +223,7 @@ function Form({ setLoading }) {
|
|
|
181
223
|
"input",
|
|
182
224
|
{
|
|
183
225
|
type: "text",
|
|
184
|
-
className:
|
|
226
|
+
className: classNames3(
|
|
185
227
|
"w-full h-8 bg-[#44c2c0]/20 rounded-s-full text-sm font-semibold focus:outline focus:outline-[#339c9b] focus:bg-[#44c2c0]/30 text-zinc-600 placeholder:text-zinc-600 px-4 placeholder:text-sm placeholder:font-semibold",
|
|
186
228
|
{ "outline outline-red-600": errors.securityNumber }
|
|
187
229
|
),
|
|
@@ -245,14 +287,14 @@ function Loading({ textColor }) {
|
|
|
245
287
|
var Loading_default = Loading;
|
|
246
288
|
|
|
247
289
|
// src/components/UI/Button/index.tsx
|
|
248
|
-
import
|
|
290
|
+
import classNames4 from "classnames";
|
|
249
291
|
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
250
292
|
function Button(props) {
|
|
251
293
|
return /* @__PURE__ */ jsx6(
|
|
252
294
|
"button",
|
|
253
295
|
{
|
|
254
296
|
...props,
|
|
255
|
-
className:
|
|
297
|
+
className: classNames4(
|
|
256
298
|
"w-3xs cursor-pointer h-10 rounded-full bg-blue-500 hover:bg-blue-400 text-white text-sm font-semibold transition-colors",
|
|
257
299
|
props.className
|
|
258
300
|
),
|
|
@@ -291,13 +333,13 @@ var BENEFITS_ITEMS = [
|
|
|
291
333
|
];
|
|
292
334
|
|
|
293
335
|
// src/components/UI/Title/index.tsx
|
|
294
|
-
import
|
|
336
|
+
import classNames5 from "classnames";
|
|
295
337
|
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
296
338
|
function Title(props) {
|
|
297
339
|
return /* @__PURE__ */ jsx7(
|
|
298
340
|
"h2",
|
|
299
341
|
{
|
|
300
|
-
className:
|
|
342
|
+
className: classNames5(
|
|
301
343
|
"text-start font-semibold text-sm text-zinc-900",
|
|
302
344
|
props.className
|
|
303
345
|
),
|
|
@@ -454,13 +496,13 @@ function BenefitsTable({
|
|
|
454
496
|
var BenefitsTable_default = BenefitsTable;
|
|
455
497
|
|
|
456
498
|
// src/components/UI/Text/index.tsx
|
|
457
|
-
import
|
|
499
|
+
import classNames6 from "classnames";
|
|
458
500
|
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
459
501
|
function Text(props) {
|
|
460
502
|
return /* @__PURE__ */ jsx10(
|
|
461
503
|
"p",
|
|
462
504
|
{
|
|
463
|
-
className:
|
|
505
|
+
className: classNames6(
|
|
464
506
|
"text-start font-normal text-sm text-zinc-900",
|
|
465
507
|
props.className
|
|
466
508
|
),
|
|
@@ -474,14 +516,14 @@ function Text(props) {
|
|
|
474
516
|
var Text_default = Text;
|
|
475
517
|
|
|
476
518
|
// src/components/Iframe/index.tsx
|
|
477
|
-
import
|
|
519
|
+
import classNames7 from "classnames";
|
|
478
520
|
import { TriangleAlert } from "lucide-react";
|
|
479
521
|
import { jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
480
522
|
function Iframe({ url, title, openModal, setOpenModal }) {
|
|
481
523
|
return /* @__PURE__ */ jsxs7(
|
|
482
524
|
"main",
|
|
483
525
|
{
|
|
484
|
-
className:
|
|
526
|
+
className: classNames7(
|
|
485
527
|
"fixed inset-0 flex items-center justify-center z-50 flex-col transition-all shadow",
|
|
486
528
|
{
|
|
487
529
|
"opacity-100 pointer-events-auto": openModal,
|
|
@@ -582,7 +624,7 @@ var SecurityNumberInvalid_default = SecurityNumberInvalid;
|
|
|
582
624
|
import { useCallback as useCallback2, useEffect as useEffect2, useState as useState3 } from "react";
|
|
583
625
|
|
|
584
626
|
// src/components/UI/Link/index.tsx
|
|
585
|
-
import
|
|
627
|
+
import classNames8 from "classnames";
|
|
586
628
|
|
|
587
629
|
// src/utils/getParams.ts
|
|
588
630
|
var getParams = (params) => {
|
|
@@ -599,7 +641,7 @@ function Link(props) {
|
|
|
599
641
|
...props,
|
|
600
642
|
target: "_blank",
|
|
601
643
|
href: typeof props.href === "string" ? props.href : props.href.pathname + getParams(props.href.param),
|
|
602
|
-
className:
|
|
644
|
+
className: classNames8(
|
|
603
645
|
"w-3xs cursor-pointer h-10 rounded-full bg-blue-500 hover:bg-blue-400 text-white text-sm font-semibold transition-colors flex items-center justify-center",
|
|
604
646
|
props.className
|
|
605
647
|
),
|
|
@@ -640,7 +682,7 @@ function SecurityNumberRegitered({ textColor }) {
|
|
|
640
682
|
var SecurityNumberRegitered_default = SecurityNumberRegitered;
|
|
641
683
|
|
|
642
684
|
// src/services/authorization.ts
|
|
643
|
-
import
|
|
685
|
+
import Cookies2 from "js-cookie";
|
|
644
686
|
var GetAuthorization = async ({ clientID }) => {
|
|
645
687
|
const API_URL = import.meta.env.VITE_API_URL;
|
|
646
688
|
const STORE_ID = import.meta.env.VITE_STORE_ID;
|
|
@@ -666,12 +708,12 @@ var GetAuthorization = async ({ clientID }) => {
|
|
|
666
708
|
if (!dataResponse.success) {
|
|
667
709
|
throw new Error(dataResponse.message || "Failed to fetch authorization");
|
|
668
710
|
}
|
|
669
|
-
|
|
711
|
+
Cookies2.set("pbm-token", dataResponse.data.token, {
|
|
670
712
|
expires: parseInt(dataResponse.data.expiresIn, 10) / (60 * 60),
|
|
671
713
|
secure: true,
|
|
672
714
|
sameSite: "Strict"
|
|
673
715
|
});
|
|
674
|
-
|
|
716
|
+
Cookies2.set("pbm-token-refresh", dataResponse.data.refreshToken, {
|
|
675
717
|
secure: true,
|
|
676
718
|
sameSite: "Strict"
|
|
677
719
|
});
|
|
@@ -680,41 +722,6 @@ var GetAuthorization = async ({ clientID }) => {
|
|
|
680
722
|
|
|
681
723
|
// src/PBM.tsx
|
|
682
724
|
import { ArrowRight as ArrowRight2 } from "lucide-react";
|
|
683
|
-
|
|
684
|
-
// src/services/get-product-by-ean.ts
|
|
685
|
-
import Cookies2 from "js-cookie";
|
|
686
|
-
var GetProductByEAN = async ({ PRODUCT_EAN }) => {
|
|
687
|
-
const API_URL = import.meta.env.VITE_API_URL;
|
|
688
|
-
const AUTH_TOKEN = Cookies2.get("pbm-token");
|
|
689
|
-
if (!AUTH_TOKEN) {
|
|
690
|
-
throw new Error("Token is not defined in cookies or is expired");
|
|
691
|
-
}
|
|
692
|
-
const response = await fetch(`${API_URL}/core/products?ean=${PRODUCT_EAN}`, {
|
|
693
|
-
method: "GET",
|
|
694
|
-
headers: {
|
|
695
|
-
Authorization: `Bearer ${AUTH_TOKEN}`,
|
|
696
|
-
"Content-Type": "application/json"
|
|
697
|
-
}
|
|
698
|
-
});
|
|
699
|
-
const dataResponse = await response.json();
|
|
700
|
-
if (!dataResponse.success) {
|
|
701
|
-
throw new Error(dataResponse.message || "Failed to fetch authorization");
|
|
702
|
-
}
|
|
703
|
-
return dataResponse;
|
|
704
|
-
};
|
|
705
|
-
|
|
706
|
-
// src/libs/zustand/useTargetProduct.tsx
|
|
707
|
-
import { create as create2 } from "zustand";
|
|
708
|
-
var initialTargetProductState = {
|
|
709
|
-
targetProductInternal: null
|
|
710
|
-
};
|
|
711
|
-
var createPBMStore2 = (set) => ({
|
|
712
|
-
...initialTargetProductState,
|
|
713
|
-
setTargetProductInternal: (targetProductInternal) => set({ targetProductInternal })
|
|
714
|
-
});
|
|
715
|
-
var useTargetProducts = create2(createPBMStore2);
|
|
716
|
-
|
|
717
|
-
// src/PBM.tsx
|
|
718
725
|
import { Fragment, jsx as jsx15, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
719
726
|
function PBM({
|
|
720
727
|
originalProductPrice,
|
|
@@ -722,38 +729,29 @@ function PBM({
|
|
|
722
729
|
clientID,
|
|
723
730
|
eanProduct
|
|
724
731
|
}) {
|
|
732
|
+
const formatedOriginalProductPrice = Number(
|
|
733
|
+
String(originalProductPrice).replace(",", ".")
|
|
734
|
+
);
|
|
725
735
|
const [loading, setLoading] = useState3(false);
|
|
726
736
|
const { setState, state, setTargetProduct } = usePBMStore();
|
|
727
|
-
const { setTargetProductInternal } = useTargetProducts();
|
|
728
|
-
const handleGetProductByEAN = useCallback2(async () => {
|
|
729
|
-
try {
|
|
730
|
-
const response = await GetProductByEAN({ PRODUCT_EAN: eanProduct });
|
|
731
|
-
if (response.success) {
|
|
732
|
-
const productByEan = response.data.message.products[0];
|
|
733
|
-
setTargetProduct(productByEan);
|
|
734
|
-
setTargetProductInternal(productByEan);
|
|
735
|
-
}
|
|
736
|
-
} catch (error) {
|
|
737
|
-
console.error(error);
|
|
738
|
-
}
|
|
739
|
-
}, [eanProduct, setTargetProduct, setTargetProductInternal]);
|
|
740
737
|
const handleAuthorizationRequest = useCallback2(async () => {
|
|
741
738
|
try {
|
|
742
739
|
const response = await GetAuthorization({ clientID });
|
|
743
|
-
if (response.success
|
|
744
|
-
|
|
740
|
+
if (response.success) {
|
|
741
|
+
setTargetProduct({ ean: eanProduct, quantity: 1 });
|
|
742
|
+
console.log("Authorization successful:", response.data);
|
|
745
743
|
} else {
|
|
746
744
|
console.error("Authorization failed:", response.message);
|
|
747
745
|
}
|
|
748
746
|
} catch (error) {
|
|
749
747
|
console.error("Error fetching authorization:", error);
|
|
750
748
|
}
|
|
751
|
-
}, [clientID,
|
|
749
|
+
}, [clientID, eanProduct]);
|
|
752
750
|
useEffect2(() => {
|
|
753
751
|
handleAuthorizationRequest();
|
|
754
752
|
}, [handleAuthorizationRequest]);
|
|
755
753
|
return /* @__PURE__ */ jsxs10(Container_default, { variant: "main", children: [
|
|
756
|
-
/* @__PURE__ */ jsx15(Header_default, { originalProductPrice:
|
|
754
|
+
/* @__PURE__ */ jsx15(Header_default, { originalProductPrice: formatedOriginalProductPrice || 0 }),
|
|
757
755
|
/* @__PURE__ */ jsxs10(Container_default, { variant: "simple", children: [
|
|
758
756
|
state === "isEmpty" && !loading && /* @__PURE__ */ jsxs10(Fragment, { children: [
|
|
759
757
|
/* @__PURE__ */ jsx15(Form_default, { setLoading }),
|
|
@@ -773,9 +771,9 @@ function PBM({
|
|
|
773
771
|
state === "isEmpty" && loading && /* @__PURE__ */ jsx15(Loading_default, {}),
|
|
774
772
|
state === "isInvalid" && !loading && /* @__PURE__ */ jsx15(SecurityNumberInvalid_default, {}),
|
|
775
773
|
state === "isRegistered" && !loading && /* @__PURE__ */ jsx15(SecurityNumberRegitered_default, {}),
|
|
776
|
-
state === "isActivated" && !loading && /* @__PURE__ */ jsx15(BenefitsTable_default, { originalProductPrice })
|
|
774
|
+
state === "isActivated" && !loading && /* @__PURE__ */ jsx15(BenefitsTable_default, { originalProductPrice: formatedOriginalProductPrice })
|
|
777
775
|
] }),
|
|
778
|
-
/* @__PURE__ */ jsx15(Footer_default, { industryLogo })
|
|
776
|
+
/* @__PURE__ */ jsx15(Footer_default, { industryLogo: industryLogo || void 0 })
|
|
779
777
|
] });
|
|
780
778
|
}
|
|
781
779
|
var PBM_default = PBM;
|