@adatechnology/conversations-ui 0.1.0-rc.3 → 0.1.0-rc.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.
Files changed (143) hide show
  1. package/dist/chunk-DXPSPUWF.js +110 -0
  2. package/dist/chunk-GY472G6E.js +2316 -0
  3. package/dist/{chunk-OGRRHQQW.js → chunk-WCBDXZ3X.js} +68 -4
  4. package/dist/flows/index.d.ts +311 -4
  5. package/dist/flows/index.js +1322 -55
  6. package/dist/index.d.ts +1074 -42
  7. package/dist/index.js +3571 -742
  8. package/dist/preview/index.d.ts +328 -8
  9. package/dist/preview/index.js +902 -115
  10. package/dist/styles.css +819 -0
  11. package/dist/types-De5aN-E_.d.ts +502 -0
  12. package/package.json +3 -3
  13. package/src/AudioPlayer.tsx +8 -0
  14. package/src/AudioRecorderButton.test.tsx +30 -0
  15. package/src/AudioRecorderButton.tsx +248 -0
  16. package/src/AudioTranscription.test.tsx +115 -0
  17. package/src/AudioTranscription.tsx +252 -0
  18. package/src/Avatar.tsx +14 -3
  19. package/src/ConversationContextPanel.tsx +218 -44
  20. package/src/ConversationDocumentsPanel.tsx +347 -24
  21. package/src/ConversationHeader.test.tsx +66 -0
  22. package/src/ConversationHeader.tsx +163 -45
  23. package/src/ConversationListItem.tsx +19 -2
  24. package/src/ConversationLocalesProvider.tsx +42 -0
  25. package/src/ConversationRow.tsx +31 -7
  26. package/src/DocumentsLibrary.tsx +382 -0
  27. package/src/EmojiPicker.tsx +70 -55
  28. package/src/FileIcon.test.ts +83 -0
  29. package/src/FileIcon.tsx +88 -11
  30. package/src/InteractiveMessage.test.tsx +41 -0
  31. package/src/InteractiveMessage.tsx +146 -0
  32. package/src/Lightbox.tsx +18 -3
  33. package/src/MediaRenderer.tsx +98 -22
  34. package/src/MessageBubble.test.tsx +41 -0
  35. package/src/MessageBubble.tsx +75 -6
  36. package/src/MessageComposer.test.tsx +35 -0
  37. package/src/MessageComposer.tsx +155 -19
  38. package/src/RichMessageComposer.test.tsx +113 -0
  39. package/src/RichMessageComposer.tsx +551 -0
  40. package/src/SimpleEmojiPicker.tsx +5 -3
  41. package/src/StatusTicks.tsx +1 -1
  42. package/src/Toast.tsx +4 -0
  43. package/src/Tooltip.test.ts +42 -0
  44. package/src/Tooltip.tsx +164 -0
  45. package/src/Wallpaper.test.tsx +21 -0
  46. package/src/Wallpaper.tsx +67 -7
  47. package/src/WhatsAppMessageEditor.tsx +28 -4
  48. package/src/WindowExpiredNotice.tsx +12 -4
  49. package/src/audioRecorderFormat.test.ts +67 -0
  50. package/src/buildOutput.test.ts +79 -0
  51. package/src/composer.constant.ts +33 -0
  52. package/src/conversationTranscript.test.ts +57 -0
  53. package/src/conversationTranscript.ts +29 -4
  54. package/src/conversationWindow.ts +7 -5
  55. package/src/documentTypeLabel.test.ts +57 -0
  56. package/src/documents/DocumentsWorkspace.tsx +543 -0
  57. package/src/documents/index.ts +8 -0
  58. package/src/documents/labels.ts +92 -0
  59. package/src/emojiCatalog.test.ts +35 -0
  60. package/src/emojiCatalog.ts +189 -0
  61. package/src/flows/FlowGroupHeader.tsx +12 -2
  62. package/src/flows/FlowMapCanvas.tsx +15 -12
  63. package/src/flows/FlowMapNode.tsx +4 -1
  64. package/src/flows/FlowNodeCard.tsx +35 -8
  65. package/src/flows/FlowNodePanel.tsx +149 -38
  66. package/src/flows/FlowPalette.tsx +13 -3
  67. package/src/flows/FlowPortalNode.tsx +1 -1
  68. package/src/flows/FlowWhatsAppPreview.tsx +14 -3
  69. package/src/flows/FlowsWorkspace.tsx +1003 -0
  70. package/src/flows/flowCanvasModel.test.ts +293 -0
  71. package/src/flows/flowCanvasModel.ts +342 -0
  72. package/src/flows/flowEditorOps.test.ts +241 -0
  73. package/src/flows/flowEditorOps.ts +177 -0
  74. package/src/flows/flowGraph.ts +6 -6
  75. package/src/flows/index.ts +40 -1
  76. package/src/flows/labels.ts +141 -0
  77. package/src/flows/workspaceContract.test.ts +95 -0
  78. package/src/hooks/useContainerWidth.ts +35 -0
  79. package/src/hooks/useConversationActions.ts +56 -0
  80. package/src/hooks/useConversationDocuments.ts +11 -7
  81. package/src/hooks/useConversationList.ts +15 -9
  82. package/src/hooks/useConversationMessages.ts +2 -2
  83. package/src/hooks/useConversationRealtime.ts +10 -8
  84. package/src/hooks/useScrollToLatestMessage.ts +127 -0
  85. package/src/hooks/useUrlFilterState.ts +107 -0
  86. package/src/icon.constant.ts +12 -0
  87. package/src/index.ts +114 -13
  88. package/src/lib/cn.test.ts +29 -0
  89. package/src/lib/composer-formatting.test.ts +78 -0
  90. package/src/lib/composer-formatting.ts +145 -0
  91. package/src/lib/createMediaUrlResolver.ts +33 -0
  92. package/src/lib/paginated.test.ts +33 -0
  93. package/src/lib/paginated.ts +26 -0
  94. package/src/lib/whatsapp-formatting.test.tsx +37 -0
  95. package/src/lib/whatsapp-formatting.tsx +28 -3
  96. package/src/listing/index.tsx +202 -0
  97. package/src/pagination.constant.ts +10 -0
  98. package/src/preview/ConversationPreview.tsx +199 -13
  99. package/src/preview/ConversationSimulatorPanel.test.tsx +55 -0
  100. package/src/preview/ConversationSimulatorPanel.tsx +89 -0
  101. package/src/preview/MediaTypesPreview.tsx +87 -0
  102. package/src/preview/conversationPreviewFailures.test.ts +64 -0
  103. package/src/preview/createMockConversationsApi.ts +175 -15
  104. package/src/preview/createPreviewBridgeClient.test.ts +92 -0
  105. package/src/preview/createPreviewBridgeClient.ts +124 -0
  106. package/src/preview/createPreviewMediaUploader.ts +82 -0
  107. package/src/preview/createPreviewWebhookClient.test.ts +96 -0
  108. package/src/preview/createPreviewWebhookClient.ts +127 -4
  109. package/src/preview/index.ts +33 -3
  110. package/src/preview/mediaTypeOf.test.ts +15 -0
  111. package/src/preview/mockDocumentsSearch.test.ts +57 -0
  112. package/src/preview/preview.test.ts +5 -3
  113. package/src/preview/previewFileSamples.test.ts +151 -0
  114. package/src/preview/previewFileSamples.ts +74 -0
  115. package/src/preview/previewFixtures.ts +288 -1
  116. package/src/preview/previewMediaSource.test.ts +62 -0
  117. package/src/preview/previewMediaSource.ts +91 -0
  118. package/src/preview/previewMediaUploader.test.ts +61 -0
  119. package/src/providers/ConversationsProvider.tsx +8 -6
  120. package/src/providers/types.ts +185 -10
  121. package/src/quickReply.test.ts +58 -0
  122. package/src/settings/MessagesWorkspace.tsx +468 -0
  123. package/src/settings/TopicsForm.tsx +2 -0
  124. package/src/settings/TranscriptionSettingsForm.test.tsx +81 -0
  125. package/src/settings/TranscriptionSettingsForm.tsx +190 -0
  126. package/src/settings/WelcomeFarewellForm.tsx +1 -0
  127. package/src/settings/WhatsAppCreateTemplateForm.tsx +4 -1
  128. package/src/settings/WhatsAppTemplateSettingsForm.tsx +5 -2
  129. package/src/settings/WhatsAppTemplatesSettings.tsx +9 -1
  130. package/src/styles.css +783 -0
  131. package/src/types.ts +64 -1
  132. package/src/useWaitingNotifications.ts +74 -29
  133. package/src/workspace/BulkTemplateModal.tsx +132 -0
  134. package/src/workspace/ConversationPane.tsx +432 -0
  135. package/src/workspace/ConversationsInboxList.tsx +194 -0
  136. package/src/workspace/ConversationsWorkspace.tsx +346 -0
  137. package/src/workspace/index.ts +12 -0
  138. package/src/workspace/labels.test.ts +17 -0
  139. package/src/workspace/labels.ts +85 -0
  140. package/src/workspace/useConversationsInbox.ts +332 -0
  141. package/dist/chunk-N7B24WYD.js +0 -719
  142. package/dist/chunk-NV2RZ5KT.js +0 -56
  143. package/dist/types-C0PtaO7S.d.ts +0 -207
@@ -0,0 +1,190 @@
1
+ import type { FormEvent } from 'react'
2
+ import { AudioLines, Save } from 'lucide-react'
3
+ import type { TranscriptionMode } from '../types'
4
+
5
+ export interface TranscriptionSettingsFormLabels {
6
+ sectionTitle: string
7
+ enabled: string
8
+ enabledHint: string
9
+ modeTitle: string
10
+ modeAuto: string
11
+ modeAutoHint: string
12
+ modeOnDemand: string
13
+ modeOnDemandHint: string
14
+ unavailable: string
15
+ save: string
16
+ saving: string
17
+ saveSuccess: string
18
+ }
19
+
20
+ const DEFAULT_LABELS: TranscriptionSettingsFormLabels = {
21
+ sectionTitle: 'Transcrição de áudio',
22
+ enabled: 'Transcrever notas de voz',
23
+ enabledHint: 'Converte o áudio do cliente em texto, que o atendente lê e copia direto da conversa.',
24
+ modeTitle: 'Quando transcrever',
25
+ modeAuto: 'Automaticamente',
26
+ modeAutoHint: 'Toda nota de voz recebida é transcrita na hora. Mais cômodo, consome mais cota.',
27
+ modeOnDemand: 'Quando o atendente pedir',
28
+ modeOnDemandHint: 'Transcreve só ao clicar no botão da conversa. Consome cota apenas com áudio que alguém vai ler.',
29
+ unavailable: 'Transcrição não está disponível neste ambiente — fale com quem administra a instalação.',
30
+ save: 'Salvar',
31
+ saving: 'Salvando...',
32
+ saveSuccess: 'Configuração de transcrição salva.',
33
+ }
34
+
35
+ export interface TranscriptionSettingsFormProps {
36
+ enabled: boolean
37
+ onEnabledChange: (value: boolean) => void
38
+ mode: TranscriptionMode
39
+ onModeChange: (value: TranscriptionMode) => void
40
+ onSave: (event: FormEvent) => void
41
+ /**
42
+ * A capacidade existe no servidor (engine e credencial configurados)?
43
+ *
44
+ * Distinto de `enabled`: isto é "o ambiente consegue", aquilo é "esta empresa quer". Sem a
45
+ * distinção, um lojista ligaria o interruptor num ambiente sem engine e concluiria que o produto
46
+ * está quebrado — o texto nunca apareceria e nada explicaria por quê.
47
+ */
48
+ isAvailable?: boolean
49
+ saving?: boolean
50
+ saveSuccess?: boolean
51
+ labels?: Partial<TranscriptionSettingsFormLabels>
52
+ }
53
+
54
+ /**
55
+ * Interruptor de transcrição por empresa, para a tela de configurações.
56
+ *
57
+ * Puramente apresentacional, como os outros forms daqui: quem persiste é o host. O pacote não sabe a
58
+ * rota, e a política vive nas configurações do módulo (`settings.transcriptionEnabled`), não em
59
+ * variável de ambiente — mudar de ideia sobre transcrever não deveria exigir deploy.
60
+ */
61
+ export function TranscriptionSettingsForm({
62
+ enabled,
63
+ onEnabledChange,
64
+ mode,
65
+ onModeChange,
66
+ onSave,
67
+ isAvailable = true,
68
+ saving = false,
69
+ saveSuccess = false,
70
+ labels: labelsOverride,
71
+ }: TranscriptionSettingsFormProps) {
72
+ const labels = { ...DEFAULT_LABELS, ...labelsOverride }
73
+
74
+ return (
75
+ <section className="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 overflow-hidden">
76
+ <div className="px-6 py-4 border-b border-gray-100 dark:border-gray-700">
77
+ <h2 className="text-sm font-semibold text-gray-900 dark:text-gray-100 flex items-center gap-1.5">
78
+ <AudioLines size={14} className="text-blue-600 dark:text-blue-400" />
79
+ {labels.sectionTitle}
80
+ </h2>
81
+ </div>
82
+
83
+ <form onSubmit={onSave} className="p-6 space-y-5">
84
+ {!isAvailable && (
85
+ <div className="bg-amber-50 dark:bg-amber-950/40 border border-amber-200 dark:border-amber-800 rounded-xl px-4 py-3 text-sm text-amber-800 dark:text-amber-300">
86
+ {labels.unavailable}
87
+ </div>
88
+ )}
89
+
90
+ <label className="flex items-start gap-3 cursor-pointer">
91
+ <input
92
+ type="checkbox"
93
+ checked={enabled}
94
+ onChange={(event) => onEnabledChange(event.target.checked)}
95
+ disabled={!isAvailable}
96
+ className="mt-0.5 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 disabled:opacity-50"
97
+ />
98
+ <span>
99
+ <span className="block text-sm font-medium text-gray-700 dark:text-gray-300">{labels.enabled}</span>
100
+ <span className="block text-xs text-gray-500 dark:text-gray-400">{labels.enabledHint}</span>
101
+ </span>
102
+ </label>
103
+
104
+ {/* O modo só aparece quando ligado: escolher "quando transcrever" sem transcrever nada é uma
105
+ pergunta sem consequência, e ler as duas opções gasta atenção do operador à toa. */}
106
+ {enabled && (
107
+ <fieldset disabled={!isAvailable} className="space-y-2.5">
108
+ <legend className="text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">{labels.modeTitle}</legend>
109
+
110
+ <ModeOption
111
+ value="onDemand"
112
+ current={mode}
113
+ onSelect={onModeChange}
114
+ title={labels.modeOnDemand}
115
+ hint={labels.modeOnDemandHint}
116
+ />
117
+ <ModeOption
118
+ value="auto"
119
+ current={mode}
120
+ onSelect={onModeChange}
121
+ title={labels.modeAuto}
122
+ hint={labels.modeAutoHint}
123
+ />
124
+ </fieldset>
125
+ )}
126
+
127
+ {saveSuccess && (
128
+ <div className="bg-green-50 dark:bg-green-950/40 border border-green-200 dark:border-green-800 rounded-xl px-4 py-3 text-sm text-green-700 dark:text-green-400">
129
+ {labels.saveSuccess}
130
+ </div>
131
+ )}
132
+
133
+ <div className="flex justify-end">
134
+ <button
135
+ data-cv-tooltip={saving ? labels.saving : labels.save} aria-label={saving ? labels.saving : labels.save}
136
+ type="submit"
137
+ disabled={saving || !isAvailable}
138
+ className="flex items-center gap-2 bg-blue-600 hover:bg-blue-700 disabled:bg-blue-400 text-white font-semibold px-5 py-2.5 rounded-xl transition-colors text-sm"
139
+ >
140
+ {saving ? (
141
+ <span className="w-4 h-4 border-2 border-white/40 border-t-white rounded-full animate-spin" />
142
+ ) : (
143
+ <Save size={14} />
144
+ )}
145
+ {saving ? labels.saving : labels.save}
146
+ </button>
147
+ </div>
148
+ </form>
149
+ </section>
150
+ )
151
+ }
152
+
153
+ function ModeOption({
154
+ value,
155
+ current,
156
+ onSelect,
157
+ title,
158
+ hint,
159
+ }: {
160
+ value: TranscriptionMode
161
+ current: TranscriptionMode
162
+ onSelect: (value: TranscriptionMode) => void
163
+ title: string
164
+ hint: string
165
+ }) {
166
+ const isSelected = current === value
167
+
168
+ return (
169
+ <label
170
+ className={`flex items-start gap-3 cursor-pointer rounded-xl border px-4 py-3 transition-colors ${
171
+ isSelected
172
+ ? 'border-blue-500 bg-blue-50 dark:border-blue-500 dark:bg-blue-950/30'
173
+ : 'border-gray-200 hover:border-gray-300 dark:border-gray-700 dark:hover:border-gray-600'
174
+ }`}
175
+ >
176
+ <input
177
+ type="radio"
178
+ name="transcription-mode"
179
+ value={value}
180
+ checked={isSelected}
181
+ onChange={() => onSelect(value)}
182
+ className="mt-0.5 h-4 w-4 border-gray-300 text-blue-600 focus:ring-blue-500"
183
+ />
184
+ <span>
185
+ <span className="block text-sm font-medium text-gray-700 dark:text-gray-300">{title}</span>
186
+ <span className="block text-xs text-gray-500 dark:text-gray-400">{hint}</span>
187
+ </span>
188
+ </label>
189
+ )
190
+ }
@@ -104,6 +104,7 @@ export function WelcomeFarewellForm({
104
104
 
105
105
  <div className="flex justify-end">
106
106
  <button
107
+ data-cv-tooltip={saving ? labels.saving : labels.save} aria-label={saving ? labels.saving : labels.save}
107
108
  type="submit"
108
109
  disabled={saving}
109
110
  className="flex items-center gap-2 bg-blue-600 hover:bg-blue-700 disabled:bg-blue-400 text-white font-semibold px-5 py-2.5 rounded-xl transition-colors text-sm"
@@ -24,6 +24,7 @@ export interface WhatsAppCreateTemplateFormLabels {
24
24
  sectionDescription: string
25
25
  nameLabel: string
26
26
  nameHint: string
27
+ namePlaceholder: string
27
28
  categoryLabel: string
28
29
  languageLabel: string
29
30
  headerLabel: string
@@ -57,6 +58,7 @@ const DEFAULT_LABELS: WhatsAppCreateTemplateFormLabels = {
57
58
  sectionDescription: 'Envia um template para aprovação da Meta.',
58
59
  nameLabel: 'Nome do template',
59
60
  nameHint: 'Somente letras minúsculas, números e underscore.',
61
+ namePlaceholder: 'reengajamento_cliente',
60
62
  categoryLabel: 'Categoria',
61
63
  languageLabel: 'Idioma',
62
64
  headerLabel: 'Cabeçalho',
@@ -142,7 +144,7 @@ export function WhatsAppCreateTemplateForm({
142
144
  type="text"
143
145
  value={value.name}
144
146
  onChange={(e) => set('name', e.target.value.toLowerCase().replace(/[^a-z0-9_]/g, '_'))}
145
- placeholder="reengajamento_cliente"
147
+ placeholder={labels.namePlaceholder}
146
148
  className="w-full border border-gray-200 dark:border-gray-600 dark:bg-gray-700 dark:text-gray-100 rounded-xl px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-blue-400 focus:border-transparent transition-all"
147
149
  required
148
150
  />
@@ -295,6 +297,7 @@ export function WhatsAppCreateTemplateForm({
295
297
 
296
298
  <div className="flex justify-end">
297
299
  <button
300
+ data-cv-tooltip={submitting ? labels.sending : labels.sendForApproval} aria-label={submitting ? labels.sending : labels.sendForApproval}
298
301
  type="submit"
299
302
  disabled={submitting || !value.name || !value.bodyText}
300
303
  className="flex items-center gap-2 bg-emerald-600 hover:bg-emerald-700 disabled:bg-emerald-400 text-white font-semibold px-5 py-2.5 rounded-xl transition-colors text-sm"
@@ -132,6 +132,7 @@ export function WhatsAppTemplateSettingsForm({
132
132
  <div className="flex items-center justify-between mb-1.5">
133
133
  <label className="text-sm font-medium text-gray-700 dark:text-gray-300">{labels.templateLabel}</label>
134
134
  <button
135
+ data-cv-tooltip={labels.refreshList} aria-label={labels.refreshList}
135
136
  type="button"
136
137
  onClick={onRefreshTemplates}
137
138
  disabled={loadingTemplates}
@@ -180,6 +181,7 @@ export function WhatsAppTemplateSettingsForm({
180
181
  <div className="flex items-center justify-between mb-1.5">
181
182
  <label className="text-sm font-medium text-gray-700 dark:text-gray-300">{labels.variablesLabel}</label>
182
183
  <button
184
+ data-cv-tooltip={labels.addVariable} aria-label={labels.addVariable}
183
185
  type="button"
184
186
  onClick={() => onVariablesChange([...variables, ''])}
185
187
  className="flex items-center gap-1 text-xs text-blue-600 dark:text-blue-400 hover:underline"
@@ -198,7 +200,7 @@ export function WhatsAppTemplateSettingsForm({
198
200
  key={available.token}
199
201
  type="button"
200
202
  onClick={() => insertVariable(available.token)}
201
- title={`Inserir ${available.token}`}
203
+ data-cv-tooltip={`Inserir ${available.token}`} aria-label={`Inserir ${available.token}`}
202
204
  className="inline-flex items-center gap-1 rounded-md border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-800 px-2 py-1 text-xs hover:border-blue-400 dark:hover:border-blue-500 transition-colors"
203
205
  >
204
206
  <code className="text-blue-600 dark:text-blue-300">{available.token}</code>
@@ -233,7 +235,7 @@ export function WhatsAppTemplateSettingsForm({
233
235
  type="button"
234
236
  onClick={() => removeVariable(index)}
235
237
  className="text-gray-400 hover:text-red-500 dark:hover:text-red-400 transition-colors flex-shrink-0"
236
- title={labels.removeVariable}
238
+ data-cv-tooltip={labels.removeVariable} aria-label={labels.removeVariable}
237
239
  >
238
240
  <Trash2 size={14} />
239
241
  </button>
@@ -250,6 +252,7 @@ export function WhatsAppTemplateSettingsForm({
250
252
 
251
253
  <div className="flex justify-end">
252
254
  <button
255
+ data-cv-tooltip={saving ? labels.saving : labels.save} aria-label={saving ? labels.saving : labels.save}
253
256
  type="submit"
254
257
  disabled={saving || !selectedTemplateName.trim()}
255
258
  className="flex items-center gap-2 bg-blue-600 hover:bg-blue-700 disabled:bg-blue-400 text-white font-semibold px-5 py-2.5 rounded-xl transition-colors text-sm"
@@ -13,9 +13,11 @@ import {
13
13
  WhatsAppTemplateSettingsForm,
14
14
  type WhatsAppTemplateSummary,
15
15
  type WhatsAppTemplateVariableSuggestion,
16
+ type WhatsAppTemplateSettingsFormLabels,
16
17
  } from './WhatsAppTemplateSettingsForm'
17
18
  import {
18
19
  WhatsAppCreateTemplateForm,
20
+ type WhatsAppCreateTemplateFormLabels,
19
21
  type WhatsAppCreateTemplateResult,
20
22
  type WhatsAppCreateTemplateState,
21
23
  } from './WhatsAppCreateTemplateForm'
@@ -56,12 +58,16 @@ export interface WhatsAppTemplatesSettingsProps {
56
58
  onSubmit: (event: FormEvent) => void
57
59
  submitting?: boolean
58
60
  result?: WhatsAppCreateTemplateResult | null
61
+ labels?: Partial<WhatsAppCreateTemplateFormLabels>
59
62
  }
60
63
  labels?: Partial<WhatsAppTemplatesSettingsLabels>
64
+ /** Vocabulário do formulário de seleção — separado de `labels`, que nomeia só as abas daqui. */
65
+ settingsLabels?: Partial<WhatsAppTemplateSettingsFormLabels>
61
66
  }
62
67
 
63
68
  export function WhatsAppTemplatesSettings({
64
69
  labels: labelsOverride,
70
+ settingsLabels,
65
71
  create,
66
72
  ...settingsProps
67
73
  }: WhatsAppTemplatesSettingsProps) {
@@ -72,6 +78,7 @@ export function WhatsAppTemplatesSettings({
72
78
  <div className="space-y-4">
73
79
  <nav className="flex gap-1 border-b" role="tablist">
74
80
  <button
81
+ data-cv-tooltip={labels.selectTab} aria-label={labels.selectTab}
75
82
  type="button"
76
83
  role="tab"
77
84
  aria-selected={tab === TEMPLATE_SETTINGS_TAB.SELECT}
@@ -85,6 +92,7 @@ export function WhatsAppTemplatesSettings({
85
92
  que não leva a nada. */}
86
93
  {create ? (
87
94
  <button
95
+ data-cv-tooltip={labels.createTab} aria-label={labels.createTab}
88
96
  type="button"
89
97
  role="tab"
90
98
  aria-selected={tab === TEMPLATE_SETTINGS_TAB.CREATE}
@@ -97,7 +105,7 @@ export function WhatsAppTemplatesSettings({
97
105
  </nav>
98
106
 
99
107
  {tab === TEMPLATE_SETTINGS_TAB.SELECT ? (
100
- <WhatsAppTemplateSettingsForm {...settingsProps} />
108
+ <WhatsAppTemplateSettingsForm {...settingsProps} {...(settingsLabels ? { labels: settingsLabels } : {})} />
101
109
  ) : create ? (
102
110
  <WhatsAppCreateTemplateForm {...create} />
103
111
  ) : null}