@fusioni/client-sdk 1.1.6 → 1.1.9

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.esm.js CHANGED
@@ -1,7 +1,240 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { useState, useEffect, useCallback, useMemo, useRef } from 'react';
2
+ import { useState, useEffect, useCallback, useMemo, useRef, forwardRef, useImperativeHandle } from 'react';
3
3
  import { createPortal } from 'react-dom';
4
4
 
5
+ const en = {
6
+ // Chat Interface
7
+ chat: {
8
+ title: 'Fusioni AI',
9
+ subtitle: 'AI Assistant',
10
+ welcome: {
11
+ title: 'Welcome to Fusioni',
12
+ description: 'Start a new conversation to begin chatting with AI',
13
+ startButton: 'Start New Conversation',
14
+ creating: 'Creating...'
15
+ },
16
+ input: {
17
+ placeholder: 'Type your message...',
18
+ send: 'Send',
19
+ upload: 'Upload',
20
+ record: 'Record'
21
+ },
22
+ conversations: {
23
+ title: 'Conversations',
24
+ search: 'Search conversations...',
25
+ newConversation: 'New Conversation',
26
+ noConversations: 'No conversations yet',
27
+ delete: 'Delete conversation',
28
+ newIndicator: 'New conversation - will be saved when you send a message',
29
+ deleteConfirm: {
30
+ title: 'Delete Conversation',
31
+ message: 'Are you sure you want to delete this conversation? This action cannot be undone.',
32
+ confirm: 'Delete',
33
+ cancel: 'Cancel'
34
+ }
35
+ },
36
+ attachedImages: 'Images',
37
+ attachedVideos: 'Videos',
38
+ messages: {
39
+ loading: 'Working on it...',
40
+ error: 'Oops! Something went wrong. Please try again later.',
41
+ delete: 'Delete message',
42
+ deleteConfirm: {
43
+ title: 'Delete Message',
44
+ message: 'Are you sure you want to delete this message? This action cannot be undone.',
45
+ confirm: 'Delete',
46
+ cancel: 'Cancel'
47
+ }
48
+ },
49
+ connection: {
50
+ connected: 'Real-time updates connected',
51
+ disconnected: 'Real-time updates disconnected'
52
+ },
53
+ fullscreen: {
54
+ enter: 'Enter fullscreen',
55
+ exit: 'Exit fullscreen'
56
+ },
57
+ theme: {
58
+ light: 'Switch to light theme',
59
+ dark: 'Switch to dark theme'
60
+ },
61
+ emptyState: {
62
+ title: 'Start a conversation',
63
+ description: 'Send a message to begin chatting with the AI assistant'
64
+ },
65
+ errors: {
66
+ failedToCreateConversation: 'Failed to create conversation',
67
+ failedToLoadConversation: 'Failed to load conversation',
68
+ failedToDeleteConversation: 'Failed to delete conversation',
69
+ failedToSendMessage: 'Failed to send message',
70
+ failedToDeleteMessage: 'Failed to delete message',
71
+ failedToUploadFile: 'Failed to upload file',
72
+ failedToInitialize: 'Failed to initialize chat service',
73
+ retry: 'Retry'
74
+ }
75
+ },
76
+ // Language Switcher
77
+ language: {
78
+ english: 'English',
79
+ greek: 'Ελληνικά',
80
+ switchLanguage: 'Switch Language'
81
+ },
82
+ // Common
83
+ common: {
84
+ close: 'Close',
85
+ open: 'Open',
86
+ cancel: 'Cancel',
87
+ confirm: 'Confirm',
88
+ save: 'Save',
89
+ delete: 'Delete',
90
+ edit: 'Edit',
91
+ search: 'Search',
92
+ clear: 'Clear',
93
+ loading: 'Loading...',
94
+ error: 'Error',
95
+ success: 'Success',
96
+ warning: 'Warning',
97
+ info: 'Info',
98
+ yes: 'Yes',
99
+ no: 'No'
100
+ }
101
+ };
102
+
103
+ const el = {
104
+ // Chat Interface
105
+ chat: {
106
+ title: 'Fusioni AI',
107
+ subtitle: 'AI Βοηθός',
108
+ welcome: {
109
+ title: 'Καλώς ήρθατε στο Fusioni AI',
110
+ description: 'Ξεκινήστε μια νέα συνομιλία για να αρχίσετε να συνομιλείτε με AI',
111
+ startButton: 'Ξεκινήστε Νέα Συνομιλία',
112
+ creating: 'Δημιουργία...'
113
+ },
114
+ input: {
115
+ placeholder: 'Πληκτρολογήστε το μήνυμά σας...',
116
+ send: 'Αποστολή',
117
+ upload: 'Ανέβασμα',
118
+ record: 'Εγγραφή'
119
+ },
120
+ conversations: {
121
+ title: 'Συνομιλίες',
122
+ search: 'Αναζήτηση συνομιλιών...',
123
+ newConversation: 'Νέα Συνομιλία',
124
+ noConversations: 'Δεν υπάρχουν συνομιλίες ακόμα',
125
+ delete: 'Διαγραφή συνομιλίας',
126
+ newIndicator: 'Νέα συνομιλία - θα αποθηκευτεί όταν στείλετε μήνυμα',
127
+ deleteConfirm: {
128
+ title: 'Διαγραφή Συνομιλίας',
129
+ message: 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή τη συνομιλία; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
130
+ confirm: 'Διαγραφή',
131
+ cancel: 'Ακύρωση'
132
+ }
133
+ },
134
+ attachedImages: 'Εικόνες',
135
+ attachedVideos: 'Βίντεο',
136
+ messages: {
137
+ loading: 'Εργάζομαι...',
138
+ error: 'Ουπς! Κάτι πήγε στραβά. Παρακαλώ δοκιμάστε ξανά αργότερα.',
139
+ delete: 'Διαγραφή μηνύματος',
140
+ deleteConfirm: {
141
+ title: 'Διαγραφή Μηνύματος',
142
+ message: 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το μήνυμα; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
143
+ confirm: 'Διαγραφή',
144
+ cancel: 'Ακύρωση'
145
+ }
146
+ },
147
+ connection: {
148
+ connected: 'Συνδεδεμένο για ενημερώσεις σε πραγματικό χρόνο',
149
+ disconnected: 'Αποσυνδεδεμένο από ενημερώσεις σε πραγματικό χρόνο'
150
+ },
151
+ fullscreen: {
152
+ enter: 'Πλήρης οθόνη',
153
+ exit: 'Έξοδος από πλήρη οθόνη'
154
+ },
155
+ theme: {
156
+ light: 'Εναλλαγή σε φωτεινό θέμα',
157
+ dark: 'Εναλλαγή σε σκοτεινό θέμα'
158
+ },
159
+ emptyState: {
160
+ title: 'Ξεκινήστε μια συνομιλία',
161
+ description: 'Στείλτε ένα μήνυμα για να ξεκινήσετε συνομιλία με τον βοηθό AI'
162
+ },
163
+ errors: {
164
+ failedToCreateConversation: 'Αποτυχία δημιουργίας συνομιλίας',
165
+ failedToLoadConversation: 'Αποτυχία φόρτωσης συνομιλίας',
166
+ failedToDeleteConversation: 'Αποτυχία διαγραφής συνομιλίας',
167
+ failedToSendMessage: 'Αποτυχία αποστολής μηνύματος',
168
+ failedToDeleteMessage: 'Αποτυχία διαγραφής μηνύματος',
169
+ failedToUploadFile: 'Αποτυχία ανεβάσματος αρχείου',
170
+ failedToInitialize: 'Αποτυχία αρχικοποίησης υπηρεσίας συνομιλίας',
171
+ retry: 'Επανάληψη'
172
+ }
173
+ },
174
+ // Language Switcher
175
+ language: {
176
+ english: 'English',
177
+ greek: 'Ελληνικά',
178
+ switchLanguage: 'Αλλαγή Γλώσσας'
179
+ },
180
+ // Common
181
+ common: {
182
+ close: 'Κλείσιμο',
183
+ open: 'Άνοιγμα',
184
+ cancel: 'Ακύρωση',
185
+ confirm: 'Επιβεβαίωση',
186
+ save: 'Αποθήκευση',
187
+ delete: 'Διαγραφή',
188
+ edit: 'Επεξεργασία',
189
+ search: 'Αναζήτηση',
190
+ clear: 'Εκκαθάριση',
191
+ loading: 'Φόρτωση...',
192
+ error: 'Σφάλμα',
193
+ success: 'Επιτυχία',
194
+ warning: 'Προειδοποίηση',
195
+ info: 'Πληροφορία',
196
+ yes: 'Ναι',
197
+ no: 'Όχι'
198
+ }
199
+ };
200
+
201
+ const translations = {
202
+ en,
203
+ el
204
+ };
205
+ const getTranslation = (language, key) => {
206
+ const keys = key.split('.');
207
+ let value = translations[language];
208
+ for (const k of keys) {
209
+ if (value && typeof value === 'object' && k in value) {
210
+ value = value[k];
211
+ }
212
+ else {
213
+ // Fallback to English if key not found
214
+ value = translations.en;
215
+ for (const fallbackKey of keys) {
216
+ if (value && typeof value === 'object' && fallbackKey in value) {
217
+ value = value[fallbackKey];
218
+ }
219
+ else {
220
+ return key; // Return the key if not found in fallback
221
+ }
222
+ }
223
+ break;
224
+ }
225
+ }
226
+ return typeof value === 'string' ? value : key;
227
+ };
228
+ const getAvailableLanguages = () => {
229
+ return [
230
+ { code: 'en', name: 'English' },
231
+ { code: 'el', name: 'Ελληνικά' }
232
+ ];
233
+ };
234
+ const isValidLanguage = (language) => {
235
+ return language === 'en' || language === 'el';
236
+ };
237
+
5
238
  function bind(fn, thisArg) {
6
239
  return function wrap() {
7
240
  return fn.apply(thisArg, arguments);
@@ -1359,12 +1592,12 @@ const hasStandardBrowserWebWorkerEnv = (() => {
1359
1592
  const origin = hasBrowserEnv && window.location.href || 'http://localhost';
1360
1593
 
1361
1594
  var utils = /*#__PURE__*/Object.freeze({
1362
- __proto__: null,
1363
- hasBrowserEnv: hasBrowserEnv,
1364
- hasStandardBrowserEnv: hasStandardBrowserEnv,
1365
- hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
1366
- navigator: _navigator,
1367
- origin: origin
1595
+ __proto__: null,
1596
+ hasBrowserEnv: hasBrowserEnv,
1597
+ hasStandardBrowserEnv: hasStandardBrowserEnv,
1598
+ hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
1599
+ navigator: _navigator,
1600
+ origin: origin
1368
1601
  });
1369
1602
 
1370
1603
  var platform = {
@@ -4264,19 +4497,28 @@ class SDKClientService {
4264
4497
  theme: serverConfig.theme !== null && serverConfig.theme !== undefined
4265
4498
  ? serverConfig.theme
4266
4499
  : userConfig.theme,
4500
+ showThemeToggle: serverConfig.show_theme_toggle !== undefined
4501
+ ? serverConfig.show_theme_toggle
4502
+ : userConfig.showThemeToggle,
4503
+ showFullscreenToggle: serverConfig.show_fullscreen_toggle !== undefined
4504
+ ? serverConfig.show_fullscreen_toggle
4505
+ : userConfig.showFullscreenToggle,
4506
+ showLanguageSwitcher: serverConfig.show_language_switcher !== undefined
4507
+ ? serverConfig.show_language_switcher
4508
+ : userConfig.showLanguageSwitcher,
4267
4509
  position: serverConfig.position !== null && serverConfig.position !== undefined
4268
4510
  ? serverConfig.position
4269
4511
  : userConfig.position,
4270
4512
  primaryColor: serverConfig.primary_color !== null && serverConfig.primary_color !== undefined
4271
4513
  ? serverConfig.primary_color
4272
4514
  : userConfig.primaryColor,
4273
- showConversationList: serverConfig.show_conversation_list !== undefined
4515
+ showConversationList: typeof serverConfig.show_conversation_list === 'boolean'
4274
4516
  ? serverConfig.show_conversation_list
4275
4517
  : userConfig.showConversationList,
4276
- enableAudioRecording: serverConfig.enable_audio_recording !== undefined
4518
+ enableAudioRecording: typeof serverConfig.enable_audio_recording === 'boolean'
4277
4519
  ? serverConfig.enable_audio_recording
4278
4520
  : userConfig.enableAudioRecording,
4279
- enableFileUpload: serverConfig.enable_file_upload !== undefined
4521
+ enableFileUpload: typeof serverConfig.enable_file_upload === 'boolean'
4280
4522
  ? serverConfig.enable_file_upload
4281
4523
  : userConfig.enableFileUpload,
4282
4524
  maxFileSize: serverConfig.max_file_size !== null && serverConfig.max_file_size !== undefined
@@ -4303,231 +4545,6 @@ const getSDKClientService = () => {
4303
4545
  return sdkClientServiceInstance;
4304
4546
  };
4305
4547
 
4306
- const en = {
4307
- // Chat Interface
4308
- chat: {
4309
- title: 'Fusioni AI',
4310
- subtitle: 'AI Assistant',
4311
- welcome: {
4312
- title: 'Welcome to Fusioni',
4313
- description: 'Start a new conversation to begin chatting with AI',
4314
- startButton: 'Start New Conversation',
4315
- creating: 'Creating...'
4316
- },
4317
- input: {
4318
- placeholder: 'Type your message...',
4319
- send: 'Send',
4320
- upload: 'Upload',
4321
- record: 'Record'
4322
- },
4323
- conversations: {
4324
- title: 'Conversations',
4325
- search: 'Search conversations...',
4326
- newConversation: 'New Conversation',
4327
- noConversations: 'No conversations yet',
4328
- delete: 'Delete conversation',
4329
- newIndicator: 'New conversation - will be saved when you send a message',
4330
- deleteConfirm: {
4331
- title: 'Delete Conversation',
4332
- message: 'Are you sure you want to delete this conversation? This action cannot be undone.',
4333
- confirm: 'Delete',
4334
- cancel: 'Cancel'
4335
- }
4336
- },
4337
- attachedImages: 'Images',
4338
- attachedVideos: 'Videos',
4339
- messages: {
4340
- loading: 'Working on it...',
4341
- error: 'Oops! Something went wrong. Please try again later.',
4342
- delete: 'Delete message',
4343
- deleteConfirm: {
4344
- title: 'Delete Message',
4345
- message: 'Are you sure you want to delete this message? This action cannot be undone.',
4346
- confirm: 'Delete',
4347
- cancel: 'Cancel'
4348
- }
4349
- },
4350
- connection: {
4351
- connected: 'Real-time updates connected',
4352
- disconnected: 'Real-time updates disconnected'
4353
- },
4354
- fullscreen: {
4355
- enter: 'Enter fullscreen',
4356
- exit: 'Exit fullscreen'
4357
- },
4358
- theme: {
4359
- light: 'Switch to light theme',
4360
- dark: 'Switch to dark theme'
4361
- },
4362
- errors: {
4363
- failedToCreateConversation: 'Failed to create conversation',
4364
- failedToLoadConversation: 'Failed to load conversation',
4365
- failedToDeleteConversation: 'Failed to delete conversation',
4366
- failedToSendMessage: 'Failed to send message',
4367
- failedToDeleteMessage: 'Failed to delete message',
4368
- failedToUploadFile: 'Failed to upload file',
4369
- failedToInitialize: 'Failed to initialize chat service',
4370
- retry: 'Retry'
4371
- }
4372
- },
4373
- // Language Switcher
4374
- language: {
4375
- english: 'English',
4376
- greek: 'Ελληνικά',
4377
- switchLanguage: 'Switch Language'
4378
- },
4379
- // Common
4380
- common: {
4381
- close: 'Close',
4382
- open: 'Open',
4383
- cancel: 'Cancel',
4384
- confirm: 'Confirm',
4385
- save: 'Save',
4386
- delete: 'Delete',
4387
- edit: 'Edit',
4388
- search: 'Search',
4389
- clear: 'Clear',
4390
- loading: 'Loading...',
4391
- error: 'Error',
4392
- success: 'Success',
4393
- warning: 'Warning',
4394
- info: 'Info',
4395
- yes: 'Yes',
4396
- no: 'No'
4397
- }
4398
- };
4399
-
4400
- const el = {
4401
- // Chat Interface
4402
- chat: {
4403
- title: 'Fusioni AI',
4404
- subtitle: 'AI Βοηθός',
4405
- welcome: {
4406
- title: 'Καλώς ήρθατε στο Fusioni AI',
4407
- description: 'Ξεκινήστε μια νέα συνομιλία για να αρχίσετε να συνομιλείτε με AI',
4408
- startButton: 'Ξεκινήστε Νέα Συνομιλία',
4409
- creating: 'Δημιουργία...'
4410
- },
4411
- input: {
4412
- placeholder: 'Πληκτρολογήστε το μήνυμά σας...',
4413
- send: 'Αποστολή',
4414
- upload: 'Ανέβασμα',
4415
- record: 'Εγγραφή'
4416
- },
4417
- conversations: {
4418
- title: 'Συνομιλίες',
4419
- search: 'Αναζήτηση συνομιλιών...',
4420
- newConversation: 'Νέα Συνομιλία',
4421
- noConversations: 'Δεν υπάρχουν συνομιλίες ακόμα',
4422
- delete: 'Διαγραφή συνομιλίας',
4423
- newIndicator: 'Νέα συνομιλία - θα αποθηκευτεί όταν στείλετε μήνυμα',
4424
- deleteConfirm: {
4425
- title: 'Διαγραφή Συνομιλίας',
4426
- message: 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή τη συνομιλία; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
4427
- confirm: 'Διαγραφή',
4428
- cancel: 'Ακύρωση'
4429
- }
4430
- },
4431
- attachedImages: 'Εικόνες',
4432
- attachedVideos: 'Βίντεο',
4433
- messages: {
4434
- loading: 'Εργάζομαι...',
4435
- error: 'Ουπς! Κάτι πήγε στραβά. Παρακαλώ δοκιμάστε ξανά αργότερα.',
4436
- delete: 'Διαγραφή μηνύματος',
4437
- deleteConfirm: {
4438
- title: 'Διαγραφή Μηνύματος',
4439
- message: 'Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το μήνυμα; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.',
4440
- confirm: 'Διαγραφή',
4441
- cancel: 'Ακύρωση'
4442
- }
4443
- },
4444
- connection: {
4445
- connected: 'Συνδεδεμένο για ενημερώσεις σε πραγματικό χρόνο',
4446
- disconnected: 'Αποσυνδεδεμένο από ενημερώσεις σε πραγματικό χρόνο'
4447
- },
4448
- fullscreen: {
4449
- enter: 'Πλήρης οθόνη',
4450
- exit: 'Έξοδος από πλήρη οθόνη'
4451
- },
4452
- theme: {
4453
- light: 'Εναλλαγή σε φωτεινό θέμα',
4454
- dark: 'Εναλλαγή σε σκοτεινό θέμα'
4455
- },
4456
- errors: {
4457
- failedToCreateConversation: 'Αποτυχία δημιουργίας συνομιλίας',
4458
- failedToLoadConversation: 'Αποτυχία φόρτωσης συνομιλίας',
4459
- failedToDeleteConversation: 'Αποτυχία διαγραφής συνομιλίας',
4460
- failedToSendMessage: 'Αποτυχία αποστολής μηνύματος',
4461
- failedToDeleteMessage: 'Αποτυχία διαγραφής μηνύματος',
4462
- failedToUploadFile: 'Αποτυχία ανεβάσματος αρχείου',
4463
- failedToInitialize: 'Αποτυχία αρχικοποίησης υπηρεσίας συνομιλίας',
4464
- retry: 'Επανάληψη'
4465
- }
4466
- },
4467
- // Language Switcher
4468
- language: {
4469
- english: 'English',
4470
- greek: 'Ελληνικά',
4471
- switchLanguage: 'Αλλαγή Γλώσσας'
4472
- },
4473
- // Common
4474
- common: {
4475
- close: 'Κλείσιμο',
4476
- open: 'Άνοιγμα',
4477
- cancel: 'Ακύρωση',
4478
- confirm: 'Επιβεβαίωση',
4479
- save: 'Αποθήκευση',
4480
- delete: 'Διαγραφή',
4481
- edit: 'Επεξεργασία',
4482
- search: 'Αναζήτηση',
4483
- clear: 'Εκκαθάριση',
4484
- loading: 'Φόρτωση...',
4485
- error: 'Σφάλμα',
4486
- success: 'Επιτυχία',
4487
- warning: 'Προειδοποίηση',
4488
- info: 'Πληροφορία',
4489
- yes: 'Ναι',
4490
- no: 'Όχι'
4491
- }
4492
- };
4493
-
4494
- const translations = {
4495
- en,
4496
- el
4497
- };
4498
- const getTranslation = (language, key) => {
4499
- const keys = key.split('.');
4500
- let value = translations[language];
4501
- for (const k of keys) {
4502
- if (value && typeof value === 'object' && k in value) {
4503
- value = value[k];
4504
- }
4505
- else {
4506
- // Fallback to English if key not found
4507
- value = translations.en;
4508
- for (const fallbackKey of keys) {
4509
- if (value && typeof value === 'object' && fallbackKey in value) {
4510
- value = value[fallbackKey];
4511
- }
4512
- else {
4513
- return key; // Return the key if not found in fallback
4514
- }
4515
- }
4516
- break;
4517
- }
4518
- }
4519
- return typeof value === 'string' ? value : key;
4520
- };
4521
- const getAvailableLanguages = () => {
4522
- return [
4523
- { code: 'en', name: 'English' },
4524
- { code: 'el', name: 'Ελληνικά' }
4525
- ];
4526
- };
4527
- const isValidLanguage = (language) => {
4528
- return language === 'en' || language === 'el';
4529
- };
4530
-
4531
4548
  const useTranslation = (defaultLanguage = 'en') => {
4532
4549
  const [currentLanguage, setCurrentLanguage] = useState(defaultLanguage);
4533
4550
  // Update internal language state when defaultLanguage prop changes
@@ -5426,7 +5443,7 @@ const MessageList = ({ messages, streamMessages, showThoughts = false, onDeleteM
5426
5443
  selection.addRange(range);
5427
5444
  }
5428
5445
  }, [editingMessageId, editingContent]);
5429
- return (jsxs(Fragment, { children: [jsx("div", { className: "fusioni-message-list", ref: scrollContainerRef, children: jsxs("div", { className: "fusioni-messages-container", children: [messages.length === 0 ? (jsx("div", { className: "fusioni-empty-messages", children: jsxs("div", { className: "fusioni-empty-messages-content", children: [jsx("svg", { width: "64", height: "64", viewBox: "0 0 24 24", fill: "none", className: "fusioni-empty-icon", children: jsx("path", { d: "M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), jsx("h3", { children: "Start a conversation" }), jsx("p", { children: "Send a message to begin chatting with the AI assistant" })] }) })) : (jsx("div", { className: "fusioni-messages", children: messages.map((message, index) => {
5446
+ return (jsxs(Fragment, { children: [jsx("div", { className: "fusioni-message-list", ref: scrollContainerRef, children: jsxs("div", { className: "fusioni-messages-container", children: [messages.length === 0 ? (jsx("div", { className: "fusioni-empty-messages", children: jsxs("div", { className: "fusioni-empty-messages-content", children: [jsx("svg", { width: "64", height: "64", viewBox: "0 0 24 24", fill: "none", className: "fusioni-empty-icon", children: jsx("path", { d: "M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }), jsx("h3", { children: t('chat.emptyState.title') }), jsx("p", { children: t('chat.emptyState.description') })] }) })) : (jsx("div", { className: "fusioni-messages", children: messages.map((message, index) => {
5430
5447
  const isLastMessage = index === messages.length - 1;
5431
5448
  const messageKey = message.id ??
5432
5449
  `msg-fallback-${index}-${message.role}-${message.created instanceof Date ? message.created.getTime() : 0}`;
@@ -5953,56 +5970,90 @@ const useSSE = (agencyId, onMessage, isConnected = true, accessToken) => {
5953
5970
  };
5954
5971
 
5955
5972
  const THEME_STORAGE_KEY = 'fusioni-chat-theme';
5973
+ function resolveDisplayTheme(setting) {
5974
+ if (setting === 'auto') {
5975
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
5976
+ }
5977
+ if (setting === 'dark' || setting === 'light') {
5978
+ return setting;
5979
+ }
5980
+ return 'light';
5981
+ }
5956
5982
  const useTheme = (initialTheme) => {
5957
5983
  const [currentTheme, setCurrentTheme] = useState('light');
5958
5984
  const [isManualOverride, setIsManualOverride] = useState(false);
5959
- // Load theme from localStorage on initialization
5985
+ const [programmaticTheme, setProgrammaticTheme] = useState(null);
5986
+ const persistThemeSetting = useCallback((setting) => {
5987
+ try {
5988
+ if (setting === 'auto') {
5989
+ localStorage.removeItem(THEME_STORAGE_KEY);
5990
+ }
5991
+ else {
5992
+ localStorage.setItem(THEME_STORAGE_KEY, setting);
5993
+ }
5994
+ }
5995
+ catch (error) {
5996
+ console.warn('Failed to persist theme to localStorage:', error);
5997
+ }
5998
+ }, []);
5999
+ const setTheme = useCallback((theme) => {
6000
+ setProgrammaticTheme(theme);
6001
+ setCurrentTheme(resolveDisplayTheme(theme));
6002
+ setIsManualOverride(true);
6003
+ persistThemeSetting(theme);
6004
+ }, [persistThemeSetting]);
6005
+ // Load theme from localStorage on initialization (unless SDK / caller already set a theme)
5960
6006
  useEffect(() => {
6007
+ if (programmaticTheme != null) {
6008
+ return;
6009
+ }
5961
6010
  try {
5962
6011
  const savedTheme = localStorage.getItem(THEME_STORAGE_KEY);
5963
6012
  if (savedTheme === 'light' || savedTheme === 'dark') {
5964
6013
  setCurrentTheme(savedTheme);
5965
6014
  setIsManualOverride(true);
5966
- return;
5967
6015
  }
5968
6016
  }
5969
6017
  catch (error) {
5970
6018
  console.warn('Failed to load theme from localStorage:', error);
5971
6019
  }
6020
+ }, [programmaticTheme]);
6021
+ const toggleTheme = useCallback(() => {
6022
+ setCurrentTheme((prev) => {
6023
+ const next = prev === 'light' ? 'dark' : 'light';
6024
+ setProgrammaticTheme(next);
6025
+ setIsManualOverride(true);
6026
+ try {
6027
+ localStorage.setItem(THEME_STORAGE_KEY, next);
6028
+ }
6029
+ catch (error) {
6030
+ console.warn('Failed to save theme to localStorage:', error);
6031
+ }
6032
+ return next;
6033
+ });
5972
6034
  }, []);
5973
- const toggleTheme = () => {
5974
- const newTheme = currentTheme === 'light' ? 'dark' : 'light';
5975
- setCurrentTheme(newTheme);
5976
- setIsManualOverride(true);
5977
- // Save to localStorage
5978
- try {
5979
- localStorage.setItem(THEME_STORAGE_KEY, newTheme);
5980
- }
5981
- catch (error) {
5982
- console.warn('Failed to save theme to localStorage:', error);
5983
- }
5984
- };
5985
6035
  useEffect(() => {
5986
- // Check if we have a saved theme first
6036
+ if (programmaticTheme != null) {
6037
+ if (programmaticTheme === 'auto') {
6038
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
6039
+ const handleChange = () => {
6040
+ setCurrentTheme(resolveDisplayTheme('auto'));
6041
+ };
6042
+ handleChange();
6043
+ mediaQuery.addEventListener('change', handleChange);
6044
+ return () => mediaQuery.removeEventListener('change', handleChange);
6045
+ }
6046
+ return;
6047
+ }
5987
6048
  const savedTheme = localStorage.getItem(THEME_STORAGE_KEY);
5988
6049
  if (savedTheme === 'light' || savedTheme === 'dark') {
5989
- return; // Don't override saved theme
6050
+ return;
6051
+ }
6052
+ if (isManualOverride) {
6053
+ return;
5990
6054
  }
5991
- if (isManualOverride)
5992
- return; // Don't auto-update if user manually changed theme
5993
6055
  const updateTheme = () => {
5994
- if (initialTheme === 'auto') {
5995
- // Check system preference
5996
- const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
5997
- setCurrentTheme(prefersDark ? 'dark' : 'light');
5998
- }
5999
- else if (initialTheme === 'dark' || initialTheme === 'light') {
6000
- setCurrentTheme(initialTheme);
6001
- }
6002
- else {
6003
- // Default to light theme
6004
- setCurrentTheme('light');
6005
- }
6056
+ setCurrentTheme(resolveDisplayTheme(initialTheme));
6006
6057
  };
6007
6058
  updateTheme();
6008
6059
  if (initialTheme === 'auto') {
@@ -6011,11 +6062,12 @@ const useTheme = (initialTheme) => {
6011
6062
  mediaQuery.addEventListener('change', handleChange);
6012
6063
  return () => mediaQuery.removeEventListener('change', handleChange);
6013
6064
  }
6014
- }, [initialTheme, isManualOverride]);
6065
+ }, [initialTheme, isManualOverride, programmaticTheme]);
6015
6066
  return {
6016
6067
  theme: currentTheme,
6017
6068
  toggleTheme,
6018
- isManualOverride
6069
+ setTheme,
6070
+ isManualOverride,
6019
6071
  };
6020
6072
  };
6021
6073
 
@@ -6037,7 +6089,8 @@ function useIsMobileLayout() {
6037
6089
  return isMobile;
6038
6090
  }
6039
6091
 
6040
- const ChatWidget = ({ config, onMessageSent, onMessageReceived, onConversationCreated, onConversationDeleted, onError }) => {
6092
+ const ChatWidget = forwardRef(function ChatWidget({ config, onMessageSent, onMessageReceived, onConversationCreated, onConversationDeleted, onError }, ref) {
6093
+ const [languageOverride, setLanguageOverride] = useState(null);
6041
6094
  const [isOpen, setIsOpen] = useState(false);
6042
6095
  const [isLoading, setIsLoading] = useState(false);
6043
6096
  const [error, setError] = useState(null);
@@ -6052,11 +6105,26 @@ const ChatWidget = ({ config, onMessageSent, onMessageReceived, onConversationCr
6052
6105
  const [isDeleteMessageDialogOpen, setIsDeleteMessageDialogOpen] = useState(false);
6053
6106
  // Refs
6054
6107
  const floatingButtonRef = useRef(null);
6108
+ const translationDefault = languageOverride ?? mergedConfig?.language ?? config.language ?? 'en';
6055
6109
  // Translation and language management - use merged config or fallback to user config
6056
- const { t, currentLanguage, changeLanguage } = useTranslation(mergedConfig?.language || config.language || 'en');
6110
+ const { t, currentLanguage, changeLanguage } = useTranslation(translationDefault);
6057
6111
  const { conversations, currentConversation, messages, streamMessages, setCurrentConversation, setStreamMessages, addMessage, updateMessage, removeMessage, removeOptimisticUserMessages, truncateMessagesAt, addConversation, updateConversation, removeConversation, loadConversations, loadMessages, clearMessages } = useChatState(mergedConfig?.agencyId || config.agencyId);
6058
- const { theme, toggleTheme } = useTheme(mergedConfig?.theme || config.theme);
6112
+ const { theme, toggleTheme, setTheme } = useTheme(mergedConfig?.theme || config.theme);
6059
6113
  const isMobileLayout = useIsMobileLayout();
6114
+ const handleLanguageChange = useCallback((language) => {
6115
+ setLanguageOverride(language);
6116
+ changeLanguage(language);
6117
+ }, [changeLanguage]);
6118
+ useImperativeHandle(ref, () => ({
6119
+ setLanguage: (language) => {
6120
+ if (!isValidLanguage(language)) {
6121
+ return;
6122
+ }
6123
+ setLanguageOverride(language);
6124
+ changeLanguage(language);
6125
+ },
6126
+ setTheme,
6127
+ }), [changeLanguage, setTheme]);
6060
6128
  // Initialize API client and fetch server configuration
6061
6129
  useEffect(() => {
6062
6130
  const initializeAndFetchConfig = async () => {
@@ -6544,8 +6612,9 @@ const ChatWidget = ({ config, onMessageSent, onMessageReceived, onConversationCr
6544
6612
  // Debug: Log the primary color and button variant being applied
6545
6613
  console.log('Primary color being applied:', mergedConfig.primaryColor || '#6366f1');
6546
6614
  console.log('Button variant being applied:', mergedConfig.buttonVariant || 'glass');
6547
- return (jsxs("div", { className: `fusioni-chat-widget ${theme}`, style: { '--primary-color': mergedConfig.primaryColor || '#6366f1' }, children: [jsx(FloatingButton, { isOpen: isOpen, onClick: handleToggleChat, position: mergedConfig.position || 'bottom-right', primaryColor: mergedConfig.primaryColor, buttonRef: floatingButtonRef, variant: mergedConfig.buttonVariant || 'glass', shouldDisplay: !hasConfigError && (!isMobileLayout || !isOpen) }), isOpen && (jsx(ChatPanel, { isOpen: isOpen, onClose: () => setIsOpen(false), position: mergedConfig.position || 'bottom-right', isFullscreen: isFullscreen, floatingButtonRef: floatingButtonRef, children: jsxs("div", { className: "fusioni-chat-container", children: [mergedConfig.showConversationList !== false && (jsxs(Fragment, { children: [jsx("div", { className: `fusioni-conversation-backdrop ${isConversationListOpen ? 'open' : ''}`, onClick: () => setIsConversationListOpen(false) }), jsx(ConversationList, { conversations: conversations, selectedConversationId: currentConversation?.id || undefined, onSelectConversation: handleSelectConversation, onDeleteConversation: handleDeleteConversation, onCreateConversation: handleCreateConversation, isOpen: isConversationListOpen, currentLanguage: currentLanguage })] })), jsxs("div", { className: "fusioni-chat-main", children: [jsxs("div", { className: "fusioni-chat-main-header", children: [mergedConfig.showConversationList !== false ? (jsxs("button", { type: "button", onClick: handleToggleConversationList, className: `fusioni-conversation-toggle ${isConversationListOpen ? 'open' : ''}`, children: [jsx("svg", { className: "fusioni-conversation-toggle-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsx("path", { d: "M3 12h18M3 6h18M3 18h18" }) }), t('chat.conversations.title')] })) : (jsx("span", { className: "fusioni-chat-main-header-title", children: t('chat.title') })), jsxs("div", { className: "fusioni-header-actions", children: [isMobileLayout && (jsx("button", { type: "button", onClick: () => setIsOpen(false), className: "fusioni-btn fusioni-btn-icon fusioni-chat-toolbar-close-mobile", title: t('common.close'), "aria-label": t('common.close'), children: jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", "aria-hidden": "true", children: jsx("path", { d: "M18 6L6 18M6 6L18 18", strokeLinecap: "round", strokeLinejoin: "round" }) }) })), jsx("button", { type: "button", onClick: toggleTheme, className: "fusioni-btn fusioni-btn-icon", title: theme === 'dark' ? t('chat.theme.light') : t('chat.theme.dark'), children: theme === 'dark' ? (jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [jsx("circle", { cx: "12", cy: "12", r: "5" }), jsx("line", { x1: "12", y1: "1", x2: "12", y2: "3" }), jsx("line", { x1: "12", y1: "21", x2: "12", y2: "23" }), jsx("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }), jsx("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }), jsx("line", { x1: "1", y1: "12", x2: "3", y2: "12" }), jsx("line", { x1: "21", y1: "12", x2: "23", y2: "12" }), jsx("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }), jsx("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })] })) : (jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) })) }), jsx("button", { type: "button", onClick: handleToggleFullscreen, className: "fusioni-btn fusioni-btn-icon", title: isFullscreen ? t('chat.fullscreen.exit') : t('chat.fullscreen.enter'), children: isFullscreen ? (jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsx("path", { d: "M8 3V5M8 3H5M8 3L3 8M16 3V5M16 3H19M16 3L21 8M8 21V19M8 21H5M8 21L3 16M16 21V19M16 21H19M16 21L21 16" }) })) : (jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsx("path", { d: "M8 3H5C4.46957 3 3.96086 3.21071 3.58579 3.58579C3.21071 3.96086 3 4.46957 3 5V8M21 8V5C21 4.46957 20.7893 3.96086 20.4142 3.58579C20.0391 3.21071 19.5304 3 19 3H16M16 21H19C19.5304 21 20.0391 20.7893 20.4142 20.4142C20.7893 20.0391 21 19.5304 21 19V16M3 16V19C3 19.5304 3.21071 20.0391 3.58579 20.4142C3.96086 20.7893 4.46957 21 5 21H8" }) })) }), jsx(LanguageSwitcher, { currentLanguage: currentLanguage, onLanguageChange: changeLanguage })] })] }), currentConversation ? (jsxs(Fragment, { children: [jsx(MessageList, { messages: messages, streamMessages: streamMessages, showThoughts: false, onDeleteMessage: handleDeleteMessage, onEditMessage: handleEditMessage, onConfirmation: handleConfirmation, enableButtons: !isLoading, apiBaseUrl: mergedConfig.apiBaseUrl, apiKey: mergedConfig.accessToken, agencyId: mergedConfig.agencyId, currentLanguage: currentLanguage, theme: theme }), jsx(ChatInput, { onSendMessage: handleSendMessage, onFileUpload: handleFileUpload, disabled: isLoading, placeholder: t('chat.input.placeholder'), enableAudioRecording: mergedConfig.enableAudioRecording !== false, enableFileUpload: mergedConfig.enableFileUpload !== false, maxFileSize: mergedConfig.maxFileSize || 10, allowedFileTypes: mergedConfig.allowedFileTypes || ['image/*'], currentLanguage: currentLanguage })] })) : (jsx("div", { className: "fusioni-chat-welcome", children: jsxs("div", { className: "fusioni-chat-welcome-content", children: [jsx("h3", { children: t('chat.welcome.title') }), jsx("p", { children: t('chat.welcome.description') }), jsx("button", { onClick: handleCreateConversation, disabled: isLoading, className: "fusioni-btn fusioni-btn-primary", children: isLoading ? t('chat.welcome.creating') : t('chat.welcome.startButton') })] }) }))] })] }) })), jsx(ConfirmationDialog, { isOpen: isDeleteDialogOpen, title: t('chat.conversations.deleteConfirm.title'), message: t('chat.conversations.deleteConfirm.message'), confirmText: t('chat.conversations.deleteConfirm.confirm'), cancelText: t('chat.conversations.deleteConfirm.cancel'), onConfirm: confirmDeleteConversation, onCancel: cancelDeleteConversation, currentLanguage: currentLanguage, variant: "danger" }), jsx(ConfirmationDialog, { isOpen: isDeleteMessageDialogOpen, title: t('chat.messages.deleteConfirm.title'), message: t('chat.messages.deleteConfirm.message'), confirmText: t('chat.messages.deleteConfirm.confirm'), cancelText: t('chat.messages.deleteConfirm.cancel'), onConfirm: confirmDeleteMessage, onCancel: cancelDeleteMessage, currentLanguage: currentLanguage, variant: "danger" })] }));
6548
- };
6615
+ return (jsxs("div", { className: `fusioni-chat-widget ${theme}`, style: { '--primary-color': mergedConfig.primaryColor || '#6366f1' }, children: [jsx(FloatingButton, { isOpen: isOpen, onClick: handleToggleChat, position: mergedConfig.position || 'bottom-right', primaryColor: mergedConfig.primaryColor, buttonRef: floatingButtonRef, variant: mergedConfig.buttonVariant || 'glass', shouldDisplay: !hasConfigError && (!isMobileLayout || !isOpen) }), isOpen && (jsx(ChatPanel, { isOpen: isOpen, onClose: () => setIsOpen(false), position: mergedConfig.position || 'bottom-right', isFullscreen: isFullscreen, floatingButtonRef: floatingButtonRef, children: jsxs("div", { className: "fusioni-chat-container", children: [mergedConfig.showConversationList !== false && (jsxs(Fragment, { children: [jsx("div", { className: `fusioni-conversation-backdrop ${isConversationListOpen ? 'open' : ''}`, onClick: () => setIsConversationListOpen(false) }), jsx(ConversationList, { conversations: conversations, selectedConversationId: currentConversation?.id || undefined, onSelectConversation: handleSelectConversation, onDeleteConversation: handleDeleteConversation, onCreateConversation: handleCreateConversation, isOpen: isConversationListOpen, currentLanguage: currentLanguage })] })), jsxs("div", { className: "fusioni-chat-main", children: [jsxs("div", { className: "fusioni-chat-main-header", children: [mergedConfig.showConversationList !== false ? (jsxs("button", { type: "button", onClick: handleToggleConversationList, className: `fusioni-conversation-toggle ${isConversationListOpen ? 'open' : ''}`, children: [jsx("svg", { className: "fusioni-conversation-toggle-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsx("path", { d: "M3 12h18M3 6h18M3 18h18" }) }), t('chat.conversations.title')] })) : (jsx("span", { className: "fusioni-chat-main-header-title", children: t('chat.title') })), jsxs("div", { className: "fusioni-header-actions", children: [isMobileLayout && (jsx("button", { type: "button", onClick: () => setIsOpen(false), className: "fusioni-btn fusioni-btn-icon fusioni-chat-toolbar-close-mobile", title: t('common.close'), "aria-label": t('common.close'), children: jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", "aria-hidden": "true", children: jsx("path", { d: "M18 6L6 18M6 6L18 18", strokeLinecap: "round", strokeLinejoin: "round" }) }) })), mergedConfig.showThemeToggle !== false && (jsx("button", { type: "button", onClick: toggleTheme, className: "fusioni-btn fusioni-btn-icon", title: theme === 'dark' ? t('chat.theme.light') : t('chat.theme.dark'), children: theme === 'dark' ? (jsxs("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [jsx("circle", { cx: "12", cy: "12", r: "5" }), jsx("line", { x1: "12", y1: "1", x2: "12", y2: "3" }), jsx("line", { x1: "12", y1: "21", x2: "12", y2: "23" }), jsx("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }), jsx("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }), jsx("line", { x1: "1", y1: "12", x2: "3", y2: "12" }), jsx("line", { x1: "21", y1: "12", x2: "23", y2: "12" }), jsx("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }), jsx("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })] })) : (jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) })) })), mergedConfig.showFullscreenToggle !== false && (jsx("button", { type: "button", onClick: handleToggleFullscreen, className: "fusioni-btn fusioni-btn-icon", title: isFullscreen ? t('chat.fullscreen.exit') : t('chat.fullscreen.enter'), children: isFullscreen ? (jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsx("path", { d: "M8 3V5M8 3H5M8 3L3 8M16 3V5M16 3H19M16 3L21 8M8 21V19M8 21H5M8 21L3 16M16 21V19M16 21H19M16 21L21 16" }) })) : (jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: jsx("path", { d: "M8 3H5C4.46957 3 3.96086 3.21071 3.58579 3.58579C3.21071 3.96086 3 4.46957 3 5V8M21 8V5C21 4.46957 20.7893 3.96086 20.4142 3.58579C20.0391 3.21071 19.5304 3 19 3H16M16 21H19C19.5304 21 20.0391 20.7893 20.4142 20.4142C20.7893 20.0391 21 19.5304 21 19V16M3 16V19C3 19.5304 3.21071 20.0391 3.58579 20.4142C3.96086 20.7893 4.46957 21 5 21H8" }) })) })), mergedConfig.showLanguageSwitcher !== false && (jsx(LanguageSwitcher, { currentLanguage: currentLanguage, onLanguageChange: handleLanguageChange }))] })] }), currentConversation ? (jsxs(Fragment, { children: [jsx(MessageList, { messages: messages, streamMessages: streamMessages, showThoughts: false, onDeleteMessage: handleDeleteMessage, onEditMessage: handleEditMessage, onConfirmation: handleConfirmation, enableButtons: !isLoading, apiBaseUrl: mergedConfig.apiBaseUrl, apiKey: mergedConfig.accessToken, agencyId: mergedConfig.agencyId, currentLanguage: currentLanguage, theme: theme }), jsx(ChatInput, { onSendMessage: handleSendMessage, onFileUpload: handleFileUpload, disabled: isLoading, placeholder: t('chat.input.placeholder'), enableAudioRecording: mergedConfig.enableAudioRecording !== false, enableFileUpload: mergedConfig.enableFileUpload !== false, maxFileSize: mergedConfig.maxFileSize || 10, allowedFileTypes: mergedConfig.allowedFileTypes || ['image/*'], currentLanguage: currentLanguage })] })) : (jsx("div", { className: "fusioni-chat-welcome", children: jsxs("div", { className: "fusioni-chat-welcome-content", children: [jsx("h3", { children: t('chat.welcome.title') }), jsx("p", { children: t('chat.welcome.description') }), jsx("button", { onClick: handleCreateConversation, disabled: isLoading, className: "fusioni-btn fusioni-btn-primary", children: isLoading ? t('chat.welcome.creating') : t('chat.welcome.startButton') })] }) }))] })] }) })), jsx(ConfirmationDialog, { isOpen: isDeleteDialogOpen, title: t('chat.conversations.deleteConfirm.title'), message: t('chat.conversations.deleteConfirm.message'), confirmText: t('chat.conversations.deleteConfirm.confirm'), cancelText: t('chat.conversations.deleteConfirm.cancel'), onConfirm: confirmDeleteConversation, onCancel: cancelDeleteConversation, currentLanguage: currentLanguage, variant: "danger" }), jsx(ConfirmationDialog, { isOpen: isDeleteMessageDialogOpen, title: t('chat.messages.deleteConfirm.title'), message: t('chat.messages.deleteConfirm.message'), confirmText: t('chat.messages.deleteConfirm.confirm'), cancelText: t('chat.messages.deleteConfirm.cancel'), onConfirm: confirmDeleteMessage, onCancel: cancelDeleteMessage, currentLanguage: currentLanguage, variant: "danger" })] }));
6616
+ });
6617
+ ChatWidget.displayName = 'ChatWidget';
6549
6618
 
6550
6619
  const FileUpload = ({ onFileSelect, accept = 'image/*', maxSize = 10, disabled = false, className = '' }) => {
6551
6620
  const fileInputRef = useRef(null);