@agrada_digital/pbm 0.0.41 → 0.0.45
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/README.md +5 -5
- package/dist/index.js +4 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/dist-wc/pbm-wc.js +19 -19
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Uma biblioteca de componentes **React** para implementar o modelo **PBM (Pharmacy Benefit Manager)** de forma simples e eficiente.
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -13,19 +13,19 @@ Instale a biblioteca com seu gerenciador de pacotes favorito:
|
|
|
13
13
|
#### NPM
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
npm install @
|
|
16
|
+
npm install @agrada_digital/pbm
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
#### Yarn
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
yarn add @
|
|
22
|
+
yarn add @agrada_digital/pbm
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
#### PNPM
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
pnpm add @
|
|
28
|
+
pnpm add @agrada_digital/pbm
|
|
29
29
|
```
|
|
30
30
|
|
|
31
31
|
---
|
|
@@ -35,7 +35,7 @@ pnpm add @agradadigital/pbm
|
|
|
35
35
|
Inclua via `<script>`:
|
|
36
36
|
|
|
37
37
|
```html
|
|
38
|
-
<script src="https://unpkg.com/@
|
|
38
|
+
<script src="https://unpkg.com/@agrada_digital/pbm/dist-wc/pbm-wc.js"></script>
|
|
39
39
|
|
|
40
40
|
<pbm-component
|
|
41
41
|
originalproductprice="199.9"
|
package/dist/index.js
CHANGED
|
@@ -669,11 +669,10 @@ var SecurityNumberRegitered_default = SecurityNumberRegitered;
|
|
|
669
669
|
|
|
670
670
|
// src/services/authorization.ts
|
|
671
671
|
var import_js_cookie = __toESM(require("js-cookie"));
|
|
672
|
-
var import_meta = {};
|
|
673
672
|
var GetAuthorization = async ({ clientID }) => {
|
|
674
|
-
const API_URL =
|
|
675
|
-
const STORE_ID =
|
|
676
|
-
const STORE_NAME =
|
|
673
|
+
const API_URL = process.env.VITE_API_URL;
|
|
674
|
+
const STORE_ID = process.env.VITE_STORE_ID;
|
|
675
|
+
const STORE_NAME = process.env.VITE_STORE_NAME;
|
|
677
676
|
if (!API_URL) {
|
|
678
677
|
throw new Error("API URL is not defined in environment variables");
|
|
679
678
|
}
|
|
@@ -712,9 +711,8 @@ var import_lucide_react4 = require("lucide-react");
|
|
|
712
711
|
|
|
713
712
|
// src/services/get-product-by-ean.ts
|
|
714
713
|
var import_js_cookie2 = __toESM(require("js-cookie"));
|
|
715
|
-
var import_meta2 = {};
|
|
716
714
|
var GetProductByEAN = async ({ PRODUCT_EAN }) => {
|
|
717
|
-
const API_URL =
|
|
715
|
+
const API_URL = process.env.VITE_API_URL;
|
|
718
716
|
const AUTH_TOKEN = import_js_cookie2.default.get("pbm-token");
|
|
719
717
|
if (!AUTH_TOKEN) {
|
|
720
718
|
throw new Error("Token is not defined in cookies or is expired");
|
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 >\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 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\">\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 ></div>\r\n <p\r\n className={\"text-sm font-semibold text-start text-zinc-900\"}\r\n style={{ color: textColor }}\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 >\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 >\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 >\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=\"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 >\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 >\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 >\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 >\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/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 >\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 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\">\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 ></div>\r\n <p\r\n className={\"text-sm font-semibold text-start text-zinc-900\"}\r\n style={{ color: textColor }}\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 >\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 >\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 >\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=\"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 >\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 >\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 >\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 >\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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -633,9 +633,9 @@ var SecurityNumberRegitered_default = SecurityNumberRegitered;
|
|
|
633
633
|
// src/services/authorization.ts
|
|
634
634
|
import Cookies from "js-cookie";
|
|
635
635
|
var GetAuthorization = async ({ clientID }) => {
|
|
636
|
-
const API_URL =
|
|
637
|
-
const STORE_ID =
|
|
638
|
-
const STORE_NAME =
|
|
636
|
+
const API_URL = process.env.VITE_API_URL;
|
|
637
|
+
const STORE_ID = process.env.VITE_STORE_ID;
|
|
638
|
+
const STORE_NAME = process.env.VITE_STORE_NAME;
|
|
639
639
|
if (!API_URL) {
|
|
640
640
|
throw new Error("API URL is not defined in environment variables");
|
|
641
641
|
}
|
|
@@ -675,7 +675,7 @@ import { ArrowRight as ArrowRight2 } from "lucide-react";
|
|
|
675
675
|
// src/services/get-product-by-ean.ts
|
|
676
676
|
import Cookies2 from "js-cookie";
|
|
677
677
|
var GetProductByEAN = async ({ PRODUCT_EAN }) => {
|
|
678
|
-
const API_URL =
|
|
678
|
+
const API_URL = process.env.VITE_API_URL;
|
|
679
679
|
const AUTH_TOKEN = Cookies2.get("pbm-token");
|
|
680
680
|
if (!AUTH_TOKEN) {
|
|
681
681
|
throw new Error("Token is not defined in cookies or is expired");
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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":["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 >\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 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\">\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 ></div>\r\n <p\r\n className={\"text-sm font-semibold text-start text-zinc-900\"}\r\n style={{ color: textColor }}\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 >\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 >\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 >\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=\"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 >\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 >\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 >\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 >\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":["jsx","jsx","jsxs","classNames","jsx","jsxs","classNames","jsx","jsxs","classNames","jsx","classNames","jsx","jsx","jsxs","jsx","jsxs","classNames","jsx","classNames","jsx","jsxs","useState","jsx","jsxs","useCallback","useEffect","useState","classNames","jsx","classNames","jsx","jsxs","ArrowRight","Cookies","create","createPBMStore","jsx","jsxs","useState","useCallback","useEffect","ArrowRight"]}
|
|
1
|
+
{"version":3,"sources":["../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":["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 >\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 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\">\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 ></div>\r\n <p\r\n className={\"text-sm font-semibold text-start text-zinc-900\"}\r\n style={{ color: textColor }}\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 >\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 >\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 >\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=\"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 >\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 >\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 >\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 >\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":["jsx","jsx","jsxs","classNames","jsx","jsxs","classNames","jsx","jsxs","classNames","jsx","classNames","jsx","jsx","jsxs","jsx","jsxs","classNames","jsx","classNames","jsx","jsxs","useState","jsx","jsxs","useCallback","useEffect","useState","classNames","jsx","classNames","jsx","jsxs","ArrowRight","Cookies","create","createPBMStore","jsx","jsxs","useState","useCallback","useEffect","ArrowRight"]}
|