@synchat/webchat 0.0.19 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2,18 +2,18 @@
2
2
 
3
3
  var material = require('@mui/material');
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
- var react = require('react');
6
- var CloseIcon = require('@mui/icons-material/Close');
7
5
  var ChatIcon = require('@mui/icons-material/Chat');
6
+ var CloseIcon = require('@mui/icons-material/Close');
8
7
  var ScheduleIcon = require('@mui/icons-material/Schedule');
8
+ var react = require('react');
9
9
 
10
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
- var CloseIcon__default = /*#__PURE__*/_interopDefault(CloseIcon);
13
12
  var ChatIcon__default = /*#__PURE__*/_interopDefault(ChatIcon);
13
+ var CloseIcon__default = /*#__PURE__*/_interopDefault(CloseIcon);
14
14
  var ScheduleIcon__default = /*#__PURE__*/_interopDefault(ScheduleIcon);
15
15
 
16
- // src/lib/components/button/styles.tsx
16
+ // src/lib/components/atoms/button/styles.tsx
17
17
  var AtomButton = material.styled(material.Button, {
18
18
  shouldForwardProp: (prop) => prop !== "buttonType"
19
19
  })(({ buttonType = "default" }) => {
@@ -41,6 +41,251 @@ var ChatButton = ({ children = "Chat", onClick, className, disabled }) => {
41
41
  }
42
42
  );
43
43
  };
44
+ var FabIconButton = ({
45
+ bgColor,
46
+ hoverColor,
47
+ children,
48
+ sx,
49
+ ...rest
50
+ }) => /* @__PURE__ */ jsxRuntime.jsx(
51
+ material.IconButton,
52
+ {
53
+ size: "large",
54
+ sx: {
55
+ width: 56,
56
+ height: 56,
57
+ bgcolor: bgColor,
58
+ color: "white",
59
+ "&:hover": { bgcolor: hoverColor },
60
+ boxShadow: 2,
61
+ ...sx
62
+ },
63
+ ...rest,
64
+ children
65
+ }
66
+ );
67
+ var Spinner = ({ size = 32 }) => /* @__PURE__ */ jsxRuntime.jsx(material.Box, { display: "flex", justifyContent: "center", py: 3, children: /* @__PURE__ */ jsxRuntime.jsx(material.CircularProgress, { size }) });
68
+ var FabTrigger = ({
69
+ onClick,
70
+ bgColor,
71
+ hoverColor
72
+ }) => /* @__PURE__ */ jsxRuntime.jsx(
73
+ FabIconButton,
74
+ {
75
+ onClick,
76
+ bgColor,
77
+ hoverColor,
78
+ sx: { position: "fixed", bottom: 20, right: 20 },
79
+ children: /* @__PURE__ */ jsxRuntime.jsx(ChatIcon__default.default, {})
80
+ }
81
+ );
82
+ var PanelHeader = ({ title, onClose }) => /* @__PURE__ */ jsxRuntime.jsxs(
83
+ material.Box,
84
+ {
85
+ sx: {
86
+ display: "flex",
87
+ alignItems: "center",
88
+ justifyContent: "space-between",
89
+ p: 1.5,
90
+ borderBottom: 1,
91
+ borderColor: "divider"
92
+ },
93
+ children: [
94
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "subtitle1", fontWeight: 600, children: title }),
95
+ /* @__PURE__ */ jsxRuntime.jsx(material.IconButton, { size: "small", onClick: onClose, "aria-label": "Fechar", children: /* @__PURE__ */ jsxRuntime.jsx(CloseIcon__default.default, {}) })
96
+ ]
97
+ }
98
+ );
99
+ var OutOfHoursCard = ({
100
+ message,
101
+ bgColor
102
+ }) => /* @__PURE__ */ jsxRuntime.jsxs(
103
+ material.Box,
104
+ {
105
+ sx: {
106
+ textAlign: "center",
107
+ py: 2,
108
+ px: 1,
109
+ bgcolor: bgColor,
110
+ borderRadius: 1,
111
+ color: "white"
112
+ },
113
+ children: [
114
+ /* @__PURE__ */ jsxRuntime.jsx(ScheduleIcon__default.default, { sx: { fontSize: 48, opacity: 0.9, mb: 1 } }),
115
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", sx: { fontWeight: 500, mb: 1 }, children: "Fora do hor\xE1rio de atendimento" }),
116
+ /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", sx: { opacity: 0.95 }, children: message })
117
+ ]
118
+ }
119
+ );
120
+ var ChatForm = ({
121
+ value,
122
+ onChange,
123
+ onSubmit,
124
+ submitting,
125
+ submitLabel = "Iniciar chat"
126
+ }) => /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit, children: /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { display: "flex", flexDirection: "column", gap: 2, children: [
127
+ /* @__PURE__ */ jsxRuntime.jsx(
128
+ material.TextField,
129
+ {
130
+ label: "Nome",
131
+ value: value.name,
132
+ onChange: (e) => onChange({ ...value, name: e.target.value }),
133
+ required: true,
134
+ fullWidth: true,
135
+ size: "small"
136
+ }
137
+ ),
138
+ /* @__PURE__ */ jsxRuntime.jsx(
139
+ material.TextField,
140
+ {
141
+ label: "E-mail",
142
+ type: "email",
143
+ value: value.email,
144
+ onChange: (e) => onChange({ ...value, email: e.target.value }),
145
+ fullWidth: true,
146
+ size: "small"
147
+ }
148
+ ),
149
+ /* @__PURE__ */ jsxRuntime.jsx(
150
+ material.TextField,
151
+ {
152
+ label: "Telefone",
153
+ value: value.phone,
154
+ onChange: (e) => onChange({ ...value, phone: e.target.value }),
155
+ fullWidth: true,
156
+ size: "small"
157
+ }
158
+ ),
159
+ /* @__PURE__ */ jsxRuntime.jsx(
160
+ material.TextField,
161
+ {
162
+ label: "Mensagem",
163
+ value: value.message,
164
+ onChange: (e) => onChange({ ...value, message: e.target.value }),
165
+ multiline: true,
166
+ rows: 3,
167
+ fullWidth: true,
168
+ size: "small"
169
+ }
170
+ ),
171
+ /* @__PURE__ */ jsxRuntime.jsx(
172
+ material.Button,
173
+ {
174
+ type: "submit",
175
+ variant: "contained",
176
+ disabled: submitting || !value.name.trim(),
177
+ fullWidth: true,
178
+ children: submitting ? "Enviando\u2026" : submitLabel
179
+ }
180
+ )
181
+ ] }) });
182
+
183
+ // src/lib/components/organisms/webchat/constants.ts
184
+ var DEFAULT_PRIMARY_COLOR = "#0D9488";
185
+ var DEFAULT_PRIMARY_COLOR_HOVER = "#0F766E";
186
+ var DEFAULT_API_BASE_URL = "https://api.synchat.com.br";
187
+ var ChatPanelContent = ({
188
+ state,
189
+ errorMessage,
190
+ outOfHoursMessage,
191
+ outOfHoursBgColor,
192
+ formValue,
193
+ onFormChange,
194
+ onFormSubmit,
195
+ submitting
196
+ }) => /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { p: 2, flex: 1 }, children: [
197
+ state === "loading" && /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}),
198
+ state === "error" && errorMessage && /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { color: "error", variant: "body2", children: errorMessage }),
199
+ state === "inactive" && /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { color: "text.secondary", variant: "body2", children: "Este canal n\xE3o est\xE1 dispon\xEDvel no momento." }),
200
+ state === "outOfHours" && /* @__PURE__ */ jsxRuntime.jsx(OutOfHoursCard, { message: outOfHoursMessage, bgColor: outOfHoursBgColor }),
201
+ state === "form" && /* @__PURE__ */ jsxRuntime.jsx(
202
+ ChatForm,
203
+ {
204
+ value: formValue,
205
+ onChange: onFormChange,
206
+ onSubmit: onFormSubmit,
207
+ submitting
208
+ }
209
+ ),
210
+ state === "submitted" && /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { color: "text.secondary", variant: "body2", sx: { py: 2 }, children: "Sua mensagem foi enviada. Em breve um atendente responder\xE1." })
211
+ ] });
212
+ var ChatPanel = ({
213
+ open,
214
+ title,
215
+ onClose,
216
+ contentState,
217
+ errorMessage,
218
+ outOfHoursMessage,
219
+ primaryColor,
220
+ formValue,
221
+ onFormChange,
222
+ onFormSubmit,
223
+ submitting
224
+ }) => {
225
+ if (!open) return null;
226
+ return /* @__PURE__ */ jsxRuntime.jsxs(
227
+ material.Box,
228
+ {
229
+ sx: {
230
+ position: "fixed",
231
+ bottom: 90,
232
+ right: 20,
233
+ width: 380,
234
+ maxWidth: "calc(100vw - 40px)",
235
+ maxHeight: "calc(100vh - 120px)",
236
+ overflow: "auto",
237
+ bgcolor: "background.paper",
238
+ borderRadius: 2,
239
+ boxShadow: 6,
240
+ zIndex: 1300,
241
+ display: "flex",
242
+ flexDirection: "column"
243
+ },
244
+ children: [
245
+ /* @__PURE__ */ jsxRuntime.jsx(PanelHeader, { title, onClose }),
246
+ /* @__PURE__ */ jsxRuntime.jsx(
247
+ ChatPanelContent,
248
+ {
249
+ state: contentState,
250
+ errorMessage,
251
+ outOfHoursMessage,
252
+ outOfHoursBgColor: primaryColor,
253
+ formValue,
254
+ onFormChange,
255
+ onFormSubmit,
256
+ submitting
257
+ }
258
+ )
259
+ ]
260
+ }
261
+ );
262
+ };
263
+ var WebChatLayout = (props) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
264
+ /* @__PURE__ */ jsxRuntime.jsx(
265
+ FabTrigger,
266
+ {
267
+ onClick: props.onToggleOpen,
268
+ bgColor: props.primaryColor,
269
+ hoverColor: props.hoverColor
270
+ }
271
+ ),
272
+ /* @__PURE__ */ jsxRuntime.jsx(
273
+ ChatPanel,
274
+ {
275
+ open: props.open,
276
+ title: props.panelTitle,
277
+ onClose: props.onToggleOpen,
278
+ contentState: props.contentState,
279
+ errorMessage: props.errorMessage,
280
+ outOfHoursMessage: props.outOfHoursMessage,
281
+ primaryColor: props.primaryColor,
282
+ formValue: props.formValue,
283
+ onFormChange: props.onFormChange,
284
+ onFormSubmit: props.onFormSubmit,
285
+ submitting: props.submitting
286
+ }
287
+ )
288
+ ] });
44
289
  var DAY_MAP = {
45
290
  0: "SUNDAY",
46
291
  1: "MONDAY",
@@ -82,12 +327,30 @@ function formatScheduleMessage(config) {
82
327
  const weEnd = config.schedule.weekendEnd ?? "13:00";
83
328
  return `Nosso hor\xE1rio de atendimento \xE9 de segunda \xE0 sexta-feira das ${wdStart}h \xE0s ${wdEnd}h. S\xE1bados, domingos e feriados das ${weStart}h \xE0s ${weEnd}h.`;
84
329
  }
85
- var WebChat = ({
86
- secret,
330
+ function parseColor(color) {
331
+ if (!color || !color.trim()) {
332
+ return { main: DEFAULT_PRIMARY_COLOR, hover: DEFAULT_PRIMARY_COLOR_HOVER };
333
+ }
334
+ const c = color.trim();
335
+ if (c.startsWith("#") && c.length === 7) {
336
+ const hex = c.slice(1);
337
+ const r = Math.max(0, parseInt(hex.slice(0, 2), 16) - 18);
338
+ const g = Math.max(0, parseInt(hex.slice(2, 4), 16) - 18);
339
+ const b = Math.max(0, parseInt(hex.slice(4, 6), 16) - 18);
340
+ const hover = `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
341
+ return { main: c, hover };
342
+ }
343
+ return { main: c, hover: c };
344
+ }
345
+ var WebChatPage = ({
346
+ token,
87
347
  apiBaseUrl,
348
+ primaryColor,
88
349
  onStartChat,
89
350
  outOfHoursMessage
90
351
  }) => {
352
+ const baseUrl = apiBaseUrl?.trim() || DEFAULT_API_BASE_URL;
353
+ const colors = parseColor(primaryColor);
91
354
  const [config, setConfig] = react.useState(null);
92
355
  const [loading, setLoading] = react.useState(true);
93
356
  const [error, setError] = react.useState(null);
@@ -101,12 +364,12 @@ var WebChat = ({
101
364
  message: ""
102
365
  });
103
366
  const fetchConfig = react.useCallback(async () => {
104
- if (!secret || !apiBaseUrl) return;
367
+ if (!token) return;
105
368
  setLoading(true);
106
369
  setError(null);
107
370
  try {
108
- const base = apiBaseUrl.replace(/\/$/, "");
109
- const res = await fetch(`${base}/channel/webchat/${encodeURIComponent(secret)}`);
371
+ const base = baseUrl.replace(/\/$/, "");
372
+ const res = await fetch(`${base}/channel/webchat/${encodeURIComponent(token)}`);
110
373
  if (!res.ok) {
111
374
  setError("Canal n\xE3o encontrado.");
112
375
  setConfig(null);
@@ -120,7 +383,7 @@ var WebChat = ({
120
383
  } finally {
121
384
  setLoading(false);
122
385
  }
123
- }, [secret, apiBaseUrl]);
386
+ }, [token, baseUrl]);
124
387
  react.useEffect(() => {
125
388
  fetchConfig();
126
389
  }, [fetchConfig]);
@@ -128,11 +391,14 @@ var WebChat = ({
128
391
  const outsideHours = config && config.restrictBySchedule && !isWithinSchedule(config);
129
392
  const showOutOfHours = isActive && outsideHours;
130
393
  const showForm = isActive && !outsideHours;
394
+ const contentState = loading ? "loading" : error ? "error" : config && !isActive ? "inactive" : showOutOfHours ? "outOfHours" : showForm && !submitted ? "form" : "submitted";
131
395
  const handleSubmit = async (e) => {
132
396
  e.preventDefault();
133
397
  if (submitting || !form.name.trim()) return;
134
398
  if (!onStartChat) {
135
- setError("In\xEDcio de conversa ser\xE1 via WebSocket. Configure onStartChat no componente.");
399
+ setError(
400
+ "In\xEDcio de conversa ser\xE1 via WebSocket. Configure onStartChat no componente."
401
+ );
136
402
  return;
137
403
  }
138
404
  setSubmitting(true);
@@ -141,7 +407,8 @@ var WebChat = ({
141
407
  name: form.name.trim(),
142
408
  email: form.email.trim(),
143
409
  phone: form.phone.trim(),
144
- message: form.message.trim()
410
+ message: form.message.trim(),
411
+ ...config?.businessId && { businessId: config.businessId }
145
412
  });
146
413
  setSubmitted(true);
147
414
  } catch (err) {
@@ -150,150 +417,27 @@ var WebChat = ({
150
417
  setSubmitting(false);
151
418
  }
152
419
  };
153
- if (!secret) return null;
154
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
155
- /* @__PURE__ */ jsxRuntime.jsx(
156
- material.IconButton,
157
- {
158
- onClick: () => setOpen((o) => !o),
159
- sx: {
160
- position: "fixed",
161
- bottom: 20,
162
- right: 20,
163
- width: 56,
164
- height: 56,
165
- bgcolor: "#007bff",
166
- color: "white",
167
- "&:hover": { bgcolor: "#0056b3" },
168
- boxShadow: 2
169
- },
170
- size: "large",
171
- children: /* @__PURE__ */ jsxRuntime.jsx(ChatIcon__default.default, {})
172
- }
173
- ),
174
- open && /* @__PURE__ */ jsxRuntime.jsxs(
175
- material.Box,
176
- {
177
- sx: {
178
- position: "fixed",
179
- bottom: 90,
180
- right: 20,
181
- width: 380,
182
- maxWidth: "calc(100vw - 40px)",
183
- maxHeight: "calc(100vh - 120px)",
184
- overflow: "auto",
185
- bgcolor: "background.paper",
186
- borderRadius: 2,
187
- boxShadow: 6,
188
- zIndex: 1300,
189
- display: "flex",
190
- flexDirection: "column"
191
- },
192
- children: [
193
- /* @__PURE__ */ jsxRuntime.jsxs(
194
- material.Box,
195
- {
196
- sx: {
197
- display: "flex",
198
- alignItems: "center",
199
- justifyContent: "space-between",
200
- p: 1.5,
201
- borderBottom: 1,
202
- borderColor: "divider"
203
- },
204
- children: [
205
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "subtitle1", fontWeight: 600, children: config?.name ?? "Chat" }),
206
- /* @__PURE__ */ jsxRuntime.jsx(material.IconButton, { size: "small", onClick: () => setOpen(false), children: /* @__PURE__ */ jsxRuntime.jsx(CloseIcon__default.default, {}) })
207
- ]
208
- }
209
- ),
210
- /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { p: 2, flex: 1 }, children: [
211
- loading && /* @__PURE__ */ jsxRuntime.jsx(material.Box, { display: "flex", justifyContent: "center", py: 3, children: /* @__PURE__ */ jsxRuntime.jsx(material.CircularProgress, { size: 32 }) }),
212
- error && !loading && /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { color: "error", variant: "body2", children: error }),
213
- !loading && config && !isActive && /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { color: "text.secondary", variant: "body2", children: "Este canal n\xE3o est\xE1 dispon\xEDvel no momento." }),
214
- showOutOfHours && /* @__PURE__ */ jsxRuntime.jsxs(
215
- material.Box,
216
- {
217
- sx: {
218
- textAlign: "center",
219
- py: 2,
220
- px: 1,
221
- bgcolor: "#1976d2",
222
- borderRadius: 1,
223
- color: "white"
224
- },
225
- children: [
226
- /* @__PURE__ */ jsxRuntime.jsx(ScheduleIcon__default.default, { sx: { fontSize: 48, opacity: 0.9, mb: 1 } }),
227
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body1", sx: { fontWeight: 500, mb: 1 }, children: "Fora do hor\xE1rio de atendimento" }),
228
- /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "body2", sx: { opacity: 0.95 }, children: outOfHoursMessage ?? formatScheduleMessage(config) })
229
- ]
230
- }
231
- ),
232
- showForm && !submitted && /* @__PURE__ */ jsxRuntime.jsx("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { display: "flex", flexDirection: "column", gap: 2, children: [
233
- /* @__PURE__ */ jsxRuntime.jsx(
234
- material.TextField,
235
- {
236
- label: "Nome",
237
- value: form.name,
238
- onChange: (e) => setForm((f) => ({ ...f, name: e.target.value })),
239
- required: true,
240
- fullWidth: true,
241
- size: "small"
242
- }
243
- ),
244
- /* @__PURE__ */ jsxRuntime.jsx(
245
- material.TextField,
246
- {
247
- label: "E-mail",
248
- type: "email",
249
- value: form.email,
250
- onChange: (e) => setForm((f) => ({ ...f, email: e.target.value })),
251
- fullWidth: true,
252
- size: "small"
253
- }
254
- ),
255
- /* @__PURE__ */ jsxRuntime.jsx(
256
- material.TextField,
257
- {
258
- label: "Telefone",
259
- value: form.phone,
260
- onChange: (e) => setForm((f) => ({ ...f, phone: e.target.value })),
261
- fullWidth: true,
262
- size: "small"
263
- }
264
- ),
265
- /* @__PURE__ */ jsxRuntime.jsx(
266
- material.TextField,
267
- {
268
- label: "Mensagem",
269
- value: form.message,
270
- onChange: (e) => setForm((f) => ({ ...f, message: e.target.value })),
271
- multiline: true,
272
- rows: 3,
273
- fullWidth: true,
274
- size: "small"
275
- }
276
- ),
277
- /* @__PURE__ */ jsxRuntime.jsx(
278
- material.Button,
279
- {
280
- type: "submit",
281
- variant: "contained",
282
- disabled: submitting || !form.name.trim(),
283
- fullWidth: true,
284
- children: submitting ? "Enviando\u2026" : "Iniciar chat"
285
- }
286
- )
287
- ] }) }),
288
- showForm && submitted && /* @__PURE__ */ jsxRuntime.jsx(material.Typography, { color: "text.secondary", variant: "body2", sx: { py: 2 }, children: "Sua mensagem foi enviada. Em breve um atendente responder\xE1." })
289
- ] })
290
- ]
291
- }
292
- )
293
- ] });
420
+ if (!token) return null;
421
+ return /* @__PURE__ */ jsxRuntime.jsx(
422
+ WebChatLayout,
423
+ {
424
+ open,
425
+ onToggleOpen: () => setOpen((o) => !o),
426
+ primaryColor: colors.main,
427
+ hoverColor: colors.hover,
428
+ panelTitle: config?.name ?? "Chat",
429
+ contentState,
430
+ errorMessage: error,
431
+ outOfHoursMessage: outOfHoursMessage ?? (config ? formatScheduleMessage(config) : ""),
432
+ formValue: form,
433
+ onFormChange: setForm,
434
+ onFormSubmit: handleSubmit,
435
+ submitting
436
+ }
437
+ );
294
438
  };
295
439
 
296
440
  exports.ChatButton = ChatButton;
297
- exports.WebChat = WebChat;
441
+ exports.WebChat = WebChatPage;
298
442
  //# sourceMappingURL=index.js.map
299
443
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/components/button/styles.tsx","../src/lib/components/button/index.tsx","../src/lib/components/webchat/index.tsx"],"names":["styled","Button","jsx","start","end","useState","useCallback","useEffect","jsxs","Fragment","IconButton","ChatIcon","Box","Typography","CloseIcon","CircularProgress","ScheduleIcon","TextField"],"mappings":";;;;;;;;;;;;;;;;AA8EO,IAAM,UAAA,GAAaA,gBAAOC,eAAA,EAAQ;AAAA,EACrC,iBAAA,EAAmB,CAAC,IAAA,KAAS,IAAA,KAAS;AAC1C,CAAC,CAAA,CAAmB,CAAC,EAAE,UAAA,GAAa,WAAU,KAAM;AAEhD,EAAA,OAAO,EACP;AAEJ,CAAC,CAAA;AChFM,IAAM,UAAA,GAA0C,CAAC,EAAE,QAAA,GAAW,QAAQ,OAAA,EAAS,SAAA,EAAW,UAAS,KAAM;AAC9G,EAAA,uBACEC,cAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACH,QAAA,EAAU,OAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,eAAA,EAAiB,SAAA;AAAA,QACjB,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS,MAAA;AAAA,QACT,YAAA,EAAc,KAAA;AAAA,QACd,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACZ;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACZA,IAAM,OAAA,GAAkC;AAAA,EACtC,CAAA,EAAG,QAAA;AAAA,EACH,CAAA,EAAG,QAAA;AAAA,EACH,CAAA,EAAG,SAAA;AAAA,EACH,CAAA,EAAG,WAAA;AAAA,EACH,CAAA,EAAG,UAAA;AAAA,EACH,CAAA,EAAG,QAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEA,SAAS,iBAAiB,MAAA,EAAgC;AACxD,EAAA,IAAI,CAAC,MAAA,CAAO,kBAAA,IAAsB,CAAC,MAAA,CAAO,UAAU,OAAO,IAAA;AAE3D,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,CAAA;AAChC,EAAA,MAAM,OACJ,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAA,GACtC,GAAA,GACA,OAAO,GAAA,CAAI,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,QAAA,IAAY;AAAA,IAC3C,QAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA;AAEvC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAMC,MAAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,aAAA,IAAiB,OAAA;AAC/C,IAAA,MAAMC,IAAAA,GAAM,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,OAAA;AAC3C,IAAA,OAAO,IAAA,IAAQD,UAAS,IAAA,IAAQC,IAAAA;AAAA,EAClC;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,YAAA,IAAgB,OAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,UAAA,IAAc,OAAA;AAC1C,EAAA,OAAO,IAAA,IAAQ,SAAS,IAAA,IAAQ,GAAA;AAClC;AAEA,SAAS,sBAAsB,MAAA,EAA+B;AAC5D,EAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,IAAA,OAAO,oJAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,aAAA,IAAiB,OAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe,OAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,YAAA,IAAgB,OAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,UAAA,IAAc,OAAA;AAC5C,EAAA,OAAO,wEAA+D,OAAO,CAAA,QAAA,EAAQ,KAAK,CAAA,uCAAA,EAAuC,OAAO,WAAQ,KAAK,CAAA,EAAA,CAAA;AACvJ;AAEO,IAAM,UAAkC,CAAC;AAAA,EAC9C,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,eAA+B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,cAAA,CAAS;AAAA,IAC/B,IAAA,EAAM,EAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,WAAA,GAAcC,kBAAY,YAAY;AAC1C,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAC5B,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAC/E,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,QAAA,CAAS,0BAAuB,CAAA;AAChC,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAsB,MAAM,GAAA,CAAI,IAAA,EAAK;AAC3C,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,0CAAoC,CAAA;AAC7C,MAAA,SAAA,CAAU,IAAI,CAAA;AAAA,IAChB,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAU,CAAC,CAAA;AAEvB,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,WACJ,MAAA,KACC,MAAA,CAAO,MAAA,KAAW,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,CAAA;AACjD,EAAA,MAAM,eACJ,MAAA,IAAU,MAAA,CAAO,kBAAA,IAAsB,CAAC,iBAAiB,MAAM,CAAA;AACjE,EAAA,MAAM,iBAAiB,QAAA,IAAY,YAAA;AACnC,EAAA,MAAM,QAAA,GAAW,YAAY,CAAC,YAAA;AAE9B,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAuB;AACjD,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,IAAI,UAAA,IAAc,CAAC,IAAA,CAAK,IAAA,CAAK,MAAK,EAAG;AACrC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mFAA6E,CAAA;AACtF,MAAA;AAAA,IACF;AAEA,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,CAAY;AAAA,QAChB,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAAA,QACrB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAAA,QACvB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAAA,QACvB,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,IAAA;AAAK,OAC5B,CAAA;AACD,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,iBAAiB,CAAA;AAAA,IACjE,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACEC,eAAA,CAAAC,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAP,cAAAA;AAAA,MAACQ,mBAAA;AAAA,MAAA;AAAA,QACC,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAChC,EAAA,EAAI;AAAA,UACF,QAAA,EAAU,OAAA;AAAA,UACV,MAAA,EAAQ,EAAA;AAAA,UACR,KAAA,EAAO,EAAA;AAAA,UACP,KAAA,EAAO,EAAA;AAAA,UACP,MAAA,EAAQ,EAAA;AAAA,UACR,OAAA,EAAS,SAAA;AAAA,UACT,KAAA,EAAO,OAAA;AAAA,UACP,SAAA,EAAW,EAAE,OAAA,EAAS,SAAA,EAAU;AAAA,UAChC,SAAA,EAAW;AAAA,SACb;AAAA,QACA,IAAA,EAAK,OAAA;AAAA,QAEL,QAAA,kBAAAR,eAACS,yBAAA,EAAA,EAAS;AAAA;AAAA,KACZ;AAAA,IAEC,IAAA,oBACCH,eAAA;AAAA,MAACI,YAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,QAAA,EAAU,OAAA;AAAA,UACV,MAAA,EAAQ,EAAA;AAAA,UACR,KAAA,EAAO,EAAA;AAAA,UACP,KAAA,EAAO,GAAA;AAAA,UACP,QAAA,EAAU,oBAAA;AAAA,UACV,SAAA,EAAW,qBAAA;AAAA,UACX,QAAA,EAAU,MAAA;AAAA,UACV,OAAA,EAAS,kBAAA;AAAA,UACT,YAAA,EAAc,CAAA;AAAA,UACd,SAAA,EAAW,CAAA;AAAA,UACX,MAAA,EAAQ,IAAA;AAAA,UACR,OAAA,EAAS,MAAA;AAAA,UACT,aAAA,EAAe;AAAA,SACjB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAJ,eAAA;AAAA,YAACI,YAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI;AAAA,gBACF,OAAA,EAAS,MAAA;AAAA,gBACT,UAAA,EAAY,QAAA;AAAA,gBACZ,cAAA,EAAgB,eAAA;AAAA,gBAChB,CAAA,EAAG,GAAA;AAAA,gBACH,YAAA,EAAc,CAAA;AAAA,gBACd,WAAA,EAAa;AAAA,eACf;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAV,cAAAA,CAACW,uBAAW,OAAA,EAAQ,WAAA,EAAY,YAAY,GAAA,EACzC,QAAA,EAAA,MAAA,EAAQ,QAAQ,MAAA,EACnB,CAAA;AAAA,gCACAX,cAAAA,CAACQ,mBAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EACnD,QAAA,kBAAAR,cAAAA,CAACY,8BAAU,CAAA,EACb;AAAA;AAAA;AAAA,WACF;AAAA,0BAEAN,eAAA,CAACI,gBAAI,EAAA,EAAI,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,GAAE,EACtB,QAAA,EAAA;AAAA,YAAA,OAAA,oBACCV,cAAAA,CAACU,YAAA,EAAA,EAAI,OAAA,EAAQ,QAAO,cAAA,EAAe,QAAA,EAAS,EAAA,EAAI,CAAA,EAC9C,QAAA,kBAAAV,cAAAA,CAACa,yBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,CAAA,EAC9B,CAAA;AAAA,YAGD,KAAA,IAAS,CAAC,OAAA,oBACTb,cAAAA,CAACW,uBAAW,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAC/B,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,YAGD,CAAC,OAAA,IAAW,MAAA,IAAU,CAAC,QAAA,oBACtBX,cAAAA,CAACW,mBAAA,EAAA,EAAW,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,qDAAA,EAEnD,CAAA;AAAA,YAGD,cAAA,oBACCL,eAAA;AAAA,cAACI,YAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI;AAAA,kBACF,SAAA,EAAW,QAAA;AAAA,kBACX,EAAA,EAAI,CAAA;AAAA,kBACJ,EAAA,EAAI,CAAA;AAAA,kBACJ,OAAA,EAAS,SAAA;AAAA,kBACT,YAAA,EAAc,CAAA;AAAA,kBACd,KAAA,EAAO;AAAA,iBACT;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAV,cAAAA,CAACc,6BAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,IAAI,OAAA,EAAS,GAAA,EAAK,EAAA,EAAI,CAAA,EAAE,EAAG,CAAA;AAAA,kCACzDd,cAAAA,CAACW,mBAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,CAAA,EAAE,EAAG,QAAA,EAAA,mCAAA,EAE5D,CAAA;AAAA,kCACAX,cAAAA,CAACW,mBAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,OAAA,EAAS,IAAA,EAAK,EAC7C,QAAA,EAAA,iBAAA,IAAqB,qBAAA,CAAsB,MAAM,CAAA,EACpD;AAAA;AAAA;AAAA,aACF;AAAA,YAGD,QAAA,IAAY,CAAC,SAAA,oBACZX,eAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EACd,QAAA,kBAAAM,eAAA,CAACI,gBAAI,OAAA,EAAQ,MAAA,EAAO,aAAA,EAAc,QAAA,EAAS,KAAK,CAAA,EAC9C,QAAA,EAAA;AAAA,8BAAAV,cAAAA;AAAA,gBAACe,kBAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,MAAA;AAAA,kBACN,OAAO,IAAA,CAAK,IAAA;AAAA,kBACZ,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAM,CAAE,CAAA;AAAA,kBAChE,QAAA,EAAQ,IAAA;AAAA,kBACR,SAAA,EAAS,IAAA;AAAA,kBACT,IAAA,EAAK;AAAA;AAAA,eACP;AAAA,8BACAf,cAAAA;AAAA,gBAACe,kBAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,QAAA;AAAA,kBACN,IAAA,EAAK,OAAA;AAAA,kBACL,OAAO,IAAA,CAAK,KAAA;AAAA,kBACZ,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,OAAM,CAAE,CAAA;AAAA,kBACjE,SAAA,EAAS,IAAA;AAAA,kBACT,IAAA,EAAK;AAAA;AAAA,eACP;AAAA,8BACAf,cAAAA;AAAA,gBAACe,kBAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,UAAA;AAAA,kBACN,OAAO,IAAA,CAAK,KAAA;AAAA,kBACZ,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,OAAM,CAAE,CAAA;AAAA,kBACjE,SAAA,EAAS,IAAA;AAAA,kBACT,IAAA,EAAK;AAAA;AAAA,eACP;AAAA,8BACAf,cAAAA;AAAA,gBAACe,kBAAA;AAAA,gBAAA;AAAA,kBACC,KAAA,EAAM,UAAA;AAAA,kBACN,OAAO,IAAA,CAAK,OAAA;AAAA,kBACZ,QAAA,EAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,OAAM,CAAE,CAAA;AAAA,kBACnE,SAAA,EAAS,IAAA;AAAA,kBACT,IAAA,EAAM,CAAA;AAAA,kBACN,SAAA,EAAS,IAAA;AAAA,kBACT,IAAA,EAAK;AAAA;AAAA,eACP;AAAA,8BACAf,cAAAA;AAAA,gBAACD,eAAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAQ,WAAA;AAAA,kBACR,QAAA,EAAU,UAAA,IAAc,CAAC,IAAA,CAAK,KAAK,IAAA,EAAK;AAAA,kBACxC,SAAA,EAAS,IAAA;AAAA,kBAER,uBAAa,gBAAA,GAAc;AAAA;AAAA;AAC9B,aAAA,EACF,CAAA,EACF,CAAA;AAAA,YAGD,QAAA,IAAY,SAAA,oBACXC,cAAAA,CAACW,uBAAW,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IAAK,QAAA,EAAA,gEAAA,EAElE;AAAA,WAAA,EAEJ;AAAA;AAAA;AAAA;AACF,GAAA,EAEJ,CAAA;AAEJ","file":"index.js","sourcesContent":["import { Button, ButtonProps, styled } from \"@mui/material\";\nimport { ButtonHTMLAttributes } from \"react\";\n\nconst disabledStyles = {\n backgroundColor: \"#E0E0E0\",\n color: \"#9E9E9E\",\n borderColor: \"#BDBDBD\",\n};\n\nconst buttonVariants = {\n primary: {\n background: \"#00BB7E\",\n color: \"#FFF\",\n border: \"none\",\n },\n secondary: {\n background: \"transparent\",\n color: \"#00BB7E\",\n border: \"#00BB7E\",\n },\n error: {\n background: \"transparent\",\n color: \"#D32F2F\",\n border: \"#D32F2F\",\n },\n danger: {\n background: \"#E61E2E\",\n color: \"#fff\",\n border: \"none\",\n },\n outlinedBlue: {\n background: \"transparent\",\n color: \"#2196F3\",\n border: \"#2196F3\",\n },\n outlinedGreen: {\n background: \"transparent\",\n color: \"#00BB7E\",\n border: \"#00BB7E\",\n },\n outlinedBlack: {\n background: \"transparent\",\n color: \"#000000DE\",\n border: \"#000000DE\",\n },\n outlinedGrey: {\n background: \"transparent\",\n color: \"#59676D\",\n border: \"#0B0D0E52\",\n },\n textPrimary: {\n background: \"transparent\",\n color: \"#00BB7E\",\n border: \"transparent\",\n },\n textSecondary: {\n background: \"transparent\",\n color: \"#000000DE\",\n border: \"transparent\",\n },\n textBlue: {\n background: \"transparent\",\n color: \"#2196F3\",\n border: \"transparent\",\n },\n default: {\n background: \"#00BB7E\",\n color: \"#FFF\",\n border: \"#00BB7E\",\n },\n};\n\ninterface AtomButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"color\">,\n ButtonProps {\n buttonType?: keyof typeof buttonVariants;\n}\n\nexport const AtomButton = styled(Button, {\n shouldForwardProp: (prop) => prop !== \"buttonType\",\n})<AtomButtonProps>(({ buttonType = \"default\" }) => {\n\n return {\n }\n\n});","import * as React from 'react'\nimport { ChatButtonProps } from \"./types\";\nimport IComponent from \"../../../types/component\";\nimport { AtomButton } from \"./styles\";\n\nexport const ChatButton: IComponent<ChatButtonProps> = ({ children = 'Chat', onClick, className, disabled }) => {\n return (\n <AtomButton\n onClick={onClick}\n disabled={disabled}\n className={className}\n style={{\n position: \"fixed\",\n bottom: \"20px\",\n right: \"20px\",\n backgroundColor: \"#007bff\",\n color: \"#fff\",\n display: \"flex\",\n borderRadius: \"50%\",\n width: \"60px\",\n height: \"60px\"\n }}\n >\n {children}\n </AtomButton>\n )\n}\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport {\n Box,\n Button,\n CircularProgress,\n IconButton,\n TextField,\n Typography,\n} from \"@mui/material\";\nimport CloseIcon from \"@mui/icons-material/Close\";\nimport ChatIcon from \"@mui/icons-material/Chat\";\nimport ScheduleIcon from \"@mui/icons-material/Schedule\";\nimport { WebChatConfig, WebChatProps } from \"./types\";\n\nconst DAY_MAP: Record<number, string> = {\n 0: \"SUNDAY\",\n 1: \"MONDAY\",\n 2: \"TUESDAY\",\n 3: \"WEDNESDAY\",\n 4: \"THURSDAY\",\n 5: \"FRIDAY\",\n 6: \"SATURDAY\",\n};\n\nfunction isWithinSchedule(config: WebChatConfig): boolean {\n if (!config.restrictBySchedule || !config.schedule) return true;\n\n const now = new Date();\n const day = DAY_MAP[now.getDay()];\n const time =\n String(now.getHours()).padStart(2, \"0\") +\n \":\" +\n String(now.getMinutes()).padStart(2, \"0\");\n const weekDays = config.schedule.weekDays ?? [\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n ];\n const isWeekday = weekDays.includes(day);\n\n if (isWeekday) {\n const start = config.schedule.weekdaysStart ?? \"07:00\";\n const end = config.schedule.weekdaysEnd ?? \"18:00\";\n return time >= start && time <= end;\n }\n\n const start = config.schedule.weekendStart ?? \"07:00\";\n const end = config.schedule.weekendEnd ?? \"13:00\";\n return time >= start && time <= end;\n}\n\nfunction formatScheduleMessage(config: WebChatConfig): string {\n if (!config.schedule) {\n return \"Nosso horário de atendimento é de segunda à sexta-feira das 07:00h às 18:00h. Sábados, domingos e feriados das 07:00h às 13:00h.\";\n }\n const wdStart = config.schedule.weekdaysStart ?? \"07:00\";\n const wdEnd = config.schedule.weekdaysEnd ?? \"18:00\";\n const weStart = config.schedule.weekendStart ?? \"07:00\";\n const weEnd = config.schedule.weekendEnd ?? \"13:00\";\n return `Nosso horário de atendimento é de segunda à sexta-feira das ${wdStart}h às ${wdEnd}h. Sábados, domingos e feriados das ${weStart}h às ${weEnd}h.`;\n}\n\nexport const WebChat: React.FC<WebChatProps> = ({\n secret,\n apiBaseUrl,\n onStartChat,\n outOfHoursMessage,\n}) => {\n const [config, setConfig] = useState<WebChatConfig | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [open, setOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n\n const [form, setForm] = useState({\n name: \"\",\n email: \"\",\n phone: \"\",\n message: \"\",\n });\n\n const fetchConfig = useCallback(async () => {\n if (!secret || !apiBaseUrl) return;\n setLoading(true);\n setError(null);\n try {\n const base = apiBaseUrl.replace(/\\/$/, \"\");\n const res = await fetch(`${base}/channel/webchat/${encodeURIComponent(secret)}`);\n if (!res.ok) {\n setError(\"Canal não encontrado.\");\n setConfig(null);\n return;\n }\n const data: WebChatConfig = await res.json();\n setConfig(data);\n } catch {\n setError(\"Não foi possível carregar o canal.\");\n setConfig(null);\n } finally {\n setLoading(false);\n }\n }, [secret, apiBaseUrl]);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n const isActive =\n config &&\n (config.status === \"live\" || config.status === \"enable\");\n const outsideHours =\n config && config.restrictBySchedule && !isWithinSchedule(config);\n const showOutOfHours = isActive && outsideHours;\n const showForm = isActive && !outsideHours;\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (submitting || !form.name.trim()) return;\n if (!onStartChat) {\n setError(\"Início de conversa será via WebSocket. Configure onStartChat no componente.\");\n return;\n }\n\n setSubmitting(true);\n try {\n await onStartChat({\n name: form.name.trim(),\n email: form.email.trim(),\n phone: form.phone.trim(),\n message: form.message.trim(),\n });\n setSubmitted(true);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Erro ao enviar.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n if (!secret) return null;\n\n return (\n <>\n <IconButton\n onClick={() => setOpen((o) => !o)}\n sx={{\n position: \"fixed\",\n bottom: 20,\n right: 20,\n width: 56,\n height: 56,\n bgcolor: \"#007bff\",\n color: \"white\",\n \"&:hover\": { bgcolor: \"#0056b3\" },\n boxShadow: 2,\n }}\n size=\"large\"\n >\n <ChatIcon />\n </IconButton>\n\n {open && (\n <Box\n sx={{\n position: \"fixed\",\n bottom: 90,\n right: 20,\n width: 380,\n maxWidth: \"calc(100vw - 40px)\",\n maxHeight: \"calc(100vh - 120px)\",\n overflow: \"auto\",\n bgcolor: \"background.paper\",\n borderRadius: 2,\n boxShadow: 6,\n zIndex: 1300,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n p: 1.5,\n borderBottom: 1,\n borderColor: \"divider\",\n }}\n >\n <Typography variant=\"subtitle1\" fontWeight={600}>\n {config?.name ?? \"Chat\"}\n </Typography>\n <IconButton size=\"small\" onClick={() => setOpen(false)}>\n <CloseIcon />\n </IconButton>\n </Box>\n\n <Box sx={{ p: 2, flex: 1 }}>\n {loading && (\n <Box display=\"flex\" justifyContent=\"center\" py={3}>\n <CircularProgress size={32} />\n </Box>\n )}\n\n {error && !loading && (\n <Typography color=\"error\" variant=\"body2\">\n {error}\n </Typography>\n )}\n\n {!loading && config && !isActive && (\n <Typography color=\"text.secondary\" variant=\"body2\">\n Este canal não está disponível no momento.\n </Typography>\n )}\n\n {showOutOfHours && (\n <Box\n sx={{\n textAlign: \"center\",\n py: 2,\n px: 1,\n bgcolor: \"#1976d2\",\n borderRadius: 1,\n color: \"white\",\n }}\n >\n <ScheduleIcon sx={{ fontSize: 48, opacity: 0.9, mb: 1 }} />\n <Typography variant=\"body1\" sx={{ fontWeight: 500, mb: 1 }}>\n Fora do horário de atendimento\n </Typography>\n <Typography variant=\"body2\" sx={{ opacity: 0.95 }}>\n {outOfHoursMessage ?? formatScheduleMessage(config)}\n </Typography>\n </Box>\n )}\n\n {showForm && !submitted && (\n <form onSubmit={handleSubmit}>\n <Box display=\"flex\" flexDirection=\"column\" gap={2}>\n <TextField\n label=\"Nome\"\n value={form.name}\n onChange={(e) => setForm((f) => ({ ...f, name: e.target.value }))}\n required\n fullWidth\n size=\"small\"\n />\n <TextField\n label=\"E-mail\"\n type=\"email\"\n value={form.email}\n onChange={(e) => setForm((f) => ({ ...f, email: e.target.value }))}\n fullWidth\n size=\"small\"\n />\n <TextField\n label=\"Telefone\"\n value={form.phone}\n onChange={(e) => setForm((f) => ({ ...f, phone: e.target.value }))}\n fullWidth\n size=\"small\"\n />\n <TextField\n label=\"Mensagem\"\n value={form.message}\n onChange={(e) => setForm((f) => ({ ...f, message: e.target.value }))}\n multiline\n rows={3}\n fullWidth\n size=\"small\"\n />\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={submitting || !form.name.trim()}\n fullWidth\n >\n {submitting ? \"Enviando…\" : \"Iniciar chat\"}\n </Button>\n </Box>\n </form>\n )}\n\n {showForm && submitted && (\n <Typography color=\"text.secondary\" variant=\"body2\" sx={{ py: 2 }}>\n Sua mensagem foi enviada. Em breve um atendente responderá.\n </Typography>\n )}\n </Box>\n </Box>\n )}\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/lib/components/atoms/button/styles.tsx","../src/lib/components/atoms/button/index.tsx","../src/lib/components/atoms/floating-button/FabIconButton.tsx","../src/lib/components/atoms/spinner/Spinner.tsx","../src/lib/components/molecules/floating-button-trigger/FabTrigger.tsx","../src/lib/components/molecules/out-of-hours-card/PanelHeader.tsx","../src/lib/components/molecules/out-of-hours-card/OutOfHoursCard.tsx","../src/lib/components/molecules/chat-form/ChatForm.tsx","../src/lib/components/organisms/webchat/constants.ts","../src/lib/components/organisms/chat-panel-content/ChatPanelContent.tsx","../src/lib/components/organisms/chat-panel/ChatPanel.tsx","../src/lib/components/organisms/layout/WebChatLayout.tsx","../src/lib/components/organisms/webchat/WebChatPage.tsx"],"names":["styled","Button","jsx","IconButton","Box","CircularProgress","ChatIcon","jsxs","Typography","CloseIcon","ScheduleIcon","TextField","Fragment","start","end","useState","useCallback","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { Button, ButtonProps, styled } from \"@mui/material\";\nimport { ButtonHTMLAttributes } from \"react\";\n\nconst disabledStyles = {\n backgroundColor: \"#E0E0E0\",\n color: \"#9E9E9E\",\n borderColor: \"#BDBDBD\",\n};\n\nconst buttonVariants = {\n primary: {\n background: \"#00BB7E\",\n color: \"#FFF\",\n border: \"none\",\n },\n secondary: {\n background: \"transparent\",\n color: \"#00BB7E\",\n border: \"#00BB7E\",\n },\n error: {\n background: \"transparent\",\n color: \"#D32F2F\",\n border: \"#D32F2F\",\n },\n danger: {\n background: \"#E61E2E\",\n color: \"#fff\",\n border: \"none\",\n },\n outlinedBlue: {\n background: \"transparent\",\n color: \"#2196F3\",\n border: \"#2196F3\",\n },\n outlinedGreen: {\n background: \"transparent\",\n color: \"#00BB7E\",\n border: \"#00BB7E\",\n },\n outlinedBlack: {\n background: \"transparent\",\n color: \"#000000DE\",\n border: \"#000000DE\",\n },\n outlinedGrey: {\n background: \"transparent\",\n color: \"#59676D\",\n border: \"#0B0D0E52\",\n },\n textPrimary: {\n background: \"transparent\",\n color: \"#00BB7E\",\n border: \"transparent\",\n },\n textSecondary: {\n background: \"transparent\",\n color: \"#000000DE\",\n border: \"transparent\",\n },\n textBlue: {\n background: \"transparent\",\n color: \"#2196F3\",\n border: \"transparent\",\n },\n default: {\n background: \"#00BB7E\",\n color: \"#FFF\",\n border: \"#00BB7E\",\n },\n};\n\ninterface AtomButtonProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, \"color\">,\n ButtonProps {\n buttonType?: keyof typeof buttonVariants;\n}\n\nexport const AtomButton = styled(Button, {\n shouldForwardProp: (prop) => prop !== \"buttonType\",\n})<AtomButtonProps>(({ buttonType = \"default\" }) => {\n\n return {\n }\n\n});","import * as React from 'react'\nimport { ChatButtonProps } from \"./types\";\nimport IComponent from \"../../../../types/component\";\nimport { AtomButton } from \"./styles\";\n\nexport const ChatButton: IComponent<ChatButtonProps> = ({ children = 'Chat', onClick, className, disabled }) => {\n return (\n <AtomButton\n onClick={onClick}\n disabled={disabled}\n className={className}\n style={{\n position: \"fixed\",\n bottom: \"20px\",\n right: \"20px\",\n backgroundColor: \"#007bff\",\n color: \"#fff\",\n display: \"flex\",\n borderRadius: \"50%\",\n width: \"60px\",\n height: \"60px\"\n }}\n >\n {children}\n </AtomButton>\n )\n}\n","import React from \"react\";\nimport { IconButton, IconButtonProps } from \"@mui/material\";\n\nexport interface FabIconButtonProps extends Omit<IconButtonProps, \"size\"> {\n bgColor: string;\n hoverColor: string;\n children: React.ReactNode;\n}\n\nexport const FabIconButton: React.FC<FabIconButtonProps> = ({\n bgColor,\n hoverColor,\n children,\n sx,\n ...rest\n}) => (\n <IconButton\n size=\"large\"\n sx={{\n width: 56,\n height: 56,\n bgcolor: bgColor,\n color: \"white\",\n \"&:hover\": { bgcolor: hoverColor },\n boxShadow: 2,\n ...sx,\n }}\n {...rest}\n >\n {children}\n </IconButton>\n);\n","import React from \"react\";\nimport { Box, CircularProgress } from \"@mui/material\";\n\nexport interface SpinnerProps {\n size?: number;\n}\n\nexport const Spinner: React.FC<SpinnerProps> = ({ size = 32 }) => (\n <Box display=\"flex\" justifyContent=\"center\" py={3}>\n <CircularProgress size={size} />\n </Box>\n);\n","import React from \"react\";\nimport ChatIcon from \"@mui/icons-material/Chat\";\nimport { FabIconButton } from \"../../atoms\";\n\nexport interface FabTriggerProps {\n onClick: () => void;\n bgColor: string;\n hoverColor: string;\n}\n\nexport const FabTrigger: React.FC<FabTriggerProps> = ({\n onClick,\n bgColor,\n hoverColor,\n}) => (\n <FabIconButton\n onClick={onClick}\n bgColor={bgColor}\n hoverColor={hoverColor}\n sx={{ position: \"fixed\", bottom: 20, right: 20 }}\n >\n <ChatIcon />\n </FabIconButton>\n);\n","import React from \"react\";\nimport { Box, IconButton, Typography } from \"@mui/material\";\nimport CloseIcon from \"@mui/icons-material/Close\";\n\nexport interface PanelHeaderProps {\n title: string;\n onClose: () => void;\n}\n\n/**\n * Molécula: cabeçalho do painel com título e botão fechar.\n */\nexport const PanelHeader: React.FC<PanelHeaderProps> = ({ title, onClose }) => (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n p: 1.5,\n borderBottom: 1,\n borderColor: \"divider\",\n }}\n >\n <Typography variant=\"subtitle1\" fontWeight={600}>\n {title}\n </Typography>\n <IconButton size=\"small\" onClick={onClose} aria-label=\"Fechar\">\n <CloseIcon />\n </IconButton>\n </Box>\n);\n","import React from \"react\";\nimport { Box, Typography } from \"@mui/material\";\nimport ScheduleIcon from \"@mui/icons-material/Schedule\";\n\nexport interface OutOfHoursCardProps {\n message: string;\n bgColor: string;\n}\n\n/**\n * Molécula: card \"Fora do horário de atendimento\" com ícone e mensagem.\n */\nexport const OutOfHoursCard: React.FC<OutOfHoursCardProps> = ({\n message,\n bgColor,\n}) => (\n <Box\n sx={{\n textAlign: \"center\",\n py: 2,\n px: 1,\n bgcolor: bgColor,\n borderRadius: 1,\n color: \"white\",\n }}\n >\n <ScheduleIcon sx={{ fontSize: 48, opacity: 0.9, mb: 1 }} />\n <Typography variant=\"body1\" sx={{ fontWeight: 500, mb: 1 }}>\n Fora do horário de atendimento\n </Typography>\n <Typography variant=\"body2\" sx={{ opacity: 0.95 }}>\n {message}\n </Typography>\n </Box>\n);\n","import React from \"react\";\nimport { Box, Button, TextField } from \"@mui/material\";\n\nexport interface ChatFormData {\n name: string;\n email: string;\n phone: string;\n message: string;\n}\n\nexport interface ChatFormProps {\n value: ChatFormData;\n onChange: (data: ChatFormData) => void;\n onSubmit: (e: React.FormEvent) => void;\n submitting: boolean;\n submitLabel?: string;\n}\n\n/**\n * Molécula: formulário de início de chat (nome, e-mail, telefone, mensagem + enviar).\n */\nexport const ChatForm: React.FC<ChatFormProps> = ({\n value,\n onChange,\n onSubmit,\n submitting,\n submitLabel = \"Iniciar chat\",\n}) => (\n <form onSubmit={onSubmit}>\n <Box display=\"flex\" flexDirection=\"column\" gap={2}>\n <TextField\n label=\"Nome\"\n value={value.name}\n onChange={(e) => onChange({ ...value, name: e.target.value })}\n required\n fullWidth\n size=\"small\"\n />\n <TextField\n label=\"E-mail\"\n type=\"email\"\n value={value.email}\n onChange={(e) => onChange({ ...value, email: e.target.value })}\n fullWidth\n size=\"small\"\n />\n <TextField\n label=\"Telefone\"\n value={value.phone}\n onChange={(e) => onChange({ ...value, phone: e.target.value })}\n fullWidth\n size=\"small\"\n />\n <TextField\n label=\"Mensagem\"\n value={value.message}\n onChange={(e) => onChange({ ...value, message: e.target.value })}\n multiline\n rows={3}\n fullWidth\n size=\"small\"\n />\n <Button\n type=\"submit\"\n variant=\"contained\"\n disabled={submitting || !value.name.trim()}\n fullWidth\n >\n {submitting ? \"Enviando…\" : submitLabel}\n </Button>\n </Box>\n </form>\n);\n","/**\n * Cor padrão do botão/floating action do WebChat (identidade Synchat).\n * Pode ser sobrescrita pela prop primaryColor.\n */\nexport const DEFAULT_PRIMARY_COLOR = \"#0D9488\";\nexport const DEFAULT_PRIMARY_COLOR_HOVER = \"#0F766E\";\n\n/**\n * URL base da API usada quando apiBaseUrl não é passada.\n * No build: para embutir outra URL no pacote, use\n * SYNCHAT_API_URL=https://sua-api.com npm run build\n */\ndeclare const __SYNCHAT_API_URL__: string;\nexport const DEFAULT_API_BASE_URL = __SYNCHAT_API_URL__;\n","import React from \"react\";\nimport { Box, Typography } from \"@mui/material\";\nimport { Spinner } from \"../../atoms\";\nimport { OutOfHoursCard, ChatForm } from \"../../molecules\";\nimport type { ChatFormData } from \"../../molecules\";\n\nexport type PanelContentState =\n | \"loading\"\n | \"error\"\n | \"inactive\"\n | \"outOfHours\"\n | \"form\"\n | \"submitted\";\n\nexport interface ChatPanelContentProps {\n state: PanelContentState;\n errorMessage: string | null;\n outOfHoursMessage: string;\n outOfHoursBgColor: string;\n formValue: ChatFormData;\n onFormChange: (data: ChatFormData) => void;\n onFormSubmit: (e: React.FormEvent) => void;\n submitting: boolean;\n}\n\n/**\n * Organismo: conteúdo do painel (loading, erro, inativo, fora do horário, formulário ou sucesso).\n */\nexport const ChatPanelContent: React.FC<ChatPanelContentProps> = ({\n state,\n errorMessage,\n outOfHoursMessage,\n outOfHoursBgColor,\n formValue,\n onFormChange,\n onFormSubmit,\n submitting,\n}) => (\n <Box sx={{ p: 2, flex: 1 }}>\n {state === \"loading\" && <Spinner />}\n\n {state === \"error\" && errorMessage && (\n <Typography color=\"error\" variant=\"body2\">\n {errorMessage}\n </Typography>\n )}\n\n {state === \"inactive\" && (\n <Typography color=\"text.secondary\" variant=\"body2\">\n Este canal não está disponível no momento.\n </Typography>\n )}\n\n {state === \"outOfHours\" && (\n <OutOfHoursCard message={outOfHoursMessage} bgColor={outOfHoursBgColor} />\n )}\n\n {state === \"form\" && (\n <ChatForm\n value={formValue}\n onChange={onFormChange}\n onSubmit={onFormSubmit}\n submitting={submitting}\n />\n )}\n\n {state === \"submitted\" && (\n <Typography color=\"text.secondary\" variant=\"body2\" sx={{ py: 2 }}>\n Sua mensagem foi enviada. Em breve um atendente responderá.\n </Typography>\n )}\n </Box>\n);\n","import React from \"react\";\nimport { Box } from \"@mui/material\";\nimport { PanelHeader } from \"../../molecules\";\nimport { ChatPanelContent } from \"../chat-panel-content/ChatPanelContent\";\nimport type { PanelContentState } from \"../chat-panel-content/ChatPanelContent\";\nimport type { ChatFormData } from \"../../molecules\";\n\nexport interface ChatPanelProps {\n open: boolean;\n title: string;\n onClose: () => void;\n contentState: PanelContentState;\n errorMessage: string | null;\n outOfHoursMessage: string;\n primaryColor: string;\n formValue: ChatFormData;\n onFormChange: (data: ChatFormData) => void;\n onFormSubmit: (e: React.FormEvent) => void;\n submitting: boolean;\n}\n\n/**\n * Organismo: painel do chat (cabeçalho + conteúdo).\n */\nexport const ChatPanel: React.FC<ChatPanelProps> = ({\n open,\n title,\n onClose,\n contentState,\n errorMessage,\n outOfHoursMessage,\n primaryColor,\n formValue,\n onFormChange,\n onFormSubmit,\n submitting,\n}) => {\n if (!open) return null;\n\n return (\n <Box\n sx={{\n position: \"fixed\",\n bottom: 90,\n right: 20,\n width: 380,\n maxWidth: \"calc(100vw - 40px)\",\n maxHeight: \"calc(100vh - 120px)\",\n overflow: \"auto\",\n bgcolor: \"background.paper\",\n borderRadius: 2,\n boxShadow: 6,\n zIndex: 1300,\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <PanelHeader title={title} onClose={onClose} />\n <ChatPanelContent\n state={contentState}\n errorMessage={errorMessage}\n outOfHoursMessage={outOfHoursMessage}\n outOfHoursBgColor={primaryColor}\n formValue={formValue}\n onFormChange={onFormChange}\n onFormSubmit={onFormSubmit}\n submitting={submitting}\n />\n </Box>\n );\n};\n","import React from \"react\";\nimport { FabTrigger } from \"../../molecules\";\nimport { ChatPanel } from \"../chat-panel/ChatPanel\";\nimport type { PanelContentState } from \"../chat-panel-content/ChatPanelContent\";\nimport type { ChatFormData } from \"../../molecules\";\n\nexport interface WebChatLayoutProps {\n open: boolean;\n onToggleOpen: () => void;\n primaryColor: string;\n hoverColor: string;\n panelTitle: string;\n contentState: PanelContentState;\n errorMessage: string | null;\n outOfHoursMessage: string;\n formValue: ChatFormData;\n onFormChange: (data: ChatFormData) => void;\n onFormSubmit: (e: React.FormEvent) => void;\n submitting: boolean;\n}\n\n/**\n * Template: layout do widget (FAB + painel condicional).\n */\nexport const WebChatLayout: React.FC<WebChatLayoutProps> = (props) => (\n <>\n <FabTrigger\n onClick={props.onToggleOpen}\n bgColor={props.primaryColor}\n hoverColor={props.hoverColor}\n />\n <ChatPanel\n open={props.open}\n title={props.panelTitle}\n onClose={props.onToggleOpen}\n contentState={props.contentState}\n errorMessage={props.errorMessage}\n outOfHoursMessage={props.outOfHoursMessage}\n primaryColor={props.primaryColor}\n formValue={props.formValue}\n onFormChange={props.onFormChange}\n onFormSubmit={props.onFormSubmit}\n submitting={props.submitting}\n />\n </>\n);\n","import React, { useCallback, useEffect, useState } from \"react\";\nimport {\n DEFAULT_API_BASE_URL,\n DEFAULT_PRIMARY_COLOR,\n DEFAULT_PRIMARY_COLOR_HOVER,\n} from \"./constants\";\nimport { WebChatLayout } from \"../layout/WebChatLayout\";\nimport type { PanelContentState } from \"../chat-panel-content/ChatPanelContent\";\nimport type { ChatFormData } from \"../../molecules\";\nimport { WebChatConfig, WebChatProps } from \"./types\";\n\nconst DAY_MAP: Record<number, string> = {\n 0: \"SUNDAY\",\n 1: \"MONDAY\",\n 2: \"TUESDAY\",\n 3: \"WEDNESDAY\",\n 4: \"THURSDAY\",\n 5: \"FRIDAY\",\n 6: \"SATURDAY\",\n};\n\nfunction isWithinSchedule(config: WebChatConfig): boolean {\n if (!config.restrictBySchedule || !config.schedule) return true;\n const now = new Date();\n const day = DAY_MAP[now.getDay()];\n const time =\n String(now.getHours()).padStart(2, \"0\") +\n \":\" +\n String(now.getMinutes()).padStart(2, \"0\");\n const weekDays = config.schedule.weekDays ?? [\n \"MONDAY\",\n \"TUESDAY\",\n \"WEDNESDAY\",\n \"THURSDAY\",\n \"FRIDAY\",\n ];\n const isWeekday = weekDays.includes(day);\n if (isWeekday) {\n const start = config.schedule.weekdaysStart ?? \"07:00\";\n const end = config.schedule.weekdaysEnd ?? \"18:00\";\n return time >= start && time <= end;\n }\n const start = config.schedule.weekendStart ?? \"07:00\";\n const end = config.schedule.weekendEnd ?? \"13:00\";\n return time >= start && time <= end;\n}\n\nfunction formatScheduleMessage(config: WebChatConfig): string {\n if (!config.schedule) {\n return \"Nosso horário de atendimento é de segunda à sexta-feira das 07:00h às 18:00h. Sábados, domingos e feriados das 07:00h às 13:00h.\";\n }\n const wdStart = config.schedule.weekdaysStart ?? \"07:00\";\n const wdEnd = config.schedule.weekdaysEnd ?? \"18:00\";\n const weStart = config.schedule.weekendStart ?? \"07:00\";\n const weEnd = config.schedule.weekendEnd ?? \"13:00\";\n return `Nosso horário de atendimento é de segunda à sexta-feira das ${wdStart}h às ${wdEnd}h. Sábados, domingos e feriados das ${weStart}h às ${weEnd}h.`;\n}\n\nfunction parseColor(color: string | undefined): { main: string; hover: string } {\n if (!color || !color.trim()) {\n return { main: DEFAULT_PRIMARY_COLOR, hover: DEFAULT_PRIMARY_COLOR_HOVER };\n }\n const c = color.trim();\n if (c.startsWith(\"#\") && c.length === 7) {\n const hex = c.slice(1);\n const r = Math.max(0, parseInt(hex.slice(0, 2), 16) - 18);\n const g = Math.max(0, parseInt(hex.slice(2, 4), 16) - 18);\n const b = Math.max(0, parseInt(hex.slice(4, 6), 16) - 18);\n const hover = `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`;\n return { main: c, hover };\n }\n return { main: c, hover: c };\n}\n\nexport const WebChatPage: React.FC<WebChatProps> = ({\n token,\n apiBaseUrl,\n primaryColor,\n onStartChat,\n outOfHoursMessage,\n}) => {\n const baseUrl = apiBaseUrl?.trim() || DEFAULT_API_BASE_URL;\n const colors = parseColor(primaryColor);\n const [config, setConfig] = useState<WebChatConfig | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [open, setOpen] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [form, setForm] = useState<ChatFormData>({\n name: \"\",\n email: \"\",\n phone: \"\",\n message: \"\",\n });\n\n const fetchConfig = useCallback(async () => {\n if (!token) return;\n setLoading(true);\n setError(null);\n try {\n const base = baseUrl.replace(/\\/$/, \"\");\n const res = await fetch(`${base}/channel/webchat/${encodeURIComponent(token)}`);\n if (!res.ok) {\n setError(\"Canal não encontrado.\");\n setConfig(null);\n return;\n }\n const data: WebChatConfig = await res.json();\n setConfig(data);\n } catch {\n setError(\"Não foi possível carregar o canal.\");\n setConfig(null);\n } finally {\n setLoading(false);\n }\n }, [token, baseUrl]);\n\n useEffect(() => {\n fetchConfig();\n }, [fetchConfig]);\n\n const isActive =\n config && (config.status === \"live\" || config.status === \"enable\");\n const outsideHours =\n config && config.restrictBySchedule && !isWithinSchedule(config);\n const showOutOfHours = isActive && outsideHours;\n const showForm = isActive && !outsideHours;\n\n const contentState: PanelContentState = loading\n ? \"loading\"\n : error\n ? \"error\"\n : config && !isActive\n ? \"inactive\"\n : showOutOfHours\n ? \"outOfHours\"\n : showForm && !submitted\n ? \"form\"\n : \"submitted\";\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (submitting || !form.name.trim()) return;\n if (!onStartChat) {\n setError(\n \"Início de conversa será via WebSocket. Configure onStartChat no componente.\"\n );\n return;\n }\n setSubmitting(true);\n try {\n await onStartChat({\n name: form.name.trim(),\n email: form.email.trim(),\n phone: form.phone.trim(),\n message: form.message.trim(),\n ...(config?.businessId && { businessId: config.businessId }),\n });\n setSubmitted(true);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Erro ao enviar.\");\n } finally {\n setSubmitting(false);\n }\n };\n\n if (!token) return null;\n\n return (\n <WebChatLayout\n open={open}\n onToggleOpen={() => setOpen((o) => !o)}\n primaryColor={colors.main}\n hoverColor={colors.hover}\n panelTitle={config?.name ?? \"Chat\"}\n contentState={contentState}\n errorMessage={error}\n outOfHoursMessage={\n outOfHoursMessage ?? (config ? formatScheduleMessage(config) : \"\")\n }\n formValue={form}\n onFormChange={setForm}\n onFormSubmit={handleSubmit}\n submitting={submitting}\n />\n );\n};\n"]}