@agrada_digital/pbm 0.0.48 → 0.0.50
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 +4 -38
- package/dist/index.d.ts +4 -38
- package/dist/index.js +81 -89
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +79 -89
- package/dist/index.mjs.map +1 -1
- package/dist-wc/pbm-wc.js +295 -25
- 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 = process.env.VITE_API_URL;\r\n const STORE_ID = process.env.VITE_STORE_ID;\r\n const STORE_NAME = process.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 = process.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","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 { 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","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;\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 = originalProductPrice.toString().includes(\",\") ? Number(originalProductPrice.toString().replace(\",\", \".\")) : originalProductPrice;\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_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,7 +98,7 @@ 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";
|
|
@@ -128,10 +129,36 @@ var createPBMStore = (set) => ({
|
|
|
128
129
|
var usePBMStore = create(createPBMStore);
|
|
129
130
|
var pbmStore = createStore(createPBMStore);
|
|
130
131
|
|
|
132
|
+
// src/services/validate-document.ts
|
|
133
|
+
import Cookies from "js-cookie";
|
|
134
|
+
var ValidateDocument = async ({ document, products }) => {
|
|
135
|
+
const API_URL = import.meta.env.VITE_API_URL;
|
|
136
|
+
if (!API_URL) {
|
|
137
|
+
throw new Error("API URL is not defined in environment variables");
|
|
138
|
+
}
|
|
139
|
+
const AUTH_TOKEN = Cookies.get("pbm-token");
|
|
140
|
+
if (!AUTH_TOKEN) {
|
|
141
|
+
throw new Error("Token is not defined in cookies or is expired");
|
|
142
|
+
}
|
|
143
|
+
const response = await fetch(`${API_URL}/transactions/validate`, {
|
|
144
|
+
method: "POST",
|
|
145
|
+
headers: {
|
|
146
|
+
Authorization: `Bearer ${AUTH_TOKEN}`,
|
|
147
|
+
"Content-Type": "application/json"
|
|
148
|
+
},
|
|
149
|
+
body: JSON.stringify({ document, products })
|
|
150
|
+
});
|
|
151
|
+
const dataResponse = await response.json();
|
|
152
|
+
if (!dataResponse.success) {
|
|
153
|
+
throw new Error(dataResponse.message || "Failed to fetch document validation");
|
|
154
|
+
}
|
|
155
|
+
return dataResponse;
|
|
156
|
+
};
|
|
157
|
+
|
|
131
158
|
// src/components/Form/index.tsx
|
|
132
159
|
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
133
160
|
function Form({ setLoading }) {
|
|
134
|
-
const { setSecurityNumber, setState, securityNumber } = usePBMStore();
|
|
161
|
+
const { setSecurityNumber, setState, securityNumber, targetProduct } = usePBMStore();
|
|
135
162
|
const {
|
|
136
163
|
handleSubmit,
|
|
137
164
|
register,
|
|
@@ -143,28 +170,37 @@ function Form({ setLoading }) {
|
|
|
143
170
|
securityNumber: securityNumber || ""
|
|
144
171
|
}
|
|
145
172
|
});
|
|
146
|
-
const onSubmitDefault = (values) => {
|
|
173
|
+
const onSubmitDefault = async (values) => {
|
|
147
174
|
setLoading(true);
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
175
|
+
try {
|
|
176
|
+
if (targetProduct === null) {
|
|
177
|
+
console.error("Product is not defined!");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const response = await ValidateDocument({
|
|
181
|
+
document: values.securityNumber.replace(/\D/g, ""),
|
|
182
|
+
products: [{ ean: targetProduct.ean, quantity: targetProduct.quantity }]
|
|
183
|
+
});
|
|
184
|
+
if (response.success) {
|
|
185
|
+
const status = {
|
|
186
|
+
"active": "isActivated",
|
|
187
|
+
"nonexistent": "isInvalid"
|
|
188
|
+
};
|
|
189
|
+
setSecurityNumber(values.securityNumber);
|
|
190
|
+
setState(status[response.data.process_platform.status]);
|
|
191
|
+
}
|
|
192
|
+
} catch (error) {
|
|
193
|
+
console.error("Error validating document:", error);
|
|
194
|
+
} finally {
|
|
160
195
|
setLoading(false);
|
|
161
|
-
}
|
|
196
|
+
}
|
|
197
|
+
;
|
|
162
198
|
};
|
|
163
199
|
return /* @__PURE__ */ jsxs3(
|
|
164
200
|
"form",
|
|
165
201
|
{
|
|
166
202
|
onSubmit: handleSubmit(onSubmitDefault),
|
|
167
|
-
className:
|
|
203
|
+
className: classNames3(
|
|
168
204
|
"w-full h-auto flex items-center justify-center mb-0 transition-all duration-150",
|
|
169
205
|
{ "mb-4": errors.securityNumber }
|
|
170
206
|
),
|
|
@@ -181,7 +217,7 @@ function Form({ setLoading }) {
|
|
|
181
217
|
"input",
|
|
182
218
|
{
|
|
183
219
|
type: "text",
|
|
184
|
-
className:
|
|
220
|
+
className: classNames3(
|
|
185
221
|
"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
222
|
{ "outline outline-red-600": errors.securityNumber }
|
|
187
223
|
),
|
|
@@ -245,14 +281,14 @@ function Loading({ textColor }) {
|
|
|
245
281
|
var Loading_default = Loading;
|
|
246
282
|
|
|
247
283
|
// src/components/UI/Button/index.tsx
|
|
248
|
-
import
|
|
284
|
+
import classNames4 from "classnames";
|
|
249
285
|
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
250
286
|
function Button(props) {
|
|
251
287
|
return /* @__PURE__ */ jsx6(
|
|
252
288
|
"button",
|
|
253
289
|
{
|
|
254
290
|
...props,
|
|
255
|
-
className:
|
|
291
|
+
className: classNames4(
|
|
256
292
|
"w-3xs cursor-pointer h-10 rounded-full bg-blue-500 hover:bg-blue-400 text-white text-sm font-semibold transition-colors",
|
|
257
293
|
props.className
|
|
258
294
|
),
|
|
@@ -291,13 +327,13 @@ var BENEFITS_ITEMS = [
|
|
|
291
327
|
];
|
|
292
328
|
|
|
293
329
|
// src/components/UI/Title/index.tsx
|
|
294
|
-
import
|
|
330
|
+
import classNames5 from "classnames";
|
|
295
331
|
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
296
332
|
function Title(props) {
|
|
297
333
|
return /* @__PURE__ */ jsx7(
|
|
298
334
|
"h2",
|
|
299
335
|
{
|
|
300
|
-
className:
|
|
336
|
+
className: classNames5(
|
|
301
337
|
"text-start font-semibold text-sm text-zinc-900",
|
|
302
338
|
props.className
|
|
303
339
|
),
|
|
@@ -454,13 +490,13 @@ function BenefitsTable({
|
|
|
454
490
|
var BenefitsTable_default = BenefitsTable;
|
|
455
491
|
|
|
456
492
|
// src/components/UI/Text/index.tsx
|
|
457
|
-
import
|
|
493
|
+
import classNames6 from "classnames";
|
|
458
494
|
import { jsx as jsx10 } from "react/jsx-runtime";
|
|
459
495
|
function Text(props) {
|
|
460
496
|
return /* @__PURE__ */ jsx10(
|
|
461
497
|
"p",
|
|
462
498
|
{
|
|
463
|
-
className:
|
|
499
|
+
className: classNames6(
|
|
464
500
|
"text-start font-normal text-sm text-zinc-900",
|
|
465
501
|
props.className
|
|
466
502
|
),
|
|
@@ -474,14 +510,14 @@ function Text(props) {
|
|
|
474
510
|
var Text_default = Text;
|
|
475
511
|
|
|
476
512
|
// src/components/Iframe/index.tsx
|
|
477
|
-
import
|
|
513
|
+
import classNames7 from "classnames";
|
|
478
514
|
import { TriangleAlert } from "lucide-react";
|
|
479
515
|
import { jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
480
516
|
function Iframe({ url, title, openModal, setOpenModal }) {
|
|
481
517
|
return /* @__PURE__ */ jsxs7(
|
|
482
518
|
"main",
|
|
483
519
|
{
|
|
484
|
-
className:
|
|
520
|
+
className: classNames7(
|
|
485
521
|
"fixed inset-0 flex items-center justify-center z-50 flex-col transition-all shadow",
|
|
486
522
|
{
|
|
487
523
|
"opacity-100 pointer-events-auto": openModal,
|
|
@@ -582,7 +618,7 @@ var SecurityNumberInvalid_default = SecurityNumberInvalid;
|
|
|
582
618
|
import { useCallback as useCallback2, useEffect as useEffect2, useState as useState3 } from "react";
|
|
583
619
|
|
|
584
620
|
// src/components/UI/Link/index.tsx
|
|
585
|
-
import
|
|
621
|
+
import classNames8 from "classnames";
|
|
586
622
|
|
|
587
623
|
// src/utils/getParams.ts
|
|
588
624
|
var getParams = (params) => {
|
|
@@ -599,7 +635,7 @@ function Link(props) {
|
|
|
599
635
|
...props,
|
|
600
636
|
target: "_blank",
|
|
601
637
|
href: typeof props.href === "string" ? props.href : props.href.pathname + getParams(props.href.param),
|
|
602
|
-
className:
|
|
638
|
+
className: classNames8(
|
|
603
639
|
"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
640
|
props.className
|
|
605
641
|
),
|
|
@@ -640,11 +676,11 @@ function SecurityNumberRegitered({ textColor }) {
|
|
|
640
676
|
var SecurityNumberRegitered_default = SecurityNumberRegitered;
|
|
641
677
|
|
|
642
678
|
// src/services/authorization.ts
|
|
643
|
-
import
|
|
679
|
+
import Cookies2 from "js-cookie";
|
|
644
680
|
var GetAuthorization = async ({ clientID }) => {
|
|
645
|
-
const API_URL =
|
|
646
|
-
const STORE_ID =
|
|
647
|
-
const STORE_NAME =
|
|
681
|
+
const API_URL = import.meta.env.VITE_API_URL;
|
|
682
|
+
const STORE_ID = import.meta.env.VITE_STORE_ID;
|
|
683
|
+
const STORE_NAME = import.meta.env.VITE_STORE_NAME;
|
|
648
684
|
if (!API_URL) {
|
|
649
685
|
throw new Error("API URL is not defined in environment variables");
|
|
650
686
|
}
|
|
@@ -666,12 +702,12 @@ var GetAuthorization = async ({ clientID }) => {
|
|
|
666
702
|
if (!dataResponse.success) {
|
|
667
703
|
throw new Error(dataResponse.message || "Failed to fetch authorization");
|
|
668
704
|
}
|
|
669
|
-
|
|
705
|
+
Cookies2.set("pbm-token", dataResponse.data.token, {
|
|
670
706
|
expires: parseInt(dataResponse.data.expiresIn, 10) / (60 * 60),
|
|
671
707
|
secure: true,
|
|
672
708
|
sameSite: "Strict"
|
|
673
709
|
});
|
|
674
|
-
|
|
710
|
+
Cookies2.set("pbm-token-refresh", dataResponse.data.refreshToken, {
|
|
675
711
|
secure: true,
|
|
676
712
|
sameSite: "Strict"
|
|
677
713
|
});
|
|
@@ -680,41 +716,6 @@ var GetAuthorization = async ({ clientID }) => {
|
|
|
680
716
|
|
|
681
717
|
// src/PBM.tsx
|
|
682
718
|
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 = process.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
719
|
import { Fragment, jsx as jsx15, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
719
720
|
function PBM({
|
|
720
721
|
originalProductPrice,
|
|
@@ -722,38 +723,27 @@ function PBM({
|
|
|
722
723
|
clientID,
|
|
723
724
|
eanProduct
|
|
724
725
|
}) {
|
|
726
|
+
const formatedOriginalProductPrice = originalProductPrice.toString().includes(",") ? Number(originalProductPrice.toString().replace(",", ".")) : originalProductPrice;
|
|
725
727
|
const [loading, setLoading] = useState3(false);
|
|
726
728
|
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
729
|
const handleAuthorizationRequest = useCallback2(async () => {
|
|
741
730
|
try {
|
|
742
731
|
const response = await GetAuthorization({ clientID });
|
|
743
|
-
if (response.success
|
|
744
|
-
|
|
732
|
+
if (response.success) {
|
|
733
|
+
setTargetProduct({ ean: eanProduct, quantity: 1 });
|
|
734
|
+
console.log("Authorization successful:", response.data);
|
|
745
735
|
} else {
|
|
746
736
|
console.error("Authorization failed:", response.message);
|
|
747
737
|
}
|
|
748
738
|
} catch (error) {
|
|
749
739
|
console.error("Error fetching authorization:", error);
|
|
750
740
|
}
|
|
751
|
-
}, [clientID,
|
|
741
|
+
}, [clientID, eanProduct]);
|
|
752
742
|
useEffect2(() => {
|
|
753
743
|
handleAuthorizationRequest();
|
|
754
744
|
}, [handleAuthorizationRequest]);
|
|
755
745
|
return /* @__PURE__ */ jsxs10(Container_default, { variant: "main", children: [
|
|
756
|
-
/* @__PURE__ */ jsx15(Header_default, { originalProductPrice:
|
|
746
|
+
/* @__PURE__ */ jsx15(Header_default, { originalProductPrice: formatedOriginalProductPrice || 0 }),
|
|
757
747
|
/* @__PURE__ */ jsxs10(Container_default, { variant: "simple", children: [
|
|
758
748
|
state === "isEmpty" && !loading && /* @__PURE__ */ jsxs10(Fragment, { children: [
|
|
759
749
|
/* @__PURE__ */ jsx15(Form_default, { setLoading }),
|
|
@@ -773,9 +763,9 @@ function PBM({
|
|
|
773
763
|
state === "isEmpty" && loading && /* @__PURE__ */ jsx15(Loading_default, {}),
|
|
774
764
|
state === "isInvalid" && !loading && /* @__PURE__ */ jsx15(SecurityNumberInvalid_default, {}),
|
|
775
765
|
state === "isRegistered" && !loading && /* @__PURE__ */ jsx15(SecurityNumberRegitered_default, {}),
|
|
776
|
-
state === "isActivated" && !loading && /* @__PURE__ */ jsx15(BenefitsTable_default, { originalProductPrice })
|
|
766
|
+
state === "isActivated" && !loading && /* @__PURE__ */ jsx15(BenefitsTable_default, { originalProductPrice: formatedOriginalProductPrice })
|
|
777
767
|
] }),
|
|
778
|
-
/* @__PURE__ */ jsx15(Footer_default, { industryLogo })
|
|
768
|
+
/* @__PURE__ */ jsx15(Footer_default, { industryLogo: industryLogo || void 0 })
|
|
779
769
|
] });
|
|
780
770
|
}
|
|
781
771
|
var PBM_default = PBM;
|