@acorex/components 20.4.14 → 20.4.16
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/conversation2/index.d.ts +143 -34
- package/fab/README.md +3 -0
- package/fab/index.d.ts +26 -0
- package/fesm2022/acorex-components-conversation.mjs +1 -1
- package/fesm2022/acorex-components-conversation.mjs.map +1 -1
- package/fesm2022/acorex-components-conversation2.mjs +221 -221
- package/fesm2022/acorex-components-conversation2.mjs.map +1 -1
- package/fesm2022/acorex-components-dropdown.mjs +2 -2
- package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
- package/fesm2022/acorex-components-fab.mjs +47 -0
- package/fesm2022/acorex-components-fab.mjs.map +1 -0
- package/fesm2022/acorex-components-loading.mjs +71 -31
- package/fesm2022/acorex-components-loading.mjs.map +1 -1
- package/fesm2022/acorex-components-popover.mjs +3 -2
- package/fesm2022/acorex-components-popover.mjs.map +1 -1
- package/fesm2022/acorex-components-scheduler.mjs +6 -6
- package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
- package/fesm2022/acorex-components-tooltip.mjs +2 -0
- package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
- package/loading/index.d.ts +3 -1
- package/package.json +31 -27
- package/popover/index.d.ts +2 -1
|
@@ -2273,13 +2273,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
2273
2273
|
const DB_NAME = 'acorex-conversation-db';
|
|
2274
2274
|
const DB_VERSION = 1;
|
|
2275
2275
|
// Store names
|
|
2276
|
-
const
|
|
2276
|
+
const AXConversationIndexedDbStores = {
|
|
2277
2277
|
PARTICIPANTS: 'participants',
|
|
2278
2278
|
CONVERSATIONS: 'conversations',
|
|
2279
2279
|
MESSAGES: 'messages',
|
|
2280
2280
|
SETTINGS: 'settings',
|
|
2281
2281
|
};
|
|
2282
|
-
class
|
|
2282
|
+
class AXConversationIndexedDbStorage {
|
|
2283
2283
|
constructor() {
|
|
2284
2284
|
this.db = null;
|
|
2285
2285
|
this.initPromise = null;
|
|
@@ -2302,20 +2302,20 @@ class IndexedDBStorage {
|
|
|
2302
2302
|
request.onupgradeneeded = (event) => {
|
|
2303
2303
|
const db = event.target.result;
|
|
2304
2304
|
// Create object stores if they don't exist
|
|
2305
|
-
if (!db.objectStoreNames.contains(
|
|
2306
|
-
db.createObjectStore(
|
|
2305
|
+
if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.PARTICIPANTS)) {
|
|
2306
|
+
db.createObjectStore(AXConversationIndexedDbStores.PARTICIPANTS, { keyPath: 'id' });
|
|
2307
2307
|
}
|
|
2308
|
-
if (!db.objectStoreNames.contains(
|
|
2309
|
-
const convStore = db.createObjectStore(
|
|
2308
|
+
if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.CONVERSATIONS)) {
|
|
2309
|
+
const convStore = db.createObjectStore(AXConversationIndexedDbStores.CONVERSATIONS, { keyPath: 'id' });
|
|
2310
2310
|
convStore.createIndex('lastMessageAt', 'lastMessageAt', { unique: false });
|
|
2311
2311
|
}
|
|
2312
|
-
if (!db.objectStoreNames.contains(
|
|
2313
|
-
const msgStore = db.createObjectStore(
|
|
2312
|
+
if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.MESSAGES)) {
|
|
2313
|
+
const msgStore = db.createObjectStore(AXConversationIndexedDbStores.MESSAGES, { keyPath: 'id' });
|
|
2314
2314
|
msgStore.createIndex('conversationId', 'conversationId', { unique: false });
|
|
2315
2315
|
msgStore.createIndex('timestamp', 'timestamp', { unique: false });
|
|
2316
2316
|
}
|
|
2317
|
-
if (!db.objectStoreNames.contains(
|
|
2318
|
-
db.createObjectStore(
|
|
2317
|
+
if (!db.objectStoreNames.contains(AXConversationIndexedDbStores.SETTINGS)) {
|
|
2318
|
+
db.createObjectStore(AXConversationIndexedDbStores.SETTINGS, { keyPath: 'key' });
|
|
2319
2319
|
}
|
|
2320
2320
|
};
|
|
2321
2321
|
});
|
|
@@ -2422,56 +2422,57 @@ class IndexedDBStorage {
|
|
|
2422
2422
|
// Convenience Methods
|
|
2423
2423
|
// =====================
|
|
2424
2424
|
async getParticipant(id) {
|
|
2425
|
-
return this.get(
|
|
2425
|
+
return this.get(AXConversationIndexedDbStores.PARTICIPANTS, id);
|
|
2426
2426
|
}
|
|
2427
2427
|
async getAllParticipants() {
|
|
2428
|
-
return this.getAll(
|
|
2428
|
+
return this.getAll(AXConversationIndexedDbStores.PARTICIPANTS);
|
|
2429
2429
|
}
|
|
2430
2430
|
async putParticipant(participant) {
|
|
2431
|
-
return this.put(
|
|
2431
|
+
return this.put(AXConversationIndexedDbStores.PARTICIPANTS, participant);
|
|
2432
2432
|
}
|
|
2433
2433
|
async getConversation(id) {
|
|
2434
|
-
return this.get(
|
|
2434
|
+
return this.get(AXConversationIndexedDbStores.CONVERSATIONS, id);
|
|
2435
2435
|
}
|
|
2436
2436
|
async getAllConversations() {
|
|
2437
|
-
return this.getAll(
|
|
2437
|
+
return this.getAll(AXConversationIndexedDbStores.CONVERSATIONS);
|
|
2438
2438
|
}
|
|
2439
2439
|
async putConversation(conversation) {
|
|
2440
|
-
return this.put(
|
|
2440
|
+
return this.put(AXConversationIndexedDbStores.CONVERSATIONS, conversation);
|
|
2441
2441
|
}
|
|
2442
2442
|
async deleteConversation(id) {
|
|
2443
|
-
return this.delete(
|
|
2443
|
+
return this.delete(AXConversationIndexedDbStores.CONVERSATIONS, id);
|
|
2444
2444
|
}
|
|
2445
2445
|
async getMessage(id) {
|
|
2446
|
-
return this.get(
|
|
2446
|
+
return this.get(AXConversationIndexedDbStores.MESSAGES, id);
|
|
2447
2447
|
}
|
|
2448
2448
|
async getAllMessages() {
|
|
2449
|
-
return this.getAll(
|
|
2449
|
+
return this.getAll(AXConversationIndexedDbStores.MESSAGES);
|
|
2450
2450
|
}
|
|
2451
2451
|
async getMessagesByConversation(conversationId) {
|
|
2452
|
-
return this.getAllByIndex(
|
|
2452
|
+
return this.getAllByIndex(AXConversationIndexedDbStores.MESSAGES, 'conversationId', conversationId);
|
|
2453
2453
|
}
|
|
2454
2454
|
async putMessage(message) {
|
|
2455
|
-
return this.put(
|
|
2455
|
+
return this.put(AXConversationIndexedDbStores.MESSAGES, message);
|
|
2456
2456
|
}
|
|
2457
2457
|
async deleteMessage(id) {
|
|
2458
|
-
return this.delete(
|
|
2458
|
+
return this.delete(AXConversationIndexedDbStores.MESSAGES, id);
|
|
2459
2459
|
}
|
|
2460
2460
|
async getSetting(key) {
|
|
2461
|
-
const result = await this.get(
|
|
2461
|
+
const result = await this.get(AXConversationIndexedDbStores.SETTINGS, key);
|
|
2462
2462
|
return result?.value;
|
|
2463
2463
|
}
|
|
2464
2464
|
async putSetting(key, value) {
|
|
2465
|
-
return this.put(
|
|
2465
|
+
return this.put(AXConversationIndexedDbStores.SETTINGS, { key, value });
|
|
2466
2466
|
}
|
|
2467
2467
|
}
|
|
2468
2468
|
// Export singleton instance
|
|
2469
|
-
const
|
|
2469
|
+
const axConversationIndexedDbStorage = new AXConversationIndexedDbStorage();
|
|
2470
2470
|
|
|
2471
2471
|
var indexeddbStorage = /*#__PURE__*/Object.freeze({
|
|
2472
2472
|
__proto__: null,
|
|
2473
|
-
|
|
2474
|
-
|
|
2473
|
+
AXConversationIndexedDbStorage: AXConversationIndexedDbStorage,
|
|
2474
|
+
AXConversationIndexedDbStores: AXConversationIndexedDbStores,
|
|
2475
|
+
axConversationIndexedDbStorage: axConversationIndexedDbStorage
|
|
2475
2476
|
});
|
|
2476
2477
|
|
|
2477
2478
|
/**
|
|
@@ -2480,7 +2481,7 @@ var indexeddbStorage = /*#__PURE__*/Object.freeze({
|
|
|
2480
2481
|
* This is NOT a service - just a shared data structure
|
|
2481
2482
|
*/
|
|
2482
2483
|
// Shared storage instance
|
|
2483
|
-
class
|
|
2484
|
+
class AXConversationSharedStorage {
|
|
2484
2485
|
constructor() {
|
|
2485
2486
|
// Connection status
|
|
2486
2487
|
this.connectionStatus$ = new BehaviorSubject('disconnected');
|
|
@@ -2509,13 +2510,13 @@ class SharedStorage {
|
|
|
2509
2510
|
try {
|
|
2510
2511
|
console.log('📂 Loading data from IndexedDB...');
|
|
2511
2512
|
// Load participants
|
|
2512
|
-
const participants = await
|
|
2513
|
+
const participants = await axConversationIndexedDbStorage.getAllParticipants();
|
|
2513
2514
|
participants.forEach((p) => this.participants.set(p.id, p));
|
|
2514
2515
|
// Load conversations
|
|
2515
|
-
const conversations = await
|
|
2516
|
+
const conversations = await axConversationIndexedDbStorage.getAllConversations();
|
|
2516
2517
|
conversations.forEach((c) => this.conversations.set(c.id, c));
|
|
2517
2518
|
// Load messages
|
|
2518
|
-
const messages = await
|
|
2519
|
+
const messages = await axConversationIndexedDbStorage.getAllMessages();
|
|
2519
2520
|
messages.forEach((m) => {
|
|
2520
2521
|
this.messages.set(m.id, m);
|
|
2521
2522
|
const convMessages = this.messagesByConversation.get(m.conversationId) || [];
|
|
@@ -2525,7 +2526,7 @@ class SharedStorage {
|
|
|
2525
2526
|
}
|
|
2526
2527
|
});
|
|
2527
2528
|
// Check if we loaded the seeded flag
|
|
2528
|
-
const seededFlag = await
|
|
2529
|
+
const seededFlag = await axConversationIndexedDbStorage.getSetting('isSeeded');
|
|
2529
2530
|
this.isSeeded = seededFlag === true;
|
|
2530
2531
|
this.isLoadedFromDB = true;
|
|
2531
2532
|
console.log('✅ Loaded from IndexedDB:', {
|
|
@@ -2814,7 +2815,7 @@ class SharedStorage {
|
|
|
2814
2815
|
// Store participants in memory and IndexedDB
|
|
2815
2816
|
for (const p of participants) {
|
|
2816
2817
|
this.participants.set(p.id, p);
|
|
2817
|
-
await
|
|
2818
|
+
await axConversationIndexedDbStorage.putParticipant(p);
|
|
2818
2819
|
}
|
|
2819
2820
|
// Start presence simulation
|
|
2820
2821
|
this.startPresenceSimulation();
|
|
@@ -2971,7 +2972,7 @@ class SharedStorage {
|
|
|
2971
2972
|
// Store conversations in memory and IndexedDB
|
|
2972
2973
|
for (const c of conversations) {
|
|
2973
2974
|
this.conversations.set(c.id, c);
|
|
2974
|
-
await
|
|
2975
|
+
await axConversationIndexedDbStorage.putConversation(c);
|
|
2975
2976
|
}
|
|
2976
2977
|
// Create messages with ALL types for each conversation
|
|
2977
2978
|
const messages = [];
|
|
@@ -3225,7 +3226,7 @@ class SharedStorage {
|
|
|
3225
3226
|
const convMessages = this.messagesByConversation.get(m.conversationId) || [];
|
|
3226
3227
|
convMessages.push(m.id);
|
|
3227
3228
|
this.messagesByConversation.set(m.conversationId, convMessages);
|
|
3228
|
-
await
|
|
3229
|
+
await axConversationIndexedDbStorage.putMessage(m);
|
|
3229
3230
|
}
|
|
3230
3231
|
// Update conversations with last messages
|
|
3231
3232
|
conversations[0].lastMessage = messages.find((m) => m.id === 'msg-1-8');
|
|
@@ -3235,10 +3236,10 @@ class SharedStorage {
|
|
|
3235
3236
|
// Update in memory and IndexedDB
|
|
3236
3237
|
for (const c of conversations) {
|
|
3237
3238
|
this.conversations.set(c.id, c);
|
|
3238
|
-
await
|
|
3239
|
+
await axConversationIndexedDbStorage.putConversation(c);
|
|
3239
3240
|
}
|
|
3240
3241
|
this.isSeeded = true;
|
|
3241
|
-
await
|
|
3242
|
+
await axConversationIndexedDbStorage.putSetting('isSeeded', true);
|
|
3242
3243
|
console.log('✅ Initial data seeded successfully!');
|
|
3243
3244
|
// Start message simulation
|
|
3244
3245
|
this.startMessageSimulation();
|
|
@@ -3415,13 +3416,13 @@ class SharedStorage {
|
|
|
3415
3416
|
const convMessages = this.messagesByConversation.get(randomConv.id) || [];
|
|
3416
3417
|
convMessages.push(newMessage.id);
|
|
3417
3418
|
this.messagesByConversation.set(randomConv.id, convMessages);
|
|
3418
|
-
await
|
|
3419
|
+
await axConversationIndexedDbStorage.putMessage(newMessage);
|
|
3419
3420
|
// Update conversation
|
|
3420
3421
|
randomConv.lastMessage = newMessage;
|
|
3421
3422
|
randomConv.lastMessageAt = newMessage.timestamp;
|
|
3422
3423
|
randomConv.unreadCount = (randomConv.unreadCount || 0) + 1;
|
|
3423
3424
|
this.conversations.set(randomConv.id, randomConv);
|
|
3424
|
-
await
|
|
3425
|
+
await axConversationIndexedDbStorage.putConversation(randomConv);
|
|
3425
3426
|
// Emit message
|
|
3426
3427
|
this.messageStream$.next(newMessage);
|
|
3427
3428
|
this.conversationUpdates$.next(randomConv);
|
|
@@ -3456,23 +3457,24 @@ class SharedStorage {
|
|
|
3456
3457
|
}
|
|
3457
3458
|
}
|
|
3458
3459
|
// Export singleton instance
|
|
3459
|
-
const
|
|
3460
|
+
const conversationSharedStorage = new AXConversationSharedStorage();
|
|
3460
3461
|
|
|
3461
|
-
var sharedStorage
|
|
3462
|
+
var sharedStorage = /*#__PURE__*/Object.freeze({
|
|
3462
3463
|
__proto__: null,
|
|
3463
|
-
|
|
3464
|
+
AXConversationSharedStorage: AXConversationSharedStorage,
|
|
3465
|
+
conversationSharedStorage: conversationSharedStorage
|
|
3464
3466
|
});
|
|
3465
3467
|
|
|
3466
3468
|
/**
|
|
3467
3469
|
* IndexedDB User API Implementation
|
|
3468
3470
|
* Implements AXUserApi using IndexedDB backend
|
|
3469
3471
|
*/
|
|
3470
|
-
class
|
|
3472
|
+
class AXConversationIndexedDbUserApi extends AXUserApi {
|
|
3471
3473
|
// =====================
|
|
3472
3474
|
// User Profile
|
|
3473
3475
|
// =====================
|
|
3474
3476
|
async getCurrentUser() {
|
|
3475
|
-
const user =
|
|
3477
|
+
const user = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
|
|
3476
3478
|
if (!user) {
|
|
3477
3479
|
throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);
|
|
3478
3480
|
}
|
|
@@ -3498,8 +3500,8 @@ class AXIndexedDBUserApi extends AXUserApi {
|
|
|
3498
3500
|
// User Discovery
|
|
3499
3501
|
// =====================
|
|
3500
3502
|
async getUsers(filters) {
|
|
3501
|
-
const users = Array.from(
|
|
3502
|
-
const filtered = users.filter((u) => u.id !==
|
|
3503
|
+
const users = Array.from(conversationSharedStorage.participants.values());
|
|
3504
|
+
const filtered = users.filter((u) => u.id !== conversationSharedStorage.currentUserId);
|
|
3503
3505
|
if (!filters?.query)
|
|
3504
3506
|
return filtered;
|
|
3505
3507
|
const q = filters.query.toLowerCase();
|
|
@@ -3509,7 +3511,7 @@ class AXIndexedDBUserApi extends AXUserApi {
|
|
|
3509
3511
|
return this.getUsers({ query });
|
|
3510
3512
|
}
|
|
3511
3513
|
async getUserById(userId) {
|
|
3512
|
-
const user =
|
|
3514
|
+
const user = conversationSharedStorage.participants.get(userId);
|
|
3513
3515
|
if (!user) {
|
|
3514
3516
|
throw this.createError('USER_NOT_FOUND', `User ${userId} not found`, 404);
|
|
3515
3517
|
}
|
|
@@ -3517,7 +3519,7 @@ class AXIndexedDBUserApi extends AXUserApi {
|
|
|
3517
3519
|
}
|
|
3518
3520
|
async getUsersByIds(userIds) {
|
|
3519
3521
|
return userIds
|
|
3520
|
-
.map((id) =>
|
|
3522
|
+
.map((id) => conversationSharedStorage.participants.get(id))
|
|
3521
3523
|
.filter((u) => u !== undefined);
|
|
3522
3524
|
}
|
|
3523
3525
|
// =====================
|
|
@@ -3568,10 +3570,10 @@ class AXIndexedDBUserApi extends AXUserApi {
|
|
|
3568
3570
|
// Mock update settings
|
|
3569
3571
|
await Promise.resolve();
|
|
3570
3572
|
}
|
|
3571
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
3572
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
3573
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbUserApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3574
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbUserApi }); }
|
|
3573
3575
|
}
|
|
3574
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
3576
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbUserApi, decorators: [{
|
|
3575
3577
|
type: Injectable
|
|
3576
3578
|
}] });
|
|
3577
3579
|
|
|
@@ -3579,7 +3581,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
3579
3581
|
* IndexedDB Conversation Management API Implementation
|
|
3580
3582
|
* Implements AXConversationManagementApi using IndexedDB backend
|
|
3581
3583
|
*/
|
|
3582
|
-
class
|
|
3584
|
+
class AXConversationIndexedDbConversationApi extends AXConversationApi {
|
|
3583
3585
|
// =====================
|
|
3584
3586
|
// Conversation CRUD
|
|
3585
3587
|
// =====================
|
|
@@ -3591,13 +3593,13 @@ class AXIndexedDBConversationApi extends AXConversationApi {
|
|
|
3591
3593
|
avatar: data.avatar,
|
|
3592
3594
|
description: data.description,
|
|
3593
3595
|
participants: data.participantIds.map((id) => {
|
|
3594
|
-
const participant =
|
|
3596
|
+
const participant = conversationSharedStorage.participants.get(id);
|
|
3595
3597
|
if (!participant) {
|
|
3596
3598
|
throw this.createError('PARTICIPANT_NOT_FOUND', `Participant ${id} not found`, 404);
|
|
3597
3599
|
}
|
|
3598
3600
|
return {
|
|
3599
3601
|
...participant,
|
|
3600
|
-
role: id ===
|
|
3602
|
+
role: id === conversationSharedStorage.currentUserId ? 'admin' : 'member',
|
|
3601
3603
|
};
|
|
3602
3604
|
}),
|
|
3603
3605
|
lastMessageAt: new Date(),
|
|
@@ -3618,20 +3620,20 @@ class AXIndexedDBConversationApi extends AXConversationApi {
|
|
|
3618
3620
|
createdAt: new Date(),
|
|
3619
3621
|
updatedAt: new Date(),
|
|
3620
3622
|
};
|
|
3621
|
-
|
|
3622
|
-
await
|
|
3623
|
-
|
|
3623
|
+
conversationSharedStorage.conversations.set(conversation.id, conversation);
|
|
3624
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
3625
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
3624
3626
|
return conversation;
|
|
3625
3627
|
}
|
|
3626
3628
|
async getConversation(conversationId) {
|
|
3627
|
-
const conversation =
|
|
3629
|
+
const conversation = conversationSharedStorage.conversations.get(conversationId);
|
|
3628
3630
|
if (!conversation) {
|
|
3629
3631
|
throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);
|
|
3630
3632
|
}
|
|
3631
3633
|
return conversation;
|
|
3632
3634
|
}
|
|
3633
3635
|
async getConversations(pagination, _filters) {
|
|
3634
|
-
const items = Array.from(
|
|
3636
|
+
const items = Array.from(conversationSharedStorage.conversations.values()).sort((a, b) => b.lastMessageAt.getTime() - a.lastMessageAt.getTime());
|
|
3635
3637
|
const start = pagination.page * pagination.pageSize;
|
|
3636
3638
|
const end = start + pagination.pageSize;
|
|
3637
3639
|
return {
|
|
@@ -3649,21 +3651,21 @@ class AXIndexedDBConversationApi extends AXConversationApi {
|
|
|
3649
3651
|
...updates,
|
|
3650
3652
|
updatedAt: new Date(),
|
|
3651
3653
|
};
|
|
3652
|
-
|
|
3653
|
-
await
|
|
3654
|
-
|
|
3654
|
+
conversationSharedStorage.conversations.set(conversationId, updated);
|
|
3655
|
+
await axConversationIndexedDbStorage.putConversation(updated);
|
|
3656
|
+
conversationSharedStorage.conversationUpdates$.next(updated);
|
|
3655
3657
|
return updated;
|
|
3656
3658
|
}
|
|
3657
3659
|
async deleteConversation(conversationId) {
|
|
3658
|
-
|
|
3659
|
-
await
|
|
3660
|
+
conversationSharedStorage.conversations.delete(conversationId);
|
|
3661
|
+
await axConversationIndexedDbStorage.deleteConversation(conversationId);
|
|
3660
3662
|
// Also delete associated messages
|
|
3661
|
-
const messageIds =
|
|
3663
|
+
const messageIds = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
|
|
3662
3664
|
for (const id of messageIds) {
|
|
3663
|
-
|
|
3664
|
-
await
|
|
3665
|
+
conversationSharedStorage.messages.delete(id);
|
|
3666
|
+
await axConversationIndexedDbStorage.deleteMessage(id);
|
|
3665
3667
|
}
|
|
3666
|
-
|
|
3668
|
+
conversationSharedStorage.messagesByConversation.delete(conversationId);
|
|
3667
3669
|
return true;
|
|
3668
3670
|
}
|
|
3669
3671
|
// =====================
|
|
@@ -3672,14 +3674,14 @@ class AXIndexedDBConversationApi extends AXConversationApi {
|
|
|
3672
3674
|
async archiveConversation(conversationId) {
|
|
3673
3675
|
const conversation = await this.getConversation(conversationId);
|
|
3674
3676
|
conversation.archived = true;
|
|
3675
|
-
|
|
3676
|
-
await
|
|
3677
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
3678
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
3677
3679
|
}
|
|
3678
3680
|
async unarchiveConversation(conversationId) {
|
|
3679
3681
|
const conversation = await this.getConversation(conversationId);
|
|
3680
3682
|
conversation.archived = false;
|
|
3681
|
-
|
|
3682
|
-
await
|
|
3683
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
3684
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
3683
3685
|
}
|
|
3684
3686
|
async pinConversation(_conversationId) {
|
|
3685
3687
|
// Mock pin - would set pinned flag in real implementation
|
|
@@ -3692,22 +3694,22 @@ class AXIndexedDBConversationApi extends AXConversationApi {
|
|
|
3692
3694
|
async markConversationAsRead(conversationId) {
|
|
3693
3695
|
const conversation = await this.getConversation(conversationId);
|
|
3694
3696
|
conversation.unreadCount = 0;
|
|
3695
|
-
|
|
3696
|
-
await
|
|
3697
|
-
|
|
3697
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
3698
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
3699
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
3698
3700
|
}
|
|
3699
3701
|
async markConversationAsUnread(conversationId) {
|
|
3700
3702
|
const conversation = await this.getConversation(conversationId);
|
|
3701
3703
|
conversation.unreadCount = Math.max(1, conversation.unreadCount);
|
|
3702
|
-
|
|
3703
|
-
await
|
|
3704
|
-
|
|
3704
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
3705
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
3706
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
3705
3707
|
}
|
|
3706
3708
|
// =====================
|
|
3707
3709
|
// Search & Filter
|
|
3708
3710
|
// =====================
|
|
3709
3711
|
async searchConversations(query) {
|
|
3710
|
-
const allConversations = Array.from(
|
|
3712
|
+
const allConversations = Array.from(conversationSharedStorage.conversations.values());
|
|
3711
3713
|
const lowerQuery = query.toLowerCase();
|
|
3712
3714
|
return allConversations.filter((c) => c.title.toLowerCase().includes(lowerQuery) ||
|
|
3713
3715
|
c.participants.some((p) => p.name.toLowerCase().includes(lowerQuery)));
|
|
@@ -3825,10 +3827,10 @@ class AXIndexedDBConversationApi extends AXConversationApi {
|
|
|
3825
3827
|
// Mock clear draft
|
|
3826
3828
|
await Promise.resolve();
|
|
3827
3829
|
}
|
|
3828
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
3829
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
3830
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbConversationApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3831
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbConversationApi }); }
|
|
3830
3832
|
}
|
|
3831
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
3833
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbConversationApi, decorators: [{
|
|
3832
3834
|
type: Injectable
|
|
3833
3835
|
}] });
|
|
3834
3836
|
|
|
@@ -3836,12 +3838,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
3836
3838
|
* IndexedDB Message API Implementation
|
|
3837
3839
|
* Implements AXMessageApi using IndexedDB backend
|
|
3838
3840
|
*/
|
|
3839
|
-
class
|
|
3841
|
+
class AXConversationIndexedDbMessageApi extends AXMessageApi {
|
|
3840
3842
|
// =====================
|
|
3841
3843
|
// Message CRUD
|
|
3842
3844
|
// =====================
|
|
3843
3845
|
async sendMessage(command) {
|
|
3844
|
-
const currentUser =
|
|
3846
|
+
const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
|
|
3845
3847
|
if (!currentUser) {
|
|
3846
3848
|
throw this.createError('USER_NOT_FOUND', 'Current user not found', 404);
|
|
3847
3849
|
}
|
|
@@ -3857,37 +3859,37 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
3857
3859
|
forwarded: command.forwarded,
|
|
3858
3860
|
forwardedFrom: command.forwardedFrom,
|
|
3859
3861
|
metadata: command.metadata || {},
|
|
3860
|
-
replyTo: command.replyToId ?
|
|
3862
|
+
replyTo: command.replyToId ? conversationSharedStorage.messages.get(command.replyToId) : undefined,
|
|
3861
3863
|
};
|
|
3862
3864
|
// Store message in memory and IndexedDB
|
|
3863
|
-
|
|
3864
|
-
const convMessages =
|
|
3865
|
+
conversationSharedStorage.messages.set(message.id, message);
|
|
3866
|
+
const convMessages = conversationSharedStorage.messagesByConversation.get(command.conversationId) || [];
|
|
3865
3867
|
convMessages.push(message.id);
|
|
3866
|
-
|
|
3867
|
-
await
|
|
3868
|
+
conversationSharedStorage.messagesByConversation.set(command.conversationId, convMessages);
|
|
3869
|
+
await axConversationIndexedDbStorage.putMessage(message);
|
|
3868
3870
|
// Update conversation
|
|
3869
|
-
const conversation =
|
|
3871
|
+
const conversation = conversationSharedStorage.conversations.get(command.conversationId);
|
|
3870
3872
|
if (conversation) {
|
|
3871
3873
|
conversation.lastMessageAt = message.timestamp;
|
|
3872
3874
|
conversation.lastMessage = message;
|
|
3873
|
-
|
|
3874
|
-
await
|
|
3875
|
-
|
|
3875
|
+
conversationSharedStorage.conversations.set(conversation.id, conversation);
|
|
3876
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
3877
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
3876
3878
|
}
|
|
3877
|
-
|
|
3879
|
+
conversationSharedStorage.messageStream$.next(message);
|
|
3878
3880
|
return message;
|
|
3879
3881
|
}
|
|
3880
3882
|
async getMessage(messageId) {
|
|
3881
|
-
const message =
|
|
3883
|
+
const message = conversationSharedStorage.messages.get(messageId);
|
|
3882
3884
|
if (!message) {
|
|
3883
3885
|
throw this.createError('MESSAGE_NOT_FOUND', 'Message not found', 404);
|
|
3884
3886
|
}
|
|
3885
3887
|
return message;
|
|
3886
3888
|
}
|
|
3887
3889
|
async getMessages(conversationId, pagination) {
|
|
3888
|
-
const messageIds =
|
|
3890
|
+
const messageIds = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
|
|
3889
3891
|
const allMessages = messageIds
|
|
3890
|
-
.map((id) =>
|
|
3892
|
+
.map((id) => conversationSharedStorage.messages.get(id))
|
|
3891
3893
|
.filter((m) => m !== undefined);
|
|
3892
3894
|
const sorted = allMessages.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
|
|
3893
3895
|
const start = pagination.page * pagination.pageSize;
|
|
@@ -3905,18 +3907,18 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
3905
3907
|
const message = await this.getMessage(messageId);
|
|
3906
3908
|
message.payload = payload;
|
|
3907
3909
|
message.metadata = { ...message.metadata, editedAt: new Date() };
|
|
3908
|
-
|
|
3909
|
-
await
|
|
3910
|
-
|
|
3910
|
+
conversationSharedStorage.messages.set(messageId, message);
|
|
3911
|
+
await axConversationIndexedDbStorage.putMessage(message);
|
|
3912
|
+
conversationSharedStorage.messageUpdates$.next(message);
|
|
3911
3913
|
return message;
|
|
3912
3914
|
}
|
|
3913
3915
|
async deleteMessage(messageId, _forEveryone) {
|
|
3914
3916
|
const message = await this.getMessage(messageId);
|
|
3915
|
-
|
|
3916
|
-
await
|
|
3917
|
-
const conversationMessages =
|
|
3918
|
-
|
|
3919
|
-
|
|
3917
|
+
conversationSharedStorage.messages.delete(messageId);
|
|
3918
|
+
await axConversationIndexedDbStorage.deleteMessage(messageId);
|
|
3919
|
+
const conversationMessages = conversationSharedStorage.messagesByConversation.get(message.conversationId) || [];
|
|
3920
|
+
conversationSharedStorage.messagesByConversation.set(message.conversationId, conversationMessages.filter((id) => id !== messageId));
|
|
3921
|
+
conversationSharedStorage.messageDeletions$.next(messageId);
|
|
3920
3922
|
}
|
|
3921
3923
|
async deleteMessages(messageIds, forEveryone) {
|
|
3922
3924
|
// Mock bulk delete
|
|
@@ -3928,9 +3930,9 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
3928
3930
|
// Message Search
|
|
3929
3931
|
// =====================
|
|
3930
3932
|
async searchMessages(conversationId, filters, _pagination) {
|
|
3931
|
-
const messageIds =
|
|
3933
|
+
const messageIds = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
|
|
3932
3934
|
const allMessages = messageIds
|
|
3933
|
-
.map((id) =>
|
|
3935
|
+
.map((id) => conversationSharedStorage.messages.get(id))
|
|
3934
3936
|
.filter((m) => m !== undefined);
|
|
3935
3937
|
const lowerQuery = filters.query.toLowerCase();
|
|
3936
3938
|
const filtered = allMessages.filter((m) => {
|
|
@@ -3958,7 +3960,7 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
3958
3960
|
// =====================
|
|
3959
3961
|
async addReaction(messageId, emoji) {
|
|
3960
3962
|
const message = await this.getMessage(messageId);
|
|
3961
|
-
const currentUser =
|
|
3963
|
+
const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
|
|
3962
3964
|
if (!currentUser)
|
|
3963
3965
|
return;
|
|
3964
3966
|
const existingReaction = message.reactions.find((r) => r.emoji === emoji && r.userId === currentUser.id);
|
|
@@ -3968,19 +3970,19 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
3968
3970
|
else {
|
|
3969
3971
|
message.reactions.push({ emoji, userId: currentUser.id, timestamp: new Date() });
|
|
3970
3972
|
}
|
|
3971
|
-
|
|
3972
|
-
await
|
|
3973
|
-
|
|
3973
|
+
conversationSharedStorage.messages.set(messageId, message);
|
|
3974
|
+
await axConversationIndexedDbStorage.putMessage(message);
|
|
3975
|
+
conversationSharedStorage.messageUpdates$.next(message);
|
|
3974
3976
|
}
|
|
3975
3977
|
async removeReaction(messageId, emoji) {
|
|
3976
3978
|
const message = await this.getMessage(messageId);
|
|
3977
|
-
const currentUser =
|
|
3979
|
+
const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
|
|
3978
3980
|
if (!currentUser)
|
|
3979
3981
|
return;
|
|
3980
3982
|
message.reactions = message.reactions.filter((r) => !(r.emoji === emoji && r.userId === currentUser.id));
|
|
3981
|
-
|
|
3982
|
-
await
|
|
3983
|
-
|
|
3983
|
+
conversationSharedStorage.messages.set(messageId, message);
|
|
3984
|
+
await axConversationIndexedDbStorage.putMessage(message);
|
|
3985
|
+
conversationSharedStorage.messageUpdates$.next(message);
|
|
3984
3986
|
}
|
|
3985
3987
|
async getAvailableReactions() {
|
|
3986
3988
|
return ['👍', '❤️', '😂', '😮', '😢', '🙏', '🎉', '🔥'];
|
|
@@ -3990,28 +3992,28 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
3990
3992
|
// =====================
|
|
3991
3993
|
async markAsRead(conversationId, messageIds) {
|
|
3992
3994
|
for (const messageId of messageIds) {
|
|
3993
|
-
const message =
|
|
3995
|
+
const message = conversationSharedStorage.messages.get(messageId);
|
|
3994
3996
|
if (message && message.status !== 'read') {
|
|
3995
3997
|
message.status = 'read';
|
|
3996
|
-
|
|
3997
|
-
await
|
|
3998
|
-
|
|
3998
|
+
conversationSharedStorage.messages.set(messageId, message);
|
|
3999
|
+
await axConversationIndexedDbStorage.putMessage(message);
|
|
4000
|
+
conversationSharedStorage.messageUpdates$.next(message);
|
|
3999
4001
|
}
|
|
4000
4002
|
}
|
|
4001
|
-
const conversation =
|
|
4003
|
+
const conversation = conversationSharedStorage.conversations.get(conversationId);
|
|
4002
4004
|
if (conversation) {
|
|
4003
4005
|
conversation.unreadCount = Math.max(0, conversation.unreadCount - messageIds.length);
|
|
4004
|
-
|
|
4005
|
-
await
|
|
4006
|
-
|
|
4006
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
4007
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
4008
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
4007
4009
|
}
|
|
4008
4010
|
}
|
|
4009
4011
|
async markAsUnread(conversationId) {
|
|
4010
|
-
const conversation =
|
|
4012
|
+
const conversation = conversationSharedStorage.conversations.get(conversationId);
|
|
4011
4013
|
if (conversation) {
|
|
4012
4014
|
conversation.unreadCount = Math.max(1, conversation.unreadCount);
|
|
4013
|
-
|
|
4014
|
-
|
|
4015
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
4016
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
4015
4017
|
}
|
|
4016
4018
|
}
|
|
4017
4019
|
async getReadReceipts(_messageId) {
|
|
@@ -4042,7 +4044,7 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
4042
4044
|
// =====================
|
|
4043
4045
|
async getMessageReplies(messageId, pagination) {
|
|
4044
4046
|
// Get all messages that reply to this message
|
|
4045
|
-
const allMessages = Array.from(
|
|
4047
|
+
const allMessages = Array.from(conversationSharedStorage.messages.values());
|
|
4046
4048
|
const replies = allMessages
|
|
4047
4049
|
.filter((m) => m.replyTo?.id === messageId)
|
|
4048
4050
|
.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
@@ -4066,13 +4068,13 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
4066
4068
|
}
|
|
4067
4069
|
async getReplyCount(messageId) {
|
|
4068
4070
|
// Count messages that reply to this message
|
|
4069
|
-
const allMessages = Array.from(
|
|
4071
|
+
const allMessages = Array.from(conversationSharedStorage.messages.values());
|
|
4070
4072
|
const replyCount = allMessages.filter((m) => m.replyTo?.id === messageId).length;
|
|
4071
4073
|
return replyCount;
|
|
4072
4074
|
}
|
|
4073
4075
|
async getForwardCount(messageId) {
|
|
4074
4076
|
// Count messages that were forwarded from this message
|
|
4075
|
-
const allMessages = Array.from(
|
|
4077
|
+
const allMessages = Array.from(conversationSharedStorage.messages.values());
|
|
4076
4078
|
const forwardCount = allMessages.filter((m) => m.forwardedFrom?.messageId === messageId).length;
|
|
4077
4079
|
return forwardCount;
|
|
4078
4080
|
}
|
|
@@ -4080,19 +4082,19 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
4080
4082
|
// Typing Indicators
|
|
4081
4083
|
// =====================
|
|
4082
4084
|
async sendTypingIndicator(conversationId) {
|
|
4083
|
-
const currentUser =
|
|
4084
|
-
|
|
4085
|
+
const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
|
|
4086
|
+
conversationSharedStorage.typingIndicators$.next({
|
|
4085
4087
|
conversationId,
|
|
4086
|
-
userId:
|
|
4088
|
+
userId: conversationSharedStorage.currentUserId,
|
|
4087
4089
|
userName: currentUser?.name || 'You',
|
|
4088
4090
|
timestamp: new Date(),
|
|
4089
4091
|
});
|
|
4090
4092
|
}
|
|
4091
4093
|
async stopTypingIndicator(conversationId) {
|
|
4092
|
-
const currentUser =
|
|
4093
|
-
|
|
4094
|
+
const currentUser = conversationSharedStorage.participants.get(conversationSharedStorage.currentUserId);
|
|
4095
|
+
conversationSharedStorage.typingIndicators$.next({
|
|
4094
4096
|
conversationId,
|
|
4095
|
-
userId:
|
|
4097
|
+
userId: conversationSharedStorage.currentUserId,
|
|
4096
4098
|
userName: currentUser?.name || 'You',
|
|
4097
4099
|
timestamp: new Date(),
|
|
4098
4100
|
});
|
|
@@ -4159,10 +4161,10 @@ class AXIndexedDBMessageApi extends AXMessageApi {
|
|
|
4159
4161
|
// Mock export - return empty JSON
|
|
4160
4162
|
return JSON.stringify({ messages: [] });
|
|
4161
4163
|
}
|
|
4162
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4163
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4164
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4165
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageApi }); }
|
|
4164
4166
|
}
|
|
4165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageApi, decorators: [{
|
|
4166
4168
|
type: Injectable
|
|
4167
4169
|
}] });
|
|
4168
4170
|
|
|
@@ -4170,24 +4172,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
4170
4172
|
* IndexedDB Realtime API Implementation
|
|
4171
4173
|
* Implements AXRealtimeApi using IndexedDB backend
|
|
4172
4174
|
*/
|
|
4173
|
-
class
|
|
4175
|
+
class AXConversationIndexedDbRealtimeApi extends AXRealtimeApi {
|
|
4174
4176
|
constructor() {
|
|
4175
4177
|
super(...arguments);
|
|
4176
|
-
this.connectionStatus$ =
|
|
4178
|
+
this.connectionStatus$ = conversationSharedStorage.connectionStatus$;
|
|
4177
4179
|
}
|
|
4178
4180
|
// =====================
|
|
4179
4181
|
// Connection Management
|
|
4180
4182
|
// =====================
|
|
4181
4183
|
async connect(_options) {
|
|
4182
|
-
|
|
4183
|
-
await
|
|
4184
|
-
|
|
4184
|
+
conversationSharedStorage.connectionStatus$.next('connecting');
|
|
4185
|
+
await conversationSharedStorage.seedIfEmpty();
|
|
4186
|
+
conversationSharedStorage.connectionStatus$.next('connected');
|
|
4185
4187
|
}
|
|
4186
4188
|
async disconnect() {
|
|
4187
|
-
|
|
4189
|
+
conversationSharedStorage.connectionStatus$.next('disconnected');
|
|
4188
4190
|
}
|
|
4189
4191
|
isConnected() {
|
|
4190
|
-
return
|
|
4192
|
+
return conversationSharedStorage.connectionStatus$.value === 'connected';
|
|
4191
4193
|
}
|
|
4192
4194
|
async reconnect() {
|
|
4193
4195
|
await this.disconnect();
|
|
@@ -4206,23 +4208,23 @@ class AXIndexedDBRealtimeApi extends AXRealtimeApi {
|
|
|
4206
4208
|
// Message Events
|
|
4207
4209
|
// =====================
|
|
4208
4210
|
subscribeToMessages(conversationId) {
|
|
4209
|
-
return
|
|
4211
|
+
return conversationSharedStorage.messageStream$.pipe(filter((msg) => msg.conversationId === conversationId));
|
|
4210
4212
|
}
|
|
4211
4213
|
subscribeToMessageUpdates(_conversationId) {
|
|
4212
|
-
return
|
|
4214
|
+
return conversationSharedStorage.messageUpdates$;
|
|
4213
4215
|
}
|
|
4214
4216
|
subscribeToMessageDeletions(_conversationId) {
|
|
4215
|
-
return
|
|
4217
|
+
return conversationSharedStorage.messageDeletions$;
|
|
4216
4218
|
}
|
|
4217
4219
|
subscribeToMessageReactions(_conversationId) {
|
|
4218
4220
|
// Mock reactions - reuse message updates
|
|
4219
|
-
return
|
|
4221
|
+
return conversationSharedStorage.messageUpdates$;
|
|
4220
4222
|
}
|
|
4221
4223
|
// =====================
|
|
4222
4224
|
// Conversation Events
|
|
4223
4225
|
// =====================
|
|
4224
4226
|
subscribeToConversationUpdates() {
|
|
4225
|
-
return
|
|
4227
|
+
return conversationSharedStorage.conversationUpdates$;
|
|
4226
4228
|
}
|
|
4227
4229
|
subscribeToConversationCreated() {
|
|
4228
4230
|
// Mock conversation created
|
|
@@ -4238,16 +4240,16 @@ class AXIndexedDBRealtimeApi extends AXRealtimeApi {
|
|
|
4238
4240
|
subscribeToTypingIndicators(conversationId) {
|
|
4239
4241
|
// If conversationId is empty, return all typing indicators (for global subscription)
|
|
4240
4242
|
if (!conversationId) {
|
|
4241
|
-
return
|
|
4243
|
+
return conversationSharedStorage.typingIndicators$;
|
|
4242
4244
|
}
|
|
4243
4245
|
// Otherwise filter by specific conversation
|
|
4244
|
-
return
|
|
4246
|
+
return conversationSharedStorage.typingIndicators$.pipe(filter((ind) => ind.conversationId === conversationId));
|
|
4245
4247
|
}
|
|
4246
4248
|
// =====================
|
|
4247
4249
|
// Presence Updates
|
|
4248
4250
|
// =====================
|
|
4249
4251
|
subscribeToPresenceUpdates(_userIds) {
|
|
4250
|
-
return
|
|
4252
|
+
return conversationSharedStorage.presenceUpdates$;
|
|
4251
4253
|
}
|
|
4252
4254
|
// =====================
|
|
4253
4255
|
// Read Receipts
|
|
@@ -4309,10 +4311,10 @@ class AXIndexedDBRealtimeApi extends AXRealtimeApi {
|
|
|
4309
4311
|
// Mock draft changes
|
|
4310
4312
|
return new Observable(() => { });
|
|
4311
4313
|
}
|
|
4312
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4313
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4314
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbRealtimeApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4315
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbRealtimeApi }); }
|
|
4314
4316
|
}
|
|
4315
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4317
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbRealtimeApi, decorators: [{
|
|
4316
4318
|
type: Injectable
|
|
4317
4319
|
}] });
|
|
4318
4320
|
|
|
@@ -4323,10 +4325,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
4323
4325
|
* @security API key should be provided via injection token in production
|
|
4324
4326
|
* @example
|
|
4325
4327
|
* ```typescript
|
|
4326
|
-
* export const
|
|
4328
|
+
* export const AXConversationAiApiKey = new InjectionToken<string>('AXConversationAiApiKey');
|
|
4327
4329
|
*
|
|
4328
4330
|
* providers: [
|
|
4329
|
-
* { provide:
|
|
4331
|
+
* { provide: AXConversationAiApiKey, useValue: environment.geminiApiKey }
|
|
4330
4332
|
* ]
|
|
4331
4333
|
* ```
|
|
4332
4334
|
*/
|
|
@@ -4334,7 +4336,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
4334
4336
|
* Injection token for AI API key
|
|
4335
4337
|
* Provide this in your app config to avoid hardcoding the API key
|
|
4336
4338
|
*/
|
|
4337
|
-
const
|
|
4339
|
+
const AXConversationAiApiKey = new InjectionToken('AXConversationAiApiKey');
|
|
4338
4340
|
/**
|
|
4339
4341
|
* Default configuration
|
|
4340
4342
|
*/
|
|
@@ -4343,9 +4345,9 @@ const DEFAULT_CONFIG = {
|
|
|
4343
4345
|
timeout: 2000,
|
|
4344
4346
|
useFallbackReplies: true,
|
|
4345
4347
|
};
|
|
4346
|
-
class
|
|
4348
|
+
class AXConversationAiResponderService {
|
|
4347
4349
|
constructor() {
|
|
4348
|
-
this.injectedApiKey = inject(
|
|
4350
|
+
this.injectedApiKey = inject(AXConversationAiApiKey, { optional: true });
|
|
4349
4351
|
this.config = DEFAULT_CONFIG;
|
|
4350
4352
|
}
|
|
4351
4353
|
/**
|
|
@@ -4485,10 +4487,10 @@ class AXAIResponderService {
|
|
|
4485
4487
|
configure(config) {
|
|
4486
4488
|
Object.assign(this.config, config);
|
|
4487
4489
|
}
|
|
4488
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4489
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4490
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAiResponderService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4491
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAiResponderService, providedIn: 'root' }); }
|
|
4490
4492
|
}
|
|
4491
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4493
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationAiResponderService, decorators: [{
|
|
4492
4494
|
type: Injectable,
|
|
4493
4495
|
args: [{
|
|
4494
4496
|
providedIn: 'root',
|
|
@@ -4499,10 +4501,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
4499
4501
|
* IndexedDB Message API with AI Auto-Responder
|
|
4500
4502
|
* Extends IndexedDB Message API to automatically respond to user messages with AI
|
|
4501
4503
|
*/
|
|
4502
|
-
class
|
|
4504
|
+
class AXConversationIndexedDbMessageAiApi extends AXConversationIndexedDbMessageApi {
|
|
4503
4505
|
constructor() {
|
|
4504
4506
|
super(...arguments);
|
|
4505
|
-
this.aiResponder = inject(
|
|
4507
|
+
this.aiResponder = inject(AXConversationAiResponderService);
|
|
4506
4508
|
this.AI_TYPING_INDICATOR_DELAY = 1000; // 1 second delay to simulate typing
|
|
4507
4509
|
this.AI_RESPONSE_DELAY = 2000; // 2 seconds delay to simulate typing
|
|
4508
4510
|
}
|
|
@@ -4556,7 +4558,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4556
4558
|
*/
|
|
4557
4559
|
async generateAIResponse(conversationId, userText, replyToId) {
|
|
4558
4560
|
try {
|
|
4559
|
-
const {
|
|
4561
|
+
const { conversationSharedStorage } = await Promise.resolve().then(function () { return sharedStorage; });
|
|
4560
4562
|
// Get the conversation to find an AI bot or other participant
|
|
4561
4563
|
const conversation = await this.getConversationForAI(conversationId);
|
|
4562
4564
|
if (!conversation) {
|
|
@@ -4577,20 +4579,20 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4577
4579
|
console.log('🤖 AI Bot:', aiSender.name, 'is preparing to respond...');
|
|
4578
4580
|
// 1. Mark user's message as READ by AI
|
|
4579
4581
|
console.log('👁️ AI reading your message...');
|
|
4580
|
-
const userMessage =
|
|
4582
|
+
const userMessage = conversationSharedStorage.messages.get(replyToId);
|
|
4581
4583
|
if (userMessage) {
|
|
4582
4584
|
userMessage.status = 'read';
|
|
4583
|
-
|
|
4584
|
-
|
|
4585
|
+
conversationSharedStorage.messages.set(replyToId, userMessage);
|
|
4586
|
+
conversationSharedStorage.messageUpdates$.next(userMessage);
|
|
4585
4587
|
}
|
|
4586
4588
|
// 2. Set AI user to ONLINE
|
|
4587
4589
|
console.log('🟢 AI coming online...');
|
|
4588
|
-
const aiUser =
|
|
4590
|
+
const aiUser = conversationSharedStorage.participants.get(aiSender.id);
|
|
4589
4591
|
if (aiUser) {
|
|
4590
4592
|
aiUser.status = 'online';
|
|
4591
4593
|
aiUser.lastSeen = new Date();
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
+
conversationSharedStorage.participants.set(aiSender.id, aiUser);
|
|
4595
|
+
conversationSharedStorage.presenceUpdates$.next({
|
|
4594
4596
|
userId: aiSender.id,
|
|
4595
4597
|
status: 'online',
|
|
4596
4598
|
lastSeen: aiUser.lastSeen,
|
|
@@ -4600,7 +4602,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4600
4602
|
await this.delay(500);
|
|
4601
4603
|
// 3. Show TYPING indicator
|
|
4602
4604
|
console.log('✍️ AI is typing...');
|
|
4603
|
-
|
|
4605
|
+
conversationSharedStorage.typingIndicators$.next({
|
|
4604
4606
|
conversationId,
|
|
4605
4607
|
userId: aiSender.id,
|
|
4606
4608
|
userName: aiSender.name,
|
|
@@ -4609,8 +4611,8 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4609
4611
|
// Update conversation typing status
|
|
4610
4612
|
conversation.status.isTyping = true;
|
|
4611
4613
|
conversation.status.typingUsers = [aiSender.id];
|
|
4612
|
-
|
|
4613
|
-
|
|
4614
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
4615
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
4614
4616
|
// 4. Get conversation history (last 20 messages)
|
|
4615
4617
|
const conversationHistory = await this.getConversationHistory(conversationId, 20);
|
|
4616
4618
|
console.log('📚 Loaded conversation history:', conversationHistory.split('\n').length, 'messages');
|
|
@@ -4624,7 +4626,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4624
4626
|
await this.delay(typingDelay);
|
|
4625
4627
|
// 6. Stop TYPING indicator
|
|
4626
4628
|
console.log('🛑 AI stopped typing...');
|
|
4627
|
-
|
|
4629
|
+
conversationSharedStorage.typingIndicators$.next({
|
|
4628
4630
|
conversationId,
|
|
4629
4631
|
userId: aiSender.id,
|
|
4630
4632
|
userName: aiSender.name,
|
|
@@ -4632,8 +4634,8 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4632
4634
|
});
|
|
4633
4635
|
conversation.status.isTyping = false;
|
|
4634
4636
|
conversation.status.typingUsers = [];
|
|
4635
|
-
|
|
4636
|
-
|
|
4637
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
4638
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
4637
4639
|
// 7. Send AI message
|
|
4638
4640
|
console.log('📤 Sending AI message from:', aiSender.name);
|
|
4639
4641
|
await this.createAIMessage(conversationId, aiSender.id, aiResponse, replyToId);
|
|
@@ -4642,8 +4644,8 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4642
4644
|
setTimeout(() => {
|
|
4643
4645
|
if (aiUser) {
|
|
4644
4646
|
aiUser.status = 'away';
|
|
4645
|
-
|
|
4646
|
-
|
|
4647
|
+
conversationSharedStorage.participants.set(aiSender.id, aiUser);
|
|
4648
|
+
conversationSharedStorage.presenceUpdates$.next({
|
|
4647
4649
|
userId: aiSender.id,
|
|
4648
4650
|
status: 'away',
|
|
4649
4651
|
lastSeen: new Date(),
|
|
@@ -4662,8 +4664,8 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4662
4664
|
async getConversationForAI(conversationId) {
|
|
4663
4665
|
try {
|
|
4664
4666
|
// Access shared storage directly
|
|
4665
|
-
const {
|
|
4666
|
-
return
|
|
4667
|
+
const { conversationSharedStorage } = await Promise.resolve().then(function () { return sharedStorage; });
|
|
4668
|
+
return conversationSharedStorage.conversations.get(conversationId);
|
|
4667
4669
|
}
|
|
4668
4670
|
catch {
|
|
4669
4671
|
return null;
|
|
@@ -4674,14 +4676,14 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4674
4676
|
*/
|
|
4675
4677
|
async getConversationHistory(conversationId, limit = 20) {
|
|
4676
4678
|
try {
|
|
4677
|
-
const {
|
|
4679
|
+
const { conversationSharedStorage } = await Promise.resolve().then(function () { return sharedStorage; });
|
|
4678
4680
|
// Get all messages for this conversation
|
|
4679
|
-
const messageIds =
|
|
4681
|
+
const messageIds = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
|
|
4680
4682
|
// Get last N messages (excluding the very last one which is the current user message)
|
|
4681
4683
|
const recentMessageIds = messageIds.slice(-limit - 1, -1);
|
|
4682
4684
|
const messages = [];
|
|
4683
4685
|
for (const msgId of recentMessageIds) {
|
|
4684
|
-
const msg =
|
|
4686
|
+
const msg = conversationSharedStorage.messages.get(msgId);
|
|
4685
4687
|
if (msg) {
|
|
4686
4688
|
messages.push(msg);
|
|
4687
4689
|
}
|
|
@@ -4689,7 +4691,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4689
4691
|
// Format messages for AI context
|
|
4690
4692
|
const formattedHistory = messages
|
|
4691
4693
|
.map((msg) => {
|
|
4692
|
-
const sender =
|
|
4694
|
+
const sender = conversationSharedStorage.participants.get(msg.senderId);
|
|
4693
4695
|
const senderName = sender?.name || (msg.senderId === 'current-user' ? 'You' : 'Unknown');
|
|
4694
4696
|
// Extract text from different message types
|
|
4695
4697
|
let text = '';
|
|
@@ -4729,7 +4731,7 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4729
4731
|
*/
|
|
4730
4732
|
async createAIMessage(conversationId, senderId, text, replyToId) {
|
|
4731
4733
|
try {
|
|
4732
|
-
const {
|
|
4734
|
+
const { conversationSharedStorage } = await Promise.resolve().then(function () { return sharedStorage; });
|
|
4733
4735
|
const message = {
|
|
4734
4736
|
id: `msg-ai-${Date.now()}`,
|
|
4735
4737
|
conversationId,
|
|
@@ -4743,26 +4745,26 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4743
4745
|
status: 'sent',
|
|
4744
4746
|
reactions: [],
|
|
4745
4747
|
metadata: { isAI: true },
|
|
4746
|
-
replyTo:
|
|
4748
|
+
replyTo: conversationSharedStorage.messages.get(replyToId),
|
|
4747
4749
|
};
|
|
4748
4750
|
// Store message in memory and IndexedDB
|
|
4749
|
-
const {
|
|
4750
|
-
|
|
4751
|
-
const convMessages =
|
|
4751
|
+
const { axConversationIndexedDbStorage } = await Promise.resolve().then(function () { return indexeddbStorage; });
|
|
4752
|
+
conversationSharedStorage.messages.set(message.id, message);
|
|
4753
|
+
const convMessages = conversationSharedStorage.messagesByConversation.get(conversationId) || [];
|
|
4752
4754
|
convMessages.push(message.id);
|
|
4753
|
-
|
|
4754
|
-
await
|
|
4755
|
+
conversationSharedStorage.messagesByConversation.set(conversationId, convMessages);
|
|
4756
|
+
await axConversationIndexedDbStorage.putMessage(message);
|
|
4755
4757
|
// Update conversation
|
|
4756
|
-
const conversation =
|
|
4758
|
+
const conversation = conversationSharedStorage.conversations.get(conversationId);
|
|
4757
4759
|
if (conversation) {
|
|
4758
4760
|
conversation.lastMessageAt = message.timestamp;
|
|
4759
4761
|
conversation.lastMessage = message;
|
|
4760
|
-
|
|
4761
|
-
await
|
|
4762
|
-
|
|
4762
|
+
conversationSharedStorage.conversations.set(conversationId, conversation);
|
|
4763
|
+
await axConversationIndexedDbStorage.putConversation(conversation);
|
|
4764
|
+
conversationSharedStorage.conversationUpdates$.next(conversation);
|
|
4763
4765
|
}
|
|
4764
4766
|
// Emit message
|
|
4765
|
-
|
|
4767
|
+
conversationSharedStorage.messageStream$.next(message);
|
|
4766
4768
|
}
|
|
4767
4769
|
catch (error) {
|
|
4768
4770
|
console.error('Error creating AI message:', error);
|
|
@@ -4774,20 +4776,18 @@ class AXIndexedDBMessageAIApi extends AXIndexedDBMessageApi {
|
|
|
4774
4776
|
delay(ms) {
|
|
4775
4777
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
4776
4778
|
}
|
|
4777
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4778
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4779
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageAiApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4780
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageAiApi }); }
|
|
4779
4781
|
}
|
|
4780
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type:
|
|
4782
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXConversationIndexedDbMessageAiApi, decorators: [{
|
|
4781
4783
|
type: Injectable
|
|
4782
4784
|
}] });
|
|
4783
4785
|
|
|
4784
4786
|
/**
|
|
4785
|
-
* IndexedDB API
|
|
4787
|
+
* IndexedDB API implementations and storage for @acorex/components/conversation2.
|
|
4786
4788
|
*
|
|
4787
|
-
*
|
|
4788
|
-
* to provide mock data for development and testing.
|
|
4789
|
+
* Public symbols use the `AXConversation` prefix.
|
|
4789
4790
|
*/
|
|
4790
|
-
// Separated API implementations
|
|
4791
4791
|
|
|
4792
4792
|
/**
|
|
4793
4793
|
* File Upload Service
|
|
@@ -13620,7 +13620,7 @@ class AXComposerComponent {
|
|
|
13620
13620
|
</div>
|
|
13621
13621
|
</ax-popover>
|
|
13622
13622
|
}
|
|
13623
|
-
`, isInline: true, styles: [":host{display:block}.composer-banner{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;background:rgb(var(--ax-sys-color-primary-lightest-surface));border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.25);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.5);color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.banner-content{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.banner-icon,.emoji-icon{font-size:1.25rem;flex-shrink:0}.banner-text{flex:1;min-width:0;cursor:pointer;transition:opacity .2s}.banner-text:hover{opacity:.8}.banner-title{font-size:.75rem;font-weight:600}.banner-subtitle{font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.8}.banner-close{flex-shrink:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:.375rem;font-size:1rem;cursor:pointer;transition:background .2s}.banner-close:hover{background:rgb(var(--ax-sys-color-light-surface))}.composer-input-container{display:flex;align-items:center;gap:.5rem;padding:.75rem}.composer-actions-left,.composer-actions-right{display:flex;align-items:center;//gap: .5rem}.composer-input-wrapper{display:flex;flex:1;min-width:0}.composer-input{width:100%;min-height:40px;max-height:120px;padding:.5rem .75rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:1.25rem;font-size:.9375rem;font-family:inherit;line-height:1.5;resize:none;outline:none;transition:border-color .2s}.composer-input:focus{border-color:rgb(var(--ax-sys-color-primary-500))}.action-button{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;background:transparent;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:all .2s;flex-shrink:0}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.action-button:disabled{opacity:.5;cursor:not-allowed}.action-send{background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface))}.action-send:hover:not(:disabled){background:rgb(var(--ax-sys-color-primary-600))}.send-icon{font-size:1rem;position:relative;left:-1px}.action-voice{font-size:1.25rem}.composer-attachments{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 1rem 1rem}.attachment-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:rgb(var(--ax-sys-color-light-surface));border-radius:.5rem;font-size:.875rem}.attachment-icon{font-size:1rem}.attachment-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-remove{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;border-radius:50%;font-size:.875rem;cursor:pointer;transition:background .2s}.attachment-remove:hover{background:rgb(var(--ax-sys-color-danger-lightest-surface));color:rgb(var(--ax-sys-color-danger-500))}.typing-indicator-container{padding:0 1rem .5rem;font-size:.75rem;opacity:.7}.composer-component-fullwidth{width:100%;min-height:72px;background:rgb(var(--ax-sys-color-lightest-surface))}.action-badge{position:absolute;top:4px;right:4px;min-width:16px;height:16px;padding:0 4px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border-radius:8px;font-size:.625rem;font-weight:600}.action-button{position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i3$2.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXCommonModule }, { kind: "ngmodule", type: AXUploaderModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i7.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
13623
|
+
`, isInline: true, styles: [":host{display:block}.composer-banner{display:flex;align-items:center;justify-content:space-between;padding:.5rem .75rem;background:rgb(var(--ax-sys-color-primary-lightest-surface));border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.25);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.5);color:rgb(var(--ax-sys-color-on-primary-lightest-surface))}.banner-content{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.banner-icon,.emoji-icon{font-size:1.25rem;flex-shrink:0}.banner-text{flex:1;min-width:0;cursor:pointer;transition:opacity .2s}.banner-text:hover{opacity:.8}.banner-title{font-size:.75rem;font-weight:600}.banner-subtitle{font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.8}.banner-close{flex-shrink:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;border-radius:.375rem;font-size:1rem;cursor:pointer;transition:background .2s}.banner-close:hover{background:rgb(var(--ax-sys-color-light-surface))}.composer-input-container{display:flex;align-items:center;gap:.5rem;padding:.75rem}.composer-actions-left,.composer-actions-right{display:flex;align-items:center;//gap: .5rem}.composer-input-wrapper{display:flex;flex:1;min-width:0}.composer-input{width:100%;min-height:40px;max-height:120px;padding:.5rem .75rem;border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:1.25rem;font-size:.9375rem;font-family:inherit;line-height:1.5;resize:none;outline:none;transition:border-color .2s}.composer-input:focus{border-color:rgb(var(--ax-sys-color-primary-500))}.action-button{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;background:transparent;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:all .2s;flex-shrink:0}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.action-button:disabled{opacity:.5;cursor:not-allowed}.action-send{background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface))}.action-send:hover:not(:disabled){background:rgb(var(--ax-sys-color-primary-600))}.send-icon{font-size:1rem;position:relative;left:-1px}.action-voice{font-size:1.25rem}.composer-attachments{display:flex;flex-wrap:wrap;gap:.5rem;padding:0 1rem 1rem}.attachment-item{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:rgb(var(--ax-sys-color-light-surface));border-radius:.5rem;font-size:.875rem}.attachment-icon{font-size:1rem}.attachment-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-remove{display:flex;align-items:center;justify-content:center;width:20px;height:20px;border:none;background:transparent;border-radius:50%;font-size:.875rem;cursor:pointer;transition:background .2s}.attachment-remove:hover{background:rgb(var(--ax-sys-color-danger-lightest-surface));color:rgb(var(--ax-sys-color-danger-500))}.typing-indicator-container{padding:0 1rem .5rem;font-size:.75rem;opacity:.7}.composer-component-fullwidth{width:100%;min-height:72px;background:rgb(var(--ax-sys-color-lightest-surface))}.action-badge{position:absolute;top:4px;right:4px;min-width:16px;height:16px;padding:0 4px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border-radius:8px;font-size:.625rem;font-weight:600}.action-button{position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTextAreaModule }, { kind: "component", type: i3$2.AXTextAreaComponent, selector: "ax-text-area", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "placeholder", "maxLength", "look", "rows", "allowResize", "showCounter", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXCommonModule }, { kind: "ngmodule", type: AXUploaderModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i7.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
13624
13624
|
}
|
|
13625
13625
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXComposerComponent, decorators: [{
|
|
13626
13626
|
type: Component,
|
|
@@ -14683,7 +14683,7 @@ class AXInfoBarComponent {
|
|
|
14683
14683
|
</div>
|
|
14684
14684
|
}
|
|
14685
14685
|
}
|
|
14686
|
-
`, isInline: true, styles: [":host{display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXMembersPopoverComponent, selector: "ax-conversation-members-popover", inputs: ["conversation"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14686
|
+
`, isInline: true, styles: [":host{display:block}.info-bar{position:relative;display:flex;align-items:center;justify-content:space-between;overflow:hidden;padding:.5rem;line-height:1.1rem;min-height:64px;gap:.75rem}.info-banner{position:relative;z-index:1;display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-top:1px solid rgb(var(--ax-sys-color-border-light-surface),.5);border-bottom:1px solid rgba(var(--ax-sys-color-border-surface),.25);background:rgb(var(--ax-sys-color-primary-lightest-surface));box-shadow:0 6px 16px rgb(var(--ax-sys-color-on-surface),.08),0 2px 6px rgb(var(--ax-sys-color-on-surface),.05)}.info-banner__content{flex:1;min-width:0}.info-banner__close{flex-shrink:0}.info-bar-empty{justify-content:center;opacity:.6}.info-left{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0}.info-details{flex:1;min-width:0}.info-title{margin:0;font-size:1rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.info-subtitle-with-status{display:flex;align-items:center;gap:.375rem;margin:.125rem 0 0}.online-badge{color:#22c55e;font-size:.625rem;line-height:1;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.info-subtitle{margin:0;font-size:.85rem;letter-spacing:.02rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.7}.info-subtitle.clickable{cursor:pointer;transition:opacity .2s}.info-subtitle.clickable:hover{opacity:1;text-decoration:underline}.info-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.info-component-fullwidth{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:1rem;background:rgb(var(--ax-sys-color-lightest-surface));z-index:10}.slide-in{animation:slideInFromRight var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.slide-out{opacity:0;transform:translate(100%);transition:opacity .25s cubic-bezier(.4,0,1,1),transform .25s cubic-bezier(.4,0,1,1)}.info-component-fullwidth>*:first-child{flex:1;min-width:0}.action-button{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:.5rem;font-size:1.25rem;cursor:pointer;transition:background .2s}.action-button:hover{background:rgb(var(--ax-sys-color-light-surface))}.search-container{display:flex;align-items:center;gap:.5rem;width:100%;min-width:200px}.search-input{flex:1;min-width:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i1.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i1.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items", "closeParentOnClick", "lockOnLoading"], outputs: ["onItemClick"] }, { kind: "component", type: AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXMembersPopoverComponent, selector: "ax-conversation-members-popover", inputs: ["conversation"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14687
14687
|
}
|
|
14688
14688
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXInfoBarComponent, decorators: [{
|
|
14689
14689
|
type: Component,
|
|
@@ -16101,7 +16101,7 @@ class AXMessageListComponent {
|
|
|
16101
16101
|
</ax-popover>
|
|
16102
16102
|
}
|
|
16103
16103
|
}
|
|
16104
|
-
`, isInline: true, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:5.5rem;line-height:1;opacity:.35;margin-bottom:.5rem;filter:grayscale(.2)}.empty-title{font-size:1.625rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface));letter-spacing:-.02em}.empty-description{font-size:1.0625rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;max-width:420px;line-height:1.7}.spinner{width:32px;height:32px;border:3px solid rgb(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));border-radius:50%;animation:spin .8s linear infinite;margin-bottom:1rem}@keyframes spin{to{transform:rotate(360deg)}}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;overflow-y:auto;overflow-x:hidden}.date-separator{position:sticky;z-index:150;top:0;display:flex;align-items:center;justify-content:center;padding:.5rem 0}.date-text{padding:.25rem .75rem;background:rgb(var(--ax-sys-color-lighter-surface));font-size:.75rem;font-weight:500;border-radius:1rem;width:7rem;display:flex;justify-content:center;align-items:center}.unread-separator{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;padding:0 1rem}.unread-separator-line{flex:1;height:1px;background:rgb(var(--ax-sys-color-primary-500));opacity:.3}.unread-separator-text{font-size:.75rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.message-item{position:relative;display:flex;padding:.5rem 1rem;gap:.5rem;line-height:1rem;align-items:end;transition:background-color .3s ease}.message-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.fade-slide-in{animation:fadeSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes fadeSlideIn{0%{opacity:0;// transform: translateX(20%)}to{opacity:1;// transform: translateX(0)}}.message-own{flex-direction:row-reverse}.message-avatar{flex-shrink:0}.message-content-row{display:flex;flex-direction:row;align-items:flex-end;max-width:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.message-content-row-own{justify-content:flex-end}.message-item:not(.message-own) .message-content-row{justify-content:flex-start}.message-bubble-container{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;max-width:100%;position:relative}.message-own .message-bubble-container{align-items:flex-end}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:.1rem}.message-bubble{position:relative;display:flex;flex-direction:column;padding:.375rem .5rem .1rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));word-wrap:break-word;transition:background-color .3s ease}.reply-preview{padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .reply-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .reply-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.reply-preview-line{width:3px;background:currentColor;opacity:.5;border-radius:1.5px;flex-shrink:0}.reply-preview-content{flex:1;min-width:0}.reply-preview-sender{font-size:.75rem;font-weight:600;margin-bottom:.125rem;color:rgb(var(--ax-sys-color-primary-600))}.reply-preview-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-own .reply-preview-sender{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .reply-preview-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.forwarded-preview{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .forwarded-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .forwarded-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.forwarded-preview i{font-size:.8125rem;flex-shrink:0;color:rgb(var(--ax-sys-color-primary-600))}.forwarded-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.message-own .forwarded-preview i{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .forwarded-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.message-bubble-received{border-bottom-left-radius:.125rem}.message-bubble-received:before{content:\"\";display:block;background:rgb(var(--ax-sys-color-lightest-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-radius:.125rem}.message-bubble-sent:after{content:\"\";display:block;background:rgb(var(--ax-sys-color-primary-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;right:-.7rem;border-top-right-radius:86%;corner-shape:scoop}.message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.message-content{font-size:.9375rem;line-height:1.5;white-space:pre-wrap}.message-footer{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;margin-top:.1rem;gap:.25rem;font-size:.6875rem;opacity:.7;letter-spacing:.05rem;-webkit-user-select:none;user-select:none}.message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-variant-numeric:tabular-nums;font-size:.675rem}.message-footer-count i{font-size:.625rem;opacity:.9}.message-footer-count-value{font-weight:600}.message-footer-split{flex-shrink:0;align-self:center;width:1px;height:.65rem;background:rgb(var(--ax-sys-color-border-light-surface));opacity:.9;margin-inline:.2rem}.message-time{font-variant-numeric:tabular-nums;font-size:.675rem}.edited-indicator{display:inline-flex;align-items:center;gap:.25rem;font-size:.675rem;opacity:.75;padding-inline-start:.35rem;border-inline-start:1px solid rgb(var(--ax-sys-color-border-light-surface))}.status-icon{display:inline-flex;font-size:.75rem}.status-read{color:rgb(var(--ax-sys-color-primary-200))}.status-failed{color:rgb(var(--ax-sys-color-danger-200))}.message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}.reaction-bubble{display:inline-flex;align-items:center;justify-content:center;gap:.15rem;min-height:1.375rem;padding:.1rem .35rem;margin:0;background:rgba(var(--ax-sys-color-on-surface),.06);color:rgb(var(--ax-sys-color-on-surface));border:1px solid rgba(var(--ax-sys-color-on-surface),.1);border-radius:.75rem;box-shadow:none;cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}.reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}.reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}.reaction-emoji{font-size:.8125rem;line-height:1;display:inline-block}.reaction-count{font-size:.6875rem;font-weight:500;font-variant-numeric:tabular-nums;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;line-height:1}.reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-primary-600));opacity:.95;font-weight:600}.message-own .reaction-bubble{background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2);color:rgb(var(--ax-sys-color-on-primary-surface))}.message-own .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.2);border-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}.message-own .reaction-bubble-active{background:rgba(var(--ax-sys-color-on-primary-surface),.28);border-color:rgba(var(--ax-sys-color-on-primary-surface),.5)}.message-own .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.34);border-color:rgba(var(--ax-sys-color-on-primary-surface),.6)}.message-own .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.8}.message-own .reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:1}.message-reactions-container{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.2rem;margin-top:.25rem;justify-content:flex-start}.message-own .message-reactions-container{justify-content:flex-end}.add-reaction-button.add-reaction-outside{display:none;position:absolute;top:50%;inset-inline-end:-1.5rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.25rem;height:1.25rem;padding:0;margin:0;border-radius:50%;cursor:pointer;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 1px 2px #0000000f}.add-reaction-button{padding-inline-start:.05rem}.message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-1.5rem;inset-inline-end:auto}.message-item:hover .add-reaction-button.add-reaction-outside,.add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}.add-reaction-button.add-reaction-outside:hover,.add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgb(var(--ax-sys-color-primary-500))}.add-reaction-button.add-reaction-outside i{font-size:.625rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.8}.reaction-picker-popup{position:fixed;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.5rem;z-index:100;min-width:auto;width:max-content;max-width:min(200px,92vw);box-shadow:0 4px 16px #0000001a;transform:translateY(-100%);margin-top:-.35rem;overflow:hidden}.reaction-picker-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.3rem .4rem .3rem .55rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.6875rem;font-weight:600;letter-spacing:.02em;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.picker-close{display:flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface) / .55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgb(var(--ax-sys-color-danger-500) / .1);color:rgb(var(--ax-sys-color-danger-500))}.reaction-bubble:focus-visible,.add-reaction-button:focus-visible,.picker-close:focus-visible,.reaction-picker-emoji:focus-visible,.action-trigger:focus-visible,.scroll-to-bottom:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,1fr);gap:.08rem;padding:.3rem .35rem .35rem}.reaction-picker-emoji{width:1.5rem;height:1.5rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.35rem;font-size:.95rem;line-height:1;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-picker-emoji:hover{// transform: scale(1.15);background:rgb(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background:rgb(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgb(var(--ax-sys-color-primary-500) / .25)}.message-actions{padding-bottom:1.5rem;opacity:0;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:10}.message-item:hover .message-actions{opacity:1}.action-trigger{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:var(--ax-sys-border-radius);font-size:.875rem;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.action-trigger:hover{background:rgb(var(--ax-sys-color-light-surface));// transform: scale(1.05)}.shortcut{font-size:.6875rem;opacity:.7}.scroll-to-bottom{position:absolute;bottom:1rem;right:1rem;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:999}.scroll-to-bottom:hover{// transform: scale(1.1)}.slide-in{animation:slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-out{opacity:0;transform:translateY(100%);transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4$1.AXFormatPipe, name: "format" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
16104
|
+
`, isInline: true, styles: [":host{display:block;height:100%;position:relative}.message-list{height:100%}.list-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center}.list-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;text-align:center;padding:3rem 2rem;gap:1.25rem;animation:fadeInUp .5s ease-out}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.empty-icon{font-size:5.5rem;line-height:1;opacity:.35;margin-bottom:.5rem;filter:grayscale(.2)}.empty-title{font-size:1.625rem;font-weight:600;margin:0;color:rgb(var(--ax-sys-color-on-surface));letter-spacing:-.02em}.empty-description{font-size:1.0625rem;margin:0;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;max-width:420px;line-height:1.7}.spinner{width:32px;height:32px;border:3px solid rgb(var(--ax-sys-color-border-light-surface));border-top-color:rgb(var(--ax-sys-color-primary-500));border-radius:50%;animation:spin .8s linear infinite;margin-bottom:1rem}@keyframes spin{to{transform:rotate(360deg)}}.list-loading-more{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1rem;text-align:center;color:rgb(var(--ax-sys-color-on-surface));opacity:.7}.messages-container{width:100%;height:100%;overflow-y:auto;overflow-x:hidden}.date-separator{position:sticky;z-index:150;top:0;display:flex;align-items:center;justify-content:center;padding:.5rem 0}.date-text{padding:.25rem .75rem;background:rgb(var(--ax-sys-color-lighter-surface));font-size:.75rem;font-weight:500;border-radius:1rem;width:7rem;display:flex;justify-content:center;align-items:center}.unread-separator{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;padding:0 1rem}.unread-separator-line{flex:1;height:1px;background:rgb(var(--ax-sys-color-primary-500));opacity:.3}.unread-separator-text{font-size:.75rem;font-weight:600;color:rgb(var(--ax-sys-color-primary-500));text-transform:uppercase;letter-spacing:.05em;white-space:nowrap}.message-item{position:relative;display:flex;padding:.5rem 1rem;gap:.5rem;line-height:1rem;align-items:end;transition:background-color .3s ease}.message-highlight{background-color:rgba(var(--ax-sys-color-primary-500),.1);border-radius:.5rem}.fade-slide-in{animation:fadeSlideIn var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes fadeSlideIn{0%{opacity:0;// transform: translateX(20%)}to{opacity:1;// transform: translateX(0)}}.message-own{flex-direction:row-reverse}.message-avatar{flex-shrink:0}.message-content-row{display:flex;flex-direction:row;align-items:flex-end;max-width:70%;min-width:0;flex:0 1 auto;position:relative;column-gap:.25rem}.message-content-row-own{justify-content:flex-end}.message-item:not(.message-own) .message-content-row{justify-content:flex-start}.message-bubble-container{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;max-width:100%;position:relative}.message-own .message-bubble-container{align-items:flex-end}.message-sender{font-size:.75rem;font-weight:600;margin-bottom:.1rem}.message-bubble{position:relative;display:flex;flex-direction:column;padding:.375rem .5rem .1rem;border-radius:1rem;background:rgb(var(--ax-sys-color-lightest-surface));word-wrap:break-word;transition:background-color .3s ease}.reply-preview{padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.reply-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .reply-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .reply-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.reply-preview-line{width:3px;background:currentColor;opacity:.5;border-radius:1.5px;flex-shrink:0}.reply-preview-content{flex:1;min-width:0}.reply-preview-sender{font-size:.75rem;font-weight:600;margin-bottom:.125rem;color:rgb(var(--ax-sys-color-primary-600))}.reply-preview-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.message-own .reply-preview-sender{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .reply-preview-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.forwarded-preview{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;margin-bottom:.1rem;background:rgba(var(--ax-sys-color-primary-500),.08);border-radius:var(--ax-sys-border-radius);border-inline-start:3px solid rgb(var(--ax-sys-color-primary-500));transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.forwarded-preview:hover{background:rgba(var(--ax-sys-color-primary-500),.14);border-inline-start-color:rgb(var(--ax-sys-color-primary-600))}.message-own .forwarded-preview{background:rgba(var(--ax-sys-color-on-primary-surface),.14);border-inline-start:3px solid rgba(var(--ax-sys-color-on-primary-surface),.55)}.message-own .forwarded-preview:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.22);border-inline-start-color:rgba(var(--ax-sys-color-on-primary-surface),.75)}.forwarded-preview i{font-size:.8125rem;flex-shrink:0;color:rgb(var(--ax-sys-color-primary-600))}.forwarded-text{font-size:.8125rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.72;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.message-own .forwarded-preview i{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.95}.message-own .forwarded-text{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.78}.message-bubble-received{border-bottom-left-radius:.125rem}.message-bubble-received:before{content:\"\";display:block;background:rgb(var(--ax-sys-color-lightest-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;left:-.7rem;border-top-left-radius:86%;corner-shape:scoop}.message-bubble-sent{border-bottom-right-radius:.125rem}.message-bubble-sent:after{content:\"\";display:block;background:rgb(var(--ax-sys-color-primary-surface));width:.8rem;height:.8rem;position:absolute;bottom:0;right:-.7rem;border-top-right-radius:86%;corner-shape:scoop}.message-own .message-bubble{background:rgb(var(--ax-sys-color-primary-surface));color:rgb(var(--ax-sys-color-on-primary-surface))}.message-content{font-size:.9375rem;line-height:1.5;white-space:pre-wrap}.message-footer{display:flex;align-items:center;justify-content:flex-end;flex-wrap:wrap;margin-top:.1rem;gap:.25rem;font-size:.6875rem;opacity:.7;letter-spacing:.05rem;-webkit-user-select:none;user-select:none}.message-footer-count{display:inline-flex;align-items:center;gap:.2rem;font-variant-numeric:tabular-nums;font-size:.675rem}.message-footer-count i{font-size:.625rem;opacity:.9}.message-footer-count-value{font-weight:600}.message-footer-split{flex-shrink:0;align-self:center;width:1px;height:.65rem;background:rgb(var(--ax-sys-color-border-light-surface));opacity:.9;margin-inline:.2rem}.message-time{font-variant-numeric:tabular-nums;font-size:.675rem}.edited-indicator{display:inline-flex;align-items:center;gap:.25rem;font-size:.675rem;opacity:.75;padding-inline-start:.35rem;border-inline-start:1px solid rgb(var(--ax-sys-color-border-light-surface))}.status-icon{display:inline-flex;font-size:.75rem}.status-read{color:rgb(var(--ax-sys-color-primary-200))}.status-failed{color:rgb(var(--ax-sys-color-danger-200))}.message-reactions-bubbles{display:flex;flex-wrap:wrap;align-items:center;gap:.2rem}.reaction-bubble{display:inline-flex;align-items:center;justify-content:center;gap:.15rem;min-height:1.375rem;padding:.1rem .35rem;margin:0;background:rgba(var(--ax-sys-color-on-surface),.06);color:rgb(var(--ax-sys-color-on-surface));border:1px solid rgba(var(--ax-sys-color-on-surface),.1);border-radius:.75rem;box-shadow:none;cursor:pointer;transition:background-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),border-color var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-surface),.1);border-color:rgba(var(--ax-sys-color-on-surface),.18)}.reaction-bubble-active{background:rgba(var(--ax-sys-color-primary-500),.12);border-color:rgba(var(--ax-sys-color-primary-500),.45)}.reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-primary-500),.18);border-color:rgba(var(--ax-sys-color-primary-500),.55)}.reaction-emoji{font-size:.8125rem;line-height:1;display:inline-block}.reaction-count{font-size:.6875rem;font-weight:500;font-variant-numeric:tabular-nums;color:rgb(var(--ax-sys-color-on-surface));opacity:.65;line-height:1}.reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-primary-600));opacity:.95;font-weight:600}.message-own .reaction-bubble{background:rgba(var(--ax-sys-color-on-primary-surface),.12);border-color:rgba(var(--ax-sys-color-on-primary-surface),.2);color:rgb(var(--ax-sys-color-on-primary-surface))}.message-own .reaction-bubble:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.2);border-color:rgba(var(--ax-sys-color-on-primary-surface),.35)}.message-own .reaction-bubble-active{background:rgba(var(--ax-sys-color-on-primary-surface),.28);border-color:rgba(var(--ax-sys-color-on-primary-surface),.5)}.message-own .reaction-bubble-active:hover{background:rgba(var(--ax-sys-color-on-primary-surface),.34);border-color:rgba(var(--ax-sys-color-on-primary-surface),.6)}.message-own .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:.8}.message-own .reaction-bubble-active .reaction-count{color:rgb(var(--ax-sys-color-on-primary-surface));opacity:1}.message-reactions-container{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:.2rem;margin-top:.25rem;justify-content:flex-start}.message-own .message-reactions-container{justify-content:flex-end}.add-reaction-button.add-reaction-outside{display:none;position:absolute;top:50%;inset-inline-end:-1.5rem;transform:translateY(-50%);align-items:center;justify-content:center;box-sizing:border-box;width:1.25rem;height:1.25rem;padding:0;margin:0;border-radius:50%;cursor:pointer;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));box-shadow:0 1px 2px #0000000f}.add-reaction-button{padding-inline-start:.05rem}.message-content-row-own .add-reaction-button.add-reaction-outside{inset-inline-start:-1.5rem;inset-inline-end:auto}.message-item:hover .add-reaction-button.add-reaction-outside,.add-reaction-button.add-reaction-outside.add-reaction-visible{display:inline-flex}.add-reaction-button.add-reaction-outside:hover,.add-reaction-button.add-reaction-outside.add-reaction-visible{border-color:rgb(var(--ax-sys-color-primary-500))}.add-reaction-button.add-reaction-outside i{font-size:.625rem;color:rgb(var(--ax-sys-color-on-surface));opacity:.8}.reaction-picker-popup{position:fixed;background:rgb(var(--ax-sys-color-lightest-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:.5rem;z-index:100;min-width:auto;width:max-content;max-width:min(200px,92vw);box-shadow:0 4px 16px #0000001a;transform:translateY(-100%);margin-top:-.35rem;overflow:hidden}.reaction-picker-header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;padding:.3rem .4rem .3rem .55rem;border-bottom:1px solid rgb(var(--ax-sys-color-border-light-surface));min-height:0}.picker-title{font-size:.6875rem;font-weight:600;letter-spacing:.02em;color:rgb(var(--ax-sys-color-on-surface));opacity:.85}.picker-close{display:flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:transparent;border:none;border-radius:.25rem;cursor:pointer;font-size:.75rem;color:rgb(var(--ax-sys-color-on-surface) / .55);transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.picker-close:hover{background:rgb(var(--ax-sys-color-danger-500) / .1);color:rgb(var(--ax-sys-color-danger-500))}.reaction-bubble:focus-visible,.add-reaction-button:focus-visible,.picker-close:focus-visible,.reaction-picker-emoji:focus-visible,.action-trigger:focus-visible,.scroll-to-bottom:focus-visible{outline:2px solid rgb(var(--ax-sys-color-primary-500));outline-offset:2px}.reaction-picker-emojis{display:grid;grid-template-columns:repeat(6,1fr);gap:.08rem;padding:.3rem .35rem .35rem}.reaction-picker-emoji{width:1.5rem;height:1.5rem;padding:0;background:transparent;border:1px solid transparent;border-radius:.35rem;font-size:.95rem;line-height:1;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);font-family:\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\",\"Apple Color Emoji\",Twemoji Mozilla,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.reaction-picker-emoji:hover{// transform: scale(1.15);background:rgb(var(--ax-sys-color-lighter-surface))}.reaction-picker-emoji-active{background:rgb(var(--ax-sys-color-surface))}.reaction-picker-emoji-active:hover{background:rgb(var(--ax-sys-color-primary-500) / .25)}.message-actions{padding-bottom:1.5rem;opacity:0;transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:10}.message-item:hover .message-actions{opacity:1}.action-trigger{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-surface));border:1px solid rgb(var(--ax-sys-color-border-light-surface));border-radius:var(--ax-sys-border-radius);font-size:.875rem;cursor:pointer;transition:all var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}.action-trigger:hover{background:rgb(var(--ax-sys-color-light-surface));// transform: scale(1.05)}.shortcut{font-size:.6875rem;opacity:.7}.scroll-to-bottom{position:absolute;bottom:1rem;right:1rem;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:rgb(var(--ax-sys-color-primary-500));color:rgb(var(--ax-sys-color-on-primary-surface));border:none;border-radius:50%;font-size:1.5rem;cursor:pointer;transition:transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function);z-index:999}.scroll-to-bottom:hover{// transform: scale(1.1)}.slide-in{animation:slideInFromBottom var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}@keyframes slideInFromBottom{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.slide-out{opacity:0;transform:translateY(100%);transition:opacity var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function),transform var(--ax-sys-transition-duration) var(--ax-sys-transition-timing-function)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "directive", type: i1$5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "shape", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXContextMenuComponent, selector: "ax-context-menu", inputs: ["orientation", "openOn", "closeOn", "items", "target"], outputs: ["onItemClick", "onOpening"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: AXImageComponent, selector: "ax-image", inputs: ["width", "height", "overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "component", type: AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "component", type: AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXDateTimeModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i6.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "repositionOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "directive", type: AXInfiniteScrollDirective, selector: "[axInfiniteScroll]", inputs: ["threshold", "edge"], outputs: ["scrollThreshold"] }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4$1.AXFormatPipe, name: "format" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
16105
16105
|
}
|
|
16106
16106
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImport: i0, type: AXMessageListComponent, decorators: [{
|
|
16107
16107
|
type: Component,
|
|
@@ -17627,9 +17627,9 @@ function createProviders(options, includeServices) {
|
|
|
17627
17627
|
if (!userApi || !conversationApi || !messageApi) {
|
|
17628
17628
|
throw new Error(`Missing required API implementations: userApi, conversationApi, messageApi.
|
|
17629
17629
|
Example: provideConversation({
|
|
17630
|
-
userApi:
|
|
17631
|
-
conversationApi:
|
|
17632
|
-
messageApi:
|
|
17630
|
+
userApi: AXConversationIndexedDbUserApi,
|
|
17631
|
+
conversationApi: AXConversationIndexedDbConversationApi,
|
|
17632
|
+
messageApi: AXConversationIndexedDbMessageApi,
|
|
17633
17633
|
})
|
|
17634
17634
|
Import from @acorex/components/conversation2`);
|
|
17635
17635
|
}
|
|
@@ -17731,19 +17731,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.3", ngImpor
|
|
|
17731
17731
|
* @example
|
|
17732
17732
|
* ```typescript
|
|
17733
17733
|
* import {
|
|
17734
|
-
*
|
|
17735
|
-
*
|
|
17736
|
-
*
|
|
17737
|
-
*
|
|
17734
|
+
* AXConversationIndexedDbUserApi,
|
|
17735
|
+
* AXConversationIndexedDbConversationApi,
|
|
17736
|
+
* AXConversationIndexedDbMessageApi,
|
|
17737
|
+
* AXConversationIndexedDbRealtimeApi
|
|
17738
17738
|
* } from '@acorex/components/conversation2';
|
|
17739
17739
|
*
|
|
17740
17740
|
* export const appConfig: ApplicationConfig = {
|
|
17741
17741
|
* providers: [
|
|
17742
17742
|
* provideConversation({
|
|
17743
|
-
* userApi:
|
|
17744
|
-
* conversationApi:
|
|
17745
|
-
* messageApi:
|
|
17746
|
-
* realtimeApi:
|
|
17743
|
+
* userApi: AXConversationIndexedDbUserApi,
|
|
17744
|
+
* conversationApi: AXConversationIndexedDbConversationApi,
|
|
17745
|
+
* messageApi: AXConversationIndexedDbMessageApi,
|
|
17746
|
+
* realtimeApi: AXConversationIndexedDbRealtimeApi,
|
|
17747
17747
|
* config: { },
|
|
17748
17748
|
* registry: { messageActions: [myCustomAction] }
|
|
17749
17749
|
* })
|
|
@@ -18059,5 +18059,5 @@ function getErrorMessage(code, params) {
|
|
|
18059
18059
|
* Generated bundle index. Do not edit.
|
|
18060
18060
|
*/
|
|
18061
18061
|
|
|
18062
|
-
export {
|
|
18062
|
+
export { AXAudioInfoBarBannerComponent, AXAudioPickerComponent, AXAudioRendererComponent, AXBaseRegistry, AXComposerActionRegistry, AXComposerComponent, AXComposerPopupComponent, AXComposerService, AXComposerTabRegistry, AXConversation2Module, AXConversationAiApiKey, AXConversationAiResponderService, AXConversationApi, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationService, AXConversationSharedStorage, AXConversationStoreService, AXConversationTabRegistry, AXEmojiTabComponent, AXErrorHandlerService, AXFallbackRendererComponent, AXFilePickerComponent, AXFileRendererComponent, AXFileUploadService, AXForwardMessageDialogComponent, AXImagePickerComponent, AXImageRendererComponent, AXInfiniteScrollDirective, AXInfoBarActionRegistry, AXInfoBarComponent, AXInfoBarSearchComponent, AXInfoBarService, AXLocationPickerComponent, AXLocationRendererComponent, AXMessageActionRegistry, AXMessageApi, AXMessageListComponent, AXMessageListService, AXMessageRendererRegistry, AXNewConversationDialogComponent, AXPickerFooterComponent, AXPickerHeaderComponent, AXRealtimeApi, AXRegistryService, AXSidebarComponent, AXSidebarService, AXStickerRendererComponent, AXStickerTabComponent, AXSystemRendererComponent, AXTextRendererComponent, AXUserApi, AXVideoInfoBarBannerComponent, AXVideoPickerComponent, AXVideoRendererComponent, AXVoiceInfoBarBannerComponent, AXVoiceRecorderComponent, AXVoiceRendererComponent, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_INFO_ACTION, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_COPY_ACTION, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, CONNECTION_ERRORS, CONVERSATION_CONFIG, CONVERSATION_ERRORS, DEFAULT_COMPOSER_ACTIONS, DEFAULT_COMPOSER_TABS, DEFAULT_CONVERSATION_ITEM_ACTIONS, DEFAULT_CONVERSATION_TABS, DEFAULT_INFO_BAR_ACTIONS, DEFAULT_MESSAGE_ACTIONS, DEFAULT_MESSAGE_RENDERERS, ERROR_HANDLER_CONFIG, ERROR_MESSAGES, FILE_ERRORS, LOCATION_ERRORS, MESSAGE_ERRORS, PERMISSION_ERRORS, REGISTRY_CONFIG, URL_ERRORS, USER_ERRORS, axConversationIndexedDbStorage, conversationSharedStorage, formatErrorMessage, getDefaultConversationItemActions, getErrorMessage, mergeWithDefaults, provideConversation, sanitizeInput, validateConversationId, validateEmail, validateFile, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds };
|
|
18063
18063
|
//# sourceMappingURL=acorex-components-conversation2.mjs.map
|