@fayz-ai/plugin-conversations 0.23.14 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,92 @@
1
+ import { Bot, Sparkles, Check, Settings2 } from 'lucide-react';
2
+ import { usePluginRuntimeOptional, tl, navigateApp, formatCurrency } from '@fayz-ai/core';
3
+ import { PRICE_BOOK } from '@fayz-ai/admin';
4
+ import { Card, Badge, Button, ComingSoon } from '@fayz-ai/ui';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ // src/views/AtendeAIPage.tsx
8
+ var money = (n) => formatCurrency(n, "BRL");
9
+ var PROMISES = [
10
+ ["Answers your clients on WhatsApp, day and night", "Responde seus clientes no WhatsApp, de dia e de noite"],
11
+ ["Books, confirms and takes orders by itself", "Agenda, confirma e anota pedidos sozinho"],
12
+ ["Hands over to a person when it should", "Passa para uma pessoa quando precisa"],
13
+ ["Learns your prices, hours and services", "Aprende seus pre\xE7os, hor\xE1rios e servi\xE7os"]
14
+ ];
15
+ function AtendeAIPage() {
16
+ const runtime = usePluginRuntimeOptional();
17
+ const plugin = runtime?.plugins.find((p) => p.id === "conversations");
18
+ const on = plugin?.config?.facets?.atendeai === true;
19
+ const price = PRICE_BOOK["conversations.atendeai"];
20
+ const go = (hash) => {
21
+ navigateApp(hash);
22
+ };
23
+ if (!on) {
24
+ return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl space-y-4", children: [
25
+ /* @__PURE__ */ jsx(Card, { className: "overflow-hidden border-violet-200 dark:border-violet-900", children: /* @__PURE__ */ jsxs("div", { className: "space-y-5 bg-gradient-to-br from-violet-50 to-transparent p-6 dark:from-violet-950/40", children: [
26
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
27
+ /* @__PURE__ */ jsx("span", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-violet-100 text-violet-700 dark:bg-violet-900/60 dark:text-violet-200", children: /* @__PURE__ */ jsx(Bot, { className: "h-6 w-6", "aria-hidden": true }) }),
28
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-1", children: [
29
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
30
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: "AtendeAI" }),
31
+ /* @__PURE__ */ jsxs(Badge, { className: "border-transparent bg-violet-100 text-violet-700 dark:bg-violet-900/60 dark:text-violet-200", children: [
32
+ /* @__PURE__ */ jsx(Sparkles, { className: "mr-1 h-3 w-3", "aria-hidden": true }),
33
+ tl("AI", "IA")
34
+ ] })
35
+ ] }),
36
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: tl(
37
+ "An attendant that never sleeps: it talks to your clients on WhatsApp and only calls your team when it matters.",
38
+ "Um atendente que n\xE3o dorme: conversa com seus clientes no WhatsApp e s\xF3 chama a sua equipe quando importa."
39
+ ) })
40
+ ] })
41
+ ] }),
42
+ /* @__PURE__ */ jsx("ul", { className: "grid gap-2 sm:grid-cols-2", children: PROMISES.map(([en, pt]) => /* @__PURE__ */ jsxs("li", { className: "flex items-start gap-2 text-sm", children: [
43
+ /* @__PURE__ */ jsx(Check, { className: "mt-0.5 h-4 w-4 shrink-0 text-violet-600 dark:text-violet-300", "aria-hidden": true }),
44
+ /* @__PURE__ */ jsx("span", { children: tl(en, pt) })
45
+ ] }, pt)) }),
46
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between", children: [
47
+ price && /* @__PURE__ */ jsxs("p", { className: "text-sm", children: [
48
+ /* @__PURE__ */ jsx("span", { className: "text-2xl font-bold tabular-nums", children: money(price.price) }),
49
+ /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground", children: [
50
+ " ",
51
+ price.per === "unit" ? tl("per unit / month", "por unidade / m\xEAs") : tl("/ month", "/ m\xEAs")
52
+ ] })
53
+ ] }),
54
+ /* @__PURE__ */ jsxs(Button, { className: "h-11 bg-violet-600 text-white hover:bg-violet-700", onClick: () => go("/settings/modules"), children: [
55
+ /* @__PURE__ */ jsx(Sparkles, { className: "h-4 w-4", "aria-hidden": true }),
56
+ tl("Turn on AtendeAI", "Ligar o AtendeAI")
57
+ ] })
58
+ ] })
59
+ ] }) }),
60
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: tl("Turned on in Settings \u203A Modules; its settings appear right after.", "Liga em Configura\xE7\xF5es \u203A M\xF3dulos; as configura\xE7\xF5es dele aparecem logo em seguida.") })
61
+ ] });
62
+ }
63
+ return /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl space-y-4", children: [
64
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap justify-end gap-2", children: [
65
+ /* @__PURE__ */ jsx(Button, { variant: "ghost", className: "h-11", onClick: () => go("/settings/modules"), children: tl("Manage or turn off", "Gerenciar ou desligar") }),
66
+ /* @__PURE__ */ jsxs(Button, { variant: "outline", className: "h-11", onClick: () => go("/settings/conversations-atendeai"), children: [
67
+ /* @__PURE__ */ jsx(Settings2, { className: "h-4 w-4", "aria-hidden": true }),
68
+ tl("AtendeAI settings", "Configura\xE7\xF5es do AtendeAI")
69
+ ] })
70
+ ] }),
71
+ /* @__PURE__ */ jsx(
72
+ ComingSoon,
73
+ {
74
+ title: tl("AtendeAI operation", "Opera\xE7\xE3o do AtendeAI"),
75
+ summary: tl(
76
+ "Follow what the AI is answering, accept or correct its drafts and teach it new answers.",
77
+ "Acompanhe o que a IA est\xE1 respondendo, aceite ou corrija os rascunhos e ensine respostas novas."
78
+ ),
79
+ v1Path: "AtendeAI \u2192 Opera\xE7\xE3o",
80
+ missing: [
81
+ tl("The WhatsApp number of each unit connected", "O n\xFAmero de WhatsApp de cada unidade conectado"),
82
+ tl("The AI answering engine (personality, Q&A, capabilities)", "O motor de respostas da IA (personalidade, perguntas e respostas, capacidades)"),
83
+ tl("The queue of drafts waiting for acceptance", "A fila de rascunhos esperando aceite")
84
+ ]
85
+ }
86
+ )
87
+ ] });
88
+ }
89
+
90
+ export { AtendeAIPage };
91
+ //# sourceMappingURL=AtendeAIPage-PBBMWIDW.js.map
92
+ //# sourceMappingURL=AtendeAIPage-PBBMWIDW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/views/AtendeAIPage.tsx"],"names":[],"mappings":"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","file":"AtendeAIPage-PBBMWIDW.js","sourcesContent":["import * as React from 'react'\nimport { Bot, Check, Settings2, Sparkles } from 'lucide-react'\nimport { tl, usePluginRuntimeOptional, formatCurrency, navigateApp } from '@fayz-ai/core'\nimport { PRICE_BOOK } from '@fayz-ai/admin'\nimport { Badge, Button, Card, ComingSoon } from '@fayz-ai/ui'\n\n// The platform's own prices are in BRL whatever the tenant's currency.\nconst money = (n: number) => formatCurrency(n, 'BRL')\n\nconst PROMISES: Array<[string, string]> = [\n ['Answers your clients on WhatsApp, day and night', 'Responde seus clientes no WhatsApp, de dia e de noite'],\n ['Books, confirms and takes orders by itself', 'Agenda, confirma e anota pedidos sozinho'],\n ['Hands over to a person when it should', 'Passa para uma pessoa quando precisa'],\n ['Learns your prices, hours and services', 'Aprende seus preços, horários e serviços'],\n]\n\n/**\n * AtendeAI's door in the rail, as in V1 (Bot icon, \"Operação\" + \"Configurações\").\n * Off: the upsell, priced per unit. On: what the operation screen will do, and\n * the way to its settings.\n */\nexport function AtendeAIPage() {\n const runtime = usePluginRuntimeOptional()\n const plugin = runtime?.plugins.find((p) => p.id === 'conversations')\n const on = (plugin?.config?.facets as Record<string, boolean> | undefined)?.atendeai === true\n const price = PRICE_BOOK['conversations.atendeai']\n const go = (hash: string) => { navigateApp(hash) }\n\n if (!on) {\n return (\n <div className=\"mx-auto max-w-3xl space-y-4\">\n <Card className=\"overflow-hidden border-violet-200 dark:border-violet-900\">\n <div className=\"space-y-5 bg-gradient-to-br from-violet-50 to-transparent p-6 dark:from-violet-950/40\">\n <div className=\"flex items-start gap-3\">\n <span className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-violet-100 text-violet-700 dark:bg-violet-900/60 dark:text-violet-200\">\n <Bot className=\"h-6 w-6\" aria-hidden />\n </span>\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h2 className=\"text-lg font-semibold\">AtendeAI</h2>\n <Badge className=\"border-transparent bg-violet-100 text-violet-700 dark:bg-violet-900/60 dark:text-violet-200\">\n <Sparkles className=\"mr-1 h-3 w-3\" aria-hidden />{tl('AI', 'IA')}\n </Badge>\n </div>\n <p className=\"text-sm text-muted-foreground\">\n {tl('An attendant that never sleeps: it talks to your clients on WhatsApp and only calls your team when it matters.',\n 'Um atendente que não dorme: conversa com seus clientes no WhatsApp e só chama a sua equipe quando importa.')}\n </p>\n </div>\n </div>\n <ul className=\"grid gap-2 sm:grid-cols-2\">\n {PROMISES.map(([en, pt]) => (\n <li key={pt} className=\"flex items-start gap-2 text-sm\">\n <Check className=\"mt-0.5 h-4 w-4 shrink-0 text-violet-600 dark:text-violet-300\" aria-hidden />\n <span>{tl(en, pt)}</span>\n </li>\n ))}\n </ul>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n {price && (\n <p className=\"text-sm\">\n <span className=\"text-2xl font-bold tabular-nums\">{money(price.price)}</span>\n <span className=\"text-muted-foreground\"> {price.per === 'unit' ? tl('per unit / month', 'por unidade / mês') : tl('/ month', '/ mês')}</span>\n </p>\n )}\n <Button className=\"h-11 bg-violet-600 text-white hover:bg-violet-700\" onClick={() => go('/settings/modules')}>\n <Sparkles className=\"h-4 w-4\" aria-hidden />\n {tl('Turn on AtendeAI', 'Ligar o AtendeAI')}\n </Button>\n </div>\n </div>\n </Card>\n <p className=\"text-xs text-muted-foreground\">\n {tl('Turned on in Settings › Modules; its settings appear right after.', 'Liga em Configurações › Módulos; as configurações dele aparecem logo em seguida.')}\n </p>\n </div>\n )\n }\n\n return (\n <div className=\"mx-auto max-w-3xl space-y-4\">\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button variant=\"ghost\" className=\"h-11\" onClick={() => go('/settings/modules')}>\n {tl('Manage or turn off', 'Gerenciar ou desligar')}\n </Button>\n <Button variant=\"outline\" className=\"h-11\" onClick={() => go('/settings/conversations-atendeai')}>\n <Settings2 className=\"h-4 w-4\" aria-hidden />\n {tl('AtendeAI settings', 'Configurações do AtendeAI')}\n </Button>\n </div>\n <ComingSoon\n title={tl('AtendeAI operation', 'Operação do AtendeAI')}\n summary={tl('Follow what the AI is answering, accept or correct its drafts and teach it new answers.',\n 'Acompanhe o que a IA está respondendo, aceite ou corrija os rascunhos e ensine respostas novas.')}\n v1Path=\"AtendeAI → Operação\"\n missing={[\n tl('The WhatsApp number of each unit connected', 'O número de WhatsApp de cada unidade conectado'),\n tl('The AI answering engine (personality, Q&A, capabilities)', 'O motor de respostas da IA (personalidade, perguntas e respostas, capacidades)'),\n tl('The queue of drafts waiting for acceptance', 'A fila de rascunhos esperando aceite'),\n ]}\n />\n </div>\n )\n}\n"]}