@credithub/harlan-components 1.56.0 → 1.57.0

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.
@@ -37,14 +37,60 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  import { formatMoney } from '../../utils/number';
38
38
  import { formatDocument } from '../../utils/string';
39
39
  import XPathUtils from '../../utils/xpath';
40
- import React, { memo, useContext } from 'react';
40
+ import React, { memo, useContext, useState, useEffect } from 'react';
41
41
  import AddItemField from '../common/addItem';
42
42
  import Button from '../common/button';
43
43
  import { ResultContent } from '../interface/result';
44
44
  import { WebService } from '../webservice';
45
45
  import { openFormThenRedirect } from '../../utils/protestosp';
46
+ // Throttling mechanism for API requests
47
+ var activeRequests = 0;
48
+ var MAX_CONCURRENT_REQUESTS = 2;
49
+ var requestQueue = [];
50
+ var processQueue = function () {
51
+ if (requestQueue.length === 0 || activeRequests >= MAX_CONCURRENT_REQUESTS)
52
+ return;
53
+ // Process next request in queue
54
+ var nextRequest = requestQueue.shift();
55
+ if (nextRequest) {
56
+ activeRequests++;
57
+ nextRequest();
58
+ }
59
+ };
60
+ // Elegant three-dot loader component
61
+ var ThreeDotsLoader = function () {
62
+ // CSS for the loader container
63
+ var loaderStyle = {
64
+ display: 'inline-flex',
65
+ alignItems: 'center',
66
+ marginLeft: '5px',
67
+ height: '10px',
68
+ };
69
+ // CSS for each dot
70
+ var dotStyle = function (delay) { return ({
71
+ width: '4px',
72
+ height: '4px',
73
+ margin: '0 2px',
74
+ borderRadius: '50%',
75
+ background: '#aaa',
76
+ opacity: 0.7,
77
+ animation: 'blink 1.4s infinite',
78
+ animationDelay: "".concat(delay, "s"),
79
+ }); };
80
+ // CSS animation keyframes defined as a style block
81
+ var keyframes = "\n @keyframes blink {\n 0% { opacity: 0.2; }\n 20% { opacity: 0.8; }\n 100% { opacity: 0.2; }\n }\n ";
82
+ return (React.createElement("span", { style: loaderStyle },
83
+ React.createElement("style", null, keyframes),
84
+ React.createElement("span", { style: dotStyle(0) }),
85
+ React.createElement("span", { style: dotStyle(0.2) }),
86
+ React.createElement("span", { style: dotStyle(0.4) })));
87
+ };
46
88
  export var ProtestoItem = memo(function (_a) {
47
89
  var protesto = _a.protesto;
90
+ var client = useContext(WebService);
91
+ var _b = useState(null), quemApresentou = _b[0], setQuemApresentou = _b[1];
92
+ var _c = useState(false), loading = _c[0], setLoading = _c[1];
93
+ var _d = useState(false), queued = _d[0], setQueued = _d[1];
48
94
  var getField = function (path, formatter) {
49
95
  var value = XPathUtils.select("string(".concat(path, ")"), protesto);
50
96
  return formatter ? formatter(value) : value;
@@ -52,8 +98,92 @@ export var ProtestoItem = memo(function (_a) {
52
98
  var formatBooleanField = function (value) {
53
99
  return value === 'true' ? 'Sim' : 'Não';
54
100
  };
101
+ // Function to fetch Quem Apresentou data
102
+ var fetchQuemApresentou = function (nm_chave) { return __awaiter(void 0, void 0, void 0, function () {
103
+ var response, error_1;
104
+ return __generator(this, function (_a) {
105
+ switch (_a.label) {
106
+ case 0:
107
+ if (!nm_chave)
108
+ return [2 /*return*/];
109
+ setLoading(true);
110
+ _a.label = 1;
111
+ case 1:
112
+ _a.trys.push([1, 4, 5, 6]);
113
+ return [4 /*yield*/, client.request("SELECT FROM 'PDFPROTESTO'.'AI'", { nm_chave: nm_chave })];
114
+ case 2: return [4 /*yield*/, (_a.sent()).json()];
115
+ case 3:
116
+ response = _a.sent();
117
+ if (response && response['Quem Apresentou']) {
118
+ setQuemApresentou(response['Quem Apresentou']);
119
+ }
120
+ return [3 /*break*/, 6];
121
+ case 4:
122
+ error_1 = _a.sent();
123
+ console.error('Error fetching Quem Apresentou:', error_1);
124
+ return [3 /*break*/, 6];
125
+ case 5:
126
+ setLoading(false);
127
+ activeRequests--;
128
+ processQueue(); // Process next request in queue
129
+ return [7 /*endfinally*/];
130
+ case 6: return [2 /*return*/];
131
+ }
132
+ });
133
+ }); };
134
+ // Function to queue or execute the fetch request
135
+ var queueOrExecuteFetch = function (nm_chave) {
136
+ var executeRequest = function () {
137
+ fetchQuemApresentou(nm_chave);
138
+ };
139
+ if (activeRequests < MAX_CONCURRENT_REQUESTS) {
140
+ // Execute immediately if under threshold
141
+ activeRequests++;
142
+ executeRequest();
143
+ }
144
+ else {
145
+ // Queue the request
146
+ setQueued(true);
147
+ requestQueue.push(function () {
148
+ setQueued(false);
149
+ executeRequest();
150
+ });
151
+ }
152
+ };
153
+ useEffect(function () {
154
+ // Check if nomeCedente is empty
155
+ var nomeCedente = getField('./nomeCedente');
156
+ if (nomeCedente && nomeCedente.trim() !== '')
157
+ return;
158
+ // Get nm_chave and queue/execute the request
159
+ var nm_chave = getField('./nm_chave');
160
+ if (nm_chave) {
161
+ queueOrExecuteFetch(nm_chave);
162
+ }
163
+ // Cleanup function
164
+ return function () {
165
+ // If this component unmounts while in queue, try to remove it from queue
166
+ var queueIndex = requestQueue.findIndex(function (req) {
167
+ return req.toString().includes(nm_chave);
168
+ });
169
+ if (queueIndex !== -1) {
170
+ requestQueue.splice(queueIndex, 1);
171
+ }
172
+ };
173
+ }, []);
174
+ // Get the display value for Quem Protestou field
175
+ var getQuemProtestouDisplay = function () {
176
+ var baseValue = quemApresentou || getField('./nomeCedente');
177
+ if (loading || queued) {
178
+ return React.createElement(React.Fragment, null,
179
+ baseValue || '',
180
+ " ",
181
+ React.createElement(ThreeDotsLoader, null));
182
+ }
183
+ return baseValue;
184
+ };
55
185
  return (React.createElement(ResultContent, { print: "repeat(7, 1fr)", desktop: "repeat(8, 1fr)", tablet: "repeat(4, 1fr)", mobile: "repeat(2, 1fr)" },
56
- React.createElement(AddItemField, { name: "Quem Protestou", value: getField('./nomeCedente') }),
186
+ React.createElement(AddItemField, { name: "Quem Protestou", value: getQuemProtestouDisplay() }),
57
187
  React.createElement(AddItemField, { name: "Atrav\u00E9s De", value: getField('./nomeApresentante') }),
58
188
  React.createElement(AddItemField, { name: "CPF/CNPJ Protestado", value: formatDocument(getField('./cpfCnpj')) }),
59
189
  React.createElement(AddItemField, { name: "Data Do Protesto", value: getField('./dataProtesto') }),