@synchat/webchat 0.0.28 → 0.0.30
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 +5 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -417,6 +417,11 @@ var WebChatPage = ({
|
|
|
417
417
|
}
|
|
418
418
|
};
|
|
419
419
|
if (!token) return null;
|
|
420
|
+
if (loading) return null;
|
|
421
|
+
if (error) {
|
|
422
|
+
console.info("[WebChat] N\xE3o foi poss\xEDvel carregar o canal:", error);
|
|
423
|
+
return null;
|
|
424
|
+
}
|
|
420
425
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
421
426
|
WebChatLayout,
|
|
422
427
|
{
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","export const DEFAULT_PRIMARY_COLOR = \"#0D9488\";\nexport const DEFAULT_PRIMARY_COLOR_HOVER = \"#0F766E\";\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 primaryColor,\n onStartChat,\n outOfHoursMessage,\n}) => {\n const baseUrl = 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"]}
|
|
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":";;;;;;;;;;;;;;;;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;ACjBO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,EAAA;AAAA,EACA,GAAG;AACL,CAAA,qBACEA,cAAAA;AAAA,EAACC,mBAAA;AAAA,EAAA;AAAA,IACC,IAAA,EAAK,OAAA;AAAA,IACL,EAAA,EAAI;AAAA,MACF,KAAA,EAAO,EAAA;AAAA,MACP,MAAA,EAAQ,EAAA;AAAA,MACR,OAAA,EAAS,OAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,SAAA,EAAW,EAAE,OAAA,EAAS,UAAA,EAAW;AAAA,MACjC,SAAA,EAAW,CAAA;AAAA,MACX,GAAG;AAAA,KACL;AAAA,IACC,GAAG,IAAA;AAAA,IAEH;AAAA;AACH,CAAA;ACvBK,IAAM,UAAkC,CAAC,EAAE,OAAO,EAAA,EAAG,qBAC1DD,cAAAA,CAACE,YAAA,EAAA,EAAI,SAAQ,MAAA,EAAO,cAAA,EAAe,UAAS,EAAA,EAAI,CAAA,EAC9C,0BAAAF,cAAAA,CAACG,yBAAA,EAAA,EAAiB,MAAY,CAAA,EAChC,CAAA;ACAK,IAAM,aAAwC,CAAC;AAAA,EACpD,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,qBACEH,cAAAA;AAAA,EAAC,aAAA;AAAA,EAAA;AAAA,IACC,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAI,EAAE,QAAA,EAAU,SAAS,MAAA,EAAQ,EAAA,EAAI,OAAO,EAAA,EAAG;AAAA,IAE/C,QAAA,kBAAAA,eAACI,yBAAA,EAAA,EAAS;AAAA;AACZ,CAAA;ACVK,IAAM,WAAA,GAA0C,CAAC,EAAE,KAAA,EAAO,SAAQ,qBACvEC,eAAA;AAAA,EAACH,YAAAA;AAAA,EAAA;AAAA,IACC,EAAA,EAAI;AAAA,MACF,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,eAAA;AAAA,MAChB,CAAA,EAAG,GAAA;AAAA,MACH,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IAEA,QAAA,EAAA;AAAA,sBAAAF,eAACM,mBAAA,EAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,UAAA,EAAY,KACzC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBACAN,cAAAA,CAACC,mBAAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,YAAA,EAAW,QAAA,EACpD,QAAA,kBAAAD,cAAAA,CAACO,8BAAU,CAAA,EACb;AAAA;AAAA;AACF,CAAA;ACjBK,IAAM,iBAAgD,CAAC;AAAA,EAC5D,OAAA;AAAA,EACA;AACF,CAAA,qBACEF,eAAAA;AAAA,EAACH,YAAAA;AAAA,EAAA;AAAA,IACC,EAAA,EAAI;AAAA,MACF,SAAA,EAAW,QAAA;AAAA,MACX,EAAA,EAAI,CAAA;AAAA,MACJ,EAAA,EAAI,CAAA;AAAA,MACJ,OAAA,EAAS,OAAA;AAAA,MACT,YAAA,EAAc,CAAA;AAAA,MACd,KAAA,EAAO;AAAA,KACT;AAAA,IAEA,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAACQ,6BAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,IAAI,OAAA,EAAS,GAAA,EAAK,EAAA,EAAI,CAAA,EAAE,EAAG,CAAA;AAAA,sBACzDR,cAAAA,CAACM,mBAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,UAAA,EAAY,GAAA,EAAK,EAAA,EAAI,CAAA,IAAK,QAAA,EAAA,mCAAA,EAE5D,CAAA;AAAA,sBACAN,cAAAA,CAACM,mBAAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,OAAA,EAAS,IAAA,EAAK,EAC7C,QAAA,EAAA,OAAA,EACH;AAAA;AAAA;AACF,CAAA;ACZK,IAAM,WAAoC,CAAC;AAAA,EAChD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA,GAAc;AAChB,CAAA,qBACEN,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EACJ,QAAA,kBAAAK,eAAAA,CAACH,YAAAA,EAAA,EAAI,OAAA,EAAQ,MAAA,EAAO,aAAA,EAAc,QAAA,EAAS,KAAK,CAAA,EAC9C,QAAA,EAAA;AAAA,kBAAAF,cAAAA;AAAA,IAACS,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,MAAA;AAAA,MACN,OAAO,KAAA,CAAM,IAAA;AAAA,MACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MAC5D,QAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAK;AAAA;AAAA,GACP;AAAA,kBACAT,cAAAA;AAAA,IAACS,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAK,OAAA;AAAA,MACL,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MAC7D,SAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAK;AAAA;AAAA,GACP;AAAA,kBACAT,cAAAA;AAAA,IAACS,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,UAAA;AAAA,MACN,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MAC7D,SAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAK;AAAA;AAAA,GACP;AAAA,kBACAT,cAAAA;AAAA,IAACS,kBAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,UAAA;AAAA,MACN,OAAO,KAAA,CAAM,OAAA;AAAA,MACb,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,MAC/D,SAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,CAAA;AAAA,MACN,SAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAK;AAAA;AAAA,GACP;AAAA,kBACAT,cAAAA;AAAA,IAACD,eAAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAQ,WAAA;AAAA,MACR,QAAA,EAAU,UAAA,IAAc,CAAC,KAAA,CAAM,KAAK,IAAA,EAAK;AAAA,MACzC,SAAA,EAAS,IAAA;AAAA,MAER,uBAAa,gBAAA,GAAc;AAAA;AAAA;AAC9B,CAAA,EACF,CAAA,EACF,CAAA;;;ACvEK,IAAM,qBAAA,GAAwB,SAAA;AAC9B,IAAM,2BAAA,GAA8B,SAAA;AAGpC,IAAM,oBAAA,GAAuB,4BAAA;ACwB7B,IAAM,mBAAoD,CAAC;AAAA,EAChE,KAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,qBACEM,eAAAA,CAACH,YAAAA,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE,EACtB,QAAA,EAAA;AAAA,EAAA,KAAA,KAAU,SAAA,oBAAaF,cAAAA,CAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,EAEhC,KAAA,KAAU,OAAA,IAAW,YAAA,oBACpBA,cAAAA,CAACM,mBAAAA,EAAA,EAAW,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAQ,OAAA,EAC/B,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,EAGD,KAAA,KAAU,UAAA,oBACTN,cAAAA,CAACM,mBAAAA,EAAA,EAAW,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,OAAA,EAAQ,QAAA,EAAA,qDAAA,EAEnD,CAAA;AAAA,EAGD,KAAA,KAAU,gCACTN,cAAAA,CAAC,kBAAe,OAAA,EAAS,iBAAA,EAAmB,SAAS,iBAAA,EAAmB,CAAA;AAAA,EAGzE,KAAA,KAAU,0BACTA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,YAAA;AAAA,MACV,QAAA,EAAU,YAAA;AAAA,MACV;AAAA;AAAA,GACF;AAAA,EAGD,KAAA,KAAU,WAAA,oBACTA,cAAAA,CAACM,qBAAA,EAAW,KAAA,EAAM,gBAAA,EAAiB,OAAA,EAAQ,SAAQ,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,IAAK,QAAA,EAAA,gEAAA,EAElE;AAAA,CAAA,EAEJ,CAAA;AC/CK,IAAM,YAAsC,CAAC;AAAA,EAClD,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,uBACED,eAAAA;AAAA,IAACH,YAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,QAAA,EAAU,OAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,KAAA,EAAO,EAAA;AAAA,QACP,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,oBAAA;AAAA,QACV,SAAA,EAAW,qBAAA;AAAA,QACX,QAAA,EAAU,MAAA;AAAA,QACV,OAAA,EAAS,kBAAA;AAAA,QACT,YAAA,EAAc,CAAA;AAAA,QACd,SAAA,EAAW,CAAA;AAAA,QACX,MAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe;AAAA,OACjB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAc,OAAA,EAAkB,CAAA;AAAA,wBAC7CA,cAAAA;AAAA,UAAC,gBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,YAAA;AAAA,YACP,YAAA;AAAA,YACA,iBAAA;AAAA,YACA,iBAAA,EAAmB,YAAA;AAAA,YACnB,SAAA;AAAA,YACA,YAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ,CAAA;AC9CO,IAAM,aAAA,GAA8C,CAAC,KAAA,qBAC1DK,gBAAAK,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,kBAAAV,cAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAS,KAAA,CAAM,YAAA;AAAA,MACf,SAAS,KAAA,CAAM,YAAA;AAAA,MACf,YAAY,KAAA,CAAM;AAAA;AAAA,GACpB;AAAA,kBACAA,cAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,KAAA,CAAM,UAAA;AAAA,MACb,SAAS,KAAA,CAAM,YAAA;AAAA,MACf,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,mBAAmB,KAAA,CAAM,iBAAA;AAAA,MACzB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,YAAY,KAAA,CAAM;AAAA;AAAA;AACpB,CAAA,EACF,CAAA;ACjCF,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;AAC3D,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;AACvC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAMW,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;AACA,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;AAEA,SAAS,WAAW,KAAA,EAA4D;AAC9E,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,MAAK,EAAG;AAC3B,IAAA,OAAO,EAAE,IAAA,EAAM,qBAAA,EAAuB,KAAA,EAAO,2BAAA,EAA4B;AAAA,EAC3E;AACA,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,EAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACvC,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACrB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,EAAE,CAAA;AACxD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,EAAE,CAAA;AACxD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,EAAE,CAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACrH,IAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAM;AAAA,EAC1B;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAC7B;AAEO,IAAM,cAAsC,CAAC;AAAA,EAClD,KAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,GAAU,oBAAA;AAChB,EAAA,MAAM,MAAA,GAAS,WAAW,YAAY,CAAA;AACtC,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;AAChD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,cAAA,CAAuB;AAAA,IAC7C,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,KAAA,EAAO;AACZ,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACtC,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,CAAA;AAC9E,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,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,WACJ,MAAA,KAAW,MAAA,CAAO,MAAA,KAAW,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,CAAA;AAC3D,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,GAAkC,OAAA,GACpC,SAAA,GACA,KAAA,GACE,UACA,MAAA,IAAU,CAAC,QAAA,GACT,UAAA,GACA,cAAA,GACE,YAAA,GACA,QAAA,IAAY,CAAC,YACX,MAAA,GACA,WAAA;AAEZ,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;AAAA,QACE;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,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,EAAK;AAAA,QAC3B,GAAI,MAAA,EAAQ,UAAA,IAAc,EAAE,UAAA,EAAY,OAAO,UAAA;AAAW,OAC3D,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,OAAO,OAAO,IAAA;AAEnB,EAAA,IAAI,SAAS,OAAO,IAAA;AAEpB,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAA,CAAQ,IAAA,CAAK,sDAAgD,KAAK,CAAA;AAClE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEf,cAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,cAAc,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,MACrC,cAAc,MAAA,CAAO,IAAA;AAAA,MACrB,YAAY,MAAA,CAAO,KAAA;AAAA,MACnB,UAAA,EAAY,QAAQ,IAAA,IAAQ,MAAA;AAAA,MAC5B,YAAA;AAAA,MACA,YAAA,EAAc,KAAA;AAAA,MACd,iBAAA,EACE,iBAAA,KAAsB,MAAA,GAAS,qBAAA,CAAsB,MAAM,CAAA,GAAI,EAAA,CAAA;AAAA,MAEjE,SAAA,EAAW,IAAA;AAAA,MACX,YAAA,EAAc,OAAA;AAAA,MACd,YAAA,EAAc,YAAA;AAAA,MACd;AAAA;AAAA,GACF;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 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","export const DEFAULT_PRIMARY_COLOR = \"#0D9488\";\nexport const DEFAULT_PRIMARY_COLOR_HOVER = \"#0F766E\";\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 primaryColor,\n onStartChat,\n outOfHoursMessage,\n}) => {\n const baseUrl = 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 if (loading) return null;\n\n if (error) {\n console.info(\"[WebChat] Não foi possível carregar o canal:\", error);\n return null;\n }\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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -409,6 +409,11 @@ var WebChatPage = ({
|
|
|
409
409
|
}
|
|
410
410
|
};
|
|
411
411
|
if (!token) return null;
|
|
412
|
+
if (loading) return null;
|
|
413
|
+
if (error) {
|
|
414
|
+
console.info("[WebChat] N\xE3o foi poss\xEDvel carregar o canal:", error);
|
|
415
|
+
return null;
|
|
416
|
+
}
|
|
412
417
|
return /* @__PURE__ */ jsx(
|
|
413
418
|
WebChatLayout,
|
|
414
419
|
{
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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":["jsx","Box","IconButton","jsxs","Typography","Button","start","end"],"mappings":"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","file":"index.mjs","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","export const DEFAULT_PRIMARY_COLOR = \"#0D9488\";\nexport const DEFAULT_PRIMARY_COLOR_HOVER = \"#0F766E\";\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 primaryColor,\n onStartChat,\n outOfHoursMessage,\n}) => {\n const baseUrl = 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"]}
|
|
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":["jsx","Box","IconButton","jsxs","Typography","Button","start","end"],"mappings":"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","file":"index.mjs","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","export const DEFAULT_PRIMARY_COLOR = \"#0D9488\";\nexport const DEFAULT_PRIMARY_COLOR_HOVER = \"#0F766E\";\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 primaryColor,\n onStartChat,\n outOfHoursMessage,\n}) => {\n const baseUrl = 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 if (loading) return null;\n\n if (error) {\n console.info(\"[WebChat] Não foi possível carregar o canal:\", error);\n return null;\n }\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synchat/webchat",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.30",
|
|
4
4
|
"description": "Starter de biblioteca de componentes React + TypeScript com tsup.",
|
|
5
5
|
"author": "synchat <contato@synchat.com.br>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"react-dom": ">=18"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
+
"@types/node": "^22.0.0",
|
|
47
48
|
"@emotion/react": "^11.14.0",
|
|
48
49
|
"@emotion/styled": "^11.14.1",
|
|
49
50
|
"@mui/icons-material": "^7.3.5",
|