valtech-components 4.0.226 → 4.0.228
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/esm2022/lib/components/molecules/chat-input/chat-input.component.mjs +9 -1
- package/esm2022/lib/components/molecules/message-bubble/message-bubble.component.mjs +191 -259
- package/esm2022/lib/components/molecules/typing-indicator/typing-indicator.component.mjs +12 -11
- package/esm2022/lib/components/organisms/chat-window/chat-window.component.mjs +203 -216
- package/esm2022/lib/components/organisms/thread-panel/thread-panel.component.mjs +10 -10
- package/esm2022/lib/services/chat/conversation.service.mjs +11 -23
- package/esm2022/lib/services/chat/types.mjs +1 -1
- package/esm2022/lib/services/i18n/default-content.mjs +1 -5
- package/esm2022/lib/shared/utils/datetime.mjs +1 -54
- package/esm2022/lib/version.mjs +2 -2
- package/esm2022/public-api.mjs +2 -4
- package/fesm2022/valtech-components.mjs +425 -898
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/molecules/message-bubble/message-bubble.component.d.ts +32 -33
- package/lib/components/molecules/typing-indicator/typing-indicator.component.d.ts +4 -5
- package/lib/components/organisms/chat-window/chat-window.component.d.ts +56 -52
- package/lib/services/chat/conversation.service.d.ts +2 -7
- package/lib/services/chat/types.d.ts +52 -86
- package/lib/shared/utils/datetime.d.ts +0 -19
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -3
- package/src/lib/services/firebase/firebase-messaging-sw.js +125 -70
- package/esm2022/lib/components/molecules/chat-composer/chat-composer.component.mjs +0 -238
- package/esm2022/lib/components/molecules/conversation-list-item/conversation-list-item.component.mjs +0 -108
- package/lib/components/molecules/chat-composer/chat-composer.component.d.ts +0 -46
- package/lib/components/molecules/conversation-list-item/conversation-list-item.component.d.ts +0 -30
|
@@ -1,90 +1,145 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Firebase Messaging Service Worker
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* la
|
|
4
|
+
* Service Worker estático para Firebase Cloud Messaging.
|
|
5
|
+
* Carga la configuración dinámicamente desde /firebase-config.js.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* CONFIGURACIÓN:
|
|
8
|
+
* 1. Crea firebase.config.json con tu configuración de Firebase
|
|
9
|
+
* 2. Ejecuta: npm run generate:firebase-config
|
|
10
|
+
* Esto genera /firebase-config.js con: self.FIREBASE_CONFIG = {...}
|
|
11
|
+
* 3. Agrega este SW y firebase-config.js a los assets de angular.json
|
|
10
12
|
*
|
|
11
|
-
*
|
|
12
|
-
* generado en build-time por `npx valtech-firebase-config`. Maneja:
|
|
13
|
-
* - mensajes en background (FCM) → muestra la notificacion del sistema.
|
|
14
|
-
* - click en la notificacion → enfoca/abre la app y postMessage NOTIFICATION_CLICK
|
|
15
|
-
* al cliente (lo consume MessagingService.onNotificationClick()).
|
|
13
|
+
* Ver README.md para documentación completa.
|
|
16
14
|
*/
|
|
17
15
|
|
|
18
|
-
|
|
16
|
+
// Importar Firebase scripts
|
|
17
|
+
importScripts('https://www.gstatic.com/firebasejs/10.7.0/firebase-app-compat.js');
|
|
18
|
+
importScripts('https://www.gstatic.com/firebasejs/10.7.0/firebase-messaging-compat.js');
|
|
19
19
|
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
'https://www.gstatic.com/firebasejs/10.14.1/firebase-app-compat.js'
|
|
23
|
-
);
|
|
24
|
-
importScripts(
|
|
25
|
-
'https://www.gstatic.com/firebasejs/10.14.1/firebase-messaging-compat.js'
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
// Config inyectada en build-time (self.FIREBASE_CONFIG).
|
|
20
|
+
// Importar configuración desde archivo externo (generado en build)
|
|
21
|
+
// Este archivo define: self.FIREBASE_CONFIG = { ... }
|
|
29
22
|
try {
|
|
30
23
|
importScripts('/firebase-config.js');
|
|
31
|
-
} catch (
|
|
32
|
-
|
|
33
|
-
// no debe romper el registro de la app.
|
|
34
|
-
console.error('[firebase-messaging-sw] no se pudo cargar /firebase-config.js', err);
|
|
24
|
+
} catch (e) {
|
|
25
|
+
console.error('[SW] No se pudo cargar firebase-config.js:', e);
|
|
35
26
|
}
|
|
36
27
|
|
|
37
|
-
|
|
28
|
+
// Verificar que la configuración existe
|
|
29
|
+
if (!self.FIREBASE_CONFIG) {
|
|
30
|
+
console.error('[SW] FIREBASE_CONFIG no está definido.');
|
|
31
|
+
console.error('[SW] Ejecuta: npm run generate:firebase-config');
|
|
32
|
+
} else {
|
|
33
|
+
// Inicializar Firebase
|
|
38
34
|
firebase.initializeApp(self.FIREBASE_CONFIG);
|
|
35
|
+
|
|
36
|
+
// Obtener instancia de messaging
|
|
39
37
|
const messaging = firebase.messaging();
|
|
40
38
|
|
|
41
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Handler para mensajes en background.
|
|
41
|
+
*/
|
|
42
42
|
messaging.onBackgroundMessage((payload) => {
|
|
43
|
-
|
|
43
|
+
console.log('[SW] Mensaje recibido en background:', payload);
|
|
44
|
+
|
|
45
|
+
// Web push usa mensajes data-only (sin bloque `notification`) para que el
|
|
46
|
+
// navegador NO auto-muestre una notificación duplicada — el SW es el único
|
|
47
|
+
// que la pinta. Title/body/icon llegan dentro de `data`. Se mantiene el
|
|
48
|
+
// fallback a `payload.notification` por compatibilidad con mensajes
|
|
49
|
+
// legacy o nativos que sí traen el bloque.
|
|
44
50
|
const data = payload.data || {};
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
const notificationTitle =
|
|
52
|
+
payload.notification?.title || data.title || 'Nueva notificación';
|
|
53
|
+
const notificationBody = payload.notification?.body || data.body || '';
|
|
54
|
+
const notificationIcon =
|
|
55
|
+
payload.notification?.icon || data.icon || '/assets/icon/favicon.ico';
|
|
56
|
+
|
|
57
|
+
const notificationOptions = {
|
|
58
|
+
body: notificationBody,
|
|
59
|
+
icon: notificationIcon,
|
|
60
|
+
image: payload.notification?.image,
|
|
61
|
+
badge: '/assets/icon/badge.png',
|
|
62
|
+
tag: payload.messageId || data.messageId || 'default',
|
|
63
|
+
data: {
|
|
64
|
+
...data,
|
|
65
|
+
messageId: payload.messageId || data.messageId,
|
|
66
|
+
title: notificationTitle,
|
|
67
|
+
body: notificationBody,
|
|
68
|
+
},
|
|
69
|
+
vibrate: [200, 100, 200],
|
|
70
|
+
requireInteraction: data.require_interaction === 'true',
|
|
51
71
|
};
|
|
52
|
-
|
|
72
|
+
|
|
73
|
+
return self.registration.showNotification(notificationTitle, notificationOptions);
|
|
53
74
|
});
|
|
54
|
-
}
|
|
55
75
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Handler para clicks en notificaciones.
|
|
78
|
+
*/
|
|
79
|
+
self.addEventListener('notificationclick', (event) => {
|
|
80
|
+
console.log('[SW] Click en notificación:', event);
|
|
81
|
+
event.notification.close();
|
|
82
|
+
|
|
83
|
+
const data = event.notification.data || {};
|
|
84
|
+
let targetUrl = '/';
|
|
85
|
+
|
|
86
|
+
if (data.route) {
|
|
87
|
+
targetUrl = data.route;
|
|
88
|
+
} else if (data.url) {
|
|
89
|
+
targetUrl = data.url;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (data.query_params) {
|
|
93
|
+
const separator = targetUrl.includes('?') ? '&' : '?';
|
|
94
|
+
targetUrl += separator + data.query_params;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const notificationPayload = {
|
|
98
|
+
type: 'NOTIFICATION_CLICK',
|
|
99
|
+
notification: {
|
|
100
|
+
title: data.title,
|
|
101
|
+
body: data.body,
|
|
102
|
+
data: data,
|
|
103
|
+
messageId: data.messageId,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
event.waitUntil(
|
|
108
|
+
clients
|
|
109
|
+
.matchAll({ type: 'window', includeUncontrolled: true })
|
|
110
|
+
.then((clientList) => {
|
|
111
|
+
// Siempre enviar postMessage para que la app pueda reaccionar
|
|
112
|
+
for (const client of clientList) {
|
|
113
|
+
client.postMessage(notificationPayload);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Navegar si hay route o url
|
|
117
|
+
if (targetUrl !== '/') {
|
|
118
|
+
for (const client of clientList) {
|
|
119
|
+
if ('navigate' in client) {
|
|
120
|
+
return client.navigate(targetUrl).then((c) => c?.focus());
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Si no hay cliente abierto, abrir nueva ventana
|
|
124
|
+
if (clients.openWindow) {
|
|
125
|
+
return clients.openWindow(targetUrl);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Solo hacer focus si no hay navegación
|
|
130
|
+
for (const client of clientList) {
|
|
131
|
+
if ('focus' in client) {
|
|
132
|
+
return client.focus();
|
|
133
|
+
}
|
|
81
134
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
)
|
|
90
|
-
|
|
135
|
+
if (clients.openWindow) {
|
|
136
|
+
return clients.openWindow('/');
|
|
137
|
+
}
|
|
138
|
+
})
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
self.addEventListener('notificationclose', (event) => {
|
|
143
|
+
console.log('[SW] Notificación cerrada:', event.notification.tag);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { Component, computed, inject, input, output, signal } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { IonTextarea, IonIcon } from '@ionic/angular/standalone';
|
|
4
|
-
import { addIcons } from 'ionicons';
|
|
5
|
-
import { addOutline, closeOutline, happyOutline, micOutline, arrowUpOutline } from 'ionicons/icons';
|
|
6
|
-
import { I18nService } from '../../../services/i18n';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
addIcons({ addOutline, closeOutline, happyOutline, micOutline, arrowUpOutline });
|
|
9
|
-
const CHAT_COMPOSER_I18N = {
|
|
10
|
-
es: {
|
|
11
|
-
placeholder: 'Escribe un mensaje',
|
|
12
|
-
send: 'Enviar',
|
|
13
|
-
attach: 'Adjuntar',
|
|
14
|
-
emoji: 'Emoji',
|
|
15
|
-
voice: 'Mensaje de voz',
|
|
16
|
-
replyingTo: 'Respondiendo a',
|
|
17
|
-
cancel: 'Cancelar',
|
|
18
|
-
},
|
|
19
|
-
en: {
|
|
20
|
-
placeholder: 'Write a message',
|
|
21
|
-
send: 'Send',
|
|
22
|
-
attach: 'Attach',
|
|
23
|
-
emoji: 'Emoji',
|
|
24
|
-
voice: 'Voice message',
|
|
25
|
-
replyingTo: 'Replying to',
|
|
26
|
-
cancel: 'Cancel',
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
const QUICK_EMOJIS = ['👍', '❤️', '😂', '🎉', '🙏', '🔥', '😮', '😢'];
|
|
30
|
-
/**
|
|
31
|
-
* val-chat-composer — barra de redacción de chat moderna (signal inputs).
|
|
32
|
-
*
|
|
33
|
-
* Pill con: adjuntar (+), textarea auto-grow, emoji (fila rápida) y mic/enviar
|
|
34
|
-
* (mic cuando está vacío, enviar cuando hay texto — patrón WhatsApp/Telegram).
|
|
35
|
-
* Muestra una barra de contexto "respondiendo a" cuando `replyingTo` está seteado.
|
|
36
|
-
* `typing` se emite con debounce (máx. 1 vez cada 2s) para no spamear writes.
|
|
37
|
-
*/
|
|
38
|
-
export class ChatComposerComponent {
|
|
39
|
-
constructor() {
|
|
40
|
-
this.i18n = inject(I18nService);
|
|
41
|
-
this.placeholder = input('');
|
|
42
|
-
this.disabled = input(false);
|
|
43
|
-
this.maxLength = input(2000);
|
|
44
|
-
this.replyingTo = input(null);
|
|
45
|
-
this.showAttach = input(true);
|
|
46
|
-
this.showEmoji = input(true);
|
|
47
|
-
this.showMic = input(true);
|
|
48
|
-
this.send = output();
|
|
49
|
-
this.typing = output();
|
|
50
|
-
this.attach = output();
|
|
51
|
-
this.voice = output();
|
|
52
|
-
this.cancelReply = output();
|
|
53
|
-
this.body = signal('');
|
|
54
|
-
this.emojiOpen = signal(false);
|
|
55
|
-
this.quickEmojis = QUICK_EMOJIS;
|
|
56
|
-
this.lastTypingEmit = 0;
|
|
57
|
-
this.canSend = computed(() => {
|
|
58
|
-
const t = this.body().trim();
|
|
59
|
-
return t.length > 0 && t.length <= this.maxLength() && !this.disabled();
|
|
60
|
-
});
|
|
61
|
-
this.placeholderText = computed(() => {
|
|
62
|
-
this.i18n.lang();
|
|
63
|
-
return this.placeholder() || this.i18n.t('placeholder', 'ChatComposer');
|
|
64
|
-
});
|
|
65
|
-
this.i18n.registerDefaults('ChatComposer', CHAT_COMPOSER_I18N);
|
|
66
|
-
}
|
|
67
|
-
onInput(event) {
|
|
68
|
-
const target = event.target;
|
|
69
|
-
this.body.set(target.value ?? '');
|
|
70
|
-
this.emitTypingDebounced();
|
|
71
|
-
}
|
|
72
|
-
onKeydown(event) {
|
|
73
|
-
if (event.key === 'Enter' && !event.shiftKey) {
|
|
74
|
-
event.preventDefault();
|
|
75
|
-
this.onSend();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
onSend() {
|
|
79
|
-
const trimmed = this.body().trim();
|
|
80
|
-
if (!trimmed || trimmed.length > this.maxLength())
|
|
81
|
-
return;
|
|
82
|
-
this.send.emit(trimmed);
|
|
83
|
-
this.body.set('');
|
|
84
|
-
this.emojiOpen.set(false);
|
|
85
|
-
}
|
|
86
|
-
toggleEmoji() {
|
|
87
|
-
this.emojiOpen.update(v => !v);
|
|
88
|
-
}
|
|
89
|
-
insertEmoji(emoji) {
|
|
90
|
-
this.body.update(v => v + emoji);
|
|
91
|
-
}
|
|
92
|
-
onFile(event) {
|
|
93
|
-
const input = event.target;
|
|
94
|
-
const file = input.files?.[0];
|
|
95
|
-
if (file)
|
|
96
|
-
this.attach.emit(file);
|
|
97
|
-
input.value = '';
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Emite typing como máximo 1 vez cada 2s. No usa Date.now() directo en plantillas
|
|
101
|
-
* de workflow; aquí estamos en runtime de navegador, performance.now es seguro.
|
|
102
|
-
*/
|
|
103
|
-
emitTypingDebounced() {
|
|
104
|
-
const now = performance.now();
|
|
105
|
-
if (now - this.lastTypingEmit > 2000) {
|
|
106
|
-
this.lastTypingEmit = now;
|
|
107
|
-
this.typing.emit();
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
t(key) {
|
|
111
|
-
return this.i18n.t(key, 'ChatComposer');
|
|
112
|
-
}
|
|
113
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComposerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
114
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatComposerComponent, isStandalone: true, selector: "val-chat-composer", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, replyingTo: { classPropertyName: "replyingTo", publicName: "replyingTo", isSignal: true, isRequired: false, transformFunction: null }, showAttach: { classPropertyName: "showAttach", publicName: "showAttach", isSignal: true, isRequired: false, transformFunction: null }, showEmoji: { classPropertyName: "showEmoji", publicName: "showEmoji", isSignal: true, isRequired: false, transformFunction: null }, showMic: { classPropertyName: "showMic", publicName: "showMic", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { send: "send", typing: "typing", attach: "attach", voice: "voice", cancelReply: "cancelReply" }, ngImport: i0, template: `
|
|
115
|
-
<div class="composer">
|
|
116
|
-
@if (replyingTo()) {
|
|
117
|
-
<div class="reply-bar">
|
|
118
|
-
<div class="reply-content">
|
|
119
|
-
<span class="reply-name">{{ replyingTo()!.senderName }}</span>
|
|
120
|
-
<span class="reply-body">{{ replyingTo()!.body }}</span>
|
|
121
|
-
</div>
|
|
122
|
-
<button class="icon-btn" [attr.aria-label]="t('cancel')" (click)="cancelReply.emit()">
|
|
123
|
-
<ion-icon name="close-outline" aria-hidden="true" />
|
|
124
|
-
</button>
|
|
125
|
-
</div>
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
@if (emojiOpen()) {
|
|
129
|
-
<div class="emoji-row">
|
|
130
|
-
@for (e of quickEmojis; track e) {
|
|
131
|
-
<button class="emoji" (click)="insertEmoji(e)">{{ e }}</button>
|
|
132
|
-
}
|
|
133
|
-
</div>
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
<div class="pill">
|
|
137
|
-
@if (showAttach()) {
|
|
138
|
-
<label class="icon-btn" [attr.aria-label]="t('attach')">
|
|
139
|
-
<ion-icon name="add-outline" aria-hidden="true" />
|
|
140
|
-
<input type="file" hidden (change)="onFile($event)" accept="image/*,application/pdf" />
|
|
141
|
-
</label>
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
<ion-textarea
|
|
145
|
-
class="field"
|
|
146
|
-
[placeholder]="placeholderText()"
|
|
147
|
-
[disabled]="disabled()"
|
|
148
|
-
[maxlength]="maxLength()"
|
|
149
|
-
[autoGrow]="true"
|
|
150
|
-
[rows]="1"
|
|
151
|
-
[value]="body()"
|
|
152
|
-
(ionInput)="onInput($event)"
|
|
153
|
-
(keydown)="onKeydown($event)"
|
|
154
|
-
></ion-textarea>
|
|
155
|
-
|
|
156
|
-
@if (showEmoji()) {
|
|
157
|
-
<button class="icon-btn" [class.active]="emojiOpen()" [attr.aria-label]="t('emoji')" (click)="toggleEmoji()">
|
|
158
|
-
<ion-icon name="happy-outline" aria-hidden="true" />
|
|
159
|
-
</button>
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
@if (canSend()) {
|
|
163
|
-
<button class="send-btn" [attr.aria-label]="t('send')" (click)="onSend()">
|
|
164
|
-
<ion-icon name="arrow-up-outline" aria-hidden="true" />
|
|
165
|
-
</button>
|
|
166
|
-
} @else if (showMic()) {
|
|
167
|
-
<button class="icon-btn mic" [attr.aria-label]="t('voice')" (click)="voice.emit()">
|
|
168
|
-
<ion-icon name="mic-outline" aria-hidden="true" />
|
|
169
|
-
</button>
|
|
170
|
-
}
|
|
171
|
-
</div>
|
|
172
|
-
</div>
|
|
173
|
-
`, isInline: true, styles: [":host{display:block}.composer{display:flex;flex-direction:column;gap:6px;padding:8px 10px calc(8px + env(safe-area-inset-bottom,0px));background:var(--ion-background-color, #fff);border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}.reply-bar{display:flex;align-items:center;gap:8px;padding:6px 10px;border-left:3px solid var(--ion-color-primary);border-radius:8px;background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.reply-content{display:flex;flex-direction:column;flex:1;min-width:0;font-size:.8125rem}.reply-name{font-weight:700;color:var(--ion-color-primary)}.reply-body{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ion-color-medium, #92949c)}.emoji-row{display:flex;gap:4px;flex-wrap:wrap}.emoji{border:none;background:var(--ion-color-step-100, rgba(127, 127, 127, .1));border-radius:10px;padding:4px 8px;font-size:1.25rem;cursor:pointer}.pill{display:flex;align-items:flex-end;gap:4px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:24px;padding:2px 6px}.field{flex:1;--background: transparent;--padding-start: 6px;--padding-end: 6px;--padding-top: 8px;--padding-bottom: 8px;margin:0;max-height:120px;font-size:.9375rem}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;flex-shrink:0;border:none;border-radius:50%;background:transparent;color:var(--ion-color-medium, #92949c);cursor:pointer;font-size:1.375rem}.icon-btn:hover,.icon-btn.active,.icon-btn.mic:hover{color:var(--ion-color-primary)}.send-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;flex-shrink:0;border:none;border-radius:50%;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);cursor:pointer;font-size:1.25rem;transition:transform .1s ease}.send-btn:active{transform:scale(.92)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
174
|
-
}
|
|
175
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComposerComponent, decorators: [{
|
|
176
|
-
type: Component,
|
|
177
|
-
args: [{ selector: 'val-chat-composer', standalone: true, imports: [CommonModule, IonTextarea, IonIcon], template: `
|
|
178
|
-
<div class="composer">
|
|
179
|
-
@if (replyingTo()) {
|
|
180
|
-
<div class="reply-bar">
|
|
181
|
-
<div class="reply-content">
|
|
182
|
-
<span class="reply-name">{{ replyingTo()!.senderName }}</span>
|
|
183
|
-
<span class="reply-body">{{ replyingTo()!.body }}</span>
|
|
184
|
-
</div>
|
|
185
|
-
<button class="icon-btn" [attr.aria-label]="t('cancel')" (click)="cancelReply.emit()">
|
|
186
|
-
<ion-icon name="close-outline" aria-hidden="true" />
|
|
187
|
-
</button>
|
|
188
|
-
</div>
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
@if (emojiOpen()) {
|
|
192
|
-
<div class="emoji-row">
|
|
193
|
-
@for (e of quickEmojis; track e) {
|
|
194
|
-
<button class="emoji" (click)="insertEmoji(e)">{{ e }}</button>
|
|
195
|
-
}
|
|
196
|
-
</div>
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
<div class="pill">
|
|
200
|
-
@if (showAttach()) {
|
|
201
|
-
<label class="icon-btn" [attr.aria-label]="t('attach')">
|
|
202
|
-
<ion-icon name="add-outline" aria-hidden="true" />
|
|
203
|
-
<input type="file" hidden (change)="onFile($event)" accept="image/*,application/pdf" />
|
|
204
|
-
</label>
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
<ion-textarea
|
|
208
|
-
class="field"
|
|
209
|
-
[placeholder]="placeholderText()"
|
|
210
|
-
[disabled]="disabled()"
|
|
211
|
-
[maxlength]="maxLength()"
|
|
212
|
-
[autoGrow]="true"
|
|
213
|
-
[rows]="1"
|
|
214
|
-
[value]="body()"
|
|
215
|
-
(ionInput)="onInput($event)"
|
|
216
|
-
(keydown)="onKeydown($event)"
|
|
217
|
-
></ion-textarea>
|
|
218
|
-
|
|
219
|
-
@if (showEmoji()) {
|
|
220
|
-
<button class="icon-btn" [class.active]="emojiOpen()" [attr.aria-label]="t('emoji')" (click)="toggleEmoji()">
|
|
221
|
-
<ion-icon name="happy-outline" aria-hidden="true" />
|
|
222
|
-
</button>
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
@if (canSend()) {
|
|
226
|
-
<button class="send-btn" [attr.aria-label]="t('send')" (click)="onSend()">
|
|
227
|
-
<ion-icon name="arrow-up-outline" aria-hidden="true" />
|
|
228
|
-
</button>
|
|
229
|
-
} @else if (showMic()) {
|
|
230
|
-
<button class="icon-btn mic" [attr.aria-label]="t('voice')" (click)="voice.emit()">
|
|
231
|
-
<ion-icon name="mic-outline" aria-hidden="true" />
|
|
232
|
-
</button>
|
|
233
|
-
}
|
|
234
|
-
</div>
|
|
235
|
-
</div>
|
|
236
|
-
`, styles: [":host{display:block}.composer{display:flex;flex-direction:column;gap:6px;padding:8px 10px calc(8px + env(safe-area-inset-bottom,0px));background:var(--ion-background-color, #fff);border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}.reply-bar{display:flex;align-items:center;gap:8px;padding:6px 10px;border-left:3px solid var(--ion-color-primary);border-radius:8px;background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.reply-content{display:flex;flex-direction:column;flex:1;min-width:0;font-size:.8125rem}.reply-name{font-weight:700;color:var(--ion-color-primary)}.reply-body{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ion-color-medium, #92949c)}.emoji-row{display:flex;gap:4px;flex-wrap:wrap}.emoji{border:none;background:var(--ion-color-step-100, rgba(127, 127, 127, .1));border-radius:10px;padding:4px 8px;font-size:1.25rem;cursor:pointer}.pill{display:flex;align-items:flex-end;gap:4px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:24px;padding:2px 6px}.field{flex:1;--background: transparent;--padding-start: 6px;--padding-end: 6px;--padding-top: 8px;--padding-bottom: 8px;margin:0;max-height:120px;font-size:.9375rem}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;flex-shrink:0;border:none;border-radius:50%;background:transparent;color:var(--ion-color-medium, #92949c);cursor:pointer;font-size:1.375rem}.icon-btn:hover,.icon-btn.active,.icon-btn.mic:hover{color:var(--ion-color-primary)}.send-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;flex-shrink:0;border:none;border-radius:50%;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);cursor:pointer;font-size:1.25rem;transition:transform .1s ease}.send-btn:active{transform:scale(.92)}\n"] }]
|
|
237
|
-
}], ctorParameters: () => [] });
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1jb21wb3Nlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NoYXQtY29tcG9zZXIvY2hhdC1jb21wb3Nlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBR3JELFFBQVEsQ0FBQyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO0FBRWpGLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsRUFBRSxFQUFFO1FBQ0YsV0FBVyxFQUFFLG9CQUFvQjtRQUNqQyxJQUFJLEVBQUUsUUFBUTtRQUNkLE1BQU0sRUFBRSxVQUFVO1FBQ2xCLEtBQUssRUFBRSxPQUFPO1FBQ2QsS0FBSyxFQUFFLGdCQUFnQjtRQUN2QixVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLE1BQU0sRUFBRSxVQUFVO0tBQ25CO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsV0FBVyxFQUFFLGlCQUFpQjtRQUM5QixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRSxRQUFR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Q0gsQ0FBQztJQUVELENBQUMsQ0FBQyxHQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDMUMsQ0FBQzsrR0F2RlUscUJBQXFCO21HQUFyQixxQkFBcUIsbW1DQTlLdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRULHc2REE1RFMsWUFBWSwrQkFBRSxXQUFXLGlhQUFFLE9BQU87OzRGQStLakMscUJBQXFCO2tCQWxMakMsU0FBUzsrQkFDRSxtQkFBbUIsY0FDakIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsWUFDbkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJb25UZXh0YXJlYSwgSW9uSWNvbiB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBhZGRPdXRsaW5lLCBjbG9zZU91dGxpbmUsIGhhcHB5T3V0bGluZSwgbWljT3V0bGluZSwgYXJyb3dVcE91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBNZXNzYWdlUmVwbHlUbyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoYXQvdHlwZXMnO1xuXG5hZGRJY29ucyh7IGFkZE91dGxpbmUsIGNsb3NlT3V0bGluZSwgaGFwcHlPdXRsaW5lLCBtaWNPdXRsaW5lLCBhcnJvd1VwT3V0bGluZSB9KTtcblxuY29uc3QgQ0hBVF9DT01QT1NFUl9JMThOID0ge1xuICBlczoge1xuICAgIHBsYWNlaG9sZGVyOiAnRXNjcmliZSB1biBtZW5zYWplJyxcbiAgICBzZW5kOiAnRW52aWFyJyxcbiAgICBhdHRhY2g6ICdBZGp1bnRhcicsXG4gICAgZW1vamk6ICdFbW9qaScsXG4gICAgdm9pY2U6ICdNZW5zYWplIGRlIHZveicsXG4gICAgcmVwbHlpbmdUbzogJ1Jlc3BvbmRpZW5kbyBhJyxcbiAgICBjYW5jZWw6ICdDYW5jZWxhcicsXG4gIH0sXG4gIGVuOiB7XG4gICAgcGxhY2Vob2xkZXI6ICdXcml0ZSBhIG1lc3NhZ2UnLFxuICAgIHNlbmQ6ICdTZW5kJyxcbiAgICBhdHRhY2g6ICdBdHRhY2gnLFxuICAgIGVtb2ppOiAnRW1vamknLFxuICAgIHZvaWNlOiAnVm9pY2UgbWVzc2FnZScsXG4gICAgcmVwbHlpbmdUbzogJ1JlcGx5aW5nIHRvJyxcbiAgICBjYW5jZWw6ICdDYW5jZWwnLFxuICB9LFxufTtcblxuY29uc3QgUVVJQ0tfRU1PSklTID0gWyfwn5GNJywgJ+KdpO+4jycsICfwn5iCJywgJ/CfjoknLCAn8J+ZjycsICfwn5SlJywgJ/CfmK4nLCAn8J+YoiddO1xuXG4vKipcbiAqIHZhbC1jaGF0LWNvbXBvc2VyIOKAlCBiYXJyYSBkZSByZWRhY2Npw7NuIGRlIGNoYXQgbW9kZXJuYSAoc2lnbmFsIGlucHV0cykuXG4gKlxuICogUGlsbCBjb246IGFkanVudGFyICgrKSwgdGV4dGFyZWEgYXV0by1ncm93LCBlbW9qaSAoZmlsYSByw6FwaWRhKSB5IG1pYy9lbnZpYXJcbiAqIChtaWMgY3VhbmRvIGVzdMOhIHZhY8OtbywgZW52aWFyIGN1YW5kbyBoYXkgdGV4dG8g4oCUIHBhdHLDs24gV2hhdHNBcHAvVGVsZWdyYW0pLlxuICogTXVlc3RyYSB1bmEgYmFycmEgZGUgY29udGV4dG8gXCJyZXNwb25kaWVuZG8gYVwiIGN1YW5kbyBgcmVwbHlpbmdUb2AgZXN0w6Egc2V0ZWFkby5cbiAqIGB0eXBpbmdgIHNlIGVtaXRlIGNvbiBkZWJvdW5jZSAobcOheC4gMSB2ZXogY2FkYSAycykgcGFyYSBubyBzcGFtZWFyIHdyaXRlcy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWNoYXQtY29tcG9zZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25UZXh0YXJlYSwgSW9uSWNvbl0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImNvbXBvc2VyXCI+XG4gICAgICBAaWYgKHJlcGx5aW5nVG8oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbHktYmFyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJlcGx5LWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVwbHktbmFtZVwiPnt7IHJlcGx5aW5nVG8oKSEuc2VuZGVyTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVwbHktYm9keVwiPnt7IHJlcGx5aW5nVG8oKSEuYm9keSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG5cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2NhbmNlbCcpXCIgKGNsaWNrKT1cImNhbmNlbFJlcGx5LmVtaXQoKVwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoZW1vamlPcGVuKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImVtb2ppLXJvd1wiPlxuICAgICAgICAgIEBmb3IgKGUgb2YgcXVpY2tFbW9qaXM7IHRyYWNrIGUpIHtcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJlbW9qaVwiIChjbGljayk9XCJpbnNlcnRFbW9qaShlKVwiPnt7IGUgfX08L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGlsbFwiPlxuICAgICAgICBAaWYgKHNob3dBdHRhY2goKSkge1xuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImljb24tYnRuXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdhdHRhY2gnKVwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhZGQtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBoaWRkZW4gKGNoYW5nZSk9XCJvbkZpbGUoJGV2ZW50KVwiIGFjY2VwdD1cImltYWdlLyosYXBwbGljYXRpb24vcGRmXCIgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICB9XG5cbiAgICAgICAgPGlvbi10ZXh0YXJlYVxuICAgICAgICAgIGNsYXNzPVwiZmllbGRcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclRleHQoKVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgICAgICAgIFttYXhsZW5ndGhdPVwibWF4TGVuZ3RoKClcIlxuICAgICAgICAgIFthdXRvR3Jvd109XCJ0cnVlXCJcbiAgICAgICAgICBbcm93c109XCIxXCJcbiAgICAgICAgICBbdmFsdWVdPVwiYm9keSgpXCJcbiAgICAgICAgICAoaW9uSW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXG4gICAgICAgID48L2lvbi10ZXh0YXJlYT5cblxuICAgICAgICBAaWYgKHNob3dFbW9qaSgpKSB7XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuXCIgW2NsYXNzLmFjdGl2ZV09XCJlbW9qaU9wZW4oKVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnZW1vamknKVwiIChjbGljayk9XCJ0b2dnbGVFbW9qaSgpXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImhhcHB5LW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChjYW5TZW5kKCkpIHtcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG5cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ3NlbmQnKVwiIChjbGljayk9XCJvblNlbmQoKVwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhcnJvdy11cC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfSBAZWxzZSBpZiAoc2hvd01pYygpKSB7XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuIG1pY1wiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgndm9pY2UnKVwiIChjbGljayk9XCJ2b2ljZS5lbWl0KClcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibWljLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5jb21wb3NlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgICBwYWRkaW5nOiA4cHggMTBweCBjYWxjKDhweCArIGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpKTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWJhY2tncm91bmQtY29sb3IsICNmZmYpO1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICB9XG4gICAgICAucmVwbHktYmFyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1wcmltYXJ5KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3Itc3RlcC0xMDAsIHJnYmEoMTI3LCAxMjcsIDEyNywgMC4xKSk7XG4gICAgICB9XG4gICAgICAucmVwbHktY29udGVudCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICB9XG4gICAgICAucmVwbHktbmFtZSB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICB9XG4gICAgICAucmVwbHktYm9keSB7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuZW1vamktcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiA0cHg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIH1cbiAgICAgIC5lbW9qaSB7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN0ZXAtMTAwLCByZ2JhKDEyNywgMTI3LCAxMjcsIDAuMSkpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgICAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5waWxsIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAgICBnYXA6IDRweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7XG4gICAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICB9XG4gICAgICAuZmllbGQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICAtLWJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICAtLXBhZGRpbmctc3RhcnQ6IDZweDtcbiAgICAgICAgLS1wYWRkaW5nLWVuZDogNnB4O1xuICAgICAgICAtLXBhZGRpbmctdG9wOiA4cHg7XG4gICAgICAgIC0tcGFkZGluZy1ib3R0b206IDhweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBtYXgtaGVpZ2h0OiAxMjBweDtcbiAgICAgICAgZm9udC1zaXplOiAwLjkzNzVyZW07XG4gICAgICB9XG4gICAgICAuaWNvbi1idG4ge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiAzOHB4O1xuICAgICAgICBoZWlnaHQ6IDM4cHg7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBmb250LXNpemU6IDEuMzc1cmVtO1xuICAgICAgfVxuICAgICAgLmljb24tYnRuOmhvdmVyLFxuICAgICAgLmljb24tYnRuLmFjdGl2ZSB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICB9XG4gICAgICAuaWNvbi1idG4ubWljOmhvdmVyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5KTtcbiAgICAgIH1cbiAgICAgIC5zZW5kLWJ0biB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDM4cHg7XG4gICAgICAgIGhlaWdodDogMzhweDtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS1jb250cmFzdCwgI2ZmZik7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxLjI1cmVtO1xuICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xcyBlYXNlO1xuICAgICAgfVxuICAgICAgLnNlbmQtYnRuOmFjdGl2ZSB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45Mik7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBvc2VyQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcblxuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBkaXNhYmxlZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbWF4TGVuZ3RoID0gaW5wdXQ8bnVtYmVyPigyMDAwKTtcbiAgcmVhZG9ubHkgcmVwbHlpbmdUbyA9IGlucHV0PE1lc3NhZ2VSZXBseVRvIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNob3dBdHRhY2ggPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2hvd0Vtb2ppID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNob3dNaWMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICByZWFkb25seSBzZW5kID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdHlwaW5nID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IGF0dGFjaCA9IG91dHB1dDxGaWxlPigpO1xuICByZWFkb25seSB2b2ljZSA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBjYW5jZWxSZXBseSA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBib2R5ID0gc2lnbmFsKCcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtb2ppT3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBxdWlja0Vtb2ppcyA9IFFVSUNLX0VNT0pJUztcblxuICBwcml2YXRlIGxhc3RUeXBpbmdFbWl0ID0gMDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnQ2hhdENvbXBvc2VyJywgQ0hBVF9DT01QT1NFUl9JMThOKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBjYW5TZW5kID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHQgPSB0aGlzLmJvZHkoKS50cmltKCk7XG4gICAgcmV0dXJuIHQubGVuZ3RoID4gMCAmJiB0Lmxlbmd0aCA8PSB0aGlzLm1heExlbmd0aCgpICYmICF0aGlzLmRpc2FibGVkKCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBwbGFjZWhvbGRlclRleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcigpIHx8IHRoaXMuaTE4bi50KCdwbGFjZWhvbGRlcicsICdDaGF0Q29tcG9zZXInKTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJb25UZXh0YXJlYUVsZW1lbnQ7XG4gICAgdGhpcy5ib2R5LnNldCh0YXJnZXQudmFsdWUgPz8gJycpO1xuICAgIHRoaXMuZW1pdFR5cGluZ0RlYm91bmNlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vblNlbmQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZW5kKCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB0aGlzLmJvZHkoKS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkIHx8IHRyaW1tZWQubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGgoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VuZC5lbWl0KHRyaW1tZWQpO1xuICAgIHRoaXMuYm9keS5zZXQoJycpO1xuICAgIHRoaXMuZW1vamlPcGVuLnNldChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlRW1vamkoKTogdm9pZCB7XG4gICAgdGhpcy5lbW9qaU9wZW4udXBkYXRlKHYgPT4gIXYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc2VydEVtb2ppKGVtb2ppOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmJvZHkudXBkYXRlKHYgPT4gdiArIGVtb2ppKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZpbGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcbiAgICBpZiAoZmlsZSkgdGhpcy5hdHRhY2guZW1pdChmaWxlKTtcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRlIHR5cGluZyBjb21vIG3DoXhpbW8gMSB2ZXogY2FkYSAycy4gTm8gdXNhIERhdGUubm93KCkgZGlyZWN0byBlbiBwbGFudGlsbGFzXG4gICAqIGRlIHdvcmtmbG93OyBhcXXDrSBlc3RhbW9zIGVuIHJ1bnRpbWUgZGUgbmF2ZWdhZG9yLCBwZXJmb3JtYW5jZS5ub3cgZXMgc2VndXJvLlxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0VHlwaW5nRGVib3VuY2VkKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGlmIChub3cgLSB0aGlzLmxhc3RUeXBpbmdFbWl0ID4gMjAwMCkge1xuICAgICAgdGhpcy5sYXN0VHlwaW5nRW1pdCA9IG5vdztcbiAgICAgIHRoaXMudHlwaW5nLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnQ2hhdENvbXBvc2VyJyk7XG4gIH1cbn1cbiJdfQ==
|
package/esm2022/lib/components/molecules/conversation-list-item/conversation-list-item.component.mjs
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { Component, computed, inject, input, output } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { I18nService } from '../../../services/i18n';
|
|
4
|
-
import { formatRelativeTime } from '../../../shared/utils/datetime';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
/**
|
|
7
|
-
* val-conversation-list-item — fila de lista de conversaciones estilo
|
|
8
|
-
* Telegram/WhatsApp: avatar (imagen o iniciales), nombre + hora relativa,
|
|
9
|
-
* preview del último mensaje + badge de no-leídos. Signal inputs, dark-safe.
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* <val-conversation-list-item
|
|
13
|
-
* [name]="conv.name"
|
|
14
|
-
* [lastMessage]="conv.lastMsgPreview"
|
|
15
|
-
* [timestamp]="conv.lastMsgAt"
|
|
16
|
-
* [unreadCount]="conv.unread"
|
|
17
|
-
* (select)="open(conv.convId)" />
|
|
18
|
-
*/
|
|
19
|
-
export class ConversationListItemComponent {
|
|
20
|
-
constructor() {
|
|
21
|
-
this.i18n = inject(I18nService);
|
|
22
|
-
this.name = input('');
|
|
23
|
-
this.avatarUrl = input(undefined);
|
|
24
|
-
this.lastMessage = input('');
|
|
25
|
-
this.timestamp = input(undefined);
|
|
26
|
-
this.unreadCount = input(0);
|
|
27
|
-
this.locale = input('es-CL');
|
|
28
|
-
this.select = output();
|
|
29
|
-
this.initials = computed(() => {
|
|
30
|
-
const name = this.name().trim();
|
|
31
|
-
if (!name)
|
|
32
|
-
return '?';
|
|
33
|
-
const parts = name.split(/\s+/);
|
|
34
|
-
return (parts[0][0] + (parts[1]?.[0] ?? '')).toUpperCase();
|
|
35
|
-
});
|
|
36
|
-
this.timeLabel = computed(() => formatRelativeTime(this.timestamp(), this.locale(), {
|
|
37
|
-
today: '',
|
|
38
|
-
yesterday: this.i18n.t('yesterday', '_global'),
|
|
39
|
-
}));
|
|
40
|
-
this.i18n.registerDefaults('ConversationListItem', {
|
|
41
|
-
es: { empty: 'Sin mensajes' },
|
|
42
|
-
en: { empty: 'No messages' },
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
emptyText() {
|
|
46
|
-
this.i18n.lang();
|
|
47
|
-
return this.i18n.t('empty', 'ConversationListItem');
|
|
48
|
-
}
|
|
49
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConversationListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
50
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ConversationListItemComponent, isStandalone: true, selector: "val-conversation-list-item", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, avatarUrl: { classPropertyName: "avatarUrl", publicName: "avatarUrl", isSignal: true, isRequired: false, transformFunction: null }, lastMessage: { classPropertyName: "lastMessage", publicName: "lastMessage", isSignal: true, isRequired: false, transformFunction: null }, timestamp: { classPropertyName: "timestamp", publicName: "timestamp", isSignal: true, isRequired: false, transformFunction: null }, unreadCount: { classPropertyName: "unreadCount", publicName: "unreadCount", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select" }, ngImport: i0, template: `
|
|
51
|
-
<button class="item" (click)="select.emit()">
|
|
52
|
-
<div class="avatar">
|
|
53
|
-
@if (avatarUrl()) {
|
|
54
|
-
<img [src]="avatarUrl()" [alt]="name()" />
|
|
55
|
-
} @else {
|
|
56
|
-
<span>{{ initials() }}</span>
|
|
57
|
-
}
|
|
58
|
-
</div>
|
|
59
|
-
<div class="content">
|
|
60
|
-
<div class="top">
|
|
61
|
-
<span class="name">{{ name() }}</span>
|
|
62
|
-
@if (timeLabel()) {
|
|
63
|
-
<span class="time" [class.unread]="unreadCount() > 0">{{ timeLabel() }}</span>
|
|
64
|
-
}
|
|
65
|
-
</div>
|
|
66
|
-
<div class="bottom">
|
|
67
|
-
<span class="preview" [class.muted]="!lastMessage()">
|
|
68
|
-
{{ lastMessage() || emptyText() }}
|
|
69
|
-
</span>
|
|
70
|
-
@if (unreadCount() > 0) {
|
|
71
|
-
<span class="badge">{{ unreadCount() > 99 ? '99+' : unreadCount() }}</span>
|
|
72
|
-
}
|
|
73
|
-
</div>
|
|
74
|
-
</div>
|
|
75
|
-
</button>
|
|
76
|
-
`, isInline: true, styles: [":host{display:block}.item{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;text-align:left;border-radius:12px;transition:background .12s ease}.item:hover{background:var(--ion-color-step-50, rgba(127, 127, 127, .06))}.avatar{width:48px;height:48px;flex-shrink:0;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:var(--ion-color-primary);color:#fff;font-weight:700;font-size:1rem}.avatar img{width:100%;height:100%;object-fit:cover}.content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.top,.bottom{display:flex;align-items:center;gap:8px}.name{flex:1;min-width:0;font-weight:600;font-size:.9375rem;color:var(--ion-text-color, #000);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time{flex-shrink:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.time.unread{color:var(--ion-color-primary);font-weight:600}.preview{flex:1;min-width:0;font-size:.875rem;color:var(--ion-color-medium, #92949c);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview.muted{font-style:italic;opacity:.7}.badge{flex-shrink:0;min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);font-size:.6875rem;font-weight:700;display:inline-flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
|
|
77
|
-
}
|
|
78
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConversationListItemComponent, decorators: [{
|
|
79
|
-
type: Component,
|
|
80
|
-
args: [{ selector: 'val-conversation-list-item', standalone: true, imports: [CommonModule], template: `
|
|
81
|
-
<button class="item" (click)="select.emit()">
|
|
82
|
-
<div class="avatar">
|
|
83
|
-
@if (avatarUrl()) {
|
|
84
|
-
<img [src]="avatarUrl()" [alt]="name()" />
|
|
85
|
-
} @else {
|
|
86
|
-
<span>{{ initials() }}</span>
|
|
87
|
-
}
|
|
88
|
-
</div>
|
|
89
|
-
<div class="content">
|
|
90
|
-
<div class="top">
|
|
91
|
-
<span class="name">{{ name() }}</span>
|
|
92
|
-
@if (timeLabel()) {
|
|
93
|
-
<span class="time" [class.unread]="unreadCount() > 0">{{ timeLabel() }}</span>
|
|
94
|
-
}
|
|
95
|
-
</div>
|
|
96
|
-
<div class="bottom">
|
|
97
|
-
<span class="preview" [class.muted]="!lastMessage()">
|
|
98
|
-
{{ lastMessage() || emptyText() }}
|
|
99
|
-
</span>
|
|
100
|
-
@if (unreadCount() > 0) {
|
|
101
|
-
<span class="badge">{{ unreadCount() > 99 ? '99+' : unreadCount() }}</span>
|
|
102
|
-
}
|
|
103
|
-
</div>
|
|
104
|
-
</div>
|
|
105
|
-
</button>
|
|
106
|
-
`, styles: [":host{display:block}.item{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;text-align:left;border-radius:12px;transition:background .12s ease}.item:hover{background:var(--ion-color-step-50, rgba(127, 127, 127, .06))}.avatar{width:48px;height:48px;flex-shrink:0;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:var(--ion-color-primary);color:#fff;font-weight:700;font-size:1rem}.avatar img{width:100%;height:100%;object-fit:cover}.content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.top,.bottom{display:flex;align-items:center;gap:8px}.name{flex:1;min-width:0;font-weight:600;font-size:.9375rem;color:var(--ion-text-color, #000);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time{flex-shrink:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.time.unread{color:var(--ion-color-primary);font-weight:600}.preview{flex:1;min-width:0;font-size:.875rem;color:var(--ion-color-medium, #92949c);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview.muted{font-style:italic;opacity:.7}.badge{flex-shrink:0;min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);font-size:.6875rem;font-weight:700;display:inline-flex;align-items:center;justify-content:center}\n"] }]
|
|
107
|
-
}], ctorParameters: () => [] });
|
|
108
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uLWxpc3QtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnZlcnNhdGlvbi1saXN0LWl0ZW0vY29udmVyc2F0aW9uLWxpc3QtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFFcEU7Ozs7Ozs7Ozs7OztHQVlHO0FBc0lILE1BQU0sT0FBTyw2QkFBNkI7SUFZeEM7UUFYUSxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFCLFNBQUksR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDekIsY0FBUyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7UUFDakQsZ0JBQVcsR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDaEMsY0FBUyxHQUFHLEtBQUssQ0FBNEIsU0FBUyxDQUFDLENBQUM7UUFDeEQsZ0JBQVcsR0FBRyxLQUFLLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsV0FBTSxHQUFHLEtBQUssQ0FBUyxPQUFPLENBQUMsQ0FBQztRQUVoQyxXQUFNLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFTZCxhQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxHQUFHLENBQUM7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVnQixjQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUMzQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xELEtBQUssRUFBRSxFQUFFO1lBQ1QsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7U0FDL0MsQ0FBQyxDQUNILENBQUM7UUFsQkEsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRTtZQUNqRCxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO1lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQWdCUyxTQUFTO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN0RCxDQUFDOytHQXBDVSw2QkFBNkI7bUdBQTdCLDZCQUE2Qiw2NEJBakk5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQsNjhDQTNCUyxZQUFZOzs0RkFrSVgsNkJBQTZCO2tCQXJJekMsU0FBUzsrQkFDRSw0QkFBNEIsY0FDMUIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgZm9ybWF0UmVsYXRpdmVUaW1lIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL2RhdGV0aW1lJztcblxuLyoqXG4gKiB2YWwtY29udmVyc2F0aW9uLWxpc3QtaXRlbSDigJQgZmlsYSBkZSBsaXN0YSBkZSBjb252ZXJzYWNpb25lcyBlc3RpbG9cbiAqIFRlbGVncmFtL1doYXRzQXBwOiBhdmF0YXIgKGltYWdlbiBvIGluaWNpYWxlcyksIG5vbWJyZSArIGhvcmEgcmVsYXRpdmEsXG4gKiBwcmV2aWV3IGRlbCDDumx0aW1vIG1lbnNhamUgKyBiYWRnZSBkZSBuby1sZcOtZG9zLiBTaWduYWwgaW5wdXRzLCBkYXJrLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIDx2YWwtY29udmVyc2F0aW9uLWxpc3QtaXRlbVxuICogICBbbmFtZV09XCJjb252Lm5hbWVcIlxuICogICBbbGFzdE1lc3NhZ2VdPVwiY29udi5sYXN0TXNnUHJldmlld1wiXG4gKiAgIFt0aW1lc3RhbXBdPVwiY29udi5sYXN0TXNnQXRcIlxuICogICBbdW5yZWFkQ291bnRdPVwiY29udi51bnJlYWRcIlxuICogICAoc2VsZWN0KT1cIm9wZW4oY29udi5jb252SWQpXCIgLz5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWNvbnZlcnNhdGlvbi1saXN0LWl0ZW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uIGNsYXNzPVwiaXRlbVwiIChjbGljayk9XCJzZWxlY3QuZW1pdCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyXCI+XG4gICAgICAgIEBpZiAoYXZhdGFyVXJsKCkpIHtcbiAgICAgICAgICA8aW1nIFtzcmNdPVwiYXZhdGFyVXJsKClcIiBbYWx0XT1cIm5hbWUoKVwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxzcGFuPnt7IGluaXRpYWxzKCkgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRvcFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPnt7IG5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICBAaWYgKHRpbWVMYWJlbCgpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWVcIiBbY2xhc3MudW5yZWFkXT1cInVucmVhZENvdW50KCkgPiAwXCI+e3sgdGltZUxhYmVsKCkgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJldmlld1wiIFtjbGFzcy5tdXRlZF09XCIhbGFzdE1lc3NhZ2UoKVwiPlxuICAgICAgICAgICAge3sgbGFzdE1lc3NhZ2UoKSB8fCBlbXB0eVRleHQoKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICBAaWYgKHVucmVhZENvdW50KCkgPiAwKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCI+e3sgdW5yZWFkQ291bnQoKSA+IDk5ID8gJzk5KycgOiB1bnJlYWRDb3VudCgpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5pdGVtIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnMgZWFzZTtcbiAgICAgIH1cbiAgICAgIC5pdGVtOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN0ZXAtNTAsIHJnYmEoMTI3LCAxMjcsIDEyNywgMC4wNikpO1xuICAgICAgfVxuICAgICAgLmF2YXRhciB7XG4gICAgICAgIHdpZHRoOiA0OHB4O1xuICAgICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmb250LXNpemU6IDFyZW07XG4gICAgICB9XG4gICAgICAuYXZhdGFyIGltZyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG9iamVjdC1maXQ6IGNvdmVyO1xuICAgICAgfVxuICAgICAgLmNvbnRlbnQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBtaW4td2lkdGg6IDA7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMnB4O1xuICAgICAgfVxuICAgICAgLnRvcCxcbiAgICAgIC5ib3R0b20ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uYW1lIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBmb250LXNpemU6IDAuOTM3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yLCAjMDAwKTtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG4gICAgICAudGltZSB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgIH1cbiAgICAgIC50aW1lLnVucmVhZCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICB9XG4gICAgICAucHJldmlldyB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIH1cbiAgICAgIC5wcmV2aWV3Lm11dGVkIHtcbiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgICBvcGFjaXR5OiAwLjc7XG4gICAgICB9XG4gICAgICAuYmFkZ2Uge1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgICAgbWluLXdpZHRoOiAyMHB4O1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIHBhZGRpbmc6IDAgNnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS1jb250cmFzdCwgI2ZmZik7XG4gICAgICAgIGZvbnQtc2l6ZTogMC42ODc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udmVyc2F0aW9uTGlzdEl0ZW1Db21wb25lbnQge1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IG5hbWUgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgYXZhdGFyVXJsID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSBsYXN0TWVzc2FnZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSB0aW1lc3RhbXAgPSBpbnB1dDxzdHJpbmcgfCBEYXRlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSB1bnJlYWRDb3VudCA9IGlucHV0PG51bWJlcj4oMCk7XG4gIHJlYWRvbmx5IGxvY2FsZSA9IGlucHV0PHN0cmluZz4oJ2VzLUNMJyk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoJ0NvbnZlcnNhdGlvbkxpc3RJdGVtJywge1xuICAgICAgZXM6IHsgZW1wdHk6ICdTaW4gbWVuc2FqZXMnIH0sXG4gICAgICBlbjogeyBlbXB0eTogJ05vIG1lc3NhZ2VzJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGluaXRpYWxzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWUoKS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJz8nO1xuICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvXFxzKy8pO1xuICAgIHJldHVybiAocGFydHNbMF1bMF0gKyAocGFydHNbMV0/LlswXSA/PyAnJykpLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0aW1lTGFiZWwgPSBjb21wdXRlZCgoKSA9PlxuICAgIGZvcm1hdFJlbGF0aXZlVGltZSh0aGlzLnRpbWVzdGFtcCgpLCB0aGlzLmxvY2FsZSgpLCB7XG4gICAgICB0b2RheTogJycsXG4gICAgICB5ZXN0ZXJkYXk6IHRoaXMuaTE4bi50KCd5ZXN0ZXJkYXknLCAnX2dsb2JhbCcpLFxuICAgIH0pXG4gICk7XG5cbiAgcHJvdGVjdGVkIGVtcHR5VGV4dCgpOiBzdHJpbmcge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KCdlbXB0eScsICdDb252ZXJzYXRpb25MaXN0SXRlbScpO1xuICB9XG59XG4iXX0=
|