diff --git a/IM-web-new-dist-20261010.zip b/IM-web-new-dist-20261010.zip
new file mode 100644
index 0000000..734524b
Binary files /dev/null and b/IM-web-new-dist-20261010.zip differ
diff --git a/dist-local/api.zip b/dist-local/api.zip
new file mode 100644
index 0000000..c8a867f
Binary files /dev/null and b/dist-local/api.zip differ
diff --git a/dist-local/api/conversation_actions.php b/dist-local/api/conversation_actions.php
index 299cc7e..61241c6 100644
--- a/dist-local/api/conversation_actions.php
+++ b/dist-local/api/conversation_actions.php
@@ -425,12 +425,38 @@ function currentMuteSetting(PDO $appDb, string $groupId): array
];
}
-function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
-{
- $group = fetchWebGroup($appDb, $groupId);
- if (!$group) {
- respond(404, '没有找到该群组');
- }
+function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
+{
+ $group = fetchWebGroup($appDb, $groupId);
+ if (!$group) {
+ $groupStatement = $imDb->prepare('select * from `t_group` where `_gid` = ? and `_deleted` = 0 limit 1');
+ $groupStatement->execute([$groupId]);
+ $nativeGroup = $groupStatement->fetch();
+ $memberStatement = $imDb->prepare('select `_type`, `_alias` from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1');
+ $memberStatement->execute([$groupId, $userId]);
+ $nativeMember = $memberStatement->fetch();
+ if (!$nativeGroup || !$nativeMember) {
+ respond(403, '你不在该群组中');
+ }
+ $ownerStatement = $imDb->prepare('select `_mid` from `t_group_member` where `_gid` = ? and `_type` = 2 limit 1');
+ $ownerStatement->execute([$groupId]);
+ $ownerId = (string)($ownerStatement->fetchColumn() ?: '');
+ $users = fetchWebUserMap($imDb, array_filter([$ownerId, $userId]), $userId);
+ return ['group' => [
+ 'groupId' => $groupId,
+ 'publicId' => (string)($nativeGroup['id'] ?? ''),
+ 'name' => (string)($nativeGroup['_name'] ?? $groupId),
+ 'category' => 'group',
+ 'announcement' => (string)($nativeGroup['_bulletin'] ?? ''),
+ 'welcomeText' => '',
+ 'ownerUid' => $ownerId,
+ 'ownerName' => (string)($users[$ownerId]['displayName'] ?? $ownerId),
+ 'myRole' => ((int)($nativeMember['_type'] ?? 0) === 2 ? 'owner' : ((int)($nativeMember['_type'] ?? 0) === 1 ? 'admin' : 'member')),
+ 'myAlias' => (string)($nativeMember['_alias'] ?? ''),
+ 'myDisplayName' => (string)($nativeMember['_alias'] ?? '') ?: (string)($users[$userId]['displayName'] ?? $userId),
+ 'muteSetting' => ['enabled' => false, 'mode' => 'off'],
+ ]];
+ }
$member = fetchWebGroupMember($appDb, $groupId, $userId);
if (!$member) {
respond(403, '你不在该群组中');
@@ -443,8 +469,9 @@ function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupI
$myAlias = (string)($member['alias'] ?? '');
return [
- 'group' => [
- 'groupId' => (string)$group['group_id'],
+ 'group' => [
+ 'groupId' => (string)$group['group_id'],
+ 'publicId' => (string)($group['id'] ?? ''),
'name' => (string)$group['name'],
'category' => (string)$group['category'],
'announcement' => (string)($group['announcement'] ?? ''),
@@ -459,11 +486,42 @@ function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupI
];
}
-function groupMembersAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
-{
- if (!fetchWebGroupMember($appDb, $groupId, $userId)) {
- respond(403, '你不在该群组中');
- }
+function groupMembersAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
+{
+ if (!fetchWebGroupMember($appDb, $groupId, $userId)) {
+ $membership = $imDb->prepare('select 1 from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1');
+ $membership->execute([$groupId, $userId]);
+ if (!$membership->fetchColumn()) {
+ respond(403, '你不在该群组中');
+ }
+ $nativeStatement = $imDb->prepare(
+ 'select `_mid` as `user_id`, `_type`, `_alias`, `_create_dt` from `t_group_member`'
+ . ' where `_gid` = ? order by (`_type` = 2) desc, `_create_dt` asc'
+ );
+ $nativeStatement->execute([$groupId]);
+ $nativeMembers = $nativeStatement->fetchAll();
+ $nativeUsers = fetchWebUserMap($imDb, array_column($nativeMembers, 'user_id'), $userId);
+ return ['members' => array_map(static function (array $member) use ($nativeUsers): array {
+ $uid = (string)$member['user_id'];
+ $user = $nativeUsers[$uid] ?? ['displayName' => $uid, 'mobile' => '', 'portrait' => '', 'isContact' => false];
+ $alias = trim((string)($member['_alias'] ?? ''));
+ $type = (int)($member['_type'] ?? 0);
+ return [
+ 'uid' => $uid,
+ 'role' => $type === 2 ? 'owner' : ($type === 1 ? 'admin' : 'member'),
+ 'alias' => $alias,
+ 'contactAlias' => trim((string)($user['contactAlias'] ?? '')),
+ 'friendAlias' => trim((string)($user['friendAlias'] ?? '')),
+ 'remarkAlias' => trim((string)($user['remarkAlias'] ?? '')),
+ 'isContact' => (bool)($user['isContact'] ?? false),
+ 'displayName' => trim((string)($user['contactAlias'] ?? '')) ?: ($alias ?: (string)$user['displayName']),
+ 'rawDisplayName' => (string)$user['displayName'],
+ 'groupDisplayName' => $alias,
+ 'mobile' => (string)($user['mobile'] ?? ''),
+ 'portrait' => (string)($user['portrait'] ?? ''),
+ ];
+ }, $nativeMembers)];
+ }
$statement = $appDb->prepare(
'select `user_id`, `role`, `alias`, `joined_at_ms` from `t_web_group_members`'
diff --git a/dist-local/api/media_proxy.php b/dist-local/api/media_proxy.php
index 764a539..00443d8 100644
--- a/dist-local/api/media_proxy.php
+++ b/dist-local/api/media_proxy.php
@@ -6,6 +6,18 @@ require __DIR__ . '/im_web_bootstrap.php';
const WEB_MEDIA_PROXY_MAX_BYTES = 15 * 1024 * 1024;
const WEB_MEDIA_PROXY_MAX_SECONDS = 25;
+function mediaProxyEnv(string $name, string $default = ''): string
+{
+ if (function_exists('webImEnv')) {
+ return (string)webImEnv($name, $default);
+ }
+ $value = getenv($name);
+ if ($value === false || trim((string)$value) === '') {
+ return $default;
+ }
+ return trim((string)$value);
+}
+
function failMediaProxy(int $status, string $message): never
{
http_response_code($status);
@@ -18,12 +30,13 @@ function failMediaProxy(int $status, string $message): never
function mediaProxyAllowedHosts(): array
{
- $configured = webImEnv('JC_WEB_IM_MEDIA_PROXY_HOSTS');
+ $configured = mediaProxyEnv('JC_WEB_IM_MEDIA_PROXY_HOSTS');
$hosts = array_map(
static fn(string $host): string => strtolower(rtrim(trim($host), '.')),
preg_split('/[,\s]+/', $configured) ?: []
);
+ $hosts[] = 'zhiyanim.dfpnm.cn';
return array_values(array_unique(array_filter($hosts)));
}
@@ -53,9 +66,12 @@ function validatedMediaProxyUrl(string $url): array
function mediaProxyCacheRoot(): string
{
- $root = rtrim(webImEnv('JC_WEB_IM_MEDIA_CACHE_ROOT', '/var/cache/jc-web-im-media'), '/');
+ $root = rtrim(mediaProxyEnv('JC_WEB_IM_MEDIA_CACHE_ROOT', '/var/cache/jc-web-im-media'), '/');
if ($root === '' || !is_dir($root) || !is_writable($root)) {
- failMediaProxy(503, '媒体缓存目录不可用');
+ $root = rtrim(sys_get_temp_dir(), '/') . '/jc-web-im-media';
+ if (!is_dir($root) && !@mkdir($root, 0755, true) && !is_dir($root)) {
+ failMediaProxy(503, '媒体缓存目录不可用');
+ }
}
return $root;
@@ -63,7 +79,7 @@ function mediaProxyCacheRoot(): string
function mediaProxyPreferredIps(): array
{
- $configured = preg_split('/[,\s]+/', webImEnv('JC_WEB_IM_MEDIA_PROXY_IPS')) ?: [];
+ $configured = preg_split('/[,\s]+/', mediaProxyEnv('JC_WEB_IM_MEDIA_PROXY_IPS')) ?: [];
$ips = [];
foreach ($configured as $ip) {
$ip = trim($ip);
diff --git a/dist-local/api/media_stream.php b/dist-local/api/media_stream.php
new file mode 100644
index 0000000..7ccd61f
--- /dev/null
+++ b/dist-local/api/media_stream.php
@@ -0,0 +1,71 @@
+ $end || $start >= $size) {
+ header('Content-Range: bytes */' . $size);
+ failMediaStream(416, '请求范围无效');
+ }
+ http_response_code(206);
+ header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);
+}
+
+$length = $end - $start + 1;
+header('Content-Type: ' . $mime);
+header('Content-Length: ' . $length);
+header('Accept-Ranges: bytes');
+header('Content-Disposition: inline');
+header('Cache-Control: public, max-age=86400');
+header('X-Content-Type-Options: nosniff');
+
+$stream = fopen($fullPath, 'rb');
+if ($stream === false) failMediaStream(500, '视频文件无法读取');
+fseek($stream, $start);
+$remaining = $length;
+while ($remaining > 0 && !feof($stream)) {
+ $chunk = fread($stream, min(1024 * 1024, $remaining));
+ if ($chunk === false || $chunk === '') break;
+ echo $chunk;
+ $remaining -= strlen($chunk);
+ flush();
+}
+fclose($stream);
diff --git a/dist-local/api/message_action.php b/dist-local/api/message_action.php
index f633822..e7bd9e9 100644
--- a/dist-local/api/message_action.php
+++ b/dist-local/api/message_action.php
@@ -78,7 +78,7 @@ function fetchActionMessageRow(string $messageUid): array
return is_array($row) ? $row : [];
}
-function ensureMessageEditsTable(): void
+function ensureMessageEditsTable(): void
{
imDb()->exec(
'create table if not exists `t_web_message_edits` ('
@@ -93,7 +93,55 @@ function ensureMessageEditsTable(): void
. 'key `idx_edited_at_ms` (`edited_at_ms`)'
. ') engine=InnoDB default charset=utf8mb4'
);
-}
+}
+
+function ensurePinnedMessagesTable(): void
+{
+ $db = imAppDb();
+ $db->exec(
+ 'create table if not exists `t_web_pinned_messages` ('
+ . '`user_id` varchar(64) not null,'
+ . '`conversation_type` varchar(16) not null,'
+ . '`target_id` varchar(128) not null,'
+ . '`message_uid` varchar(32) not null,'
+ . '`message_json` text null,'
+ . '`updated_at_ms` bigint not null,'
+ . 'primary key (`user_id`, `conversation_type`, `target_id`)'
+ . ') engine=InnoDB default charset=utf8mb4'
+ );
+ try {
+ $db->exec('alter table `t_web_pinned_messages` add column `message_json` text null after `message_uid`');
+ } catch (Throwable) {
+ // The column already exists.
+ }
+}
+
+function savePinnedMessage(string $userId, string $conversationType, string $targetId, string $messageUid, array $message): void
+{
+ ensurePinnedMessagesTable();
+ $statement = imAppDb()->prepare(
+ 'insert into `t_web_pinned_messages` (`user_id`, `conversation_type`, `target_id`, `message_uid`, `message_json`, `updated_at_ms`)'
+ . ' values (?, ?, ?, ?, ?, ?) on duplicate key update `message_uid` = values(`message_uid`),'
+ . ' `message_json` = values(`message_json`), `updated_at_ms` = values(`updated_at_ms`)'
+ );
+ $statement->execute([
+ $userId,
+ $conversationType,
+ $targetId,
+ $messageUid,
+ json_encode($message, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
+ nowTimestampMs(),
+ ]);
+}
+
+function removePinnedMessage(string $userId, string $conversationType, string $targetId): void
+{
+ ensurePinnedMessagesTable();
+ $statement = imAppDb()->prepare(
+ 'delete from `t_web_pinned_messages` where `user_id` = ? and `conversation_type` = ? and `target_id` = ?'
+ );
+ $statement->execute([$userId, $conversationType, $targetId]);
+}
function editTextMessage(string $operatorId, string $messageUid, string $text): array
{
@@ -222,7 +270,22 @@ if ($action === '' || $messageUid <= 0) {
respond(400, '缺少操作类型或消息ID');
}
-try {
+try {
+ if ($action === 'pin' || $action === 'unpin') {
+ if ($userId === '') respond(400, '缺少操作者ID');
+ $targetId = trim((string)($payload['target'] ?? ''));
+ $conversationType = trim((string)($payload['conversationType'] ?? 'single'));
+ if ($targetId === '') respond(400, '缺少会话ID');
+ $userId = resolveActionUserId($userId);
+ if ($action === 'pin') {
+ $message = is_array($payload['message'] ?? null) ? $payload['message'] : [];
+ savePinnedMessage($userId, $conversationType, $targetId, $messageUidText, $message);
+ } else {
+ removePinnedMessage($userId, $conversationType, $targetId);
+ }
+ respond(0, 'success', ['messageUid' => $messageUidText, 'action' => $action]);
+ }
+
if ($action === 'recall') {
if ($userId === '') {
respond(400, '缺少操作者ID');
diff --git a/dist-local/api/messages.php b/dist-local/api/messages.php
index ac03851..528ba17 100644
--- a/dist-local/api/messages.php
+++ b/dist-local/api/messages.php
@@ -1,900 +1,1724 @@
- 0) {
- return ($id >> 21) + 1514736000000;
- }
-
- if ($datetime !== null && $datetime !== '') {
- $date = DateTimeImmutable::createFromFormat(
- 'Y-m-d H:i:s',
- $datetime,
- new DateTimeZone(IM_DB_TIMEZONE)
- );
- if ($date instanceof DateTimeImmutable) {
- return $date->getTimestamp() * 1000;
- }
- }
-
- return (int)floor(microtime(true) * 1000);
-}
-
-function nowMs(): int
-{
- return (int)floor(microtime(true) * 1000);
-}
-
-function markUserDelivered(PDO $db, string $userId, int $timestamp): void
-{
- if ($userId === '' || $timestamp <= 0) {
- return;
- }
-
- $statement = $db->prepare(
- 'insert into `t_delivery_report` (`_uid`, `_dt`) values (?, ?)'
- . ' on duplicate key update `_dt` = if(`_dt` < values(`_dt`), values(`_dt`), `_dt`)'
- );
- $statement->execute([$userId, $timestamp]);
-}
-
-function markConversationRead(PDO $db, string $userId, string $targetId, int $timestamp): void
-{
- if ($userId === '' || $targetId === '' || $timestamp <= 0) {
- return;
- }
-
- $statement = $db->prepare(
- 'select `id`, `_dt` from `t_read_report`'
- . ' where `_uid` = ? and `_type` = 0 and `_line` = 0 and `_target` = ?'
- . ' order by `_dt` desc limit 1'
- );
- $statement->execute([$userId, $targetId]);
- $row = $statement->fetch();
-
- if ($row) {
- if ($timestamp > (int)$row['_dt']) {
- $update = $db->prepare('update `t_read_report` set `_dt` = ? where `id` = ?');
- $update->execute([$timestamp, (int)$row['id']]);
- }
- return;
- }
-
- $insert = $db->prepare(
- 'insert into `t_read_report` (`_uid`, `_type`, `_line`, `_target`, `_dt`) values (?, 0, 0, ?, ?)'
- );
- $insert->execute([$userId, $targetId, $timestamp]);
-}
-
-function resolveUserId(PDO $db, string $value): string
-{
- if ($value === '') {
- return '';
- }
-
- $statement = $db->prepare(
- 'select `_uid` from `t_user` where `_uid` = ? or `_mobile` = ? or `_name` = ? limit 1'
- );
- $statement->execute([$value, $value, $value]);
- $uid = $statement->fetchColumn();
-
- return is_string($uid) && $uid !== '' ? $uid : $value;
-}
-
-function peerFromConversationTarget(string $userId, string $target): string
-{
- $parts = array_values(array_filter(explode('|', $target), static fn($part) => $part !== ''));
- if (count($parts) < 2) {
- return $target !== $userId ? $target : '';
- }
-
- return $parts[0] === $userId ? $parts[1] : $parts[0];
-}
-
-function fetchMessageRows(PDO $db, array $messageIds): array
-{
- $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds))));
- if (!$messageIds) {
- return [];
- }
-
- $idsByTable = [];
- foreach ($messageIds as $messageId) {
- $idsByTable[imMessageTable($messageId)][] = $messageId;
- }
-
- $messages = [];
- foreach ($idsByTable as $table => $ids) {
- $sql = 'select `_mid`, `_from`, `_type`, `_target`, `_line`, `_searchable_key`, `_dt`, `_content_type`, `_to`'
- . ' from `' . $table . '` where `_mid` in (' . placeholders($ids) . ')';
- $statement = $db->prepare($sql);
- $statement->execute($ids);
- foreach ($statement->fetchAll() as $row) {
- $messages[(string)$row['_mid']] = $row;
- }
- }
-
- return $messages;
-}
-
-function fetchMessageEditMap(PDO $db, array $messageIds): array
-{
- $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds))));
- if (!$messageIds) {
- return [];
- }
-
- try {
- $statement = $db->prepare(
- 'select `message_uid`, `edited_at_ms` from `t_web_message_edits`'
- . ' where `message_uid` in (' . placeholders($messageIds) . ')'
- );
- $statement->execute($messageIds);
- } catch (Throwable) {
- return [];
- }
-
- $edits = [];
- foreach ($statement->fetchAll() as $row) {
- $edits[(string)$row['message_uid']] = [
- 'editedAt' => (int)$row['edited_at_ms'],
- ];
- }
-
- return $edits;
-}
-
-function normalizeAttachmentRow(array $row): array
-{
- return [
- 'type' => (string)$row['attachment_type'],
- 'url' => (string)$row['url'],
- 'name' => (string)($row['name'] ?? ''),
- 'mime' => (string)($row['mime'] ?? ''),
- 'size' => (int)($row['size_bytes'] ?? 0),
- ];
-}
-
-function fetchAttachmentMap(PDO $appDb, array $messageIds): array
-{
- $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds))));
- if (!$messageIds) {
- return [];
- }
-
- ensureWebImAppTables();
- $statement = $appDb->prepare(
- 'select `message_uid`, `attachment_type`, `url`, `name`, `mime`, `size_bytes`'
- . ' from `t_web_message_attachments`'
- . ' where `message_uid` in (' . placeholders($messageIds) . ')'
- );
- $statement->execute($messageIds);
-
- $attachments = [];
- foreach ($statement->fetchAll() as $row) {
- $attachments[(string)$row['message_uid']] = normalizeAttachmentRow($row);
- }
-
- return $attachments;
-}
-
-function attachmentFallbackText(?array $attachment): string
-{
- if (!$attachment) {
- return '';
- }
- if ((string)$attachment['type'] === 'image') {
- return '[图片]';
- }
-
- return '[文件] ' . ((string)($attachment['name'] ?? '') ?: '文件');
-}
-
-function attachmentDisplayText(string $text, ?array $attachment): string
-{
- if (!$attachment) {
- return $text;
- }
-
- return $text === attachmentFallbackText($attachment) ? '' : $text;
-}
-
-function messagePreviewText(?array $message): string
-{
- if (!$message) {
- return '';
- }
- $attachment = is_array($message['attachment'] ?? null) ? $message['attachment'] : null;
- if ($attachment) {
- $text = trim((string)($message['text'] ?? ''));
- return $text !== '' ? $text : attachmentFallbackText($attachment);
- }
-
- return (string)($message['text'] ?? '');
-}
-
-function fetchUserInfoMap(PDO $db, array $userIds, string $ownerId = ''): array
-{
- $userIds = array_values(array_unique(array_filter(array_map('strval', $userIds))));
- if (!$userIds) {
- return [];
- }
-
- $statement = $db->prepare(
- 'select `_uid`, `_name`, `_display_name`, `_mobile`, `_portrait`, `_address` from `t_user`'
- . ' where `_uid` in (' . placeholders($userIds) . ')'
- );
- $statement->execute($userIds);
-
- $users = [];
- foreach ($statement->fetchAll() as $row) {
- $row['_is_friend'] = false;
- $row['_alias'] = '';
- $row['_friend_alias'] = '';
- $row['_remark_alias'] = '';
- $users[(string)$row['_uid']] = $row;
- }
-
- if ($ownerId !== '') {
- $aliasStatement = $db->prepare(
- 'select `_friend_uid`, `_alias` from `t_friend` where `_uid` = ?'
- . ' and `_friend_uid` in (' . placeholders($userIds) . ')'
- );
- $aliasStatement->execute(array_merge([$ownerId], $userIds));
- foreach ($aliasStatement->fetchAll() as $row) {
- $friendUid = (string)$row['_friend_uid'];
- if (!isset($users[$friendUid])) {
- continue;
- }
- $users[$friendUid]['_is_friend'] = true;
- $users[$friendUid]['_friend_alias'] = trim((string)($row['_alias'] ?? ''));
- }
-
- try {
- ensureWebImAppTables();
- $remarkMap = fetchWebUserRemarkMap(imAppDb(), $ownerId, $userIds);
- } catch (Throwable) {
- $remarkMap = [];
- }
- foreach ($remarkMap as $targetUid => $alias) {
- if (!isset($users[$targetUid])) {
- continue;
- }
- $users[$targetUid]['_remark_alias'] = $alias;
- }
-
- foreach ($users as $uid => $user) {
- $friendAlias = trim((string)($user['_friend_alias'] ?? ''));
- $remarkAlias = trim((string)($user['_remark_alias'] ?? ''));
- $users[$uid]['_alias'] = $friendAlias !== '' ? $friendAlias : $remarkAlias;
- }
- }
-
- return $users;
-}
-
-function userTitle(array $users, string $userId): string
-{
- $user = $users[$userId] ?? null;
- if (!$user) {
- return $userId;
- }
-
- return (string)($user['_alias'] ?? '')
- ?: (string)($user['_display_name'] ?? '')
- ?: (string)($user['_name'] ?? '')
- ?: (string)($user['_mobile'] ?? '')
- ?: $userId;
-}
-
-function loadPeerReceiptState(PDO $db, string $currentUserId, string $peerId): array
-{
- $deliveryStatement = $db->prepare('select `_dt` from `t_delivery_report` where `_uid` = ? limit 1');
- $deliveryStatement->execute([$peerId]);
- $deliveredAt = $deliveryStatement->fetchColumn();
-
- $readTargets = array_values(array_unique([
- $currentUserId,
- $currentUserId . '|' . $peerId,
- $peerId . '|' . $currentUserId,
- ]));
- $readStatement = $db->prepare(
- 'select max(`_dt`) from `t_read_report`'
- . ' where `_uid` = ? and `_type` = 0 and `_line` = 0'
- . ' and `_target` in (' . placeholders($readTargets) . ')'
- );
- $readStatement->execute(array_merge([$peerId], $readTargets));
- $readAt = $readStatement->fetchColumn();
-
- return [
- 'deliveredAt' => is_numeric($deliveredAt) ? (int)$deliveredAt : 0,
- 'readAt' => is_numeric($readAt) ? (int)$readAt : 0,
- ];
-}
-
-function loadOwnReadStateMap(PDO $db, string $userId, array $peerIds): array
-{
- $peerIds = array_values(array_unique(array_filter(array_map('strval', $peerIds))));
- if (!$peerIds) {
- return [];
- }
-
- $statement = $db->prepare(
- 'select `_target`, max(`_dt`) as `_read_at` from `t_read_report`'
- . ' where `_uid` = ? and `_type` = 0 and `_line` = 0'
- . ' and `_target` in (' . placeholders($peerIds) . ')'
- . ' group by `_target`'
- );
- $statement->execute(array_merge([$userId], $peerIds));
-
- $readAtByPeer = [];
- foreach ($statement->fetchAll() as $row) {
- $readAtByPeer[(string)$row['_target']] = (int)$row['_read_at'];
- }
-
- return $readAtByPeer;
-}
-
-function outgoingDeliveryStatus(int $timestamp, array $receiptState): string
-{
- $readAt = (int)($receiptState['readAt'] ?? 0);
- if ($readAt > 0 && $timestamp <= $readAt) {
- return 'read';
- }
-
- $deliveredAt = (int)($receiptState['deliveredAt'] ?? 0);
- if ($deliveredAt > 0 && $timestamp <= $deliveredAt) {
- return 'delivered';
- }
-
- return 'sent';
-}
-
-function messageActivityTimestamp(int $timestamp, array $editState = []): int
-{
- return max($timestamp, (int)($editState['editedAt'] ?? 0));
-}
-
-function normalizeConversationType(mixed $value): string
-{
- $type = strtolower(trim((string)$value));
- if (in_array($type, ['1', 'group', 'channel'], true)) {
- return 'group';
- }
-
- return 'single';
-}
-
-function isWebGroupTarget(PDO $appDb, string $targetId): bool
-{
- if ($targetId === '') {
- return false;
- }
-
- ensureWebImAppTables();
- $statement = $appDb->prepare('select 1 from `t_web_groups` where `group_id` = ? and `deleted` = 0 limit 1');
- $statement->execute([$targetId]);
-
- return (bool)$statement->fetchColumn();
-}
-
-function markWebGroupRead(PDO $appDb, string $userId, string $groupId, int $timestamp): void
-{
- if ($userId === '' || $groupId === '' || $timestamp <= 0) {
- return;
- }
-
- $now = nowMs();
- $statement = $appDb->prepare(
- 'insert into `t_web_group_reads` (`group_id`, `user_id`, `read_at_ms`, `updated_at_ms`)'
- . ' values (?, ?, ?, ?)'
- . ' on duplicate key update'
- . ' `read_at_ms` = if(`read_at_ms` < values(`read_at_ms`), values(`read_at_ms`), `read_at_ms`),'
- . ' `updated_at_ms` = values(`updated_at_ms`)'
- );
- $statement->execute([$groupId, $userId, $timestamp, $now]);
-}
-
-function webGroupRole(PDO $appDb, string $userId, string $groupId): string
-{
- $statement = $appDb->prepare(
- 'select `role` from `t_web_group_members`'
- . ' where `group_id` = ? and `user_id` = ? and `status` = 0 limit 1'
- );
- $statement->execute([$groupId, $userId]);
- $role = $statement->fetchColumn();
-
- return is_string($role) && $role !== '' ? $role : '';
-}
-
-function formatWebGroupMessage(
- array $row,
- string $currentUserId,
- array $group,
- ?array $attachment = null,
- array $users = []
-): array
-{
- $groupId = (string)$row['group_id'];
- $from = (string)$row['sender_uid'];
- $senderUser = $users[$from] ?? [];
- $senderAlias = trim((string)($row['sender_alias'] ?? ''));
- $senderContactAlias = trim((string)($senderUser['_alias'] ?? ''));
- $senderFriendAlias = trim((string)($senderUser['_friend_alias'] ?? ''));
- $senderRemarkAlias = trim((string)($senderUser['_remark_alias'] ?? ''));
- $senderRawName = trim((string)($senderUser['_display_name'] ?? ''))
- ?: trim((string)($senderUser['_name'] ?? ''))
- ?: trim((string)($senderUser['_mobile'] ?? ''))
- ?: $from;
- $senderName = $senderContactAlias
- ?: $senderAlias
- ?: $senderRawName;
- $senderRole = (string)($row['sender_role'] ?? 'member');
- if (!in_array($senderRole, ['owner', 'admin'], true)) {
- $senderRole = 'member';
- }
- $timestamp = (int)$row['created_at_ms'];
- $editedAt = (int)($row['edited_at_ms'] ?? 0);
- $activityTimestamp = max($timestamp, $editedAt);
- $direction = $from === $currentUserId ? 'out' : 'in';
-
- $messageType = $attachment ? (string)$attachment['type'] : 'text';
- $contentType = $messageType === 'image' ? 3 : ($messageType === 'file' ? 5 : 1);
- return [
- 'id' => (string)$row['message_uid'],
- 'messageUid' => (string)$row['message_uid'],
- 'conversationId' => 'group-' . $groupId,
- 'from' => $from,
- 'senderRole' => $senderRole,
- 'senderName' => $senderName,
- 'senderPortrait' => (string)($senderUser['_portrait'] ?? ''),
- 'senderProfile' => [
- 'uid' => $from,
- 'displayName' => $senderName,
- 'rawName' => $senderRawName,
- 'contactAlias' => $senderContactAlias,
- 'friendAlias' => $senderFriendAlias,
- 'remarkAlias' => $senderRemarkAlias,
- 'groupAlias' => $senderAlias,
- 'isContact' => (bool)($senderUser['_is_friend'] ?? false),
- 'mobile' => (string)($senderUser['_mobile'] ?? ''),
- 'address' => (string)($senderUser['_address'] ?? ''),
- 'portrait' => (string)($senderUser['_portrait'] ?? ''),
- 'role' => $senderRole,
- ],
- 'to' => $groupId,
- 'target' => $groupId,
- 'direction' => $direction,
- 'type' => $messageType,
- 'contentType' => $contentType,
- 'text' => attachmentDisplayText((string)$row['text'], $attachment),
- 'attachment' => $attachment,
- 'status' => $direction === 'out' ? 'sent' : 'sent',
- 'deliveryStatus' => $direction === 'out' ? 'sent' : '',
- 'recalled' => false,
- 'recallStatus' => '',
- 'editedAt' => $editedAt,
- 'timestamp' => $timestamp,
- 'activityTimestamp' => $activityTimestamp,
- 'displayTimestamp' => $timestamp,
- 'conversationType' => (string)($group['category'] ?? 'group'),
- ];
-}
-
-function loadWebGroupMessages(PDO $appDb, string $userId, string $groupId, int $limit, bool $markRead): array
-{
- ensureWebImAppTables();
- $role = webGroupRole($appDb, $userId, $groupId);
- if ($role === '') {
- return [];
- }
-
- $groupStatement = $appDb->prepare('select * from `t_web_groups` where `group_id` = ? and `deleted` = 0 limit 1');
- $groupStatement->execute([$groupId]);
- $group = $groupStatement->fetch();
- if (!$group) {
- return [];
- }
-
- $statement = $appDb->prepare(
- 'select msg.*,'
- . ' coalesce(sender_member.`role`, if(g.`owner_uid` = msg.`sender_uid`, "owner", "member")) as `sender_role`,'
- . ' coalesce(sender_member.`alias`, "") as `sender_alias`'
- . ' from `t_web_group_messages` msg'
- . ' join `t_web_groups` g on g.`group_id` = msg.`group_id` and g.`deleted` = 0'
- . ' left join `t_web_group_members` sender_member'
- . ' on sender_member.`group_id` = msg.`group_id`'
- . ' and sender_member.`user_id` = msg.`sender_uid`'
- . ' and sender_member.`status` = 0'
- . ' where msg.`group_id` = ? and msg.`recalled` = 0'
- . ' order by msg.`created_at_ms` desc, msg.`id` desc limit ' . $limit
- );
- $statement->execute([$groupId]);
- $rows = array_reverse($statement->fetchAll());
- $attachmentMap = fetchAttachmentMap($appDb, array_column($rows, 'message_uid'));
- $users = fetchUserInfoMap(imDb(), array_column($rows, 'sender_uid'), $userId);
-
- $readTimestamp = 0;
- $messages = [];
- foreach ($rows as $row) {
- $messageId = (string)$row['message_uid'];
- $message = formatWebGroupMessage($row, $userId, $group, $attachmentMap[$messageId] ?? null, $users);
- $readTimestamp = max($readTimestamp, (int)$message['activityTimestamp']);
- $messages[] = $message;
- }
-
- if ($markRead) {
- markWebGroupRead($appDb, $userId, $groupId, $readTimestamp);
- }
-
- return $messages;
-}
-
-function loadWebGroupConversations(PDO $appDb, string $userId, int $limit): array
-{
- ensureWebImAppTables();
- $statement = $appDb->prepare(
- 'select g.*, m.`role`'
- . ' from `t_web_groups` g'
- . ' join `t_web_group_members` m on m.`group_id` = g.`group_id` and m.`status` = 0'
- . ' where g.`deleted` = 0 and m.`user_id` = ?'
- . ' order by g.`updated_at_ms` desc limit ' . min(max($limit, 50), 100)
- );
- $statement->execute([$userId]);
- $groups = $statement->fetchAll();
- if (!$groups) {
- return [];
- }
-
- $lastMessageStatement = $appDb->prepare(
- 'select * from `t_web_group_messages`'
- . ' where `group_id` = ? and `recalled` = 0'
- . ' order by greatest(`created_at_ms`, `edited_at_ms`) desc, `id` desc limit 1'
- );
- $readStatement = $appDb->prepare(
- 'select `read_at_ms` from `t_web_group_reads` where `group_id` = ? and `user_id` = ? limit 1'
- );
- $lastAttachmentStatement = $appDb->prepare(
- 'select `attachment_type`, `url`, `name`, `mime`, `size_bytes`'
- . ' from `t_web_message_attachments` where `message_uid` = ? limit 1'
- );
- $unreadStatement = $appDb->prepare(
- 'select count(*) from `t_web_group_messages`'
- . ' where `group_id` = ? and `sender_uid` <> ? and `recalled` = 0'
- . ' and greatest(`created_at_ms`, `edited_at_ms`) > ?'
- );
- $memberCountStatement = $appDb->prepare(
- 'select count(*) from `t_web_group_members` where `group_id` = ? and `status` = 0'
- );
-
- $conversations = [];
- foreach ($groups as $group) {
- $groupId = (string)$group['group_id'];
- $lastMessageStatement->execute([$groupId]);
- $lastMessage = $lastMessageStatement->fetch();
- $readStatement->execute([$groupId, $userId]);
- $readAt = (int)($readStatement->fetchColumn() ?: 0);
- $unreadStatement->execute([$groupId, $userId, $readAt]);
- $unread = (int)$unreadStatement->fetchColumn();
- $memberCountStatement->execute([$groupId]);
- $memberCount = (int)$memberCountStatement->fetchColumn();
-
- $title = (string)$group['name'];
- $category = (string)$group['category'];
- $isChannel = $category === 'channel';
- $lastAttachment = null;
- if ($lastMessage) {
- $lastAttachmentStatement->execute([(string)$lastMessage['message_uid']]);
- $lastAttachmentRow = $lastAttachmentStatement->fetch();
- $lastAttachment = $lastAttachmentRow ? normalizeAttachmentRow($lastAttachmentRow) : null;
- }
- $subtitle = $lastMessage
- ? (messagePreviewText([
- 'text' => attachmentDisplayText((string)$lastMessage['text'], $lastAttachment),
- 'attachment' => $lastAttachment,
- ]) ?: (string)$lastMessage['text'])
- : ($isChannel ? '公告群' : ($memberCount > 0 ? $memberCount . ' 位成员' : '群组'));
- $updatedAt = $lastMessage
- ? max((int)$lastMessage['created_at_ms'], (int)($lastMessage['edited_at_ms'] ?? 0))
- : (int)$group['updated_at_ms'];
-
- $conversations[] = [
- 'id' => 'group-' . $groupId,
- 'type' => $isChannel ? 'channel' : 'group',
- 'target' => $groupId,
- 'title' => $title,
- 'subtitle' => $subtitle,
- 'unread' => $unread,
- 'avatarText' => mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8'),
- 'updatedAt' => $updatedAt,
- 'role' => (string)$group['role'],
- 'memberCount' => $memberCount,
- 'raw' => [
- 'type' => 'group',
- 'target' => $groupId,
- 'line' => 0,
- 'category' => $category,
- 'role' => (string)$group['role'],
- ],
- ];
- }
-
- return $conversations;
-}
-
-function isRecallMessage(array $row): bool
-{
- return (int)($row['_content_type'] ?? 0) === 80;
-}
-
-function shouldDisplayMessageForUser(array $row, string $currentUserId): bool
-{
- if (!isRecallMessage($row)) {
- return true;
- }
-
- return (string)$row['_from'] === $currentUserId;
-}
-
-function formatMessage(
- array $row,
- string $currentUserId,
- string $peerId,
- array $receiptState = [],
- array $editState = [],
- ?array $attachment = null
-): array
-{
- $messageId = (string)$row['_mid'];
- $from = (string)$row['_from'];
- $contentType = (int)($row['_content_type'] ?? 0);
- $isRecalled = $contentType === 80;
- $text = (string)($row['_searchable_key'] ?? '');
- $timestamp = timestampMs((string)($row['_dt'] ?? ''), $messageId);
- $direction = $from === $currentUserId ? 'out' : 'in';
- $messageType = $attachment ? (string)$attachment['type'] : (($contentType === 1 || $isRecalled) ? 'text' : 'unknown');
- $messageText = $text !== '' ? $text : ($isRecalled || $attachment ? '' : '[暂不支持的消息类型]');
- $messageText = attachmentDisplayText($messageText, $attachment);
- $editedAt = (int)($editState['editedAt'] ?? 0);
- $activityTimestamp = messageActivityTimestamp($timestamp, $editState);
- $deliveryStatus = $direction === 'out' && !$isRecalled
- ? outgoingDeliveryStatus($activityTimestamp, $receiptState)
- : '';
-
- return [
- 'id' => $messageId,
- 'messageUid' => $messageId,
- 'conversationId' => 'single-' . $peerId,
- 'from' => $from,
- 'to' => $from === $currentUserId ? $peerId : $currentUserId,
- 'target' => $peerId,
- 'direction' => $direction,
- 'type' => $messageType,
- 'contentType' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : 5) : $contentType,
- 'text' => $messageText,
- 'attachment' => $attachment,
- 'status' => $isRecalled && $direction === 'out' ? 'recalled' : ($direction === 'out' ? $deliveryStatus : 'sent'),
- 'deliveryStatus' => $deliveryStatus,
- 'recalled' => $isRecalled,
- 'recallStatus' => $isRecalled ? '已撤回' : '',
- 'editedAt' => $editedAt,
- 'timestamp' => $timestamp,
- 'activityTimestamp' => $activityTimestamp,
- 'displayTimestamp' => $timestamp,
- ];
-}
-
-function loadConversationMessages(PDO $db, string $userId, string $targetId, int $limit, bool $markRead): array
-{
- $table = imUserMessagesTable($userId);
- $conversationKeys = [$userId . '|' . $targetId, $targetId . '|' . $userId];
- $scanLimit = min(max($limit * 4, $limit), 400);
- $statement = $db->prepare(
- 'select `_mid`, `_dt` from `' . $table . '`'
- . ' where `_uid` = ? and `_type` = 0 and `_line` = 0'
- . ' and `_target` in (?, ?)'
- . ' order by `_mid` desc limit ' . $scanLimit
- );
- $statement->execute([$userId, $conversationKeys[0], $conversationKeys[1]]);
- $userRows = $statement->fetchAll();
- $messageRows = fetchMessageRows($db, array_column($userRows, '_mid'));
- $editMap = fetchMessageEditMap($db, array_column($userRows, '_mid'));
- $attachmentMap = fetchAttachmentMap(imAppDb(), array_column($userRows, '_mid'));
- $receiptState = loadPeerReceiptState($db, $userId, $targetId);
-
- $messages = [];
- $seenMessageIds = [];
- $readTimestamp = 0;
- foreach ($userRows as $userRow) {
- $messageId = (string)$userRow['_mid'];
- if (isset($seenMessageIds[$messageId]) || !isset($messageRows[$messageId])) {
- continue;
- }
- $seenMessageIds[$messageId] = true;
- if (!shouldDisplayMessageForUser($messageRows[$messageId], $userId)) {
- continue;
- }
- $message = formatMessage(
- $messageRows[$messageId],
- $userId,
- $targetId,
- $receiptState,
- $editMap[$messageId] ?? [],
- $attachmentMap[$messageId] ?? null
- );
- $messages[] = $message;
- $readTimestamp = max($readTimestamp, (int)$message['activityTimestamp']);
- if (count($messages) >= $limit) {
- break;
- }
- }
- $messages = array_reverse($messages);
-
- if ($markRead) {
- markConversationRead($db, $userId, $targetId, $readTimestamp);
- }
-
- return $messages;
-}
-
-function loadRecentConversations(PDO $db, string $userId, int $limit): array
-{
- $table = imUserMessagesTable($userId);
- $scanLimit = min(max($limit * 20, 200), 1000);
- $statement = $db->prepare(
- 'select `_mid`, `_target`, `_dt` from `' . $table . '`'
- . ' where `_uid` = ? and `_type` = 0 and `_line` = 0'
- . ' order by `_mid` desc limit ' . $scanLimit
- );
- $statement->execute([$userId]);
-
- $scanRows = $statement->fetchAll();
- $messageRows = fetchMessageRows($db, array_column($scanRows, '_mid'));
- $editMap = fetchMessageEditMap($db, array_column($scanRows, '_mid'));
- $attachmentMap = fetchAttachmentMap(imAppDb(), array_column($scanRows, '_mid'));
- $latestByPeer = [];
- foreach ($scanRows as $row) {
- $messageId = (string)$row['_mid'];
- $message = $messageRows[$messageId] ?? null;
- $peerId = peerFromConversationTarget($userId, (string)$row['_target']);
- if ($peerId === '' || !$message) {
- continue;
- }
- if (!shouldDisplayMessageForUser($message, $userId)) {
- continue;
- }
- $activityTimestamp = messageActivityTimestamp(
- timestampMs((string)($message['_dt'] ?? ''), $messageId),
- $editMap[$messageId] ?? []
- );
- if (!isset($latestByPeer[$peerId]) || $activityTimestamp > (int)($latestByPeer[$peerId]['_activity_at'] ?? 0)) {
- $row['_activity_at'] = $activityTimestamp;
- $latestByPeer[$peerId] = $row;
- }
- }
- uasort($latestByPeer, static fn($a, $b) => (int)($b['_activity_at'] ?? 0) <=> (int)($a['_activity_at'] ?? 0));
- $latestByPeer = array_slice($latestByPeer, 0, $limit, true);
-
- $users = fetchUserInfoMap($db, array_keys($latestByPeer), $userId);
- $readAtByPeer = loadOwnReadStateMap($db, $userId, array_keys($latestByPeer));
- $unreadByPeer = [];
- $seenUnreadMessageIds = [];
-
- foreach ($scanRows as $row) {
- $messageId = (string)$row['_mid'];
- if (isset($seenUnreadMessageIds[$messageId])) {
- continue;
- }
- $seenUnreadMessageIds[$messageId] = true;
- $peerId = peerFromConversationTarget($userId, (string)$row['_target']);
- $message = $messageRows[$messageId] ?? null;
- if ($peerId === '' || !$message || !isset($latestByPeer[$peerId])) {
- continue;
- }
- if ((string)$message['_from'] === $userId) {
- continue;
- }
- if (isRecallMessage($message)) {
- continue;
- }
- $timestamp = timestampMs((string)($message['_dt'] ?? ''), $messageId);
- $activityTimestamp = messageActivityTimestamp($timestamp, $editMap[$messageId] ?? []);
- if ($activityTimestamp > (int)($readAtByPeer[$peerId] ?? 0)) {
- $unreadByPeer[$peerId] = (int)($unreadByPeer[$peerId] ?? 0) + 1;
- }
- }
-
- $conversations = [];
-
- foreach ($latestByPeer as $peerId => $userRow) {
- $messageId = (string)$userRow['_mid'];
- $message = isset($messageRows[$messageId])
- ? formatMessage($messageRows[$messageId], $userId, $peerId, [], $editMap[$messageId] ?? [], $attachmentMap[$messageId] ?? null)
- : null;
- $title = userTitle($users, $peerId);
- $conversations[] = [
- 'id' => 'single-' . $peerId,
- 'type' => 'single',
- 'target' => $peerId,
- 'title' => $title,
- 'subtitle' => $message ? (messagePreviewText($message) !== '' ? messagePreviewText($message) : (empty($message['recalled']) ? '' : '已撤回')) : '',
- 'unread' => (int)($unreadByPeer[$peerId] ?? 0),
- 'portrait' => (string)($users[$peerId]['_portrait'] ?? ''),
- 'avatarText' => mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8'),
- 'updatedAt' => $message ? $message['activityTimestamp'] : timestampMs((string)($userRow['_dt'] ?? ''), $messageId),
- 'raw' => ['type' => 'single', 'target' => $peerId, 'line' => 0],
- ];
- }
-
- try {
- $conversations = array_merge($conversations, loadWebGroupConversations(imAppDb(), $userId, $limit));
- } catch (Throwable) {
- // Keep single-chat sync available if appdata group metadata is temporarily unavailable.
- }
-
- usort($conversations, static fn($a, $b) => $b['updatedAt'] <=> $a['updatedAt']);
-
- return array_slice($conversations, 0, $limit);
-}
-
-$payload = readJsonPayload();
-$userId = trim((string)($payload['userId'] ?? ''));
-$target = trim((string)($payload['target'] ?? ''));
-$limit = clampLimit($payload['limit'] ?? 50, 50, 100);
-$markRead = payloadBool($payload['markRead'] ?? false);
-$conversationType = normalizeConversationType($payload['conversationType'] ?? $payload['type'] ?? 0);
-
-if ($userId === '') {
- respond(400, '缺少用户ID');
-}
-
-try {
- $db = imDb();
- $userId = resolveUserId($db, $userId);
- markUserDelivered($db, $userId, nowMs());
-
- if ($target !== '') {
- $targetId = resolveUserId($db, $target);
- if ($conversationType === 'group' || isWebGroupTarget(imAppDb(), $target)) {
- respond(0, 'success', [
- 'messages' => loadWebGroupMessages(imAppDb(), $userId, $target, $limit, $markRead),
- ]);
- }
- respond(0, 'success', [
- 'messages' => loadConversationMessages($db, $userId, $targetId, $limit, $markRead),
- ]);
- }
-
- respond(0, 'success', [
- 'conversations' => loadRecentConversations($db, $userId, $limit),
- ]);
-} catch (Throwable $error) {
- respond(500, $error->getMessage() ?: '消息同步失败');
-}
+ 0) {
+ return ($id >> 21) + 1514736000000;
+ }
+
+ if ($datetime !== null && $datetime !== '') {
+ $date = DateTimeImmutable::createFromFormat(
+ 'Y-m-d H:i:s',
+ $datetime,
+ new DateTimeZone(IM_DB_TIMEZONE)
+ );
+ if ($date instanceof DateTimeImmutable) {
+ return $date->getTimestamp() * 1000;
+ }
+ }
+
+ return (int)floor(microtime(true) * 1000);
+}
+
+function nowMs(): int
+{
+ return (int)floor(microtime(true) * 1000);
+}
+
+function markUserDelivered(PDO $db, string $userId, int $timestamp): void
+{
+ if ($userId === '' || $timestamp <= 0) {
+ return;
+ }
+
+ $statement = $db->prepare(
+ 'insert into `t_delivery_report` (`_uid`, `_dt`) values (?, ?)'
+ . ' on duplicate key update `_dt` = if(`_dt` < values(`_dt`), values(`_dt`), `_dt`)'
+ );
+ $statement->execute([$userId, $timestamp]);
+}
+
+function markConversationRead(PDO $db, string $userId, string $targetId, int $timestamp): void
+{
+ if ($userId === '' || $targetId === '' || $timestamp <= 0) {
+ return;
+ }
+
+ $statement = $db->prepare(
+ 'select `id`, `_dt` from `t_read_report`'
+ . ' where `_uid` = ? and `_type` = 0 and `_line` = 0 and `_target` = ?'
+ . ' order by `_dt` desc limit 1'
+ );
+ $statement->execute([$userId, $targetId]);
+ $row = $statement->fetch();
+
+ if ($row) {
+ if ($timestamp > (int)$row['_dt']) {
+ $update = $db->prepare('update `t_read_report` set `_dt` = ? where `id` = ?');
+ $update->execute([$timestamp, (int)$row['id']]);
+ }
+ return;
+ }
+
+ $insert = $db->prepare(
+ 'insert into `t_read_report` (`_uid`, `_type`, `_line`, `_target`, `_dt`) values (?, 0, 0, ?, ?)'
+ );
+ $insert->execute([$userId, $targetId, $timestamp]);
+}
+
+function resolveUserId(PDO $db, string $value): string
+{
+ if ($value === '') {
+ return '';
+ }
+
+ $statement = $db->prepare(
+ 'select `_uid` from `t_user` where `_uid` = ? or `_mobile` = ? or `_name` = ? limit 1'
+ );
+ $statement->execute([$value, $value, $value]);
+ $uid = $statement->fetchColumn();
+
+ return is_string($uid) && $uid !== '' ? $uid : $value;
+}
+
+function peerFromConversationTarget(string $userId, string $target): string
+{
+ $parts = array_values(array_filter(explode('|', $target), static fn($part) => $part !== ''));
+ if (count($parts) < 2) {
+ return $target !== $userId ? $target : '';
+ }
+
+ return $parts[0] === $userId ? $parts[1] : $parts[0];
+}
+
+function fetchMessageRows(PDO $db, array $messageIds): array
+{
+ $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds))));
+ if (!$messageIds) {
+ return [];
+ }
+
+ $idsByTable = [];
+ foreach ($messageIds as $messageId) {
+ $idsByTable[imMessageTable($messageId)][] = $messageId;
+ }
+
+ $messages = [];
+ foreach ($idsByTable as $table => $ids) {
+ $sql = 'select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_searchable_key`, `_dt`, `_content_type`, `_to`'
+ . ' from `' . $table . '` where `_mid` in (' . placeholders($ids) . ')';
+ $statement = $db->prepare($sql);
+ $statement->execute($ids);
+ foreach ($statement->fetchAll() as $row) {
+ $messages[(string)$row['_mid']] = $row;
+ }
+ }
+
+ return $messages;
+}
+
+function fetchMessageEditMap(PDO $db, array $messageIds): array
+{
+ $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds))));
+ if (!$messageIds) {
+ return [];
+ }
+
+ try {
+ $statement = $db->prepare(
+ 'select `message_uid`, `edited_at_ms` from `t_web_message_edits`'
+ . ' where `message_uid` in (' . placeholders($messageIds) . ')'
+ );
+ $statement->execute($messageIds);
+ } catch (Throwable) {
+ return [];
+ }
+
+ $edits = [];
+ foreach ($statement->fetchAll() as $row) {
+ $edits[(string)$row['message_uid']] = [
+ 'editedAt' => (int)$row['edited_at_ms'],
+ ];
+ }
+
+ return $edits;
+}
+
+function normalizeAttachmentRow(array $row): array
+{
+ return [
+ 'type' => (string)$row['attachment_type'],
+ 'url' => (string)$row['url'],
+ 'name' => (string)($row['name'] ?? ''),
+ 'mime' => (string)($row['mime'] ?? ''),
+ 'size' => (int)($row['size_bytes'] ?? 0),
+ ];
+}
+
+function fetchAttachmentMap(PDO $appDb, array $messageIds): array
+{
+ $messageIds = array_values(array_unique(array_filter(array_map('strval', $messageIds))));
+ if (!$messageIds) {
+ return [];
+ }
+
+ ensureWebImAppTables();
+ $statement = $appDb->prepare(
+ 'select `message_uid`, `attachment_type`, `url`, `name`, `mime`, `size_bytes`'
+ . ' from `t_web_message_attachments`'
+ . ' where `message_uid` in (' . placeholders($messageIds) . ')'
+ );
+ $statement->execute($messageIds);
+
+ $attachments = [];
+ foreach ($statement->fetchAll() as $row) {
+ $attachments[(string)$row['message_uid']] = normalizeAttachmentRow($row);
+ }
+
+ return $attachments;
+}
+
+function attachmentFallbackText(?array $attachment): string
+{
+ if (!$attachment) {
+ return '';
+ }
+ if ((string)$attachment['type'] === 'image') {
+ return '[图片]';
+ }
+ if ((string)$attachment['type'] === 'video') {
+ return '[视频]';
+ }
+
+ return '[文件] ' . ((string)($attachment['name'] ?? '') ?: '文件');
+}
+
+function attachmentDisplayText(string $text, ?array $attachment): string
+{
+ if (!$attachment) {
+ return $text;
+ }
+
+ return $text === attachmentFallbackText($attachment) ? '' : $text;
+}
+
+function messagePreviewText(?array $message): string
+{
+ if (!$message) {
+ return '';
+ }
+ $attachment = is_array($message['attachment'] ?? null) ? $message['attachment'] : null;
+ $contentType = (int)($message['contentType'] ?? 0);
+ $messageType = (string)($message['type'] ?? '');
+ $placeholderIsImage = $contentType === 3 || $messageType === 'image';
+ $text = trim((string)($message['text'] ?? ''));
+ if ($contentType !== 1 && $text === '[暂不支持的消息类型]') {
+ $text = '';
+ }
+ if ($placeholderIsImage && ($text === '[图片]' || $text === '图片')) {
+ $text = '';
+ }
+ if ($attachment) {
+ return $text !== '' ? $text : attachmentFallbackText($attachment);
+ }
+
+ return $text;
+}
+
+function fetchUserInfoMap(PDO $db, array $userIds, string $ownerId = ''): array
+{
+ $userIds = array_values(array_unique(array_filter(array_map('strval', $userIds))));
+ if (!$userIds) {
+ return [];
+ }
+
+ $statement = $db->prepare(
+ 'select `_uid`, `_name`, `_display_name`, `_mobile`, `_portrait`, `_address` from `t_user`'
+ . ' where `_uid` in (' . placeholders($userIds) . ')'
+ );
+ $statement->execute($userIds);
+
+ $users = [];
+ foreach ($statement->fetchAll() as $row) {
+ $row['_is_friend'] = false;
+ $row['_alias'] = '';
+ $row['_friend_alias'] = '';
+ $row['_remark_alias'] = '';
+ $users[(string)$row['_uid']] = $row;
+ }
+
+ if ($ownerId !== '') {
+ $aliasStatement = $db->prepare(
+ 'select `_friend_uid`, `_alias` from `t_friend` where `_uid` = ?'
+ . ' and `_friend_uid` in (' . placeholders($userIds) . ')'
+ );
+ $aliasStatement->execute(array_merge([$ownerId], $userIds));
+ foreach ($aliasStatement->fetchAll() as $row) {
+ $friendUid = (string)$row['_friend_uid'];
+ if (!isset($users[$friendUid])) {
+ continue;
+ }
+ $users[$friendUid]['_is_friend'] = true;
+ $users[$friendUid]['_friend_alias'] = trim((string)($row['_alias'] ?? ''));
+ }
+
+ try {
+ ensureWebImAppTables();
+ $remarkMap = fetchWebUserRemarkMap(imAppDb(), $ownerId, $userIds);
+ } catch (Throwable) {
+ $remarkMap = [];
+ }
+ foreach ($remarkMap as $targetUid => $alias) {
+ if (!isset($users[$targetUid])) {
+ continue;
+ }
+ $users[$targetUid]['_remark_alias'] = $alias;
+ }
+
+ foreach ($users as $uid => $user) {
+ $friendAlias = trim((string)($user['_friend_alias'] ?? ''));
+ $remarkAlias = trim((string)($user['_remark_alias'] ?? ''));
+ $users[$uid]['_alias'] = $friendAlias !== '' ? $friendAlias : $remarkAlias;
+ }
+ }
+
+ return $users;
+}
+
+function userTitle(array $users, string $userId): string
+{
+ $user = $users[$userId] ?? null;
+ if (!$user) {
+ return $userId;
+ }
+
+ return (string)($user['_alias'] ?? '')
+ ?: (string)($user['_display_name'] ?? '')
+ ?: (string)($user['_name'] ?? '')
+ ?: (string)($user['_mobile'] ?? '')
+ ?: $userId;
+}
+
+function loadPeerReceiptState(PDO $db, string $currentUserId, string $peerId): array
+{
+ $deliveryStatement = $db->prepare('select `_dt` from `t_delivery_report` where `_uid` = ? limit 1');
+ $deliveryStatement->execute([$peerId]);
+ $deliveredAt = $deliveryStatement->fetchColumn();
+
+ $readTargets = array_values(array_unique([
+ $currentUserId,
+ $currentUserId . '|' . $peerId,
+ $peerId . '|' . $currentUserId,
+ ]));
+ $readStatement = $db->prepare(
+ 'select max(`_dt`) from `t_read_report`'
+ . ' where `_uid` = ? and `_type` = 0 and `_line` = 0'
+ . ' and `_target` in (' . placeholders($readTargets) . ')'
+ );
+ $readStatement->execute(array_merge([$peerId], $readTargets));
+ $readAt = $readStatement->fetchColumn();
+
+ return [
+ 'deliveredAt' => is_numeric($deliveredAt) ? (int)$deliveredAt : 0,
+ 'readAt' => is_numeric($readAt) ? (int)$readAt : 0,
+ ];
+}
+
+function loadOwnReadStateMap(PDO $db, string $userId, array $peerIds): array
+{
+ $peerIds = array_values(array_unique(array_filter(array_map('strval', $peerIds))));
+ if (!$peerIds) {
+ return [];
+ }
+
+ $statement = $db->prepare(
+ 'select `_target`, max(`_dt`) as `_read_at` from `t_read_report`'
+ . ' where `_uid` = ? and `_type` = 0 and `_line` = 0'
+ . ' and `_target` in (' . placeholders($peerIds) . ')'
+ . ' group by `_target`'
+ );
+ $statement->execute(array_merge([$userId], $peerIds));
+
+ $readAtByPeer = [];
+ foreach ($statement->fetchAll() as $row) {
+ $readAtByPeer[(string)$row['_target']] = (int)$row['_read_at'];
+ }
+
+ return $readAtByPeer;
+}
+
+function outgoingDeliveryStatus(int $timestamp, array $receiptState): string
+{
+ $readAt = (int)($receiptState['readAt'] ?? 0);
+ if ($readAt > 0 && $timestamp <= $readAt) {
+ return 'read';
+ }
+
+ $deliveredAt = (int)($receiptState['deliveredAt'] ?? 0);
+ if ($deliveredAt > 0 && $timestamp <= $deliveredAt) {
+ return 'delivered';
+ }
+
+ return 'sent';
+}
+
+function messageActivityTimestamp(int $timestamp, array $editState = []): int
+{
+ return max($timestamp, (int)($editState['editedAt'] ?? 0));
+}
+
+function normalizeConversationType(mixed $value): string
+{
+ $type = strtolower(trim((string)$value));
+ if (in_array($type, ['1', 'group', 'channel'], true)) {
+ return 'group';
+ }
+
+ return 'single';
+}
+
+function isWebGroupTarget(PDO $appDb, string $targetId): bool
+{
+ if ($targetId === '') {
+ return false;
+ }
+
+ ensureWebImAppTables();
+ $statement = $appDb->prepare('select 1 from `t_web_groups` where `group_id` = ? and `deleted` = 0 limit 1');
+ $statement->execute([$targetId]);
+
+ return (bool)$statement->fetchColumn();
+}
+
+function nativeGroupRoleFromType(mixed $type): string
+{
+ $value = (int)$type;
+ if ($value === 2) {
+ return 'owner';
+ }
+ if ($value === 1) {
+ return 'admin';
+ }
+
+ return 'member';
+}
+
+function isNativeGroupTarget(PDO $db, string $targetId): bool
+{
+ if ($targetId === '') {
+ return false;
+ }
+
+ $statement = $db->prepare('select 1 from `t_group` where `_gid` = ? and `_deleted` = 0 limit 1');
+ $statement->execute([$targetId]);
+
+ return (bool)$statement->fetchColumn();
+}
+
+function nativeGroupRole(PDO $db, string $userId, string $groupId): string
+{
+ $statement = $db->prepare(
+ 'select `_type` from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1'
+ );
+ $statement->execute([$groupId, $userId]);
+ $type = $statement->fetchColumn();
+
+ return $type === false ? '' : nativeGroupRoleFromType($type);
+}
+
+function markWebGroupRead(PDO $appDb, string $userId, string $groupId, int $timestamp): void
+{
+ if ($userId === '' || $groupId === '' || $timestamp <= 0) {
+ return;
+ }
+
+ $now = nowMs();
+ $statement = $appDb->prepare(
+ 'insert into `t_web_group_reads` (`group_id`, `user_id`, `read_at_ms`, `updated_at_ms`)'
+ . ' values (?, ?, ?, ?)'
+ . ' on duplicate key update'
+ . ' `read_at_ms` = if(`read_at_ms` < values(`read_at_ms`), values(`read_at_ms`), `read_at_ms`),'
+ . ' `updated_at_ms` = values(`updated_at_ms`)'
+ );
+ $statement->execute([$groupId, $userId, $timestamp, $now]);
+}
+
+function markNativeGroupRead(PDO $db, string $userId, string $groupId, int $timestamp): void
+{
+ if ($userId === '' || $groupId === '' || $timestamp <= 0) {
+ return;
+ }
+
+ $statement = $db->prepare(
+ 'select `id`, `_dt` from `t_read_report`'
+ . ' where `_uid` = ? and `_type` = 1 and `_line` = 0 and `_target` = ?'
+ . ' order by `_dt` desc limit 1'
+ );
+ $statement->execute([$userId, $groupId]);
+ $row = $statement->fetch();
+
+ if ($row) {
+ if ($timestamp > (int)$row['_dt']) {
+ $update = $db->prepare('update `t_read_report` set `_dt` = ? where `id` = ?');
+ $update->execute([$timestamp, (int)$row['id']]);
+ }
+ return;
+ }
+
+ $insert = $db->prepare(
+ 'insert into `t_read_report` (`_uid`, `_type`, `_line`, `_target`, `_dt`) values (?, 1, 0, ?, ?)'
+ );
+ $insert->execute([$userId, $groupId, $timestamp]);
+}
+
+function webGroupRole(PDO $appDb, string $userId, string $groupId): string
+{
+ $statement = $appDb->prepare(
+ 'select `role` from `t_web_group_members`'
+ . ' where `group_id` = ? and `user_id` = ? and `status` = 0 limit 1'
+ );
+ $statement->execute([$groupId, $userId]);
+ $role = $statement->fetchColumn();
+
+ return is_string($role) && $role !== '' ? $role : '';
+}
+
+function loadNativeGroupReadStateMap(PDO $db, string $userId, array $groupIds): array
+{
+ $groupIds = array_values(array_unique(array_filter(array_map('strval', $groupIds))));
+ if ($userId === '' || !$groupIds) {
+ return [];
+ }
+
+ $statement = $db->prepare(
+ 'select `_target`, max(`_dt`) as `_read_at` from `t_read_report`'
+ . ' where `_uid` = ? and `_type` = 1 and `_line` = 0'
+ . ' and `_target` in (' . placeholders($groupIds) . ')'
+ . ' group by `_target`'
+ );
+ $statement->execute(array_merge([$userId], $groupIds));
+
+ $readAtByGroup = [];
+ foreach ($statement->fetchAll() as $row) {
+ $readAtByGroup[(string)$row['_target']] = (int)$row['_read_at'];
+ }
+
+ return $readAtByGroup;
+}
+
+function fetchNativeGroupMemberMap(PDO $db, string $groupId, array $userIds): array
+{
+ $userIds = array_values(array_unique(array_filter(array_map('strval', $userIds))));
+ if ($groupId === '' || !$userIds) {
+ return [];
+ }
+
+ $statement = $db->prepare(
+ 'select `_mid`, `_alias`, `_type`, `_dt`, `_create_dt` from `t_group_member`'
+ . ' where `_gid` = ? and `_mid` in (' . placeholders($userIds) . ')'
+ );
+ $statement->execute(array_merge([$groupId], $userIds));
+
+ $members = [];
+ foreach ($statement->fetchAll() as $row) {
+ $members[(string)$row['_mid']] = $row;
+ }
+
+ return $members;
+}
+
+function formatWebGroupMessage(
+ array $row,
+ string $currentUserId,
+ array $group,
+ ?array $attachment = null,
+ array $users = []
+): array
+{
+ $groupId = (string)$row['group_id'];
+ $from = (string)$row['sender_uid'];
+ $senderUser = $users[$from] ?? [];
+ $senderAlias = trim((string)($row['sender_alias'] ?? ''));
+ $senderContactAlias = trim((string)($senderUser['_alias'] ?? ''));
+ $senderFriendAlias = trim((string)($senderUser['_friend_alias'] ?? ''));
+ $senderRemarkAlias = trim((string)($senderUser['_remark_alias'] ?? ''));
+ $senderRawName = trim((string)($senderUser['_display_name'] ?? ''))
+ ?: trim((string)($senderUser['_name'] ?? ''))
+ ?: trim((string)($senderUser['_mobile'] ?? ''))
+ ?: $from;
+ $senderName = $senderContactAlias
+ ?: $senderAlias
+ ?: $senderRawName;
+ $senderRole = (string)($row['sender_role'] ?? 'member');
+ if (!in_array($senderRole, ['owner', 'admin'], true)) {
+ $senderRole = 'member';
+ }
+ $timestamp = (int)$row['created_at_ms'];
+ $editedAt = (int)($row['edited_at_ms'] ?? 0);
+ $activityTimestamp = max($timestamp, $editedAt);
+ $direction = $from === $currentUserId ? 'out' : 'in';
+
+ $messageType = $attachment ? (string)$attachment['type'] : 'text';
+ $contentType = $messageType === 'image' ? 3 : ($messageType === 'file' ? 5 : 1);
+ return [
+ 'id' => (string)$row['message_uid'],
+ 'messageUid' => (string)$row['message_uid'],
+ 'conversationId' => 'group-' . $groupId,
+ 'from' => $from,
+ 'senderRole' => $senderRole,
+ 'senderName' => $senderName,
+ 'senderPortrait' => (string)($senderUser['_portrait'] ?? ''),
+ 'senderProfile' => [
+ 'uid' => $from,
+ 'userId' => (string)($senderUser['_name'] ?? ''),
+ 'displayName' => $senderName,
+ 'rawName' => $senderRawName,
+ 'contactAlias' => $senderContactAlias,
+ 'friendAlias' => $senderFriendAlias,
+ 'remarkAlias' => $senderRemarkAlias,
+ 'groupAlias' => $senderAlias,
+ 'isContact' => (bool)($senderUser['_is_friend'] ?? false),
+ 'mobile' => (string)($senderUser['_mobile'] ?? ''),
+ 'address' => (string)($senderUser['_address'] ?? ''),
+ 'portrait' => (string)($senderUser['_portrait'] ?? ''),
+ 'role' => $senderRole,
+ ],
+ 'to' => $groupId,
+ 'target' => $groupId,
+ 'direction' => $direction,
+ 'type' => $messageType,
+ 'contentType' => $contentType,
+ 'text' => attachmentDisplayText((string)$row['text'], $attachment),
+ 'attachment' => $attachment,
+ 'status' => $direction === 'out' ? 'sent' : 'sent',
+ 'deliveryStatus' => $direction === 'out' ? 'sent' : '',
+ 'recalled' => false,
+ 'recallStatus' => '',
+ 'editedAt' => $editedAt,
+ 'timestamp' => $timestamp,
+ 'activityTimestamp' => $activityTimestamp,
+ 'displayTimestamp' => $timestamp,
+ 'conversationType' => (string)($group['category'] ?? 'group'),
+ ];
+}
+
+function cleanupNativeMediaUrl(string $url): string
+{
+ // WildFire's protobuf payload places the next field tag (0x40, "@")
+ // and a control byte immediately after remoteMediaUrl. Keep this helper
+ // defensive if it receives an unbounded match from older payloads.
+ $url = preg_replace('/[\x00-\x1F\x7F].*$/s', '', $url) ?? $url;
+ return rtrim($url, " \t\r\n\0\x0B\"'<>.,;)]}@");
+}
+
+function nativeMediaUrlScore(string $url): int
+{
+ $path = strtolower((string)(parse_url($url, PHP_URL_PATH) ?: $url));
+ $score = 0;
+ if (preg_match('/\.(?:jpe?g|png|gif|webp|bmp|avif)$/i', $path)) {
+ $score += 30;
+ }
+ if (preg_match('/\.(?:mp4|mov|m4v|webm|avi|mkv|3gp)$/i', $path)) {
+ $score += 30;
+ }
+ if (strpos($path, 'image') !== false || strpos($path, 'media') !== false || strpos($path, 'upload') !== false) {
+ $score += 5;
+ }
+ if (strpos($path, 'thumb') !== false || strpos($path, 'thumbnail') !== false) {
+ $score -= 10;
+ }
+
+ return $score;
+}
+
+function extractNativeMediaUrlFromData($data): string
+{
+ if (is_resource($data)) {
+ $data = stream_get_contents($data);
+ }
+ if (!is_string($data) || $data === '') {
+ return '';
+ }
+ if (!preg_match_all("~https?://[^\\s\"'<>\\x00-\\x1F\\x7F]+~i", $data, $matches)) {
+ return '';
+ }
+
+ $urls = [];
+ foreach ($matches[0] as $url) {
+ $url = cleanupNativeMediaUrl((string)$url);
+ if ($url !== '' && filter_var($url, FILTER_VALIDATE_URL)) {
+ $urls[$url] = $url;
+ }
+ }
+ if (!$urls) {
+ return '';
+ }
+
+ $urls = array_values($urls);
+ usort($urls, static function (string $left, string $right): int {
+ $scoreDelta = nativeMediaUrlScore($right) <=> nativeMediaUrlScore($left);
+ return $scoreDelta !== 0 ? $scoreDelta : strlen($right) <=> strlen($left);
+ });
+
+ return $urls[0] ?? '';
+}
+
+function nativeAttachmentName(string $url, string $type): string
+{
+ $path = (string)(parse_url($url, PHP_URL_PATH) ?: '');
+ $name = trim(rawurldecode((string)basename($path)));
+ if ($name !== '' && $name !== '.' && $name !== '/') {
+ return $name;
+ }
+
+ return $type === 'image' ? '图片' : ($type === 'video' ? '视频' : '文件');
+}
+
+function nativeAttachmentMime(string $url, string $type): string
+{
+ if ($type === 'video') {
+ $path = strtolower((string)(parse_url($url, PHP_URL_PATH) ?: ''));
+ if (preg_match('/\.webm$/', $path)) {
+ return 'video/webm';
+ }
+ if (preg_match('/\.(?:mov|m4v)$/', $path)) {
+ return 'video/quicktime';
+ }
+ return 'video/mp4';
+ }
+ if ($type !== 'image') {
+ return '';
+ }
+
+ $path = strtolower((string)(parse_url($url, PHP_URL_PATH) ?: ''));
+ if (preg_match('/\.jpe?g$/', $path)) {
+ return 'image/jpeg';
+ }
+ if (preg_match('/\.png$/', $path)) {
+ return 'image/png';
+ }
+ if (preg_match('/\.gif$/', $path)) {
+ return 'image/gif';
+ }
+ if (preg_match('/\.webp$/', $path)) {
+ return 'image/webp';
+ }
+ if (preg_match('/\.bmp$/', $path)) {
+ return 'image/bmp';
+ }
+ if (preg_match('/\.avif$/', $path)) {
+ return 'image/avif';
+ }
+
+ return 'image/*';
+}
+
+function nativeAttachmentFromRow(array $row, ?array $attachment): ?array
+{
+ if ($attachment !== null) {
+ return $attachment;
+ }
+
+ $contentType = (int)($row['_content_type'] ?? 0);
+ if (!in_array($contentType, [3, 5, 6], true)) {
+ return null;
+ }
+
+ $url = extractNativeMediaUrlFromData($row['_data'] ?? '');
+ if ($url === '') {
+ return null;
+ }
+
+ $type = $contentType === 3 ? 'image' : ($contentType === 6 ? 'video' : 'file');
+
+ return [
+ 'type' => $type,
+ 'url' => $url,
+ 'name' => nativeAttachmentName($url, $type),
+ 'mime' => nativeAttachmentMime($url, $type),
+ 'size' => 0,
+ ];
+}
+
+function isNativePlaceholderText(string $text, int $contentType): bool
+{
+ $text = trim($text);
+ if ($text === '') {
+ return false;
+ }
+ if ($contentType !== 1 && $text === '[暂不支持的消息类型]') {
+ return true;
+ }
+
+ return $contentType === 3 && ($text === '[图片]' || $text === '图片');
+}
+
+function nativeDisplayText(string $searchableText, int $contentType, bool $hasAttachment, bool $isRecalled = false): string
+{
+ $text = trim($searchableText);
+ if (isNativePlaceholderText($text, $contentType)) {
+ $text = '';
+ }
+ if ($text === '' && !$isRecalled) {
+ return nativeMessageFallbackText($contentType, $hasAttachment);
+ }
+
+ return $text;
+}
+
+function nativeRedPacketFromText(string $text): ?array
+{
+ $decoded = json_decode(trim($text), true);
+ if (!is_array($decoded)) {
+ return null;
+ }
+
+ $packet = $decoded['redPackets'] ?? $decoded['redPacket'] ?? null;
+ if (!is_array($packet)) {
+ return null;
+ }
+
+ return [
+ 'id' => (string)($packet['id'] ?? ''),
+ 'senderId' => (string)($packet['userId'] ?? $packet['senderId'] ?? ''),
+ 'target' => (string)($packet['target'] ?? $decoded['target'] ?? ''),
+ 'blessing' => trim((string)($packet['blessing'] ?? '')) ?: '恭喜发财,大吉大利',
+ 'status' => (int)($packet['status'] ?? 0),
+ 'expireTime' => (string)($packet['expireTime'] ?? ''),
+ 'createDate' => (string)($packet['createDate'] ?? ''),
+ ];
+}
+
+function nativeMessageFallbackText(int $contentType, bool $hasAttachment): string
+{
+ if ($hasAttachment) {
+ return '';
+ }
+ if ($contentType === 5) {
+ return '[文件]';
+ }
+ if ($contentType === 6) {
+ return '[视频加载失败]';
+ }
+ if ($contentType === 90) {
+ return '[红包]';
+ }
+ if ($contentType === 92) {
+ return '以上是打招呼的内容';
+ }
+ if ($contentType === 93) {
+ return '你们已经是好友了,可以开始聊天了。';
+ }
+ if ($contentType === 105) {
+ return '[领取了红包]';
+ }
+
+ return '';
+}
+
+function nativeMessageTableForDate(DateTimeImmutable $date): string
+{
+ $localDate = $date->setTimezone(new DateTimeZone(IM_DB_TIMEZONE));
+ $year = (int)$localDate->format('Y');
+ $month = (int)$localDate->format('n') - 1;
+
+ return 't_messages_' . (($year % 3) * 12 + $month);
+}
+
+function recentNativeMessageTables(int $monthsBack = 3): array
+{
+ $monthsBack = max(1, min($monthsBack, 12));
+ $cursor = (new DateTimeImmutable('now', new DateTimeZone(IM_DB_TIMEZONE)))
+ ->modify('first day of this month');
+ $tables = [];
+
+ for ($index = 0; $index < $monthsBack; $index++) {
+ $tables[] = nativeMessageTableForDate($cursor);
+ $cursor = $cursor->modify('-1 month');
+ }
+
+ return array_values(array_unique($tables));
+}
+
+function loadNativeGroupRowsFromGlobal(PDO $db, array $groupIds, int $limit): array
+{
+ $groupIds = array_values(array_unique(array_filter(array_map('strval', $groupIds))));
+ if (!$groupIds) {
+ return [];
+ }
+
+ $limit = min(max($limit, 50), 1000);
+ $rows = [];
+ foreach (recentNativeMessageTables(3) as $table) {
+ try {
+ $statement = $db->prepare(
+ 'select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_searchable_key`, `_dt`, `_content_type`, `_to`'
+ . ' from `' . $table . '`'
+ . ' where `_type` = 1 and `_line` = 0'
+ . ' and `_target` in (' . placeholders($groupIds) . ')'
+ . ' order by `_mid` desc limit ' . $limit
+ );
+ $statement->execute($groupIds);
+ } catch (Throwable) {
+ continue;
+ }
+
+ foreach ($statement->fetchAll() as $row) {
+ $rows[] = $row;
+ }
+ }
+
+ usort($rows, static fn($left, $right) => strcmp((string)$right['_mid'], (string)$left['_mid']));
+
+ $uniqueRows = [];
+ $seenMessageIds = [];
+ foreach ($rows as $row) {
+ $messageId = (string)$row['_mid'];
+ if ($messageId === '' || isset($seenMessageIds[$messageId])) {
+ continue;
+ }
+ $seenMessageIds[$messageId] = true;
+ $uniqueRows[] = $row;
+ if (count($uniqueRows) >= $limit) {
+ break;
+ }
+ }
+
+ return $uniqueRows;
+}
+
+function formatNativeGroupMessage(
+ array $row,
+ string $currentUserId,
+ array $group,
+ ?array $attachment = null,
+ array $users = [],
+ array $members = []
+): array {
+ $groupId = (string)$row['_target'];
+ $from = (string)$row['_from'];
+ $senderUser = $users[$from] ?? [];
+ $senderMember = $members[$from] ?? [];
+ $senderAlias = trim((string)($senderMember['_alias'] ?? ''));
+ $senderContactAlias = trim((string)($senderUser['_alias'] ?? ''));
+ $senderFriendAlias = trim((string)($senderUser['_friend_alias'] ?? ''));
+ $senderRemarkAlias = trim((string)($senderUser['_remark_alias'] ?? ''));
+ $senderRawName = trim((string)($senderUser['_display_name'] ?? ''))
+ ?: trim((string)($senderUser['_name'] ?? ''))
+ ?: trim((string)($senderUser['_mobile'] ?? ''))
+ ?: $from;
+ $senderName = $senderContactAlias
+ ?: $senderAlias
+ ?: $senderRawName;
+ $senderRole = nativeGroupRoleFromType($senderMember['_type'] ?? 0);
+ $messageId = (string)$row['_mid'];
+ $timestamp = timestampMs((string)($row['_dt'] ?? ''), $messageId);
+ $contentType = (int)($row['_content_type'] ?? 0);
+ $redPacket = nativeRedPacketFromText((string)($row['_searchable_key'] ?? ''));
+ if ($redPacket !== null) {
+ $contentType = 90;
+ }
+ $isRecalled = $contentType === 80;
+ $direction = $from === $currentUserId ? 'out' : 'in';
+ $attachment = nativeAttachmentFromRow($row, $attachment);
+ $messageType = $attachment
+ ? (string)$attachment['type']
+ : (in_array($contentType, [1, 80, 90, 92, 93, 105], true) ? 'text' : 'unknown');
+ $text = $redPacket !== null
+ ? '[红包]'
+ : nativeDisplayText((string)($row['_searchable_key'] ?? ''), $contentType, $attachment !== null, $isRecalled);
+
+ return [
+ 'id' => $messageId,
+ 'messageUid' => $messageId,
+ 'conversationId' => 'group-' . $groupId,
+ 'from' => $from,
+ 'senderRole' => $senderRole,
+ 'senderName' => $senderName,
+ 'senderPortrait' => (string)($senderUser['_portrait'] ?? ''),
+ 'senderProfile' => [
+ 'uid' => $from,
+ 'userId' => (string)($senderUser['_name'] ?? ''),
+ 'displayName' => $senderName,
+ 'rawName' => $senderRawName,
+ 'contactAlias' => $senderContactAlias,
+ 'friendAlias' => $senderFriendAlias,
+ 'remarkAlias' => $senderRemarkAlias,
+ 'groupAlias' => $senderAlias,
+ 'isContact' => (bool)($senderUser['_is_friend'] ?? false),
+ 'mobile' => (string)($senderUser['_mobile'] ?? ''),
+ 'address' => (string)($senderUser['_address'] ?? ''),
+ 'portrait' => (string)($senderUser['_portrait'] ?? ''),
+ 'role' => $senderRole,
+ ],
+ 'to' => $groupId,
+ 'target' => $groupId,
+ 'direction' => $direction,
+ 'type' => $messageType,
+ 'contentType' => $contentType,
+ 'text' => attachmentDisplayText($text, $attachment),
+ 'attachment' => $attachment,
+ 'redPacket' => $redPacket,
+ 'status' => $isRecalled && $direction === 'out' ? 'recalled' : 'sent',
+ 'deliveryStatus' => $direction === 'out' && !$isRecalled ? 'sent' : '',
+ 'recalled' => $isRecalled,
+ 'recallStatus' => $isRecalled ? '已撤回' : '',
+ 'editedAt' => 0,
+ 'timestamp' => $timestamp,
+ 'activityTimestamp' => $timestamp,
+ 'displayTimestamp' => $timestamp,
+ 'conversationType' => 'group',
+ 'raw' => [
+ 'native' => true,
+ 'groupName' => (string)($group['_name'] ?? ''),
+ ],
+ ];
+}
+
+function loadWebGroupMessages(PDO $appDb, string $userId, string $groupId, int $limit, bool $markRead): array
+{
+ ensureWebImAppTables();
+ $role = webGroupRole($appDb, $userId, $groupId);
+ if ($role === '') {
+ return [];
+ }
+
+ $groupStatement = $appDb->prepare('select * from `t_web_groups` where `group_id` = ? and `deleted` = 0 limit 1');
+ $groupStatement->execute([$groupId]);
+ $group = $groupStatement->fetch();
+ if (!$group) {
+ return [];
+ }
+
+ $statement = $appDb->prepare(
+ 'select msg.*,'
+ . ' coalesce(sender_member.`role`, if(g.`owner_uid` = msg.`sender_uid`, "owner", "member")) as `sender_role`,'
+ . ' coalesce(sender_member.`alias`, "") as `sender_alias`'
+ . ' from `t_web_group_messages` msg'
+ . ' join `t_web_groups` g on g.`group_id` = msg.`group_id` and g.`deleted` = 0'
+ . ' left join `t_web_group_members` sender_member'
+ . ' on sender_member.`group_id` = msg.`group_id`'
+ . ' and sender_member.`user_id` = msg.`sender_uid`'
+ . ' and sender_member.`status` = 0'
+ . ' where msg.`group_id` = ? and msg.`recalled` = 0'
+ . ' order by msg.`created_at_ms` desc, msg.`id` desc limit ' . $limit
+ );
+ $statement->execute([$groupId]);
+ $rows = array_reverse($statement->fetchAll());
+ $attachmentMap = fetchAttachmentMap($appDb, array_column($rows, 'message_uid'));
+ $users = fetchUserInfoMap(imDb(), array_column($rows, 'sender_uid'), $userId);
+
+ $readTimestamp = 0;
+ $messages = [];
+ foreach ($rows as $row) {
+ $messageId = (string)$row['message_uid'];
+ $message = formatWebGroupMessage($row, $userId, $group, $attachmentMap[$messageId] ?? null, $users);
+ $readTimestamp = max($readTimestamp, (int)$message['activityTimestamp']);
+ $messages[] = $message;
+ }
+
+ if ($markRead) {
+ markWebGroupRead($appDb, $userId, $groupId, $readTimestamp);
+ }
+
+ return $messages;
+}
+
+function loadNativeGroupMessages(PDO $db, string $userId, string $groupId, int $limit, bool $markRead): array
+{
+ $role = nativeGroupRole($db, $userId, $groupId);
+ if ($role === '') {
+ return [];
+ }
+
+ $groupStatement = $db->prepare('select * from `t_group` where `_gid` = ? and `_deleted` = 0 limit 1');
+ $groupStatement->execute([$groupId]);
+ $group = $groupStatement->fetch();
+ if (!is_array($group)) {
+ return [];
+ }
+
+ $table = imUserMessagesTable($userId);
+ $scanLimit = min(max($limit * 4, $limit), 400);
+ $statement = $db->prepare(
+ 'select `_mid`, `_dt` from `' . $table . '`'
+ . ' where `_uid` = ? and `_type` = 1 and `_line` = 0 and `_target` = ?'
+ . ' order by `_mid` desc limit ' . $scanLimit
+ );
+ $statement->execute([$userId, $groupId]);
+ $userRows = $statement->fetchAll();
+ $messageRows = fetchMessageRows($db, array_column($userRows, '_mid'));
+ $globalRows = loadNativeGroupRowsFromGlobal($db, [$groupId], $scanLimit);
+ foreach ($globalRows as $row) {
+ $messageId = (string)$row['_mid'];
+ if ($messageId !== '') {
+ $messageRows[$messageId] = $row;
+ $userRows[] = [
+ '_mid' => $messageId,
+ '_dt' => (string)($row['_dt'] ?? ''),
+ ];
+ }
+ }
+ usort($userRows, static fn($left, $right) => strcmp((string)$right['_mid'], (string)$left['_mid']));
+ $attachmentMap = fetchAttachmentMap(imAppDb(), array_column($userRows, '_mid'));
+
+ $messages = [];
+ $seenMessageIds = [];
+ foreach ($userRows as $userRow) {
+ $messageId = (string)$userRow['_mid'];
+ if (isset($seenMessageIds[$messageId]) || !isset($messageRows[$messageId])) {
+ continue;
+ }
+ $seenMessageIds[$messageId] = true;
+ if (!shouldDisplayMessageForUser($messageRows[$messageId], $userId)) {
+ continue;
+ }
+ $messages[] = $messageRows[$messageId];
+ if (count($messages) >= $limit) {
+ break;
+ }
+ }
+ $messages = array_reverse($messages);
+ $senderIds = array_values(array_unique(array_map(static fn(array $row): string => (string)$row['_from'], $messages)));
+ $users = fetchUserInfoMap($db, $senderIds, $userId);
+ $memberMap = fetchNativeGroupMemberMap($db, $groupId, $senderIds);
+
+ $readTimestamp = 0;
+ $formatted = [];
+ foreach ($messages as $row) {
+ $messageId = (string)$row['_mid'];
+ $message = formatNativeGroupMessage($row, $userId, $group, $attachmentMap[$messageId] ?? null, $users, $memberMap);
+ $readTimestamp = max($readTimestamp, (int)$message['activityTimestamp']);
+ $formatted[] = $message;
+ }
+
+ if ($markRead) {
+ markNativeGroupRead($db, $userId, $groupId, $readTimestamp);
+ }
+
+ return $formatted;
+}
+
+function loadWebGroupConversations(PDO $appDb, string $userId, int $limit): array
+{
+ ensureWebImAppTables();
+ $statement = $appDb->prepare(
+ 'select g.*, m.`role`'
+ . ' from `t_web_groups` g'
+ . ' join `t_web_group_members` m on m.`group_id` = g.`group_id` and m.`status` = 0'
+ . ' where g.`deleted` = 0 and m.`user_id` = ?'
+ . ' order by g.`updated_at_ms` desc limit ' . min(max($limit, 50), 100)
+ );
+ $statement->execute([$userId]);
+ $groups = $statement->fetchAll();
+ if (!$groups) {
+ return [];
+ }
+
+ $lastMessageStatement = $appDb->prepare(
+ 'select * from `t_web_group_messages`'
+ . ' where `group_id` = ? and `recalled` = 0'
+ . ' order by greatest(`created_at_ms`, `edited_at_ms`) desc, `id` desc limit 1'
+ );
+ $readStatement = $appDb->prepare(
+ 'select `read_at_ms` from `t_web_group_reads` where `group_id` = ? and `user_id` = ? limit 1'
+ );
+ $lastAttachmentStatement = $appDb->prepare(
+ 'select `attachment_type`, `url`, `name`, `mime`, `size_bytes`'
+ . ' from `t_web_message_attachments` where `message_uid` = ? limit 1'
+ );
+ $unreadStatement = $appDb->prepare(
+ 'select count(*) from `t_web_group_messages`'
+ . ' where `group_id` = ? and `sender_uid` <> ? and `recalled` = 0'
+ . ' and greatest(`created_at_ms`, `edited_at_ms`) > ?'
+ );
+ $memberCountStatement = $appDb->prepare(
+ 'select count(*) from `t_web_group_members` where `group_id` = ? and `status` = 0'
+ );
+
+ $conversations = [];
+ foreach ($groups as $group) {
+ $groupId = (string)$group['group_id'];
+ $lastMessageStatement->execute([$groupId]);
+ $lastMessage = $lastMessageStatement->fetch();
+ $readStatement->execute([$groupId, $userId]);
+ $readAt = (int)($readStatement->fetchColumn() ?: 0);
+ $unreadStatement->execute([$groupId, $userId, $readAt]);
+ $unread = (int)$unreadStatement->fetchColumn();
+ $memberCountStatement->execute([$groupId]);
+ $memberCount = (int)$memberCountStatement->fetchColumn();
+
+ $title = (string)$group['name'];
+ $category = (string)$group['category'];
+ $isChannel = $category === 'channel';
+ $lastAttachment = null;
+ if ($lastMessage) {
+ $lastAttachmentStatement->execute([(string)$lastMessage['message_uid']]);
+ $lastAttachmentRow = $lastAttachmentStatement->fetch();
+ $lastAttachment = $lastAttachmentRow ? normalizeAttachmentRow($lastAttachmentRow) : null;
+ }
+ $subtitle = $lastMessage
+ ? (messagePreviewText([
+ 'text' => attachmentDisplayText((string)$lastMessage['text'], $lastAttachment),
+ 'attachment' => $lastAttachment,
+ ]))
+ : ($isChannel ? '公告群' : ($memberCount > 0 ? $memberCount . ' 位成员' : '群组'));
+ $updatedAt = $lastMessage
+ ? max((int)$lastMessage['created_at_ms'], (int)($lastMessage['edited_at_ms'] ?? 0))
+ : (int)$group['updated_at_ms'];
+
+ $conversations[] = [
+ 'id' => 'group-' . $groupId,
+ 'type' => $isChannel ? 'channel' : 'group',
+ 'target' => $groupId,
+ 'title' => $title,
+ 'subtitle' => $subtitle,
+ 'unread' => $unread,
+ 'avatarText' => mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8'),
+ 'updatedAt' => $updatedAt,
+ 'role' => (string)$group['role'],
+ 'memberCount' => $memberCount,
+ 'raw' => [
+ 'type' => 'group',
+ 'target' => $groupId,
+ 'line' => 0,
+ 'category' => $category,
+ 'role' => (string)$group['role'],
+ ],
+ ];
+ }
+
+ return $conversations;
+}
+
+function loadNativeGroupConversations(PDO $db, string $userId, int $limit): array
+{
+ $statement = $db->prepare(
+ 'select g.*, m.`_type` as `member_type`, m.`_alias` as `member_alias`'
+ . ' from `t_group_member` m'
+ . ' join `t_group` g on g.`_gid` = m.`_gid` and g.`_deleted` = 0'
+ . ' where m.`_mid` = ?'
+ . ' order by greatest(g.`_dt`, m.`_dt`) desc limit ' . min(max($limit, 50), 100)
+ );
+ $statement->execute([$userId]);
+ $groups = $statement->fetchAll();
+ if (!$groups) {
+ return [];
+ }
+
+ $groupIds = array_values(array_unique(array_map(static fn(array $group): string => (string)$group['_gid'], $groups)));
+ $table = imUserMessagesTable($userId);
+ $scanLimit = min(max($limit * 20, 200), 1000);
+ $messageStatement = $db->prepare(
+ 'select `_mid`, `_target`, `_dt` from `' . $table . '`'
+ . ' where `_uid` = ? and `_type` = 1 and `_line` = 0'
+ . ' and `_target` in (' . placeholders($groupIds) . ')'
+ . ' order by `_mid` desc limit ' . $scanLimit
+ );
+ $messageStatement->execute(array_merge([$userId], $groupIds));
+ $scanRows = $messageStatement->fetchAll();
+ $messageRows = fetchMessageRows($db, array_column($scanRows, '_mid'));
+ $globalRows = loadNativeGroupRowsFromGlobal($db, $groupIds, $scanLimit);
+ foreach ($globalRows as $row) {
+ $messageId = (string)$row['_mid'];
+ if ($messageId !== '') {
+ $messageRows[$messageId] = $row;
+ $scanRows[] = [
+ '_mid' => $messageId,
+ '_target' => (string)($row['_target'] ?? ''),
+ '_dt' => (string)($row['_dt'] ?? ''),
+ ];
+ }
+ }
+ usort($scanRows, static fn($left, $right) => strcmp((string)$right['_mid'], (string)$left['_mid']));
+ $attachmentMap = fetchAttachmentMap(imAppDb(), array_column($scanRows, '_mid'));
+ $readAtByGroup = loadNativeGroupReadStateMap($db, $userId, $groupIds);
+
+ $latestByGroup = [];
+ $unreadByGroup = [];
+ $seenMessageIds = [];
+ foreach ($scanRows as $row) {
+ $messageId = (string)$row['_mid'];
+ if (isset($seenMessageIds[$messageId])) {
+ continue;
+ }
+ $seenMessageIds[$messageId] = true;
+ $groupId = (string)$row['_target'];
+ $message = $messageRows[$messageId] ?? null;
+ if ($groupId === '' || !$message || !shouldDisplayMessageForUser($message, $userId)) {
+ continue;
+ }
+ $activityTimestamp = timestampMs((string)($message['_dt'] ?? ''), $messageId);
+ if (!isset($latestByGroup[$groupId]) || $activityTimestamp > (int)($latestByGroup[$groupId]['_activity_at'] ?? 0)) {
+ $row['_activity_at'] = $activityTimestamp;
+ $latestByGroup[$groupId] = $row;
+ }
+ if ((string)$message['_from'] !== $userId && !isRecallMessage($message)) {
+ if ($activityTimestamp > (int)($readAtByGroup[$groupId] ?? 0)) {
+ $unreadByGroup[$groupId] = (int)($unreadByGroup[$groupId] ?? 0) + 1;
+ }
+ }
+ }
+
+ $groupsById = [];
+ foreach ($groups as $group) {
+ $groupsById[(string)$group['_gid']] = $group;
+ }
+
+ $senderIds = [];
+ foreach ($latestByGroup as $row) {
+ $message = $messageRows[(string)$row['_mid']] ?? null;
+ if ($message) {
+ $senderIds[] = (string)$message['_from'];
+ }
+ }
+ $users = fetchUserInfoMap($db, $senderIds, $userId);
+
+ $conversations = [];
+ foreach ($groupsById as $groupId => $group) {
+ $latestRow = $latestByGroup[$groupId] ?? null;
+ $messageId = $latestRow ? (string)$latestRow['_mid'] : '';
+ $message = $messageId !== '' && isset($messageRows[$messageId])
+ ? formatNativeGroupMessage(
+ $messageRows[$messageId],
+ $userId,
+ $group,
+ $attachmentMap[$messageId] ?? null,
+ $users,
+ fetchNativeGroupMemberMap($db, $groupId, [(string)$messageRows[$messageId]['_from']])
+ )
+ : null;
+ $title = (string)($group['_name'] ?? '') ?: $groupId;
+ $updatedAt = $message ? (int)$message['activityTimestamp'] : (int)($group['_dt'] ?? 0);
+ $conversations[] = [
+ 'id' => 'group-' . $groupId,
+ 'type' => 'group',
+ 'target' => $groupId,
+ 'title' => $title,
+ 'subtitle' => $message
+ ? (messagePreviewText($message) ?: nativeMessageFallbackText((int)($message['contentType'] ?? 0), false))
+ : (((int)($group['_member_count'] ?? 0) > 0) ? (int)$group['_member_count'] . ' 位成员' : '群组'),
+ 'unread' => (int)($unreadByGroup[$groupId] ?? 0),
+ 'portrait' => (string)($group['_portrait'] ?? ''),
+ 'avatarText' => mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8'),
+ 'updatedAt' => $updatedAt,
+ 'role' => nativeGroupRoleFromType($group['member_type'] ?? 0),
+ 'memberCount' => (int)($group['_member_count'] ?? 0),
+ 'raw' => [
+ 'type' => 'group',
+ 'target' => $groupId,
+ 'line' => 0,
+ 'native' => true,
+ 'role' => nativeGroupRoleFromType($group['member_type'] ?? 0),
+ ],
+ ];
+ }
+
+ return $conversations;
+}
+
+function mergeConversationsById(array $conversations, array $extraConversations): array
+{
+ $merged = [];
+ foreach (array_merge($conversations, $extraConversations) as $conversation) {
+ $id = (string)($conversation['id'] ?? '');
+ if ($id === '') {
+ continue;
+ }
+ if (!isset($merged[$id])) {
+ $merged[$id] = $conversation;
+ continue;
+ }
+ if ((int)($conversation['updatedAt'] ?? 0) > (int)($merged[$id]['updatedAt'] ?? 0)) {
+ $merged[$id] = array_merge($merged[$id], $conversation);
+ }
+ }
+
+ return array_values($merged);
+}
+
+function isRecallMessage(array $row): bool
+{
+ return (int)($row['_content_type'] ?? 0) === 80;
+}
+
+function shouldDisplayMessageForUser(array $row, string $currentUserId): bool
+{
+ if (!isRecallMessage($row)) {
+ return true;
+ }
+
+ return (string)$row['_from'] === $currentUserId;
+}
+
+function formatMessage(
+ array $row,
+ string $currentUserId,
+ string $peerId,
+ array $receiptState = [],
+ array $editState = [],
+ ?array $attachment = null
+): array
+{
+ $messageId = (string)$row['_mid'];
+ $from = (string)$row['_from'];
+ $contentType = (int)($row['_content_type'] ?? 0);
+ $redPacket = nativeRedPacketFromText((string)($row['_searchable_key'] ?? ''));
+ if ($redPacket !== null) {
+ $contentType = 90;
+ }
+ $isRecalled = $contentType === 80;
+ $text = (string)($row['_searchable_key'] ?? '');
+ $timestamp = timestampMs((string)($row['_dt'] ?? ''), $messageId);
+ $direction = $from === $currentUserId ? 'out' : 'in';
+ $attachment = nativeAttachmentFromRow($row, $attachment);
+ $messageType = $attachment
+ ? (string)$attachment['type']
+ : (in_array($contentType, [1, 80, 90, 92, 93, 105], true) ? 'text' : 'unknown');
+ $messageText = $redPacket !== null
+ ? '[红包]'
+ : nativeDisplayText($text, $contentType, $attachment !== null, $isRecalled);
+ $messageText = attachmentDisplayText($messageText, $attachment);
+ $editedAt = (int)($editState['editedAt'] ?? 0);
+ $activityTimestamp = messageActivityTimestamp($timestamp, $editState);
+ $deliveryStatus = $direction === 'out' && !$isRecalled
+ ? outgoingDeliveryStatus($activityTimestamp, $receiptState)
+ : '';
+
+ return [
+ 'id' => $messageId,
+ 'messageUid' => $messageId,
+ 'conversationId' => 'single-' . $peerId,
+ 'from' => $from,
+ 'to' => $from === $currentUserId ? $peerId : $currentUserId,
+ 'target' => $peerId,
+ 'direction' => $direction,
+ 'type' => $messageType,
+ 'contentType' => $attachment
+ ? ((string)$attachment['type'] === 'image' ? 3 : ((string)$attachment['type'] === 'video' ? 6 : 5))
+ : $contentType,
+ 'text' => $messageText,
+ 'attachment' => $attachment,
+ 'redPacket' => $redPacket,
+ 'status' => $isRecalled && $direction === 'out' ? 'recalled' : ($direction === 'out' ? $deliveryStatus : 'sent'),
+ 'deliveryStatus' => $deliveryStatus,
+ 'recalled' => $isRecalled,
+ 'recallStatus' => $isRecalled ? '已撤回' : '',
+ 'editedAt' => $editedAt,
+ 'timestamp' => $timestamp,
+ 'activityTimestamp' => $activityTimestamp,
+ 'displayTimestamp' => $timestamp,
+ ];
+}
+
+function loadConversationMessages(PDO $db, string $userId, string $targetId, int $limit, bool $markRead): array
+{
+ $table = imUserMessagesTable($userId);
+ $conversationKeys = [$userId . '|' . $targetId, $targetId . '|' . $userId];
+ $scanLimit = min(max($limit * 4, $limit), 400);
+ $statement = $db->prepare(
+ 'select `_mid`, `_dt` from `' . $table . '`'
+ . ' where `_uid` = ? and `_type` = 0 and `_line` = 0'
+ . ' and `_target` in (?, ?)'
+ . ' order by `_mid` desc limit ' . $scanLimit
+ );
+ $statement->execute([$userId, $conversationKeys[0], $conversationKeys[1]]);
+ $userRows = $statement->fetchAll();
+ $messageRows = fetchMessageRows($db, array_column($userRows, '_mid'));
+ $editMap = fetchMessageEditMap($db, array_column($userRows, '_mid'));
+ $attachmentMap = fetchAttachmentMap(imAppDb(), array_column($userRows, '_mid'));
+ $receiptState = loadPeerReceiptState($db, $userId, $targetId);
+
+ $messages = [];
+ $seenMessageIds = [];
+ $readTimestamp = 0;
+ foreach ($userRows as $userRow) {
+ $messageId = (string)$userRow['_mid'];
+ if (isset($seenMessageIds[$messageId]) || !isset($messageRows[$messageId])) {
+ continue;
+ }
+ $seenMessageIds[$messageId] = true;
+ if (!shouldDisplayMessageForUser($messageRows[$messageId], $userId)) {
+ continue;
+ }
+ $message = formatMessage(
+ $messageRows[$messageId],
+ $userId,
+ $targetId,
+ $receiptState,
+ $editMap[$messageId] ?? [],
+ $attachmentMap[$messageId] ?? null
+ );
+ $messages[] = $message;
+ $readTimestamp = max($readTimestamp, (int)$message['activityTimestamp']);
+ if (count($messages) >= $limit) {
+ break;
+ }
+ }
+ $messages = array_reverse($messages);
+
+ if ($markRead) {
+ markConversationRead($db, $userId, $targetId, $readTimestamp);
+ }
+
+ return $messages;
+}
+
+function loadRecentConversations(PDO $db, string $userId, int $limit): array
+{
+ $table = imUserMessagesTable($userId);
+ $scanLimit = min(max($limit * 20, 200), 1000);
+ $statement = $db->prepare(
+ 'select `_mid`, `_target`, `_dt` from `' . $table . '`'
+ . ' where `_uid` = ? and `_type` = 0 and `_line` = 0'
+ . ' order by `_mid` desc limit ' . $scanLimit
+ );
+ $statement->execute([$userId]);
+
+ $scanRows = $statement->fetchAll();
+ $messageRows = fetchMessageRows($db, array_column($scanRows, '_mid'));
+ $editMap = fetchMessageEditMap($db, array_column($scanRows, '_mid'));
+ $attachmentMap = fetchAttachmentMap(imAppDb(), array_column($scanRows, '_mid'));
+ $latestByPeer = [];
+ foreach ($scanRows as $row) {
+ $messageId = (string)$row['_mid'];
+ $message = $messageRows[$messageId] ?? null;
+ $peerId = peerFromConversationTarget($userId, (string)$row['_target']);
+ if ($peerId === '' || !$message) {
+ continue;
+ }
+ if (!shouldDisplayMessageForUser($message, $userId)) {
+ continue;
+ }
+ $activityTimestamp = messageActivityTimestamp(
+ timestampMs((string)($message['_dt'] ?? ''), $messageId),
+ $editMap[$messageId] ?? []
+ );
+ if (!isset($latestByPeer[$peerId]) || $activityTimestamp > (int)($latestByPeer[$peerId]['_activity_at'] ?? 0)) {
+ $row['_activity_at'] = $activityTimestamp;
+ $latestByPeer[$peerId] = $row;
+ }
+ }
+ uasort($latestByPeer, static fn($a, $b) => (int)($b['_activity_at'] ?? 0) <=> (int)($a['_activity_at'] ?? 0));
+ $latestByPeer = array_slice($latestByPeer, 0, $limit, true);
+
+ $users = fetchUserInfoMap($db, array_keys($latestByPeer), $userId);
+ $readAtByPeer = loadOwnReadStateMap($db, $userId, array_keys($latestByPeer));
+ $unreadByPeer = [];
+ $seenUnreadMessageIds = [];
+
+ foreach ($scanRows as $row) {
+ $messageId = (string)$row['_mid'];
+ if (isset($seenUnreadMessageIds[$messageId])) {
+ continue;
+ }
+ $seenUnreadMessageIds[$messageId] = true;
+ $peerId = peerFromConversationTarget($userId, (string)$row['_target']);
+ $message = $messageRows[$messageId] ?? null;
+ if ($peerId === '' || !$message || !isset($latestByPeer[$peerId])) {
+ continue;
+ }
+ if ((string)$message['_from'] === $userId) {
+ continue;
+ }
+ if (isRecallMessage($message)) {
+ continue;
+ }
+ $timestamp = timestampMs((string)($message['_dt'] ?? ''), $messageId);
+ $activityTimestamp = messageActivityTimestamp($timestamp, $editMap[$messageId] ?? []);
+ if ($activityTimestamp > (int)($readAtByPeer[$peerId] ?? 0)) {
+ $unreadByPeer[$peerId] = (int)($unreadByPeer[$peerId] ?? 0) + 1;
+ }
+ }
+
+ $conversations = [];
+
+ foreach ($latestByPeer as $peerId => $userRow) {
+ $messageId = (string)$userRow['_mid'];
+ $message = isset($messageRows[$messageId])
+ ? formatMessage($messageRows[$messageId], $userId, $peerId, [], $editMap[$messageId] ?? [], $attachmentMap[$messageId] ?? null)
+ : null;
+ $title = userTitle($users, $peerId);
+ $conversations[] = [
+ 'id' => 'single-' . $peerId,
+ 'type' => 'single',
+ 'target' => $peerId,
+ 'title' => $title,
+ 'subtitle' => $message ? (messagePreviewText($message) !== '' ? messagePreviewText($message) : (empty($message['recalled']) ? '' : '已撤回')) : '',
+ 'unread' => (int)($unreadByPeer[$peerId] ?? 0),
+ 'portrait' => (string)($users[$peerId]['_portrait'] ?? ''),
+ 'avatarText' => mb_strtoupper(mb_substr($title, 0, 1, 'UTF-8'), 'UTF-8'),
+ 'updatedAt' => $message ? $message['activityTimestamp'] : timestampMs((string)($userRow['_dt'] ?? ''), $messageId),
+ 'raw' => [
+ 'type' => 'single',
+ 'target' => $peerId,
+ 'line' => 0,
+ 'userId' => (string)($users[$peerId]['_name'] ?? $peerId),
+ 'userUid' => $peerId,
+ 'displayName' => (string)($users[$peerId]['_display_name'] ?? ''),
+ 'mobile' => (string)($users[$peerId]['_mobile'] ?? ''),
+ 'address' => (string)($users[$peerId]['_address'] ?? ''),
+ ],
+ ];
+ }
+
+ try {
+ $conversations = mergeConversationsById($conversations, loadWebGroupConversations(imAppDb(), $userId, $limit));
+ } catch (Throwable $error) {
+ error_log('web group conversation sync failed: ' . $error->getMessage());
+ // Keep single-chat sync available if appdata group metadata is temporarily unavailable.
+ }
+ try {
+ $conversations = mergeConversationsById($conversations, loadNativeGroupConversations($db, $userId, $limit));
+ } catch (Throwable $error) {
+ error_log('native group conversation sync failed: ' . $error->getMessage());
+ }
+
+ usort($conversations, static fn($a, $b) => $b['updatedAt'] <=> $a['updatedAt']);
+
+ return array_slice($conversations, 0, $limit);
+}
+
+function messageSyncResult(
+ PDO $db,
+ string $userId,
+ array $messages,
+ bool $includeConversations,
+ int $limit,
+ string $targetId = '',
+ string $conversationType = 'single'
+): array {
+ $result = ['messages' => $messages];
+ if ($includeConversations) {
+ $result['conversations'] = loadRecentConversations($db, $userId, $limit);
+ }
+
+ if ($targetId !== '') {
+ try {
+ imAppDb()->exec(
+ 'create table if not exists `t_web_pinned_messages` ('
+ . '`user_id` varchar(64) not null, `conversation_type` varchar(16) not null,'
+ . '`target_id` varchar(128) not null, `message_uid` varchar(32) not null,'
+ . '`message_json` text null,'
+ . '`updated_at_ms` bigint not null, primary key (`user_id`, `conversation_type`, `target_id`)'
+ . ') engine=InnoDB default charset=utf8mb4'
+ );
+ try {
+ imAppDb()->exec('alter table `t_web_pinned_messages` add column `message_json` text null after `message_uid`');
+ } catch (Throwable) {
+ // The column already exists.
+ }
+ $statement = imAppDb()->prepare(
+ 'select `message_uid`, `message_json` from `t_web_pinned_messages` where `user_id` = ? and `conversation_type` = ? and `target_id` = ? limit 1'
+ );
+ $statement->execute([$userId, $conversationType, $targetId]);
+ $pinnedRow = $statement->fetch();
+ $result['pinnedMessageUid'] = (string)($pinnedRow['message_uid'] ?? '');
+ $pinnedMessage = json_decode((string)($pinnedRow['message_json'] ?? ''), true);
+ $result['pinnedMessage'] = is_array($pinnedMessage) ? $pinnedMessage : null;
+ } catch (Throwable) {
+ $result['pinnedMessageUid'] = '';
+ $result['pinnedMessage'] = null;
+ }
+ }
+
+ return $result;
+}
+
+$payload = readJsonPayload();
+$userId = trim((string)($payload['userId'] ?? ''));
+$target = trim((string)($payload['target'] ?? ''));
+$limit = clampLimit($payload['limit'] ?? 50, 50, 100);
+$markRead = payloadBool($payload['markRead'] ?? false);
+$includeConversations = payloadBool($payload['includeConversations'] ?? false);
+$conversationType = normalizeConversationType($payload['conversationType'] ?? $payload['type'] ?? 0);
+
+if ($userId === '') {
+ respond(400, '缺少用户ID');
+}
+
+try {
+ $db = imDb();
+ $userId = resolveUserId($db, $userId);
+ markUserDelivered($db, $userId, nowMs());
+
+ if ($target !== '') {
+ if ($conversationType === 'group') {
+ if (isWebGroupTarget(imAppDb(), $target)) {
+ respond(0, 'success', messageSyncResult(
+ $db,
+ $userId,
+ loadWebGroupMessages(imAppDb(), $userId, $target, $limit, $markRead),
+ $includeConversations,
+ $limit, $target, 'group'
+ ));
+ }
+ if (isNativeGroupTarget($db, $target)) {
+ respond(0, 'success', messageSyncResult(
+ $db,
+ $userId,
+ loadNativeGroupMessages($db, $userId, $target, $limit, $markRead),
+ $includeConversations,
+ $limit, $target, 'group'
+ ));
+ }
+ respond(0, 'success', messageSyncResult(
+ $db,
+ $userId,
+ [],
+ $includeConversations,
+ $limit, $target, 'group'
+ ));
+ }
+ if (isWebGroupTarget(imAppDb(), $target)) {
+ respond(0, 'success', messageSyncResult(
+ $db,
+ $userId,
+ loadWebGroupMessages(imAppDb(), $userId, $target, $limit, $markRead),
+ $includeConversations,
+ $limit, $target, 'group'
+ ));
+ }
+ $targetId = resolveUserId($db, $target);
+ respond(0, 'success', messageSyncResult(
+ $db,
+ $userId,
+ loadConversationMessages($db, $userId, $targetId, $limit, $markRead),
+ $includeConversations,
+ $limit, $targetId, 'single'
+ ));
+ }
+
+ respond(0, 'success', [
+ 'conversations' => loadRecentConversations($db, $userId, $limit),
+ ]);
+} catch (Throwable $error) {
+ respond(500, $error->getMessage() ?: '消息同步失败');
+}
diff --git a/dist-local/api/send_message.php b/dist-local/api/send_message.php
index c06af18..2f4c37f 100644
--- a/dist-local/api/send_message.php
+++ b/dist-local/api/send_message.php
@@ -8,8 +8,9 @@ require __DIR__ . '/im_web_bootstrap.php';
const WEB_MEDIA_ROOT = '/opt/im-server/media';
const WEB_MEDIA_PUBLIC_PORT = 18000;
-const WEB_MEDIA_TYPE_IMAGE = 1;
-const WEB_MEDIA_TYPE_FILE = 4;
+const WEB_MEDIA_TYPE_IMAGE = 1;
+const WEB_MEDIA_TYPE_VIDEO = 3;
+const WEB_MEDIA_TYPE_FILE = 4;
const WEB_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
const WEB_FILE_MAX_BYTES = 50 * 1024 * 1024;
@@ -245,13 +246,32 @@ function storeMessageAttachment(
]);
}
-function attachmentFromRequest(string $messageType): ?array
-{
- if (!in_array($messageType, ['image', 'file'], true)) {
- return null;
- }
-
- $attachmentFile = $_FILES['attachment'] ?? $_FILES['file'] ?? null;
+function attachmentFromRequest(string $messageType): ?array
+{
+ if (!in_array($messageType, ['image', 'video', 'file'], true)) {
+ return null;
+ }
+
+ $forwardUrl = trim((string)($_POST['attachmentUrl'] ?? ''));
+ if ($forwardUrl !== '') {
+ $parts = parse_url($forwardUrl);
+ $scheme = strtolower((string)($parts['scheme'] ?? ''));
+ if (!in_array($scheme, ['http', 'https'], true) || empty($parts['host']) || strlen($forwardUrl) > 2048) {
+ respond(400, '媒体地址不合法');
+ }
+ $mime = trim((string)($_POST['attachmentMime'] ?? 'application/octet-stream'));
+ $name = safeUploadName((string)($_POST['attachmentName'] ?? ($messageType === 'image' ? '图片' : ($messageType === 'video' ? '视频.mp4' : '文件'))));
+ return [
+ 'type' => $messageType,
+ 'url' => $forwardUrl,
+ 'name' => $name,
+ 'mime' => $mime,
+ 'size' => max(0, (int)($_POST['attachmentSize'] ?? 0)),
+ 'mediaType' => $messageType === 'image' ? WEB_MEDIA_TYPE_IMAGE : ($messageType === 'video' ? WEB_MEDIA_TYPE_VIDEO : WEB_MEDIA_TYPE_FILE),
+ ];
+ }
+
+ $attachmentFile = $_FILES['attachment'] ?? $_FILES['file'] ?? null;
if (!is_array($attachmentFile)) {
respond(400, '缺少上传文件');
}
@@ -266,11 +286,15 @@ $sender = messageRequestValue($payload, 'sender');
$target = messageRequestValue($payload, 'target');
$text = messageRequestValue($payload, 'text');
$messageType = messageRequestValue($payload, 'messageType', 'text');
-$conversationType = $_POST['conversationType'] ?? $_POST['type'] ?? $payload['conversationType'] ?? $payload['type'] ?? 0;
-$isGroupConversation = in_array((string)$conversationType, ['1', 'group', 'channel'], true);
+$conversationType = $_POST['conversationType'] ?? $_POST['type'] ?? $payload['conversationType'] ?? $payload['type'] ?? 0;
+$isGroupConversation = in_array((string)$conversationType, ['1', 'group', 'channel'], true);
+$mentionedUserIds = $payload['mentionedUserIds'] ?? [];
+$mentionedUserIds = is_array($mentionedUserIds)
+ ? array_values(array_unique(array_filter(array_map(static fn($value): string => trim((string)$value), $mentionedUserIds))))
+ : [];
$attachment = null;
-if ($sender === '' || $target === '' || ($text === '' && !in_array($messageType, ['image', 'file'], true))) {
+if ($sender === '' || $target === '' || ($text === '' && !in_array($messageType, ['image', 'video', 'file'], true))) {
respond(400, '缺少发送者、接收者或消息内容');
}
@@ -285,11 +309,70 @@ try {
. ' where g.`deleted` = 0 and g.`group_id` = ? and m.`user_id` = ?'
. ' limit 1'
);
- $memberStatement->execute([$target, $sender]);
- $group = $memberStatement->fetch();
- if (!$group) {
- respond(403, '你不在该群组中');
- }
+ $memberStatement->execute([$target, $sender]);
+ $group = $memberStatement->fetch();
+ if (!$group) {
+ // 手机端创建的原生群不一定存在于 Web 自建群表中,需回退检查 IM 群成员表。
+ $imDb = imDb();
+ $nativeGroupStatement = $imDb->prepare(
+ 'select 1 from `t_group` where `_gid` = ? and `_deleted` = 0 limit 1'
+ );
+ $nativeGroupStatement->execute([$target]);
+ $nativeMemberStatement = $imDb->prepare(
+ 'select `_type` from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1'
+ );
+ $nativeMemberStatement->execute([$target, $sender]);
+ $nativeMemberType = $nativeMemberStatement->fetchColumn();
+ if (!$nativeGroupStatement->fetchColumn() || $nativeMemberType === false) {
+ respond(403, '你不在该群组中');
+ }
+
+ $attachment = attachmentFromRequest($messageType);
+ $pushContent = $text !== ''
+ ? $text
+ : ($attachment
+ ? ((string)$attachment['type'] === 'image' ? '[图片]' : ((string)$attachment['type'] === 'video' ? '[视频]' : '[文件] ' . (string)$attachment['name']))
+ : $text);
+ $payloadBody = [
+ 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : ((string)$attachment['type'] === 'video' ? 6 : 5)) : 1,
+ 'searchableContent' => $pushContent,
+ 'pushContent' => $pushContent,
+ 'content' => $text,
+ 'persistFlag' => 3,
+ ];
+ if ($mentionedUserIds) {
+ $payloadBody['mentionedType'] = 1;
+ $payloadBody['mentionedTarget'] = $mentionedUserIds;
+ }
+ if ($attachment) {
+ $payloadBody['mediaType'] = (int)$attachment['mediaType'];
+ $payloadBody['remoteMediaUrl'] = (string)$attachment['url'];
+ $payloadBody['extra'] = json_encode([
+ 'name' => (string)$attachment['name'],
+ 'mime' => (string)$attachment['mime'],
+ 'size' => (int)$attachment['size'],
+ ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
+ }
+ $nativeResult = requireImSuccess(imAdminPost('/admin/message/send', [
+ 'sender' => $sender,
+ 'conv' => ['type' => 1, 'target' => $target, 'line' => 0],
+ 'payload' => $payloadBody,
+ 'userMessage' => true,
+ ]), '原生群消息发送失败');
+ $messageUid = isset($nativeResult['messageUid']) ? (string)$nativeResult['messageUid'] : '';
+ $timestamp = (int)($nativeResult['timestamp'] ?? webImNowMs());
+ if ($attachment && $messageUid !== '') {
+ storeMessageAttachment($appDb, $messageUid, 'group', $target, $sender, $attachment, $timestamp);
+ }
+ $role = (int)$nativeMemberType === 2 ? 'owner' : ((int)$nativeMemberType === 1 ? 'admin' : 'member');
+ respond(0, 'success', [
+ 'messageUid' => $messageUid,
+ 'timestamp' => $timestamp,
+ 'senderRole' => $role,
+ 'attachment' => $attachment,
+ 'nativeError' => '',
+ ]);
+ }
$category = (string)($group['category'] ?? 'group');
$role = (string)($group['role'] ?? 'member');
if ($category === 'channel' && !in_array($role, ['owner', 'admin'], true)) {
@@ -319,15 +402,19 @@ try {
$pushContent = $text !== ''
? $text
: ($attachment
- ? ((string)$attachment['type'] === 'image' ? '[图片]' : '[文件] ' . (string)$attachment['name'])
+ ? ((string)$attachment['type'] === 'image' ? '[图片]' : ((string)$attachment['type'] === 'video' ? '[视频]' : '[文件] ' . (string)$attachment['name']))
: $text);
- $payloadBody = [
- 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : 5) : 1,
+ $payloadBody = [
+ 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : ((string)$attachment['type'] === 'video' ? 6 : 5)) : 1,
'searchableContent' => $pushContent,
'pushContent' => $pushContent,
'content' => $text,
- 'persistFlag' => 3,
- ];
+ 'persistFlag' => 3,
+ ];
+ if ($mentionedUserIds) {
+ $payloadBody['mentionedType'] = 1;
+ $payloadBody['mentionedTarget'] = $mentionedUserIds;
+ }
if ($attachment) {
$payloadBody['mediaType'] = (int)$attachment['mediaType'];
$payloadBody['remoteMediaUrl'] = (string)$attachment['url'];
@@ -364,10 +451,10 @@ try {
$pushContent = $text !== ''
? $text
: ($attachment
- ? ((string)$attachment['type'] === 'image' ? '[图片]' : '[文件] ' . (string)$attachment['name'])
+ ? ((string)$attachment['type'] === 'image' ? '[图片]' : ((string)$attachment['type'] === 'video' ? '[视频]' : '[文件] ' . (string)$attachment['name']))
: $text);
$payloadBody = [
- 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : 5) : 1,
+ 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : ((string)$attachment['type'] === 'video' ? 6 : 5)) : 1,
'searchableContent' => $pushContent,
'pushContent' => $pushContent,
'content' => $text,
diff --git a/dist-local/js/app.js b/dist-local/js/app.js
index 4c06e9b..3a7c5a4 100644
--- a/dist-local/js/app.js
+++ b/dist-local/js/app.js
@@ -27,7 +27,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _sidebar_NavigationRail_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sidebar/NavigationRail.vue */ \"./src/components/sidebar/NavigationRail.vue\");\n/* harmony import */ var _sidebar_ConversationList_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sidebar/ConversationList.vue */ \"./src/components/sidebar/ConversationList.vue\");\n/* harmony import */ var _sidebar_ContactList_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sidebar/ContactList.vue */ \"./src/components/sidebar/ContactList.vue\");\n/* harmony import */ var _chat_ChatPanel_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./chat/ChatPanel.vue */ \"./src/components/chat/ChatPanel.vue\");\n/* harmony import */ var _contacts_ContactPanel_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contacts/ContactPanel.vue */ \"./src/components/contacts/ContactPanel.vue\");\n/* harmony import */ var _favorites_FavoriteList_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./favorites/FavoriteList.vue */ \"./src/components/favorites/FavoriteList.vue\");\n/* harmony import */ var _favorites_FavoritePanel_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./favorites/FavoritePanel.vue */ \"./src/components/favorites/FavoritePanel.vue\");\n/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/stores/conversations */ \"./src/stores/conversations.js\");\n/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/stores/navigation */ \"./src/stores/navigation.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ChatShell',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_8__.useConversationStore)();\n const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_9__.useNavigationStore)();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_10__.useContactStore)();\n (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {\n conversations.refreshRemoteConversations();\n contacts.refreshContacts();\n });\n const __returned__ = {\n conversations,\n navigation,\n contacts,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_0__.onMounted,\n NavigationRail: _sidebar_NavigationRail_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n ConversationList: _sidebar_ConversationList_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ContactList: _sidebar_ContactList_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n ChatPanel: _chat_ChatPanel_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n ContactPanel: _contacts_ContactPanel_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n FavoriteList: _favorites_FavoriteList_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n FavoritePanel: _favorites_FavoritePanel_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n get useConversationStore() {\n return _stores_conversations__WEBPACK_IMPORTED_MODULE_8__.useConversationStore;\n },\n get useNavigationStore() {\n return _stores_navigation__WEBPACK_IMPORTED_MODULE_9__.useNavigationStore;\n },\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_10__.useContactStore;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/ChatShell.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _sidebar_NavigationRail_vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sidebar/NavigationRail.vue */ \"./src/components/sidebar/NavigationRail.vue\");\n/* harmony import */ var _sidebar_ConversationList_vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sidebar/ConversationList.vue */ \"./src/components/sidebar/ConversationList.vue\");\n/* harmony import */ var _sidebar_ContactList_vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sidebar/ContactList.vue */ \"./src/components/sidebar/ContactList.vue\");\n/* harmony import */ var _chat_ChatPanel_vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./chat/ChatPanel.vue */ \"./src/components/chat/ChatPanel.vue\");\n/* harmony import */ var _contacts_ContactPanel_vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contacts/ContactPanel.vue */ \"./src/components/contacts/ContactPanel.vue\");\n/* harmony import */ var _favorites_FavoriteList_vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./favorites/FavoriteList.vue */ \"./src/components/favorites/FavoriteList.vue\");\n/* harmony import */ var _favorites_FavoritePanel_vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./favorites/FavoritePanel.vue */ \"./src/components/favorites/FavoritePanel.vue\");\n/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/stores/conversations */ \"./src/stores/conversations.js\");\n/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/stores/navigation */ \"./src/stores/navigation.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @/composables/useAutoDismiss */ \"./src/composables/useAutoDismiss.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ChatShell',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_8__.useConversationStore)();\n const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_9__.useNavigationStore)();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_10__.useContactStore)();\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_11__.useAutoDismiss)(() => conversations.actionError || conversations.actionNotice, value => {\n if ((conversations.actionError || conversations.actionNotice) === value) {\n conversations.actionError = '';\n conversations.actionNotice = '';\n }\n });\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_11__.useAutoDismiss)(() => contacts.actionError || contacts.actionInfo, value => {\n if ((contacts.actionError || contacts.actionInfo) === value) {\n contacts.actionError = '';\n contacts.actionInfo = '';\n }\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_0__.onMounted)(() => {\n conversations.refreshRemoteConversations();\n contacts.refreshContacts();\n });\n const __returned__ = {\n conversations,\n navigation,\n contacts,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_0__.onMounted,\n NavigationRail: _sidebar_NavigationRail_vue__WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n ConversationList: _sidebar_ConversationList_vue__WEBPACK_IMPORTED_MODULE_2__[\"default\"],\n ContactList: _sidebar_ContactList_vue__WEBPACK_IMPORTED_MODULE_3__[\"default\"],\n ChatPanel: _chat_ChatPanel_vue__WEBPACK_IMPORTED_MODULE_4__[\"default\"],\n ContactPanel: _contacts_ContactPanel_vue__WEBPACK_IMPORTED_MODULE_5__[\"default\"],\n FavoriteList: _favorites_FavoriteList_vue__WEBPACK_IMPORTED_MODULE_6__[\"default\"],\n FavoritePanel: _favorites_FavoritePanel_vue__WEBPACK_IMPORTED_MODULE_7__[\"default\"],\n get useConversationStore() {\n return _stores_conversations__WEBPACK_IMPORTED_MODULE_8__.useConversationStore;\n },\n get useNavigationStore() {\n return _stores_navigation__WEBPACK_IMPORTED_MODULE_9__.useNavigationStore;\n },\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_10__.useContactStore;\n },\n get useAutoDismiss() {\n return _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_11__.useAutoDismiss;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/ChatShell.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -38,7 +38,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! axios */ \"./node_modules/axios/lib/axios.js\");\n/* harmony import */ var jr_qrcode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jr-qrcode */ \"./node_modules/jr-qrcode/dist/jr-qrcode.js\");\n/* harmony import */ var jr_qrcode__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jr_qrcode__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/config */ \"./src/config.js\");\n/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/stores/session */ \"./src/stores/session.js\");\n/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/services/imClient */ \"./src/services/imClient.js\");\n\n\n\n\n\n\n\nconst QR_CODE_PREFIX_PC_SESSION = 'wildfirechat://pcsession/';\nconst defaultPlatformLogo = '/favicon.ico';\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'LoginView',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_5__.useSessionStore)();\n const view = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('login');\n const loginMode = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('phone');\n const loginAccount = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const loginPassword = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const registerType = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(1);\n const registerForm = (0,vue__WEBPACK_IMPORTED_MODULE_3__.reactive)({\n number: '',\n code: '',\n password: '',\n confirmPassword: '',\n invitationCode: ''\n });\n const sendingCode = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(false);\n const info = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const qrStatus = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('idle');\n const qrCodeImage = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const qrSessionToken = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const qrUserName = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const qrUserPortrait = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n let qrGeneration = 0;\n let qrExpireTimer = null;\n const defaultPlatformName = _config__WEBPACK_IMPORTED_MODULE_4__.appConfig.appName;\n const platformName = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(defaultPlatformName);\n const platformLogo = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(defaultPlatformLogo);\n const canSubmitLogin = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => loginAccount.value.length >= 3 && loginPassword.value.length >= 1);\n const canRequestEmailCode = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => registerType.value === 2 && /\\S+@\\S+\\.\\S+/.test(registerForm.number));\n const canSubmitRegister = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (registerForm.password.length < 1 || registerForm.password !== registerForm.confirmPassword) {\n return false;\n }\n if (registerType.value === 2) {\n return canRequestEmailCode.value && registerForm.code.length >= 1;\n }\n return registerForm.number.length >= 5;\n });\n const qrUserInitial = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => String(qrUserName.value || 'U').slice(0, 1).toUpperCase());\n const qrStatusTitle = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (session.connecting || qrStatus.value === 'confirmed') {\n return '正在进入';\n }\n if (qrStatus.value === 'loading') {\n return '正在生成二维码';\n }\n if (qrStatus.value === 'scanned') {\n return qrUserName.value ? `${qrUserName.value} 已扫码` : '已扫码,待确认';\n }\n if (qrStatus.value === 'expired') {\n return '二维码已过期';\n }\n if (qrStatus.value === 'error') {\n return '二维码加载失败';\n }\n return '扫码登录';\n });\n const qrStatusText = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (session.connecting || qrStatus.value === 'confirmed') {\n return '登录信息已确认,正在建立连接';\n }\n if (qrStatus.value === 'loading') {\n return '正在创建扫码登录会话';\n }\n if (qrStatus.value === 'scanned') {\n return '请在手机 App 上确认登录';\n }\n if (qrStatus.value === 'expired') {\n return '请刷新二维码后重新扫码';\n }\n if (qrStatus.value === 'error') {\n return '请稍后重试';\n }\n return '使用已登录的手机 App 扫描二维码';\n });\n const qrRefreshText = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (qrStatus.value === 'loading') {\n return '生成中...';\n }\n if (qrStatus.value === 'expired' || qrStatus.value === 'error') {\n return '重新生成二维码';\n }\n return '刷新二维码';\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.onMounted)(() => {\n loadPlatformConfig();\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.onBeforeUnmount)(() => {\n stopQrLogin();\n });\n function clearFormMessage() {\n session.error = '';\n info.value = '';\n }\n function setLoginMode(mode) {\n loginMode.value = mode;\n loginAccount.value = '';\n loginPassword.value = '';\n clearFormMessage();\n if (mode === 'qr') {\n startQrLogin();\n return;\n }\n stopQrLogin();\n }\n async function submitLogin() {\n clearFormMessage();\n const type = loginMode.value === 'email' ? 2 : 1;\n await session.loginWithPassword(loginAccount.value, loginPassword.value, type);\n }\n function switchRegisterType(type) {\n registerType.value = type;\n registerForm.number = '';\n registerForm.code = '';\n registerForm.password = '';\n registerForm.confirmPassword = '';\n registerForm.invitationCode = '';\n clearFormMessage();\n }\n async function requestEmailCode() {\n clearFormMessage();\n sendingCode.value = true;\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_6__.imClient.requestAuthCode(registerForm.number);\n info.value = '邮箱验证码已发送,请在当前注册表单中填写后继续。';\n } catch (error) {\n session.error = error.message || '验证码发送失败';\n } finally {\n sendingCode.value = false;\n }\n }\n async function submitRegister() {\n clearFormMessage();\n if (registerForm.password !== registerForm.confirmPassword) {\n session.error = '两次输入的密码不一致';\n return;\n }\n const result = await session.register({\n type: registerType.value,\n number: registerForm.number,\n code: registerType.value === 2 ? registerForm.code : '',\n password: registerForm.password,\n invitationCode: registerForm.invitationCode\n });\n if (result) {\n info.value = '注册成功,正在进入系统。';\n }\n }\n function openRegister() {\n clearFormMessage();\n stopQrLogin();\n view.value = 'register';\n }\n function backToLogin() {\n clearFormMessage();\n loginMode.value = 'phone';\n stopQrLogin();\n view.value = 'login';\n }\n function resetQrState() {\n qrStatus.value = 'idle';\n qrCodeImage.value = '';\n qrSessionToken.value = '';\n qrUserName.value = '';\n qrUserPortrait.value = '';\n }\n function clearQrExpireTimer() {\n if (qrExpireTimer) {\n window.clearTimeout(qrExpireTimer);\n qrExpireTimer = null;\n }\n }\n function stopQrLogin() {\n qrGeneration += 1;\n clearQrExpireTimer();\n resetQrState();\n }\n function refreshQrLogin() {\n startQrLogin(true);\n }\n async function startQrLogin(force = false) {\n if (loginMode.value !== 'qr') {\n return;\n }\n if (!force && qrSessionToken.value && qrCodeImage.value && !['expired', 'error'].includes(qrStatus.value)) {\n return;\n }\n qrGeneration += 1;\n const generation = qrGeneration;\n clearQrExpireTimer();\n clearFormMessage();\n qrStatus.value = 'loading';\n qrCodeImage.value = '';\n qrSessionToken.value = '';\n qrUserName.value = '';\n qrUserPortrait.value = '';\n try {\n const pcSession = await _services_imClient__WEBPACK_IMPORTED_MODULE_6__.imClient.createPcSession();\n if (generation !== qrGeneration || loginMode.value !== 'qr') {\n return;\n }\n const token = String(pcSession.token || '');\n if (!token) {\n throw new Error('服务端没有返回扫码 token');\n }\n qrSessionToken.value = token;\n qrCodeImage.value = jr_qrcode__WEBPACK_IMPORTED_MODULE_2___default().getQrBase64(QR_CODE_PREFIX_PC_SESSION + token);\n qrStatus.value = 'waiting';\n const expireMs = Math.max(30000, Math.min(Number(pcSession.expired || 300000), 300000));\n qrExpireTimer = window.setTimeout(() => {\n if (generation === qrGeneration && qrStatus.value !== 'confirmed' && !session.isAuthenticated) {\n qrStatus.value = 'expired';\n }\n }, expireMs);\n pollQrLogin(generation, token);\n } catch (error) {\n if (generation !== qrGeneration) {\n return;\n }\n qrStatus.value = 'error';\n session.error = error.message || '二维码加载失败';\n }\n }\n async function pollQrLogin(generation, token) {\n try {\n while (generation === qrGeneration && loginMode.value === 'qr' && !session.isAuthenticated) {\n const payload = await _services_imClient__WEBPACK_IMPORTED_MODULE_6__.imClient.loginWithPcSession(token);\n if (generation !== qrGeneration || loginMode.value !== 'qr') {\n return;\n }\n const code = Number(payload.code);\n const data = payload.data || payload.result || {};\n const status = Number(data.status);\n if (code === 0 && data.imToken) {\n qrStatus.value = 'confirmed';\n clearQrExpireTimer();\n await session.completePcSessionLogin(data);\n return;\n }\n if (code === 20042 || status === 1 || status === 3) {\n qrStatus.value = 'scanned';\n qrUserName.value = data.userName || data.displayName || qrUserName.value;\n qrUserPortrait.value = data.portrait || qrUserPortrait.value;\n await delay(1000);\n continue;\n }\n if (status === 0 || code === 13) {\n qrStatus.value = 'waiting';\n await delay(1000);\n continue;\n }\n if (status === 4) {\n qrStatus.value = 'expired';\n session.error = payload.message || '扫码登录已取消';\n return;\n }\n if (payload.message) {\n throw new Error(payload.message);\n }\n await delay(1000);\n }\n } catch (error) {\n if (generation === qrGeneration && loginMode.value === 'qr' && !session.isAuthenticated) {\n qrStatus.value = 'error';\n session.error = error.message || '扫码登录失败';\n }\n }\n }\n function delay(ms) {\n return new Promise(resolve => window.setTimeout(resolve, ms));\n }\n async function loadPlatformConfig() {\n try {\n const response = await axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"].get(_config__WEBPACK_IMPORTED_MODULE_4__.appConfig.platformConfigApi, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '平台配置加载失败');\n }\n const config = response.data?.result || {};\n const name = String(config.platformName || '').trim();\n const logo = String(config.logoUrl || config.logo || '').trim();\n const version = String(config.version || '').trim();\n platformName.value = name || defaultPlatformName;\n platformLogo.value = resolveBrandLogo(logo, version);\n } catch (error) {\n platformName.value = defaultPlatformName;\n platformLogo.value = defaultPlatformLogo;\n }\n applyDocumentBrand();\n }\n function resolveBrandLogo(value, version = '') {\n const logo = String(value || '').trim();\n if (!logo) {\n return defaultPlatformLogo;\n }\n if (/^(https?:|data:|blob:)/i.test(logo)) {\n return appendBrandVersion(logo, version);\n }\n if (logo.startsWith('//')) {\n return appendBrandVersion(`${window.location.protocol}${logo}`, version);\n }\n const base = logo.startsWith('/') ? _config__WEBPACK_IMPORTED_MODULE_4__.appConfig.adminServer : `${_config__WEBPACK_IMPORTED_MODULE_4__.appConfig.adminServer}/`;\n return appendBrandVersion(new URL(logo, base).toString(), version);\n }\n function appendBrandVersion(url, version) {\n if (!version || /^(data:|blob:)/i.test(url)) {\n return url;\n }\n const parsed = new URL(url, window.location.href);\n parsed.searchParams.set('v', version);\n return parsed.toString();\n }\n function applyDocumentBrand() {\n if (typeof document === 'undefined') {\n return;\n }\n document.title = platformName.value || defaultPlatformName;\n let icon = document.querySelector('link[rel=\"icon\"]');\n if (!icon) {\n icon = document.createElement('link');\n icon.setAttribute('rel', 'icon');\n document.head.appendChild(icon);\n }\n icon.setAttribute('href', platformLogo.value || defaultPlatformLogo);\n }\n function handleBrandLogoError() {\n if (platformLogo.value !== defaultPlatformLogo) {\n platformLogo.value = defaultPlatformLogo;\n applyDocumentBrand();\n }\n }\n const __returned__ = {\n session,\n view,\n loginMode,\n loginAccount,\n loginPassword,\n registerType,\n registerForm,\n sendingCode,\n info,\n QR_CODE_PREFIX_PC_SESSION,\n qrStatus,\n qrCodeImage,\n qrSessionToken,\n qrUserName,\n qrUserPortrait,\n get qrGeneration() {\n return qrGeneration;\n },\n set qrGeneration(v) {\n qrGeneration = v;\n },\n get qrExpireTimer() {\n return qrExpireTimer;\n },\n set qrExpireTimer(v) {\n qrExpireTimer = v;\n },\n defaultPlatformName,\n defaultPlatformLogo,\n platformName,\n platformLogo,\n canSubmitLogin,\n canRequestEmailCode,\n canSubmitRegister,\n qrUserInitial,\n qrStatusTitle,\n qrStatusText,\n qrRefreshText,\n clearFormMessage,\n setLoginMode,\n submitLogin,\n switchRegisterType,\n requestEmailCode,\n submitRegister,\n openRegister,\n backToLogin,\n resetQrState,\n clearQrExpireTimer,\n stopQrLogin,\n refreshQrLogin,\n startQrLogin,\n pollQrLogin,\n delay,\n loadPlatformConfig,\n resolveBrandLogo,\n appendBrandVersion,\n applyDocumentBrand,\n handleBrandLogoError,\n get axios() {\n return axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n },\n get jrQRCode() {\n return (jr_qrcode__WEBPACK_IMPORTED_MODULE_2___default());\n },\n computed: vue__WEBPACK_IMPORTED_MODULE_3__.computed,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_3__.onBeforeUnmount,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_3__.onMounted,\n reactive: vue__WEBPACK_IMPORTED_MODULE_3__.reactive,\n ref: vue__WEBPACK_IMPORTED_MODULE_3__.ref,\n get appConfig() {\n return _config__WEBPACK_IMPORTED_MODULE_4__.appConfig;\n },\n get useSessionStore() {\n return _stores_session__WEBPACK_IMPORTED_MODULE_5__.useSessionStore;\n },\n get imClient() {\n return _services_imClient__WEBPACK_IMPORTED_MODULE_6__.imClient;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/LoginView.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! axios */ \"./node_modules/axios/lib/axios.js\");\n/* harmony import */ var jr_qrcode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! jr-qrcode */ \"./node_modules/jr-qrcode/dist/jr-qrcode.js\");\n/* harmony import */ var jr_qrcode__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(jr_qrcode__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/config */ \"./src/config.js\");\n/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/stores/session */ \"./src/stores/session.js\");\n/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/services/imClient */ \"./src/services/imClient.js\");\n/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/composables/useAutoDismiss */ \"./src/composables/useAutoDismiss.js\");\n\n\n\n\n\n\n\n\nconst QR_CODE_PREFIX_PC_SESSION = 'wildfirechat://pcsession/';\nconst defaultPlatformLogo = '/favicon.ico';\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'LoginView',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_5__.useSessionStore)();\n const view = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('login');\n const loginMode = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('phone');\n const loginAccount = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const loginPassword = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const registerType = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(1);\n const registerForm = (0,vue__WEBPACK_IMPORTED_MODULE_3__.reactive)({\n number: '',\n code: '',\n password: '',\n confirmPassword: '',\n invitationCode: ''\n });\n const sendingCode = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(false);\n const info = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_7__.useAutoDismiss)(() => session.error, value => {\n if (session.error === value) session.error = '';\n });\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_7__.useAutoDismiss)(info, value => {\n if (info.value === value) info.value = '';\n });\n const qrStatus = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('idle');\n const qrCodeImage = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const qrSessionToken = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const qrUserName = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const qrUserPortrait = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n let qrGeneration = 0;\n let qrExpireTimer = null;\n const defaultPlatformName = _config__WEBPACK_IMPORTED_MODULE_4__.appConfig.appName;\n const platformName = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(defaultPlatformName);\n const platformLogo = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(defaultPlatformLogo);\n const canSubmitLogin = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => loginAccount.value.length >= 3 && loginPassword.value.length >= 1);\n const canRequestEmailCode = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => registerType.value === 2 && /\\S+@\\S+\\.\\S+/.test(registerForm.number));\n const canSubmitRegister = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (registerForm.password.length < 1 || registerForm.password !== registerForm.confirmPassword) {\n return false;\n }\n if (registerType.value === 2) {\n return canRequestEmailCode.value && registerForm.code.length >= 1;\n }\n return registerForm.number.length >= 5;\n });\n const qrUserInitial = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => String(qrUserName.value || 'U').slice(0, 1).toUpperCase());\n const qrStatusTitle = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (session.connecting || qrStatus.value === 'confirmed') {\n return '正在进入';\n }\n if (qrStatus.value === 'loading') {\n return '正在生成二维码';\n }\n if (qrStatus.value === 'scanned') {\n return qrUserName.value ? `${qrUserName.value} 已扫码` : '已扫码,待确认';\n }\n if (qrStatus.value === 'expired') {\n return '二维码已过期';\n }\n if (qrStatus.value === 'error') {\n return '二维码加载失败';\n }\n return '扫码登录';\n });\n const qrStatusText = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (session.connecting || qrStatus.value === 'confirmed') {\n return '登录信息已确认,正在建立连接';\n }\n if (qrStatus.value === 'loading') {\n return '正在创建扫码登录会话';\n }\n if (qrStatus.value === 'scanned') {\n return '请在手机 App 上确认登录';\n }\n if (qrStatus.value === 'expired') {\n return '请刷新二维码后重新扫码';\n }\n if (qrStatus.value === 'error') {\n return '请稍后重试';\n }\n return '使用已登录的手机 App 扫描二维码';\n });\n const qrRefreshText = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n if (qrStatus.value === 'loading') {\n return '生成中...';\n }\n if (qrStatus.value === 'expired' || qrStatus.value === 'error') {\n return '重新生成二维码';\n }\n return '刷新二维码';\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.onMounted)(() => {\n loadPlatformConfig();\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_3__.onBeforeUnmount)(() => {\n stopQrLogin();\n });\n function clearFormMessage() {\n session.error = '';\n info.value = '';\n }\n function setLoginMode(mode) {\n loginMode.value = mode;\n loginAccount.value = '';\n loginPassword.value = '';\n clearFormMessage();\n if (mode === 'qr') {\n startQrLogin();\n return;\n }\n stopQrLogin();\n }\n async function submitLogin() {\n clearFormMessage();\n const type = loginMode.value === 'email' ? 2 : 1;\n await session.loginWithPassword(loginAccount.value, loginPassword.value, type);\n }\n function switchRegisterType(type) {\n registerType.value = type;\n registerForm.number = '';\n registerForm.code = '';\n registerForm.password = '';\n registerForm.confirmPassword = '';\n registerForm.invitationCode = '';\n clearFormMessage();\n }\n async function requestEmailCode() {\n clearFormMessage();\n sendingCode.value = true;\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_6__.imClient.requestAuthCode(registerForm.number);\n info.value = '邮箱验证码已发送,请在当前注册表单中填写后继续。';\n } catch (error) {\n session.error = error.message || '验证码发送失败';\n } finally {\n sendingCode.value = false;\n }\n }\n async function submitRegister() {\n clearFormMessage();\n if (registerForm.password !== registerForm.confirmPassword) {\n session.error = '两次输入的密码不一致';\n return;\n }\n const result = await session.register({\n type: registerType.value,\n number: registerForm.number,\n code: registerType.value === 2 ? registerForm.code : '',\n password: registerForm.password,\n invitationCode: registerForm.invitationCode\n });\n if (result) {\n info.value = '注册成功,正在进入系统。';\n }\n }\n function openRegister() {\n clearFormMessage();\n stopQrLogin();\n view.value = 'register';\n }\n function backToLogin() {\n clearFormMessage();\n loginMode.value = 'phone';\n stopQrLogin();\n view.value = 'login';\n }\n function resetQrState() {\n qrStatus.value = 'idle';\n qrCodeImage.value = '';\n qrSessionToken.value = '';\n qrUserName.value = '';\n qrUserPortrait.value = '';\n }\n function clearQrExpireTimer() {\n if (qrExpireTimer) {\n window.clearTimeout(qrExpireTimer);\n qrExpireTimer = null;\n }\n }\n function stopQrLogin() {\n qrGeneration += 1;\n clearQrExpireTimer();\n resetQrState();\n }\n function refreshQrLogin() {\n startQrLogin(true);\n }\n async function startQrLogin(force = false) {\n if (loginMode.value !== 'qr') {\n return;\n }\n if (!force && qrSessionToken.value && qrCodeImage.value && !['expired', 'error'].includes(qrStatus.value)) {\n return;\n }\n qrGeneration += 1;\n const generation = qrGeneration;\n clearQrExpireTimer();\n clearFormMessage();\n qrStatus.value = 'loading';\n qrCodeImage.value = '';\n qrSessionToken.value = '';\n qrUserName.value = '';\n qrUserPortrait.value = '';\n try {\n const pcSession = await _services_imClient__WEBPACK_IMPORTED_MODULE_6__.imClient.createPcSession();\n if (generation !== qrGeneration || loginMode.value !== 'qr') {\n return;\n }\n const token = String(pcSession.token || '');\n if (!token) {\n throw new Error('服务端没有返回扫码 token');\n }\n qrSessionToken.value = token;\n qrCodeImage.value = jr_qrcode__WEBPACK_IMPORTED_MODULE_2___default().getQrBase64(QR_CODE_PREFIX_PC_SESSION + token);\n qrStatus.value = 'waiting';\n const expireMs = Math.max(30000, Math.min(Number(pcSession.expired || 300000), 300000));\n qrExpireTimer = window.setTimeout(() => {\n if (generation === qrGeneration && qrStatus.value !== 'confirmed' && !session.isAuthenticated) {\n qrStatus.value = 'expired';\n }\n }, expireMs);\n pollQrLogin(generation, token);\n } catch (error) {\n if (generation !== qrGeneration) {\n return;\n }\n qrStatus.value = 'error';\n session.error = error.message || '二维码加载失败';\n }\n }\n async function pollQrLogin(generation, token) {\n try {\n while (generation === qrGeneration && loginMode.value === 'qr' && !session.isAuthenticated) {\n const payload = await _services_imClient__WEBPACK_IMPORTED_MODULE_6__.imClient.loginWithPcSession(token);\n if (generation !== qrGeneration || loginMode.value !== 'qr') {\n return;\n }\n const code = Number(payload.code);\n const data = payload.data || payload.result || {};\n const status = Number(data.status);\n if (code === 0 && data.imToken) {\n qrStatus.value = 'confirmed';\n clearQrExpireTimer();\n await session.completePcSessionLogin(data);\n return;\n }\n if (code === 20042 || status === 1 || status === 3) {\n qrStatus.value = 'scanned';\n qrUserName.value = data.userName || data.displayName || qrUserName.value;\n qrUserPortrait.value = data.portrait || qrUserPortrait.value;\n await delay(1000);\n continue;\n }\n if (status === 0 || code === 13) {\n qrStatus.value = 'waiting';\n await delay(1000);\n continue;\n }\n if (status === 4) {\n qrStatus.value = 'expired';\n session.error = payload.message || '扫码登录已取消';\n return;\n }\n if (payload.message) {\n throw new Error(payload.message);\n }\n await delay(1000);\n }\n } catch (error) {\n if (generation === qrGeneration && loginMode.value === 'qr' && !session.isAuthenticated) {\n qrStatus.value = 'error';\n session.error = error.message || '扫码登录失败';\n }\n }\n }\n function delay(ms) {\n return new Promise(resolve => window.setTimeout(resolve, ms));\n }\n async function loadPlatformConfig() {\n try {\n const response = await axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"].get(_config__WEBPACK_IMPORTED_MODULE_4__.appConfig.platformConfigApi, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '平台配置加载失败');\n }\n const config = response.data?.result || {};\n const name = String(config.platformName || '').trim();\n const logo = String(config.logoUrl || config.logo || '').trim();\n const version = String(config.version || '').trim();\n platformName.value = name || defaultPlatformName;\n platformLogo.value = resolveBrandLogo(logo, version);\n } catch (error) {\n platformName.value = defaultPlatformName;\n platformLogo.value = defaultPlatformLogo;\n }\n applyDocumentBrand();\n }\n function resolveBrandLogo(value, version = '') {\n const logo = String(value || '').trim();\n if (!logo) {\n return defaultPlatformLogo;\n }\n if (/^(https?:|data:|blob:)/i.test(logo)) {\n return appendBrandVersion(logo, version);\n }\n if (logo.startsWith('//')) {\n return appendBrandVersion(`${window.location.protocol}${logo}`, version);\n }\n const base = logo.startsWith('/') ? _config__WEBPACK_IMPORTED_MODULE_4__.appConfig.adminServer : `${_config__WEBPACK_IMPORTED_MODULE_4__.appConfig.adminServer}/`;\n return appendBrandVersion(new URL(logo, base).toString(), version);\n }\n function appendBrandVersion(url, version) {\n if (!version || /^(data:|blob:)/i.test(url)) {\n return url;\n }\n const parsed = new URL(url, window.location.href);\n parsed.searchParams.set('v', version);\n return parsed.toString();\n }\n function applyDocumentBrand() {\n if (typeof document === 'undefined') {\n return;\n }\n document.title = platformName.value || defaultPlatformName;\n let icon = document.querySelector('link[rel=\"icon\"]');\n if (!icon) {\n icon = document.createElement('link');\n icon.setAttribute('rel', 'icon');\n document.head.appendChild(icon);\n }\n icon.setAttribute('href', platformLogo.value || defaultPlatformLogo);\n }\n function handleBrandLogoError() {\n if (platformLogo.value !== defaultPlatformLogo) {\n platformLogo.value = defaultPlatformLogo;\n applyDocumentBrand();\n }\n }\n const __returned__ = {\n session,\n view,\n loginMode,\n loginAccount,\n loginPassword,\n registerType,\n registerForm,\n sendingCode,\n info,\n QR_CODE_PREFIX_PC_SESSION,\n qrStatus,\n qrCodeImage,\n qrSessionToken,\n qrUserName,\n qrUserPortrait,\n get qrGeneration() {\n return qrGeneration;\n },\n set qrGeneration(v) {\n qrGeneration = v;\n },\n get qrExpireTimer() {\n return qrExpireTimer;\n },\n set qrExpireTimer(v) {\n qrExpireTimer = v;\n },\n defaultPlatformName,\n defaultPlatformLogo,\n platformName,\n platformLogo,\n canSubmitLogin,\n canRequestEmailCode,\n canSubmitRegister,\n qrUserInitial,\n qrStatusTitle,\n qrStatusText,\n qrRefreshText,\n clearFormMessage,\n setLoginMode,\n submitLogin,\n switchRegisterType,\n requestEmailCode,\n submitRegister,\n openRegister,\n backToLogin,\n resetQrState,\n clearQrExpireTimer,\n stopQrLogin,\n refreshQrLogin,\n startQrLogin,\n pollQrLogin,\n delay,\n loadPlatformConfig,\n resolveBrandLogo,\n appendBrandVersion,\n applyDocumentBrand,\n handleBrandLogoError,\n get axios() {\n return axios__WEBPACK_IMPORTED_MODULE_1__[\"default\"];\n },\n get jrQRCode() {\n return (jr_qrcode__WEBPACK_IMPORTED_MODULE_2___default());\n },\n computed: vue__WEBPACK_IMPORTED_MODULE_3__.computed,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_3__.onBeforeUnmount,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_3__.onMounted,\n reactive: vue__WEBPACK_IMPORTED_MODULE_3__.reactive,\n ref: vue__WEBPACK_IMPORTED_MODULE_3__.ref,\n get appConfig() {\n return _config__WEBPACK_IMPORTED_MODULE_4__.appConfig;\n },\n get useSessionStore() {\n return _stores_session__WEBPACK_IMPORTED_MODULE_5__.useSessionStore;\n },\n get imClient() {\n return _services_imClient__WEBPACK_IMPORTED_MODULE_6__.imClient;\n },\n get useAutoDismiss() {\n return _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_7__.useAutoDismiss;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/LoginView.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -49,7 +49,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _MessageList_vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./MessageList.vue */ \"./src/components/chat/MessageList.vue\");\n/* harmony import */ var _MessageComposer_vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./MessageComposer.vue */ \"./src/components/chat/MessageComposer.vue\");\n/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @/services/imClient */ \"./src/services/imClient.js\");\n/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @/stores/conversations */ \"./src/stores/conversations.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/stores/session */ \"./src/stores/session.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ChatPanel',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_16__.useConversationStore)();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_17__.useContactStore)();\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_18__.useSessionStore)();\n const activeConversation = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => conversations.activeConversation);\n const groupMenuOpen = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)(false);\n const singleProfileOpen = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)(false);\n const singleAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const singleProfileSaving = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)(false);\n const singleProfileNotice = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const singleProfileError = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const groupPanel = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const groupBusy = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)(false);\n const groupDetail = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)(null);\n const groupMembers = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)([]);\n const groupAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const manageSection = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const selectedAdminIds = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)([]);\n const selectedKickIds = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)([]);\n const transferTargetId = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const profileDraft = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)({\n name: '',\n announcement: '',\n welcomeText: ''\n });\n const muteDraft = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)({\n mode: 'off',\n scheduleType: 'once',\n startsAtLocal: '',\n endsAtLocal: '',\n dailyStart: '09:00',\n dailyEnd: '18:00'\n });\n const muteSaveNotice = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const muteSaveError = (0,vue__WEBPACK_IMPORTED_MODULE_12__.ref)('');\n const singlePeerId = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n if (!activeConversation.value || isGroupConversation.value) {\n return '';\n }\n return String(activeConversation.value.target || activeConversation.value.raw?.target || activeConversation.value.id?.replace(/^single-/, '') || '');\n });\n const singleContact = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n const peerId = singlePeerId.value;\n if (!peerId) {\n return null;\n }\n return contacts.contacts.find(contact => String(contact.uid || contact.id || '') === peerId) || null;\n });\n const singleProfile = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n const contact = singleContact.value;\n const conversation = activeConversation.value || {};\n const rawUser = contact?.rawUser || {};\n const displayName = contact?.alias || rawUser.displayName || rawUser.name || contact?.title || conversation.title || singlePeerId.value || '未知用户';\n const rawName = rawUser.displayName || rawUser.name || contact?.title || conversation.title || '';\n return {\n uid: singlePeerId.value,\n displayName,\n rawName,\n mobile: rawUser.mobile || conversation.raw?.mobile || '',\n address: rawUser.address || conversation.raw?.address || '',\n portrait: contact?.portrait || conversation.portrait || '',\n avatarText: String(displayName || '?').slice(0, 1).toUpperCase(),\n alias: contact?.alias || ''\n };\n });\n const isGroupConversation = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n return ['group', 'channel'].includes(activeConversation.value?.type) || activeConversation.value?.raw?.type === 'group';\n });\n const currentGroupRole = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n return groupDetail.value?.myRole || activeConversation.value?.role || activeConversation.value?.raw?.role || '';\n });\n const isGroupOwner = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => currentGroupRole.value === 'owner');\n const canManageGroup = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => ['owner', 'admin'].includes(currentGroupRole.value));\n const adminCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => groupMembers.value.filter(member => member.role !== 'owner'));\n const transferableMembers = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => groupMembers.value.filter(member => member.role !== 'owner'));\n const messageDetail = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => conversations.messageDetail || null);\n const messageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => messageDetail.value?.group || null);\n const isMessageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n return messageDetail.value?.conversationType === 'group' || Boolean(messageDetail.value?.group);\n });\n const messageDetailCounts = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n return messageDetailGroup.value?.counts || {\n read: 0,\n unread: 0,\n undelivered: 0,\n total: 0\n };\n });\n const kickCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n return groupMembers.value.filter(member => {\n if (member.uid === session.userId || member.role === 'owner') {\n return false;\n }\n if (currentGroupRole.value === 'admin') {\n return member.role === 'member';\n }\n return currentGroupRole.value === 'owner';\n });\n });\n const statusText = (0,vue__WEBPACK_IMPORTED_MODULE_12__.computed)(() => {\n if (activeConversation.value?.type === 'channel' && !conversations.canSendActiveConversation) {\n return '公告群,仅管理员可发言';\n }\n return session.connectionStatusText || (session.connected ? '已连接' : '未连接');\n });\n function formatDetailTime(value) {\n const timestamp = Number(value || 0);\n if (!timestamp) {\n return '暂无';\n }\n return new Intl.DateTimeFormat('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone\n }).format(timestamp);\n }\n function detailMemberName(member) {\n return member?.name || member?.displayName || member?.rawName || member?.uid || '-';\n }\n function detailMemberAvatar(member) {\n return String(detailMemberName(member) || '?').slice(0, 1).toUpperCase();\n }\n function detailRoleLabel(role) {\n if (role === 'owner') {\n return '群主';\n }\n if (role === 'admin') {\n return '管理员';\n }\n return '';\n }\n function closeGroupMenu() {\n groupMenuOpen.value = false;\n }\n function toggleGroupMenu() {\n if (!isGroupConversation.value) {\n return;\n }\n groupMenuOpen.value = !groupMenuOpen.value;\n }\n async function openSingleProfile() {\n if (!activeConversation.value || isGroupConversation.value) {\n return;\n }\n closeGroupMenu();\n singleProfileNotice.value = '';\n singleProfileError.value = '';\n singleAliasDraft.value = singleProfile.value.alias || '';\n singleProfileOpen.value = true;\n contacts.refreshContacts().then(() => {\n if (singleProfileOpen.value) {\n singleAliasDraft.value = singleProfile.value.alias || '';\n }\n }).catch(() => {});\n }\n function closeSingleProfile() {\n if (singleProfileSaving.value) {\n return;\n }\n singleProfileOpen.value = false;\n singleProfileNotice.value = '';\n singleProfileError.value = '';\n }\n async function saveSingleAlias() {\n const peerId = singleProfile.value.uid;\n if (!peerId || singleProfileSaving.value) {\n return;\n }\n singleProfileSaving.value = true;\n singleProfileNotice.value = '';\n singleProfileError.value = '';\n try {\n const ok = await contacts.updateContactAlias(peerId, singleAliasDraft.value);\n if (!ok) {\n singleProfileError.value = contacts.actionError || '备注名修改失败';\n return;\n }\n await contacts.refreshContacts({\n force: true\n }).catch(() => {});\n const refreshedContact = contacts.contacts.find(contact => String(contact.uid || contact.id || '') === peerId) || singleContact.value;\n const nextTitle = refreshedContact?.title || singleAliasDraft.value || singleProfile.value.rawName || singleProfile.value.displayName || peerId;\n conversations.upsertConversation({\n ...activeConversation.value,\n title: nextTitle,\n portrait: refreshedContact?.portrait || activeConversation.value?.portrait || '',\n avatarText: String(nextTitle || '?').slice(0, 1).toUpperCase(),\n raw: {\n ...(activeConversation.value?.raw || {}),\n target: peerId,\n mobile: refreshedContact?.rawUser?.mobile || activeConversation.value?.raw?.mobile || '',\n address: refreshedContact?.rawUser?.address || activeConversation.value?.raw?.address || '',\n alias: refreshedContact?.alias || singleAliasDraft.value\n }\n });\n singleAliasDraft.value = refreshedContact?.alias || singleAliasDraft.value;\n singleProfileNotice.value = '备注名已保存';\n } catch (error) {\n singleProfileError.value = error.message || '备注名修改失败';\n } finally {\n singleProfileSaving.value = false;\n }\n }\n function handleSenderProfileUpdated() {\n contacts.refreshContacts({\n force: true\n }).catch(() => {});\n conversations.syncActiveMessages({\n allowReadReceipt: true\n });\n if (groupPanel.value === 'members') {\n loadGroupMembers();\n }\n }\n function closeGroupPanel() {\n groupPanel.value = '';\n groupBusy.value = false;\n clearMuteSaveFeedback();\n }\n async function loadGroupDetail() {\n if (!session.userId || !activeConversation.value?.target) {\n return null;\n }\n groupBusy.value = true;\n try {\n groupDetail.value = await _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient.getGroupDetail(session.userId, activeConversation.value.target);\n return groupDetail.value;\n } catch (error) {\n conversations.setActionError(error.message || '群资料加载失败');\n return null;\n } finally {\n groupBusy.value = false;\n }\n }\n async function openGroupOverview() {\n if (!isGroupConversation.value) {\n return;\n }\n closeGroupMenu();\n groupPanel.value = 'overview';\n await loadGroupDetail();\n }\n async function openGroupMembers() {\n closeGroupMenu();\n groupPanel.value = 'members';\n await loadGroupMembers();\n }\n async function loadGroupMembers() {\n groupBusy.value = true;\n try {\n groupMembers.value = await _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient.getGroupMembers(session.userId, activeConversation.value.target);\n selectedAdminIds.value = groupMembers.value.filter(member => member.role === 'admin').map(member => member.uid);\n return groupMembers.value;\n } catch (error) {\n conversations.setActionError(error.message || '群员加载失败');\n return [];\n } finally {\n groupBusy.value = false;\n }\n }\n async function openGroupAlias() {\n closeGroupMenu();\n groupPanel.value = 'alias';\n const detail = await loadGroupDetail();\n groupAliasDraft.value = detail?.myAlias || '';\n }\n function msToLocalInput(value) {\n const timestamp = Number(value || 0);\n if (!timestamp) {\n return '';\n }\n const date = new Date(timestamp);\n const local = new Date(date.getTime() - date.getTimezoneOffset() * 60000);\n return local.toISOString().slice(0, 16);\n }\n function localInputToMs(value) {\n return value ? new Date(value).getTime() : 0;\n }\n function prepareManagementDrafts() {\n clearMuteSaveFeedback();\n profileDraft.value = {\n name: groupDetail.value?.name || activeConversation.value?.title || '',\n announcement: groupDetail.value?.announcement || '',\n welcomeText: groupDetail.value?.welcomeText || ''\n };\n const setting = groupDetail.value?.muteSetting || {};\n muteDraft.value = {\n mode: setting.mode || 'off',\n scheduleType: setting.scheduleType || 'once',\n startsAtLocal: msToLocalInput(setting.startsAtMs),\n endsAtLocal: msToLocalInput(setting.endsAtMs),\n dailyStart: setting.dailyStart || '09:00',\n dailyEnd: setting.dailyEnd || '18:00'\n };\n }\n function clearMuteSaveFeedback() {\n muteSaveNotice.value = '';\n muteSaveError.value = '';\n }\n async function openGroupManage() {\n if (!canManageGroup.value) {\n return;\n }\n closeGroupMenu();\n groupPanel.value = 'manage';\n manageSection.value = isGroupOwner.value ? 'admins' : 'profile';\n await loadGroupDetail();\n prepareManagementDrafts();\n await loadGroupMembers();\n }\n async function openTransferGroup() {\n groupPanel.value = 'transfer';\n transferTargetId.value = '';\n await loadGroupMembers();\n }\n async function saveGroupAlias() {\n if (!activeConversation.value?.target || groupBusy.value) {\n return;\n }\n groupBusy.value = true;\n try {\n const alias = await _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient.updateGroupAlias(session.userId, activeConversation.value.target, groupAliasDraft.value);\n groupDetail.value = {\n ...(groupDetail.value || {}),\n myAlias: alias\n };\n conversations.setActionNotice('本群昵称已保存');\n closeGroupPanel();\n } catch (error) {\n conversations.setActionError(error.message || '本群昵称保存失败');\n } finally {\n groupBusy.value = false;\n }\n }\n function toggleAdmin(userId) {\n const selected = new Set(selectedAdminIds.value);\n if (selected.has(userId)) {\n selected.delete(userId);\n } else {\n selected.add(userId);\n }\n selectedAdminIds.value = Array.from(selected);\n }\n function toggleKick(userId) {\n const selected = new Set(selectedKickIds.value);\n if (selected.has(userId)) {\n selected.delete(userId);\n } else {\n selected.add(userId);\n }\n selectedKickIds.value = Array.from(selected);\n }\n async function saveGroupAdmins() {\n if (!activeConversation.value?.target || groupBusy.value) {\n return;\n }\n groupBusy.value = true;\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient.setGroupAdmins(session.userId, activeConversation.value.target, selectedAdminIds.value);\n groupMembers.value = groupMembers.value.map(member => {\n if (member.role === 'owner') {\n return member;\n }\n return {\n ...member,\n role: selectedAdminIds.value.includes(member.uid) ? 'admin' : 'member'\n };\n });\n conversations.setActionNotice('管理员已更新');\n } catch (error) {\n conversations.setActionError(error.message || '管理员设置失败');\n } finally {\n groupBusy.value = false;\n }\n }\n async function saveGroupProfile() {\n if (!activeConversation.value?.target || groupBusy.value) {\n return;\n }\n groupBusy.value = true;\n try {\n const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient.updateGroupProfile(session.userId, activeConversation.value.target, profileDraft.value);\n groupDetail.value = {\n ...(groupDetail.value || {}),\n name: result.name,\n announcement: result.announcement,\n welcomeText: result.welcomeText\n };\n conversations.upsertConversation({\n ...activeConversation.value,\n title: result.name,\n avatarText: String(result.name || '?').slice(0, 1).toUpperCase(),\n updatedAt: Number(result.updatedAt || Date.now())\n });\n conversations.setActionNotice('群资料已保存');\n } catch (error) {\n conversations.setActionError(error.message || '群资料保存失败');\n } finally {\n groupBusy.value = false;\n }\n }\n async function kickSelectedMembers() {\n if (!selectedKickIds.value.length || groupBusy.value) {\n return;\n }\n if (!window.confirm('确认将所选成员移出群组?')) {\n return;\n }\n groupBusy.value = true;\n try {\n const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient.kickGroupMembers(session.userId, activeConversation.value.target, selectedKickIds.value);\n const removed = new Set(result.removedIds || selectedKickIds.value);\n groupMembers.value = groupMembers.value.filter(member => !removed.has(member.uid));\n selectedKickIds.value = [];\n conversations.setActionNotice('已移出群组');\n } catch (error) {\n conversations.setActionError(error.message || '踢人失败');\n } finally {\n groupBusy.value = false;\n }\n }\n async function saveMuteSetting() {\n if (!activeConversation.value?.target || groupBusy.value) {\n return;\n }\n clearMuteSaveFeedback();\n groupBusy.value = true;\n try {\n const setting = await _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient.updateGroupMuteSetting(session.userId, activeConversation.value.target, {\n mode: muteDraft.value.mode,\n scheduleType: muteDraft.value.scheduleType,\n startsAtMs: localInputToMs(muteDraft.value.startsAtLocal),\n endsAtMs: localInputToMs(muteDraft.value.endsAtLocal),\n dailyStart: muteDraft.value.dailyStart,\n dailyEnd: muteDraft.value.dailyEnd\n });\n groupDetail.value = {\n ...(groupDetail.value || {}),\n muteSetting: setting\n };\n muteSaveNotice.value = '禁言设置已保存';\n } catch (error) {\n muteSaveError.value = error.message || '禁言设置保存失败';\n } finally {\n groupBusy.value = false;\n }\n }\n async function leaveCurrentGroup() {\n if (!activeConversation.value || groupBusy.value) {\n return;\n }\n if (!window.confirm('确认退出该群组?')) {\n return;\n }\n groupBusy.value = true;\n const ok = await conversations.leaveGroup(activeConversation.value);\n groupBusy.value = false;\n if (ok) {\n closeGroupPanel();\n }\n }\n async function dismissCurrentGroup() {\n if (!activeConversation.value || groupBusy.value) {\n return;\n }\n if (!window.confirm('确认解散该群组?所有成员都将不可继续使用该群。')) {\n return;\n }\n groupBusy.value = true;\n const ok = await conversations.dismissGroup(activeConversation.value);\n groupBusy.value = false;\n if (ok) {\n closeGroupPanel();\n }\n }\n async function transferCurrentGroup() {\n if (!activeConversation.value?.target || !transferTargetId.value || groupBusy.value) {\n return;\n }\n if (!window.confirm('确认将群主转让给该成员?')) {\n return;\n }\n groupBusy.value = true;\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient.transferGroup(session.userId, activeConversation.value.target, transferTargetId.value);\n groupDetail.value = {\n ...(groupDetail.value || {}),\n myRole: 'member'\n };\n activeConversation.value.role = 'member';\n if (activeConversation.value.raw) {\n activeConversation.value.raw.role = 'member';\n }\n conversations.setActionNotice('群组已转让');\n closeGroupPanel();\n conversations.refreshRemoteConversations();\n } catch (error) {\n conversations.setActionError(error.message || '转让群组失败');\n } finally {\n groupBusy.value = false;\n }\n }\n function memberAvatar(member) {\n return String(member.displayName || member.uid || '?').slice(0, 1).toUpperCase();\n }\n document.addEventListener('click', closeGroupMenu);\n (0,vue__WEBPACK_IMPORTED_MODULE_12__.onBeforeUnmount)(() => {\n document.removeEventListener('click', closeGroupMenu);\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_12__.watch)(() => activeConversation.value?.id, () => {\n closeGroupMenu();\n closeSingleProfile();\n closeGroupPanel();\n groupDetail.value = null;\n groupMembers.value = [];\n groupAliasDraft.value = '';\n selectedAdminIds.value = [];\n selectedKickIds.value = [];\n transferTargetId.value = '';\n manageSection.value = '';\n });\n const __returned__ = {\n conversations,\n contacts,\n session,\n activeConversation,\n groupMenuOpen,\n singleProfileOpen,\n singleAliasDraft,\n singleProfileSaving,\n singleProfileNotice,\n singleProfileError,\n groupPanel,\n groupBusy,\n groupDetail,\n groupMembers,\n groupAliasDraft,\n manageSection,\n selectedAdminIds,\n selectedKickIds,\n transferTargetId,\n profileDraft,\n muteDraft,\n muteSaveNotice,\n muteSaveError,\n singlePeerId,\n singleContact,\n singleProfile,\n isGroupConversation,\n currentGroupRole,\n isGroupOwner,\n canManageGroup,\n adminCandidateMembers,\n transferableMembers,\n messageDetail,\n messageDetailGroup,\n isMessageDetailGroup,\n messageDetailCounts,\n kickCandidateMembers,\n statusText,\n formatDetailTime,\n detailMemberName,\n detailMemberAvatar,\n detailRoleLabel,\n closeGroupMenu,\n toggleGroupMenu,\n openSingleProfile,\n closeSingleProfile,\n saveSingleAlias,\n handleSenderProfileUpdated,\n closeGroupPanel,\n loadGroupDetail,\n openGroupOverview,\n openGroupMembers,\n loadGroupMembers,\n openGroupAlias,\n msToLocalInput,\n localInputToMs,\n prepareManagementDrafts,\n clearMuteSaveFeedback,\n openGroupManage,\n openTransferGroup,\n saveGroupAlias,\n toggleAdmin,\n toggleKick,\n saveGroupAdmins,\n saveGroupProfile,\n kickSelectedMembers,\n saveMuteSetting,\n leaveCurrentGroup,\n dismissCurrentGroup,\n transferCurrentGroup,\n memberAvatar,\n computed: vue__WEBPACK_IMPORTED_MODULE_12__.computed,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_12__.onBeforeUnmount,\n ref: vue__WEBPACK_IMPORTED_MODULE_12__.ref,\n watch: vue__WEBPACK_IMPORTED_MODULE_12__.watch,\n MessageList: _MessageList_vue__WEBPACK_IMPORTED_MODULE_13__[\"default\"],\n MessageComposer: _MessageComposer_vue__WEBPACK_IMPORTED_MODULE_14__[\"default\"],\n get imClient() {\n return _services_imClient__WEBPACK_IMPORTED_MODULE_15__.imClient;\n },\n get useConversationStore() {\n return _stores_conversations__WEBPACK_IMPORTED_MODULE_16__.useConversationStore;\n },\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_17__.useContactStore;\n },\n get useSessionStore() {\n return _stores_session__WEBPACK_IMPORTED_MODULE_18__.useSessionStore;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/ChatPanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert.js */ \"./node_modules/core-js/modules/es.map.get-or-insert.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert-computed.js */ \"./node_modules/core-js/modules/es.map.get-or-insert-computed.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _MessageList_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./MessageList.vue */ \"./src/components/chat/MessageList.vue\");\n/* harmony import */ var _MessageComposer_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./MessageComposer.vue */ \"./src/components/chat/MessageComposer.vue\");\n/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/services/imClient */ \"./src/services/imClient.js\");\n/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/stores/conversations */ \"./src/stores/conversations.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @/stores/session */ \"./src/stores/session.js\");\n/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @/composables/useAutoDismiss */ \"./src/composables/useAutoDismiss.js\");\n/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @/services/mediaProxy */ \"./src/services/mediaProxy.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ChatPanel',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_19__.useConversationStore)();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_20__.useContactStore)();\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__.useSessionStore)();\n const activeConversation = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => conversations.activeConversation);\n const pinnedMessageIsImage = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n const message = conversations.activePinnedMessage;\n return message?.attachment?.url && (message.type === 'image' || message.attachment.type === 'image');\n });\n const pinnedMessageText = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n const message = conversations.activePinnedMessage;\n if (!message) return '';\n const text = String(message.text || '').trim();\n if (text && text !== '[消息]') return text;\n const attachment = message.attachment || {};\n if (message.type === 'image' || attachment.type === 'image') return attachment.name || '图片';\n if (message.type === 'video' || attachment.type === 'video') return attachment.name || '视频';\n if (attachment.url) return attachment.name || '文件';\n return '[消息]';\n });\n const groupMenuOpen = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)(false);\n const singleProfileOpen = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)(false);\n const singleAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n const singleProfileSaving = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)(false);\n const singleProfileNotice = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n const singleProfileError = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n const groupPanel = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n const groupBusy = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)(false);\n const groupDetail = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)(null);\n const groupMembers = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)([]);\n const groupAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n const manageSection = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n const selectedAdminIds = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)([]);\n const selectedKickIds = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)([]);\n const transferTargetId = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n const profileDraft = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)({\n name: '',\n announcement: '',\n welcomeText: ''\n });\n const muteDraft = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)({\n mode: 'off',\n scheduleType: 'once',\n startsAtLocal: '',\n endsAtLocal: '',\n dailyStart: '09:00',\n dailyEnd: '18:00'\n });\n const muteSaveNotice = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n const muteSaveError = (0,vue__WEBPACK_IMPORTED_MODULE_15__.ref)('');\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_22__.useAutoDismiss)(() => singleProfileError.value || singleProfileNotice.value, value => {\n if ((singleProfileError.value || singleProfileNotice.value) === value) {\n singleProfileError.value = '';\n singleProfileNotice.value = '';\n }\n });\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_22__.useAutoDismiss)(() => muteSaveError.value || muteSaveNotice.value, value => {\n if ((muteSaveError.value || muteSaveNotice.value) === value) {\n muteSaveError.value = '';\n muteSaveNotice.value = '';\n }\n });\n const singlePeerId = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n if (!activeConversation.value || isGroupConversation.value) {\n return '';\n }\n return String(activeConversation.value.target || activeConversation.value.raw?.target || activeConversation.value.id?.replace(/^single-/, '') || '');\n });\n const singleContact = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n const peerId = singlePeerId.value;\n if (!peerId) {\n return null;\n }\n return contacts.contacts.find(contact => String(contact.uid || contact.id || '') === peerId) || null;\n });\n const singleProfile = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n const contact = singleContact.value;\n const conversation = activeConversation.value || {};\n const rawUser = contact?.rawUser || {};\n const displayName = contact?.alias || rawUser.displayName || rawUser.name || contact?.title || conversation.title || singlePeerId.value || '未知用户';\n const rawName = rawUser.displayName || rawUser.name || contact?.title || conversation.title || '';\n return {\n uid: singlePeerId.value,\n userId: rawUser.name || conversation.raw?.userId || singlePeerId.value,\n displayName,\n rawName,\n mobile: rawUser.mobile || conversation.raw?.mobile || '',\n address: rawUser.address || conversation.raw?.address || '',\n portrait: contact?.portrait || conversation.portrait || '',\n avatarText: String(displayName || '?').slice(0, 1).toUpperCase(),\n alias: contact?.alias || ''\n };\n });\n const groupDisplayId = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n return String(groupDetail.value?.publicId || '');\n });\n const isGroupConversation = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n return ['group', 'channel'].includes(activeConversation.value?.type) || activeConversation.value?.raw?.type === 'group';\n });\n const currentGroupRole = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n return groupDetail.value?.myRole || activeConversation.value?.role || activeConversation.value?.raw?.role || '';\n });\n const isGroupOwner = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => currentGroupRole.value === 'owner');\n const canManageGroup = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => ['owner', 'admin'].includes(currentGroupRole.value));\n const adminCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => groupMembers.value.filter(member => member.role !== 'owner'));\n const transferableMembers = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => groupMembers.value.filter(member => member.role !== 'owner'));\n const mentionCandidates = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n const members = new Map();\n groupMembers.value.forEach(member => {\n const uid = String(member?.uid || '').trim();\n if (uid) members.set(uid, member);\n });\n conversations.activeMessages.forEach(message => {\n const uid = String(message?.from || '').trim();\n if (!uid || uid === 'me' || uid === session.userId || members.has(uid)) return;\n members.set(uid, {\n uid,\n displayName: message?.senderName || uid,\n portrait: message?.senderPortrait || message?.portrait || '',\n role: message?.senderRole || 'member'\n });\n });\n return Array.from(members.values());\n });\n const messageDetail = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => conversations.messageDetail || null);\n const messageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => messageDetail.value?.group || null);\n const isMessageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n return messageDetail.value?.conversationType === 'group' || Boolean(messageDetail.value?.group);\n });\n const messageDetailCounts = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n return messageDetailGroup.value?.counts || {\n read: 0,\n unread: 0,\n undelivered: 0,\n total: 0\n };\n });\n const kickCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n return groupMembers.value.filter(member => {\n if (member.uid === session.userId || member.role === 'owner') {\n return false;\n }\n if (currentGroupRole.value === 'admin') {\n return member.role === 'member';\n }\n return currentGroupRole.value === 'owner';\n });\n });\n const statusText = (0,vue__WEBPACK_IMPORTED_MODULE_15__.computed)(() => {\n if (activeConversation.value?.type === 'channel' && !conversations.canSendActiveConversation) {\n return '公告群,仅管理员可发言';\n }\n return session.connectionStatusText || (session.connected ? '已连接' : '未连接');\n });\n function formatDetailTime(value) {\n const timestamp = Number(value || 0);\n if (!timestamp) {\n return '暂无';\n }\n return new Intl.DateTimeFormat('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone\n }).format(timestamp);\n }\n function detailMemberName(member) {\n return member?.name || member?.displayName || member?.rawName || member?.uid || '-';\n }\n function detailMemberAvatar(member) {\n return String(detailMemberName(member) || '?').slice(0, 1).toUpperCase();\n }\n function detailRoleLabel(role) {\n if (role === 'owner') {\n return '群主';\n }\n if (role === 'admin') {\n return '管理员';\n }\n return '';\n }\n function closeGroupMenu() {\n groupMenuOpen.value = false;\n }\n function toggleGroupMenu() {\n if (!isGroupConversation.value) {\n return;\n }\n groupMenuOpen.value = !groupMenuOpen.value;\n }\n async function openSingleProfile() {\n if (!activeConversation.value || isGroupConversation.value) {\n return;\n }\n closeGroupMenu();\n singleProfileNotice.value = '';\n singleProfileError.value = '';\n singleAliasDraft.value = singleProfile.value.alias || '';\n singleProfileOpen.value = true;\n contacts.refreshContacts().then(() => {\n if (singleProfileOpen.value) {\n singleAliasDraft.value = singleProfile.value.alias || '';\n }\n }).catch(() => {});\n }\n function closeSingleProfile() {\n if (singleProfileSaving.value) {\n return;\n }\n singleProfileOpen.value = false;\n singleProfileNotice.value = '';\n singleProfileError.value = '';\n }\n async function saveSingleAlias() {\n const peerId = singleProfile.value.uid;\n if (!peerId || singleProfileSaving.value) {\n return;\n }\n singleProfileSaving.value = true;\n singleProfileNotice.value = '';\n singleProfileError.value = '';\n try {\n const ok = await contacts.updateContactAlias(peerId, singleAliasDraft.value);\n if (!ok) {\n singleProfileError.value = contacts.actionError || '备注名修改失败';\n return;\n }\n await contacts.refreshContacts({\n force: true\n }).catch(() => {});\n const refreshedContact = contacts.contacts.find(contact => String(contact.uid || contact.id || '') === peerId) || singleContact.value;\n const nextTitle = refreshedContact?.title || singleAliasDraft.value || singleProfile.value.rawName || singleProfile.value.displayName || peerId;\n conversations.upsertConversation({\n ...activeConversation.value,\n title: nextTitle,\n portrait: refreshedContact?.portrait || activeConversation.value?.portrait || '',\n avatarText: String(nextTitle || '?').slice(0, 1).toUpperCase(),\n raw: {\n ...(activeConversation.value?.raw || {}),\n target: peerId,\n mobile: refreshedContact?.rawUser?.mobile || activeConversation.value?.raw?.mobile || '',\n address: refreshedContact?.rawUser?.address || activeConversation.value?.raw?.address || '',\n alias: refreshedContact?.alias || singleAliasDraft.value\n }\n });\n singleAliasDraft.value = refreshedContact?.alias || singleAliasDraft.value;\n singleProfileNotice.value = '备注名已保存';\n } catch (error) {\n singleProfileError.value = error.message || '备注名修改失败';\n } finally {\n singleProfileSaving.value = false;\n }\n }\n function handleSenderProfileUpdated() {\n contacts.refreshContacts({\n force: true\n }).catch(() => {});\n conversations.syncActiveMessages({\n allowReadReceipt: true\n });\n if (groupPanel.value === 'members') {\n loadGroupMembers();\n }\n }\n function closeGroupPanel() {\n groupPanel.value = '';\n groupBusy.value = false;\n clearMuteSaveFeedback();\n }\n async function loadGroupDetail() {\n if (!session.userId || !activeConversation.value?.target) {\n return null;\n }\n const requestedConversationId = activeConversation.value.id;\n const requestedTarget = activeConversation.value.target;\n groupBusy.value = true;\n try {\n const detail = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient.getGroupDetail(session.userId, requestedTarget);\n if (activeConversation.value?.id !== requestedConversationId) return null;\n groupDetail.value = detail;\n return groupDetail.value;\n } catch (error) {\n if (activeConversation.value?.id === requestedConversationId) {\n conversations.setActionError(error.message || '群资料加载失败');\n }\n return null;\n } finally {\n if (activeConversation.value?.id === requestedConversationId) groupBusy.value = false;\n }\n }\n async function openGroupOverview() {\n if (!isGroupConversation.value) {\n return;\n }\n closeGroupMenu();\n groupPanel.value = 'overview';\n await loadGroupDetail();\n }\n async function openGroupMembers() {\n closeGroupMenu();\n groupPanel.value = 'members';\n await loadGroupMembers();\n }\n async function loadGroupMembers({\n silent = false\n } = {}) {\n const requestedConversationId = activeConversation.value?.id;\n const requestedTarget = activeConversation.value?.target;\n if (!session.userId || !requestedConversationId || !requestedTarget) return [];\n groupBusy.value = true;\n try {\n const members = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient.getGroupMembers(session.userId, requestedTarget);\n if (activeConversation.value?.id !== requestedConversationId) return [];\n groupMembers.value = members;\n selectedAdminIds.value = groupMembers.value.filter(member => member.role === 'admin').map(member => member.uid);\n return groupMembers.value;\n } catch (error) {\n if (!silent && activeConversation.value?.id === requestedConversationId) {\n conversations.setActionError(error.message || '群员加载失败');\n }\n return [];\n } finally {\n if (activeConversation.value?.id === requestedConversationId) groupBusy.value = false;\n }\n }\n async function openGroupAlias() {\n closeGroupMenu();\n groupPanel.value = 'alias';\n const detail = await loadGroupDetail();\n groupAliasDraft.value = detail?.myAlias || '';\n }\n function msToLocalInput(value) {\n const timestamp = Number(value || 0);\n if (!timestamp) {\n return '';\n }\n const date = new Date(timestamp);\n const local = new Date(date.getTime() - date.getTimezoneOffset() * 60000);\n return local.toISOString().slice(0, 16);\n }\n function localInputToMs(value) {\n return value ? new Date(value).getTime() : 0;\n }\n function prepareManagementDrafts() {\n clearMuteSaveFeedback();\n profileDraft.value = {\n name: groupDetail.value?.name || activeConversation.value?.title || '',\n announcement: groupDetail.value?.announcement || '',\n welcomeText: groupDetail.value?.welcomeText || ''\n };\n const setting = groupDetail.value?.muteSetting || {};\n muteDraft.value = {\n mode: setting.mode || 'off',\n scheduleType: setting.scheduleType || 'once',\n startsAtLocal: msToLocalInput(setting.startsAtMs),\n endsAtLocal: msToLocalInput(setting.endsAtMs),\n dailyStart: setting.dailyStart || '09:00',\n dailyEnd: setting.dailyEnd || '18:00'\n };\n }\n function clearMuteSaveFeedback() {\n muteSaveNotice.value = '';\n muteSaveError.value = '';\n }\n async function openGroupManage() {\n if (!canManageGroup.value) {\n return;\n }\n closeGroupMenu();\n groupPanel.value = 'manage';\n manageSection.value = isGroupOwner.value ? 'admins' : 'profile';\n await loadGroupDetail();\n prepareManagementDrafts();\n await loadGroupMembers();\n }\n async function openTransferGroup() {\n groupPanel.value = 'transfer';\n transferTargetId.value = '';\n await loadGroupMembers();\n }\n async function saveGroupAlias() {\n if (!activeConversation.value?.target || groupBusy.value) {\n return;\n }\n groupBusy.value = true;\n try {\n const alias = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient.updateGroupAlias(session.userId, activeConversation.value.target, groupAliasDraft.value);\n groupDetail.value = {\n ...(groupDetail.value || {}),\n myAlias: alias\n };\n conversations.setActionNotice('本群昵称已保存');\n closeGroupPanel();\n } catch (error) {\n conversations.setActionError(error.message || '本群昵称保存失败');\n } finally {\n groupBusy.value = false;\n }\n }\n function toggleAdmin(userId) {\n const selected = new Set(selectedAdminIds.value);\n if (selected.has(userId)) {\n selected.delete(userId);\n } else {\n selected.add(userId);\n }\n selectedAdminIds.value = Array.from(selected);\n }\n function toggleKick(userId) {\n const selected = new Set(selectedKickIds.value);\n if (selected.has(userId)) {\n selected.delete(userId);\n } else {\n selected.add(userId);\n }\n selectedKickIds.value = Array.from(selected);\n }\n async function saveGroupAdmins() {\n if (!activeConversation.value?.target || groupBusy.value) {\n return;\n }\n groupBusy.value = true;\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient.setGroupAdmins(session.userId, activeConversation.value.target, selectedAdminIds.value);\n groupMembers.value = groupMembers.value.map(member => {\n if (member.role === 'owner') {\n return member;\n }\n return {\n ...member,\n role: selectedAdminIds.value.includes(member.uid) ? 'admin' : 'member'\n };\n });\n conversations.setActionNotice('管理员已更新');\n } catch (error) {\n conversations.setActionError(error.message || '管理员设置失败');\n } finally {\n groupBusy.value = false;\n }\n }\n async function saveGroupProfile() {\n if (!activeConversation.value?.target || groupBusy.value) {\n return;\n }\n groupBusy.value = true;\n try {\n const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient.updateGroupProfile(session.userId, activeConversation.value.target, profileDraft.value);\n groupDetail.value = {\n ...(groupDetail.value || {}),\n name: result.name,\n announcement: result.announcement,\n welcomeText: result.welcomeText\n };\n conversations.upsertConversation({\n ...activeConversation.value,\n title: result.name,\n avatarText: String(result.name || '?').slice(0, 1).toUpperCase(),\n updatedAt: Number(result.updatedAt || Date.now())\n });\n conversations.setActionNotice('群资料已保存');\n } catch (error) {\n conversations.setActionError(error.message || '群资料保存失败');\n } finally {\n groupBusy.value = false;\n }\n }\n async function kickSelectedMembers() {\n if (!selectedKickIds.value.length || groupBusy.value) {\n return;\n }\n if (!window.confirm('确认将所选成员移出群组?')) {\n return;\n }\n groupBusy.value = true;\n try {\n const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient.kickGroupMembers(session.userId, activeConversation.value.target, selectedKickIds.value);\n const removed = new Set(result.removedIds || selectedKickIds.value);\n groupMembers.value = groupMembers.value.filter(member => !removed.has(member.uid));\n selectedKickIds.value = [];\n conversations.setActionNotice('已移出群组');\n } catch (error) {\n conversations.setActionError(error.message || '踢人失败');\n } finally {\n groupBusy.value = false;\n }\n }\n async function saveMuteSetting() {\n if (!activeConversation.value?.target || groupBusy.value) {\n return;\n }\n clearMuteSaveFeedback();\n groupBusy.value = true;\n try {\n const setting = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient.updateGroupMuteSetting(session.userId, activeConversation.value.target, {\n mode: muteDraft.value.mode,\n scheduleType: muteDraft.value.scheduleType,\n startsAtMs: localInputToMs(muteDraft.value.startsAtLocal),\n endsAtMs: localInputToMs(muteDraft.value.endsAtLocal),\n dailyStart: muteDraft.value.dailyStart,\n dailyEnd: muteDraft.value.dailyEnd\n });\n groupDetail.value = {\n ...(groupDetail.value || {}),\n muteSetting: setting\n };\n muteSaveNotice.value = '禁言设置已保存';\n } catch (error) {\n muteSaveError.value = error.message || '禁言设置保存失败';\n } finally {\n groupBusy.value = false;\n }\n }\n async function leaveCurrentGroup() {\n if (!activeConversation.value || groupBusy.value) {\n return;\n }\n if (!window.confirm('确认退出该群组?')) {\n return;\n }\n groupBusy.value = true;\n const ok = await conversations.leaveGroup(activeConversation.value);\n groupBusy.value = false;\n if (ok) {\n closeGroupPanel();\n }\n }\n async function dismissCurrentGroup() {\n if (!activeConversation.value || groupBusy.value) {\n return;\n }\n if (!window.confirm('确认解散该群组?所有成员都将不可继续使用该群。')) {\n return;\n }\n groupBusy.value = true;\n const ok = await conversations.dismissGroup(activeConversation.value);\n groupBusy.value = false;\n if (ok) {\n closeGroupPanel();\n }\n }\n async function transferCurrentGroup() {\n if (!activeConversation.value?.target || !transferTargetId.value || groupBusy.value) {\n return;\n }\n if (!window.confirm('确认将群主转让给该成员?')) {\n return;\n }\n groupBusy.value = true;\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient.transferGroup(session.userId, activeConversation.value.target, transferTargetId.value);\n groupDetail.value = {\n ...(groupDetail.value || {}),\n myRole: 'member'\n };\n activeConversation.value.role = 'member';\n if (activeConversation.value.raw) {\n activeConversation.value.raw.role = 'member';\n }\n conversations.setActionNotice('群组已转让');\n closeGroupPanel();\n conversations.refreshRemoteConversations();\n } catch (error) {\n conversations.setActionError(error.message || '转让群组失败');\n } finally {\n groupBusy.value = false;\n }\n }\n function memberAvatar(member) {\n return String(member.displayName || member.uid || '?').slice(0, 1).toUpperCase();\n }\n document.addEventListener('click', closeGroupMenu);\n (0,vue__WEBPACK_IMPORTED_MODULE_15__.onBeforeUnmount)(() => {\n document.removeEventListener('click', closeGroupMenu);\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_15__.watch)(() => activeConversation.value?.id, async () => {\n conversations.actionError = '';\n conversations.actionNotice = '';\n closeGroupMenu();\n closeSingleProfile();\n closeGroupPanel();\n groupDetail.value = null;\n groupMembers.value = [];\n groupAliasDraft.value = '';\n selectedAdminIds.value = [];\n selectedKickIds.value = [];\n transferTargetId.value = '';\n manageSection.value = '';\n if (isGroupConversation.value) {\n await loadGroupMembers({\n silent: true\n });\n }\n }, {\n immediate: true\n });\n const __returned__ = {\n conversations,\n contacts,\n session,\n activeConversation,\n pinnedMessageIsImage,\n pinnedMessageText,\n groupMenuOpen,\n singleProfileOpen,\n singleAliasDraft,\n singleProfileSaving,\n singleProfileNotice,\n singleProfileError,\n groupPanel,\n groupBusy,\n groupDetail,\n groupMembers,\n groupAliasDraft,\n manageSection,\n selectedAdminIds,\n selectedKickIds,\n transferTargetId,\n profileDraft,\n muteDraft,\n muteSaveNotice,\n muteSaveError,\n singlePeerId,\n singleContact,\n singleProfile,\n groupDisplayId,\n isGroupConversation,\n currentGroupRole,\n isGroupOwner,\n canManageGroup,\n adminCandidateMembers,\n transferableMembers,\n mentionCandidates,\n messageDetail,\n messageDetailGroup,\n isMessageDetailGroup,\n messageDetailCounts,\n kickCandidateMembers,\n statusText,\n formatDetailTime,\n detailMemberName,\n detailMemberAvatar,\n detailRoleLabel,\n closeGroupMenu,\n toggleGroupMenu,\n openSingleProfile,\n closeSingleProfile,\n saveSingleAlias,\n handleSenderProfileUpdated,\n closeGroupPanel,\n loadGroupDetail,\n openGroupOverview,\n openGroupMembers,\n loadGroupMembers,\n openGroupAlias,\n msToLocalInput,\n localInputToMs,\n prepareManagementDrafts,\n clearMuteSaveFeedback,\n openGroupManage,\n openTransferGroup,\n saveGroupAlias,\n toggleAdmin,\n toggleKick,\n saveGroupAdmins,\n saveGroupProfile,\n kickSelectedMembers,\n saveMuteSetting,\n leaveCurrentGroup,\n dismissCurrentGroup,\n transferCurrentGroup,\n memberAvatar,\n computed: vue__WEBPACK_IMPORTED_MODULE_15__.computed,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_15__.onBeforeUnmount,\n ref: vue__WEBPACK_IMPORTED_MODULE_15__.ref,\n watch: vue__WEBPACK_IMPORTED_MODULE_15__.watch,\n MessageList: _MessageList_vue__WEBPACK_IMPORTED_MODULE_16__[\"default\"],\n MessageComposer: _MessageComposer_vue__WEBPACK_IMPORTED_MODULE_17__[\"default\"],\n get imClient() {\n return _services_imClient__WEBPACK_IMPORTED_MODULE_18__.imClient;\n },\n get useConversationStore() {\n return _stores_conversations__WEBPACK_IMPORTED_MODULE_19__.useConversationStore;\n },\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_20__.useContactStore;\n },\n get useSessionStore() {\n return _stores_session__WEBPACK_IMPORTED_MODULE_21__.useSessionStore;\n },\n get useAutoDismiss() {\n return _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_22__.useAutoDismiss;\n },\n get useImageProxyFallback() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_23__.useImageProxyFallback;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/ChatPanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -60,7 +60,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'MessageComposer',\n props: {\n disabled: {\n type: Boolean,\n default: false\n },\n quoteMessage: {\n type: Object,\n default: null\n }\n },\n emits: ['send', 'send-attachment', 'cancel-quote'],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n __expose();\n const props = __props;\n const emit = __emit;\n const text = (0,vue__WEBPACK_IMPORTED_MODULE_5__.ref)('');\n const emojiOpen = (0,vue__WEBPACK_IMPORTED_MODULE_5__.ref)(false);\n const dropActive = (0,vue__WEBPACK_IMPORTED_MODULE_5__.ref)(false);\n const textareaEl = (0,vue__WEBPACK_IMPORTED_MODULE_5__.ref)(null);\n const imageInput = (0,vue__WEBPACK_IMPORTED_MODULE_5__.ref)(null);\n const fileInput = (0,vue__WEBPACK_IMPORTED_MODULE_5__.ref)(null);\n let dragDepth = 0;\n const emojiList = ['😀', '😄', '😂', '😊', '😍', '😘', '😎', '😢', '😡', '👍', '🙏', '👏', '💪', '🎉', '❤️', '🔥', '🌹', '☕', '✅', '⭐', '💰', '🎁', '🤝', '👌'];\n function submit() {\n const value = text.value.trim();\n if (!value) {\n return;\n }\n emit('send', value);\n text.value = '';\n emojiOpen.value = false;\n }\n function toggleEmojiPicker() {\n emojiOpen.value = !emojiOpen.value;\n }\n function insertEmoji(emoji) {\n const element = textareaEl.value;\n if (!element) {\n text.value += emoji;\n return;\n }\n const start = element.selectionStart ?? text.value.length;\n const end = element.selectionEnd ?? text.value.length;\n text.value = `${text.value.slice(0, start)}${emoji}${text.value.slice(end)}`;\n requestAnimationFrame(() => {\n element.focus();\n const cursor = start + emoji.length;\n element.setSelectionRange(cursor, cursor);\n });\n }\n function chooseImage() {\n imageInput.value?.click();\n }\n function chooseFile() {\n fileInput.value?.click();\n }\n function attachmentTypeForFile(file, fallbackType = 'file') {\n if (file?.type?.startsWith('image/')) {\n return 'image';\n }\n return fallbackType === 'image' ? 'image' : 'file';\n }\n function emitFiles(files, fallbackType = 'file') {\n if (props.disabled) {\n return;\n }\n const validFiles = Array.from(files || []).filter(file => file instanceof File && file.size > 0);\n if (!validFiles.length) {\n return;\n }\n const caption = text.value.trim();\n validFiles.forEach((file, index) => {\n emit('send-attachment', {\n type: attachmentTypeForFile(file, fallbackType),\n file,\n text: index === 0 ? caption : ''\n });\n });\n text.value = '';\n emojiOpen.value = false;\n }\n function selectAttachment(event, type) {\n const input = event.target;\n const files = input.files ? Array.from(input.files) : [];\n input.value = '';\n if (!files.length || props.disabled) {\n return;\n }\n emitFiles(files, type);\n }\n function hasDraggedFiles(event) {\n const types = Array.from(event.dataTransfer?.types || []);\n return types.includes('Files');\n }\n function handleDragEnter(event) {\n if (props.disabled || !hasDraggedFiles(event)) {\n return;\n }\n dragDepth += 1;\n dropActive.value = true;\n event.dataTransfer.dropEffect = 'copy';\n }\n function handleDragOver(event) {\n if (props.disabled || !hasDraggedFiles(event)) {\n return;\n }\n dropActive.value = true;\n event.dataTransfer.dropEffect = 'copy';\n }\n function handleDragLeave() {\n dragDepth = Math.max(0, dragDepth - 1);\n if (dragDepth === 0) {\n dropActive.value = false;\n }\n }\n function filesFromDataTransfer(dataTransfer) {\n const items = Array.from(dataTransfer?.items || []);\n const files = items.filter(item => item.kind === 'file' && !item.webkitGetAsEntry?.()?.isDirectory).map(item => item.getAsFile()).filter(Boolean);\n if (files.length) {\n return files;\n }\n return Array.from(dataTransfer?.files || []);\n }\n function handleDrop(event) {\n dragDepth = 0;\n dropActive.value = false;\n if (props.disabled) {\n return;\n }\n emitFiles(filesFromDataTransfer(event.dataTransfer));\n }\n function imageFilesFromClipboard(clipboardData) {\n return Array.from(clipboardData?.items || []).filter(item => item.kind === 'file' && item.type.startsWith('image/')).map(item => item.getAsFile()).filter(Boolean);\n }\n function handlePaste(event) {\n if (props.disabled) {\n return;\n }\n const imageFiles = imageFilesFromClipboard(event.clipboardData);\n if (!imageFiles.length) {\n return;\n }\n event.preventDefault();\n emitFiles(imageFiles, 'image');\n }\n const __returned__ = {\n props,\n emit,\n text,\n emojiOpen,\n dropActive,\n textareaEl,\n imageInput,\n fileInput,\n get dragDepth() {\n return dragDepth;\n },\n set dragDepth(v) {\n dragDepth = v;\n },\n emojiList,\n submit,\n toggleEmojiPicker,\n insertEmoji,\n chooseImage,\n chooseFile,\n attachmentTypeForFile,\n emitFiles,\n selectAttachment,\n hasDraggedFiles,\n handleDragEnter,\n handleDragOver,\n handleDragLeave,\n filesFromDataTransfer,\n handleDrop,\n imageFilesFromClipboard,\n handlePaste,\n ref: vue__WEBPACK_IMPORTED_MODULE_5__.ref\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/MessageComposer.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'MessageComposer',\n props: {\n disabled: {\n type: Boolean,\n default: false\n },\n quoteMessage: {\n type: Object,\n default: null\n },\n mentionUsers: {\n type: Array,\n default: () => []\n }\n },\n emits: ['send', 'send-attachment', 'cancel-quote'],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n __expose();\n const props = __props;\n const emit = __emit;\n const text = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)('');\n const emojiOpen = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(false);\n const dropActive = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(false);\n const textareaEl = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(null);\n const imageInput = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(null);\n const fileInput = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(null);\n const mentionOpen = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(false);\n const mentionQuery = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)('');\n const mentionStart = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(-1);\n const mentionedUserIds = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)([]);\n let dragDepth = 0;\n const emojiList = ['😀', '😄', '😂', '😊', '😍', '😘', '😎', '😢', '😡', '👍', '🙏', '👏', '💪', '🎉', '❤️', '🔥', '🌹', '☕', '✅', '⭐', '💰', '🎁', '🤝', '👌'];\n const filteredMentionUsers = (0,vue__WEBPACK_IMPORTED_MODULE_6__.computed)(() => {\n const query = mentionQuery.value.toLowerCase();\n return props.mentionUsers.filter(member => member?.uid).filter(member => !query || mentionName(member).toLowerCase().includes(query)).slice(0, 12);\n });\n function submit() {\n const value = text.value.trim();\n if (!value) {\n return;\n }\n emit('send', {\n text: value,\n mentionedUserIds: [...mentionedUserIds.value]\n });\n text.value = '';\n mentionedUserIds.value = [];\n mentionOpen.value = false;\n emojiOpen.value = false;\n }\n function mentionName(member) {\n return String(member?.displayName || member?.name || member?.rawName || member?.uid || '群成员');\n }\n function handleMentionInput(event) {\n const cursor = event?.target?.selectionStart ?? text.value.length;\n const beforeCursor = text.value.slice(0, cursor);\n const match = beforeCursor.match(/@([^\\s@]*)$/);\n mentionOpen.value = Boolean(match && props.mentionUsers.length);\n mentionQuery.value = match?.[1] || '';\n mentionStart.value = match ? cursor - match[1].length - 1 : -1;\n }\n function openMentionPicker() {\n if (!props.mentionUsers.length) return;\n const element = textareaEl.value;\n const start = element?.selectionStart ?? text.value.length;\n const end = element?.selectionEnd ?? start;\n text.value = `${text.value.slice(0, start)}@${text.value.slice(end)}`;\n mentionStart.value = start;\n mentionQuery.value = '';\n mentionOpen.value = true;\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.nextTick)(() => {\n element?.focus();\n element?.setSelectionRange(start + 1, start + 1);\n });\n }\n function selectMention(member) {\n const element = textareaEl.value;\n const cursor = element?.selectionStart ?? text.value.length;\n const start = mentionStart.value >= 0 ? mentionStart.value : cursor;\n const name = mentionName(member);\n text.value = `${text.value.slice(0, start)}@${name} ${text.value.slice(cursor)}`;\n if (!mentionedUserIds.value.includes(String(member.uid))) {\n mentionedUserIds.value.push(String(member.uid));\n }\n mentionOpen.value = false;\n mentionQuery.value = '';\n mentionStart.value = -1;\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.nextTick)(() => {\n const nextCursor = start + name.length + 2;\n element?.focus();\n element?.setSelectionRange(nextCursor, nextCursor);\n });\n }\n function toggleEmojiPicker() {\n emojiOpen.value = !emojiOpen.value;\n }\n function insertEmoji(emoji) {\n const element = textareaEl.value;\n if (!element) {\n text.value += emoji;\n return;\n }\n const start = element.selectionStart ?? text.value.length;\n const end = element.selectionEnd ?? text.value.length;\n text.value = `${text.value.slice(0, start)}${emoji}${text.value.slice(end)}`;\n requestAnimationFrame(() => {\n element.focus();\n const cursor = start + emoji.length;\n element.setSelectionRange(cursor, cursor);\n });\n }\n function chooseImage() {\n imageInput.value?.click();\n }\n function chooseFile() {\n fileInput.value?.click();\n }\n function attachmentTypeForFile(file, fallbackType = 'file') {\n if (file?.type?.startsWith('image/')) {\n return 'image';\n }\n return fallbackType === 'image' ? 'image' : 'file';\n }\n function emitFiles(files, fallbackType = 'file') {\n if (props.disabled) {\n return;\n }\n const validFiles = Array.from(files || []).filter(file => file instanceof File && file.size > 0);\n if (!validFiles.length) {\n return;\n }\n const caption = text.value.trim();\n validFiles.forEach((file, index) => {\n emit('send-attachment', {\n type: attachmentTypeForFile(file, fallbackType),\n file,\n text: index === 0 ? caption : ''\n });\n });\n text.value = '';\n emojiOpen.value = false;\n }\n function selectAttachment(event, type) {\n const input = event.target;\n const files = input.files ? Array.from(input.files) : [];\n input.value = '';\n if (!files.length || props.disabled) {\n return;\n }\n emitFiles(files, type);\n }\n function hasDraggedFiles(event) {\n const types = Array.from(event.dataTransfer?.types || []);\n return types.includes('Files');\n }\n function handleDragEnter(event) {\n if (props.disabled || !hasDraggedFiles(event)) {\n return;\n }\n dragDepth += 1;\n dropActive.value = true;\n event.dataTransfer.dropEffect = 'copy';\n }\n function handleDragOver(event) {\n if (props.disabled || !hasDraggedFiles(event)) {\n return;\n }\n dropActive.value = true;\n event.dataTransfer.dropEffect = 'copy';\n }\n function handleDragLeave() {\n dragDepth = Math.max(0, dragDepth - 1);\n if (dragDepth === 0) {\n dropActive.value = false;\n }\n }\n function filesFromDataTransfer(dataTransfer) {\n const items = Array.from(dataTransfer?.items || []);\n const files = items.filter(item => item.kind === 'file' && !item.webkitGetAsEntry?.()?.isDirectory).map(item => item.getAsFile()).filter(Boolean);\n if (files.length) {\n return files;\n }\n return Array.from(dataTransfer?.files || []);\n }\n function handleDrop(event) {\n dragDepth = 0;\n dropActive.value = false;\n if (props.disabled) {\n return;\n }\n emitFiles(filesFromDataTransfer(event.dataTransfer));\n }\n function imageFilesFromClipboard(clipboardData) {\n return Array.from(clipboardData?.items || []).filter(item => item.kind === 'file' && item.type.startsWith('image/')).map(item => item.getAsFile()).filter(Boolean);\n }\n function handlePaste(event) {\n if (props.disabled) {\n return;\n }\n const imageFiles = imageFilesFromClipboard(event.clipboardData);\n if (!imageFiles.length) {\n return;\n }\n event.preventDefault();\n emitFiles(imageFiles, 'image');\n }\n const __returned__ = {\n props,\n emit,\n text,\n emojiOpen,\n dropActive,\n textareaEl,\n imageInput,\n fileInput,\n mentionOpen,\n mentionQuery,\n mentionStart,\n mentionedUserIds,\n get dragDepth() {\n return dragDepth;\n },\n set dragDepth(v) {\n dragDepth = v;\n },\n emojiList,\n filteredMentionUsers,\n submit,\n mentionName,\n handleMentionInput,\n openMentionPicker,\n selectMention,\n toggleEmojiPicker,\n insertEmoji,\n chooseImage,\n chooseFile,\n attachmentTypeForFile,\n emitFiles,\n selectAttachment,\n hasDraggedFiles,\n handleDragEnter,\n handleDragOver,\n handleDragLeave,\n filesFromDataTransfer,\n handleDrop,\n imageFilesFromClipboard,\n handlePaste,\n computed: vue__WEBPACK_IMPORTED_MODULE_6__.computed,\n nextTick: vue__WEBPACK_IMPORTED_MODULE_6__.nextTick,\n ref: vue__WEBPACK_IMPORTED_MODULE_6__.ref\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/MessageComposer.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -71,7 +71,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/services/mediaProxy */ \"./src/services/mediaProxy.js\");\n\n\n\n\n\n\n\n\nconst IMAGE_MIN_SCALE = 0.5;\nconst IMAGE_MAX_SCALE = 6;\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'MessageList',\n props: {\n messages: {\n type: Array,\n default: () => []\n },\n selectionMode: {\n type: Boolean,\n default: false\n },\n selectedMessageIds: {\n type: Array,\n default: () => []\n },\n favoriteMessageIds: {\n type: Array,\n default: () => []\n },\n attentionMessageId: {\n type: String,\n default: ''\n },\n canRecallOthers: {\n type: Boolean,\n default: false\n }\n },\n emits: ['message-action', 'toggle-select', 'sender-profile-updated'],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n __expose();\n const props = __props;\n const emit = __emit;\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_6__.useContactStore)();\n const listEl = (0,vue__WEBPACK_IMPORTED_MODULE_5__.ref)(null);\n const viewerStage = (0,vue__WEBPACK_IMPORTED_MODULE_5__.ref)(null);\n const contextMenu = (0,vue__WEBPACK_IMPORTED_MODULE_5__.reactive)({\n visible: false,\n x: 0,\n y: 0,\n message: null\n });\n const imageViewer = (0,vue__WEBPACK_IMPORTED_MODULE_5__.reactive)({\n visible: false,\n url: '',\n name: '',\n scale: 1,\n rotation: 0,\n offsetX: 0,\n offsetY: 0,\n dragging: false,\n dragStartX: 0,\n dragStartY: 0,\n dragOffsetX: 0,\n dragOffsetY: 0\n });\n const senderProfile = (0,vue__WEBPACK_IMPORTED_MODULE_5__.reactive)({\n visible: false,\n uid: '',\n displayName: '',\n rawName: '',\n mobile: '',\n address: '',\n portrait: '',\n avatarText: '',\n role: '',\n roleLabel: '',\n contactAlias: '',\n groupAlias: '',\n isContact: false,\n aliasDraft: '',\n saving: false,\n adding: false,\n notice: '',\n error: ''\n });\n const imageViewerStyle = (0,vue__WEBPACK_IMPORTED_MODULE_5__.computed)(() => ({\n transform: `translate3d(${imageViewer.offsetX}px, ${imageViewer.offsetY}px, 0) scale(${imageViewer.scale}) rotate(${imageViewer.rotation}deg)`\n }));\n const menuItems = (0,vue__WEBPACK_IMPORTED_MODULE_5__.computed)(() => {\n if (!contextMenu.message) {\n return [];\n }\n const isOwnMessage = contextMenu.message.direction === 'out';\n if (isRecalledMessage(contextMenu.message)) {\n return [...(isOwnMessage ? [{\n action: 'edit',\n label: '编辑'\n }] : []), {\n action: 'copy',\n label: '复制'\n }, {\n action: 'delete',\n label: '删除'\n }, {\n action: 'detail',\n label: '详情'\n }];\n }\n const favoriteLabel = isFavorite(contextMenu.message) ? '取消收藏' : '收藏';\n const items = [{\n action: 'copy',\n label: '复制'\n }, {\n action: 'delete',\n label: '删除'\n }, {\n action: 'forward',\n label: '转发'\n }, {\n action: 'favorite',\n label: favoriteLabel\n }, {\n action: 'quote',\n label: '引用'\n }, {\n action: 'select',\n label: '多选'\n }, {\n action: 'detail',\n label: '详情'\n }];\n if (isOwnMessage) {\n items.unshift({\n action: 'edit',\n label: '编辑'\n });\n items.push({\n action: 'recall',\n label: '撤回'\n });\n } else if (props.canRecallOthers) {\n items.push({\n action: 'recall',\n label: '撤回'\n });\n }\n return items;\n });\n function scrollToBottom() {\n (0,vue__WEBPACK_IMPORTED_MODULE_5__.nextTick)(() => {\n if (listEl.value) {\n listEl.value.scrollTop = listEl.value.scrollHeight;\n }\n });\n }\n function scrollToMessage(messageId) {\n (0,vue__WEBPACK_IMPORTED_MODULE_5__.nextTick)(() => {\n if (!listEl.value || !messageId) {\n return;\n }\n const row = Array.from(listEl.value.querySelectorAll('.message-row')).find(element => element.dataset.messageKey === messageId);\n if (row) {\n row.scrollIntoView({\n block: 'center',\n behavior: 'smooth'\n });\n }\n });\n }\n (0,vue__WEBPACK_IMPORTED_MODULE_5__.watch)(() => props.messages.map(message => `${message.id}:${message.status}:${message.deliveryStatus || ''}:${message.messageUid || ''}:${message.recalled ? '1' : ''}`).join('|'), scrollToBottom, {\n immediate: true\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_5__.watch)(() => props.attentionMessageId, scrollToMessage);\n (0,vue__WEBPACK_IMPORTED_MODULE_5__.onMounted)(() => {\n document.addEventListener('click', closeMenu);\n document.addEventListener('keydown', closeMenuOnEscape);\n document.addEventListener('pointermove', moveImageDrag);\n document.addEventListener('pointerup', stopImageDrag);\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_5__.onBeforeUnmount)(() => {\n document.removeEventListener('click', closeMenu);\n document.removeEventListener('keydown', closeMenuOnEscape);\n document.removeEventListener('pointermove', moveImageDrag);\n document.removeEventListener('pointerup', stopImageDrag);\n });\n function messageIdentity(message) {\n return String(message.messageUid || message.id || '');\n }\n function canOpenMessageMenu(message) {\n return message && message.status !== 'failed' && message.status !== 'sending';\n }\n function isSelected(message) {\n return props.selectedMessageIds.includes(messageIdentity(message));\n }\n function isFavorite(message) {\n return props.favoriteMessageIds.includes(messageIdentity(message));\n }\n function isAttention(message) {\n return props.attentionMessageId === messageIdentity(message);\n }\n function isRecallNotice(message) {\n return message.direction === 'out' && (message.recalled || message.status === 'recalled');\n }\n function isRecalledMessage(message) {\n return message.recalled || message.status === 'recalled';\n }\n function isImageMessage(message) {\n return message?.type === 'image' && message?.attachment?.url;\n }\n function isFileMessage(message) {\n return message?.type === 'file' && message?.attachment?.url;\n }\n function isGroupMessage(message) {\n return ['group', 'channel'].includes(message?.conversationType || '');\n }\n function showGroupSender(message) {\n return isGroupMessage(message) && message?.direction === 'in';\n }\n function senderRoleLabel(message) {\n const role = message?.senderProfile?.role || message?.senderRole || '';\n if (role === 'owner') {\n return '群主';\n }\n if (role === 'admin') {\n return '管理员';\n }\n return '';\n }\n function groupSenderName(message) {\n return message?.senderName || message?.senderProfile?.displayName || message?.from || '未知用户';\n }\n function groupSenderAvatarText(message) {\n return String(groupSenderName(message) || '?').slice(0, 1).toUpperCase();\n }\n function openSenderProfile(message) {\n const profile = message?.senderProfile || {};\n const uid = profile.uid || message?.from || '';\n const cachedContact = contacts.contacts.find(contact => String(contact.uid || contact.id || '') === uid) || null;\n const cachedAlias = String(cachedContact?.alias || '').trim();\n const contactAlias = String(profile.contactAlias || cachedAlias || profile.remarkAlias || '').trim();\n const groupAlias = String(profile.groupAlias || '').trim();\n const rawName = profile.rawName || cachedContact?.rawUser?.displayName || cachedContact?.rawUser?.name || cachedContact?.title || groupSenderName(message);\n const displayName = contactAlias || groupAlias || rawName || uid;\n senderProfile.visible = true;\n senderProfile.uid = uid;\n senderProfile.displayName = displayName;\n senderProfile.rawName = rawName || '';\n senderProfile.mobile = profile.mobile || cachedContact?.rawUser?.mobile || '';\n senderProfile.address = profile.address || cachedContact?.address || cachedContact?.rawUser?.address || '';\n senderProfile.portrait = profile.portrait || cachedContact?.portrait || message?.senderPortrait || '';\n senderProfile.avatarText = String(displayName || senderProfile.uid || '?').slice(0, 1).toUpperCase();\n senderProfile.role = profile.role || message?.senderRole || '';\n senderProfile.roleLabel = senderRoleLabel(message);\n senderProfile.contactAlias = contactAlias;\n senderProfile.groupAlias = groupAlias;\n senderProfile.isContact = Boolean(profile.isContact || cachedContact);\n senderProfile.aliasDraft = contactAlias;\n senderProfile.saving = false;\n senderProfile.adding = false;\n senderProfile.notice = '';\n senderProfile.error = '';\n closeMenu();\n }\n function closeSenderProfile() {\n if (senderProfile.saving || senderProfile.adding) {\n return;\n }\n senderProfile.visible = false;\n }\n async function addSenderAsContact() {\n if (!senderProfile.uid || senderProfile.adding || senderProfile.saving) {\n return;\n }\n senderProfile.adding = true;\n senderProfile.notice = '';\n senderProfile.error = '';\n const ok = await contacts.addContact(senderProfile.uid);\n if (ok || String(contacts.actionError || '').includes('已经是联系人')) {\n senderProfile.isContact = true;\n const alias = senderProfile.aliasDraft.trim();\n let aliasSaved = false;\n if (alias) {\n aliasSaved = await contacts.updateContactAlias(senderProfile.uid, alias);\n if (aliasSaved) {\n senderProfile.contactAlias = alias;\n senderProfile.displayName = alias;\n senderProfile.avatarText = String(alias || senderProfile.uid || '?').slice(0, 1).toUpperCase();\n }\n }\n await contacts.refreshContacts({\n force: true\n }).catch(() => {});\n if (alias && !aliasSaved) {\n senderProfile.notice = '';\n senderProfile.error = contacts.actionError ? `已添加为好友,但${contacts.actionError}` : '已添加为好友,但备注名同步失败';\n } else {\n senderProfile.notice = alias ? '已添加为好友,备注名已保存' : ok ? '已添加为好友' : '已是好友';\n }\n emit('sender-profile-updated', {\n userId: senderProfile.uid\n });\n } else {\n senderProfile.error = contacts.actionError || '添加好友失败';\n }\n senderProfile.adding = false;\n }\n async function saveSenderAlias() {\n if (!senderProfile.uid || senderProfile.saving || senderProfile.adding) {\n return;\n }\n senderProfile.saving = true;\n senderProfile.notice = '';\n senderProfile.error = '';\n const ok = await contacts.updateContactAlias(senderProfile.uid, senderProfile.aliasDraft);\n if (ok) {\n await contacts.refreshContacts({\n force: true\n }).catch(() => {});\n const alias = senderProfile.aliasDraft.trim();\n senderProfile.contactAlias = alias;\n senderProfile.displayName = alias || senderProfile.groupAlias || senderProfile.rawName || senderProfile.uid;\n senderProfile.avatarText = String(senderProfile.displayName || senderProfile.uid || '?').slice(0, 1).toUpperCase();\n senderProfile.notice = '备注名已保存';\n emit('sender-profile-updated', {\n userId: senderProfile.uid\n });\n } else {\n senderProfile.error = contacts.actionError || '备注名修改失败';\n }\n senderProfile.saving = false;\n }\n function roleBubbleClass(message) {\n const role = message?.senderRole || '';\n if (role === 'owner') {\n return 'role-bubble-owner';\n }\n if (role === 'admin') {\n return 'role-bubble-admin';\n }\n return '';\n }\n function formatFileSize(size) {\n const bytes = Number(size || 0);\n if (bytes >= 1024 * 1024) {\n return `${(bytes / 1024 / 1024).toFixed(bytes >= 10 * 1024 * 1024 ? 0 : 1)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(bytes >= 10 * 1024 ? 0 : 1)} KB`;\n }\n return bytes > 0 ? `${bytes} B` : '';\n }\n function handleMessageClick(message) {\n if (props.selectionMode) {\n emit('toggle-select', message);\n }\n }\n function handleImageClick(message) {\n if (props.selectionMode) {\n emit('toggle-select', message);\n return;\n }\n openImageViewer(message);\n }\n function openImageViewer(message) {\n const attachment = message?.attachment || {};\n if (!attachment.url) {\n return;\n }\n closeMenu();\n imageViewer.visible = true;\n imageViewer.url = (0,_services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__.imageDisplayUrl)(attachment.url);\n imageViewer.name = attachment.name || 'image';\n resetImageViewer();\n }\n function closeImageViewer() {\n imageViewer.visible = false;\n imageViewer.dragging = false;\n }\n function resetImageViewer() {\n imageViewer.scale = 1;\n imageViewer.rotation = 0;\n imageViewer.offsetX = 0;\n imageViewer.offsetY = 0;\n }\n function clampImageScale(value) {\n return Math.min(IMAGE_MAX_SCALE, Math.max(IMAGE_MIN_SCALE, Number(value.toFixed(2))));\n }\n function setImageScale(value, originX = null, originY = null) {\n const previousScale = imageViewer.scale;\n const nextScale = clampImageScale(value);\n if (nextScale === previousScale) {\n return;\n }\n if (originX !== null && originY !== null && viewerStage.value) {\n const rect = viewerStage.value.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const ratio = nextScale / previousScale - 1;\n imageViewer.offsetX -= (originX - centerX - imageViewer.offsetX) * ratio;\n imageViewer.offsetY -= (originY - centerY - imageViewer.offsetY) * ratio;\n }\n imageViewer.scale = nextScale;\n if (nextScale <= 1) {\n imageViewer.offsetX = 0;\n imageViewer.offsetY = 0;\n }\n }\n function zoomImage(delta) {\n setImageScale(imageViewer.scale + delta);\n }\n function rotateImage() {\n imageViewer.rotation = (imageViewer.rotation + 90) % 360;\n }\n function handleImageWheel(event) {\n const factor = event.deltaY < 0 ? 1.12 : 1 / 1.12;\n setImageScale(imageViewer.scale * factor, event.clientX, event.clientY);\n }\n function startImageDrag(event) {\n if (!imageViewer.visible || imageViewer.scale <= 1) {\n return;\n }\n imageViewer.dragging = true;\n imageViewer.dragStartX = event.clientX;\n imageViewer.dragStartY = event.clientY;\n imageViewer.dragOffsetX = imageViewer.offsetX;\n imageViewer.dragOffsetY = imageViewer.offsetY;\n }\n function moveImageDrag(event) {\n if (!imageViewer.dragging) {\n return;\n }\n imageViewer.offsetX = imageViewer.dragOffsetX + event.clientX - imageViewer.dragStartX;\n imageViewer.offsetY = imageViewer.dragOffsetY + event.clientY - imageViewer.dragStartY;\n }\n function stopImageDrag() {\n imageViewer.dragging = false;\n }\n function saveViewerImage() {\n if (!imageViewer.url) {\n return;\n }\n const downloadUrl = new URL('/api/media_download.php', window.location.origin);\n downloadUrl.searchParams.set('url', imageViewer.url);\n downloadUrl.searchParams.set('name', imageViewer.name || 'image');\n const link = document.createElement('a');\n link.href = downloadUrl.toString();\n link.download = imageViewer.name || 'image';\n document.body.appendChild(link);\n link.click();\n link.remove();\n }\n function openMenu(event, message) {\n if (!canOpenMessageMenu(message)) {\n closeMenu();\n return;\n }\n contextMenu.visible = true;\n contextMenu.message = message;\n contextMenu.x = Math.min(event.clientX, window.innerWidth - 148);\n contextMenu.y = Math.min(event.clientY, window.innerHeight - 352);\n }\n function closeMenu() {\n contextMenu.visible = false;\n contextMenu.message = null;\n }\n function closeMenuOnEscape(event) {\n if (event.key === 'Escape') {\n if (senderProfile.visible) {\n closeSenderProfile();\n }\n if (imageViewer.visible) {\n closeImageViewer();\n }\n closeMenu();\n }\n }\n function chooseMenuAction(action) {\n if (contextMenu.message) {\n emit('message-action', {\n action,\n message: contextMenu.message\n });\n }\n closeMenu();\n }\n function formatTime(timestamp) {\n return new Intl.DateTimeFormat('zh-CN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone\n }).format(timestamp);\n }\n function deliveryState(message) {\n if (message.direction !== 'out' || message.status === 'failed' || message.status === 'recalled' || message.recalled) {\n return '';\n }\n const state = message.deliveryStatus || message.status;\n if (state === 'read') {\n return 'read';\n }\n if (state === 'delivered') {\n return 'delivered';\n }\n if (state === 'sent') {\n return 'sent';\n }\n return '';\n }\n function deliveryTitle(message) {\n const state = deliveryState(message);\n if (state === 'read') {\n return '对方已读';\n }\n if (state === 'delivered') {\n return '已送达对方';\n }\n if (state === 'sent') {\n return '已送出';\n }\n return '';\n }\n function failureText(message) {\n if (message.status === 'failed') {\n if (message.errorCode) {\n return message.error ? `失败:${message.error}(${message.errorCode})` : `失败:${message.errorCode}`;\n }\n return message.error ? `失败:${message.error}` : '失败';\n }\n return '';\n }\n const __returned__ = {\n props,\n emit,\n contacts,\n listEl,\n viewerStage,\n contextMenu,\n IMAGE_MIN_SCALE,\n IMAGE_MAX_SCALE,\n imageViewer,\n senderProfile,\n imageViewerStyle,\n menuItems,\n scrollToBottom,\n scrollToMessage,\n messageIdentity,\n canOpenMessageMenu,\n isSelected,\n isFavorite,\n isAttention,\n isRecallNotice,\n isRecalledMessage,\n isImageMessage,\n isFileMessage,\n isGroupMessage,\n showGroupSender,\n senderRoleLabel,\n groupSenderName,\n groupSenderAvatarText,\n openSenderProfile,\n closeSenderProfile,\n addSenderAsContact,\n saveSenderAlias,\n roleBubbleClass,\n formatFileSize,\n handleMessageClick,\n handleImageClick,\n openImageViewer,\n closeImageViewer,\n resetImageViewer,\n clampImageScale,\n setImageScale,\n zoomImage,\n rotateImage,\n handleImageWheel,\n startImageDrag,\n moveImageDrag,\n stopImageDrag,\n saveViewerImage,\n openMenu,\n closeMenu,\n closeMenuOnEscape,\n chooseMenuAction,\n formatTime,\n deliveryState,\n deliveryTitle,\n failureText,\n computed: vue__WEBPACK_IMPORTED_MODULE_5__.computed,\n nextTick: vue__WEBPACK_IMPORTED_MODULE_5__.nextTick,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_5__.onBeforeUnmount,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_5__.onMounted,\n reactive: vue__WEBPACK_IMPORTED_MODULE_5__.reactive,\n ref: vue__WEBPACK_IMPORTED_MODULE_5__.ref,\n watch: vue__WEBPACK_IMPORTED_MODULE_5__.watch,\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_6__.useContactStore;\n },\n get imageDisplayUrl() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__.imageDisplayUrl;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/MessageList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @/services/mediaProxy */ \"./src/services/mediaProxy.js\");\n/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @/composables/useAutoDismiss */ \"./src/composables/useAutoDismiss.js\");\n\n\n\n\n\n\n\n\n\n\nconst IMAGE_MIN_SCALE = 0.5;\nconst IMAGE_MAX_SCALE = 6;\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'MessageList',\n props: {\n messages: {\n type: Array,\n default: () => []\n },\n selectionMode: {\n type: Boolean,\n default: false\n },\n selectedMessageIds: {\n type: Array,\n default: () => []\n },\n favoriteMessageIds: {\n type: Array,\n default: () => []\n },\n pinnedMessageId: {\n type: String,\n default: ''\n },\n attentionMessageId: {\n type: String,\n default: ''\n },\n canRecallOthers: {\n type: Boolean,\n default: false\n }\n },\n emits: ['message-action', 'toggle-select', 'sender-profile-updated'],\n setup(__props, {\n expose: __expose,\n emit: __emit\n }) {\n __expose();\n const props = __props;\n const emit = __emit;\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_7__.useContactStore)();\n const listEl = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(null);\n const viewerStage = (0,vue__WEBPACK_IMPORTED_MODULE_6__.ref)(null);\n const contextMenu = (0,vue__WEBPACK_IMPORTED_MODULE_6__.reactive)({\n visible: false,\n x: 0,\n y: 0,\n message: null\n });\n const imageViewer = (0,vue__WEBPACK_IMPORTED_MODULE_6__.reactive)({\n visible: false,\n url: '',\n name: '',\n sourceUrl: '',\n index: 0,\n scale: 1,\n rotation: 0,\n offsetX: 0,\n offsetY: 0,\n dragging: false,\n dragStartX: 0,\n dragStartY: 0,\n dragOffsetX: 0,\n dragOffsetY: 0\n });\n const senderProfile = (0,vue__WEBPACK_IMPORTED_MODULE_6__.reactive)({\n visible: false,\n uid: '',\n userId: '',\n displayName: '',\n rawName: '',\n mobile: '',\n address: '',\n portrait: '',\n avatarText: '',\n role: '',\n roleLabel: '',\n contactAlias: '',\n groupAlias: '',\n isContact: false,\n aliasDraft: '',\n saving: false,\n adding: false,\n notice: '',\n error: ''\n });\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_9__.useAutoDismiss)(() => senderProfile.error || senderProfile.notice, value => {\n if ((senderProfile.error || senderProfile.notice) === value) {\n senderProfile.error = '';\n senderProfile.notice = '';\n }\n });\n const imageViewerStyle = (0,vue__WEBPACK_IMPORTED_MODULE_6__.computed)(() => ({\n transform: `translate3d(${imageViewer.offsetX}px, ${imageViewer.offsetY}px, 0) scale(${imageViewer.scale}) rotate(${imageViewer.rotation}deg)`\n }));\n const viewerImages = (0,vue__WEBPACK_IMPORTED_MODULE_6__.computed)(() => props.messages.filter(message => isImageMessage(message)));\n const menuItems = (0,vue__WEBPACK_IMPORTED_MODULE_6__.computed)(() => {\n if (!contextMenu.message) {\n return [];\n }\n const isOwnMessage = contextMenu.message.direction === 'out';\n if (isRecalledMessage(contextMenu.message)) {\n return [...(isOwnMessage ? [{\n action: 'edit',\n label: '编辑'\n }] : []), {\n action: 'copy',\n label: '复制'\n }, {\n action: 'delete',\n label: '删除'\n }, {\n action: 'detail',\n label: '详情'\n }];\n }\n const favoriteLabel = isFavorite(contextMenu.message) ? '取消收藏' : '收藏';\n const pinnedLabel = props.pinnedMessageId === messageIdentity(contextMenu.message) ? '取消置顶' : '置顶';\n const items = [{\n action: 'copy',\n label: '复制'\n }, {\n action: 'delete',\n label: '删除'\n }, {\n action: 'forward',\n label: '转发'\n }, {\n action: 'favorite',\n label: favoriteLabel\n }, {\n action: 'pin',\n label: pinnedLabel\n }, {\n action: 'quote',\n label: '引用'\n }, {\n action: 'select',\n label: '多选'\n }, {\n action: 'detail',\n label: '详情'\n }];\n if (isOwnMessage) {\n items.unshift({\n action: 'edit',\n label: '编辑'\n });\n items.push({\n action: 'recall',\n label: '撤回'\n });\n } else if (props.canRecallOthers) {\n items.push({\n action: 'recall',\n label: '撤回'\n });\n }\n return items;\n });\n function scrollToBottom() {\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.nextTick)(() => {\n if (listEl.value) {\n listEl.value.scrollTop = listEl.value.scrollHeight;\n }\n });\n }\n function scrollToMessage(messageId) {\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.nextTick)(() => {\n if (!listEl.value || !messageId) {\n return;\n }\n const row = Array.from(listEl.value.querySelectorAll('.message-row')).find(element => element.dataset.messageKey === messageId);\n if (row) {\n row.scrollIntoView({\n block: 'center',\n behavior: 'smooth'\n });\n }\n });\n }\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.watch)(() => props.messages.map(message => `${message.id}:${message.status}:${message.deliveryStatus || ''}:${message.messageUid || ''}:${message.recalled ? '1' : ''}`).join('|'), scrollToBottom, {\n immediate: true\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.watch)(() => props.attentionMessageId, scrollToMessage);\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.onMounted)(() => {\n document.addEventListener('click', closeMenu);\n document.addEventListener('keydown', closeMenuOnEscape);\n document.addEventListener('pointermove', moveImageDrag);\n document.addEventListener('pointerup', stopImageDrag);\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_6__.onBeforeUnmount)(() => {\n document.removeEventListener('click', closeMenu);\n document.removeEventListener('keydown', closeMenuOnEscape);\n document.removeEventListener('pointermove', moveImageDrag);\n document.removeEventListener('pointerup', stopImageDrag);\n });\n function messageIdentity(message) {\n return String(message.messageUid || message.id || '');\n }\n function canOpenMessageMenu(message) {\n return message && message.status !== 'failed' && message.status !== 'sending';\n }\n function isSelected(message) {\n return props.selectedMessageIds.includes(messageIdentity(message));\n }\n function isFavorite(message) {\n return props.favoriteMessageIds.includes(messageIdentity(message));\n }\n function isAttention(message) {\n return props.attentionMessageId === messageIdentity(message);\n }\n function isRecallNotice(message) {\n return message.direction === 'out' && (message.recalled || message.status === 'recalled');\n }\n function isRecalledMessage(message) {\n return message.recalled || message.status === 'recalled';\n }\n function isImageMessage(message) {\n return message?.type === 'image' && message?.attachment?.url;\n }\n function isFileMessage(message) {\n return message?.type === 'file' && message?.attachment?.url;\n }\n function displayFileName(message) {\n const text = String(message?.text || '').trim();\n const attachmentName = String(message?.attachment?.name || '').trim();\n return text || attachmentName || '文件';\n }\n function isVideoMessage(message) {\n return (message?.type === 'video' || Number(message?.contentType || 0) === 6) && message?.attachment?.url;\n }\n function isRedPacketMessage(message) {\n return Number(message?.contentType || 0) === 90 || Boolean(redPacketPayload(message));\n }\n function isRedPacketReceipt(message) {\n return Number(message?.contentType || 0) === 105;\n }\n function isSystemMessage(message) {\n return [92, 93].includes(Number(message?.contentType || 0));\n }\n function systemMessageText(message) {\n const contentType = Number(message?.contentType || 0);\n if (contentType === 92) {\n return '以上是打招呼的内容';\n }\n if (contentType === 93) {\n return '你们已经是好友了,可以开始聊天了。';\n }\n return String(message?.text || '');\n }\n function redPacketReceiptText(message) {\n const text = String(message?.text || '').trim();\n if (text && text !== '[领取了红包]') {\n return text;\n }\n const receiverName = message?.direction === 'out' ? '你' : message?.senderName || '对方';\n const packetSenderName = message?.redPacketSenderName || nearestRedPacketSenderName(message);\n return packetSenderName ? `${receiverName}领取了${packetSenderName}的红包` : `${receiverName}领取了红包`;\n }\n function nearestRedPacketSenderName(receiptMessage) {\n const receiptIndex = props.messages.findIndex(item => messageIdentity(item) === messageIdentity(receiptMessage));\n for (let index = receiptIndex - 1; index >= 0; index -= 1) {\n const candidate = props.messages[index];\n if (isRedPacketMessage(candidate)) {\n return candidate?.direction === 'out' ? '你' : candidate?.senderName || '对方';\n }\n }\n return '';\n }\n function redPacketPayload(message) {\n if (message?.redPacket && typeof message.redPacket === 'object') {\n return message.redPacket;\n }\n const text = String(message?.text || '').trim();\n if (!text.startsWith('{')) {\n return null;\n }\n try {\n const payload = JSON.parse(text);\n return payload?.redPackets || payload?.redPacket || null;\n } catch (error) {\n return null;\n }\n }\n function redPacketBlessing(message) {\n return String(redPacketPayload(message)?.blessing || '恭喜发财,大吉大利');\n }\n function isGroupMessage(message) {\n return ['group', 'channel'].includes(message?.conversationType || '');\n }\n function showGroupSender(message) {\n return isGroupMessage(message) && message?.direction === 'in';\n }\n function senderRoleLabel(message) {\n const role = message?.senderProfile?.role || message?.senderRole || '';\n if (role === 'owner') {\n return '群主';\n }\n if (role === 'admin') {\n return '管理员';\n }\n return '';\n }\n function groupSenderName(message) {\n return message?.senderName || message?.senderProfile?.displayName || message?.from || '未知用户';\n }\n function groupSenderAvatarText(message) {\n return String(groupSenderName(message) || '?').slice(0, 1).toUpperCase();\n }\n function openSenderProfile(message) {\n const profile = message?.senderProfile || {};\n const uid = profile.uid || message?.from || '';\n const cachedContact = contacts.contacts.find(contact => String(contact.uid || contact.id || '') === uid) || null;\n const cachedAlias = String(cachedContact?.alias || '').trim();\n const contactAlias = String(profile.contactAlias || cachedAlias || profile.remarkAlias || '').trim();\n const groupAlias = String(profile.groupAlias || '').trim();\n const rawName = profile.rawName || cachedContact?.rawUser?.displayName || cachedContact?.rawUser?.name || cachedContact?.title || groupSenderName(message);\n const displayName = contactAlias || groupAlias || rawName || uid;\n senderProfile.visible = true;\n senderProfile.uid = uid;\n senderProfile.userId = profile.userId || profile.name || cachedContact?.rawUser?.name || '';\n senderProfile.displayName = displayName;\n senderProfile.rawName = rawName || '';\n senderProfile.mobile = profile.mobile || cachedContact?.rawUser?.mobile || '';\n senderProfile.address = profile.address || cachedContact?.address || cachedContact?.rawUser?.address || '';\n senderProfile.portrait = profile.portrait || cachedContact?.portrait || message?.senderPortrait || '';\n senderProfile.avatarText = String(displayName || senderProfile.uid || '?').slice(0, 1).toUpperCase();\n senderProfile.role = profile.role || message?.senderRole || '';\n senderProfile.roleLabel = senderRoleLabel(message);\n senderProfile.contactAlias = contactAlias;\n senderProfile.groupAlias = groupAlias;\n senderProfile.isContact = Boolean(profile.isContact || cachedContact);\n senderProfile.aliasDraft = contactAlias;\n senderProfile.saving = false;\n senderProfile.adding = false;\n senderProfile.notice = '';\n senderProfile.error = '';\n closeMenu();\n }\n function closeSenderProfile() {\n if (senderProfile.saving || senderProfile.adding) {\n return;\n }\n senderProfile.visible = false;\n }\n async function addSenderAsContact() {\n if (!senderProfile.uid || senderProfile.adding || senderProfile.saving) {\n return;\n }\n senderProfile.adding = true;\n senderProfile.notice = '';\n senderProfile.error = '';\n const ok = await contacts.addContact(senderProfile.uid);\n if (ok || String(contacts.actionError || '').includes('已经是联系人')) {\n senderProfile.isContact = true;\n const alias = senderProfile.aliasDraft.trim();\n let aliasSaved = false;\n if (alias) {\n aliasSaved = await contacts.updateContactAlias(senderProfile.uid, alias);\n if (aliasSaved) {\n senderProfile.contactAlias = alias;\n senderProfile.displayName = alias;\n senderProfile.avatarText = String(alias || senderProfile.uid || '?').slice(0, 1).toUpperCase();\n }\n }\n await contacts.refreshContacts({\n force: true\n }).catch(() => {});\n if (alias && !aliasSaved) {\n senderProfile.notice = '';\n senderProfile.error = contacts.actionError ? `已添加为好友,但${contacts.actionError}` : '已添加为好友,但备注名同步失败';\n } else {\n senderProfile.notice = alias ? '已添加为好友,备注名已保存' : ok ? '已添加为好友' : '已是好友';\n }\n emit('sender-profile-updated', {\n userId: senderProfile.uid\n });\n } else {\n senderProfile.error = contacts.actionError || '添加好友失败';\n }\n senderProfile.adding = false;\n }\n async function saveSenderAlias() {\n if (!senderProfile.uid || senderProfile.saving || senderProfile.adding) {\n return;\n }\n senderProfile.saving = true;\n senderProfile.notice = '';\n senderProfile.error = '';\n const ok = await contacts.updateContactAlias(senderProfile.uid, senderProfile.aliasDraft);\n if (ok) {\n await contacts.refreshContacts({\n force: true\n }).catch(() => {});\n const alias = senderProfile.aliasDraft.trim();\n senderProfile.contactAlias = alias;\n senderProfile.displayName = alias || senderProfile.groupAlias || senderProfile.rawName || senderProfile.uid;\n senderProfile.avatarText = String(senderProfile.displayName || senderProfile.uid || '?').slice(0, 1).toUpperCase();\n senderProfile.notice = '备注名已保存';\n emit('sender-profile-updated', {\n userId: senderProfile.uid\n });\n } else {\n senderProfile.error = contacts.actionError || '备注名修改失败';\n }\n senderProfile.saving = false;\n }\n function roleBubbleClass(message) {\n const role = message?.senderRole || '';\n if (role === 'owner') {\n return 'role-bubble-owner';\n }\n if (role === 'admin') {\n return 'role-bubble-admin';\n }\n return '';\n }\n function formatFileSize(size) {\n const bytes = Number(size || 0);\n if (bytes >= 1024 * 1024) {\n return `${(bytes / 1024 / 1024).toFixed(bytes >= 10 * 1024 * 1024 ? 0 : 1)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(bytes >= 10 * 1024 ? 0 : 1)} KB`;\n }\n return bytes > 0 ? `${bytes} B` : '';\n }\n function handleMessageClick(message) {\n if (props.selectionMode) {\n emit('toggle-select', message);\n }\n }\n function handleImageClick(message) {\n if (props.selectionMode) {\n emit('toggle-select', message);\n return;\n }\n openImageViewer(message);\n }\n function openImageViewer(message) {\n const attachment = message?.attachment || {};\n if (!attachment.url) {\n return;\n }\n closeMenu();\n imageViewer.visible = true;\n const index = viewerImages.value.findIndex(item => messageIdentity(item) === messageIdentity(message));\n showViewerImage(index >= 0 ? index : 0);\n }\n function showViewerImage(index) {\n const images = viewerImages.value;\n if (!images.length) {\n closeImageViewer();\n return;\n }\n const normalizedIndex = (index + images.length) % images.length;\n const attachment = images[normalizedIndex]?.attachment || {};\n imageViewer.index = normalizedIndex;\n imageViewer.sourceUrl = attachment.url || '';\n imageViewer.url = attachment.url || '';\n imageViewer.name = attachment.name || `图片 ${normalizedIndex + 1}`;\n resetImageViewer();\n }\n function showPreviousImage() {\n showViewerImage(imageViewer.index - 1);\n }\n function showNextImage() {\n showViewerImage(imageViewer.index + 1);\n }\n function closeImageViewer() {\n imageViewer.visible = false;\n imageViewer.dragging = false;\n imageViewer.sourceUrl = '';\n }\n function resetImageViewer() {\n imageViewer.scale = 1;\n imageViewer.rotation = 0;\n imageViewer.offsetX = 0;\n imageViewer.offsetY = 0;\n }\n function clampImageScale(value) {\n return Math.min(IMAGE_MAX_SCALE, Math.max(IMAGE_MIN_SCALE, Number(value.toFixed(2))));\n }\n function setImageScale(value, originX = null, originY = null) {\n const previousScale = imageViewer.scale;\n const nextScale = clampImageScale(value);\n if (nextScale === previousScale) {\n return;\n }\n if (originX !== null && originY !== null && viewerStage.value) {\n const rect = viewerStage.value.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const ratio = nextScale / previousScale - 1;\n imageViewer.offsetX -= (originX - centerX - imageViewer.offsetX) * ratio;\n imageViewer.offsetY -= (originY - centerY - imageViewer.offsetY) * ratio;\n }\n imageViewer.scale = nextScale;\n if (nextScale <= 1) {\n imageViewer.offsetX = 0;\n imageViewer.offsetY = 0;\n }\n }\n function zoomImage(delta) {\n setImageScale(imageViewer.scale + delta);\n }\n function rotateImage() {\n imageViewer.rotation = (imageViewer.rotation + 90) % 360;\n }\n function handleImageWheel(event) {\n const factor = event.deltaY < 0 ? 1.12 : 1 / 1.12;\n setImageScale(imageViewer.scale * factor, event.clientX, event.clientY);\n }\n function startImageDrag(event) {\n if (!imageViewer.visible || imageViewer.scale <= 1) {\n return;\n }\n imageViewer.dragging = true;\n imageViewer.dragStartX = event.clientX;\n imageViewer.dragStartY = event.clientY;\n imageViewer.dragOffsetX = imageViewer.offsetX;\n imageViewer.dragOffsetY = imageViewer.offsetY;\n }\n function moveImageDrag(event) {\n if (!imageViewer.dragging) {\n return;\n }\n imageViewer.offsetX = imageViewer.dragOffsetX + event.clientX - imageViewer.dragStartX;\n imageViewer.offsetY = imageViewer.dragOffsetY + event.clientY - imageViewer.dragStartY;\n }\n function stopImageDrag() {\n imageViewer.dragging = false;\n }\n function saveViewerImage() {\n if (!imageViewer.sourceUrl) {\n return;\n }\n const downloadUrl = new URL('/api/media_download.php', window.location.origin);\n downloadUrl.searchParams.set('url', imageViewer.sourceUrl);\n downloadUrl.searchParams.set('name', imageViewer.name || 'image');\n const link = document.createElement('a');\n link.href = downloadUrl.toString();\n link.download = imageViewer.name || 'image';\n document.body.appendChild(link);\n link.click();\n link.remove();\n }\n function openMenu(event, message) {\n if (!canOpenMessageMenu(message)) {\n closeMenu();\n return;\n }\n contextMenu.visible = true;\n contextMenu.message = message;\n contextMenu.x = Math.min(event.clientX, window.innerWidth - 148);\n contextMenu.y = Math.min(event.clientY, window.innerHeight - 352);\n }\n function closeMenu() {\n contextMenu.visible = false;\n contextMenu.message = null;\n }\n function closeMenuOnEscape(event) {\n if (imageViewer.visible && event.key === 'ArrowLeft') {\n event.preventDefault();\n showPreviousImage();\n return;\n }\n if (imageViewer.visible && event.key === 'ArrowRight') {\n event.preventDefault();\n showNextImage();\n return;\n }\n if (event.key === 'Escape') {\n if (senderProfile.visible) {\n closeSenderProfile();\n }\n if (imageViewer.visible) {\n closeImageViewer();\n }\n closeMenu();\n }\n }\n function chooseMenuAction(action) {\n if (contextMenu.message) {\n emit('message-action', {\n action,\n message: contextMenu.message\n });\n }\n closeMenu();\n }\n function formatTime(timestamp) {\n return new Intl.DateTimeFormat('zh-CN', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: false,\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone\n }).format(timestamp);\n }\n function deliveryState(message) {\n if (message.direction !== 'out' || message.status === 'failed' || message.status === 'recalled' || message.recalled) {\n return '';\n }\n const state = message.deliveryStatus || message.status;\n if (state === 'read') {\n return 'read';\n }\n if (state === 'delivered') {\n return 'delivered';\n }\n if (state === 'sent') {\n return 'sent';\n }\n return '';\n }\n function deliveryTitle(message) {\n const state = deliveryState(message);\n if (state === 'read') {\n return '对方已读';\n }\n if (state === 'delivered') {\n return '已送达对方';\n }\n if (state === 'sent') {\n return '已送出';\n }\n return '';\n }\n function failureText(message) {\n if (message.status === 'failed') {\n if (message.errorCode) {\n return message.error ? `失败:${message.error}(${message.errorCode})` : `失败:${message.errorCode}`;\n }\n return message.error ? `失败:${message.error}` : '失败';\n }\n return '';\n }\n const __returned__ = {\n props,\n emit,\n contacts,\n listEl,\n viewerStage,\n contextMenu,\n IMAGE_MIN_SCALE,\n IMAGE_MAX_SCALE,\n imageViewer,\n senderProfile,\n imageViewerStyle,\n viewerImages,\n menuItems,\n scrollToBottom,\n scrollToMessage,\n messageIdentity,\n canOpenMessageMenu,\n isSelected,\n isFavorite,\n isAttention,\n isRecallNotice,\n isRecalledMessage,\n isImageMessage,\n isFileMessage,\n displayFileName,\n isVideoMessage,\n isRedPacketMessage,\n isRedPacketReceipt,\n isSystemMessage,\n systemMessageText,\n redPacketReceiptText,\n nearestRedPacketSenderName,\n redPacketPayload,\n redPacketBlessing,\n isGroupMessage,\n showGroupSender,\n senderRoleLabel,\n groupSenderName,\n groupSenderAvatarText,\n openSenderProfile,\n closeSenderProfile,\n addSenderAsContact,\n saveSenderAlias,\n roleBubbleClass,\n formatFileSize,\n handleMessageClick,\n handleImageClick,\n openImageViewer,\n showViewerImage,\n showPreviousImage,\n showNextImage,\n closeImageViewer,\n resetImageViewer,\n clampImageScale,\n setImageScale,\n zoomImage,\n rotateImage,\n handleImageWheel,\n startImageDrag,\n moveImageDrag,\n stopImageDrag,\n saveViewerImage,\n openMenu,\n closeMenu,\n closeMenuOnEscape,\n chooseMenuAction,\n formatTime,\n deliveryState,\n deliveryTitle,\n failureText,\n computed: vue__WEBPACK_IMPORTED_MODULE_6__.computed,\n nextTick: vue__WEBPACK_IMPORTED_MODULE_6__.nextTick,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_6__.onBeforeUnmount,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_6__.onMounted,\n reactive: vue__WEBPACK_IMPORTED_MODULE_6__.reactive,\n ref: vue__WEBPACK_IMPORTED_MODULE_6__.ref,\n watch: vue__WEBPACK_IMPORTED_MODULE_6__.watch,\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_7__.useContactStore;\n },\n get useImageProxyFallback() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_8__.useImageProxyFallback;\n },\n get useVideoOriginalFallback() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_8__.useVideoOriginalFallback;\n },\n get videoDisplayUrl() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_8__.videoDisplayUrl;\n },\n get useAutoDismiss() {\n return _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_9__.useAutoDismiss;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/MessageList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -82,7 +82,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ContactPanel',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_1__.useContactStore)();\n const contact = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contacts.activeContact);\n const remarkName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contact.value?.alias || '未设置');\n const username = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contact.value?.rawUser?.displayName || contact.value?.rawUser?.name || contact.value?.uid || '');\n const mobile = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contact.value?.rawUser?.mobile || '未知');\n const address = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contact.value?.rawUser?.address || '未知');\n const editingAlias = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);\n const aliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)('');\n const aliasSaving = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);\n const aliasError = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)('');\n (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(contact, () => {\n editingAlias.value = false;\n aliasError.value = '';\n });\n function openAliasEditor() {\n aliasDraft.value = contact.value?.alias || '';\n aliasError.value = '';\n editingAlias.value = true;\n }\n function closeAliasEditor() {\n if (aliasSaving.value) {\n return;\n }\n editingAlias.value = false;\n aliasError.value = '';\n }\n async function submitAlias() {\n if (!contact.value) {\n return;\n }\n aliasSaving.value = true;\n aliasError.value = '';\n const ok = await contacts.updateContactAlias(contact.value.uid, aliasDraft.value);\n aliasSaving.value = false;\n if (ok) {\n editingAlias.value = false;\n return;\n }\n aliasError.value = contacts.actionError || '备注名修改失败';\n }\n const __returned__ = {\n contacts,\n contact,\n remarkName,\n username,\n mobile,\n address,\n editingAlias,\n aliasDraft,\n aliasSaving,\n aliasError,\n openAliasEditor,\n closeAliasEditor,\n submitAlias,\n computed: vue__WEBPACK_IMPORTED_MODULE_0__.computed,\n ref: vue__WEBPACK_IMPORTED_MODULE_0__.ref,\n watch: vue__WEBPACK_IMPORTED_MODULE_0__.watch,\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_1__.useContactStore;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/composables/useAutoDismiss */ \"./src/composables/useAutoDismiss.js\");\n/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/services/mediaProxy */ \"./src/services/mediaProxy.js\");\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ContactPanel',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_1__.useContactStore)();\n const contact = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contacts.activeContact);\n const remarkName = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contact.value?.alias || '未设置');\n const username = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contact.value?.rawUser?.displayName || contact.value?.rawUser?.name || contact.value?.uid || '');\n const mobile = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contact.value?.rawUser?.mobile || '未知');\n const address = (0,vue__WEBPACK_IMPORTED_MODULE_0__.computed)(() => contact.value?.rawUser?.address || '未知');\n const editingAlias = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);\n const aliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)('');\n const aliasSaving = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)(false);\n const aliasError = (0,vue__WEBPACK_IMPORTED_MODULE_0__.ref)('');\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_2__.useAutoDismiss)(aliasError, value => {\n if (aliasError.value === value) aliasError.value = '';\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(contact, () => {\n editingAlias.value = false;\n aliasError.value = '';\n });\n function openAliasEditor() {\n aliasDraft.value = contact.value?.alias || '';\n aliasError.value = '';\n editingAlias.value = true;\n }\n function closeAliasEditor() {\n if (aliasSaving.value) {\n return;\n }\n editingAlias.value = false;\n aliasError.value = '';\n }\n async function submitAlias() {\n if (!contact.value) {\n return;\n }\n aliasSaving.value = true;\n aliasError.value = '';\n const ok = await contacts.updateContactAlias(contact.value.uid, aliasDraft.value);\n aliasSaving.value = false;\n if (ok) {\n editingAlias.value = false;\n return;\n }\n aliasError.value = contacts.actionError || '备注名修改失败';\n }\n const __returned__ = {\n contacts,\n contact,\n remarkName,\n username,\n mobile,\n address,\n editingAlias,\n aliasDraft,\n aliasSaving,\n aliasError,\n openAliasEditor,\n closeAliasEditor,\n submitAlias,\n computed: vue__WEBPACK_IMPORTED_MODULE_0__.computed,\n ref: vue__WEBPACK_IMPORTED_MODULE_0__.ref,\n watch: vue__WEBPACK_IMPORTED_MODULE_0__.watch,\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_1__.useContactStore;\n },\n get useAutoDismiss() {\n return _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_2__.useAutoDismiss;\n },\n get useImageProxyFallback() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_3__.useImageProxyFallback;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -104,7 +104,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/stores/conversations */ \"./src/stores/conversations.js\");\n/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/stores/navigation */ \"./src/stores/navigation.js\");\n/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/services/mediaProxy */ \"./src/services/mediaProxy.js\");\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'FavoritePanel',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_3__.useConversationStore)();\n const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_4__.useNavigationStore)();\n const favorite = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => conversations.activeFavorite);\n const notice = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const error = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n function clearFeedback() {\n notice.value = '';\n error.value = '';\n }\n function favoriteTitle(item) {\n if (item.conversationTitle) {\n return item.conversationTitle;\n }\n const conversation = conversations.conversations.find(entry => entry.id === item.conversationId);\n return conversation?.title || item.conversationId || '未知会话';\n }\n function favoriteText(item) {\n return item.text || '';\n }\n function isImageFavorite(item) {\n return item?.type === 'image' && item?.attachment?.url;\n }\n function isFileFavorite(item) {\n return item?.type === 'file' && item?.attachment?.url;\n }\n function favoriteCopyText(item) {\n if (!item) {\n return '';\n }\n if (item.text) {\n return item.text;\n }\n if (item.recalled) {\n return item.recallStatus || '已撤回';\n }\n if (isImageFavorite(item)) {\n return item.attachment.url;\n }\n if (isFileFavorite(item)) {\n return `${item.attachment.name || '文件'} ${item.attachment.url}`.trim();\n }\n return item.preview || '';\n }\n function formatFileSize(size) {\n const bytes = Number(size || 0);\n if (bytes >= 1024 * 1024) {\n return `${(bytes / 1024 / 1024).toFixed(bytes >= 10 * 1024 * 1024 ? 0 : 1)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(bytes >= 10 * 1024 ? 0 : 1)} KB`;\n }\n return bytes > 0 ? `${bytes} B` : '';\n }\n function formatFavoriteTime(timestamp) {\n const value = Number(timestamp || 0);\n if (!value) {\n return '';\n }\n return new Intl.DateTimeFormat('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n }).format(value);\n }\n async function copyFavorite() {\n clearFeedback();\n const text = favoriteCopyText(favorite.value || {}).trim();\n if (!text) {\n error.value = '没有可复制的文字内容';\n return;\n }\n try {\n await writeClipboard(text);\n notice.value = '已复制';\n } catch (copyError) {\n error.value = '复制失败';\n }\n }\n async function writeClipboard(text) {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n const element = document.createElement('textarea');\n element.value = text;\n element.setAttribute('readonly', 'readonly');\n element.style.position = 'fixed';\n element.style.left = '-9999px';\n document.body.appendChild(element);\n element.select();\n document.execCommand('copy');\n document.body.removeChild(element);\n }\n function openConversation() {\n clearFeedback();\n const item = favorite.value;\n if (!item?.conversationId) {\n error.value = '缺少原会话信息';\n return;\n }\n const conversation = conversations.conversations.find(entry => entry.id === item.conversationId);\n if (!conversation) {\n error.value = '原会话暂未加载,请刷新会话后再试';\n conversations.refreshRemoteConversations();\n return;\n }\n navigation.showMessages();\n conversations.setActiveConversation(item.conversationId);\n window.setTimeout(() => {\n conversations.focusMessage({\n id: item.id || item.key,\n messageUid: item.messageUid || item.key\n });\n }, 450);\n }\n function removeFavorite() {\n clearFeedback();\n const key = favorite.value?.key || '';\n if (!key) {\n return;\n }\n conversations.removeFavorite(key);\n notice.value = '已取消收藏';\n }\n const __returned__ = {\n conversations,\n navigation,\n favorite,\n notice,\n error,\n clearFeedback,\n favoriteTitle,\n favoriteText,\n isImageFavorite,\n isFileFavorite,\n favoriteCopyText,\n formatFileSize,\n formatFavoriteTime,\n copyFavorite,\n writeClipboard,\n openConversation,\n removeFavorite,\n computed: vue__WEBPACK_IMPORTED_MODULE_2__.computed,\n ref: vue__WEBPACK_IMPORTED_MODULE_2__.ref,\n get useConversationStore() {\n return _stores_conversations__WEBPACK_IMPORTED_MODULE_3__.useConversationStore;\n },\n get useNavigationStore() {\n return _stores_navigation__WEBPACK_IMPORTED_MODULE_4__.useNavigationStore;\n },\n get imageDisplayUrl() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_5__.imageDisplayUrl;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/stores/conversations */ \"./src/stores/conversations.js\");\n/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/stores/navigation */ \"./src/stores/navigation.js\");\n/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/composables/useAutoDismiss */ \"./src/composables/useAutoDismiss.js\");\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'FavoritePanel',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_3__.useConversationStore)();\n const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_4__.useNavigationStore)();\n const favorite = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => conversations.activeFavorite);\n const notice = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const error = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_5__.useAutoDismiss)(() => error.value || notice.value, value => {\n if ((error.value || notice.value) === value) clearFeedback();\n });\n function clearFeedback() {\n notice.value = '';\n error.value = '';\n }\n function favoriteTitle(item) {\n if (item.conversationTitle) {\n return item.conversationTitle;\n }\n const conversation = conversations.conversations.find(entry => entry.id === item.conversationId);\n return conversation?.title || item.conversationId || '未知会话';\n }\n function favoriteText(item) {\n return item.text || '';\n }\n function isImageFavorite(item) {\n return item?.type === 'image' && item?.attachment?.url;\n }\n function isFileFavorite(item) {\n return item?.type === 'file' && item?.attachment?.url;\n }\n function favoriteCopyText(item) {\n if (!item) {\n return '';\n }\n if (item.text) {\n return item.text;\n }\n if (item.recalled) {\n return item.recallStatus || '已撤回';\n }\n if (isImageFavorite(item)) {\n return item.attachment.url;\n }\n if (isFileFavorite(item)) {\n return `${item.attachment.name || '文件'} ${item.attachment.url}`.trim();\n }\n return item.preview || '';\n }\n function formatFileSize(size) {\n const bytes = Number(size || 0);\n if (bytes >= 1024 * 1024) {\n return `${(bytes / 1024 / 1024).toFixed(bytes >= 10 * 1024 * 1024 ? 0 : 1)} MB`;\n }\n if (bytes >= 1024) {\n return `${(bytes / 1024).toFixed(bytes >= 10 * 1024 ? 0 : 1)} KB`;\n }\n return bytes > 0 ? `${bytes} B` : '';\n }\n function formatFavoriteTime(timestamp) {\n const value = Number(timestamp || 0);\n if (!value) {\n return '';\n }\n return new Intl.DateTimeFormat('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n }).format(value);\n }\n async function copyFavorite() {\n clearFeedback();\n const text = favoriteCopyText(favorite.value || {}).trim();\n if (!text) {\n error.value = '没有可复制的文字内容';\n return;\n }\n try {\n await writeClipboard(text);\n notice.value = '已复制';\n } catch (copyError) {\n error.value = '复制失败';\n }\n }\n async function writeClipboard(text) {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n const element = document.createElement('textarea');\n element.value = text;\n element.setAttribute('readonly', 'readonly');\n element.style.position = 'fixed';\n element.style.left = '-9999px';\n document.body.appendChild(element);\n element.select();\n document.execCommand('copy');\n document.body.removeChild(element);\n }\n function openConversation() {\n clearFeedback();\n const item = favorite.value;\n if (!item?.conversationId) {\n error.value = '缺少原会话信息';\n return;\n }\n const conversation = conversations.conversations.find(entry => entry.id === item.conversationId);\n if (!conversation) {\n error.value = '原会话暂未加载,请刷新会话后再试';\n conversations.refreshRemoteConversations();\n return;\n }\n navigation.showMessages();\n conversations.setActiveConversation(item.conversationId);\n window.setTimeout(() => {\n conversations.focusMessage({\n id: item.id || item.key,\n messageUid: item.messageUid || item.key\n });\n }, 450);\n }\n function removeFavorite() {\n clearFeedback();\n const key = favorite.value?.key || '';\n if (!key) {\n return;\n }\n conversations.removeFavorite(key);\n notice.value = '已取消收藏';\n }\n const __returned__ = {\n conversations,\n navigation,\n favorite,\n notice,\n error,\n clearFeedback,\n favoriteTitle,\n favoriteText,\n isImageFavorite,\n isFileFavorite,\n favoriteCopyText,\n formatFileSize,\n formatFavoriteTime,\n copyFavorite,\n writeClipboard,\n openConversation,\n removeFavorite,\n computed: vue__WEBPACK_IMPORTED_MODULE_2__.computed,\n ref: vue__WEBPACK_IMPORTED_MODULE_2__.ref,\n get useConversationStore() {\n return _stores_conversations__WEBPACK_IMPORTED_MODULE_3__.useConversationStore;\n },\n get useNavigationStore() {\n return _stores_navigation__WEBPACK_IMPORTED_MODULE_4__.useNavigationStore;\n },\n get useAutoDismiss() {\n return _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_5__.useAutoDismiss;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -115,7 +115,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ContactList',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_4__.useContactStore)();\n const keyword = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const addingContact = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(false);\n const addKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const filteredContacts = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n const value = keyword.value.toLowerCase();\n if (!value) {\n return contacts.contacts;\n }\n return contacts.contacts.filter(item => {\n return item.title.toLowerCase().includes(value) || item.subtitle.toLowerCase().includes(value) || item.uid.toLowerCase().includes(value);\n });\n });\n function openAddContact() {\n contacts.actionError = '';\n contacts.actionInfo = '';\n addKeyword.value = '';\n addingContact.value = true;\n }\n function closeAddContact() {\n addingContact.value = false;\n }\n async function submitAddContact() {\n const added = await contacts.addContact(addKeyword.value);\n if (added) {\n window.setTimeout(() => {\n addingContact.value = false;\n }, 500);\n }\n }\n const __returned__ = {\n contacts,\n keyword,\n addingContact,\n addKeyword,\n filteredContacts,\n openAddContact,\n closeAddContact,\n submitAddContact,\n computed: vue__WEBPACK_IMPORTED_MODULE_3__.computed,\n ref: vue__WEBPACK_IMPORTED_MODULE_3__.ref,\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_4__.useContactStore;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/ContactList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/services/mediaProxy */ \"./src/services/mediaProxy.js\");\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ContactList',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_4__.useContactStore)();\n const keyword = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const addingContact = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)(false);\n const addKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_3__.ref)('');\n const filteredContacts = (0,vue__WEBPACK_IMPORTED_MODULE_3__.computed)(() => {\n const value = keyword.value.toLowerCase();\n if (!value) {\n return contacts.contacts;\n }\n return contacts.contacts.filter(item => {\n return item.title.toLowerCase().includes(value) || item.subtitle.toLowerCase().includes(value) || item.uid.toLowerCase().includes(value);\n });\n });\n function openAddContact() {\n contacts.actionError = '';\n contacts.actionInfo = '';\n addKeyword.value = '';\n addingContact.value = true;\n }\n function closeAddContact() {\n addingContact.value = false;\n }\n async function submitAddContact() {\n const added = await contacts.addContact(addKeyword.value);\n if (added) {\n window.setTimeout(() => {\n addingContact.value = false;\n }, 500);\n }\n }\n const __returned__ = {\n contacts,\n keyword,\n addingContact,\n addKeyword,\n filteredContacts,\n openAddContact,\n closeAddContact,\n submitAddContact,\n computed: vue__WEBPACK_IMPORTED_MODULE_3__.computed,\n ref: vue__WEBPACK_IMPORTED_MODULE_3__.ref,\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_4__.useContactStore;\n },\n get useImageProxyFallback() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_5__.useImageProxyFallback;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/ContactList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -126,7 +126,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.flat-map.js */ \"./node_modules/core-js/modules/es.iterator.flat-map.js\");\n/* harmony import */ var core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.iterator.some.js */ \"./node_modules/core-js/modules/es.iterator.some.js\");\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert.js */ \"./node_modules/core-js/modules/es.map.get-or-insert.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert-computed.js */ \"./node_modules/core-js/modules/es.map.get-or-insert-computed.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/stores/conversations */ \"./src/stores/conversations.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ConversationList',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_17__.useConversationStore)();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_18__.useContactStore)();\n const actionMenuOpen = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)(false);\n const activeAction = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const actionBusy = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)(false);\n const searchKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const addKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const groupName = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const groupAnnouncement = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const groupWelcomeText = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const joinGroupKey = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const broadcastText = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const channelName = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const channelAnnouncement = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const contactKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const selectedContactIds = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)([]);\n const actionTitles = {\n addContact: '添加联系人',\n createGroup: '新建群组',\n joinGroup: '加入群组',\n broadcast: '群发助手',\n createChannel: '创建频道/公告群'\n };\n const submitLabels = {\n addContact: '添加',\n createGroup: '创建',\n joinGroup: '加入',\n broadcast: '发送',\n createChannel: '创建'\n };\n const actionTitle = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => actionTitles[activeAction.value] || '');\n const submitLabel = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => submitLabels[activeAction.value] || '确定');\n const modalError = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => contacts.actionError || conversations.actionError);\n const modalInfo = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => contacts.actionInfo || conversations.actionNotice);\n const normalizedSearchKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => searchKeyword.value.trim().toLowerCase());\n const contactsByUid = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => {\n const map = new Map();\n contacts.contacts.forEach(contact => {\n const uid = String(contact.uid || contact.id || '');\n if (uid) {\n map.set(uid, contact);\n }\n });\n return map;\n });\n const filteredConversationItems = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => {\n const keyword = normalizedSearchKeyword.value;\n if (!keyword) {\n return conversations.conversations.map(item => conversationResult(item));\n }\n const conversationResults = conversations.conversations.filter(item => matchesConversation(item, keyword, contactForConversation(item))).map(item => conversationResult(item));\n const conversationTargets = new Set(conversations.conversations.filter(item => item.type === 'single').map(item => conversationTarget(item)));\n const contactResults = contacts.contacts.filter(item => !conversationTargets.has(String(item.uid || item.id || ''))).filter(item => matchesContact(item, keyword)).map(item => contactResult(item));\n return [...conversationResults, ...contactResults];\n });\n const filteredContacts = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => {\n const keyword = contactKeyword.value.toLowerCase();\n if (!keyword) {\n return contacts.contacts;\n }\n return contacts.contacts.filter(item => {\n return String(item.title || '').toLowerCase().includes(keyword) || String(item.subtitle || '').toLowerCase().includes(keyword) || String(item.uid || '').toLowerCase().includes(keyword);\n });\n });\n const submitDisabled = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => {\n if (activeAction.value === 'addContact') {\n return !addKeyword.value;\n }\n if (activeAction.value === 'createGroup') {\n return !groupName.value || !selectedContactIds.value.length;\n }\n if (activeAction.value === 'joinGroup') {\n return !joinGroupKey.value;\n }\n if (activeAction.value === 'broadcast') {\n return !broadcastText.value || !selectedContactIds.value.length;\n }\n if (activeAction.value === 'createChannel') {\n return !channelName.value;\n }\n return true;\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_16__.onMounted)(() => {\n contacts.refreshContacts().catch(() => {});\n });\n const ContactPicker = (0,vue__WEBPACK_IMPORTED_MODULE_16__.defineComponent)({\n name: 'ContactPicker',\n props: {\n contacts: {\n type: Array,\n default: () => []\n },\n selectedIds: {\n type: Array,\n default: () => []\n },\n keyword: {\n type: String,\n default: ''\n },\n emptyText: {\n type: String,\n default: '暂无联系人'\n }\n },\n emits: ['toggle', 'update:keyword'],\n setup(props, {\n emit\n }) {\n return () => (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', {\n class: 'contact-picker'\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('input', {\n value: props.keyword,\n placeholder: '搜索联系人',\n onInput: event => emit('update:keyword', event.target.value)\n }), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', {\n class: 'contact-picker-list'\n }, props.contacts.length ? props.contacts.map(contact => (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('button', {\n key: contact.uid,\n type: 'button',\n class: ['contact-picker-row', {\n selected: props.selectedIds.includes(contact.uid)\n }],\n onClick: () => emit('toggle', contact.uid)\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', {\n class: 'contact-check'\n }, props.selectedIds.includes(contact.uid) ? '✓' : ''), contact.portrait ? (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('img', {\n class: 'conversation-avatar image-avatar',\n src: contact.portrait,\n alt: ''\n }) : (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', {\n class: 'conversation-avatar'\n }, contact.avatarText), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', {\n class: 'contact-picker-copy'\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('strong', contact.title), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('small', contact.subtitle)])])) : [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', {\n class: 'contact-picker-empty'\n }, props.emptyText)])]);\n }\n });\n function searchableValues(...values) {\n return values.flatMap(value => {\n if (Array.isArray(value)) {\n return value;\n }\n if (value && typeof value === 'object') {\n return Object.values(value);\n }\n return [value];\n }).map(value => String(value || '').toLowerCase()).filter(Boolean);\n }\n function matchesKeyword(values, keyword) {\n const compactKeyword = keyword.replace(/[^\\p{L}\\p{N}]+/gu, '');\n return searchableValues(values).some(value => {\n if (value.includes(keyword)) {\n return true;\n }\n if (!compactKeyword) {\n return false;\n }\n return value.replace(/[^\\p{L}\\p{N}]+/gu, '').includes(compactKeyword);\n });\n }\n function conversationTarget(item) {\n if (item.type !== 'single') {\n return String(item.target || item.raw?.target || item.id || '');\n }\n return String(item.target || item.raw?.target || item.id.replace(/^single-/, '') || '');\n }\n function contactForConversation(item) {\n const target = conversationTarget(item);\n return target ? contactsByUid.value.get(target) || null : null;\n }\n function matchesConversation(item, keyword, contact = null) {\n return matchesKeyword([item.title, item.subtitle, item.target, item.id, item.type, item.raw?.target, item.raw?.groupId, item.raw?.group_id, item.raw?.owner_uid, item.raw?.name, item.raw?.displayName, item.raw?.mobile, item.raw?.friendAlias, item.raw?.alias, contact?.title, contact?.subtitle, contact?.uid, contact?.id, contact?.alias, contact?.address, contact?.rawUser, contact?.rawFriend], keyword);\n }\n function matchesContact(item, keyword) {\n return matchesKeyword([item.title, item.subtitle, item.uid, item.id, item.alias, item.address, item.rawUser, item.rawFriend], keyword);\n }\n function conversationResult(item) {\n return {\n ...item,\n resultKind: 'conversation',\n resultKey: `conversation-${item.id}`\n };\n }\n function contactResult(contact) {\n return {\n id: contact.id,\n resultKind: 'contact',\n resultKey: `contact-${contact.uid || contact.id}`,\n contact,\n title: contact.title,\n subtitle: contact.subtitle,\n portrait: contact.portrait,\n avatarText: contact.avatarText,\n unread: 0\n };\n }\n function isListItemActive(item) {\n if (item.resultKind === 'conversation') {\n return item.id === conversations.activeId;\n }\n return `single-${item.contact?.uid || item.id}` === conversations.activeId;\n }\n function selectListItem(item) {\n if (item.resultKind === 'contact') {\n contacts.openChat(item.contact);\n return;\n }\n conversations.setActiveConversation(item.id);\n }\n function clearStoreMessages() {\n contacts.actionError = '';\n contacts.actionInfo = '';\n conversations.actionError = '';\n conversations.actionNotice = '';\n }\n function resetActionFields() {\n addKeyword.value = '';\n groupName.value = '';\n groupAnnouncement.value = '';\n groupWelcomeText.value = '';\n joinGroupKey.value = '';\n broadcastText.value = '';\n channelName.value = '';\n channelAnnouncement.value = '';\n contactKeyword.value = '';\n selectedContactIds.value = [];\n clearStoreMessages();\n }\n function toggleActionMenu() {\n actionMenuOpen.value = !actionMenuOpen.value;\n }\n function closeActionMenu() {\n actionMenuOpen.value = false;\n }\n function openAction(action) {\n resetActionFields();\n activeAction.value = action;\n actionMenuOpen.value = false;\n if (['createGroup', 'broadcast', 'createChannel'].includes(action)) {\n contacts.refreshContacts({\n force: true\n });\n }\n }\n function closeActionModal() {\n activeAction.value = '';\n actionBusy.value = false;\n resetActionFields();\n }\n function toggleContact(contactId) {\n const selected = new Set(selectedContactIds.value);\n if (selected.has(contactId)) {\n selected.delete(contactId);\n } else {\n selected.add(contactId);\n }\n selectedContactIds.value = Array.from(selected);\n }\n async function submitAction() {\n if (submitDisabled.value || actionBusy.value) {\n return;\n }\n actionBusy.value = true;\n clearStoreMessages();\n try {\n let ok = false;\n if (activeAction.value === 'addContact') {\n ok = await contacts.addContact(addKeyword.value);\n if (ok && contacts.activeContact) {\n contacts.openChat(contacts.activeContact);\n }\n } else if (activeAction.value === 'createGroup') {\n ok = await conversations.createGroup({\n name: groupName.value,\n announcement: groupAnnouncement.value,\n welcomeText: groupWelcomeText.value,\n memberIds: selectedContactIds.value\n });\n } else if (activeAction.value === 'joinGroup') {\n ok = await conversations.joinGroup(joinGroupKey.value);\n } else if (activeAction.value === 'broadcast') {\n ok = await conversations.broadcastMessage(selectedContactIds.value, broadcastText.value);\n } else if (activeAction.value === 'createChannel') {\n ok = await conversations.createGroup({\n name: channelName.value,\n memberIds: selectedContactIds.value,\n announcement: channelAnnouncement.value,\n channel: true\n });\n }\n if (ok) {\n window.setTimeout(closeActionModal, 450);\n }\n } finally {\n actionBusy.value = false;\n }\n }\n document.addEventListener('click', closeActionMenu);\n (0,vue__WEBPACK_IMPORTED_MODULE_16__.onBeforeUnmount)(() => {\n document.removeEventListener('click', closeActionMenu);\n });\n function formatUnread(value) {\n const count = Number(value || 0);\n return count > 99 ? '99+' : String(count);\n }\n const __returned__ = {\n conversations,\n contacts,\n actionMenuOpen,\n activeAction,\n actionBusy,\n searchKeyword,\n addKeyword,\n groupName,\n groupAnnouncement,\n groupWelcomeText,\n joinGroupKey,\n broadcastText,\n channelName,\n channelAnnouncement,\n contactKeyword,\n selectedContactIds,\n actionTitles,\n submitLabels,\n actionTitle,\n submitLabel,\n modalError,\n modalInfo,\n normalizedSearchKeyword,\n contactsByUid,\n filteredConversationItems,\n filteredContacts,\n submitDisabled,\n ContactPicker,\n searchableValues,\n matchesKeyword,\n conversationTarget,\n contactForConversation,\n matchesConversation,\n matchesContact,\n conversationResult,\n contactResult,\n isListItemActive,\n selectListItem,\n clearStoreMessages,\n resetActionFields,\n toggleActionMenu,\n closeActionMenu,\n openAction,\n closeActionModal,\n toggleContact,\n submitAction,\n formatUnread,\n computed: vue__WEBPACK_IMPORTED_MODULE_16__.computed,\n defineComponent: vue__WEBPACK_IMPORTED_MODULE_16__.defineComponent,\n h: vue__WEBPACK_IMPORTED_MODULE_16__.h,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_16__.onBeforeUnmount,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_16__.onMounted,\n ref: vue__WEBPACK_IMPORTED_MODULE_16__.ref,\n get useConversationStore() {\n return _stores_conversations__WEBPACK_IMPORTED_MODULE_17__.useConversationStore;\n },\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_18__.useContactStore;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.flat-map.js */ \"./node_modules/core-js/modules/es.iterator.flat-map.js\");\n/* harmony import */ var core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.iterator.some.js */ \"./node_modules/core-js/modules/es.iterator.some.js\");\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert.js */ \"./node_modules/core-js/modules/es.map.get-or-insert.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert-computed.js */ \"./node_modules/core-js/modules/es.map.get-or-insert-computed.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @/stores/conversations */ \"./src/stores/conversations.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/services/mediaProxy */ \"./src/services/mediaProxy.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'ConversationList',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_17__.useConversationStore)();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_18__.useContactStore)();\n const actionMenuOpen = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)(false);\n const activeAction = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const actionBusy = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)(false);\n const searchKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const addKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const groupName = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const groupAnnouncement = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const groupWelcomeText = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const joinGroupKey = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const broadcastText = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const channelName = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const channelAnnouncement = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const contactKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)('');\n const selectedContactIds = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)([]);\n const conversationMenu = (0,vue__WEBPACK_IMPORTED_MODULE_16__.ref)({\n item: null,\n x: 0,\n y: 0\n });\n const actionTitles = {\n addContact: '添加联系人',\n createGroup: '新建群组',\n joinGroup: '加入群组',\n broadcast: '群发助手',\n createChannel: '创建频道/公告群'\n };\n const submitLabels = {\n addContact: '添加',\n createGroup: '创建',\n joinGroup: '加入',\n broadcast: '发送',\n createChannel: '创建'\n };\n const actionTitle = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => actionTitles[activeAction.value] || '');\n const submitLabel = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => submitLabels[activeAction.value] || '确定');\n const modalError = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => contacts.actionError || conversations.actionError);\n const modalInfo = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => contacts.actionInfo || conversations.actionNotice);\n const normalizedSearchKeyword = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => searchKeyword.value.trim().toLowerCase());\n const contactsByUid = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => {\n const map = new Map();\n contacts.contacts.forEach(contact => {\n const uid = String(contact.uid || contact.id || '');\n if (uid) {\n map.set(uid, contact);\n }\n });\n return map;\n });\n const filteredConversationItems = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => {\n const keyword = normalizedSearchKeyword.value;\n if (!keyword) {\n return conversations.conversations.map(item => conversationResult(item));\n }\n const conversationResults = conversations.conversations.filter(item => matchesConversation(item, keyword, contactForConversation(item))).map(item => conversationResult(item));\n const conversationTargets = new Set(conversations.conversations.filter(item => item.type === 'single').map(item => conversationTarget(item)));\n const contactResults = contacts.contacts.filter(item => !conversationTargets.has(String(item.uid || item.id || ''))).filter(item => matchesContact(item, keyword)).map(item => contactResult(item));\n return [...conversationResults, ...contactResults];\n });\n const filteredContacts = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => {\n const keyword = contactKeyword.value.toLowerCase();\n if (!keyword) {\n return contacts.contacts;\n }\n return contacts.contacts.filter(item => {\n return String(item.title || '').toLowerCase().includes(keyword) || String(item.subtitle || '').toLowerCase().includes(keyword) || String(item.uid || '').toLowerCase().includes(keyword);\n });\n });\n const submitDisabled = (0,vue__WEBPACK_IMPORTED_MODULE_16__.computed)(() => {\n if (activeAction.value === 'addContact') {\n return !addKeyword.value;\n }\n if (activeAction.value === 'createGroup') {\n return !groupName.value || !selectedContactIds.value.length;\n }\n if (activeAction.value === 'joinGroup') {\n return !joinGroupKey.value;\n }\n if (activeAction.value === 'broadcast') {\n return !broadcastText.value || !selectedContactIds.value.length;\n }\n if (activeAction.value === 'createChannel') {\n return !channelName.value;\n }\n return true;\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_16__.onMounted)(() => {\n contacts.refreshContacts().catch(() => {});\n });\n function isPinned(item) {\n return item?.resultKind === 'conversation' && Number(item.pinnedAt || item.top || 0) > 0;\n }\n function openConversationMenu(event, item) {\n if (item.resultKind !== 'conversation') return;\n conversationMenu.value = {\n item,\n x: Math.min(event.clientX, window.innerWidth - 140),\n y: Math.min(event.clientY, window.innerHeight - 60)\n };\n }\n function closeConversationMenu() {\n conversationMenu.value = {\n item: null,\n x: 0,\n y: 0\n };\n }\n function togglePinned() {\n const item = conversationMenu.value.item;\n if (item) conversations.togglePinnedConversation(item.id);\n closeConversationMenu();\n }\n function deleteConversation() {\n const item = conversationMenu.value.item;\n if (item && window.confirm(`确定删除与“${item.title}”的会话吗?`)) {\n conversations.removeConversation(item.id);\n conversations.setActionNotice('会话已删除');\n }\n closeConversationMenu();\n }\n const ContactPicker = (0,vue__WEBPACK_IMPORTED_MODULE_16__.defineComponent)({\n name: 'ContactPicker',\n props: {\n contacts: {\n type: Array,\n default: () => []\n },\n selectedIds: {\n type: Array,\n default: () => []\n },\n keyword: {\n type: String,\n default: ''\n },\n emptyText: {\n type: String,\n default: '暂无联系人'\n }\n },\n emits: ['toggle', 'update:keyword'],\n setup(props, {\n emit\n }) {\n return () => (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', {\n class: 'contact-picker'\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('input', {\n value: props.keyword,\n placeholder: '搜索联系人',\n onInput: event => emit('update:keyword', event.target.value)\n }), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', {\n class: 'contact-picker-list'\n }, props.contacts.length ? props.contacts.map(contact => (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('button', {\n key: contact.uid,\n type: 'button',\n class: ['contact-picker-row', {\n selected: props.selectedIds.includes(contact.uid)\n }],\n onClick: () => emit('toggle', contact.uid)\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', {\n class: 'contact-check'\n }, props.selectedIds.includes(contact.uid) ? '✓' : ''), contact.portrait ? (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('img', {\n class: 'conversation-avatar image-avatar',\n src: contact.portrait,\n alt: ''\n }) : (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', {\n class: 'conversation-avatar'\n }, contact.avatarText), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('span', {\n class: 'contact-picker-copy'\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('strong', contact.title), (0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('small', contact.subtitle)])])) : [(0,vue__WEBPACK_IMPORTED_MODULE_16__.h)('div', {\n class: 'contact-picker-empty'\n }, props.emptyText)])]);\n }\n });\n function searchableValues(...values) {\n return values.flatMap(value => {\n if (Array.isArray(value)) {\n return value;\n }\n if (value && typeof value === 'object') {\n return Object.values(value);\n }\n return [value];\n }).map(value => String(value || '').toLowerCase()).filter(Boolean);\n }\n function matchesKeyword(values, keyword) {\n const compactKeyword = keyword.replace(/[^\\p{L}\\p{N}]+/gu, '');\n return searchableValues(values).some(value => {\n if (value.includes(keyword)) {\n return true;\n }\n if (!compactKeyword) {\n return false;\n }\n return value.replace(/[^\\p{L}\\p{N}]+/gu, '').includes(compactKeyword);\n });\n }\n function conversationTarget(item) {\n if (item.type !== 'single') {\n return String(item.target || item.raw?.target || item.id || '');\n }\n return String(item.target || item.raw?.target || item.id.replace(/^single-/, '') || '');\n }\n function contactForConversation(item) {\n const target = conversationTarget(item);\n return target ? contactsByUid.value.get(target) || null : null;\n }\n function matchesConversation(item, keyword, contact = null) {\n return matchesKeyword([item.title, item.subtitle, item.target, item.id, item.type, item.raw?.target, item.raw?.groupId, item.raw?.group_id, item.raw?.owner_uid, item.raw?.name, item.raw?.displayName, item.raw?.mobile, item.raw?.friendAlias, item.raw?.alias, contact?.title, contact?.subtitle, contact?.uid, contact?.id, contact?.alias, contact?.address, contact?.rawUser, contact?.rawFriend], keyword);\n }\n function matchesContact(item, keyword) {\n return matchesKeyword([item.title, item.subtitle, item.uid, item.id, item.alias, item.address, item.rawUser, item.rawFriend], keyword);\n }\n function conversationResult(item) {\n return {\n ...item,\n resultKind: 'conversation',\n resultKey: `conversation-${item.id}`\n };\n }\n function contactResult(contact) {\n return {\n id: contact.id,\n resultKind: 'contact',\n resultKey: `contact-${contact.uid || contact.id}`,\n contact,\n title: contact.title,\n subtitle: contact.subtitle,\n portrait: contact.portrait,\n avatarText: contact.avatarText,\n unread: 0\n };\n }\n function isListItemActive(item) {\n if (item.resultKind === 'conversation') {\n return item.id === conversations.activeId;\n }\n return `single-${item.contact?.uid || item.id}` === conversations.activeId;\n }\n function selectListItem(item) {\n if (item.resultKind === 'contact') {\n contacts.openChat(item.contact);\n return;\n }\n conversations.setActiveConversation(item.id);\n }\n function clearStoreMessages() {\n contacts.actionError = '';\n contacts.actionInfo = '';\n conversations.actionError = '';\n conversations.actionNotice = '';\n }\n function resetActionFields() {\n addKeyword.value = '';\n groupName.value = '';\n groupAnnouncement.value = '';\n groupWelcomeText.value = '';\n joinGroupKey.value = '';\n broadcastText.value = '';\n channelName.value = '';\n channelAnnouncement.value = '';\n contactKeyword.value = '';\n selectedContactIds.value = [];\n clearStoreMessages();\n }\n function toggleActionMenu() {\n actionMenuOpen.value = !actionMenuOpen.value;\n }\n function closeActionMenu() {\n actionMenuOpen.value = false;\n }\n function openAction(action) {\n resetActionFields();\n activeAction.value = action;\n actionMenuOpen.value = false;\n if (['createGroup', 'broadcast', 'createChannel'].includes(action)) {\n contacts.refreshContacts({\n force: true\n });\n }\n }\n function closeActionModal() {\n activeAction.value = '';\n actionBusy.value = false;\n resetActionFields();\n }\n function toggleContact(contactId) {\n const selected = new Set(selectedContactIds.value);\n if (selected.has(contactId)) {\n selected.delete(contactId);\n } else {\n selected.add(contactId);\n }\n selectedContactIds.value = Array.from(selected);\n }\n async function submitAction() {\n if (submitDisabled.value || actionBusy.value) {\n return;\n }\n actionBusy.value = true;\n clearStoreMessages();\n try {\n let ok = false;\n if (activeAction.value === 'addContact') {\n ok = await contacts.addContact(addKeyword.value);\n if (ok && contacts.activeContact) {\n contacts.openChat(contacts.activeContact);\n }\n } else if (activeAction.value === 'createGroup') {\n ok = await conversations.createGroup({\n name: groupName.value,\n announcement: groupAnnouncement.value,\n welcomeText: groupWelcomeText.value,\n memberIds: selectedContactIds.value\n });\n } else if (activeAction.value === 'joinGroup') {\n ok = await conversations.joinGroup(joinGroupKey.value);\n } else if (activeAction.value === 'broadcast') {\n ok = await conversations.broadcastMessage(selectedContactIds.value, broadcastText.value);\n } else if (activeAction.value === 'createChannel') {\n ok = await conversations.createGroup({\n name: channelName.value,\n memberIds: selectedContactIds.value,\n announcement: channelAnnouncement.value,\n channel: true\n });\n }\n if (ok) {\n window.setTimeout(closeActionModal, 450);\n }\n } finally {\n actionBusy.value = false;\n }\n }\n document.addEventListener('click', closeActionMenu);\n document.addEventListener('click', closeConversationMenu);\n (0,vue__WEBPACK_IMPORTED_MODULE_16__.onBeforeUnmount)(() => {\n document.removeEventListener('click', closeActionMenu);\n document.removeEventListener('click', closeConversationMenu);\n });\n function formatUnread(value) {\n const count = Number(value || 0);\n return count > 99 ? '99+' : String(count);\n }\n const __returned__ = {\n conversations,\n contacts,\n actionMenuOpen,\n activeAction,\n actionBusy,\n searchKeyword,\n addKeyword,\n groupName,\n groupAnnouncement,\n groupWelcomeText,\n joinGroupKey,\n broadcastText,\n channelName,\n channelAnnouncement,\n contactKeyword,\n selectedContactIds,\n conversationMenu,\n actionTitles,\n submitLabels,\n actionTitle,\n submitLabel,\n modalError,\n modalInfo,\n normalizedSearchKeyword,\n contactsByUid,\n filteredConversationItems,\n filteredContacts,\n submitDisabled,\n isPinned,\n openConversationMenu,\n closeConversationMenu,\n togglePinned,\n deleteConversation,\n ContactPicker,\n searchableValues,\n matchesKeyword,\n conversationTarget,\n contactForConversation,\n matchesConversation,\n matchesContact,\n conversationResult,\n contactResult,\n isListItemActive,\n selectListItem,\n clearStoreMessages,\n resetActionFields,\n toggleActionMenu,\n closeActionMenu,\n openAction,\n closeActionModal,\n toggleContact,\n submitAction,\n formatUnread,\n computed: vue__WEBPACK_IMPORTED_MODULE_16__.computed,\n defineComponent: vue__WEBPACK_IMPORTED_MODULE_16__.defineComponent,\n h: vue__WEBPACK_IMPORTED_MODULE_16__.h,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_16__.onBeforeUnmount,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_16__.onMounted,\n ref: vue__WEBPACK_IMPORTED_MODULE_16__.ref,\n get useConversationStore() {\n return _stores_conversations__WEBPACK_IMPORTED_MODULE_17__.useConversationStore;\n },\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_18__.useContactStore;\n },\n get useImageProxyFallback() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_19__.useImageProxyFallback;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -137,7 +137,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var cor
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/stores/session */ \"./src/stores/session.js\");\n/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/stores/navigation */ \"./src/stores/navigation.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n\n\n\n\n\n\nconst CROP_OUTPUT_SIZE = 512;\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'NavigationRail',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_3__.useSessionStore)();\n const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_4__.useNavigationStore)();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_5__.useContactStore)();\n const settingsItems = [{\n key: 'notifications',\n label: '通知设置'\n }, {\n key: 'password',\n label: '更改密码'\n }, {\n key: 'wallet',\n label: '钱包管理'\n }, {\n key: 'language',\n label: '切换语言'\n }, {\n key: 'feedback',\n label: '问题反馈'\n }];\n const initials = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => (session.displayName || session.userId || 'Q').slice(0, 1).toUpperCase());\n const settingsOpen = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(false);\n const settingsSection = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('password');\n const passwordSaving = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(false);\n const settingsNotice = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const settingsError = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const profileOpen = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(false);\n const profileSaving = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(false);\n const profileNotice = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const profileError = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const profileFile = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(null);\n const profilePreview = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const portraitInput = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(null);\n const cropperCanvas = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(null);\n const cropperPreviewCanvas = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(null);\n const profileDraft = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)({\n displayName: ''\n });\n const passwordDraft = (0,vue__WEBPACK_IMPORTED_MODULE_2__.reactive)({\n oldPassword: '',\n newPassword: '',\n confirmPassword: ''\n });\n const currentAvatarUrl = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => profilePreview.value || session.portrait || '');\n const activeSettingsItem = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => settingsItems.find(item => item.key === settingsSection.value) || settingsItems[0]);\n const avatarPreviewViewer = (0,vue__WEBPACK_IMPORTED_MODULE_2__.reactive)({\n open: false,\n url: '',\n scale: 1,\n offsetX: 0,\n offsetY: 0,\n dragging: false,\n dragStartX: 0,\n dragStartY: 0,\n dragOffsetX: 0,\n dragOffsetY: 0\n });\n const avatarCropper = (0,vue__WEBPACK_IMPORTED_MODULE_2__.reactive)({\n open: false,\n loaded: false,\n busy: false,\n error: '',\n objectUrl: '',\n fileName: 'avatar.jpg',\n image: null,\n baseScale: 1,\n scale: 1,\n rotation: 0,\n offsetX: 0,\n offsetY: 0,\n dragging: false,\n dragStartX: 0,\n dragStartY: 0,\n dragOffsetX: 0,\n dragOffsetY: 0\n });\n const avatarPreviewStyle = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => ({\n transform: `translate3d(${avatarPreviewViewer.offsetX}px, ${avatarPreviewViewer.offsetY}px, 0) scale(${avatarPreviewViewer.scale})`\n }));\n (0,vue__WEBPACK_IMPORTED_MODULE_2__.onMounted)(() => {\n session.refreshProfile();\n window.addEventListener('resize', drawAvatarCropper);\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_2__.onBeforeUnmount)(() => {\n revokeProfilePreview();\n closeAvatarCropper();\n window.removeEventListener('resize', drawAvatarCropper);\n });\n function showContacts() {\n navigation.showContacts();\n contacts.refreshContacts();\n }\n function clearProfileFeedback() {\n profileNotice.value = '';\n profileError.value = '';\n }\n function clearSettingsFeedback() {\n settingsNotice.value = '';\n settingsError.value = '';\n }\n function resetPasswordDraft() {\n passwordDraft.oldPassword = '';\n passwordDraft.newPassword = '';\n passwordDraft.confirmPassword = '';\n }\n function openSettings() {\n settingsOpen.value = true;\n settingsSection.value = 'password';\n clearSettingsFeedback();\n }\n function closeSettings() {\n if (passwordSaving.value) {\n return;\n }\n settingsOpen.value = false;\n clearSettingsFeedback();\n resetPasswordDraft();\n }\n function selectSettingsSection(section) {\n settingsSection.value = section;\n clearSettingsFeedback();\n }\n function revokeProfilePreview() {\n if (profilePreview.value) {\n URL.revokeObjectURL(profilePreview.value);\n profilePreview.value = '';\n }\n }\n function revokeCropperObjectUrl() {\n if (avatarCropper.objectUrl) {\n URL.revokeObjectURL(avatarCropper.objectUrl);\n avatarCropper.objectUrl = '';\n }\n }\n async function openProfileEditor() {\n profileOpen.value = true;\n clearProfileFeedback();\n profileDraft.value.displayName = session.displayName || session.userId || '';\n const profile = await session.refreshProfile();\n if (profileOpen.value && profile) {\n profileDraft.value.displayName = session.displayName || session.userId || '';\n }\n }\n function closeProfileEditor() {\n profileOpen.value = false;\n profileFile.value = null;\n clearProfileFeedback();\n revokeProfilePreview();\n closeAvatarPreview();\n closeAvatarCropper();\n }\n function selectPortrait(event) {\n const file = event.target.files?.[0] || null;\n event.target.value = '';\n clearProfileFeedback();\n if (file) {\n openAvatarCropper(file);\n }\n }\n function choosePortraitFile() {\n portraitInput.value?.click();\n }\n function openAvatarPreview() {\n if (!currentAvatarUrl.value) {\n return;\n }\n avatarPreviewViewer.open = true;\n avatarPreviewViewer.url = currentAvatarUrl.value;\n resetAvatarPreview();\n }\n function closeAvatarPreview() {\n avatarPreviewViewer.open = false;\n avatarPreviewViewer.dragging = false;\n }\n function resetAvatarPreview() {\n avatarPreviewViewer.scale = 1;\n avatarPreviewViewer.offsetX = 0;\n avatarPreviewViewer.offsetY = 0;\n }\n function zoomAvatarPreview(factor) {\n avatarPreviewViewer.scale = Math.max(0.5, Math.min(6, Number((avatarPreviewViewer.scale * factor).toFixed(2))));\n if (avatarPreviewViewer.scale <= 1) {\n avatarPreviewViewer.offsetX = 0;\n avatarPreviewViewer.offsetY = 0;\n }\n }\n function handleAvatarPreviewWheel(event) {\n zoomAvatarPreview(event.deltaY < 0 ? 1.12 : 1 / 1.12);\n }\n function startAvatarPreviewDrag(event) {\n if (avatarPreviewViewer.scale <= 1) {\n return;\n }\n avatarPreviewViewer.dragging = true;\n avatarPreviewViewer.dragStartX = event.clientX;\n avatarPreviewViewer.dragStartY = event.clientY;\n avatarPreviewViewer.dragOffsetX = avatarPreviewViewer.offsetX;\n avatarPreviewViewer.dragOffsetY = avatarPreviewViewer.offsetY;\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n function moveAvatarPreviewDrag(event) {\n if (!avatarPreviewViewer.dragging) {\n return;\n }\n avatarPreviewViewer.offsetX = avatarPreviewViewer.dragOffsetX + event.clientX - avatarPreviewViewer.dragStartX;\n avatarPreviewViewer.offsetY = avatarPreviewViewer.dragOffsetY + event.clientY - avatarPreviewViewer.dragStartY;\n }\n function stopAvatarPreviewDrag() {\n avatarPreviewViewer.dragging = false;\n }\n function dropPortrait(event) {\n const file = Array.from(event.dataTransfer?.files || []).find(item => item.type.startsWith('image/'));\n if (file) {\n clearProfileFeedback();\n openAvatarCropper(file);\n }\n }\n function cropperStageSize() {\n const canvas = cropperCanvas.value;\n const rect = canvas?.getBoundingClientRect();\n const width = Math.max(280, Math.round(rect?.width || 360));\n const height = Math.max(280, Math.round(rect?.height || 360));\n return {\n width,\n height\n };\n }\n function cropperBoxSize() {\n const {\n width,\n height\n } = cropperStageSize();\n return Math.round(Math.min(width, height) * 0.74);\n }\n function rotatedImageSize() {\n const image = avatarCropper.image;\n if (!image) {\n return {\n width: 1,\n height: 1\n };\n }\n const quarterTurn = Math.abs(avatarCropper.rotation % 180) === 90;\n return {\n width: quarterTurn ? image.naturalHeight : image.naturalWidth,\n height: quarterTurn ? image.naturalWidth : image.naturalHeight\n };\n }\n function clampCropperOffset() {\n const cropSize = cropperBoxSize();\n const rotated = rotatedImageSize();\n const scaledWidth = rotated.width * avatarCropper.scale;\n const scaledHeight = rotated.height * avatarCropper.scale;\n const maxX = Math.max(0, (scaledWidth - cropSize) / 2);\n const maxY = Math.max(0, (scaledHeight - cropSize) / 2);\n avatarCropper.offsetX = Math.max(-maxX, Math.min(maxX, avatarCropper.offsetX));\n avatarCropper.offsetY = Math.max(-maxY, Math.min(maxY, avatarCropper.offsetY));\n }\n function updateCropperBaseScale() {\n const cropSize = cropperBoxSize();\n const rotated = rotatedImageSize();\n avatarCropper.baseScale = Math.max(cropSize / rotated.width, cropSize / rotated.height);\n avatarCropper.scale = Math.max(avatarCropper.baseScale, avatarCropper.scale || avatarCropper.baseScale);\n }\n function drawCanvasImage(canvas, width, height, outputScale = 1, cropOnly = false) {\n const image = avatarCropper.image;\n if (!canvas || !image) {\n return;\n }\n const dpr = cropOnly ? 1 : window.devicePixelRatio || 1;\n canvas.width = Math.round(width * dpr);\n canvas.height = Math.round(height * dpr);\n const context = canvas.getContext('2d');\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.clearRect(0, 0, width, height);\n context.fillStyle = '#eef4f7';\n context.fillRect(0, 0, width, height);\n context.save();\n context.translate(width / 2 + avatarCropper.offsetX * outputScale, height / 2 + avatarCropper.offsetY * outputScale);\n context.rotate(avatarCropper.rotation * Math.PI / 180);\n context.scale(avatarCropper.scale * outputScale, avatarCropper.scale * outputScale);\n context.drawImage(image, -image.naturalWidth / 2, -image.naturalHeight / 2);\n context.restore();\n if (!cropOnly) {\n const cropSize = cropperBoxSize();\n context.save();\n context.fillStyle = 'rgba(10, 18, 30, 0.42)';\n context.beginPath();\n context.rect(0, 0, width, height);\n context.rect((width - cropSize) / 2, (height - cropSize) / 2, cropSize, cropSize);\n context.fill('evenodd');\n context.restore();\n }\n }\n function drawAvatarCropper() {\n if (!avatarCropper.open || !avatarCropper.loaded) {\n return;\n }\n clampCropperOffset();\n const {\n width,\n height\n } = cropperStageSize();\n drawCanvasImage(cropperCanvas.value, width, height);\n const previewCanvas = cropperPreviewCanvas.value;\n if (previewCanvas) {\n drawCanvasImage(previewCanvas, 108, 108, 108 / cropperBoxSize(), true);\n }\n }\n function resetCropperTransform() {\n if (!avatarCropper.image) {\n return;\n }\n avatarCropper.rotation = 0;\n avatarCropper.offsetX = 0;\n avatarCropper.offsetY = 0;\n updateCropperBaseScale();\n avatarCropper.scale = avatarCropper.baseScale;\n drawAvatarCropper();\n }\n function openAvatarCropper(file) {\n if (!file.type.startsWith('image/')) {\n profileError.value = '请选择图片文件';\n return;\n }\n if (file.size > 8 * 1024 * 1024) {\n profileError.value = '头像图片不能超过8MB';\n return;\n }\n closeAvatarCropper();\n avatarCropper.open = true;\n avatarCropper.loaded = false;\n avatarCropper.error = '';\n avatarCropper.fileName = file.name || 'avatar.jpg';\n avatarCropper.objectUrl = URL.createObjectURL(file);\n const image = new Image();\n image.onload = () => {\n avatarCropper.image = image;\n avatarCropper.loaded = true;\n (0,vue__WEBPACK_IMPORTED_MODULE_2__.nextTick)(resetCropperTransform);\n };\n image.onerror = () => {\n avatarCropper.error = '图片加载失败';\n avatarCropper.loaded = false;\n };\n image.src = avatarCropper.objectUrl;\n }\n function closeAvatarCropper() {\n avatarCropper.open = false;\n avatarCropper.loaded = false;\n avatarCropper.busy = false;\n avatarCropper.error = '';\n avatarCropper.image = null;\n avatarCropper.dragging = false;\n revokeCropperObjectUrl();\n }\n function zoomCropper(factor) {\n if (!avatarCropper.loaded) {\n return;\n }\n updateCropperBaseScale();\n avatarCropper.scale = Math.max(avatarCropper.baseScale, Math.min(avatarCropper.baseScale * 6, avatarCropper.scale * factor));\n drawAvatarCropper();\n }\n function rotateCropper(degrees) {\n if (!avatarCropper.loaded) {\n return;\n }\n avatarCropper.rotation = (avatarCropper.rotation + degrees + 360) % 360;\n updateCropperBaseScale();\n clampCropperOffset();\n drawAvatarCropper();\n }\n function handleCropperWheel(event) {\n zoomCropper(event.deltaY < 0 ? 1.08 : 1 / 1.08);\n }\n function startCropperDrag(event) {\n if (!avatarCropper.loaded) {\n return;\n }\n avatarCropper.dragging = true;\n avatarCropper.dragStartX = event.clientX;\n avatarCropper.dragStartY = event.clientY;\n avatarCropper.dragOffsetX = avatarCropper.offsetX;\n avatarCropper.dragOffsetY = avatarCropper.offsetY;\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n function moveCropperDrag(event) {\n if (!avatarCropper.dragging) {\n return;\n }\n avatarCropper.offsetX = avatarCropper.dragOffsetX + event.clientX - avatarCropper.dragStartX;\n avatarCropper.offsetY = avatarCropper.dragOffsetY + event.clientY - avatarCropper.dragStartY;\n drawAvatarCropper();\n }\n function stopCropperDrag() {\n avatarCropper.dragging = false;\n }\n function canvasToBlob(canvas, type = 'image/jpeg', quality = 0.9) {\n return new Promise((resolve, reject) => {\n canvas.toBlob(blob => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error('头像裁切失败'));\n }\n }, type, quality);\n });\n }\n async function confirmAvatarCrop() {\n if (!avatarCropper.loaded || avatarCropper.busy) {\n return;\n }\n avatarCropper.busy = true;\n avatarCropper.error = '';\n try {\n const outputCanvas = document.createElement('canvas');\n drawCanvasImage(outputCanvas, CROP_OUTPUT_SIZE, CROP_OUTPUT_SIZE, CROP_OUTPUT_SIZE / cropperBoxSize(), true);\n const blob = await canvasToBlob(outputCanvas);\n const fileName = avatarCropper.fileName.replace(/\\.[^.]+$/, '') || 'avatar';\n const croppedFile = new File([blob], `${fileName}.jpg`, {\n type: 'image/jpeg'\n });\n profileFile.value = croppedFile;\n revokeProfilePreview();\n profilePreview.value = URL.createObjectURL(croppedFile);\n closeAvatarCropper();\n } catch (error) {\n avatarCropper.error = error.message || '头像裁切失败';\n } finally {\n avatarCropper.busy = false;\n }\n }\n async function saveProfile() {\n if (profileSaving.value || !profileDraft.value.displayName) {\n return;\n }\n clearProfileFeedback();\n profileSaving.value = true;\n try {\n await session.saveProfile({\n displayName: profileDraft.value.displayName,\n portraitFile: profileFile.value\n });\n profileFile.value = null;\n revokeProfilePreview();\n profileNotice.value = '资料已保存';\n contacts.refreshContacts({\n force: true\n });\n } catch (error) {\n profileError.value = error.message || '资料保存失败';\n } finally {\n profileSaving.value = false;\n }\n }\n async function savePassword() {\n if (passwordSaving.value) {\n return;\n }\n clearSettingsFeedback();\n const oldPassword = passwordDraft.oldPassword;\n const newPassword = passwordDraft.newPassword;\n const confirmPassword = passwordDraft.confirmPassword;\n if (!oldPassword || !newPassword || !confirmPassword) {\n settingsError.value = '请填写完整密码';\n return;\n }\n if (newPassword !== confirmPassword) {\n settingsError.value = '两次输入的新密码不一致';\n return;\n }\n if (oldPassword === newPassword) {\n settingsError.value = '新密码不能和当前密码相同';\n return;\n }\n passwordSaving.value = true;\n try {\n await session.changePassword({\n oldPassword,\n newPassword\n });\n resetPasswordDraft();\n settingsNotice.value = '密码已更新';\n } catch (error) {\n settingsError.value = error.message || '密码修改失败';\n } finally {\n passwordSaving.value = false;\n }\n }\n function logout() {\n closeSettings();\n contacts.clearContacts();\n session.logout();\n }\n const __returned__ = {\n session,\n navigation,\n contacts,\n settingsItems,\n initials,\n settingsOpen,\n settingsSection,\n passwordSaving,\n settingsNotice,\n settingsError,\n profileOpen,\n profileSaving,\n profileNotice,\n profileError,\n profileFile,\n profilePreview,\n portraitInput,\n cropperCanvas,\n cropperPreviewCanvas,\n profileDraft,\n passwordDraft,\n currentAvatarUrl,\n activeSettingsItem,\n avatarPreviewViewer,\n avatarCropper,\n avatarPreviewStyle,\n CROP_OUTPUT_SIZE,\n showContacts,\n clearProfileFeedback,\n clearSettingsFeedback,\n resetPasswordDraft,\n openSettings,\n closeSettings,\n selectSettingsSection,\n revokeProfilePreview,\n revokeCropperObjectUrl,\n openProfileEditor,\n closeProfileEditor,\n selectPortrait,\n choosePortraitFile,\n openAvatarPreview,\n closeAvatarPreview,\n resetAvatarPreview,\n zoomAvatarPreview,\n handleAvatarPreviewWheel,\n startAvatarPreviewDrag,\n moveAvatarPreviewDrag,\n stopAvatarPreviewDrag,\n dropPortrait,\n cropperStageSize,\n cropperBoxSize,\n rotatedImageSize,\n clampCropperOffset,\n updateCropperBaseScale,\n drawCanvasImage,\n drawAvatarCropper,\n resetCropperTransform,\n openAvatarCropper,\n closeAvatarCropper,\n zoomCropper,\n rotateCropper,\n handleCropperWheel,\n startCropperDrag,\n moveCropperDrag,\n stopCropperDrag,\n canvasToBlob,\n confirmAvatarCrop,\n saveProfile,\n savePassword,\n logout,\n computed: vue__WEBPACK_IMPORTED_MODULE_2__.computed,\n nextTick: vue__WEBPACK_IMPORTED_MODULE_2__.nextTick,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_2__.onBeforeUnmount,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_2__.onMounted,\n reactive: vue__WEBPACK_IMPORTED_MODULE_2__.reactive,\n ref: vue__WEBPACK_IMPORTED_MODULE_2__.ref,\n get useSessionStore() {\n return _stores_session__WEBPACK_IMPORTED_MODULE_3__.useSessionStore;\n },\n get useNavigationStore() {\n return _stores_navigation__WEBPACK_IMPORTED_MODULE_4__.useNavigationStore;\n },\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_5__.useContactStore;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @/stores/session */ \"./src/stores/session.js\");\n/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/stores/navigation */ \"./src/stores/navigation.js\");\n/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/stores/contacts */ \"./src/stores/contacts.js\");\n/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/composables/useAutoDismiss */ \"./src/composables/useAutoDismiss.js\");\n/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @/services/mediaProxy */ \"./src/services/mediaProxy.js\");\n\n\n\n\n\n\n\n\nconst CROP_OUTPUT_SIZE = 512;\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n __name: 'NavigationRail',\n setup(__props, {\n expose: __expose\n }) {\n __expose();\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_3__.useSessionStore)();\n const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_4__.useNavigationStore)();\n const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_5__.useContactStore)();\n const settingsItems = [{\n key: 'notifications',\n label: '通知设置'\n }, {\n key: 'password',\n label: '更改密码'\n }, {\n key: 'wallet',\n label: '钱包管理'\n }, {\n key: 'language',\n label: '切换语言'\n }, {\n key: 'feedback',\n label: '问题反馈'\n }];\n const initials = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => (session.displayName || session.userId || 'Q').slice(0, 1).toUpperCase());\n const settingsOpen = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(false);\n const settingsSection = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('password');\n const passwordSaving = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(false);\n const settingsNotice = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const settingsError = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const profileOpen = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(false);\n const profileSaving = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(false);\n const profileNotice = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const profileError = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const profileFile = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(null);\n const profilePreview = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)('');\n const portraitInput = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(null);\n const cropperCanvas = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(null);\n const cropperPreviewCanvas = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)(null);\n const profileDraft = (0,vue__WEBPACK_IMPORTED_MODULE_2__.ref)({\n displayName: ''\n });\n const passwordDraft = (0,vue__WEBPACK_IMPORTED_MODULE_2__.reactive)({\n oldPassword: '',\n newPassword: '',\n confirmPassword: ''\n });\n const currentAvatarUrl = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => profilePreview.value || session.portrait || '');\n const activeSettingsItem = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => settingsItems.find(item => item.key === settingsSection.value) || settingsItems[0]);\n const avatarPreviewViewer = (0,vue__WEBPACK_IMPORTED_MODULE_2__.reactive)({\n open: false,\n url: '',\n scale: 1,\n offsetX: 0,\n offsetY: 0,\n dragging: false,\n dragStartX: 0,\n dragStartY: 0,\n dragOffsetX: 0,\n dragOffsetY: 0\n });\n const avatarCropper = (0,vue__WEBPACK_IMPORTED_MODULE_2__.reactive)({\n open: false,\n loaded: false,\n busy: false,\n error: '',\n objectUrl: '',\n fileName: 'avatar.jpg',\n image: null,\n baseScale: 1,\n scale: 1,\n rotation: 0,\n offsetX: 0,\n offsetY: 0,\n dragging: false,\n dragStartX: 0,\n dragStartY: 0,\n dragOffsetX: 0,\n dragOffsetY: 0\n });\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_6__.useAutoDismiss)(() => settingsError.value || settingsNotice.value, value => {\n if ((settingsError.value || settingsNotice.value) === value) {\n settingsError.value = '';\n settingsNotice.value = '';\n }\n });\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_6__.useAutoDismiss)(() => profileError.value || profileNotice.value, value => {\n if ((profileError.value || profileNotice.value) === value) {\n profileError.value = '';\n profileNotice.value = '';\n }\n });\n (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_6__.useAutoDismiss)(() => avatarCropper.error, value => {\n if (avatarCropper.error === value) avatarCropper.error = '';\n });\n const avatarPreviewStyle = (0,vue__WEBPACK_IMPORTED_MODULE_2__.computed)(() => ({\n transform: `translate3d(${avatarPreviewViewer.offsetX}px, ${avatarPreviewViewer.offsetY}px, 0) scale(${avatarPreviewViewer.scale})`\n }));\n (0,vue__WEBPACK_IMPORTED_MODULE_2__.onMounted)(() => {\n session.refreshProfile();\n window.addEventListener('resize', drawAvatarCropper);\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_2__.onBeforeUnmount)(() => {\n revokeProfilePreview();\n closeAvatarCropper();\n window.removeEventListener('resize', drawAvatarCropper);\n });\n function showContacts() {\n navigation.showContacts();\n contacts.refreshContacts();\n }\n function clearProfileFeedback() {\n profileNotice.value = '';\n profileError.value = '';\n }\n function clearSettingsFeedback() {\n settingsNotice.value = '';\n settingsError.value = '';\n }\n function resetPasswordDraft() {\n passwordDraft.oldPassword = '';\n passwordDraft.newPassword = '';\n passwordDraft.confirmPassword = '';\n }\n function openSettings() {\n settingsOpen.value = true;\n settingsSection.value = 'password';\n clearSettingsFeedback();\n }\n function closeSettings() {\n if (passwordSaving.value) {\n return;\n }\n settingsOpen.value = false;\n clearSettingsFeedback();\n resetPasswordDraft();\n }\n function selectSettingsSection(section) {\n settingsSection.value = section;\n clearSettingsFeedback();\n }\n function revokeProfilePreview() {\n if (profilePreview.value) {\n URL.revokeObjectURL(profilePreview.value);\n profilePreview.value = '';\n }\n }\n function revokeCropperObjectUrl() {\n if (avatarCropper.objectUrl) {\n URL.revokeObjectURL(avatarCropper.objectUrl);\n avatarCropper.objectUrl = '';\n }\n }\n async function openProfileEditor() {\n profileOpen.value = true;\n clearProfileFeedback();\n profileDraft.value.displayName = session.displayName || session.userId || '';\n const profile = await session.refreshProfile();\n if (profileOpen.value && profile) {\n profileDraft.value.displayName = session.displayName || session.userId || '';\n }\n }\n function closeProfileEditor() {\n profileOpen.value = false;\n profileFile.value = null;\n clearProfileFeedback();\n revokeProfilePreview();\n closeAvatarPreview();\n closeAvatarCropper();\n }\n function selectPortrait(event) {\n const file = event.target.files?.[0] || null;\n event.target.value = '';\n clearProfileFeedback();\n if (file) {\n openAvatarCropper(file);\n }\n }\n function choosePortraitFile() {\n portraitInput.value?.click();\n }\n function openAvatarPreview() {\n if (!currentAvatarUrl.value) {\n return;\n }\n avatarPreviewViewer.open = true;\n avatarPreviewViewer.url = currentAvatarUrl.value;\n resetAvatarPreview();\n }\n function closeAvatarPreview() {\n avatarPreviewViewer.open = false;\n avatarPreviewViewer.dragging = false;\n }\n function resetAvatarPreview() {\n avatarPreviewViewer.scale = 1;\n avatarPreviewViewer.offsetX = 0;\n avatarPreviewViewer.offsetY = 0;\n }\n function zoomAvatarPreview(factor) {\n avatarPreviewViewer.scale = Math.max(0.5, Math.min(6, Number((avatarPreviewViewer.scale * factor).toFixed(2))));\n if (avatarPreviewViewer.scale <= 1) {\n avatarPreviewViewer.offsetX = 0;\n avatarPreviewViewer.offsetY = 0;\n }\n }\n function handleAvatarPreviewWheel(event) {\n zoomAvatarPreview(event.deltaY < 0 ? 1.12 : 1 / 1.12);\n }\n function startAvatarPreviewDrag(event) {\n if (avatarPreviewViewer.scale <= 1) {\n return;\n }\n avatarPreviewViewer.dragging = true;\n avatarPreviewViewer.dragStartX = event.clientX;\n avatarPreviewViewer.dragStartY = event.clientY;\n avatarPreviewViewer.dragOffsetX = avatarPreviewViewer.offsetX;\n avatarPreviewViewer.dragOffsetY = avatarPreviewViewer.offsetY;\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n function moveAvatarPreviewDrag(event) {\n if (!avatarPreviewViewer.dragging) {\n return;\n }\n avatarPreviewViewer.offsetX = avatarPreviewViewer.dragOffsetX + event.clientX - avatarPreviewViewer.dragStartX;\n avatarPreviewViewer.offsetY = avatarPreviewViewer.dragOffsetY + event.clientY - avatarPreviewViewer.dragStartY;\n }\n function stopAvatarPreviewDrag() {\n avatarPreviewViewer.dragging = false;\n }\n function dropPortrait(event) {\n const file = Array.from(event.dataTransfer?.files || []).find(item => item.type.startsWith('image/'));\n if (file) {\n clearProfileFeedback();\n openAvatarCropper(file);\n }\n }\n function cropperStageSize() {\n const canvas = cropperCanvas.value;\n const rect = canvas?.getBoundingClientRect();\n const width = Math.max(280, Math.round(rect?.width || 360));\n const height = Math.max(280, Math.round(rect?.height || 360));\n return {\n width,\n height\n };\n }\n function cropperBoxSize() {\n const {\n width,\n height\n } = cropperStageSize();\n return Math.round(Math.min(width, height) * 0.74);\n }\n function rotatedImageSize() {\n const image = avatarCropper.image;\n if (!image) {\n return {\n width: 1,\n height: 1\n };\n }\n const quarterTurn = Math.abs(avatarCropper.rotation % 180) === 90;\n return {\n width: quarterTurn ? image.naturalHeight : image.naturalWidth,\n height: quarterTurn ? image.naturalWidth : image.naturalHeight\n };\n }\n function clampCropperOffset() {\n const cropSize = cropperBoxSize();\n const rotated = rotatedImageSize();\n const scaledWidth = rotated.width * avatarCropper.scale;\n const scaledHeight = rotated.height * avatarCropper.scale;\n const maxX = Math.max(0, (scaledWidth - cropSize) / 2);\n const maxY = Math.max(0, (scaledHeight - cropSize) / 2);\n avatarCropper.offsetX = Math.max(-maxX, Math.min(maxX, avatarCropper.offsetX));\n avatarCropper.offsetY = Math.max(-maxY, Math.min(maxY, avatarCropper.offsetY));\n }\n function updateCropperBaseScale() {\n const cropSize = cropperBoxSize();\n const rotated = rotatedImageSize();\n avatarCropper.baseScale = Math.max(cropSize / rotated.width, cropSize / rotated.height);\n avatarCropper.scale = Math.max(avatarCropper.baseScale, avatarCropper.scale || avatarCropper.baseScale);\n }\n function drawCanvasImage(canvas, width, height, outputScale = 1, cropOnly = false) {\n const image = avatarCropper.image;\n if (!canvas || !image) {\n return;\n }\n const dpr = cropOnly ? 1 : window.devicePixelRatio || 1;\n canvas.width = Math.round(width * dpr);\n canvas.height = Math.round(height * dpr);\n const context = canvas.getContext('2d');\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.clearRect(0, 0, width, height);\n context.fillStyle = '#eef4f7';\n context.fillRect(0, 0, width, height);\n context.save();\n context.translate(width / 2 + avatarCropper.offsetX * outputScale, height / 2 + avatarCropper.offsetY * outputScale);\n context.rotate(avatarCropper.rotation * Math.PI / 180);\n context.scale(avatarCropper.scale * outputScale, avatarCropper.scale * outputScale);\n context.drawImage(image, -image.naturalWidth / 2, -image.naturalHeight / 2);\n context.restore();\n if (!cropOnly) {\n const cropSize = cropperBoxSize();\n context.save();\n context.fillStyle = 'rgba(10, 18, 30, 0.42)';\n context.beginPath();\n context.rect(0, 0, width, height);\n context.rect((width - cropSize) / 2, (height - cropSize) / 2, cropSize, cropSize);\n context.fill('evenodd');\n context.restore();\n }\n }\n function drawAvatarCropper() {\n if (!avatarCropper.open || !avatarCropper.loaded) {\n return;\n }\n clampCropperOffset();\n const {\n width,\n height\n } = cropperStageSize();\n drawCanvasImage(cropperCanvas.value, width, height);\n const previewCanvas = cropperPreviewCanvas.value;\n if (previewCanvas) {\n drawCanvasImage(previewCanvas, 108, 108, 108 / cropperBoxSize(), true);\n }\n }\n function resetCropperTransform() {\n if (!avatarCropper.image) {\n return;\n }\n avatarCropper.rotation = 0;\n avatarCropper.offsetX = 0;\n avatarCropper.offsetY = 0;\n updateCropperBaseScale();\n avatarCropper.scale = avatarCropper.baseScale;\n drawAvatarCropper();\n }\n function openAvatarCropper(file) {\n if (!file.type.startsWith('image/')) {\n profileError.value = '请选择图片文件';\n return;\n }\n if (file.size > 8 * 1024 * 1024) {\n profileError.value = '头像图片不能超过8MB';\n return;\n }\n closeAvatarCropper();\n avatarCropper.open = true;\n avatarCropper.loaded = false;\n avatarCropper.error = '';\n avatarCropper.fileName = file.name || 'avatar.jpg';\n avatarCropper.objectUrl = URL.createObjectURL(file);\n const image = new Image();\n image.onload = () => {\n avatarCropper.image = image;\n avatarCropper.loaded = true;\n (0,vue__WEBPACK_IMPORTED_MODULE_2__.nextTick)(resetCropperTransform);\n };\n image.onerror = () => {\n avatarCropper.error = '图片加载失败';\n avatarCropper.loaded = false;\n };\n image.src = avatarCropper.objectUrl;\n }\n function closeAvatarCropper() {\n avatarCropper.open = false;\n avatarCropper.loaded = false;\n avatarCropper.busy = false;\n avatarCropper.error = '';\n avatarCropper.image = null;\n avatarCropper.dragging = false;\n revokeCropperObjectUrl();\n }\n function zoomCropper(factor) {\n if (!avatarCropper.loaded) {\n return;\n }\n updateCropperBaseScale();\n avatarCropper.scale = Math.max(avatarCropper.baseScale, Math.min(avatarCropper.baseScale * 6, avatarCropper.scale * factor));\n drawAvatarCropper();\n }\n function rotateCropper(degrees) {\n if (!avatarCropper.loaded) {\n return;\n }\n avatarCropper.rotation = (avatarCropper.rotation + degrees + 360) % 360;\n updateCropperBaseScale();\n clampCropperOffset();\n drawAvatarCropper();\n }\n function handleCropperWheel(event) {\n zoomCropper(event.deltaY < 0 ? 1.08 : 1 / 1.08);\n }\n function startCropperDrag(event) {\n if (!avatarCropper.loaded) {\n return;\n }\n avatarCropper.dragging = true;\n avatarCropper.dragStartX = event.clientX;\n avatarCropper.dragStartY = event.clientY;\n avatarCropper.dragOffsetX = avatarCropper.offsetX;\n avatarCropper.dragOffsetY = avatarCropper.offsetY;\n event.currentTarget.setPointerCapture?.(event.pointerId);\n }\n function moveCropperDrag(event) {\n if (!avatarCropper.dragging) {\n return;\n }\n avatarCropper.offsetX = avatarCropper.dragOffsetX + event.clientX - avatarCropper.dragStartX;\n avatarCropper.offsetY = avatarCropper.dragOffsetY + event.clientY - avatarCropper.dragStartY;\n drawAvatarCropper();\n }\n function stopCropperDrag() {\n avatarCropper.dragging = false;\n }\n function canvasToBlob(canvas, type = 'image/jpeg', quality = 0.9) {\n return new Promise((resolve, reject) => {\n canvas.toBlob(blob => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error('头像裁切失败'));\n }\n }, type, quality);\n });\n }\n async function confirmAvatarCrop() {\n if (!avatarCropper.loaded || avatarCropper.busy) {\n return;\n }\n avatarCropper.busy = true;\n avatarCropper.error = '';\n try {\n const outputCanvas = document.createElement('canvas');\n drawCanvasImage(outputCanvas, CROP_OUTPUT_SIZE, CROP_OUTPUT_SIZE, CROP_OUTPUT_SIZE / cropperBoxSize(), true);\n const blob = await canvasToBlob(outputCanvas);\n const fileName = avatarCropper.fileName.replace(/\\.[^.]+$/, '') || 'avatar';\n const croppedFile = new File([blob], `${fileName}.jpg`, {\n type: 'image/jpeg'\n });\n profileFile.value = croppedFile;\n revokeProfilePreview();\n profilePreview.value = URL.createObjectURL(croppedFile);\n closeAvatarCropper();\n } catch (error) {\n avatarCropper.error = error.message || '头像裁切失败';\n } finally {\n avatarCropper.busy = false;\n }\n }\n async function saveProfile() {\n if (profileSaving.value || !profileDraft.value.displayName) {\n return;\n }\n clearProfileFeedback();\n profileSaving.value = true;\n try {\n await session.saveProfile({\n displayName: profileDraft.value.displayName,\n portraitFile: profileFile.value\n });\n profileFile.value = null;\n revokeProfilePreview();\n profileNotice.value = '资料已保存';\n contacts.refreshContacts({\n force: true\n });\n } catch (error) {\n profileError.value = error.message || '资料保存失败';\n } finally {\n profileSaving.value = false;\n }\n }\n async function savePassword() {\n if (passwordSaving.value) {\n return;\n }\n clearSettingsFeedback();\n const oldPassword = passwordDraft.oldPassword;\n const newPassword = passwordDraft.newPassword;\n const confirmPassword = passwordDraft.confirmPassword;\n if (!oldPassword || !newPassword || !confirmPassword) {\n settingsError.value = '请填写完整密码';\n return;\n }\n if (newPassword !== confirmPassword) {\n settingsError.value = '两次输入的新密码不一致';\n return;\n }\n if (oldPassword === newPassword) {\n settingsError.value = '新密码不能和当前密码相同';\n return;\n }\n passwordSaving.value = true;\n try {\n await session.changePassword({\n oldPassword,\n newPassword\n });\n resetPasswordDraft();\n settingsNotice.value = '密码已更新';\n } catch (error) {\n settingsError.value = error.message || '密码修改失败';\n } finally {\n passwordSaving.value = false;\n }\n }\n function logout() {\n closeSettings();\n contacts.clearContacts();\n session.logout();\n }\n const __returned__ = {\n session,\n navigation,\n contacts,\n settingsItems,\n initials,\n settingsOpen,\n settingsSection,\n passwordSaving,\n settingsNotice,\n settingsError,\n profileOpen,\n profileSaving,\n profileNotice,\n profileError,\n profileFile,\n profilePreview,\n portraitInput,\n cropperCanvas,\n cropperPreviewCanvas,\n profileDraft,\n passwordDraft,\n currentAvatarUrl,\n activeSettingsItem,\n avatarPreviewViewer,\n avatarCropper,\n avatarPreviewStyle,\n CROP_OUTPUT_SIZE,\n showContacts,\n clearProfileFeedback,\n clearSettingsFeedback,\n resetPasswordDraft,\n openSettings,\n closeSettings,\n selectSettingsSection,\n revokeProfilePreview,\n revokeCropperObjectUrl,\n openProfileEditor,\n closeProfileEditor,\n selectPortrait,\n choosePortraitFile,\n openAvatarPreview,\n closeAvatarPreview,\n resetAvatarPreview,\n zoomAvatarPreview,\n handleAvatarPreviewWheel,\n startAvatarPreviewDrag,\n moveAvatarPreviewDrag,\n stopAvatarPreviewDrag,\n dropPortrait,\n cropperStageSize,\n cropperBoxSize,\n rotatedImageSize,\n clampCropperOffset,\n updateCropperBaseScale,\n drawCanvasImage,\n drawAvatarCropper,\n resetCropperTransform,\n openAvatarCropper,\n closeAvatarCropper,\n zoomCropper,\n rotateCropper,\n handleCropperWheel,\n startCropperDrag,\n moveCropperDrag,\n stopCropperDrag,\n canvasToBlob,\n confirmAvatarCrop,\n saveProfile,\n savePassword,\n logout,\n computed: vue__WEBPACK_IMPORTED_MODULE_2__.computed,\n nextTick: vue__WEBPACK_IMPORTED_MODULE_2__.nextTick,\n onBeforeUnmount: vue__WEBPACK_IMPORTED_MODULE_2__.onBeforeUnmount,\n onMounted: vue__WEBPACK_IMPORTED_MODULE_2__.onMounted,\n reactive: vue__WEBPACK_IMPORTED_MODULE_2__.reactive,\n ref: vue__WEBPACK_IMPORTED_MODULE_2__.ref,\n get useSessionStore() {\n return _stores_session__WEBPACK_IMPORTED_MODULE_3__.useSessionStore;\n },\n get useNavigationStore() {\n return _stores_navigation__WEBPACK_IMPORTED_MODULE_4__.useNavigationStore;\n },\n get useContactStore() {\n return _stores_contacts__WEBPACK_IMPORTED_MODULE_5__.useContactStore;\n },\n get useAutoDismiss() {\n return _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_6__.useAutoDismiss;\n },\n get useImageProxyFallback() {\n return _services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__.useImageProxyFallback;\n }\n };\n Object.defineProperty(__returned__, '__isScriptSetup', {\n enumerable: false,\n value: true\n });\n return __returned__;\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -181,7 +181,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\n\nconst _hoisted_1 = {\n class: \"chat-panel\"\n};\nconst _hoisted_2 = {\n class: \"chat-header\"\n};\nconst _hoisted_3 = [\"src\"];\nconst _hoisted_4 = {\n key: 1,\n class: \"chat-title-avatar\"\n};\nconst _hoisted_5 = {\n class: \"chat-title-copy\"\n};\nconst _hoisted_6 = [\"src\"];\nconst _hoisted_7 = {\n key: 1,\n class: \"chat-title-avatar\"\n};\nconst _hoisted_8 = {\n class: \"chat-title-copy\"\n};\nconst _hoisted_9 = {\n key: 2\n};\nconst _hoisted_10 = {\n class: \"header-actions chat-header-actions\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"empty-chat\"\n};\nconst _hoisted_12 = {\n key: 2,\n class: \"selection-toolbar\"\n};\nconst _hoisted_13 = {\n class: \"forward-dialog\"\n};\nconst _hoisted_14 = [\"onClick\"];\nconst _hoisted_15 = {\n class: \"conversation-avatar\"\n};\nconst _hoisted_16 = {\n type: \"submit\"\n};\nconst _hoisted_17 = {\n class: \"group-dialog message-detail-dialog\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_19 = {\n class: \"group-profile message-detail-meta\"\n};\nconst _hoisted_20 = {\n key: 0\n};\nconst _hoisted_21 = {\n key: 0,\n class: \"inline-save-status error\"\n};\nconst _hoisted_22 = {\n class: \"message-detail-summary\"\n};\nconst _hoisted_23 = {\n class: \"message-detail-groups\"\n};\nconst _hoisted_24 = {\n class: \"message-detail-section\"\n};\nconst _hoisted_25 = {\n key: 0,\n class: \"message-detail-member-list\"\n};\nconst _hoisted_26 = [\"src\"];\nconst _hoisted_27 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_28 = {\n class: \"message-detail-member-main\"\n};\nconst _hoisted_29 = {\n class: \"message-detail-member-time\"\n};\nconst _hoisted_30 = {\n key: 2,\n class: \"message-detail-role\"\n};\nconst _hoisted_31 = {\n key: 1,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_32 = {\n class: \"message-detail-section\"\n};\nconst _hoisted_33 = {\n key: 0,\n class: \"message-detail-member-list\"\n};\nconst _hoisted_34 = [\"src\"];\nconst _hoisted_35 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_36 = {\n class: \"message-detail-member-main\"\n};\nconst _hoisted_37 = {\n class: \"message-detail-member-time\"\n};\nconst _hoisted_38 = {\n key: 2,\n class: \"message-detail-role\"\n};\nconst _hoisted_39 = {\n key: 1,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_40 = {\n class: \"message-detail-section\"\n};\nconst _hoisted_41 = {\n key: 0,\n class: \"message-detail-member-list\"\n};\nconst _hoisted_42 = [\"src\"];\nconst _hoisted_43 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_44 = {\n class: \"message-detail-member-main\"\n};\nconst _hoisted_45 = {\n key: 2,\n class: \"message-detail-role\"\n};\nconst _hoisted_46 = {\n key: 1,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_47 = {\n class: \"group-dialog single-profile-dialog\"\n};\nconst _hoisted_48 = {\n class: \"single-profile-summary\"\n};\nconst _hoisted_49 = [\"src\"];\nconst _hoisted_50 = {\n key: 1,\n class: \"profile-avatar\"\n};\nconst _hoisted_51 = {\n class: \"group-profile\"\n};\nconst _hoisted_52 = {\n class: \"single-profile-footer\"\n};\nconst _hoisted_53 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_54 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_55 = [\"disabled\"];\nconst _hoisted_56 = [\"disabled\"];\nconst _hoisted_57 = {\n key: 0,\n class: \"group-dialog\"\n};\nconst _hoisted_58 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_59 = {\n key: 1,\n class: \"group-profile\"\n};\nconst _hoisted_60 = [\"disabled\"];\nconst _hoisted_61 = [\"disabled\"];\nconst _hoisted_62 = [\"disabled\"];\nconst _hoisted_63 = {\n key: 1,\n class: \"group-dialog\"\n};\nconst _hoisted_64 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_65 = {\n key: 1,\n class: \"group-member-list\"\n};\nconst _hoisted_66 = [\"src\"];\nconst _hoisted_67 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_68 = {\n key: 0,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_69 = [\"disabled\"];\nconst _hoisted_70 = {\n key: 3,\n class: \"group-dialog\"\n};\nconst _hoisted_71 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_72 = {\n key: 1,\n class: \"group-member-list\"\n};\nconst _hoisted_73 = [\"onClick\"];\nconst _hoisted_74 = [\"src\"];\nconst _hoisted_75 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_76 = {\n key: 0,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_77 = [\"disabled\"];\nconst _hoisted_78 = {\n key: 4,\n class: \"group-dialog group-management-dialog\"\n};\nconst _hoisted_79 = {\n class: \"group-management-tabs\"\n};\nconst _hoisted_80 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_81 = {\n key: 1,\n class: \"group-manage-section\"\n};\nconst _hoisted_82 = {\n class: \"group-member-list\"\n};\nconst _hoisted_83 = [\"checked\", \"onChange\"];\nconst _hoisted_84 = [\"src\"];\nconst _hoisted_85 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_86 = {\n key: 0,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_87 = {\n key: 2,\n class: \"group-manage-section\"\n};\nconst _hoisted_88 = {\n key: 3,\n class: \"group-manage-section\"\n};\nconst _hoisted_89 = {\n class: \"group-member-list\"\n};\nconst _hoisted_90 = [\"checked\", \"onChange\"];\nconst _hoisted_91 = [\"src\"];\nconst _hoisted_92 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_93 = {\n key: 0,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_94 = [\"disabled\"];\nconst _hoisted_95 = {\n key: 4,\n class: \"group-manage-section\"\n};\nconst _hoisted_96 = {\n key: 0,\n class: \"mute-time-grid\"\n};\nconst _hoisted_97 = {\n key: 1,\n class: \"mute-time-grid\"\n};\nconst _hoisted_98 = {\n class: \"mute-save-footer\"\n};\nconst _hoisted_99 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_100 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_101 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [$setup.isGroupConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n class: \"chat-title-button\",\n onClick: $setup.openGroupOverview\n }, [$setup.activeConversation?.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"chat-title-avatar image-avatar\",\n src: $setup.activeConversation.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_3)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_4, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.activeConversation?.avatarText || '?'), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h2\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.activeConversation?.title || '未选择会话'), 1 /* TEXT */)])])) : $setup.activeConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 1,\n type: \"button\",\n class: \"chat-title-button\",\n onClick: $setup.openSingleProfile\n }, [$setup.singleProfile.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"chat-title-avatar image-avatar\",\n src: $setup.singleProfile.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_6)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_7, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h2\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.activeConversation?.title || '未选择会话'), 1 /* TEXT */)])])) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"h2\", _hoisted_9, \"未选择会话\")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.statusText), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_10, [_cache[29] || (_cache[29] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"搜索\"\n }, \"⌕\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"更多\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)($setup.toggleGroupMenu, [\"stop\"])\n }, \"⋯\"), $setup.groupMenuOpen && $setup.isGroupConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 0,\n class: \"quick-action-menu chat-more-menu\",\n onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: $setup.openGroupMembers\n }, \"查看群员\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: $setup.openGroupAlias\n }, \"我在本群的昵称\"), $setup.canManageGroup ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n onClick: $setup.openGroupManage\n }, \"群组管理\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])]), !$setup.activeConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_11, _cache[30] || (_cache[30] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"选择一个会话\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"真实会话同步完成后,可以在左侧打开聊天\", -1 /* HOISTED */)]))) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createBlock)($setup[\"MessageList\"], {\n key: 1,\n messages: $setup.conversations.activeMessages,\n \"selection-mode\": $setup.conversations.selectionMode,\n \"selected-message-ids\": $setup.conversations.selectedMessageIds,\n \"favorite-message-ids\": $setup.conversations.favoriteMessageIds,\n \"attention-message-id\": $setup.conversations.attentionMessageId,\n \"can-recall-others\": $setup.canManageGroup && $setup.isGroupConversation,\n onMessageAction: $setup.conversations.handleMessageAction,\n onToggleSelect: $setup.conversations.toggleSelectedMessage,\n onSenderProfileUpdated: $setup.handleSenderProfileUpdated\n }, null, 8 /* PROPS */, [\"messages\", \"selection-mode\", \"selected-message-ids\", \"favorite-message-ids\", \"attention-message-id\", \"can-recall-others\", \"onMessageAction\", \"onToggleSelect\"])), $setup.conversations.selectionMode ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"已选 \" + (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.selectedMessageIds.length) + \" 条\", 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[1] || (_cache[1] = (...args) => $setup.conversations.copySelectedMessages && $setup.conversations.copySelectedMessages(...args))\n }, \"复制\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[2] || (_cache[2] = (...args) => $setup.conversations.deleteSelectedMessages && $setup.conversations.deleteSelectedMessages(...args))\n }, \"删除\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[3] || (_cache[3] = (...args) => $setup.conversations.startForwardSelectedMessages && $setup.conversations.startForwardSelectedMessages(...args))\n }, \"转发\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[4] || (_cache[4] = (...args) => $setup.conversations.clearSelection && $setup.conversations.clearSelection(...args))\n }, \"取消\")])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createVNode)($setup[\"MessageComposer\"], {\n disabled: !$setup.activeConversation || !$setup.session.isAuthenticated || !$setup.conversations.canSendActiveConversation,\n \"quote-message\": $setup.conversations.quotedMessage,\n onCancelQuote: $setup.conversations.cancelQuote,\n onSend: $setup.conversations.sendText,\n onSendAttachment: $setup.conversations.sendAttachment\n }, null, 8 /* PROPS */, [\"disabled\", \"quote-message\", \"onCancelQuote\", \"onSend\", \"onSendAttachment\"]), $setup.conversations.forwardingMessages.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 3,\n class: \"modal-backdrop\",\n onClick: _cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.cancelForward && $setup.conversations.cancelForward(...args), [\"self\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[31] || (_cache[31] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"转发给\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: _cache[5] || (_cache[5] = (...args) => $setup.conversations.cancelForward && $setup.conversations.cancelForward(...args))\n }, \"×\")]), ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.conversations.conversations, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: item.id,\n type: \"button\",\n class: \"forward-target\",\n onClick: $event => $setup.conversations.completeForward(item.id)\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(item.avatarText), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(item.title), 1 /* TEXT */)], 8 /* PROPS */, _hoisted_14);\n }), 128 /* KEYED_FRAGMENT */))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.conversations.editingMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 4,\n class: \"modal-backdrop\",\n onClick: _cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.cancelEditMessage && $setup.conversations.cancelEditMessage(...args), [\"self\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"form\", {\n class: \"edit-dialog\",\n onSubmit: _cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.completeEditMessage && $setup.conversations.completeEditMessage(...args), [\"prevent\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.editingMode === 'resend' ? '重新编辑' : '编辑消息'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: _cache[7] || (_cache[7] = (...args) => $setup.conversations.cancelEditMessage && $setup.conversations.cancelEditMessage(...args))\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $setup.conversations.editingText = $event),\n maxlength: \"5000\",\n rows: \"5\",\n autofocus: \"\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.conversations.editingText]]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[9] || (_cache[9] = (...args) => $setup.conversations.cancelEditMessage && $setup.conversations.cancelEditMessage(...args))\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.editingMode === 'resend' ? '发送' : '保存'), 1 /* TEXT */)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.conversations.messageDetailOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 5,\n class: \"modal-backdrop\",\n onClick: _cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.closeMessageDetail && $setup.conversations.closeMessageDetail(...args), [\"self\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[32] || (_cache[32] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"消息详情\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: _cache[12] || (_cache[12] = (...args) => $setup.conversations.closeMessageDetail && $setup.conversations.closeMessageDetail(...args))\n }, \"×\")]), $setup.conversations.messageDetailLoading ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_18, \"正在加载\")) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n key: 1\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dl\", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[33] || (_cache[33] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"发送时间\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.formatDetailTime($setup.messageDetail?.sentAt)), 1 /* TEXT */)]), $setup.messageDetail?.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_20, [_cache[34] || (_cache[34] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"编辑时间\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.formatDetailTime($setup.messageDetail.editedAt)), 1 /* TEXT */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[35] || (_cache[35] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"发送人\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName($setup.messageDetail?.sender)), 1 /* TEXT */)]), !$setup.isMessageDetailGroup ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n key: 1\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[36] || (_cache[36] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"接收人\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName($setup.messageDetail?.receiver)), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[37] || (_cache[37] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"送达时间\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n 'message-detail-muted': !$setup.messageDetail?.deliveredAt\n })\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetail?.deliveredAt ? $setup.formatDetailTime($setup.messageDetail.deliveredAt) : '未送达'), 3 /* TEXT, CLASS */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[38] || (_cache[38] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"已读时间\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n 'message-detail-muted': !$setup.messageDetail?.readAt\n })\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetail?.readAt ? $setup.formatDetailTime($setup.messageDetail.readAt) : '未读'), 3 /* TEXT, CLASS */)])], 64 /* STABLE_FRAGMENT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]), $setup.conversations.messageDetailError ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.messageDetailError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.isMessageDetailGroup ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n key: 1\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [_cache[39] || (_cache[39] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createTextVNode)(\"已读 \")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.read || 0), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [_cache[40] || (_cache[40] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createTextVNode)(\"未读 \")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.unread || 0), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [_cache[41] || (_cache[41] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createTextVNode)(\"未送达 \")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.undelivered || 0), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [_cache[42] || (_cache[42] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createTextVNode)(\"成员 \")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.total || 0), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[43] || (_cache[43] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"已读\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.read || 0) + \" 人\", 1 /* TEXT */)]), $setup.messageDetailGroup?.read?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_25, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.messageDetailGroup.read, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: `read-${member.uid}`,\n class: \"message-detail-member-row\"\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_26)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_27, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_28, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName(member)), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.uid), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_29, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.formatDetailTime(member.time)), 1 /* TEXT */), $setup.detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_30, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailRoleLabel(member.role)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]);\n }), 128 /* KEYED_FRAGMENT */))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_31, \"暂无已读成员\"))]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_32, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[44] || (_cache[44] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"未读\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.unread || 0) + \" 人\", 1 /* TEXT */)]), $setup.messageDetailGroup?.unread?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_33, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.messageDetailGroup.unread, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: `unread-${member.uid}`,\n class: \"message-detail-member-row\"\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_34)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_35, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_36, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName(member)), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.uid), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_37, \"送达 \" + (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.formatDetailTime(member.time)), 1 /* TEXT */), $setup.detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_38, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailRoleLabel(member.role)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]);\n }), 128 /* KEYED_FRAGMENT */))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_39, \"暂无未读成员\"))]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_40, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[45] || (_cache[45] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"未送达\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.undelivered || 0) + \" 人\", 1 /* TEXT */)]), $setup.messageDetailGroup?.undelivered?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_41, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.messageDetailGroup.undelivered, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: `undelivered-${member.uid}`,\n class: \"message-detail-member-row\"\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_42)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_43, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_44, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName(member)), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.uid), 1 /* TEXT */)]), _cache[46] || (_cache[46] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", {\n class: \"message-detail-member-time message-detail-muted\"\n }, \"未送达\", -1 /* HOISTED */)), $setup.detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_45, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailRoleLabel(member.role)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]);\n }), 128 /* KEYED_FRAGMENT */))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_46, \"暂无未送达成员\"))])])], 64 /* STABLE_FRAGMENT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)], 64 /* STABLE_FRAGMENT */))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.singleProfileOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 6,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)($setup.closeSingleProfile, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_47, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[47] || (_cache[47] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"联系人资料\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeSingleProfile\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_48, [$setup.singleProfile.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"profile-avatar image-avatar\",\n src: $setup.singleProfile.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_49)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_50, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.displayName), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dl\", _hoisted_51, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[48] || (_cache[48] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"用户ID\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.uid || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[49] || (_cache[49] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.rawName || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[50] || (_cache[50] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"手机号\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.mobile || '未知'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[51] || (_cache[51] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"地区\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.address || '未知'), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[52] || (_cache[52] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"备注名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $setup.singleAliasDraft = $event),\n maxlength: \"32\",\n autocomplete: \"off\",\n placeholder: \"留空使用对方昵称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.singleAliasDraft, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", _hoisted_52, [$setup.singleProfileNotice ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_53, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfileNotice), 1 /* TEXT */)) : $setup.singleProfileError ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_54, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfileError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n disabled: $setup.singleProfileSaving,\n onClick: $setup.closeSingleProfile\n }, \"取消\", 8 /* PROPS */, _hoisted_55), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.singleProfileSaving || !$setup.singleProfile.uid,\n onClick: $setup.saveSingleAlias\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfileSaving ? '保存中...' : '保存备注'), 9 /* TEXT, PROPS */, _hoisted_56)])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.groupPanel ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 7,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)($setup.closeGroupPanel, [\"self\"])\n }, [$setup.groupPanel === 'overview' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_57, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[53] || (_cache[53] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"群概况\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), $setup.groupBusy ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_58, \"正在加载\")) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"dl\", _hoisted_59, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[54] || (_cache[54] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"群名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupDetail?.name || $setup.activeConversation?.title || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[55] || (_cache[55] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"群ID\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupDetail?.groupId || $setup.activeConversation?.target || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[56] || (_cache[56] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"群说明\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupDetail?.announcement || '未设置'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[57] || (_cache[57] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"群主昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupDetail?.ownerName || '-'), 1 /* TEXT */)])])), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [$setup.isGroupOwner ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n key: 0\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"danger-inline-action\",\n disabled: $setup.groupBusy,\n onClick: $setup.dismissCurrentGroup\n }, \"解散群组\", 8 /* PROPS */, _hoisted_60), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.groupBusy,\n onClick: $setup.openTransferGroup\n }, \"转让群组\", 8 /* PROPS */, _hoisted_61)], 64 /* STABLE_FRAGMENT */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 1,\n type: \"button\",\n class: \"danger-inline-action\",\n disabled: $setup.groupBusy,\n onClick: $setup.leaveCurrentGroup\n }, \"退出群组\", 8 /* PROPS */, _hoisted_62))])])) : $setup.groupPanel === 'members' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_63, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[58] || (_cache[58] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"群员\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), $setup.groupBusy ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_64, \"正在加载\")) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_65, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.groupMembers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: member.uid,\n class: \"group-member-row\"\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_66)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_67, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.memberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.displayName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.role === 'owner' ? '群主' : member.rawDisplayName), 1 /* TEXT */)])]);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.groupMembers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_68, \"暂无群员\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]))])) : $setup.groupPanel === 'alias' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"form\", {\n key: 2,\n class: \"group-dialog\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)($setup.saveGroupAlias, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[59] || (_cache[59] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"我在本群的昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[60] || (_cache[60] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $setup.groupAliasDraft = $event),\n maxlength: \"64\",\n autocomplete: \"off\",\n placeholder: \"留空使用个人昵称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.groupAliasDraft, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeGroupPanel\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n class: \"primary-inline-action\",\n disabled: $setup.groupBusy\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupBusy ? '保存中...' : '保存'), 9 /* TEXT, PROPS */, _hoisted_69)])], 32 /* NEED_HYDRATION */)) : $setup.groupPanel === 'transfer' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_70, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[61] || (_cache[61] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"转让群组\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), $setup.groupBusy ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_71, \"正在加载\")) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_72, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.transferableMembers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: member.uid,\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([\"group-member-row selectable\", {\n selected: $setup.transferTargetId === member.uid\n }]),\n onClick: $event => $setup.transferTargetId = member.uid\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_74)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_75, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.memberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.displayName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.rawDisplayName), 1 /* TEXT */)])], 10 /* CLASS, PROPS */, _hoisted_73);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.transferableMembers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_76, \"暂无可转让成员\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeGroupPanel\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.groupBusy || !$setup.transferTargetId,\n onClick: $setup.transferCurrentGroup\n }, \"确认转让\", 8 /* PROPS */, _hoisted_77)])])) : $setup.groupPanel === 'manage' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_78, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[62] || (_cache[62] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"群组管理\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"nav\", _hoisted_79, [$setup.isGroupOwner ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n active: $setup.manageSection === 'admins'\n }),\n onClick: _cache[16] || (_cache[16] = $event => $setup.manageSection = 'admins')\n }, \"管理员设置\", 2 /* CLASS */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n active: $setup.manageSection === 'profile'\n }),\n onClick: _cache[17] || (_cache[17] = $event => $setup.manageSection = 'profile')\n }, \"修改群资料\", 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n active: $setup.manageSection === 'kick'\n }),\n onClick: _cache[18] || (_cache[18] = $event => $setup.manageSection = 'kick')\n }, \"踢人\", 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n active: $setup.manageSection === 'mute'\n }),\n onClick: _cache[19] || (_cache[19] = $event => $setup.manageSection = 'mute')\n }, \"禁言设置\", 2 /* CLASS */)]), $setup.groupBusy ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_80, \"正在加载\")) : $setup.manageSection === 'admins' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_81, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_82, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.adminCandidateMembers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"label\", {\n key: member.uid,\n class: \"group-member-row selectable with-check\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n type: \"checkbox\",\n checked: $setup.selectedAdminIds.includes(member.uid),\n onChange: $event => $setup.toggleAdmin(member.uid)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_83), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_84)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_85, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.memberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.displayName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.rawDisplayName), 1 /* TEXT */)])]);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.adminCandidateMembers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_86, \"暂无可设置成员\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n onClick: $setup.saveGroupAdmins\n }, \"保存管理员\")])])) : $setup.manageSection === 'profile' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_87, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[63] || (_cache[63] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"群名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $setup.profileDraft.name = $event),\n maxlength: \"128\",\n autocomplete: \"off\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.profileDraft.name, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[64] || (_cache[64] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"群说明\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[21] || (_cache[21] = $event => $setup.profileDraft.announcement = $event),\n maxlength: \"1000\",\n rows: \"3\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.profileDraft.announcement, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[65] || (_cache[65] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"欢迎词\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[22] || (_cache[22] = $event => $setup.profileDraft.welcomeText = $event),\n maxlength: \"1000\",\n rows: \"3\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.profileDraft.welcomeText, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n onClick: $setup.saveGroupProfile\n }, \"保存资料\")])])) : $setup.manageSection === 'kick' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_88, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_89, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.kickCandidateMembers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"label\", {\n key: member.uid,\n class: \"group-member-row selectable with-check\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n type: \"checkbox\",\n checked: $setup.selectedKickIds.includes(member.uid),\n onChange: $event => $setup.toggleKick(member.uid)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_90), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_91)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_92, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.memberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.displayName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.role === 'admin' ? '管理员' : member.rawDisplayName), 1 /* TEXT */)])]);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.kickCandidateMembers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_93, \"暂无可移除成员\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"danger-inline-action\",\n disabled: !$setup.selectedKickIds.length,\n onClick: $setup.kickSelectedMembers\n }, \"移出群组\", 8 /* PROPS */, _hoisted_94)])])) : $setup.manageSection === 'mute' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_95, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[67] || (_cache[67] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"禁言模式\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"select\", {\n \"onUpdate:modelValue\": _cache[23] || (_cache[23] = $event => $setup.muteDraft.mode = $event),\n onChange: $setup.clearMuteSaveFeedback\n }, _cache[66] || (_cache[66] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"off\"\n }, \"关闭禁言\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"all_include_admins\"\n }, \"全体禁言包含管理员\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"all_except_admins\"\n }, \"除管理员外全体禁言\", -1 /* HOISTED */)]), 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelSelect, $setup.muteDraft.mode]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[69] || (_cache[69] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"时段类型\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"select\", {\n \"onUpdate:modelValue\": _cache[24] || (_cache[24] = $event => $setup.muteDraft.scheduleType = $event),\n onChange: $setup.clearMuteSaveFeedback\n }, _cache[68] || (_cache[68] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"manual\"\n }, \"立即禁言直到管理解除\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"once\"\n }, \"单次\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"daily\"\n }, \"每天固定时段\", -1 /* HOISTED */)]), 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelSelect, $setup.muteDraft.scheduleType]])]), $setup.muteDraft.mode !== 'off' && $setup.muteDraft.scheduleType === 'once' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_96, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[70] || (_cache[70] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"开始\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $setup.muteDraft.startsAtLocal = $event),\n type: \"datetime-local\",\n onInput: $setup.clearMuteSaveFeedback\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.muteDraft.startsAtLocal]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[71] || (_cache[71] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"结束\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $setup.muteDraft.endsAtLocal = $event),\n type: \"datetime-local\",\n onInput: $setup.clearMuteSaveFeedback\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.muteDraft.endsAtLocal]])])])) : $setup.muteDraft.mode !== 'off' && $setup.muteDraft.scheduleType === 'daily' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_97, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[72] || (_cache[72] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"开始\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $setup.muteDraft.dailyStart = $event),\n type: \"time\",\n onInput: $setup.clearMuteSaveFeedback\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.muteDraft.dailyStart]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[73] || (_cache[73] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"结束\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $setup.muteDraft.dailyEnd = $event),\n type: \"time\",\n onInput: $setup.clearMuteSaveFeedback\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.muteDraft.dailyEnd]])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", _hoisted_98, [$setup.muteSaveNotice ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_99, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.muteSaveNotice), 1 /* TEXT */)) : $setup.muteSaveError ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_100, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.muteSaveError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.groupBusy,\n onClick: $setup.saveMuteSetting\n }, \"保存禁言\", 8 /* PROPS */, _hoisted_101)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.conversations.actionNotice || $setup.conversations.actionError ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 8,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([\"chat-toast\", {\n error: $setup.conversations.actionError\n }])\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.actionError || $setup.conversations.actionNotice), 3 /* TEXT, CLASS */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/ChatPanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\n\nconst _hoisted_1 = {\n class: \"chat-header\"\n};\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = {\n key: 1,\n class: \"chat-title-avatar\"\n};\nconst _hoisted_4 = {\n class: \"chat-title-copy\"\n};\nconst _hoisted_5 = [\"src\"];\nconst _hoisted_6 = {\n key: 1,\n class: \"chat-title-avatar\"\n};\nconst _hoisted_7 = {\n class: \"chat-title-copy\"\n};\nconst _hoisted_8 = {\n key: 2\n};\nconst _hoisted_9 = {\n class: \"header-actions chat-header-actions\"\n};\nconst _hoisted_10 = {\n key: 0,\n class: \"empty-chat\"\n};\nconst _hoisted_11 = {\n class: \"pinned-message-preview\"\n};\nconst _hoisted_12 = [\"src\"];\nconst _hoisted_13 = {\n key: 3,\n class: \"selection-toolbar\"\n};\nconst _hoisted_14 = {\n class: \"forward-dialog\"\n};\nconst _hoisted_15 = [\"onClick\"];\nconst _hoisted_16 = {\n class: \"conversation-avatar\"\n};\nconst _hoisted_17 = {\n type: \"submit\"\n};\nconst _hoisted_18 = {\n class: \"group-dialog message-detail-dialog\"\n};\nconst _hoisted_19 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_20 = {\n class: \"group-profile message-detail-meta\"\n};\nconst _hoisted_21 = {\n key: 0\n};\nconst _hoisted_22 = {\n key: 0,\n class: \"inline-save-status error\"\n};\nconst _hoisted_23 = {\n class: \"message-detail-summary\"\n};\nconst _hoisted_24 = {\n class: \"message-detail-groups\"\n};\nconst _hoisted_25 = {\n class: \"message-detail-section\"\n};\nconst _hoisted_26 = {\n key: 0,\n class: \"message-detail-member-list\"\n};\nconst _hoisted_27 = [\"src\", \"onError\"];\nconst _hoisted_28 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_29 = {\n class: \"message-detail-member-main\"\n};\nconst _hoisted_30 = {\n class: \"message-detail-member-time\"\n};\nconst _hoisted_31 = {\n key: 2,\n class: \"message-detail-role\"\n};\nconst _hoisted_32 = {\n key: 1,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_33 = {\n class: \"message-detail-section\"\n};\nconst _hoisted_34 = {\n key: 0,\n class: \"message-detail-member-list\"\n};\nconst _hoisted_35 = [\"src\", \"onError\"];\nconst _hoisted_36 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_37 = {\n class: \"message-detail-member-main\"\n};\nconst _hoisted_38 = {\n class: \"message-detail-member-time\"\n};\nconst _hoisted_39 = {\n key: 2,\n class: \"message-detail-role\"\n};\nconst _hoisted_40 = {\n key: 1,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_41 = {\n class: \"message-detail-section\"\n};\nconst _hoisted_42 = {\n key: 0,\n class: \"message-detail-member-list\"\n};\nconst _hoisted_43 = [\"src\", \"onError\"];\nconst _hoisted_44 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_45 = {\n class: \"message-detail-member-main\"\n};\nconst _hoisted_46 = {\n key: 2,\n class: \"message-detail-role\"\n};\nconst _hoisted_47 = {\n key: 1,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_48 = {\n class: \"group-dialog single-profile-dialog\"\n};\nconst _hoisted_49 = {\n class: \"single-profile-summary\"\n};\nconst _hoisted_50 = [\"src\"];\nconst _hoisted_51 = {\n key: 1,\n class: \"profile-avatar\"\n};\nconst _hoisted_52 = {\n class: \"group-profile\"\n};\nconst _hoisted_53 = {\n class: \"single-profile-footer\"\n};\nconst _hoisted_54 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_55 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_56 = [\"disabled\"];\nconst _hoisted_57 = [\"disabled\"];\nconst _hoisted_58 = {\n key: 0,\n class: \"group-dialog\"\n};\nconst _hoisted_59 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_60 = {\n key: 1,\n class: \"group-profile\"\n};\nconst _hoisted_61 = {\n key: 0\n};\nconst _hoisted_62 = [\"disabled\"];\nconst _hoisted_63 = [\"disabled\"];\nconst _hoisted_64 = [\"disabled\"];\nconst _hoisted_65 = {\n key: 1,\n class: \"group-dialog\"\n};\nconst _hoisted_66 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_67 = {\n key: 1,\n class: \"group-member-list\"\n};\nconst _hoisted_68 = [\"src\", \"onError\"];\nconst _hoisted_69 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_70 = {\n key: 0,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_71 = [\"disabled\"];\nconst _hoisted_72 = {\n key: 3,\n class: \"group-dialog\"\n};\nconst _hoisted_73 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_74 = {\n key: 1,\n class: \"group-member-list\"\n};\nconst _hoisted_75 = [\"onClick\"];\nconst _hoisted_76 = [\"src\", \"onError\"];\nconst _hoisted_77 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_78 = {\n key: 0,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_79 = [\"disabled\"];\nconst _hoisted_80 = {\n key: 4,\n class: \"group-dialog group-management-dialog\"\n};\nconst _hoisted_81 = {\n class: \"group-management-tabs\"\n};\nconst _hoisted_82 = {\n key: 0,\n class: \"group-loading\"\n};\nconst _hoisted_83 = {\n key: 1,\n class: \"group-manage-section\"\n};\nconst _hoisted_84 = {\n class: \"group-member-list\"\n};\nconst _hoisted_85 = [\"checked\", \"onChange\"];\nconst _hoisted_86 = [\"src\", \"onError\"];\nconst _hoisted_87 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_88 = {\n key: 0,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_89 = {\n key: 2,\n class: \"group-manage-section\"\n};\nconst _hoisted_90 = {\n key: 3,\n class: \"group-manage-section\"\n};\nconst _hoisted_91 = {\n class: \"group-member-list\"\n};\nconst _hoisted_92 = [\"checked\", \"onChange\"];\nconst _hoisted_93 = [\"src\", \"onError\"];\nconst _hoisted_94 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_95 = {\n key: 0,\n class: \"contact-picker-empty\"\n};\nconst _hoisted_96 = [\"disabled\"];\nconst _hoisted_97 = {\n key: 4,\n class: \"group-manage-section\"\n};\nconst _hoisted_98 = {\n key: 0,\n class: \"mute-time-grid\"\n};\nconst _hoisted_99 = {\n key: 1,\n class: \"mute-time-grid\"\n};\nconst _hoisted_100 = {\n class: \"mute-save-footer\"\n};\nconst _hoisted_101 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_102 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_103 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([\"chat-panel\", {\n 'has-pinned-message': Boolean($setup.conversations.activePinnedMessage)\n }])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [$setup.isGroupConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n class: \"chat-title-button\",\n onClick: $setup.openGroupOverview\n }, [$setup.activeConversation?.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"chat-title-avatar image-avatar\",\n src: $setup.activeConversation.portrait,\n alt: \"\",\n onError: _cache[0] || (_cache[0] = $event => $setup.useImageProxyFallback($event, $setup.activeConversation.portrait))\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.activeConversation?.avatarText || '?'), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h2\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.activeConversation?.title || '未选择会话'), 1 /* TEXT */)])])) : $setup.activeConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 1,\n type: \"button\",\n class: \"chat-title-button\",\n onClick: $setup.openSingleProfile\n }, [$setup.singleProfile.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"chat-title-avatar image-avatar\",\n src: $setup.singleProfile.portrait,\n alt: \"\",\n onError: _cache[1] || (_cache[1] = $event => $setup.useImageProxyFallback($event, $setup.singleProfile.portrait))\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_5)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_6, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h2\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.activeConversation?.title || '未选择会话'), 1 /* TEXT */)])])) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"h2\", _hoisted_8, \"未选择会话\")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.statusText), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_9, [_cache[34] || (_cache[34] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"搜索\"\n }, \"⌕\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"更多\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)($setup.toggleGroupMenu, [\"stop\"])\n }, \"⋯\"), $setup.groupMenuOpen && $setup.isGroupConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 0,\n class: \"quick-action-menu chat-more-menu\",\n onClick: _cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: $setup.openGroupMembers\n }, \"查看群员\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: $setup.openGroupAlias\n }, \"我在本群的昵称\"), $setup.canManageGroup ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n onClick: $setup.openGroupManage\n }, \"群组管理\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])]), !$setup.activeConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_10, _cache[35] || (_cache[35] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"选择一个会话\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"真实会话同步完成后,可以在左侧打开聊天\", -1 /* HOISTED */)]))) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.activeConversation && $setup.conversations.activePinnedMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 1,\n type: \"button\",\n class: \"pinned-message-banner\",\n title: \"点击定位该消息\",\n onClick: _cache[4] || (_cache[4] = $event => $setup.conversations.focusMessage($setup.conversations.activePinnedMessage))\n }, [_cache[36] || (_cache[36] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"📌\", -1 /* HOISTED */)), _cache[37] || (_cache[37] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"置顶消息\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_11, [$setup.pinnedMessageIsImage ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n src: $setup.conversations.activePinnedMessage.attachment.url,\n alt: \"置顶图片\"\n }, null, 8 /* PROPS */, _hoisted_12)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.pinnedMessageText), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", {\n class: \"pinned-message-close\",\n title: \"取消置顶\",\n onClick: _cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.clearPinnedMessage && $setup.conversations.clearPinnedMessage(...args), [\"stop\"]))\n }, \"×\")])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.activeConversation ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createBlock)($setup[\"MessageList\"], {\n key: 2,\n messages: $setup.conversations.activeMessages,\n \"selection-mode\": $setup.conversations.selectionMode,\n \"selected-message-ids\": $setup.conversations.selectedMessageIds,\n \"favorite-message-ids\": $setup.conversations.favoriteMessageIds,\n \"pinned-message-id\": $setup.conversations.activePinnedMessage?.key || '',\n \"attention-message-id\": $setup.conversations.attentionMessageId,\n \"can-recall-others\": $setup.canManageGroup && $setup.isGroupConversation,\n onMessageAction: $setup.conversations.handleMessageAction,\n onToggleSelect: $setup.conversations.toggleSelectedMessage,\n onSenderProfileUpdated: $setup.handleSenderProfileUpdated\n }, null, 8 /* PROPS */, [\"messages\", \"selection-mode\", \"selected-message-ids\", \"favorite-message-ids\", \"pinned-message-id\", \"attention-message-id\", \"can-recall-others\", \"onMessageAction\", \"onToggleSelect\"])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.conversations.selectionMode ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"已选 \" + (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.selectedMessageIds.length) + \" 条\", 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[5] || (_cache[5] = (...args) => $setup.conversations.copySelectedMessages && $setup.conversations.copySelectedMessages(...args))\n }, \"复制\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[6] || (_cache[6] = (...args) => $setup.conversations.deleteSelectedMessages && $setup.conversations.deleteSelectedMessages(...args))\n }, \"删除\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[7] || (_cache[7] = (...args) => $setup.conversations.startForwardSelectedMessages && $setup.conversations.startForwardSelectedMessages(...args))\n }, \"转发\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[8] || (_cache[8] = (...args) => $setup.conversations.clearSelection && $setup.conversations.clearSelection(...args))\n }, \"取消\")])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createVNode)($setup[\"MessageComposer\"], {\n disabled: !$setup.activeConversation || !$setup.session.isAuthenticated || !$setup.conversations.canSendActiveConversation,\n \"quote-message\": $setup.conversations.quotedMessage,\n \"mention-users\": $setup.isGroupConversation ? $setup.mentionCandidates : [],\n onCancelQuote: $setup.conversations.cancelQuote,\n onSend: $setup.conversations.sendText,\n onSendAttachment: $setup.conversations.sendAttachment\n }, null, 8 /* PROPS */, [\"disabled\", \"quote-message\", \"mention-users\", \"onCancelQuote\", \"onSend\", \"onSendAttachment\"]), $setup.conversations.forwardingMessages.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 4,\n class: \"modal-backdrop\",\n onClick: _cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.cancelForward && $setup.conversations.cancelForward(...args), [\"self\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[38] || (_cache[38] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"转发给\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: _cache[9] || (_cache[9] = (...args) => $setup.conversations.cancelForward && $setup.conversations.cancelForward(...args))\n }, \"×\")]), ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.conversations.conversations, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: item.id,\n type: \"button\",\n class: \"forward-target\",\n onClick: $event => $setup.conversations.completeForward(item.id)\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(item.avatarText), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(item.title), 1 /* TEXT */)], 8 /* PROPS */, _hoisted_15);\n }), 128 /* KEYED_FRAGMENT */))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.conversations.editingMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 5,\n class: \"modal-backdrop\",\n onClick: _cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.cancelEditMessage && $setup.conversations.cancelEditMessage(...args), [\"self\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"form\", {\n class: \"edit-dialog\",\n onSubmit: _cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.completeEditMessage && $setup.conversations.completeEditMessage(...args), [\"prevent\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.editingMode === 'resend' ? '重新编辑' : '编辑消息'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: _cache[11] || (_cache[11] = (...args) => $setup.conversations.cancelEditMessage && $setup.conversations.cancelEditMessage(...args))\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $setup.conversations.editingText = $event),\n maxlength: \"5000\",\n rows: \"5\",\n autofocus: \"\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.conversations.editingText]]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[13] || (_cache[13] = (...args) => $setup.conversations.cancelEditMessage && $setup.conversations.cancelEditMessage(...args))\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", _hoisted_17, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.editingMode === 'resend' ? '发送' : '保存'), 1 /* TEXT */)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.conversations.messageDetailOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 6,\n class: \"modal-backdrop\",\n onClick: _cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)((...args) => $setup.conversations.closeMessageDetail && $setup.conversations.closeMessageDetail(...args), [\"self\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[39] || (_cache[39] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"消息详情\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: _cache[16] || (_cache[16] = (...args) => $setup.conversations.closeMessageDetail && $setup.conversations.closeMessageDetail(...args))\n }, \"×\")]), $setup.conversations.messageDetailLoading ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_19, \"正在加载\")) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n key: 1\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dl\", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[40] || (_cache[40] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"发送时间\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.formatDetailTime($setup.messageDetail?.sentAt)), 1 /* TEXT */)]), $setup.messageDetail?.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_21, [_cache[41] || (_cache[41] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"编辑时间\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.formatDetailTime($setup.messageDetail.editedAt)), 1 /* TEXT */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[42] || (_cache[42] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"发送人\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName($setup.messageDetail?.sender)), 1 /* TEXT */)]), !$setup.isMessageDetailGroup ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n key: 1\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[43] || (_cache[43] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"接收人\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName($setup.messageDetail?.receiver)), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[44] || (_cache[44] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"送达时间\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n 'message-detail-muted': !$setup.messageDetail?.deliveredAt\n })\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetail?.deliveredAt ? $setup.formatDetailTime($setup.messageDetail.deliveredAt) : '未送达'), 3 /* TEXT, CLASS */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[45] || (_cache[45] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"已读时间\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n 'message-detail-muted': !$setup.messageDetail?.readAt\n })\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetail?.readAt ? $setup.formatDetailTime($setup.messageDetail.readAt) : '未读'), 3 /* TEXT, CLASS */)])], 64 /* STABLE_FRAGMENT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]), $setup.conversations.messageDetailError ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_22, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.messageDetailError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.isMessageDetailGroup ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n key: 1\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [_cache[46] || (_cache[46] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createTextVNode)(\"已读 \")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.read || 0), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [_cache[47] || (_cache[47] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createTextVNode)(\"未读 \")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.unread || 0), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [_cache[48] || (_cache[48] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createTextVNode)(\"未送达 \")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.undelivered || 0), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [_cache[49] || (_cache[49] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createTextVNode)(\"成员 \")), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.total || 0), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[50] || (_cache[50] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"已读\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.read || 0) + \" 人\", 1 /* TEXT */)]), $setup.messageDetailGroup?.read?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_26, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.messageDetailGroup.read, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: `read-${member.uid}`,\n class: \"message-detail-member-row\"\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, member.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_27)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_28, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_29, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName(member)), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.uid), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_30, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.formatDetailTime(member.time)), 1 /* TEXT */), $setup.detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_31, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailRoleLabel(member.role)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]);\n }), 128 /* KEYED_FRAGMENT */))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_32, \"暂无已读成员\"))]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_33, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[51] || (_cache[51] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"未读\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.unread || 0) + \" 人\", 1 /* TEXT */)]), $setup.messageDetailGroup?.unread?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_34, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.messageDetailGroup.unread, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: `unread-${member.uid}`,\n class: \"message-detail-member-row\"\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, member.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_35)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_36, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_37, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName(member)), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.uid), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_38, \"送达 \" + (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.formatDetailTime(member.time)), 1 /* TEXT */), $setup.detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_39, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailRoleLabel(member.role)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]);\n }), 128 /* KEYED_FRAGMENT */))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_40, \"暂无未读成员\"))]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_41, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[52] || (_cache[52] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, \"未送达\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.messageDetailCounts.undelivered || 0) + \" 人\", 1 /* TEXT */)]), $setup.messageDetailGroup?.undelivered?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_42, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.messageDetailGroup.undelivered, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: `undelivered-${member.uid}`,\n class: \"message-detail-member-row\"\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, member.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_43)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_44, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", _hoisted_45, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailMemberName(member)), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.uid), 1 /* TEXT */)]), _cache[53] || (_cache[53] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", {\n class: \"message-detail-member-time message-detail-muted\"\n }, \"未送达\", -1 /* HOISTED */)), $setup.detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_46, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.detailRoleLabel(member.role)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]);\n }), 128 /* KEYED_FRAGMENT */))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_47, \"暂无未送达成员\"))])])], 64 /* STABLE_FRAGMENT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)], 64 /* STABLE_FRAGMENT */))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.singleProfileOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 7,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)($setup.closeSingleProfile, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"section\", _hoisted_48, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[54] || (_cache[54] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"联系人资料\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeSingleProfile\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_49, [$setup.singleProfile.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"profile-avatar image-avatar\",\n src: $setup.singleProfile.portrait,\n alt: \"\",\n onError: _cache[18] || (_cache[18] = $event => $setup.useImageProxyFallback($event, $setup.singleProfile.portrait))\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_50)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_51, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.displayName), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dl\", _hoisted_52, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[55] || (_cache[55] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"用户ID\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.userId || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[56] || (_cache[56] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.rawName || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[57] || (_cache[57] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"手机号\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.mobile || '未知'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[58] || (_cache[58] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"地区\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfile.address || '未知'), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[59] || (_cache[59] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"备注名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[19] || (_cache[19] = $event => $setup.singleAliasDraft = $event),\n maxlength: \"32\",\n autocomplete: \"off\",\n placeholder: \"留空使用对方昵称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.singleAliasDraft, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", _hoisted_53, [$setup.singleProfileNotice ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_54, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfileNotice), 1 /* TEXT */)) : $setup.singleProfileError ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_55, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfileError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n disabled: $setup.singleProfileSaving,\n onClick: $setup.closeSingleProfile\n }, \"取消\", 8 /* PROPS */, _hoisted_56), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.singleProfileSaving || !$setup.singleProfile.uid,\n onClick: $setup.saveSingleAlias\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.singleProfileSaving ? '保存中...' : '保存备注'), 9 /* TEXT, PROPS */, _hoisted_57)])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.groupPanel ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 8,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)($setup.closeGroupPanel, [\"self\"])\n }, [$setup.groupPanel === 'overview' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_58, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[60] || (_cache[60] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"群概况\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), $setup.groupBusy ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_59, \"正在加载\")) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"dl\", _hoisted_60, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[61] || (_cache[61] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"群名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupDetail?.name || $setup.activeConversation?.title || '-'), 1 /* TEXT */)]), $setup.groupDisplayId ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_61, [_cache[62] || (_cache[62] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"群ID\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupDisplayId), 1 /* TEXT */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[63] || (_cache[63] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"群说明\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupDetail?.announcement || '未设置'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", null, [_cache[64] || (_cache[64] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dt\", null, \"群主昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupDetail?.ownerName || '-'), 1 /* TEXT */)])])), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [$setup.isGroupOwner ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, {\n key: 0\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"danger-inline-action\",\n disabled: $setup.groupBusy,\n onClick: $setup.dismissCurrentGroup\n }, \"解散群组\", 8 /* PROPS */, _hoisted_62), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.groupBusy,\n onClick: $setup.openTransferGroup\n }, \"转让群组\", 8 /* PROPS */, _hoisted_63)], 64 /* STABLE_FRAGMENT */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 1,\n type: \"button\",\n class: \"danger-inline-action\",\n disabled: $setup.groupBusy,\n onClick: $setup.leaveCurrentGroup\n }, \"退出群组\", 8 /* PROPS */, _hoisted_64))])])) : $setup.groupPanel === 'members' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_65, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[65] || (_cache[65] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"群员\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), $setup.groupBusy ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_66, \"正在加载\")) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_67, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.groupMembers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: member.uid,\n class: \"group-member-row\"\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, member.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_68)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_69, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.memberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.displayName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.role === 'owner' ? '群主' : member.rawDisplayName), 1 /* TEXT */)])]);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.groupMembers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_70, \"暂无群员\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]))])) : $setup.groupPanel === 'alias' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"form\", {\n key: 2,\n class: \"group-dialog\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_1__.withModifiers)($setup.saveGroupAlias, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[66] || (_cache[66] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"我在本群的昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[67] || (_cache[67] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[20] || (_cache[20] = $event => $setup.groupAliasDraft = $event),\n maxlength: \"64\",\n autocomplete: \"off\",\n placeholder: \"留空使用个人昵称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.groupAliasDraft, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeGroupPanel\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n class: \"primary-inline-action\",\n disabled: $setup.groupBusy\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.groupBusy ? '保存中...' : '保存'), 9 /* TEXT, PROPS */, _hoisted_71)])], 32 /* NEED_HYDRATION */)) : $setup.groupPanel === 'transfer' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_72, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[68] || (_cache[68] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"转让群组\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), $setup.groupBusy ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_73, \"正在加载\")) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_74, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.transferableMembers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: member.uid,\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([\"group-member-row selectable\", {\n selected: $setup.transferTargetId === member.uid\n }]),\n onClick: $event => $setup.transferTargetId = member.uid\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, member.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_76)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_77, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.memberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.displayName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.rawDisplayName), 1 /* TEXT */)])], 10 /* CLASS, PROPS */, _hoisted_75);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.transferableMembers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_78, \"暂无可转让成员\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeGroupPanel\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.groupBusy || !$setup.transferTargetId,\n onClick: $setup.transferCurrentGroup\n }, \"确认转让\", 8 /* PROPS */, _hoisted_79)])])) : $setup.groupPanel === 'manage' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_80, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"header\", null, [_cache[69] || (_cache[69] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"h3\", null, \"群组管理\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeGroupPanel\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"nav\", _hoisted_81, [$setup.isGroupOwner ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n active: $setup.manageSection === 'admins'\n }),\n onClick: _cache[21] || (_cache[21] = $event => $setup.manageSection = 'admins')\n }, \"管理员设置\", 2 /* CLASS */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n active: $setup.manageSection === 'profile'\n }),\n onClick: _cache[22] || (_cache[22] = $event => $setup.manageSection = 'profile')\n }, \"修改群资料\", 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n active: $setup.manageSection === 'kick'\n }),\n onClick: _cache[23] || (_cache[23] = $event => $setup.manageSection = 'kick')\n }, \"踢人\", 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)({\n active: $setup.manageSection === 'mute'\n }),\n onClick: _cache[24] || (_cache[24] = $event => $setup.manageSection = 'mute')\n }, \"禁言设置\", 2 /* CLASS */)]), $setup.groupBusy ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_82, \"正在加载\")) : $setup.manageSection === 'admins' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_83, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_84, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.adminCandidateMembers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"label\", {\n key: member.uid,\n class: \"group-member-row selectable with-check\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n type: \"checkbox\",\n checked: $setup.selectedAdminIds.includes(member.uid),\n onChange: $event => $setup.toggleAdmin(member.uid)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_85), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, member.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_86)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_87, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.memberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.displayName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.rawDisplayName), 1 /* TEXT */)])]);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.adminCandidateMembers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_88, \"暂无可设置成员\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n onClick: $setup.saveGroupAdmins\n }, \"保存管理员\")])])) : $setup.manageSection === 'profile' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_89, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[70] || (_cache[70] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"群名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[25] || (_cache[25] = $event => $setup.profileDraft.name = $event),\n maxlength: \"128\",\n autocomplete: \"off\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.profileDraft.name, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[71] || (_cache[71] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"群说明\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[26] || (_cache[26] = $event => $setup.profileDraft.announcement = $event),\n maxlength: \"1000\",\n rows: \"3\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.profileDraft.announcement, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[72] || (_cache[72] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"欢迎词\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[27] || (_cache[27] = $event => $setup.profileDraft.welcomeText = $event),\n maxlength: \"1000\",\n rows: \"3\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.profileDraft.welcomeText, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n onClick: $setup.saveGroupProfile\n }, \"保存资料\")])])) : $setup.manageSection === 'kick' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_90, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"div\", _hoisted_91, [((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.renderList)($setup.kickCandidateMembers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"label\", {\n key: member.uid,\n class: \"group-member-row selectable with-check\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n type: \"checkbox\",\n checked: $setup.selectedKickIds.includes(member.uid),\n onChange: $event => $setup.toggleKick(member.uid)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_92), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: member.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, member.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_93)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_94, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.memberAvatar(member)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.displayName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)(member.role === 'admin' ? '管理员' : member.rawDisplayName), 1 /* TEXT */)])]);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.kickCandidateMembers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_95, \"暂无可移除成员\")) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"danger-inline-action\",\n disabled: !$setup.selectedKickIds.length,\n onClick: $setup.kickSelectedMembers\n }, \"移出群组\", 8 /* PROPS */, _hoisted_96)])])) : $setup.manageSection === 'mute' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"section\", _hoisted_97, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[74] || (_cache[74] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"禁言模式\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"select\", {\n \"onUpdate:modelValue\": _cache[28] || (_cache[28] = $event => $setup.muteDraft.mode = $event),\n onChange: $setup.clearMuteSaveFeedback\n }, _cache[73] || (_cache[73] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"off\"\n }, \"关闭禁言\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"all_include_admins\"\n }, \"全体禁言包含管理员\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"all_except_admins\"\n }, \"除管理员外全体禁言\", -1 /* HOISTED */)]), 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelSelect, $setup.muteDraft.mode]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[76] || (_cache[76] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"时段类型\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"select\", {\n \"onUpdate:modelValue\": _cache[29] || (_cache[29] = $event => $setup.muteDraft.scheduleType = $event),\n onChange: $setup.clearMuteSaveFeedback\n }, _cache[75] || (_cache[75] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"manual\"\n }, \"立即禁言直到管理解除\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"once\"\n }, \"单次\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"option\", {\n value: \"daily\"\n }, \"每天固定时段\", -1 /* HOISTED */)]), 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelSelect, $setup.muteDraft.scheduleType]])]), $setup.muteDraft.mode !== 'off' && $setup.muteDraft.scheduleType === 'once' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_98, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[77] || (_cache[77] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"开始\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[30] || (_cache[30] = $event => $setup.muteDraft.startsAtLocal = $event),\n type: \"datetime-local\",\n onInput: $setup.clearMuteSaveFeedback\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.muteDraft.startsAtLocal]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[78] || (_cache[78] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"结束\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[31] || (_cache[31] = $event => $setup.muteDraft.endsAtLocal = $event),\n type: \"datetime-local\",\n onInput: $setup.clearMuteSaveFeedback\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.muteDraft.endsAtLocal]])])])) : $setup.muteDraft.mode !== 'off' && $setup.muteDraft.scheduleType === 'daily' ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", _hoisted_99, [(0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[79] || (_cache[79] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"开始\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[32] || (_cache[32] = $event => $setup.muteDraft.dailyStart = $event),\n type: \"time\",\n onInput: $setup.clearMuteSaveFeedback\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.muteDraft.dailyStart]])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"label\", null, [_cache[80] || (_cache[80] = (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"span\", null, \"结束\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_1__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[33] || (_cache[33] = $event => $setup.muteDraft.dailyEnd = $event),\n type: \"time\",\n onInput: $setup.clearMuteSaveFeedback\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_1__.vModelText, $setup.muteDraft.dailyEnd]])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"footer\", _hoisted_100, [$setup.muteSaveNotice ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_101, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.muteSaveNotice), 1 /* TEXT */)) : $setup.muteSaveError ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"span\", _hoisted_102, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.muteSaveError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.groupBusy,\n onClick: $setup.saveMuteSetting\n }, \"保存禁言\", 8 /* PROPS */, _hoisted_103)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true), $setup.conversations.actionNotice || $setup.conversations.actionError ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__.createElementBlock)(\"div\", {\n key: 9,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_1__.normalizeClass)([\"chat-toast\", {\n error: $setup.conversations.actionError\n }])\n }, (0,vue__WEBPACK_IMPORTED_MODULE_1__.toDisplayString)($setup.conversations.actionError || $setup.conversations.actionNotice), 3 /* TEXT, CLASS */)) : (0,vue__WEBPACK_IMPORTED_MODULE_1__.createCommentVNode)(\"v-if\", true)], 2 /* CLASS */);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/ChatPanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -192,7 +192,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n key: 0,\n class: \"quote-preview\"\n};\nconst _hoisted_2 = {\n class: \"composer-tools\"\n};\nconst _hoisted_3 = [\"disabled\"];\nconst _hoisted_4 = [\"disabled\"];\nconst _hoisted_5 = [\"disabled\"];\nconst _hoisted_6 = [\"onClick\"];\nconst _hoisted_7 = [\"disabled\", \"onKeydown\"];\nconst _hoisted_8 = {\n class: \"composer-footer\"\n};\nconst _hoisted_9 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"form\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"message-composer\", {\n 'drop-active': $setup.dropActive\n }]),\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submit, [\"prevent\"]),\n onDragenter: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleDragEnter, [\"prevent\"]),\n onDragover: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleDragOver, [\"prevent\"]),\n onDragleave: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleDragLeave, [\"prevent\"]),\n onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleDrop, [\"prevent\"]),\n onPaste: $setup.handlePaste\n }, [$props.quoteMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"引用\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" \" + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.quoteMessage.quoteText || $props.quoteMessage.text), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"取消引用\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('cancel-quote'))\n }, \"×\")])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"表情\",\n disabled: $props.disabled,\n onClick: $setup.toggleEmojiPicker\n }, \"☺\", 8 /* PROPS */, _hoisted_3), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"图片\",\n disabled: $props.disabled,\n onClick: $setup.chooseImage\n }, \"▧\", 8 /* PROPS */, _hoisted_4), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"文件\",\n disabled: $props.disabled,\n onClick: $setup.chooseFile\n }, \"▤\", 8 /* PROPS */, _hoisted_5), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n ref: \"imageInput\",\n type: \"file\",\n accept: \"image/*\",\n multiple: \"\",\n onChange: _cache[1] || (_cache[1] = $event => $setup.selectAttachment($event, 'image'))\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n ref: \"fileInput\",\n type: \"file\",\n multiple: \"\",\n onChange: _cache[2] || (_cache[2] = $event => $setup.selectAttachment($event, 'file'))\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), $setup.emojiOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"emoji-picker\",\n onClick: _cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.emojiList, emoji => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n key: emoji,\n type: \"button\",\n onClick: $event => $setup.insertEmoji(emoji)\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(emoji), 9 /* TEXT, PROPS */, _hoisted_6);\n }), 64 /* STABLE_FRAGMENT */))])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n ref: \"textareaEl\",\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $setup.text = $event),\n disabled: $props.disabled,\n placeholder: \"输入消息\",\n rows: \"3\",\n onKeydown: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withKeys)((0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submit, [\"exact\", \"prevent\"]), [\"enter\"])\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_7), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.text]]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_8, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"Enter 发送,Shift + Enter 换行\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"send-button\",\n disabled: $props.disabled || !$setup.text.trim()\n }, \"发送\", 8 /* PROPS */, _hoisted_9)])], 34 /* CLASS, NEED_HYDRATION */);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/MessageComposer.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n key: 0,\n class: \"quote-preview\"\n};\nconst _hoisted_2 = {\n class: \"composer-tools\"\n};\nconst _hoisted_3 = [\"disabled\"];\nconst _hoisted_4 = [\"disabled\"];\nconst _hoisted_5 = [\"disabled\"];\nconst _hoisted_6 = [\"disabled\"];\nconst _hoisted_7 = [\"onClick\"];\nconst _hoisted_8 = [\"disabled\", \"onKeydown\"];\nconst _hoisted_9 = {\n key: 1,\n class: \"mention-picker\"\n};\nconst _hoisted_10 = [\"onClick\"];\nconst _hoisted_11 = [\"src\"];\nconst _hoisted_12 = {\n key: 1\n};\nconst _hoisted_13 = {\n class: \"composer-footer\"\n};\nconst _hoisted_14 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"form\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"message-composer\", {\n 'drop-active': $setup.dropActive\n }]),\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submit, [\"prevent\"]),\n onDragenter: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleDragEnter, [\"prevent\"]),\n onDragover: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleDragOver, [\"prevent\"]),\n onDragleave: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleDragLeave, [\"prevent\"]),\n onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleDrop, [\"prevent\"]),\n onPaste: $setup.handlePaste\n }, [$props.quoteMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"引用\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(\" \" + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($props.quoteMessage.quoteText || $props.quoteMessage.text), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"取消引用\",\n onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('cancel-quote'))\n }, \"×\")])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"表情\",\n disabled: $props.disabled,\n onClick: $setup.toggleEmojiPicker\n }, \"☺\", 8 /* PROPS */, _hoisted_3), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"艾特群成员\",\n disabled: $props.disabled || !$props.mentionUsers.length,\n onClick: $setup.openMentionPicker\n }, \"@\", 8 /* PROPS */, _hoisted_4), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"图片\",\n disabled: $props.disabled,\n onClick: $setup.chooseImage\n }, \"▧\", 8 /* PROPS */, _hoisted_5), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"文件\",\n disabled: $props.disabled,\n onClick: $setup.chooseFile\n }, \"▤\", 8 /* PROPS */, _hoisted_6), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n ref: \"imageInput\",\n type: \"file\",\n accept: \"image/*\",\n multiple: \"\",\n onChange: _cache[1] || (_cache[1] = $event => $setup.selectAttachment($event, 'image'))\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n ref: \"fileInput\",\n type: \"file\",\n multiple: \"\",\n onChange: _cache[2] || (_cache[2] = $event => $setup.selectAttachment($event, 'file'))\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */), $setup.emojiOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"emoji-picker\",\n onClick: _cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.emojiList, emoji => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n key: emoji,\n type: \"button\",\n onClick: $event => $setup.insertEmoji(emoji)\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(emoji), 9 /* TEXT, PROPS */, _hoisted_7);\n }), 64 /* STABLE_FRAGMENT */))])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n ref: \"textareaEl\",\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $setup.text = $event),\n disabled: $props.disabled,\n placeholder: \"输入消息\",\n rows: \"3\",\n onInput: $setup.handleMentionInput,\n onKeydown: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withKeys)((0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submit, [\"exact\", \"prevent\"]), [\"enter\"])\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_8), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.text]]), $setup.mentionOpen && $setup.filteredMentionUsers.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_9, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.filteredMentionUsers, member => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: member.uid,\n type: \"button\",\n onClick: $event => $setup.selectMention(member)\n }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n src: member.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_11)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.mentionName(member).slice(0, 1)), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.mentionName(member)), 1 /* TEXT */)], 8 /* PROPS */, _hoisted_10);\n }), 128 /* KEYED_FRAGMENT */))])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_13, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"Enter 发送,Shift + Enter 换行\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"send-button\",\n disabled: $props.disabled || !$setup.text.trim()\n }, \"发送\", 8 /* PROPS */, _hoisted_14)])], 34 /* CLASS, NEED_HYDRATION */);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/MessageComposer.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -203,7 +203,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n ref: \"listEl\",\n class: \"message-list\"\n};\nconst _hoisted_2 = [\"data-message-key\", \"onClick\"];\nconst _hoisted_3 = {\n key: 0,\n class: \"message-select\"\n};\nconst _hoisted_4 = [\"checked\", \"onChange\"];\nconst _hoisted_5 = [\"title\", \"onClick\"];\nconst _hoisted_6 = [\"src\"];\nconst _hoisted_7 = {\n key: 1\n};\nconst _hoisted_8 = {\n class: \"message-stack\"\n};\nconst _hoisted_9 = [\"onClick\"];\nconst _hoisted_10 = {\n key: 0,\n class: \"message-sender-role\"\n};\nconst _hoisted_11 = [\"onContextmenu\"];\nconst _hoisted_12 = [\"onClick\"];\nconst _hoisted_13 = [\"src\", \"alt\"];\nconst _hoisted_14 = [\"href\"];\nconst _hoisted_15 = {\n class: \"message-file-main\"\n};\nconst _hoisted_16 = {\n key: 2\n};\nconst _hoisted_17 = {\n key: 0,\n class: \"recall-mark\"\n};\nconst _hoisted_18 = {\n key: 1,\n class: \"edit-mark\"\n};\nconst _hoisted_19 = {\n key: 2,\n class: \"favorite-mark\",\n title: \"已收藏\",\n \"aria-label\": \"已收藏\"\n};\nconst _hoisted_20 = [\"title\", \"aria-label\"];\nconst _hoisted_21 = {\n key: 0,\n class: \"delivery-check delivery-check-second\"\n};\nconst _hoisted_22 = {\n key: 4,\n class: \"delivery-error\"\n};\nconst _hoisted_23 = [\"onClick\"];\nconst _hoisted_24 = {\n class: \"image-viewer-toolbar\"\n};\nconst _hoisted_25 = {\n class: \"image-viewer-title\"\n};\nconst _hoisted_26 = [\"src\", \"alt\"];\nconst _hoisted_27 = {\n class: \"sender-profile-main\"\n};\nconst _hoisted_28 = [\"src\"];\nconst _hoisted_29 = {\n key: 1,\n class: \"profile-avatar\"\n};\nconst _hoisted_30 = {\n key: 2\n};\nconst _hoisted_31 = {\n class: \"sender-profile-fields\"\n};\nconst _hoisted_32 = {\n class: \"sender-profile-alias\"\n};\nconst _hoisted_33 = [\"disabled\"];\nconst _hoisted_34 = {\n class: \"sender-profile-actions\"\n};\nconst _hoisted_35 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_36 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_37 = [\"disabled\"];\nconst _hoisted_38 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($props.messages, message => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"article\", {\n key: message.id,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"message-row\", [message.direction, {\n selected: $setup.isSelected(message),\n attention: $setup.isAttention(message),\n recalled: message.recalled || message.status === 'recalled'\n }]]),\n \"data-message-key\": $setup.messageIdentity(message),\n onClick: $event => $setup.handleMessageClick(message)\n }, [$props.selectionMode ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"label\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n type: \"checkbox\",\n checked: $setup.isSelected(message),\n onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"])),\n onChange: $event => $setup.emit('toggle-select', message)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_4)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.showGroupSender(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 1,\n type: \"button\",\n class: \"message-sender-avatar\",\n title: $setup.groupSenderName(message),\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.openSenderProfile(message), [\"stop\"])\n }, [message.senderPortrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n src: message.senderPortrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_6)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_7, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.groupSenderAvatarText(message)), 1 /* TEXT */))], 8 /* PROPS */, _hoisted_5)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_8, [$setup.showGroupSender(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n class: \"message-sender-name\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.openSenderProfile(message), [\"stop\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.groupSenderName(message)) + \" \", 1 /* TEXT */), $setup.senderRoleLabel(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderRoleLabel(message)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 8 /* PROPS */, _hoisted_9)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"message-bubble\", $setup.roleBubbleClass(message)]),\n onContextmenu: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.openMenu($event, message), [\"prevent\"])\n }, [$setup.isImageMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n class: \"message-image\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.handleImageClick(message), [\"stop\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n src: $setup.imageDisplayUrl(message.attachment.url),\n alt: message.attachment.name || '图片'\n }, null, 8 /* PROPS */, _hoisted_13)], 8 /* PROPS */, _hoisted_12)) : $setup.isFileMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 1,\n class: \"message-file\",\n href: message.attachment.url,\n target: \"_blank\",\n rel: \"noreferrer\",\n download: \"\"\n }, [_cache[7] || (_cache[7] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"message-file-icon\"\n }, \"▤\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_15, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(message.attachment.name || '文件'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatFileSize(message.attachment.size)), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_14)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), message.text ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(message.text), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"time\", null, [$setup.isRecallNotice(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_17, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(message.recallStatus || '已撤回'), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatTime(message.displayTimestamp || message.timestamp)), 1 /* TEXT */), message.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_18, \"【edit \" + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatTime(message.editedAt)) + \"】\", 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.isFavorite(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_19, \"★\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.deliveryState(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", {\n key: 3,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"delivery-mark\", `delivery-mark-${$setup.deliveryState(message)}`]),\n title: $setup.deliveryTitle(message),\n \"aria-label\": $setup.deliveryTitle(message)\n }, [_cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"delivery-check\"\n }, \"✓\", -1 /* HOISTED */)), $setup.deliveryState(message) !== 'sent' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_21, \"✓\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 10 /* CLASS, PROPS */, _hoisted_20)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), message.status === 'failed' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_22, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.failureText(message)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)])], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_11)])], 10 /* CLASS, PROPS */, _hoisted_2);\n }), 128 /* KEYED_FRAGMENT */)), $setup.contextMenu.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"message-context-menu\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.contextMenu.x}px`,\n top: `${$setup.contextMenu.y}px`\n }),\n onClick: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.menuItems, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: item.action,\n type: \"button\",\n onClick: $event => $setup.chooseMenuAction(item.action)\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.label), 9 /* TEXT, PROPS */, _hoisted_23);\n }), 128 /* KEYED_FRAGMENT */))], 4 /* STYLE */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Teleport, {\n to: \"body\"\n }, [$setup.imageViewer.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"image-viewer-backdrop\",\n onClick: $setup.closeImageViewer\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"image-viewer-dialog\",\n onClick: _cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_25, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.imageViewer.name || '图片'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"缩小\",\n \"aria-label\": \"缩小\",\n onClick: _cache[2] || (_cache[2] = $event => $setup.zoomImage(-0.25))\n }, \"−\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"放大\",\n \"aria-label\": \"放大\",\n onClick: _cache[3] || (_cache[3] = $event => $setup.zoomImage(0.25))\n }, \"+\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"还原\",\n \"aria-label\": \"还原\",\n onClick: $setup.resetImageViewer\n }, \"1:1\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"旋转\",\n \"aria-label\": \"旋转\",\n onClick: $setup.rotateImage\n }, \"⟳\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"保存\",\n \"aria-label\": \"保存\",\n onClick: $setup.saveViewerImage\n }, \"⇩\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"关闭\",\n \"aria-label\": \"关闭\",\n onClick: $setup.closeImageViewer\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n ref: \"viewerStage\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"image-viewer-stage\", {\n dragging: $setup.imageViewer.dragging,\n zoomed: $setup.imageViewer.scale > 1\n }]),\n onWheel: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleImageWheel, [\"prevent\"]),\n onPointerdown: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.startImageDrag, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n class: \"image-viewer-img\",\n src: $setup.imageViewer.url,\n alt: $setup.imageViewer.name || '图片',\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($setup.imageViewerStyle),\n draggable: \"false\"\n }, null, 12 /* STYLE, PROPS */, _hoisted_26)], 34 /* CLASS, NEED_HYDRATION */)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)])), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Teleport, {\n to: \"body\"\n }, [$setup.senderProfile.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"sender-profile-backdrop\",\n onClick: $setup.closeSenderProfile\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"section\", {\n class: \"sender-profile-dialog\",\n onClick: _cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"用户资料\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeSenderProfile\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_27, [$setup.senderProfile.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"profile-avatar image-avatar\",\n src: $setup.senderProfile.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_28)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_29, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.displayName || $setup.senderProfile.uid), 1 /* TEXT */), $setup.senderProfile.roleLabel ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_30, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.roleLabel), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dl\", _hoisted_31, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"用户ID\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.uid || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.rawName || $setup.senderProfile.displayName || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[12] || (_cache[12] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"手机号\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.mobile || '未知'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"地区\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.address || '未知'), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", _hoisted_32, [_cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"备注名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $setup.senderProfile.aliasDraft = $event),\n maxlength: \"32\",\n autocomplete: \"off\",\n placeholder: \"可给群员设置备注\",\n disabled: $setup.senderProfile.saving || $setup.senderProfile.adding\n }, null, 8 /* PROPS */, _hoisted_33), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.senderProfile.aliasDraft, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"footer\", _hoisted_34, [$setup.senderProfile.notice ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_35, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.notice), 1 /* TEXT */)) : $setup.senderProfile.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_36, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.error), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), !$setup.senderProfile.isContact ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 2,\n type: \"button\",\n class: \"ghost-inline-action\",\n disabled: $setup.senderProfile.adding || $setup.senderProfile.saving || !$setup.senderProfile.uid,\n onClick: $setup.addSenderAsContact\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.adding ? '添加中...' : '添加为好友'), 9 /* TEXT, PROPS */, _hoisted_37)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.senderProfile.saving || $setup.senderProfile.adding || !$setup.senderProfile.uid,\n onClick: $setup.saveSenderAlias\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.saving ? '保存中...' : '保存备注'), 9 /* TEXT, PROPS */, _hoisted_38)])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]))], 512 /* NEED_PATCH */);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/MessageList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n ref: \"listEl\",\n class: \"message-list\"\n};\nconst _hoisted_2 = [\"data-message-key\", \"onClick\"];\nconst _hoisted_3 = {\n key: 0,\n class: \"system-message-pill\"\n};\nconst _hoisted_4 = {\n key: 1,\n class: \"message-select\"\n};\nconst _hoisted_5 = [\"checked\", \"onChange\"];\nconst _hoisted_6 = [\"title\", \"onClick\"];\nconst _hoisted_7 = [\"src\", \"onError\"];\nconst _hoisted_8 = {\n key: 1\n};\nconst _hoisted_9 = {\n key: 3,\n class: \"message-stack\"\n};\nconst _hoisted_10 = [\"onClick\"];\nconst _hoisted_11 = {\n key: 0,\n class: \"message-sender-role\"\n};\nconst _hoisted_12 = [\"onContextmenu\"];\nconst _hoisted_13 = {\n key: 0,\n class: \"red-packet-card\"\n};\nconst _hoisted_14 = {\n class: \"red-packet-card-main\"\n};\nconst _hoisted_15 = {\n key: 1,\n class: \"red-packet-receipt\"\n};\nconst _hoisted_16 = [\"onClick\"];\nconst _hoisted_17 = [\"src\", \"alt\"];\nconst _hoisted_18 = [\"src\", \"onError\"];\nconst _hoisted_19 = [\"href\"];\nconst _hoisted_20 = {\n class: \"message-file-main\"\n};\nconst _hoisted_21 = {\n key: 5\n};\nconst _hoisted_22 = {\n key: 0,\n class: \"recall-mark\"\n};\nconst _hoisted_23 = {\n key: 1,\n class: \"edit-mark\"\n};\nconst _hoisted_24 = {\n key: 2,\n class: \"favorite-mark\",\n title: \"已收藏\",\n \"aria-label\": \"已收藏\"\n};\nconst _hoisted_25 = [\"title\", \"aria-label\"];\nconst _hoisted_26 = {\n key: 0,\n class: \"delivery-check delivery-check-second\"\n};\nconst _hoisted_27 = {\n key: 4,\n class: \"delivery-error\"\n};\nconst _hoisted_28 = [\"onClick\"];\nconst _hoisted_29 = {\n ref: \"viewerStage\",\n class: \"image-viewer-stage\"\n};\nconst _hoisted_30 = [\"src\", \"alt\"];\nconst _hoisted_31 = {\n class: \"sender-profile-main\"\n};\nconst _hoisted_32 = [\"src\"];\nconst _hoisted_33 = {\n key: 1,\n class: \"profile-avatar\"\n};\nconst _hoisted_34 = {\n key: 2\n};\nconst _hoisted_35 = {\n class: \"sender-profile-fields\"\n};\nconst _hoisted_36 = {\n key: 0\n};\nconst _hoisted_37 = {\n class: \"sender-profile-alias\"\n};\nconst _hoisted_38 = [\"disabled\"];\nconst _hoisted_39 = {\n class: \"sender-profile-actions\"\n};\nconst _hoisted_40 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_41 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_42 = [\"disabled\"];\nconst _hoisted_43 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_1, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($props.messages, message => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"article\", {\n key: message.id,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"message-row\", [message.direction, {\n system: $setup.isSystemMessage(message),\n selected: $setup.isSelected(message),\n attention: $setup.isAttention(message),\n recalled: message.recalled || message.status === 'recalled'\n }]]),\n \"data-message-key\": $setup.messageIdentity(message),\n onClick: $event => $setup.handleMessageClick(message)\n }, [$setup.isSystemMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.systemMessageText(message)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $props.selectionMode && !$setup.isSystemMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"label\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n type: \"checkbox\",\n checked: $setup.isSelected(message),\n onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"])),\n onChange: $event => $setup.emit('toggle-select', message)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_5)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), !$setup.isSystemMessage(message) && $setup.showGroupSender(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 2,\n type: \"button\",\n class: \"message-sender-avatar\",\n title: $setup.groupSenderName(message),\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.openSenderProfile(message), [\"stop\"])\n }, [message.senderPortrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n src: message.senderPortrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, message.senderPortrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.groupSenderAvatarText(message)), 1 /* TEXT */))], 8 /* PROPS */, _hoisted_6)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), !$setup.isSystemMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_9, [$setup.showGroupSender(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n class: \"message-sender-name\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.openSenderProfile(message), [\"stop\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.groupSenderName(message)) + \" \", 1 /* TEXT */), $setup.senderRoleLabel(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_11, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderRoleLabel(message)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 8 /* PROPS */, _hoisted_10)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"message-bubble\", $setup.roleBubbleClass(message)]),\n onContextmenu: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.openMenu($event, message), [\"prevent\"])\n }, [$setup.isRedPacketMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_14, [_cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"red-packet-icon\"\n }, \"福\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.redPacketBlessing(message)), 1 /* TEXT */), _cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, \"请在 App 上领取\", -1 /* HOISTED */))])]), _cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"red-packet-card-footer\"\n }, \"中聊红包\", -1 /* HOISTED */))])) : $setup.isRedPacketReceipt(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_15, [_cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"red-packet-mini-icon\"\n }, \"福\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.redPacketReceiptText(message)), 1 /* TEXT */)])) : $setup.isImageMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 2,\n type: \"button\",\n class: \"message-image\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.handleImageClick(message), [\"stop\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n src: message.attachment.url,\n alt: message.attachment.name || '图片'\n }, null, 8 /* PROPS */, _hoisted_17)], 8 /* PROPS */, _hoisted_16)) : $setup.isVideoMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"video\", {\n key: 3,\n class: \"message-video\",\n src: $setup.videoDisplayUrl(message.attachment.url),\n controls: \"\",\n playsinline: \"\",\n preload: \"metadata\",\n onError: $event => $setup.useVideoOriginalFallback($event, message.attachment.url)\n }, \" 当前浏览器无法播放该视频 \", 40 /* PROPS, NEED_HYDRATION */, _hoisted_18)) : $setup.isFileMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 4,\n class: \"message-file\",\n href: message.attachment.url,\n target: \"_blank\",\n rel: \"noreferrer\",\n download: \"\"\n }, [_cache[12] || (_cache[12] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"message-file-icon\"\n }, \"▤\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.displayFileName(message)), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatFileSize(message.attachment.size)), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_19)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), message.text && !$setup.isFileMessage(message) && !$setup.isRedPacketMessage(message) && !$setup.isRedPacketReceipt(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(message.text), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"time\", null, [$setup.isRecallNotice(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_22, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(message.recallStatus || '已撤回'), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatTime(message.displayTimestamp || message.timestamp)), 1 /* TEXT */), message.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_23, \"【edit \" + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatTime(message.editedAt)) + \"】\", 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.isFavorite(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_24, \"★\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.deliveryState(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", {\n key: 3,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"delivery-mark\", `delivery-mark-${$setup.deliveryState(message)}`]),\n title: $setup.deliveryTitle(message),\n \"aria-label\": $setup.deliveryTitle(message)\n }, [_cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"delivery-check\"\n }, \"✓\", -1 /* HOISTED */)), $setup.deliveryState(message) !== 'sent' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_26, \"✓\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 10 /* CLASS, PROPS */, _hoisted_25)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), message.status === 'failed' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_27, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.failureText(message)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)])], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_12)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 10 /* CLASS, PROPS */, _hoisted_2);\n }), 128 /* KEYED_FRAGMENT */)), $setup.contextMenu.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"message-context-menu\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.contextMenu.x}px`,\n top: `${$setup.contextMenu.y}px`\n }),\n onClick: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.menuItems, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: item.action,\n type: \"button\",\n onClick: $event => $setup.chooseMenuAction(item.action)\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.label), 9 /* TEXT, PROPS */, _hoisted_28);\n }), 128 /* KEYED_FRAGMENT */))], 4 /* STYLE */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Teleport, {\n to: \"body\"\n }, [$setup.imageViewer.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"image-viewer-backdrop\",\n onClick: $setup.closeImageViewer\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"image-viewer-dialog\",\n onClick: _cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"image-viewer-toolbar\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"旋转\",\n \"aria-label\": \"旋转\",\n onClick: $setup.rotateImage\n }, \"⟳\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"保存\",\n \"aria-label\": \"保存\",\n onClick: $setup.saveViewerImage\n }, \"⇩\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"关闭\",\n \"aria-label\": \"关闭\",\n onClick: $setup.closeImageViewer\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_29, [$setup.viewerImages.length > 1 ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 0,\n type: \"button\",\n class: \"image-viewer-nav image-viewer-prev\",\n title: \"上一张\",\n \"aria-label\": \"上一张\",\n onPointerdown: _cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"])),\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.showPreviousImage, [\"stop\"])\n }, \"‹\", 32 /* NEED_HYDRATION */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n class: \"image-viewer-img\",\n src: $setup.imageViewer.url,\n alt: $setup.imageViewer.name || '图片',\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($setup.imageViewerStyle),\n draggable: \"false\"\n }, null, 12 /* STYLE, PROPS */, _hoisted_30), $setup.viewerImages.length > 1 ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 1,\n type: \"button\",\n class: \"image-viewer-nav image-viewer-next\",\n title: \"下一张\",\n \"aria-label\": \"下一张\",\n onPointerdown: _cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"])),\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.showNextImage, [\"stop\"])\n }, \"›\", 32 /* NEED_HYDRATION */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 512 /* NEED_PATCH */)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)])), ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Teleport, {\n to: \"body\"\n }, [$setup.senderProfile.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"sender-profile-backdrop\",\n onClick: $setup.closeSenderProfile\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"section\", {\n class: \"sender-profile-dialog\",\n onClick: _cache[7] || (_cache[7] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"用户资料\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeSenderProfile\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_31, [$setup.senderProfile.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"profile-avatar image-avatar\",\n src: $setup.senderProfile.portrait,\n alt: \"\",\n onError: _cache[5] || (_cache[5] = $event => $setup.useImageProxyFallback($event, $setup.senderProfile.portrait))\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_32)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_33, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.displayName || $setup.senderProfile.uid), 1 /* TEXT */), $setup.senderProfile.roleLabel ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_34, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.roleLabel), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dl\", _hoisted_35, [$setup.senderProfile.isContact ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_36, [_cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"用户ID\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.userId || '-'), 1 /* TEXT */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.rawName || $setup.senderProfile.displayName || '-'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"手机号\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.mobile || '未知'), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"地区\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.address || '未知'), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", _hoisted_37, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"备注名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $setup.senderProfile.aliasDraft = $event),\n maxlength: \"32\",\n autocomplete: \"off\",\n placeholder: \"可给群员设置备注\",\n disabled: $setup.senderProfile.saving || $setup.senderProfile.adding\n }, null, 8 /* PROPS */, _hoisted_38), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.senderProfile.aliasDraft, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"footer\", _hoisted_39, [$setup.senderProfile.notice ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_40, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.notice), 1 /* TEXT */)) : $setup.senderProfile.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_41, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.error), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), !$setup.senderProfile.isContact ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: 2,\n type: \"button\",\n class: \"ghost-inline-action\",\n disabled: $setup.senderProfile.adding || $setup.senderProfile.saving || !$setup.senderProfile.uid,\n onClick: $setup.addSenderAsContact\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.adding ? '添加中...' : '添加为好友'), 9 /* TEXT, PROPS */, _hoisted_42)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.senderProfile.saving || $setup.senderProfile.adding || !$setup.senderProfile.uid,\n onClick: $setup.saveSenderAlias\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.senderProfile.saving ? '保存中...' : '保存备注'), 9 /* TEXT, PROPS */, _hoisted_43)])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]))], 512 /* NEED_PATCH */);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/chat/MessageList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -214,7 +214,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"contact-panel\"\n};\nconst _hoisted_2 = {\n class: \"chat-header\"\n};\nconst _hoisted_3 = {\n class: \"contact-profile\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = {\n key: 1,\n class: \"profile-avatar\"\n};\nconst _hoisted_6 = {\n class: \"profile-main\"\n};\nconst _hoisted_7 = {\n class: \"remark-row\"\n};\nconst _hoisted_8 = {\n class: \"profile-fields\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"form-error\"\n};\nconst _hoisted_10 = {\n class: \"modal-actions\"\n};\nconst _hoisted_11 = [\"disabled\"];\nconst _hoisted_12 = [\"disabled\"];\nconst _hoisted_13 = {\n key: 1,\n class: \"empty-chat\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"section\", _hoisted_1, [$setup.contact ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 0\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h2\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.remarkName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.username), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [$setup.contact.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"profile-avatar image-avatar\",\n src: $setup.contact.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_4)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contact.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_6, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h3\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.remarkName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button remark-edit-button\",\n title: \"编辑备注名\",\n onClick: $setup.openAliasEditor\n }, \"✏️\")])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dl\", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"用户名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.username), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"手机号\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.mobile), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"地区\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.address), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"primary-action profile-action\",\n onClick: _cache[0] || (_cache[0] = $event => $setup.contacts.openChat($setup.contact))\n }, \"发消息\")]), $setup.editingAlias ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"modal-backdrop contact-modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeAliasEditor, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"form\", {\n class: \"modal-panel\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submitAlias, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"编辑备注名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeAliasEditor\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"备注名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $setup.aliasDraft = $event),\n maxlength: \"32\",\n autocomplete: \"off\",\n autofocus: \"\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.aliasDraft, void 0, {\n trim: true\n }]])]), $setup.aliasError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.aliasError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n disabled: $setup.aliasSaving,\n onClick: $setup.closeAliasEditor\n }, \"取消\", 8 /* PROPS */, _hoisted_11), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"submit\",\n class: \"primary-inline-action\",\n disabled: $setup.aliasSaving\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.aliasSaving ? '保存中' : '保存'), 9 /* TEXT, PROPS */, _hoisted_12)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 64 /* STABLE_FRAGMENT */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_13, _cache[7] || (_cache[7] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"选择一个联系人\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"好友列表同步完成后,可以在左侧查看资料\", -1 /* HOISTED */)])))]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"contact-panel\"\n};\nconst _hoisted_2 = {\n class: \"chat-header\"\n};\nconst _hoisted_3 = {\n class: \"contact-profile\"\n};\nconst _hoisted_4 = [\"src\"];\nconst _hoisted_5 = {\n key: 1,\n class: \"profile-avatar\"\n};\nconst _hoisted_6 = {\n class: \"profile-main\"\n};\nconst _hoisted_7 = {\n class: \"remark-row\"\n};\nconst _hoisted_8 = {\n class: \"profile-fields\"\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"form-error\"\n};\nconst _hoisted_10 = {\n class: \"modal-actions\"\n};\nconst _hoisted_11 = [\"disabled\"];\nconst _hoisted_12 = [\"disabled\"];\nconst _hoisted_13 = {\n key: 1,\n class: \"empty-chat\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"section\", _hoisted_1, [$setup.contact ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 0\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h2\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.remarkName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.username), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [$setup.contact.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"profile-avatar image-avatar\",\n src: $setup.contact.portrait,\n alt: \"\",\n onError: _cache[0] || (_cache[0] = $event => $setup.useImageProxyFallback($event, $setup.contact.portrait))\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_4)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contact.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_6, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h3\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.remarkName), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button remark-edit-button\",\n title: \"编辑备注名\",\n onClick: $setup.openAliasEditor\n }, \"✏️\")])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dl\", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"用户名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.username), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"手机号\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.mobile), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dt\", null, \"地区\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"dd\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.address), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"primary-action profile-action\",\n onClick: _cache[1] || (_cache[1] = $event => $setup.contacts.openChat($setup.contact))\n }, \"发消息\")]), $setup.editingAlias ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"modal-backdrop contact-modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeAliasEditor, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"form\", {\n class: \"modal-panel\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submitAlias, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"编辑备注名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeAliasEditor\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[7] || (_cache[7] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"备注名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $setup.aliasDraft = $event),\n maxlength: \"32\",\n autocomplete: \"off\",\n autofocus: \"\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.aliasDraft, void 0, {\n trim: true\n }]])]), $setup.aliasError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.aliasError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n disabled: $setup.aliasSaving,\n onClick: $setup.closeAliasEditor\n }, \"取消\", 8 /* PROPS */, _hoisted_11), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"submit\",\n class: \"primary-inline-action\",\n disabled: $setup.aliasSaving\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.aliasSaving ? '保存中' : '保存'), 9 /* TEXT, PROPS */, _hoisted_12)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 64 /* STABLE_FRAGMENT */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_13, _cache[8] || (_cache[8] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"选择一个联系人\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"好友列表同步完成后,可以在左侧查看资料\", -1 /* HOISTED */)])))]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -236,7 +236,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"favorite-panel\"\n};\nconst _hoisted_2 = {\n class: \"chat-header\"\n};\nconst _hoisted_3 = {\n class: \"favorite-detail\"\n};\nconst _hoisted_4 = {\n class: \"favorite-detail-body\"\n};\nconst _hoisted_5 = {\n key: 0,\n class: \"recall-mark\"\n};\nconst _hoisted_6 = [\"href\"];\nconst _hoisted_7 = [\"src\", \"alt\"];\nconst _hoisted_8 = [\"href\"];\nconst _hoisted_9 = {\n class: \"message-file-main\"\n};\nconst _hoisted_10 = {\n key: 3\n};\nconst _hoisted_11 = {\n class: \"favorite-detail-actions\"\n};\nconst _hoisted_12 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_13 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_14 = {\n key: 1,\n class: \"empty-chat\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"section\", _hoisted_1, [$setup.favorite ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 0\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h2\", null, \"收藏详情\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.favoriteTitle($setup.favorite)), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"favorite-detail-message\", {\n recalled: $setup.favorite.recalled\n }])\n }, [_cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"favorite-detail-star\"\n }, \"★\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [$setup.favorite.recalled ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.favorite.recallStatus || '已撤回'), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.isImageFavorite($setup.favorite) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 1,\n class: \"favorite-detail-image\",\n href: $setup.favorite.attachment.url,\n target: \"_blank\",\n rel: \"noreferrer\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n src: $setup.imageDisplayUrl($setup.favorite.attachment.url),\n alt: $setup.favorite.attachment.name || '图片'\n }, null, 8 /* PROPS */, _hoisted_7)], 8 /* PROPS */, _hoisted_6)) : $setup.isFileFavorite($setup.favorite) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 2,\n class: \"message-file favorite-detail-file\",\n href: $setup.favorite.attachment.url,\n target: \"_blank\",\n rel: \"noreferrer\",\n download: \"\"\n }, [_cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"message-file-icon\"\n }, \"▤\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.favorite.attachment.name || '文件'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatFileSize($setup.favorite.attachment.size)), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_8)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.favoriteText($setup.favorite) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.favoriteText($setup.favorite)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"time\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatFavoriteTime($setup.favorite.timestamp)), 1 /* TEXT */)], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_11, [$setup.notice ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.notice), 1 /* TEXT */)) : $setup.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.error), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.copyFavorite\n }, \"复制\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.openConversation\n }, \"打开原会话\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"danger-inline-action\",\n onClick: $setup.removeFavorite\n }, \"取消收藏\")])])], 64 /* STABLE_FRAGMENT */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_14, _cache[3] || (_cache[3] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"暂无收藏消息\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"右键消息气泡选择“收藏”后,会显示在这里\", -1 /* HOISTED */)])))]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"favorite-panel\"\n};\nconst _hoisted_2 = {\n class: \"chat-header\"\n};\nconst _hoisted_3 = {\n class: \"favorite-detail\"\n};\nconst _hoisted_4 = {\n class: \"favorite-detail-body\"\n};\nconst _hoisted_5 = {\n key: 0,\n class: \"recall-mark\"\n};\nconst _hoisted_6 = [\"href\"];\nconst _hoisted_7 = [\"src\", \"alt\"];\nconst _hoisted_8 = [\"href\"];\nconst _hoisted_9 = {\n class: \"message-file-main\"\n};\nconst _hoisted_10 = {\n key: 3\n};\nconst _hoisted_11 = {\n class: \"favorite-detail-actions\"\n};\nconst _hoisted_12 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_13 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_14 = {\n key: 1,\n class: \"empty-chat\"\n};\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"section\", _hoisted_1, [$setup.favorite ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 0\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h2\", null, \"收藏详情\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.favoriteTitle($setup.favorite)), 1 /* TEXT */)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"favorite-detail-message\", {\n recalled: $setup.favorite.recalled\n }])\n }, [_cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"favorite-detail-star\"\n }, \"★\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [$setup.favorite.recalled ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.favorite.recallStatus || '已撤回'), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.isImageFavorite($setup.favorite) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 1,\n class: \"favorite-detail-image\",\n href: $setup.favorite.attachment.url,\n target: \"_blank\",\n rel: \"noreferrer\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n src: $setup.favorite.attachment.url,\n alt: $setup.favorite.attachment.name || '图片'\n }, null, 8 /* PROPS */, _hoisted_7)], 8 /* PROPS */, _hoisted_6)) : $setup.isFileFavorite($setup.favorite) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"a\", {\n key: 2,\n class: \"message-file favorite-detail-file\",\n href: $setup.favorite.attachment.url,\n target: \"_blank\",\n rel: \"noreferrer\",\n download: \"\"\n }, [_cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", {\n class: \"message-file-icon\"\n }, \"▤\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.favorite.attachment.name || '文件'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatFileSize($setup.favorite.attachment.size)), 1 /* TEXT */)])], 8 /* PROPS */, _hoisted_8)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.favoriteText($setup.favorite) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.favoriteText($setup.favorite)), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"time\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatFavoriteTime($setup.favorite.timestamp)), 1 /* TEXT */)], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_11, [$setup.notice ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.notice), 1 /* TEXT */)) : $setup.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.error), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.copyFavorite\n }, \"复制\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.openConversation\n }, \"打开原会话\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"danger-inline-action\",\n onClick: $setup.removeFavorite\n }, \"取消收藏\")])])], 64 /* STABLE_FRAGMENT */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_14, _cache[3] || (_cache[3] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"暂无收藏消息\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"右键消息气泡选择“收藏”后,会显示在这里\", -1 /* HOISTED */)])))]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -247,7 +247,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"conversation-list\"\n};\nconst _hoisted_2 = {\n class: \"list-header\"\n};\nconst _hoisted_3 = {\n class: \"header-actions\"\n};\nconst _hoisted_4 = {\n class: \"search-box\"\n};\nconst _hoisted_5 = {\n class: \"sidebar-scroll\"\n};\nconst _hoisted_6 = [\"onClick\"];\nconst _hoisted_7 = [\"src\"];\nconst _hoisted_8 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_9 = {\n class: \"conversation-copy\"\n};\nconst _hoisted_10 = {\n key: 0,\n class: \"empty-list\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"form-error\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"form-info\"\n};\nconst _hoisted_13 = {\n class: \"modal-actions\"\n};\nconst _hoisted_14 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"aside\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h2\", null, \"联系人\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.contacts.length) + \" 位好友\", 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"添加联系人\",\n onClick: $setup.openAddContact\n }, \"+\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"刷新\",\n onClick: _cache[0] || (_cache[0] = $event => $setup.contacts.refreshContacts({\n force: true\n }))\n }, \"↻\")])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $setup.keyword = $event),\n placeholder: \"搜索联系人\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.keyword, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_5, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.filteredContacts, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: item.id,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"conversation-item\", {\n active: item.id === $setup.contacts.activeId\n }]),\n onClick: $event => $setup.contacts.setActiveContact(item.id)\n }, [item.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: item.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.title), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.subtitle), 1 /* TEXT */)])], 10 /* CLASS, PROPS */, _hoisted_6);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.filteredContacts.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.loading ? '正在加载' : '暂无联系人'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.loading ? '请稍候' : '好友同步完成后会显示在这里'), 1 /* TEXT */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), $setup.addingContact ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeAddContact, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"form\", {\n class: \"modal-panel\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submitAddContact, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"添加联系人\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeAddContact\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"用户ID / 手机号 / 用户名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $setup.addKeyword = $event),\n autocomplete: \"off\",\n placeholder: \"请输入要添加的联系人\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.addKeyword, void 0, {\n trim: true\n }]])]), $setup.contacts.actionError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_11, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.actionError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.contacts.actionInfo ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.actionInfo), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeAddContact\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"primary-inline-action\",\n disabled: $setup.contacts.loading || !$setup.addKeyword\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.loading ? '添加中...' : '添加'), 9 /* TEXT, PROPS */, _hoisted_14)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/ContactList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"conversation-list\"\n};\nconst _hoisted_2 = {\n class: \"list-header\"\n};\nconst _hoisted_3 = {\n class: \"header-actions\"\n};\nconst _hoisted_4 = {\n class: \"search-box\"\n};\nconst _hoisted_5 = {\n class: \"sidebar-scroll\"\n};\nconst _hoisted_6 = [\"onClick\"];\nconst _hoisted_7 = [\"src\", \"onError\"];\nconst _hoisted_8 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_9 = {\n class: \"conversation-copy\"\n};\nconst _hoisted_10 = {\n key: 0,\n class: \"empty-list\"\n};\nconst _hoisted_11 = {\n key: 0,\n class: \"form-error\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"form-info\"\n};\nconst _hoisted_13 = {\n class: \"modal-actions\"\n};\nconst _hoisted_14 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"aside\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h2\", null, \"联系人\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.contacts.length) + \" 位好友\", 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"添加联系人\",\n onClick: $setup.openAddContact\n }, \"+\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"刷新\",\n onClick: _cache[0] || (_cache[0] = $event => $setup.contacts.refreshContacts({\n force: true\n }))\n }, \"↻\")])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[1] || (_cache[1] = $event => $setup.keyword = $event),\n placeholder: \"搜索联系人\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.keyword, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_5, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.filteredContacts, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: item.id,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"conversation-item\", {\n active: item.id === $setup.contacts.activeId\n }]),\n onClick: $event => $setup.contacts.setActiveContact(item.id)\n }, [item.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: item.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, item.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.title), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.subtitle), 1 /* TEXT */)])], 10 /* CLASS, PROPS */, _hoisted_6);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.filteredContacts.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.loading ? '正在加载' : '暂无联系人'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.loading ? '请稍候' : '好友同步完成后会显示在这里'), 1 /* TEXT */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), $setup.addingContact ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeAddContact, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"form\", {\n class: \"modal-panel\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submitAddContact, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"添加联系人\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeAddContact\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"用户ID / 手机号 / 用户名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $setup.addKeyword = $event),\n autocomplete: \"off\",\n placeholder: \"请输入要添加的联系人\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.addKeyword, void 0, {\n trim: true\n }]])]), $setup.contacts.actionError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_11, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.actionError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.contacts.actionInfo ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.actionInfo), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeAddContact\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"primary-inline-action\",\n disabled: $setup.contacts.loading || !$setup.addKeyword\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.contacts.loading ? '添加中...' : '添加'), 9 /* TEXT, PROPS */, _hoisted_14)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/ContactList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -258,7 +258,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"conversation-list\"\n};\nconst _hoisted_2 = {\n class: \"list-header\"\n};\nconst _hoisted_3 = {\n class: \"header-actions action-menu-anchor\"\n};\nconst _hoisted_4 = {\n class: \"search-box\"\n};\nconst _hoisted_5 = {\n class: \"sidebar-scroll\"\n};\nconst _hoisted_6 = [\"onClick\"];\nconst _hoisted_7 = [\"src\"];\nconst _hoisted_8 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_9 = {\n class: \"conversation-copy\"\n};\nconst _hoisted_10 = [\"aria-label\"];\nconst _hoisted_11 = {\n key: 0,\n class: \"empty-list\"\n};\nconst _hoisted_12 = {\n key: 1,\n class: \"empty-list\"\n};\nconst _hoisted_13 = {\n key: 0\n};\nconst _hoisted_14 = {\n key: 2\n};\nconst _hoisted_15 = {\n key: 5,\n class: \"form-error\"\n};\nconst _hoisted_16 = {\n key: 6,\n class: \"form-info\"\n};\nconst _hoisted_17 = {\n class: \"modal-actions\"\n};\nconst _hoisted_18 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"aside\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h2\", null, \"消息\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.conversations.totalUnread) + \" 条未读\", 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"新建会话\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.toggleActionMenu, [\"stop\"])\n }, \"+\"), $setup.actionMenuOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"quick-action-menu\",\n onClick: _cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[0] || (_cache[0] = $event => $setup.openAction('addContact'))\n }, \"添加联系人\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[1] || (_cache[1] = $event => $setup.openAction('createGroup'))\n }, \"新建群组\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[2] || (_cache[2] = $event => $setup.openAction('joinGroup'))\n }, \"加入群组\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[3] || (_cache[3] = $event => $setup.openAction('broadcast'))\n }, \"群发助手\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[4] || (_cache[4] = $event => $setup.openAction('createChannel'))\n }, \"创建频道/公告群\")])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $setup.searchKeyword = $event),\n placeholder: \"搜索会话、联系人\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.searchKeyword, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_5, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.filteredConversationItems, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: item.resultKey,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"conversation-item\", {\n active: $setup.isListItemActive(item)\n }]),\n onClick: $event => $setup.selectListItem(item)\n }, [item.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: item.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.title), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.subtitle), 1 /* TEXT */)]), Number(item.unread || 0) > 0 ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", {\n key: 2,\n class: \"unread-badge\",\n \"aria-label\": `${item.unread} 条未读消息`\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatUnread(item.unread)), 9 /* TEXT, PROPS */, _hoisted_10)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 10 /* CLASS, PROPS */, _hoisted_6);\n }), 128 /* KEYED_FRAGMENT */)), !$setup.filteredConversationItems.length && $setup.searchKeyword ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_11, _cache[19] || (_cache[19] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"没有匹配结果\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"换个关键词再试试\", -1 /* HOISTED */)]))) : !$setup.conversations.conversations.length && !$setup.conversations.usingDemoData ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_12, _cache[20] || (_cache[20] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"暂无会话\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"收到或发起消息后会出现在这里\", -1 /* HOISTED */)]))) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), $setup.activeAction ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeActionModal, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"form\", {\n class: \"modal-panel conversation-action-panel\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submitAction, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.actionTitle), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeActionModal\n }, \"×\")]), $setup.activeAction === 'addContact' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"label\", _hoisted_13, [_cache[21] || (_cache[21] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"用户ID / 手机号 / 用户名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[7] || (_cache[7] = $event => $setup.addKeyword = $event),\n autocomplete: \"off\",\n placeholder: \"请输入要添加的联系人\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.addKeyword, void 0, {\n trim: true\n }]])])) : $setup.activeAction === 'createGroup' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 1\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"群组名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $setup.groupName = $event),\n maxlength: \"64\",\n autocomplete: \"off\",\n placeholder: \"请输入群组名称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.groupName, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"群说明\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $setup.groupAnnouncement = $event),\n maxlength: \"1000\",\n rows: \"3\",\n placeholder: \"可选\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.groupAnnouncement, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"欢迎词\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $setup.groupWelcomeText = $event),\n maxlength: \"1000\",\n rows: \"3\",\n placeholder: \"群组创建后自动发送\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.groupWelcomeText, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"ContactPicker\"], {\n contacts: $setup.filteredContacts,\n \"selected-ids\": $setup.selectedContactIds,\n keyword: $setup.contactKeyword,\n \"empty-text\": \"暂无可选联系人\",\n \"onUpdate:keyword\": _cache[11] || (_cache[11] = $event => $setup.contactKeyword = $event),\n onToggle: $setup.toggleContact\n }, null, 8 /* PROPS */, [\"contacts\", \"selected-ids\", \"keyword\"])], 64 /* STABLE_FRAGMENT */)) : $setup.activeAction === 'joinGroup' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"label\", _hoisted_14, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"群组ID / 群名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[12] || (_cache[12] = $event => $setup.joinGroupKey = $event),\n autocomplete: \"off\",\n placeholder: \"请输入群组ID或群名称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.joinGroupKey, void 0, {\n trim: true\n }]])])) : $setup.activeAction === 'broadcast' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 3\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"群发内容\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $setup.broadcastText = $event),\n maxlength: \"2000\",\n rows: \"4\",\n placeholder: \"输入要群发的文字\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.broadcastText, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"ContactPicker\"], {\n contacts: $setup.filteredContacts,\n \"selected-ids\": $setup.selectedContactIds,\n keyword: $setup.contactKeyword,\n \"empty-text\": \"暂无可选联系人\",\n \"onUpdate:keyword\": _cache[14] || (_cache[14] = $event => $setup.contactKeyword = $event),\n onToggle: $setup.toggleContact\n }, null, 8 /* PROPS */, [\"contacts\", \"selected-ids\", \"keyword\"])], 64 /* STABLE_FRAGMENT */)) : $setup.activeAction === 'createChannel' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 4\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"频道/公告群名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[15] || (_cache[15] = $event => $setup.channelName = $event),\n maxlength: \"64\",\n autocomplete: \"off\",\n placeholder: \"请输入名称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.channelName, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"公告说明\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $setup.channelAnnouncement = $event),\n maxlength: \"1000\",\n rows: \"3\",\n placeholder: \"可选\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.channelAnnouncement, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"ContactPicker\"], {\n contacts: $setup.filteredContacts,\n \"selected-ids\": $setup.selectedContactIds,\n keyword: $setup.contactKeyword,\n \"empty-text\": \"暂无可选联系人\",\n \"onUpdate:keyword\": _cache[17] || (_cache[17] = $event => $setup.contactKeyword = $event),\n onToggle: $setup.toggleContact\n }, null, 8 /* PROPS */, [\"contacts\", \"selected-ids\", \"keyword\"])], 64 /* STABLE_FRAGMENT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.modalError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.modalError), 1 /* TEXT */)) : $setup.modalInfo ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.modalInfo), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeActionModal\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"primary-inline-action\",\n disabled: $setup.actionBusy || $setup.submitDisabled\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.actionBusy ? '处理中...' : $setup.submitLabel), 9 /* TEXT, PROPS */, _hoisted_18)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"conversation-list\"\n};\nconst _hoisted_2 = {\n class: \"list-header\"\n};\nconst _hoisted_3 = {\n class: \"header-actions action-menu-anchor\"\n};\nconst _hoisted_4 = {\n class: \"search-box\"\n};\nconst _hoisted_5 = {\n class: \"sidebar-scroll\"\n};\nconst _hoisted_6 = [\"onClick\", \"onContextmenu\"];\nconst _hoisted_7 = [\"src\", \"onError\"];\nconst _hoisted_8 = {\n key: 1,\n class: \"conversation-avatar\"\n};\nconst _hoisted_9 = {\n class: \"conversation-copy\"\n};\nconst _hoisted_10 = {\n key: 0,\n class: \"conversation-pin\",\n \"aria-label\": \"已置顶\"\n};\nconst _hoisted_11 = [\"aria-label\"];\nconst _hoisted_12 = {\n key: 1,\n class: \"empty-list\"\n};\nconst _hoisted_13 = {\n key: 2,\n class: \"empty-list\"\n};\nconst _hoisted_14 = {\n key: 0\n};\nconst _hoisted_15 = {\n key: 2\n};\nconst _hoisted_16 = {\n key: 5,\n class: \"form-error\"\n};\nconst _hoisted_17 = {\n key: 6,\n class: \"form-info\"\n};\nconst _hoisted_18 = {\n class: \"modal-actions\"\n};\nconst _hoisted_19 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"aside\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", null, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h2\", null, \"消息\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.conversations.totalUnread) + \" 条未读\", 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"icon-button\",\n title: \"新建会话\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.toggleActionMenu, [\"stop\"])\n }, \"+\"), $setup.actionMenuOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"quick-action-menu\",\n onClick: _cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[0] || (_cache[0] = $event => $setup.openAction('addContact'))\n }, \"添加联系人\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[1] || (_cache[1] = $event => $setup.openAction('createGroup'))\n }, \"新建群组\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[2] || (_cache[2] = $event => $setup.openAction('joinGroup'))\n }, \"加入群组\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[3] || (_cache[3] = $event => $setup.openAction('broadcast'))\n }, \"群发助手\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: _cache[4] || (_cache[4] = $event => $setup.openAction('createChannel'))\n }, \"创建频道/公告群\")])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $setup.searchKeyword = $event),\n placeholder: \"搜索会话、联系人\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.searchKeyword, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_5, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.filteredConversationItems, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"button\", {\n key: item.resultKey,\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"conversation-item\", {\n active: $setup.isListItemActive(item),\n pinned: $setup.isPinned(item)\n }]),\n onClick: $event => $setup.selectListItem(item),\n onContextmenu: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($event => $setup.openConversationMenu($event, item), [\"prevent\"])\n }, [item.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n class: \"conversation-avatar image-avatar\",\n src: item.portrait,\n alt: \"\",\n onError: $event => $setup.useImageProxyFallback($event, item.portrait)\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.avatarText), 1 /* TEXT */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, [$setup.isPinned(item) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_10, \"⌖\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)((0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.title), 1 /* TEXT */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"small\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.subtitle), 1 /* TEXT */)]), Number(item.unread || 0) > 0 ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", {\n key: 2,\n class: \"unread-badge\",\n \"aria-label\": `${item.unread} 条未读消息`\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatUnread(item.unread)), 9 /* TEXT, PROPS */, _hoisted_11)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 42 /* CLASS, PROPS, NEED_HYDRATION */, _hoisted_6);\n }), 128 /* KEYED_FRAGMENT */)), $setup.conversationMenu.item ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"conversation-context-menu\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)({\n left: `${$setup.conversationMenu.x}px`,\n top: `${$setup.conversationMenu.y}px`\n }),\n onClick: _cache[7] || (_cache[7] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"stop\"]))\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: $setup.togglePinned\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.isPinned($setup.conversationMenu.item) ? '取消置顶' : '置顶会话'), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n onClick: $setup.deleteConversation\n }, \"删除会话\")], 4 /* STYLE */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), !$setup.filteredConversationItems.length && $setup.searchKeyword ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_12, _cache[20] || (_cache[20] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"没有匹配结果\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"换个关键词再试试\", -1 /* HOISTED */)]))) : !$setup.conversations.conversations.length && !$setup.conversations.usingDemoData ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_13, _cache[21] || (_cache[21] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"暂无会话\", -1 /* HOISTED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"收到或发起消息后会出现在这里\", -1 /* HOISTED */)]))) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]), $setup.activeAction ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeActionModal, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"form\", {\n class: \"modal-panel conversation-action-panel\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.submitAction, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.actionTitle), 1 /* TEXT */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeActionModal\n }, \"×\")]), $setup.activeAction === 'addContact' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"label\", _hoisted_14, [_cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"用户ID / 手机号 / 用户名\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[8] || (_cache[8] = $event => $setup.addKeyword = $event),\n autocomplete: \"off\",\n placeholder: \"请输入要添加的联系人\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.addKeyword, void 0, {\n trim: true\n }]])])) : $setup.activeAction === 'createGroup' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 1\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"群组名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[9] || (_cache[9] = $event => $setup.groupName = $event),\n maxlength: \"64\",\n autocomplete: \"off\",\n placeholder: \"请输入群组名称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.groupName, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"群说明\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[10] || (_cache[10] = $event => $setup.groupAnnouncement = $event),\n maxlength: \"1000\",\n rows: \"3\",\n placeholder: \"可选\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.groupAnnouncement, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"欢迎词\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[11] || (_cache[11] = $event => $setup.groupWelcomeText = $event),\n maxlength: \"1000\",\n rows: \"3\",\n placeholder: \"群组创建后自动发送\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.groupWelcomeText, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"ContactPicker\"], {\n contacts: $setup.filteredContacts,\n \"selected-ids\": $setup.selectedContactIds,\n keyword: $setup.contactKeyword,\n \"empty-text\": \"暂无可选联系人\",\n \"onUpdate:keyword\": _cache[12] || (_cache[12] = $event => $setup.contactKeyword = $event),\n onToggle: $setup.toggleContact\n }, null, 8 /* PROPS */, [\"contacts\", \"selected-ids\", \"keyword\"])], 64 /* STABLE_FRAGMENT */)) : $setup.activeAction === 'joinGroup' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"label\", _hoisted_15, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"群组ID / 群名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[13] || (_cache[13] = $event => $setup.joinGroupKey = $event),\n autocomplete: \"off\",\n placeholder: \"请输入群组ID或群名称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.joinGroupKey, void 0, {\n trim: true\n }]])])) : $setup.activeAction === 'broadcast' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 3\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"群发内容\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[14] || (_cache[14] = $event => $setup.broadcastText = $event),\n maxlength: \"2000\",\n rows: \"4\",\n placeholder: \"输入要群发的文字\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.broadcastText, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"ContactPicker\"], {\n contacts: $setup.filteredContacts,\n \"selected-ids\": $setup.selectedContactIds,\n keyword: $setup.contactKeyword,\n \"empty-text\": \"暂无可选联系人\",\n \"onUpdate:keyword\": _cache[15] || (_cache[15] = $event => $setup.contactKeyword = $event),\n onToggle: $setup.toggleContact\n }, null, 8 /* PROPS */, [\"contacts\", \"selected-ids\", \"keyword\"])], 64 /* STABLE_FRAGMENT */)) : $setup.activeAction === 'createChannel' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n key: 4\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"频道/公告群名称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[16] || (_cache[16] = $event => $setup.channelName = $event),\n maxlength: \"64\",\n autocomplete: \"off\",\n placeholder: \"请输入名称\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.channelName, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[29] || (_cache[29] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"公告说明\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"textarea\", {\n \"onUpdate:modelValue\": _cache[17] || (_cache[17] = $event => $setup.channelAnnouncement = $event),\n maxlength: \"1000\",\n rows: \"3\",\n placeholder: \"可选\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.channelAnnouncement, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)($setup[\"ContactPicker\"], {\n contacts: $setup.filteredContacts,\n \"selected-ids\": $setup.selectedContactIds,\n keyword: $setup.contactKeyword,\n \"empty-text\": \"暂无可选联系人\",\n \"onUpdate:keyword\": _cache[18] || (_cache[18] = $event => $setup.contactKeyword = $event),\n onToggle: $setup.toggleContact\n }, null, 8 /* PROPS */, [\"contacts\", \"selected-ids\", \"keyword\"])], 64 /* STABLE_FRAGMENT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.modalError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.modalError), 1 /* TEXT */)) : $setup.modalInfo ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"p\", _hoisted_17, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.modalInfo), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeActionModal\n }, \"取消\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"primary-inline-action\",\n disabled: $setup.actionBusy || $setup.submitDisabled\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.actionBusy ? '处理中...' : $setup.submitLabel), 9 /* TEXT, PROPS */, _hoisted_19)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)]);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
/***/ }),
@@ -269,7 +269,18 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"navigation-rail\"\n};\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = {\n key: 1\n};\nconst _hoisted_4 = {\n class: \"settings-panel\"\n};\nconst _hoisted_5 = {\n class: \"settings-layout\"\n};\nconst _hoisted_6 = {\n class: \"settings-menu\",\n \"aria-label\": \"设置菜单\"\n};\nconst _hoisted_7 = [\"onClick\"];\nconst _hoisted_8 = {\n key: 0\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_10 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_11 = [\"disabled\"];\nconst _hoisted_12 = {\n key: 1,\n class: \"settings-placeholder\"\n};\nconst _hoisted_13 = {\n class: \"profile-avatar-field\"\n};\nconst _hoisted_14 = [\"src\"];\nconst _hoisted_15 = {\n key: 1\n};\nconst _hoisted_16 = [\"value\"];\nconst _hoisted_17 = {\n class: \"modal-actions\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_19 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_20 = [\"disabled\"];\nconst _hoisted_21 = {\n class: \"avatar-preview-dialog\"\n};\nconst _hoisted_22 = {\n class: \"avatar-preview-actions\"\n};\nconst _hoisted_23 = [\"src\"];\nconst _hoisted_24 = {\n class: \"modal-panel avatar-cropper-panel\"\n};\nconst _hoisted_25 = {\n class: \"avatar-cropper-header-actions\"\n};\nconst _hoisted_26 = [\"disabled\"];\nconst _hoisted_27 = {\n class: \"avatar-cropper-layout\"\n};\nconst _hoisted_28 = {\n ref: \"cropperCanvas\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"avatar-cropper-placeholder\"\n};\nconst _hoisted_30 = {\n class: \"avatar-cropper-controls\"\n};\nconst _hoisted_31 = {\n class: \"avatar-cropper-tools\"\n};\nconst _hoisted_32 = {\n class: \"avatar-cropper-preview\"\n};\nconst _hoisted_33 = {\n ref: \"cropperPreviewCanvas\"\n};\nconst _hoisted_34 = {\n key: 0,\n class: \"inline-save-status error\"\n};\nconst _hoisted_35 = [\"disabled\"];\nconst _hoisted_36 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"aside\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"rail-avatar rail-avatar-button\",\n title: \"编辑个人资料\",\n onClick: $setup.openProfileEditor\n }, [$setup.session.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n src: $setup.session.portrait,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.initials), 1 /* TEXT */))]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"rail-button\", {\n active: $setup.navigation.section === 'messages'\n }]),\n title: \"消息\",\n onClick: _cache[0] || (_cache[0] = (...args) => $setup.navigation.showMessages && $setup.navigation.showMessages(...args))\n }, \"💬\", 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"rail-button\", {\n active: $setup.navigation.section === 'contacts'\n }]),\n title: \"联系人\",\n onClick: $setup.showContacts\n }, \"👥\", 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"rail-button\", {\n active: $setup.navigation.section === 'favorites'\n }]),\n title: \"收藏\",\n onClick: _cache[1] || (_cache[1] = (...args) => $setup.navigation.showFavorites && $setup.navigation.showFavorites(...args))\n }, \"☆\", 2 /* CLASS */), _cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"rail-spacer\"\n }, null, -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"rail-button\",\n title: \"设置\",\n \"aria-label\": \"设置\",\n onClick: $setup.openSettings\n }, _cache[13] || (_cache[13] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"svg\", {\n viewBox: \"0 0 24 24\",\n \"aria-hidden\": \"true\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"path\", {\n d: \"M12 8.2a3.8 3.8 0 1 1 0 7.6 3.8 3.8 0 0 1 0-7.6Z\"\n }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"path\", {\n d: \"M19.4 13.6a7.8 7.8 0 0 0 .1-1.6l1.7-1.3-1.7-3-2 .8a8 8 0 0 0-1.4-.8L15.8 5h-3.5l-.3 2.1a8 8 0 0 0-1.5.8l-1.9-.8-1.8 3 1.7 1.3a7.8 7.8 0 0 0 0 1.6l-1.7 1.3 1.8 3 1.9-.8c.5.4 1 .7 1.5.8l.3 2.1h3.5l.3-2.1c.5-.2 1-.5 1.4-.8l2 .8 1.7-3-1.8-1.3Z\"\n })], -1 /* HOISTED */)])), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"rail-button rail-logout-button\",\n title: \"退出登录\",\n \"aria-label\": \"退出登录\",\n onClick: $setup.logout\n }, _cache[14] || (_cache[14] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode)(\" \", 1)]))]), $setup.settingsOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"modal-backdrop settings-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeSettings, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"section\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"设置\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeSettings\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"nav\", _hoisted_6, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.settingsItems, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n key: item.key,\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)({\n active: $setup.settingsSection === item.key\n }),\n onClick: $event => $setup.selectSettingsSection(item.key)\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.label), 1 /* TEXT */), item.key !== 'password' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"small\", _hoisted_8, \"稍后开放\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 10 /* CLASS, PROPS */, _hoisted_7);\n }), 64 /* STABLE_FRAGMENT */))]), $setup.settingsSection === 'password' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"form\", {\n key: 0,\n class: \"settings-password-form\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.savePassword, [\"prevent\"])\n }, [_cache[20] || (_cache[20] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h3\", null, \"更改密码\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"当前密码\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[2] || (_cache[2] = $event => $setup.passwordDraft.oldPassword = $event),\n type: \"password\",\n autocomplete: \"current-password\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.passwordDraft.oldPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"新密码\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $setup.passwordDraft.newPassword = $event),\n type: \"password\",\n autocomplete: \"new-password\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.passwordDraft.newPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"确认新密码\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $setup.passwordDraft.confirmPassword = $event),\n type: \"password\",\n autocomplete: \"new-password\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.passwordDraft.confirmPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"footer\", null, [$setup.settingsNotice ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.settingsNotice), 1 /* TEXT */)) : $setup.settingsError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.settingsError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"submit\",\n class: \"primary-inline-action\",\n disabled: $setup.passwordSaving\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.passwordSaving ? '保存中...' : '保存密码'), 9 /* TEXT, PROPS */, _hoisted_11)])], 32 /* NEED_HYDRATION */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"section\", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h3\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.activeSettingsItem?.label || '设置'), 1 /* TEXT */), _cache[21] || (_cache[21] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, \"该功能稍后开放。\", -1 /* HOISTED */))]))])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.profileOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 1,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeProfileEditor, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"form\", {\n class: \"modal-panel profile-edit-panel\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.saveProfile, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"个人资料\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeProfileEditor\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"profile-avatar-preview\", {\n clickable: $setup.currentAvatarUrl\n }]),\n title: \"预览头像\",\n onClick: $setup.openAvatarPreview\n }, [$setup.currentAvatarUrl ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n src: $setup.currentAvatarUrl,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_14)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.initials), 1 /* TEXT */))], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action profile-avatar-change-button\",\n onClick: $setup.choosePortraitFile\n }, \"更换头像\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n ref: \"portraitInput\",\n type: \"file\",\n accept: \"image/*\",\n onChange: $setup.selectPortrait\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $setup.profileDraft.displayName = $event),\n maxlength: \"64\",\n autocomplete: \"off\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.profileDraft.displayName, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"用户ID\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n value: $setup.session.userId,\n readonly: \"\"\n }, null, 8 /* PROPS */, _hoisted_16)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeProfileEditor\n }, \"取消\"), $setup.profileNotice ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_18, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.profileNotice), 1 /* TEXT */)) : $setup.profileError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_19, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.profileError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"primary-inline-action\",\n disabled: $setup.profileSaving || !$setup.profileDraft.displayName\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.profileSaving ? '保存中...' : '保存'), 9 /* TEXT, PROPS */, _hoisted_20)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.avatarPreviewViewer.open ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 2,\n class: \"modal-backdrop avatar-preview-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeAvatarPreview, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"section\", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"头像预览\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"缩小\",\n onClick: _cache[6] || (_cache[6] = $event => $setup.zoomAvatarPreview(1 / 1.16))\n }, \"−\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"放大\",\n onClick: _cache[7] || (_cache[7] = $event => $setup.zoomAvatarPreview(1.16))\n }, \"+\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"还原\",\n onClick: $setup.resetAvatarPreview\n }, \"1:1\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeAvatarPreview\n }, \"×\")])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"avatar-preview-stage\", {\n dragging: $setup.avatarPreviewViewer.dragging\n }]),\n onWheel: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleAvatarPreviewWheel, [\"prevent\"]),\n onPointerdown: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.startAvatarPreviewDrag, [\"prevent\"]),\n onPointermove: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.moveAvatarPreviewDrag, [\"prevent\"]),\n onPointerup: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.stopAvatarPreviewDrag, [\"prevent\"]),\n onPointerleave: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.stopAvatarPreviewDrag, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n src: $setup.avatarPreviewViewer.url,\n alt: \"头像预览\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($setup.avatarPreviewStyle),\n draggable: \"false\"\n }, null, 12 /* STYLE, PROPS */, _hoisted_23)], 34 /* CLASS, NEED_HYDRATION */)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.avatarCropper.open ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 3,\n class: \"modal-backdrop avatar-cropper-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeAvatarCropper, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"section\", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"头像预裁切\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.avatarCropper.busy,\n onClick: $setup.choosePortraitFile\n }, \"上传\", 8 /* PROPS */, _hoisted_26), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeAvatarCropper\n }, \"×\")])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_27, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"avatar-cropper-stage\", {\n dragging: $setup.avatarCropper.dragging\n }]),\n onWheel: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleCropperWheel, [\"prevent\"]),\n onPointerdown: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.startCropperDrag, [\"prevent\"]),\n onPointermove: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.moveCropperDrag, [\"prevent\"]),\n onPointerup: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.stopCropperDrag, [\"prevent\"]),\n onPointerleave: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.stopCropperDrag, [\"prevent\"]),\n onDragover: _cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"prevent\"])),\n onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.dropPortrait, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"canvas\", _hoisted_28, null, 512 /* NEED_PATCH */), _cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"avatar-cropper-mask\",\n \"aria-hidden\": \"true\"\n }, null, -1 /* HOISTED */)), _cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"avatar-cropper-box\",\n \"aria-hidden\": \"true\"\n }, null, -1 /* HOISTED */)), !$setup.avatarCropper.loaded ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_29, \"图片加载中\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 34 /* CLASS, NEED_HYDRATION */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"aside\", _hoisted_30, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_31, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"左旋90度\",\n onClick: _cache[9] || (_cache[9] = $event => $setup.rotateCropper(-90))\n }, \"↶90°\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"右旋90度\",\n onClick: _cache[10] || (_cache[10] = $event => $setup.rotateCropper(90))\n }, \"↷90°\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"放大\",\n onClick: _cache[11] || (_cache[11] = $event => $setup.zoomCropper(1.12))\n }, \"+\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"缩小\",\n onClick: _cache[12] || (_cache[12] = $event => $setup.zoomCropper(1 / 1.12))\n }, \"−\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"重置\",\n onClick: $setup.resetCropperTransform\n }, \"重置\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_32, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"canvas\", _hoisted_33, null, 512 /* NEED_PATCH */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"footer\", null, [$setup.avatarCropper.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_34, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.avatarCropper.error), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n disabled: $setup.avatarCropper.busy,\n onClick: $setup.closeAvatarCropper\n }, \"取消\", 8 /* PROPS */, _hoisted_35), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.avatarCropper.busy || !$setup.avatarCropper.loaded,\n onClick: $setup.confirmAvatarCrop\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.avatarCropper.busy ? '处理中...' : '确认裁切'), 9 /* TEXT, PROPS */, _hoisted_36)])])])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 64 /* STABLE_FRAGMENT */);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ render: function() { return /* binding */ render; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nconst _hoisted_1 = {\n class: \"navigation-rail\"\n};\nconst _hoisted_2 = [\"src\"];\nconst _hoisted_3 = {\n key: 1\n};\nconst _hoisted_4 = {\n class: \"settings-panel\"\n};\nconst _hoisted_5 = {\n class: \"settings-layout\"\n};\nconst _hoisted_6 = {\n class: \"settings-menu\",\n \"aria-label\": \"设置菜单\"\n};\nconst _hoisted_7 = [\"onClick\"];\nconst _hoisted_8 = {\n key: 0\n};\nconst _hoisted_9 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_10 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_11 = [\"disabled\"];\nconst _hoisted_12 = {\n key: 1,\n class: \"settings-placeholder\"\n};\nconst _hoisted_13 = {\n class: \"profile-avatar-field\"\n};\nconst _hoisted_14 = [\"src\"];\nconst _hoisted_15 = {\n key: 1\n};\nconst _hoisted_16 = [\"value\"];\nconst _hoisted_17 = {\n class: \"modal-actions\"\n};\nconst _hoisted_18 = {\n key: 0,\n class: \"inline-save-status\"\n};\nconst _hoisted_19 = {\n key: 1,\n class: \"inline-save-status error\"\n};\nconst _hoisted_20 = [\"disabled\"];\nconst _hoisted_21 = {\n class: \"avatar-preview-dialog\"\n};\nconst _hoisted_22 = {\n class: \"avatar-preview-actions\"\n};\nconst _hoisted_23 = [\"src\"];\nconst _hoisted_24 = {\n class: \"modal-panel avatar-cropper-panel\"\n};\nconst _hoisted_25 = {\n class: \"avatar-cropper-header-actions\"\n};\nconst _hoisted_26 = [\"disabled\"];\nconst _hoisted_27 = {\n class: \"avatar-cropper-layout\"\n};\nconst _hoisted_28 = {\n ref: \"cropperCanvas\"\n};\nconst _hoisted_29 = {\n key: 0,\n class: \"avatar-cropper-placeholder\"\n};\nconst _hoisted_30 = {\n class: \"avatar-cropper-controls\"\n};\nconst _hoisted_31 = {\n class: \"avatar-cropper-tools\"\n};\nconst _hoisted_32 = {\n class: \"avatar-cropper-preview\"\n};\nconst _hoisted_33 = {\n ref: \"cropperPreviewCanvas\"\n};\nconst _hoisted_34 = {\n key: 0,\n class: \"inline-save-status error\"\n};\nconst _hoisted_35 = [\"disabled\"];\nconst _hoisted_36 = [\"disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"aside\", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"rail-avatar rail-avatar-button\",\n title: \"编辑个人资料\",\n onClick: $setup.openProfileEditor\n }, [$setup.session.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n src: $setup.session.portrait,\n alt: \"\",\n onError: _cache[0] || (_cache[0] = $event => $setup.useImageProxyFallback($event, $setup.session.portrait))\n }, null, 40 /* PROPS, NEED_HYDRATION */, _hoisted_2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.initials), 1 /* TEXT */))]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"rail-button\", {\n active: $setup.navigation.section === 'messages'\n }]),\n title: \"消息\",\n onClick: _cache[1] || (_cache[1] = (...args) => $setup.navigation.showMessages && $setup.navigation.showMessages(...args))\n }, \"💬\", 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"rail-button\", {\n active: $setup.navigation.section === 'contacts'\n }]),\n title: \"联系人\",\n onClick: $setup.showContacts\n }, \"👥\", 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"rail-button\", {\n active: $setup.navigation.section === 'favorites'\n }]),\n title: \"收藏\",\n onClick: _cache[2] || (_cache[2] = (...args) => $setup.navigation.showFavorites && $setup.navigation.showFavorites(...args))\n }, \"☆\", 2 /* CLASS */), _cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"rail-spacer\"\n }, null, -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"rail-button\",\n title: \"设置\",\n \"aria-label\": \"设置\",\n onClick: $setup.openSettings\n }, _cache[14] || (_cache[14] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"svg\", {\n viewBox: \"0 0 24 24\",\n \"aria-hidden\": \"true\"\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"path\", {\n d: \"M12 8.2a3.8 3.8 0 1 1 0 7.6 3.8 3.8 0 0 1 0-7.6Z\"\n }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"path\", {\n d: \"M19.4 13.6a7.8 7.8 0 0 0 .1-1.6l1.7-1.3-1.7-3-2 .8a8 8 0 0 0-1.4-.8L15.8 5h-3.5l-.3 2.1a8 8 0 0 0-1.5.8l-1.9-.8-1.8 3 1.7 1.3a7.8 7.8 0 0 0 0 1.6l-1.7 1.3 1.8 3 1.9-.8c.5.4 1 .7 1.5.8l.3 2.1h3.5l.3-2.1c.5-.2 1-.5 1.4-.8l2 .8 1.7-3-1.8-1.3Z\"\n })], -1 /* HOISTED */)])), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"rail-button rail-logout-button\",\n title: \"退出登录\",\n \"aria-label\": \"退出登录\",\n onClick: $setup.logout\n }, _cache[15] || (_cache[15] = [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createStaticVNode)(\" \", 1)]))]), $setup.settingsOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 0,\n class: \"modal-backdrop settings-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeSettings, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"section\", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"设置\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeSettings\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_5, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"nav\", _hoisted_6, [((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.settingsItems, item => {\n return (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n key: item.key,\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)({\n active: $setup.settingsSection === item.key\n }),\n onClick: $event => $setup.selectSettingsSection(item.key)\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(item.label), 1 /* TEXT */), item.key !== 'password' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"small\", _hoisted_8, \"稍后开放\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 10 /* CLASS, PROPS */, _hoisted_7);\n }), 64 /* STABLE_FRAGMENT */))]), $setup.settingsSection === 'password' ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"form\", {\n key: 0,\n class: \"settings-password-form\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.savePassword, [\"prevent\"])\n }, [_cache[21] || (_cache[21] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h3\", null, \"更改密码\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"当前密码\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[3] || (_cache[3] = $event => $setup.passwordDraft.oldPassword = $event),\n type: \"password\",\n autocomplete: \"current-password\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.passwordDraft.oldPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"新密码\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[4] || (_cache[4] = $event => $setup.passwordDraft.newPassword = $event),\n type: \"password\",\n autocomplete: \"new-password\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.passwordDraft.newPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[20] || (_cache[20] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"确认新密码\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[5] || (_cache[5] = $event => $setup.passwordDraft.confirmPassword = $event),\n type: \"password\",\n autocomplete: \"new-password\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.passwordDraft.confirmPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"footer\", null, [$setup.settingsNotice ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.settingsNotice), 1 /* TEXT */)) : $setup.settingsError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.settingsError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"submit\",\n class: \"primary-inline-action\",\n disabled: $setup.passwordSaving\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.passwordSaving ? '保存中...' : '保存密码'), 9 /* TEXT, PROPS */, _hoisted_11)])], 32 /* NEED_HYDRATION */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"section\", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"h3\", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.activeSettingsItem?.label || '设置'), 1 /* TEXT */), _cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"p\", null, \"该功能稍后开放。\", -1 /* HOISTED */))]))])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.profileOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 1,\n class: \"modal-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeProfileEditor, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"form\", {\n class: \"modal-panel profile-edit-panel\",\n onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.saveProfile, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"个人资料\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeProfileEditor\n }, \"×\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"profile-avatar-preview\", {\n clickable: $setup.currentAvatarUrl\n }]),\n title: \"预览头像\",\n onClick: $setup.openAvatarPreview\n }, [$setup.currentAvatarUrl ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"img\", {\n key: 0,\n src: $setup.currentAvatarUrl,\n alt: \"\"\n }, null, 8 /* PROPS */, _hoisted_14)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_15, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.initials), 1 /* TEXT */))], 2 /* CLASS */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action profile-avatar-change-button\",\n onClick: $setup.choosePortraitFile\n }, \"更换头像\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n ref: \"portraitInput\",\n type: \"file\",\n accept: \"image/*\",\n onChange: $setup.selectPortrait\n }, null, 544 /* NEED_HYDRATION, NEED_PATCH */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"昵称\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n \"onUpdate:modelValue\": _cache[6] || (_cache[6] = $event => $setup.profileDraft.displayName = $event),\n maxlength: \"64\",\n autocomplete: \"off\"\n }, null, 512 /* NEED_PATCH */), [[vue__WEBPACK_IMPORTED_MODULE_0__.vModelText, $setup.profileDraft.displayName, void 0, {\n trim: true\n }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"label\", null, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"span\", null, \"用户ID\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"input\", {\n value: $setup.session.userId,\n readonly: \"\"\n }, null, 8 /* PROPS */, _hoisted_16)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n onClick: $setup.closeProfileEditor\n }, \"取消\"), $setup.profileNotice ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_18, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.profileNotice), 1 /* TEXT */)) : $setup.profileError ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_19, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.profileError), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n class: \"primary-inline-action\",\n disabled: $setup.profileSaving || !$setup.profileDraft.displayName\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.profileSaving ? '保存中...' : '保存'), 9 /* TEXT, PROPS */, _hoisted_20)])], 32 /* NEED_HYDRATION */)])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.avatarPreviewViewer.open ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 2,\n class: \"modal-backdrop avatar-preview-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeAvatarPreview, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"section\", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"头像预览\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"缩小\",\n onClick: _cache[7] || (_cache[7] = $event => $setup.zoomAvatarPreview(1 / 1.16))\n }, \"−\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"放大\",\n onClick: _cache[8] || (_cache[8] = $event => $setup.zoomAvatarPreview(1.16))\n }, \"+\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"还原\",\n onClick: $setup.resetAvatarPreview\n }, \"1:1\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeAvatarPreview\n }, \"×\")])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"avatar-preview-stage\", {\n dragging: $setup.avatarPreviewViewer.dragging\n }]),\n onWheel: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleAvatarPreviewWheel, [\"prevent\"]),\n onPointerdown: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.startAvatarPreviewDrag, [\"prevent\"]),\n onPointermove: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.moveAvatarPreviewDrag, [\"prevent\"]),\n onPointerup: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.stopAvatarPreviewDrag, [\"prevent\"]),\n onPointerleave: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.stopAvatarPreviewDrag, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"img\", {\n src: $setup.avatarPreviewViewer.url,\n alt: \"头像预览\",\n style: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeStyle)($setup.avatarPreviewStyle),\n draggable: \"false\"\n }, null, 12 /* STYLE, PROPS */, _hoisted_23)], 34 /* CLASS, NEED_HYDRATION */)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), $setup.avatarCropper.open ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", {\n key: 3,\n class: \"modal-backdrop avatar-cropper-backdrop\",\n onClick: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.closeAvatarCropper, [\"self\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"section\", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"header\", null, [_cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"strong\", null, \"头像预裁切\", -1 /* HOISTED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.avatarCropper.busy,\n onClick: $setup.choosePortraitFile\n }, \"上传\", 8 /* PROPS */, _hoisted_26), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"icon-button\",\n title: \"关闭\",\n onClick: $setup.closeAvatarCropper\n }, \"×\")])]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_27, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)([\"avatar-cropper-stage\", {\n dragging: $setup.avatarCropper.dragging\n }]),\n onWheel: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.handleCropperWheel, [\"prevent\"]),\n onPointerdown: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.startCropperDrag, [\"prevent\"]),\n onPointermove: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.moveCropperDrag, [\"prevent\"]),\n onPointerup: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.stopCropperDrag, [\"prevent\"]),\n onPointerleave: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.stopCropperDrag, [\"prevent\"]),\n onDragover: _cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)(() => {}, [\"prevent\"])),\n onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withModifiers)($setup.dropPortrait, [\"prevent\"])\n }, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"canvas\", _hoisted_28, null, 512 /* NEED_PATCH */), _cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"avatar-cropper-mask\",\n \"aria-hidden\": \"true\"\n }, null, -1 /* HOISTED */)), _cache[29] || (_cache[29] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", {\n class: \"avatar-cropper-box\",\n \"aria-hidden\": \"true\"\n }, null, -1 /* HOISTED */)), !$setup.avatarCropper.loaded ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"div\", _hoisted_29, \"图片加载中\")) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 34 /* CLASS, NEED_HYDRATION */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"aside\", _hoisted_30, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_31, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"左旋90度\",\n onClick: _cache[10] || (_cache[10] = $event => $setup.rotateCropper(-90))\n }, \"↶90°\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"右旋90度\",\n onClick: _cache[11] || (_cache[11] = $event => $setup.rotateCropper(90))\n }, \"↷90°\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"放大\",\n onClick: _cache[12] || (_cache[12] = $event => $setup.zoomCropper(1.12))\n }, \"+\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"缩小\",\n onClick: _cache[13] || (_cache[13] = $event => $setup.zoomCropper(1 / 1.12))\n }, \"−\"), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n title: \"重置\",\n onClick: $setup.resetCropperTransform\n }, \"重置\")]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"div\", _hoisted_32, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"canvas\", _hoisted_33, null, 512 /* NEED_PATCH */)]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"footer\", null, [$setup.avatarCropper.error ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(\"span\", _hoisted_34, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.avatarCropper.error), 1 /* TEXT */)) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"ghost-inline-action\",\n disabled: $setup.avatarCropper.busy,\n onClick: $setup.closeAvatarCropper\n }, \"取消\", 8 /* PROPS */, _hoisted_35), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)(\"button\", {\n type: \"button\",\n class: \"primary-inline-action\",\n disabled: $setup.avatarCropper.busy || !$setup.avatarCropper.loaded,\n onClick: $setup.confirmAvatarCrop\n }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.avatarCropper.busy ? '处理中...' : '确认裁切'), 9 /* TEXT, PROPS */, _hoisted_36)])])])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(\"v-if\", true)], 64 /* STABLE_FRAGMENT */);\n}\n\n//# sourceURL=webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use%5B0%5D!./node_modules/vue-loader/dist/templateLoader.js??ruleSet%5B1%5D.rules%5B3%5D!./node_modules/vue-loader/dist/index.js??ruleSet%5B0%5D.use%5B0%5D\n}");
+
+/***/ }),
+
+/***/ "./src/composables/useAutoDismiss.js":
+/*!*******************************************!*\
+ !*** ./src/composables/useAutoDismiss.js ***!
+ \*******************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useAutoDismiss: function() { return /* binding */ useAutoDismiss; }\n/* harmony export */ });\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ \"./node_modules/vue/dist/vue.runtime.esm-bundler.js\");\n\nfunction useAutoDismiss(source, clear, delay = 3000) {\n let timer = null;\n (0,vue__WEBPACK_IMPORTED_MODULE_0__.watch)(source, value => {\n window.clearTimeout(timer);\n timer = null;\n if (!value) return;\n const currentValue = value;\n timer = window.setTimeout(() => {\n clear(currentValue);\n timer = null;\n }, delay);\n }, {\n flush: 'post'\n });\n (0,vue__WEBPACK_IMPORTED_MODULE_0__.onBeforeUnmount)(() => window.clearTimeout(timer));\n}\n\n//# sourceURL=webpack://jc-web-im/./src/composables/useAutoDismiss.js?\n}");
/***/ }),
@@ -324,7 +335,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HttpImClient: function() { return /* binding */ HttpImClient; },\n/* harmony export */ imClient: function() { return /* binding */ imClient; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.iterator.some.js */ \"./node_modules/core-js/modules/es.iterator.some.js\");\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert.js */ \"./node_modules/core-js/modules/es.map.get-or-insert.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert-computed.js */ \"./node_modules/core-js/modules/es.map.get-or-insert-computed.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! axios */ \"./node_modules/axios/lib/axios.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/config */ \"./src/config.js\");\n/* harmony import */ var _services_appServerClient__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/services/appServerClient */ \"./src/services/appServerClient.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst LOCAL_MESSAGE_STORAGE_KEY = 'qmt-web-im-local-messages-v2';\nconst LOCAL_HIDDEN_MESSAGE_STORAGE_KEY = 'qmt-web-im-hidden-messages-v1';\nconst LOCAL_RECALLED_MESSAGE_STORAGE_KEY = 'qmt-web-im-recalled-messages-v1';\nfunction scopedStorageKey(baseKey, userId = '') {\n const scope = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer || ''}:${userId || 'anonymous'}`;\n return `${baseKey}:${encodeURIComponent(scope)}`;\n}\nfunction randomId() {\n if (window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID().replaceAll('-', '');\n }\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\n}\nfunction readLocalMessages(userId) {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId)) || '{}');\n } catch (error) {\n return {};\n }\n}\nfunction readMessageSet(storageKey, userId) {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(storageKey, userId)) || '{}');\n } catch (error) {\n return {};\n }\n}\nfunction writeMessageSet(storageKey, messagesByConversation, userId) {\n localStorage.setItem(scopedStorageKey(storageKey, userId), JSON.stringify(messagesByConversation));\n}\nfunction messageKeys(message) {\n return [message?.id, message?.messageUid].filter(Boolean).map(value => String(value));\n}\nfunction hasStoredMessage(storageKey, conversationId, message, userId) {\n const stored = readMessageSet(storageKey, userId);\n const ids = new Set(stored[conversationId] || []);\n return messageKeys(message).some(id => ids.has(id));\n}\nfunction storeMessageKeys(storageKey, conversationId, messages, userId) {\n const stored = readMessageSet(storageKey, userId);\n const ids = new Set(stored[conversationId] || []);\n messages.forEach(message => {\n messageKeys(message).forEach(id => ids.add(id));\n });\n stored[conversationId] = Array.from(ids);\n writeMessageSet(storageKey, stored, userId);\n}\nfunction withRecalledState(message) {\n return {\n ...message,\n status: 'recalled',\n deliveryStatus: '',\n recalled: true,\n recallStatus: '已撤回'\n };\n}\nfunction applyLocalMessageState(conversationId, messages, userId) {\n return messages.filter(message => !hasStoredMessage(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversationId, message, userId)).map(message => {\n const isRecalled = Boolean(message.recalled) || message.status === 'recalled' || hasStoredMessage(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversationId, message, userId);\n if (!isRecalled) {\n return message;\n }\n return withRecalledState(message);\n });\n}\nfunction writeLocalMessages(messagesByConversation, userId) {\n localStorage.setItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId), JSON.stringify(messagesByConversation));\n}\nfunction saveLocalMessage(message, userId) {\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[message.conversationId] = messagesByConversation[message.conversationId] || [];\n const index = messagesByConversation[message.conversationId].findIndex(item => item.id === message.id);\n if (index >= 0) {\n messagesByConversation[message.conversationId].splice(index, 1, message);\n } else {\n messagesByConversation[message.conversationId].push(message);\n }\n writeLocalMessages(messagesByConversation, userId);\n}\nfunction mergeSyncedMessages(localMessages, remoteMessages, conversationId, userId) {\n const visibleLocalMessages = applyLocalMessageState(conversationId, localMessages, userId);\n const localByKey = new Map();\n visibleLocalMessages.forEach(message => {\n messageKeys(message).forEach(key => {\n if (!localByKey.has(key)) {\n localByKey.set(key, message);\n }\n });\n });\n const visibleRemoteMessages = applyLocalMessageState(conversationId, remoteMessages, userId).map(remoteMessage => {\n if (!remoteMessage.recalled || String(remoteMessage.text || '').trim()) {\n return remoteMessage;\n }\n const localMessage = messageKeys(remoteMessage).map(key => localByKey.get(key)).find(message => message?.text && message.text !== '你撤回了一条消息');\n return localMessage ? {\n ...remoteMessage,\n text: localMessage.text\n } : remoteMessage;\n });\n const remoteKeys = new Set();\n visibleRemoteMessages.forEach(message => {\n messageKeys(message).forEach(key => remoteKeys.add(key));\n });\n const now = Date.now();\n function hasRemoteMatch(localMessage) {\n if (localMessage.messageUid && remoteKeys.has(localMessage.messageUid)) {\n return true;\n }\n return visibleRemoteMessages.some(remoteMessage => {\n return remoteMessage.direction === localMessage.direction && remoteMessage.text === localMessage.text && Math.abs(Number(remoteMessage.timestamp || 0) - Number(localMessage.timestamp || 0)) < 15000;\n });\n }\n const pendingLocalMessages = visibleLocalMessages.filter(message => {\n if (message.status === 'recalled' || message.recalled) {\n return message.direction === 'out' && !hasRemoteMatch(message);\n }\n if (message.direction !== 'out') {\n return false;\n }\n if (message.status === 'sent' && message.messageUid) {\n return !hasRemoteMatch(message);\n }\n if (message.status === 'sent') {\n return !hasRemoteMatch(message) && now - Number(message.timestamp || 0) < 30000;\n }\n return message.status === 'sending' || message.status === 'failed';\n });\n return [...visibleRemoteMessages, ...pendingLocalMessages].sort((a, b) => {\n return Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0);\n });\n}\nfunction getTitle(value, fallback) {\n return value || fallback || '';\n}\nfunction getUniqueEquipment(mobile, fallback) {\n const allowedDevices = {\n '18301902119': '67072d37062c4f31b1165073552933ba',\n '18301902116': '1777479418113eeea8e236edce',\n '18301902118': 'de89fb2f2a61480a8c381f6c16e28bd8',\n '18301902117': 'd117f480faa64145b6162107b1b49617'\n };\n return allowedDevices[mobile] || localStorage.getItem('uniqueEquipment') || fallback;\n}\nfunction canUseLocalLoginFallback(response) {\n const message = response.data?.message || '';\n return true && message.includes('允许此设备登录');\n}\nclass HttpImClient {\n constructor() {\n this.listeners = new Map();\n this.connected = false;\n this.currentUser = null;\n }\n getClientId() {\n let clientId = localStorage.getItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.clientIdStorageKey);\n if (!clientId) {\n clientId = randomId();\n localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.clientIdStorageKey, clientId);\n }\n return clientId;\n }\n restoreClientId(clientId) {\n if (clientId) {\n localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.clientIdStorageKey, clientId);\n }\n }\n getSdkVersion() {\n return 'HTTP';\n }\n async ensureSdk() {\n return true;\n }\n async loginWithPassword(mobile, password) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/login_pwd`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, {\n mobile,\n password,\n platform: _config__WEBPACK_IMPORTED_MODULE_18__.appConfig.platform,\n clientId: this.getClientId()\n }, {\n withCredentials: false\n });\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n if (canUseLocalLoginFallback(response)) {\n return {\n userId: mobile,\n token: `local-device-pending-${Date.now()}`,\n displayName: mobile,\n localOnly: true\n };\n }\n throw new Error(response.data?.message || '登录失败');\n }\n return response.data.result;\n }\n async requestAuthCode(mobile) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(`${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/send_code`, {\n mobile\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '验证码发送失败');\n }\n return response.data.result;\n }\n async loginWithCode(mobile, code) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/login`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, {\n mobile,\n code,\n platform: _config__WEBPACK_IMPORTED_MODULE_18__.appConfig.platform,\n clientId: this.getClientId()\n }, {\n withCredentials: false\n });\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '登录失败');\n }\n return response.data.result;\n }\n async createPcSession(userId = '') {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(`${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/pc_session`, {\n flag: 1,\n device_name: 'Web IM',\n userId,\n clientId: this.getClientId(),\n platform: _config__WEBPACK_IMPORTED_MODULE_18__.appConfig.platform\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '二维码登录会话创建失败');\n }\n return response.data.result || {};\n }\n async loginWithPcSession(token) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/session_login/${encodeURIComponent(token)}`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, null, {\n withCredentials: false\n });\n this.persistAppToken(url, response);\n const data = response.data || {};\n if ([0, 8, 9, 10, 18].includes(Number(data.code))) {\n return data;\n }\n throw new Error(data.message || '扫码登录失败');\n }\n async registerWithPhone(mobile, code) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/register`;\n const deviceId = getUniqueEquipment(mobile, this.getClientId());\n try {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, {\n mobile,\n code,\n platform: _config__WEBPACK_IMPORTED_MODULE_18__.appConfig.platform,\n clientId: deviceId,\n uniqueEquipment: deviceId\n }, {\n withCredentials: false\n });\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '注册失败');\n }\n return response.data.result;\n } catch (error) {\n const status = error.response?.status;\n if (status === 404 || status === 405) {\n return this.loginWithCode(mobile, code);\n }\n throw error;\n }\n }\n connect(userId, token) {\n this.currentUser = {\n userId,\n token\n };\n this.connected = true;\n this.emit('connectionStatusChanged', {\n connected: true,\n statusText: '已连接'\n });\n this.refreshConversationList();\n }\n disconnect() {\n this.connected = false;\n this.currentUser = null;\n this.emit('connectionStatusChanged', {\n connected: false,\n statusText: '未连接'\n });\n }\n getConversationList() {\n return [];\n }\n refreshConversationList() {\n const conversations = this.getConversationList();\n if (conversations.length) {\n this.emit('conversationsChanged', conversations);\n }\n if (this.currentUser?.userId) {\n this.fetchRemoteConversations().then(remoteConversations => {\n this.emit('conversationsChanged', remoteConversations);\n }).catch(() => {});\n }\n return conversations;\n }\n async fetchRemoteConversations(limit = 50) {\n if (!this.currentUser?.userId) {\n return [];\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messagesApi, {\n userId: this.currentUser.userId,\n limit\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '会话同步失败');\n }\n return (response.data?.result?.conversations || []).map(conversation => ({\n ...conversation,\n updatedAt: Number(conversation.updatedAt || Date.now()),\n avatarText: conversation.avatarText || String(conversation.title || conversation.target || '?').slice(0, 1).toUpperCase(),\n raw: conversation.raw || {\n type: 'single',\n target: conversation.target,\n line: 0\n }\n }));\n }\n getMessages(conversation) {\n if (!conversation?.id) {\n return [];\n }\n const userId = this.currentUser?.userId || '';\n return applyLocalMessageState(conversation.id, readLocalMessages(userId)[conversation.id] || [], userId);\n }\n async fetchRemoteMessages(conversation, limit = 50, options = {}) {\n if (!conversation?.id || !this.currentUser?.userId) {\n return [];\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messagesApi, {\n userId: this.currentUser.userId,\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\n limit,\n conversationType: conversation.type || conversation.raw?.type || 0,\n markRead: Boolean(options.markRead),\n includeConversations: Boolean(options.includeConversations)\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '消息同步失败');\n }\n const messages = (response.data?.result?.messages || []).map(message => ({\n ...message,\n displayTimestamp: message.displayTimestamp || message.timestamp,\n conversationId: conversation.id\n }));\n if (options.includeConversations && Array.isArray(response.data?.result?.conversations)) {\n const remoteConversations = response.data.result.conversations.map(remoteConversation => ({\n ...remoteConversation,\n updatedAt: Number(remoteConversation.updatedAt || Date.now()),\n avatarText: remoteConversation.avatarText || String(remoteConversation.title || remoteConversation.target || '?').slice(0, 1).toUpperCase(),\n raw: remoteConversation.raw || {\n type: 'single',\n target: remoteConversation.target,\n line: 0\n }\n }));\n this.emit('conversationsChanged', remoteConversations);\n }\n const userId = this.currentUser?.userId || '';\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = mergeSyncedMessages(messagesByConversation[conversation.id] || [], messages, conversation.id, userId);\n writeLocalMessages(messagesByConversation, userId);\n return messagesByConversation[conversation.id];\n }\n hideMessages(conversation, messages) {\n const items = Array.isArray(messages) ? messages : [messages];\n if (!conversation?.id || !items.length) {\n return;\n }\n const userId = this.currentUser?.userId || '';\n storeMessageKeys(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = applyLocalMessageState(conversation.id, messagesByConversation[conversation.id] || [], userId);\n writeLocalMessages(messagesByConversation, userId);\n }\n markMessagesRecalled(conversation, messages) {\n const items = Array.isArray(messages) ? messages : [messages];\n if (!conversation?.id || !items.length) {\n return;\n }\n const userId = this.currentUser?.userId || '';\n storeMessageKeys(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = applyLocalMessageState(conversation.id, messagesByConversation[conversation.id] || [], userId);\n writeLocalMessages(messagesByConversation, userId);\n }\n async recallMessage(conversation, message) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!/^\\d+$/.test(messageUid)) {\n throw new Error('缺少可撤回的消息ID');\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messageActionApi, {\n action: 'recall',\n userId: this.currentUser?.userId || message.from || '',\n messageUid\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '撤回失败');\n }\n this.markMessagesRecalled(conversation, [message]);\n return response.data.result;\n }\n async editMessage(conversation, message, text) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!/^\\d+$/.test(messageUid)) {\n throw new Error('缺少可编辑的消息ID');\n }\n const nextText = String(text || '').trim();\n if (!nextText) {\n throw new Error('编辑内容不能为空');\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messageActionApi, {\n action: 'edit',\n userId: this.currentUser?.userId || message.from || '',\n messageUid,\n text: nextText\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '编辑失败');\n }\n const result = response.data?.result?.message || {};\n const editedMessage = {\n ...message,\n text: result.text || nextText,\n status: 'delivered',\n deliveryStatus: 'delivered',\n editedAt: Number(result.editedAt || Date.now()),\n activityTimestamp: Number(result.editedAt || Date.now())\n };\n saveLocalMessage(editedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', editedMessage);\n return editedMessage;\n }\n async getMessageDetail(conversation, message) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!messageUid) {\n throw new Error('缺少消息ID');\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messageDetailApi, {\n userId: this.currentUser?.userId || '',\n target: conversation?.target || conversation?.raw?.target || conversation?.id?.replace(/^single-/, '') || '',\n conversationType: conversation?.type || conversation?.raw?.type || 'single',\n messageUid\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '消息详情加载失败');\n }\n return response.data?.result?.detail || null;\n }\n async sendTextMessage(conversation, text, initialMessage = null) {\n const senderRole = conversation?.role || conversation?.raw?.role || '';\n const message = initialMessage || {\n id: randomId(),\n conversationId: conversation.id,\n from: this.currentUser?.userId || 'me',\n senderRole,\n direction: 'out',\n type: 'text',\n text,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now()\n };\n saveLocalMessage(message, this.currentUser?.userId || '');\n if (!initialMessage) {\n this.emit('messageSent', message);\n }\n try {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.sendMessageApi, {\n sender: this.currentUser?.userId || '',\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\n conversationType: conversation.type || conversation.raw?.type || 0,\n text\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '发送失败');\n }\n const sentMessage = {\n ...message,\n status: 'sent',\n deliveryStatus: 'sent',\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\n timestamp: message.timestamp,\n displayTimestamp: message.displayTimestamp || message.timestamp\n };\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', sentMessage);\n return sentMessage;\n } catch (error) {\n const failedMessage = {\n ...message,\n status: 'failed',\n deliveryStatus: '',\n error: error.response?.data?.message || error.message || '发送失败'\n };\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', failedMessage);\n return failedMessage;\n }\n }\n async sendAttachmentMessage(conversation, {\n type,\n file,\n text = ''\n }, initialMessage = null) {\n const senderRole = conversation?.role || conversation?.raw?.role || '';\n const message = initialMessage || {\n id: randomId(),\n conversationId: conversation.id,\n from: this.currentUser?.userId || 'me',\n senderRole,\n direction: 'out',\n type,\n text,\n attachment: {\n type,\n name: file?.name || (type === 'image' ? '图片' : '文件'),\n mime: file?.type || '',\n size: file?.size || 0,\n url: type === 'image' && file ? URL.createObjectURL(file) : ''\n },\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now()\n };\n saveLocalMessage(message, this.currentUser?.userId || '');\n if (!initialMessage) {\n this.emit('messageSent', message);\n }\n try {\n const formData = new FormData();\n formData.append('sender', this.currentUser?.userId || '');\n formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''));\n formData.append('conversationType', conversation.type || conversation.raw?.type || 0);\n formData.append('messageType', type);\n formData.append('text', text || '');\n formData.append('attachment', file);\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.sendMessageApi, formData, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '发送失败');\n }\n const sentMessage = {\n ...message,\n status: 'sent',\n deliveryStatus: 'sent',\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\n attachment: response.data?.result?.attachment || message.attachment,\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\n timestamp: message.timestamp,\n displayTimestamp: message.displayTimestamp || message.timestamp\n };\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', sentMessage);\n return sentMessage;\n } catch (error) {\n const failedMessage = {\n ...message,\n status: 'failed',\n deliveryStatus: '',\n error: error.response?.data?.message || error.message || '发送失败'\n };\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', failedMessage);\n return failedMessage;\n }\n }\n getContactList() {\n return [];\n }\n async getServerContactList(userId) {\n if (!userId) {\n return [];\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.contactsApi, {\n userId\n }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.contactsApi)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '联系人加载失败');\n }\n return (response.data?.result?.contacts || []).map(item => {\n return this.mapContact(item.uid, {\n alias: item.alias\n }, {\n uid: item.uid,\n displayName: item.displayName,\n name: item.name,\n mobile: item.mobile,\n portrait: item.portrait,\n address: item.address,\n friendAlias: item.alias\n });\n }).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));\n }\n async addContact(userId, keyword, reason = '') {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.addContactApi, {\n userId,\n keyword,\n reason\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '添加联系人失败');\n }\n const item = response.data?.result?.contact;\n if (!item?.uid) {\n return null;\n }\n return this.mapContact(item.uid, {\n alias: item.alias\n }, {\n uid: item.uid,\n displayName: item.displayName,\n name: item.name,\n mobile: item.mobile,\n portrait: item.portrait,\n address: item.address,\n friendAlias: item.alias\n });\n }\n normalizeConversation(conversation) {\n const title = getTitle(conversation?.title, conversation?.target || '');\n return {\n ...conversation,\n id: conversation?.id || `${conversation?.type === 'single' ? 'single' : 'group'}-${conversation?.target}`,\n target: conversation?.target || conversation?.raw?.target || '',\n title,\n subtitle: conversation?.subtitle || '',\n unread: Number(conversation?.unread || 0),\n portrait: conversation?.portrait || '',\n avatarText: conversation?.avatarText || title.slice(0, 1).toUpperCase(),\n updatedAt: Number(conversation?.updatedAt || Date.now()),\n raw: conversation?.raw || {\n type: conversation?.type === 'single' ? 'single' : 'group',\n target: conversation?.target || '',\n line: 0\n }\n };\n }\n async createGroup(userId, {\n name,\n memberIds = [],\n announcement = '',\n welcomeText = '',\n channel = false\n }) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: channel ? 'create_channel' : 'create_group',\n userId,\n name,\n memberIds,\n announcement,\n welcomeText\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || (channel ? '创建公告群失败' : '创建群组失败'));\n }\n return this.normalizeConversation(response.data?.result?.conversation || {});\n }\n async joinGroup(userId, groupKey) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'join_group',\n userId,\n groupKey\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '加入群组失败');\n }\n return this.normalizeConversation(response.data?.result?.conversation || {});\n }\n async broadcastMessage(userId, targetIds, text) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'broadcast',\n userId,\n targetIds,\n text\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群发失败');\n }\n return response.data?.result || {};\n }\n async getGroupDetail(userId, groupId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'group_detail',\n userId,\n groupId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群资料加载失败');\n }\n return response.data?.result?.group || null;\n }\n async getGroupMembers(userId, groupId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'group_members',\n userId,\n groupId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群员加载失败');\n }\n return response.data?.result?.members || [];\n }\n async updateGroupAlias(userId, groupId, alias) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'update_group_alias',\n userId,\n groupId,\n alias\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '本群昵称保存失败');\n }\n return response.data?.result?.alias || '';\n }\n async leaveGroup(userId, groupId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'leave_group',\n userId,\n groupId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '退出群组失败');\n }\n return response.data?.result || {};\n }\n async dismissGroup(userId, groupId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'dismiss_group',\n userId,\n groupId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '解散群组失败');\n }\n return response.data?.result || {};\n }\n async transferGroup(userId, groupId, targetUserId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'transfer_group',\n userId,\n groupId,\n targetUserId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '转让群组失败');\n }\n return response.data?.result || {};\n }\n async setGroupAdmins(userId, groupId, adminIds) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'set_group_admins',\n userId,\n groupId,\n adminIds\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '管理员设置失败');\n }\n return response.data?.result || {};\n }\n async updateGroupProfile(userId, groupId, {\n name,\n announcement,\n welcomeText\n }) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'update_group_profile',\n userId,\n groupId,\n name,\n announcement,\n welcomeText\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群资料保存失败');\n }\n return response.data?.result || {};\n }\n async kickGroupMembers(userId, groupId, targetIds) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'kick_group_members',\n userId,\n groupId,\n targetIds\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '踢人失败');\n }\n return response.data?.result || {};\n }\n async updateGroupMuteSetting(userId, groupId, setting) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'update_mute_setting',\n userId,\n groupId,\n ...setting\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '禁言设置保存失败');\n }\n return response.data?.result?.muteSetting || null;\n }\n async updateContactAlias(userId, targetId, alias) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.updateAliasApi, {\n userId,\n targetId,\n alias\n }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.updateAliasApi)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '备注名修改失败');\n }\n return response.data?.result?.contact?.alias || '';\n }\n async getProfile(userId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.profileApi, {\n action: 'get',\n userId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '用户资料加载失败');\n }\n return response.data?.result?.profile || null;\n }\n async updateProfile(userId, {\n displayName,\n portraitFile\n }) {\n const formData = new FormData();\n formData.append('action', 'update');\n formData.append('userId', userId);\n formData.append('displayName', displayName);\n if (portraitFile) {\n formData.append('portraitFile', portraitFile);\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.profileApi, formData, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '用户资料保存失败');\n }\n return response.data?.result?.profile || null;\n }\n async changePassword({\n oldPassword,\n newPassword\n }) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.changePasswordApi, {\n oldPassword,\n newPassword\n }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.changePasswordApi)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || response.data?.msg || '密码修改失败');\n }\n return true;\n }\n async resetPasswordWithCode({\n mobile,\n resetCode,\n newPassword\n }) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.resetPasswordApi, {\n mobile,\n resetCode,\n newPassword\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || response.data?.msg || '密码设置失败');\n }\n return true;\n }\n refreshContactList() {\n const contacts = this.getContactList();\n this.emit('contactsChanged', contacts);\n return contacts;\n }\n createSingleConversation(userId, userInfo = null) {\n const title = getTitle(userInfo?.title || userInfo?.displayName || userInfo?.name, userId);\n return {\n id: `single-${userId}`,\n type: 'single',\n target: userId,\n title,\n subtitle: '',\n unread: 0,\n portrait: userInfo?.portrait || '',\n avatarText: title.slice(0, 1).toUpperCase(),\n updatedAt: Date.now(),\n raw: {\n type: 'single',\n target: userId,\n line: 0\n }\n };\n }\n mapContact(userId, friend, userInfo) {\n const title = getTitle(userInfo?.friendAlias || friend?.alias || userInfo?.displayName || userInfo?.name, userId);\n return {\n id: userId,\n uid: userId,\n title,\n subtitle: userInfo?.mobile || userInfo?.name || userId,\n portrait: userInfo?.portrait || '',\n address: userInfo?.address || '',\n avatarText: title.slice(0, 1).toUpperCase(),\n alias: friend?.alias || userInfo?.friendAlias || '',\n rawFriend: friend,\n rawUser: userInfo\n };\n }\n on(eventName, handler) {\n if (!this.listeners.has(eventName)) {\n this.listeners.set(eventName, new Set());\n }\n this.listeners.get(eventName).add(handler);\n return () => this.off(eventName, handler);\n }\n off(eventName, handler) {\n this.listeners.get(eventName)?.delete(handler);\n }\n emit(eventName, payload) {\n this.listeners.get(eventName)?.forEach(handler => handler(payload));\n }\n persistAppToken(url, response) {\n const appToken = response.headers?.authtoken || response.headers?.authToken;\n if (appToken) {\n localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.authTokenStoragePrefix + this.getUrlHost(url), appToken);\n }\n }\n getAppAuthHeaders(url) {\n const host = this.getUrlHost(url);\n if (!host) {\n return {};\n }\n const token = localStorage.getItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.authTokenStoragePrefix + host);\n return token ? {\n authToken: token\n } : {};\n }\n getUrlHost(url) {\n try {\n return new URL(url, window.location.origin).host;\n } catch (error) {\n return '';\n }\n }\n}\nconst imClient = new HttpImClient();\n\n//# sourceURL=webpack://jc-web-im/./src/services/httpImClient.js?\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ HttpImClient: function() { return /* binding */ HttpImClient; },\n/* harmony export */ imClient: function() { return /* binding */ imClient; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.iterator.some.js */ \"./node_modules/core-js/modules/es.iterator.some.js\");\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert.js */ \"./node_modules/core-js/modules/es.map.get-or-insert.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert-computed.js */ \"./node_modules/core-js/modules/es.map.get-or-insert-computed.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var axios__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! axios */ \"./node_modules/axios/lib/axios.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @/config */ \"./src/config.js\");\n/* harmony import */ var _services_appServerClient__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @/services/appServerClient */ \"./src/services/appServerClient.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst LOCAL_MESSAGE_STORAGE_KEY = 'qmt-web-im-local-messages-v2';\nconst LOCAL_HIDDEN_MESSAGE_STORAGE_KEY = 'qmt-web-im-hidden-messages-v1';\nconst LOCAL_RECALLED_MESSAGE_STORAGE_KEY = 'qmt-web-im-recalled-messages-v1';\nfunction scopedStorageKey(baseKey, userId = '') {\n const scope = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer || ''}:${userId || 'anonymous'}`;\n return `${baseKey}:${encodeURIComponent(scope)}`;\n}\nfunction randomId() {\n if (window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID().replaceAll('-', '');\n }\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\n}\nfunction readLocalMessages(userId) {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId)) || '{}');\n } catch (error) {\n return {};\n }\n}\nfunction readMessageSet(storageKey, userId) {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(storageKey, userId)) || '{}');\n } catch (error) {\n return {};\n }\n}\nfunction writeMessageSet(storageKey, messagesByConversation, userId) {\n localStorage.setItem(scopedStorageKey(storageKey, userId), JSON.stringify(messagesByConversation));\n}\nfunction messageKeys(message) {\n return [message?.id, message?.messageUid].filter(Boolean).map(value => String(value));\n}\nfunction hasStoredMessage(storageKey, conversationId, message, userId) {\n const stored = readMessageSet(storageKey, userId);\n const ids = new Set(stored[conversationId] || []);\n return messageKeys(message).some(id => ids.has(id));\n}\nfunction storeMessageKeys(storageKey, conversationId, messages, userId) {\n const stored = readMessageSet(storageKey, userId);\n const ids = new Set(stored[conversationId] || []);\n messages.forEach(message => {\n messageKeys(message).forEach(id => ids.add(id));\n });\n stored[conversationId] = Array.from(ids);\n writeMessageSet(storageKey, stored, userId);\n}\nfunction withRecalledState(message) {\n return {\n ...message,\n status: 'recalled',\n deliveryStatus: '',\n recalled: true,\n recallStatus: '已撤回'\n };\n}\nfunction applyLocalMessageState(conversationId, messages, userId) {\n return messages.filter(message => !hasStoredMessage(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversationId, message, userId)).map(message => {\n const isRecalled = Boolean(message.recalled) || message.status === 'recalled' || hasStoredMessage(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversationId, message, userId);\n if (!isRecalled) {\n return message;\n }\n return withRecalledState(message);\n });\n}\nfunction writeLocalMessages(messagesByConversation, userId) {\n localStorage.setItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId), JSON.stringify(messagesByConversation));\n}\nfunction saveLocalMessage(message, userId) {\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[message.conversationId] = messagesByConversation[message.conversationId] || [];\n const index = messagesByConversation[message.conversationId].findIndex(item => item.id === message.id);\n if (index >= 0) {\n messagesByConversation[message.conversationId].splice(index, 1, message);\n } else {\n messagesByConversation[message.conversationId].push(message);\n }\n writeLocalMessages(messagesByConversation, userId);\n}\nfunction mergeSyncedMessages(localMessages, remoteMessages, conversationId, userId) {\n const visibleLocalMessages = applyLocalMessageState(conversationId, localMessages, userId);\n const localByKey = new Map();\n visibleLocalMessages.forEach(message => {\n messageKeys(message).forEach(key => {\n if (!localByKey.has(key)) {\n localByKey.set(key, message);\n }\n });\n });\n const visibleRemoteMessages = applyLocalMessageState(conversationId, remoteMessages, userId).map(remoteMessage => {\n if (!remoteMessage.recalled || String(remoteMessage.text || '').trim()) {\n return remoteMessage;\n }\n const localMessage = messageKeys(remoteMessage).map(key => localByKey.get(key)).find(message => message?.text && message.text !== '你撤回了一条消息');\n return localMessage ? {\n ...remoteMessage,\n text: localMessage.text\n } : remoteMessage;\n });\n const remoteKeys = new Set();\n visibleRemoteMessages.forEach(message => {\n messageKeys(message).forEach(key => remoteKeys.add(key));\n });\n const now = Date.now();\n function hasRemoteMatch(localMessage) {\n if (localMessage.messageUid && remoteKeys.has(localMessage.messageUid)) {\n return true;\n }\n return visibleRemoteMessages.some(remoteMessage => {\n return remoteMessage.direction === localMessage.direction && remoteMessage.text === localMessage.text && Math.abs(Number(remoteMessage.timestamp || 0) - Number(localMessage.timestamp || 0)) < 15000;\n });\n }\n const pendingLocalMessages = visibleLocalMessages.filter(message => {\n if (message.status === 'recalled' || message.recalled) {\n return message.direction === 'out' && !hasRemoteMatch(message);\n }\n if (message.direction !== 'out') {\n return false;\n }\n if (message.status === 'sent' && message.messageUid) {\n return !hasRemoteMatch(message);\n }\n if (message.status === 'sent') {\n return !hasRemoteMatch(message) && now - Number(message.timestamp || 0) < 30000;\n }\n return message.status === 'sending' || message.status === 'failed';\n });\n return [...visibleRemoteMessages, ...pendingLocalMessages].sort((a, b) => {\n return Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0);\n });\n}\nfunction getTitle(value, fallback) {\n return value || fallback || '';\n}\nfunction getUniqueEquipment(mobile, fallback) {\n const allowedDevices = {\n '18301902119': '67072d37062c4f31b1165073552933ba',\n '18301902116': '1777479418113eeea8e236edce',\n '18301902118': 'de89fb2f2a61480a8c381f6c16e28bd8',\n '18301902117': 'd117f480faa64145b6162107b1b49617'\n };\n return allowedDevices[mobile] || localStorage.getItem('uniqueEquipment') || fallback;\n}\nfunction canUseLocalLoginFallback(response) {\n const message = response.data?.message || '';\n return true && message.includes('允许此设备登录');\n}\nclass HttpImClient {\n constructor() {\n this.listeners = new Map();\n this.connected = false;\n this.currentUser = null;\n }\n getClientId() {\n let clientId = localStorage.getItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.clientIdStorageKey);\n if (!clientId) {\n clientId = randomId();\n localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.clientIdStorageKey, clientId);\n }\n return clientId;\n }\n restoreClientId(clientId) {\n if (clientId) {\n localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.clientIdStorageKey, clientId);\n }\n }\n getSdkVersion() {\n return 'HTTP';\n }\n async ensureSdk() {\n return true;\n }\n async loginWithPassword(mobile, password) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/login_pwd`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, {\n mobile,\n password,\n platform: _config__WEBPACK_IMPORTED_MODULE_18__.appConfig.platform,\n clientId: this.getClientId()\n }, {\n withCredentials: false\n });\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n if (canUseLocalLoginFallback(response)) {\n return {\n userId: mobile,\n token: `local-device-pending-${Date.now()}`,\n displayName: mobile,\n localOnly: true\n };\n }\n throw new Error(response.data?.message || '登录失败');\n }\n return response.data.result;\n }\n async requestAuthCode(mobile) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(`${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/send_code`, {\n mobile\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '验证码发送失败');\n }\n return response.data.result;\n }\n async loginWithCode(mobile, code) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/login`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, {\n mobile,\n code,\n platform: _config__WEBPACK_IMPORTED_MODULE_18__.appConfig.platform,\n clientId: this.getClientId()\n }, {\n withCredentials: false\n });\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '登录失败');\n }\n return response.data.result;\n }\n async createPcSession(userId = '') {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(`${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/pc_session`, {\n flag: 1,\n device_name: 'Web IM',\n userId,\n clientId: this.getClientId(),\n platform: _config__WEBPACK_IMPORTED_MODULE_18__.appConfig.platform\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '二维码登录会话创建失败');\n }\n return response.data.result || {};\n }\n async loginWithPcSession(token) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/session_login/${encodeURIComponent(token)}`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, null, {\n withCredentials: false\n });\n this.persistAppToken(url, response);\n const data = response.data || {};\n if ([0, 8, 9, 10, 18].includes(Number(data.code))) {\n return data;\n }\n throw new Error(data.message || '扫码登录失败');\n }\n async registerWithPhone(mobile, code) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/register`;\n const deviceId = getUniqueEquipment(mobile, this.getClientId());\n try {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, {\n mobile,\n code,\n platform: _config__WEBPACK_IMPORTED_MODULE_18__.appConfig.platform,\n clientId: deviceId,\n uniqueEquipment: deviceId\n }, {\n withCredentials: false\n });\n this.persistAppToken(url, response);\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '注册失败');\n }\n return response.data.result;\n } catch (error) {\n const status = error.response?.status;\n if (status === 404 || status === 405) {\n return this.loginWithCode(mobile, code);\n }\n throw error;\n }\n }\n connect(userId, token) {\n this.currentUser = {\n userId,\n token\n };\n this.connected = true;\n this.emit('connectionStatusChanged', {\n connected: true,\n statusText: '已连接'\n });\n this.refreshConversationList();\n }\n disconnect() {\n this.connected = false;\n this.currentUser = null;\n this.emit('connectionStatusChanged', {\n connected: false,\n statusText: '未连接'\n });\n }\n getConversationList() {\n return [];\n }\n refreshConversationList() {\n const conversations = this.getConversationList();\n if (conversations.length) {\n this.emit('conversationsChanged', conversations);\n }\n if (this.currentUser?.userId) {\n this.fetchRemoteConversations().then(remoteConversations => {\n this.emit('conversationsChanged', remoteConversations);\n }).catch(() => {});\n }\n return conversations;\n }\n async fetchRemoteConversations(limit = 50) {\n if (!this.currentUser?.userId) {\n return [];\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messagesApi, {\n userId: this.currentUser.userId,\n limit\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '会话同步失败');\n }\n return (response.data?.result?.conversations || []).map(conversation => ({\n ...conversation,\n updatedAt: Number(conversation.updatedAt || Date.now()),\n avatarText: conversation.avatarText || String(conversation.title || conversation.target || '?').slice(0, 1).toUpperCase(),\n raw: conversation.raw || {\n type: 'single',\n target: conversation.target,\n line: 0\n }\n }));\n }\n getMessages(conversation) {\n if (!conversation?.id) {\n return [];\n }\n const userId = this.currentUser?.userId || '';\n return applyLocalMessageState(conversation.id, readLocalMessages(userId)[conversation.id] || [], userId);\n }\n async fetchRemoteMessages(conversation, limit = 50, options = {}) {\n if (!conversation?.id || !this.currentUser?.userId) {\n return [];\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messagesApi, {\n userId: this.currentUser.userId,\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\n limit,\n conversationType: conversation.type || conversation.raw?.type || 0,\n markRead: Boolean(options.markRead),\n includeConversations: Boolean(options.includeConversations)\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '消息同步失败');\n }\n const messages = (response.data?.result?.messages || []).map(message => ({\n ...message,\n displayTimestamp: message.displayTimestamp || message.timestamp,\n conversationId: conversation.id\n }));\n messages.hasPinnedMessageState = Object.prototype.hasOwnProperty.call(response.data?.result || {}, 'pinnedMessageUid');\n messages.pinnedMessageUid = String(response.data?.result?.pinnedMessageUid || '');\n messages.pinnedMessage = response.data?.result?.pinnedMessage || null;\n if (options.includeConversations && Array.isArray(response.data?.result?.conversations)) {\n const remoteConversations = response.data.result.conversations.map(remoteConversation => ({\n ...remoteConversation,\n updatedAt: Number(remoteConversation.updatedAt || Date.now()),\n avatarText: remoteConversation.avatarText || String(remoteConversation.title || remoteConversation.target || '?').slice(0, 1).toUpperCase(),\n raw: remoteConversation.raw || {\n type: 'single',\n target: remoteConversation.target,\n line: 0\n }\n }));\n this.emit('conversationsChanged', remoteConversations);\n }\n const userId = this.currentUser?.userId || '';\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = mergeSyncedMessages(messagesByConversation[conversation.id] || [], messages, conversation.id, userId);\n messagesByConversation[conversation.id].pinnedMessageUid = messages.pinnedMessageUid;\n messagesByConversation[conversation.id].pinnedMessage = messages.pinnedMessage;\n messagesByConversation[conversation.id].hasPinnedMessageState = messages.hasPinnedMessageState;\n writeLocalMessages(messagesByConversation, userId);\n return messagesByConversation[conversation.id];\n }\n async setPinnedMessage(conversation, messageUid = '', message = null) {\n const isGroup = ['group', 'channel'].includes(conversation?.type) || ['group', 'channel', 1, '1'].includes(conversation?.raw?.type);\n if (isGroup) {\n if (messageUid && message) {\n return this.addGroupPinnedMessage(conversation, message);\n }\n const serverPinId = String(message?.serverPinId || message?.pinId || '').trim();\n if (!serverPinId) {\n throw new Error('缺少置顶记录ID,请刷新会话后重试');\n }\n return this.removeGroupPinnedMessage(serverPinId);\n }\n const action = messageUid ? 'pin' : 'unpin';\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messageActionApi, {\n action,\n userId: this.currentUser?.userId || '',\n messageUid: messageUid || '1',\n target: conversation.target || conversation.raw?.target || '',\n conversationType: ['group', 'channel'].includes(conversation.type) ? 'group' : 'single',\n message: message ? {\n id: String(message.messageUid || message.id || messageUid),\n messageUid: String(message.messageUid || message.id || messageUid),\n text: String(message.text || ''),\n type: message.type || 'text',\n attachment: message.attachment || null,\n senderName: message.senderName || message.from || '',\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now())\n } : null\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) throw new Error(response.data?.message || '置顶失败');\n }\n async fetchGroupPinnedMessages(conversation) {\n const groupId = String(conversation?.target || conversation?.raw?.target || '').trim();\n if (!groupId) return [];\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/groupTopMessage/gets`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].get(url, {\n params: {\n groupId\n },\n headers: this.getAppAuthHeaders(url),\n withCredentials: false\n });\n const payload = response.data || {};\n if (payload.code !== undefined && Number(payload.code) !== 0) {\n throw new Error(payload.message || '置顶消息加载失败');\n }\n const result = payload.result ?? payload.data ?? payload;\n return Array.isArray(result) ? result : [];\n }\n async addGroupPinnedMessage(conversation, message) {\n const groupId = String(conversation?.target || conversation?.raw?.target || '').trim();\n const messageId = String(message?.messageId || message?.messageUid || message?.id || '').trim();\n if (!groupId || !messageId) throw new Error('缺少群ID或消息ID');\n const searchableContent = String(message?.text || '').trim() || (message?.type === 'image' ? '[图片]' : message?.type === 'video' ? '[视频]' : '[消息]');\n const rawConversationType = Number(conversation?.raw?.type);\n const conversationType = Number.isFinite(rawConversationType) && rawConversationType > 0 ? rawConversationType : 1;\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/groupTopMessage/add`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, {\n groupId,\n userId: message?.from || this.currentUser?.userId || '',\n messageId,\n messageType: conversationType,\n messageText: JSON.stringify({\n ...message,\n messageId,\n from: message?.from || this.currentUser?.userId || '',\n conversation: {\n type: conversationType,\n target: groupId,\n line: Number(conversation?.raw?.line || 0)\n },\n content: {\n searchableContent\n }\n })\n }, {\n headers: this.getAppAuthHeaders(url),\n withCredentials: false\n });\n const payload = response.data || {};\n if (payload.code !== undefined && Number(payload.code) !== 0) {\n const detail = payload.message || payload.msg || payload.result?.message || '置顶失败';\n throw new Error(payload.code !== undefined ? `${detail}(错误码 ${payload.code})` : detail);\n }\n return payload.result ?? payload.data ?? payload;\n }\n async removeGroupPinnedMessage(pinId) {\n const url = `${_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer}/groupTopMessage/remove/?id=${encodeURIComponent(pinId)}`;\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(url, {}, {\n headers: this.getAppAuthHeaders(url),\n withCredentials: false\n });\n const payload = response.data || {};\n if (payload.code !== undefined && Number(payload.code) !== 0) {\n throw new Error(payload.message || '取消置顶失败');\n }\n return payload.result ?? payload.data ?? payload;\n }\n hideMessages(conversation, messages) {\n const items = Array.isArray(messages) ? messages : [messages];\n if (!conversation?.id || !items.length) {\n return;\n }\n const userId = this.currentUser?.userId || '';\n storeMessageKeys(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = applyLocalMessageState(conversation.id, messagesByConversation[conversation.id] || [], userId);\n writeLocalMessages(messagesByConversation, userId);\n }\n markMessagesRecalled(conversation, messages) {\n const items = Array.isArray(messages) ? messages : [messages];\n if (!conversation?.id || !items.length) {\n return;\n }\n const userId = this.currentUser?.userId || '';\n storeMessageKeys(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = applyLocalMessageState(conversation.id, messagesByConversation[conversation.id] || [], userId);\n writeLocalMessages(messagesByConversation, userId);\n }\n async recallMessage(conversation, message) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!/^\\d+$/.test(messageUid)) {\n throw new Error('缺少可撤回的消息ID');\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messageActionApi, {\n action: 'recall',\n userId: this.currentUser?.userId || message.from || '',\n messageUid\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '撤回失败');\n }\n this.markMessagesRecalled(conversation, [message]);\n return response.data.result;\n }\n async editMessage(conversation, message, text) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!/^\\d+$/.test(messageUid)) {\n throw new Error('缺少可编辑的消息ID');\n }\n const nextText = String(text || '').trim();\n if (!nextText) {\n throw new Error('编辑内容不能为空');\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messageActionApi, {\n action: 'edit',\n userId: this.currentUser?.userId || message.from || '',\n messageUid,\n text: nextText\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '编辑失败');\n }\n const result = response.data?.result?.message || {};\n const editedMessage = {\n ...message,\n text: result.text || nextText,\n status: 'delivered',\n deliveryStatus: 'delivered',\n editedAt: Number(result.editedAt || Date.now()),\n activityTimestamp: Number(result.editedAt || Date.now())\n };\n saveLocalMessage(editedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', editedMessage);\n return editedMessage;\n }\n async getMessageDetail(conversation, message) {\n const messageUid = String(message?.messageUid || message?.id || '').trim();\n if (!messageUid) {\n throw new Error('缺少消息ID');\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.messageDetailApi, {\n userId: this.currentUser?.userId || '',\n target: conversation?.target || conversation?.raw?.target || conversation?.id?.replace(/^single-/, '') || '',\n conversationType: conversation?.type || conversation?.raw?.type || 'single',\n messageUid\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '消息详情加载失败');\n }\n return response.data?.result?.detail || null;\n }\n async sendTextMessage(conversation, text, initialMessage = null, options = {}) {\n const senderRole = conversation?.role || conversation?.raw?.role || '';\n const message = initialMessage || {\n id: randomId(),\n conversationId: conversation.id,\n from: this.currentUser?.userId || 'me',\n senderRole,\n direction: 'out',\n type: 'text',\n text,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now()\n };\n saveLocalMessage(message, this.currentUser?.userId || '');\n if (!initialMessage) {\n this.emit('messageSent', message);\n }\n try {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.sendMessageApi, {\n sender: this.currentUser?.userId || '',\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\n conversationType: conversation.type || conversation.raw?.type || 0,\n text,\n mentionedUserIds: Array.isArray(options.mentionedUserIds) ? options.mentionedUserIds : []\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '发送失败');\n }\n const sentMessage = {\n ...message,\n status: 'sent',\n deliveryStatus: 'sent',\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\n timestamp: message.timestamp,\n displayTimestamp: message.displayTimestamp || message.timestamp\n };\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', sentMessage);\n return sentMessage;\n } catch (error) {\n const failedMessage = {\n ...message,\n status: 'failed',\n deliveryStatus: '',\n error: error.response?.data?.message || error.message || '发送失败'\n };\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', failedMessage);\n return failedMessage;\n }\n }\n async sendAttachmentMessage(conversation, {\n type,\n file,\n text = ''\n }, initialMessage = null) {\n const senderRole = conversation?.role || conversation?.raw?.role || '';\n const message = initialMessage || {\n id: randomId(),\n conversationId: conversation.id,\n from: this.currentUser?.userId || 'me',\n senderRole,\n direction: 'out',\n type,\n text,\n attachment: {\n type,\n name: file?.name || (type === 'image' ? '图片' : '文件'),\n mime: file?.type || '',\n size: file?.size || 0,\n url: type === 'image' && file ? URL.createObjectURL(file) : ''\n },\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now()\n };\n saveLocalMessage(message, this.currentUser?.userId || '');\n if (!initialMessage) {\n this.emit('messageSent', message);\n }\n try {\n const formData = new FormData();\n formData.append('sender', this.currentUser?.userId || '');\n formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''));\n formData.append('conversationType', conversation.type || conversation.raw?.type || 0);\n formData.append('messageType', type);\n formData.append('text', text || '');\n formData.append('attachment', file);\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.sendMessageApi, formData, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '发送失败');\n }\n const sentMessage = {\n ...message,\n status: 'sent',\n deliveryStatus: 'sent',\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\n attachment: response.data?.result?.attachment || message.attachment,\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\n timestamp: message.timestamp,\n displayTimestamp: message.displayTimestamp || message.timestamp\n };\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', sentMessage);\n return sentMessage;\n } catch (error) {\n const failedMessage = {\n ...message,\n status: 'failed',\n deliveryStatus: '',\n error: error.response?.data?.message || error.message || '发送失败'\n };\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\n this.emit('messageStatusChanged', failedMessage);\n return failedMessage;\n }\n }\n async forwardAttachmentMessage(conversation, sourceMessage) {\n const attachment = sourceMessage?.attachment || {};\n const type = attachment.type || sourceMessage?.type || 'file';\n const formData = new FormData();\n formData.append('sender', this.currentUser?.userId || '');\n formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''));\n formData.append('conversationType', conversation.type || conversation.raw?.type || 0);\n formData.append('messageType', type);\n formData.append('text', sourceMessage?.text || '');\n formData.append('attachmentUrl', attachment.url || '');\n formData.append('attachmentName', attachment.name || (type === 'image' ? '转发图片' : type === 'video' ? '转发视频.mp4' : '转发文件'));\n formData.append('attachmentMime', attachment.mime || (type === 'video' ? 'video/mp4' : 'application/octet-stream'));\n formData.append('attachmentSize', String(attachment.size || 0));\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.sendMessageApi, formData, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '转发失败');\n }\n return response.data?.result || {};\n }\n getContactList() {\n return [];\n }\n async getServerContactList(userId) {\n if (!userId) {\n return [];\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.contactsApi, {\n userId\n }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.contactsApi)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '联系人加载失败');\n }\n return (response.data?.result?.contacts || []).map(item => {\n return this.mapContact(item.uid, {\n alias: item.alias\n }, {\n uid: item.uid,\n displayName: item.displayName,\n name: item.name,\n mobile: item.mobile,\n portrait: item.portrait,\n address: item.address,\n friendAlias: item.alias\n });\n }).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));\n }\n async addContact(userId, keyword, reason = '') {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.addContactApi, {\n userId,\n keyword,\n reason\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '添加联系人失败');\n }\n const item = response.data?.result?.contact;\n if (!item?.uid) {\n return null;\n }\n return this.mapContact(item.uid, {\n alias: item.alias\n }, {\n uid: item.uid,\n displayName: item.displayName,\n name: item.name,\n mobile: item.mobile,\n portrait: item.portrait,\n address: item.address,\n friendAlias: item.alias\n });\n }\n normalizeConversation(conversation) {\n const title = getTitle(conversation?.title, conversation?.target || '');\n return {\n ...conversation,\n id: conversation?.id || `${conversation?.type === 'single' ? 'single' : 'group'}-${conversation?.target}`,\n target: conversation?.target || conversation?.raw?.target || '',\n title,\n subtitle: conversation?.subtitle || '',\n unread: Number(conversation?.unread || 0),\n portrait: conversation?.portrait || '',\n avatarText: conversation?.avatarText || title.slice(0, 1).toUpperCase(),\n updatedAt: Number(conversation?.updatedAt || Date.now()),\n raw: conversation?.raw || {\n type: conversation?.type === 'single' ? 'single' : 'group',\n target: conversation?.target || '',\n line: 0\n }\n };\n }\n async createGroup(userId, {\n name,\n memberIds = [],\n announcement = '',\n welcomeText = '',\n channel = false\n }) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: channel ? 'create_channel' : 'create_group',\n userId,\n name,\n memberIds,\n announcement,\n welcomeText\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || (channel ? '创建公告群失败' : '创建群组失败'));\n }\n return this.normalizeConversation(response.data?.result?.conversation || {});\n }\n async joinGroup(userId, groupKey) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'join_group',\n userId,\n groupKey\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '加入群组失败');\n }\n return this.normalizeConversation(response.data?.result?.conversation || {});\n }\n async broadcastMessage(userId, targetIds, text) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'broadcast',\n userId,\n targetIds,\n text\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群发失败');\n }\n return response.data?.result || {};\n }\n async getGroupDetail(userId, groupId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'group_detail',\n userId,\n groupId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群资料加载失败');\n }\n return response.data?.result?.group || null;\n }\n async getGroupMembers(userId, groupId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'group_members',\n userId,\n groupId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群员加载失败');\n }\n return response.data?.result?.members || [];\n }\n async updateGroupAlias(userId, groupId, alias) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'update_group_alias',\n userId,\n groupId,\n alias\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '本群昵称保存失败');\n }\n return response.data?.result?.alias || '';\n }\n async leaveGroup(userId, groupId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'leave_group',\n userId,\n groupId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '退出群组失败');\n }\n return response.data?.result || {};\n }\n async dismissGroup(userId, groupId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'dismiss_group',\n userId,\n groupId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '解散群组失败');\n }\n return response.data?.result || {};\n }\n async transferGroup(userId, groupId, targetUserId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'transfer_group',\n userId,\n groupId,\n targetUserId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '转让群组失败');\n }\n return response.data?.result || {};\n }\n async setGroupAdmins(userId, groupId, adminIds) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'set_group_admins',\n userId,\n groupId,\n adminIds\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '管理员设置失败');\n }\n return response.data?.result || {};\n }\n async updateGroupProfile(userId, groupId, {\n name,\n announcement,\n welcomeText\n }) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'update_group_profile',\n userId,\n groupId,\n name,\n announcement,\n welcomeText\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '群资料保存失败');\n }\n return response.data?.result || {};\n }\n async kickGroupMembers(userId, groupId, targetIds) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'kick_group_members',\n userId,\n groupId,\n targetIds\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '踢人失败');\n }\n return response.data?.result || {};\n }\n async updateGroupMuteSetting(userId, groupId, setting) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.conversationActionsApi, {\n action: 'update_mute_setting',\n userId,\n groupId,\n ...setting\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '禁言设置保存失败');\n }\n return response.data?.result?.muteSetting || null;\n }\n async updateContactAlias(userId, targetId, alias) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.updateAliasApi, {\n userId,\n targetId,\n alias\n }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.updateAliasApi)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '备注名修改失败');\n }\n return response.data?.result?.contact?.alias || '';\n }\n async getProfile(userId) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.profileApi, {\n action: 'get',\n userId\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '用户资料加载失败');\n }\n return response.data?.result?.profile || null;\n }\n async updateProfile(userId, {\n displayName,\n portraitFile\n }) {\n const formData = new FormData();\n formData.append('action', 'update');\n formData.append('userId', userId);\n formData.append('displayName', displayName);\n if (portraitFile) {\n formData.append('portraitFile', portraitFile);\n }\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.profileApi, formData, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.appServer)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '用户资料保存失败');\n }\n return response.data?.result?.profile || null;\n }\n async changePassword({\n oldPassword,\n newPassword\n }) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.changePasswordApi, {\n oldPassword,\n newPassword\n }, {\n withCredentials: false,\n headers: this.getAppAuthHeaders(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.changePasswordApi)\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || response.data?.msg || '密码修改失败');\n }\n return true;\n }\n async resetPasswordWithCode({\n mobile,\n resetCode,\n newPassword\n }) {\n const response = await axios__WEBPACK_IMPORTED_MODULE_17__[\"default\"].post(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.resetPasswordApi, {\n mobile,\n resetCode,\n newPassword\n }, {\n withCredentials: false\n });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || response.data?.msg || '密码设置失败');\n }\n return true;\n }\n refreshContactList() {\n const contacts = this.getContactList();\n this.emit('contactsChanged', contacts);\n return contacts;\n }\n createSingleConversation(userId, userInfo = null) {\n const title = getTitle(userInfo?.title || userInfo?.displayName || userInfo?.name, userId);\n return {\n id: `single-${userId}`,\n type: 'single',\n target: userId,\n title,\n subtitle: '',\n unread: 0,\n portrait: userInfo?.portrait || '',\n avatarText: title.slice(0, 1).toUpperCase(),\n updatedAt: Date.now(),\n raw: {\n type: 'single',\n target: userId,\n line: 0\n }\n };\n }\n mapContact(userId, friend, userInfo) {\n const title = getTitle(userInfo?.friendAlias || friend?.alias || userInfo?.displayName || userInfo?.name, userId);\n return {\n id: userId,\n uid: userId,\n title,\n subtitle: userInfo?.mobile || userInfo?.name || userId,\n portrait: userInfo?.portrait || '',\n address: userInfo?.address || '',\n avatarText: title.slice(0, 1).toUpperCase(),\n alias: friend?.alias || userInfo?.friendAlias || '',\n rawFriend: friend,\n rawUser: userInfo\n };\n }\n on(eventName, handler) {\n if (!this.listeners.has(eventName)) {\n this.listeners.set(eventName, new Set());\n }\n this.listeners.get(eventName).add(handler);\n return () => this.off(eventName, handler);\n }\n off(eventName, handler) {\n this.listeners.get(eventName)?.delete(handler);\n }\n emit(eventName, payload) {\n this.listeners.get(eventName)?.forEach(handler => handler(payload));\n }\n persistAppToken(url, response) {\n const appToken = response.headers?.authtoken || response.headers?.authToken;\n if (appToken) {\n localStorage.setItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.authTokenStoragePrefix + this.getUrlHost(url), appToken);\n }\n }\n getAppAuthHeaders(url) {\n const host = this.getUrlHost(url);\n if (!host) {\n return {};\n }\n const token = localStorage.getItem(_config__WEBPACK_IMPORTED_MODULE_18__.appConfig.authTokenStoragePrefix + host);\n return token ? {\n authToken: token\n } : {};\n }\n getUrlHost(url) {\n try {\n return new URL(url, window.location.origin).host;\n } catch (error) {\n return '';\n }\n }\n}\nconst imClient = new HttpImClient();\n\n//# sourceURL=webpack://jc-web-im/./src/services/httpImClient.js?\n}");
/***/ }),
@@ -357,7 +368,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ imageDisplayUrl: function() { return /* binding */ imageDisplayUrl; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_9__);\n\n\n\n\n\n\n\n\n\n\nfunction configuredProxyHosts() {\n const configured = window.JC_WEB_IM_CONFIG?.mediaProxyHosts;\n const values = Array.isArray(configured) ? configured : String(configured || '').split(/[\\s,]+/);\n return new Set(values.map(value => String(value || '').trim().toLowerCase().replace(/\\.$/, '')).filter(Boolean));\n}\nfunction imageDisplayUrl(value) {\n const source = String(value || '').trim();\n if (!source || source.startsWith('blob:') || source.startsWith('data:')) {\n return source;\n }\n try {\n const url = new URL(source, window.location.origin);\n if (url.protocol !== 'https:' || !configuredProxyHosts().has(url.hostname.toLowerCase())) {\n return source;\n }\n const proxyUrl = new URL('/api/media_proxy.php', window.location.origin);\n proxyUrl.searchParams.set('url', url.toString());\n return proxyUrl.toString();\n } catch (error) {\n return source;\n }\n}\n\n//# sourceURL=webpack://jc-web-im/./src/services/mediaProxy.js?\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ imageDisplayUrl: function() { return /* binding */ imageDisplayUrl; },\n/* harmony export */ useImageProxyFallback: function() { return /* binding */ useImageProxyFallback; },\n/* harmony export */ useVideoOriginalFallback: function() { return /* binding */ useVideoOriginalFallback; },\n/* harmony export */ videoDisplayUrl: function() { return /* binding */ videoDisplayUrl; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\nfunction configuredProxyHosts() {\n const configured = window.JC_WEB_IM_CONFIG?.mediaProxyHosts;\n const values = Array.isArray(configured) ? configured : String(configured || '').split(/[\\s,]+/);\n return new Set(['zhiyanim.dfpnm.cn', ...values].map(value => String(value || '').trim().toLowerCase().replace(/\\.$/, '')).filter(Boolean));\n}\nfunction imageDisplayUrl(value) {\n const source = String(value || '').trim();\n if (!source || source.startsWith('blob:') || source.startsWith('data:')) {\n return source;\n }\n try {\n const url = new URL(source, window.location.origin);\n if (url.protocol !== 'https:' || !configuredProxyHosts().has(url.hostname.toLowerCase())) {\n return source;\n }\n const proxyUrl = new URL('/api/media_proxy.php', window.location.origin);\n proxyUrl.searchParams.set('url', url.toString());\n return proxyUrl.toString();\n } catch (error) {\n return source;\n }\n}\nfunction videoDisplayUrl(value) {\n const source = String(value || '').trim();\n if (!source || source.startsWith('blob:') || source.startsWith('data:')) return source;\n const streamUrl = new URL('/api/media_stream.php', window.location.origin);\n streamUrl.searchParams.set('url', source);\n return streamUrl.toString();\n}\nfunction useVideoOriginalFallback(event, value) {\n const video = event?.currentTarget;\n const source = String(value || '').trim();\n if (!video || !source || video.dataset.originalFallback === '1') return;\n video.dataset.originalFallback = '1';\n video.src = source;\n video.load();\n}\nfunction useImageProxyFallback(event, value) {\n const image = event?.currentTarget;\n if (!image) return;\n const fallback = imageDisplayUrl(value);\n if (!fallback || fallback === value || image.dataset.proxyFallback === '1') return;\n image.dataset.proxyFallback = '1';\n image.src = fallback;\n}\n\n//# sourceURL=webpack://jc-web-im/./src/services/mediaProxy.js?\n}");
/***/ }),
@@ -390,7 +401,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useConversationStore: function() { return /* binding */ useConversationStore; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.flat-map.js */ \"./node_modules/core-js/modules/es.iterator.flat-map.js\");\n/* harmony import */ var core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.iterator.reduce.js */ \"./node_modules/core-js/modules/es.iterator.reduce.js\");\n/* harmony import */ var core_js_modules_es_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.iterator.some.js */ \"./node_modules/core-js/modules/es.iterator.some.js\");\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert.js */ \"./node_modules/core-js/modules/es.map.get-or-insert.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert-computed.js */ \"./node_modules/core-js/modules/es.map.get-or-insert-computed.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var pinia__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! pinia */ \"./node_modules/pinia/dist/pinia.mjs\");\n/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @/services/imClient */ \"./src/services/imClient.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @/config */ \"./src/config.js\");\n/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @/stores/session */ \"./src/stores/session.js\");\n/* harmony import */ var _services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @/services/realtimeNotifications */ \"./src/services/realtimeNotifications.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst LOCAL_CONVERSATION_STORAGE_KEY = 'qmt-web-im-local-conversations-v2';\nconst LOCAL_FAVORITE_MESSAGES_KEY = 'qmt-web-im-favorite-messages-v1';\nfunction scopedStorageKey(baseKey) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n const scope = `${_config__WEBPACK_IMPORTED_MODULE_21__.appConfig.appServer || ''}:${session.userId || 'anonymous'}`;\n return `${baseKey}:${encodeURIComponent(scope)}`;\n}\nfunction readFavoriteMessages() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY)) || '[]');\n } catch (error) {\n return [];\n }\n}\nfunction writeFavoriteMessages(messages) {\n localStorage.setItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY), JSON.stringify(messages));\n}\nfunction readLocalConversations() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY)) || '[]');\n } catch (error) {\n return [];\n }\n}\nfunction writeLocalConversations(conversations) {\n localStorage.setItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY), JSON.stringify(conversations));\n}\nfunction randomId() {\n if (window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID().replaceAll('-', '');\n }\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\n}\nfunction messageKey(message) {\n return message.id || message.messageUid;\n}\nfunction messageStableKey(message) {\n return String(message?.messageUid || message?.id || '');\n}\nfunction messageActivityTimestamp(message) {\n return Number(message?.activityTimestamp || message?.editedAt || message?.displayTimestamp || message?.timestamp || 0);\n}\nfunction isRecalledMessage(message) {\n return Boolean(message?.recalled) || message?.status === 'recalled';\n}\nfunction attachmentLabel(message) {\n const attachment = message?.attachment;\n if (!attachment) {\n return '';\n }\n if (attachment.type === 'image') {\n return '[图片]';\n }\n return `[文件] ${attachment.name || '文件'}`;\n}\nfunction messagePreviewText(message) {\n if (isRecalledMessage(message)) {\n return `[${message?.recallStatus || '已撤回'}]`;\n }\n const text = String(message?.text || '').replace(/\\s+/g, ' ').trim();\n return text || attachmentLabel(message);\n}\nfunction quotePrefix(message) {\n const text = messagePreviewText(message);\n return text.length > 48 ? `${text.slice(0, 48)}...` : text;\n}\nasync function writeClipboard(text) {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n const element = document.createElement('textarea');\n element.value = text;\n element.setAttribute('readonly', 'readonly');\n element.style.position = 'fixed';\n element.style.left = '-9999px';\n document.body.appendChild(element);\n element.select();\n document.execCommand('copy');\n document.body.removeChild(element);\n}\nfunction isSameMessage(left, right) {\n if (left.messageUid && right.messageUid && left.messageUid === right.messageUid) {\n return true;\n }\n if (left.id && right.id && left.id === right.id) {\n return true;\n }\n return left.direction === right.direction && left.text === right.text && (left.type || 'text') === (right.type || 'text') && Math.abs(Number(left.displayTimestamp || left.timestamp || 0) - Number(right.displayTimestamp || right.timestamp || 0)) < 15000;\n}\nfunction hasExactMessage(messages, message) {\n return messages.some(item => {\n if (item.id && message.id && item.id === message.id) {\n return true;\n }\n return item.messageUid && message.messageUid && item.messageUid === message.messageUid;\n });\n}\nfunction shouldUseMessagePolling() {\n return _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.shouldUseMessagePolling ? _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.shouldUseMessagePolling() : true;\n}\nfunction canMarkReadNow(options = {}) {\n if (typeof document === 'undefined') {\n return false;\n }\n if (document.visibilityState !== 'visible') {\n return false;\n }\n if (options.userAction) {\n return true;\n }\n return true;\n}\nfunction normalizeMessageForDisplay(message) {\n if (!message || message.attachment || String(message.text || '').trim()) {\n return message;\n }\n const contentType = Number(message.contentType || 0);\n const labels = {\n 3: '[图片加载失败]',\n 90: '[红包]',\n 105: '[领取了红包]'\n };\n if (!labels[contentType]) {\n return message;\n }\n return {\n ...message,\n type: 'text',\n text: labels[contentType]\n };\n}\nfunction mergeVisibleMessages(currentMessages, syncedMessages) {\n const merged = [...syncedMessages].map(normalizeMessageForDisplay);\n currentMessages.forEach(currentMessage => {\n currentMessage = normalizeMessageForDisplay(currentMessage);\n const exists = merged.some(message => isSameMessage(message, currentMessage));\n const shouldKeepLocal = currentMessage.status === 'sending' || currentMessage.status === 'failed' || currentMessage.direction === 'out' && currentMessage.status === 'sent' && Date.now() - Number(currentMessage.timestamp || 0) < 30000;\n if (!exists && shouldKeepLocal) {\n merged.push(currentMessage);\n }\n });\n return merged.filter((message, index, messages) => {\n const key = messageKey(message);\n return messages.findIndex(item => messageKey(item) === key) === index;\n }).sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0));\n}\nfunction incomingEditedMessages(previousMessages, nextMessages) {\n const previousByKey = new Map();\n (previousMessages || []).forEach(message => {\n const key = messageStableKey(message);\n if (key) {\n previousByKey.set(key, message);\n }\n });\n return (nextMessages || []).filter(message => {\n if (message.direction !== 'in') {\n return false;\n }\n const editedAt = Number(message.editedAt || 0);\n if (editedAt <= 0) {\n return false;\n }\n const previous = previousByKey.get(messageStableKey(message));\n return previous && editedAt > Number(previous.editedAt || 0);\n });\n}\nlet notificationAudioContext = null;\nfunction playNotificationSound() {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (!AudioContext) {\n return;\n }\n notificationAudioContext = notificationAudioContext || new AudioContext();\n if (notificationAudioContext.state === 'suspended') {\n notificationAudioContext.resume().catch(() => {});\n }\n const oscillator = notificationAudioContext.createOscillator();\n const gain = notificationAudioContext.createGain();\n const startAt = notificationAudioContext.currentTime;\n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(880, startAt);\n oscillator.frequency.setValueAtTime(660, startAt + 0.1);\n gain.gain.setValueAtTime(0.0001, startAt);\n gain.gain.exponentialRampToValueAtTime(0.12, startAt + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, startAt + 0.22);\n oscillator.connect(gain);\n gain.connect(notificationAudioContext.destination);\n oscillator.start(startAt);\n oscillator.stop(startAt + 0.24);\n } catch (error) {\n // Notification sound is best-effort; browsers may block audio until user interaction.\n }\n}\nconst useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__.defineStore)('conversations', {\n state: () => ({\n activeId: '',\n conversations: [],\n messagesByConversation: {},\n visibleMessagesByConversation: {},\n eventsBound: false,\n usingDemoData: false,\n loading: false,\n syncTimer: null,\n conversationSyncTimer: null,\n readPresenceEventsBound: false,\n syncInFlight: false,\n pendingReadReceiptConversationId: '',\n conversationSyncInFlight: false,\n syncAfterSendTimer: null,\n optimisticMessagesByConversation: {},\n quotedMessage: null,\n forwardingMessages: [],\n editingMessage: null,\n editingText: '',\n editingMode: '',\n messageDetailOpen: false,\n messageDetailLoading: false,\n messageDetailError: '',\n messageDetail: null,\n attentionMessageId: '',\n attentionMessageTimer: null,\n selectionMode: false,\n selectedMessageIds: [],\n favoriteMessages: [],\n activeFavoriteKey: '',\n actionNotice: '',\n actionError: '',\n realtimeSyncTimer: null\n }),\n getters: {\n activeConversation(state) {\n return state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\n },\n activeMessages(state) {\n return state.visibleMessagesByConversation[state.activeId] || [];\n },\n totalUnread(state) {\n return state.conversations.reduce((sum, item) => sum + Number(item.unread || 0), 0);\n },\n canSendActiveConversation(state) {\n const conversation = state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\n if (!conversation) {\n return false;\n }\n if (conversation.type !== 'channel') {\n return true;\n }\n return ['owner', 'admin'].includes(conversation.role || conversation.raw?.role || '');\n },\n favoriteMessageIds(state) {\n return state.favoriteMessages.map(message => message.key);\n },\n activeFavorite(state) {\n return state.favoriteMessages.find(message => message.key === state.activeFavoriteKey) || state.favoriteMessages[0] || null;\n },\n selectedMessages(state) {\n const selectedIds = new Set(state.selectedMessageIds);\n return (state.visibleMessagesByConversation[state.activeId] || []).filter(message => selectedIds.has(messageStableKey(message)));\n }\n },\n actions: {\n bootstrapDemoData() {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n this.bindImEvents();\n this.usingDemoData = false;\n if (!session.userId) {\n this.clearUserState();\n return;\n }\n this.loadScopedLocalState();\n this.startMessageSync();\n _services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__.realtimeNotifications.start(session.userId, payload => this.handleRealtimeNotification(payload));\n },\n loadScopedLocalState() {\n this.conversations = [];\n this.favoriteMessages = readFavoriteMessages();\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n this.activeId = '';\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n this.quotedMessage = null;\n this.forwardingMessages = [];\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n this.selectionMode = false;\n this.selectedMessageIds = [];\n },\n clearUserState() {\n window.clearInterval(this.syncTimer);\n window.clearInterval(this.conversationSyncTimer);\n window.clearTimeout(this.syncAfterSendTimer);\n window.clearTimeout(this.attentionMessageTimer);\n window.clearTimeout(this.realtimeSyncTimer);\n _services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__.realtimeNotifications.stop();\n this.syncTimer = null;\n this.conversationSyncTimer = null;\n this.syncAfterSendTimer = null;\n this.attentionMessageTimer = null;\n this.realtimeSyncTimer = null;\n this.syncInFlight = false;\n this.conversationSyncInFlight = false;\n this.pendingReadReceiptConversationId = '';\n this.activeId = '';\n this.conversations = [];\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n this.quotedMessage = null;\n this.forwardingMessages = [];\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n this.attentionMessageId = '';\n this.selectionMode = false;\n this.selectedMessageIds = [];\n this.favoriteMessages = [];\n this.activeFavoriteKey = '';\n this.actionNotice = '';\n this.actionError = '';\n },\n bindImEvents() {\n if (this.eventsBound) {\n return;\n }\n this.eventsBound = true;\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.on('messageSent', message => {\n this.appendMessage(message.conversationId, message);\n });\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.on('messageReceived', message => {\n this.appendMessage(message.conversationId, message);\n if (message.conversationId === this.activeId) {\n this.scheduleActiveMessagesSync({\n allowReadReceipt: true\n }, 500);\n }\n });\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.on('messageStatusChanged', message => {\n this.replaceMessage(message.conversationId, message);\n });\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.on('conversationsChanged', remoteConversations => {\n this.usingDemoData = false;\n this.applyRemoteConversations(remoteConversations);\n });\n },\n setActiveConversation(id) {\n this.activeId = id;\n const conversation = this.conversations.find(item => item.id === id);\n if (conversation) {\n conversation.unread = 0;\n }\n this.loadActiveMessages({\n allowReadReceipt: true,\n userAction: true\n });\n },\n sendText(text) {\n const conversation = this.activeConversation;\n if (!conversation || !text.trim()) {\n return;\n }\n let value = text.trim();\n if (this.quotedMessage) {\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`;\n this.quotedMessage = null;\n }\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n direction: 'out',\n type: 'text',\n text: value,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now(),\n displayTimestamp: Date.now()\n };\n this.appendVisibleMessage(conversation.id, message);\n this.appendMessage(conversation.id, message);\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.sendTextMessage(conversation, value, message);\n conversation.subtitle = value;\n conversation.updatedAt = Date.now();\n writeLocalConversations(this.conversations);\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 250);\n },\n sendAttachment({\n type,\n file,\n text = ''\n }) {\n const conversation = this.activeConversation;\n if (!conversation || !file || !['image', 'file'].includes(type)) {\n return;\n }\n let value = text.trim();\n if (this.quotedMessage) {\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`.trim();\n this.quotedMessage = null;\n }\n const now = Date.now();\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n senderRole: conversation.role || conversation.raw?.role || '',\n direction: 'out',\n type,\n text: value,\n attachment: {\n type,\n name: file.name || (type === 'image' ? '图片' : '文件'),\n mime: file.type || '',\n size: file.size || 0,\n url: type === 'image' ? URL.createObjectURL(file) : ''\n },\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: now,\n displayTimestamp: now\n };\n this.appendVisibleMessage(conversation.id, message);\n this.appendMessage(conversation.id, message);\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.sendAttachmentMessage(conversation, {\n type,\n file,\n text: value\n }, message);\n conversation.subtitle = messagePreviewText(message);\n conversation.updatedAt = now;\n writeLocalConversations(this.conversations);\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 350);\n },\n async sendTextToConversation(conversation, text) {\n if (!conversation || !text.trim()) {\n return null;\n }\n const value = text.trim();\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n direction: 'out',\n type: 'text',\n text: value,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now(),\n displayTimestamp: Date.now()\n };\n this.appendMessage(conversation.id, message);\n const sentMessage = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.sendTextMessage(conversation, value, message);\n this.replaceMessage(conversation.id, sentMessage);\n return sentMessage;\n },\n upsertConversation(conversation) {\n const index = this.conversations.findIndex(item => item.id === conversation.id);\n if (index >= 0) {\n this.conversations.splice(index, 1, {\n ...this.conversations[index],\n ...conversation\n });\n } else {\n this.conversations.unshift(conversation);\n }\n this.usingDemoData = false;\n writeLocalConversations(this.conversations);\n },\n removeConversation(conversationId) {\n this.conversations = this.conversations.filter(conversation => conversation.id !== conversationId);\n const {\n [conversationId]: removedMessages,\n ...messagesByConversation\n } = this.messagesByConversation;\n const {\n [conversationId]: removedVisibleMessages,\n ...visibleMessagesByConversation\n } = this.visibleMessagesByConversation;\n const {\n [conversationId]: removedOptimisticMessages,\n ...optimisticMessagesByConversation\n } = this.optimisticMessagesByConversation;\n void removedMessages;\n void removedVisibleMessages;\n void removedOptimisticMessages;\n this.messagesByConversation = messagesByConversation;\n this.visibleMessagesByConversation = visibleMessagesByConversation;\n this.optimisticMessagesByConversation = optimisticMessagesByConversation;\n if (this.activeId === conversationId) {\n this.activeId = this.conversations[0]?.id || '';\n }\n writeLocalConversations(this.conversations);\n if (this.activeId) {\n this.loadActiveMessages();\n }\n },\n applyRemoteConversations(remoteConversations) {\n const remote = Array.isArray(remoteConversations) ? remoteConversations : [];\n if (!remote.length && this.conversations.length) {\n return;\n }\n const merged = new Map();\n this.conversations.forEach(conversation => {\n merged.set(conversation.id, conversation);\n });\n remote.forEach(conversation => {\n const unread = conversation.id === this.activeId && canMarkReadNow() ? 0 : Number(conversation.unread || 0);\n merged.set(conversation.id, {\n ...(merged.get(conversation.id) || {}),\n ...conversation,\n unread\n });\n });\n this.conversations = Array.from(merged.values()).sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0)).slice(0, 100);\n if (!this.conversations.length) {\n this.activeId = '';\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n writeLocalConversations(this.conversations);\n return;\n }\n if (!this.conversations.find(item => item.id === this.activeId)) {\n this.activeId = this.conversations[0].id;\n }\n writeLocalConversations(this.conversations);\n this.loadActiveMessages();\n },\n appendMessage(conversationId, message) {\n if (!this.messagesByConversation[conversationId]) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: []\n };\n }\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent')) {\n this.keepOptimisticMessage(conversationId, message);\n }\n if (!hasExactMessage(this.messagesByConversation[conversationId], message)) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: [...this.messagesByConversation[conversationId], message]\n };\n }\n this.updateConversationFromMessage(conversationId, message);\n this.syncVisibleMessages(conversationId);\n writeLocalConversations(this.conversations);\n },\n removeMessages(conversationId, messages) {\n const ids = new Set(messages.flatMap(message => [message.id, message.messageUid].filter(Boolean).map(String)));\n const filterMessages = list => (list || []).filter(message => {\n return ![message.id, message.messageUid].filter(Boolean).some(id => ids.has(String(id)));\n });\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: filterMessages(this.messagesByConversation[conversationId])\n };\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: filterMessages(this.visibleMessagesByConversation[conversationId])\n };\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: filterMessages(this.optimisticMessagesByConversation[conversationId])\n };\n this.selectedMessageIds = this.selectedMessageIds.filter(id => !ids.has(String(id)));\n },\n replaceLocalMessage(conversationId, targetMessage, nextMessage) {\n const keys = new Set([targetMessage.id, targetMessage.messageUid].filter(Boolean).map(String));\n const replaceInList = list => (list || []).map(message => {\n const matched = [message.id, message.messageUid].filter(Boolean).some(id => keys.has(String(id)));\n return matched ? {\n ...message,\n ...nextMessage\n } : message;\n });\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: replaceInList(this.messagesByConversation[conversationId])\n };\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: replaceInList(this.visibleMessagesByConversation[conversationId])\n };\n },\n updateConversationFromMessage(conversationId, message) {\n const conversation = this.conversations.find(item => item.id === conversationId);\n if (!conversation) {\n return;\n }\n conversation.subtitle = message.text || conversation.subtitle || '';\n conversation.updatedAt = messageActivityTimestamp(message) || Date.now();\n if (message.direction === 'in') {\n conversation.unread = conversationId === this.activeId ? 0 : Number(conversation.unread || 0) + 1;\n }\n this.conversations = [...this.conversations].sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0));\n },\n appendVisibleMessage(conversationId, message) {\n const messages = this.visibleMessagesByConversation[conversationId] || [];\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: [...messages.filter(item => item.id !== message.id), message].sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0))\n };\n },\n replaceMessage(conversationId, message) {\n if (!this.messagesByConversation[conversationId]) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: []\n };\n }\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent' || message.status === 'failed')) {\n this.keepOptimisticMessage(conversationId, message);\n }\n const index = this.messagesByConversation[conversationId].findIndex(item => item.id === message.id);\n if (index >= 0) {\n const messages = [...this.messagesByConversation[conversationId]];\n messages.splice(index, 1, message);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: messages\n };\n } else {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: [...this.messagesByConversation[conversationId], message]\n };\n }\n this.syncVisibleMessages(conversationId);\n },\n syncVisibleMessages(conversationId) {\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: mergeVisibleMessages(this.optimisticMessagesByConversation[conversationId] || [], this.messagesByConversation[conversationId] || [])\n };\n },\n keepOptimisticMessage(conversationId, message) {\n if (!this.optimisticMessagesByConversation[conversationId]) {\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: []\n };\n }\n const messages = this.optimisticMessagesByConversation[conversationId];\n const index = messages.findIndex(item => item.id === message.id);\n let nextMessages;\n if (index >= 0) {\n nextMessages = [...messages];\n nextMessages.splice(index, 1, message);\n } else {\n nextMessages = [...messages, message];\n }\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: nextMessages\n };\n },\n pruneOptimisticMessages(conversationId, syncedMessages) {\n const messages = this.optimisticMessagesByConversation[conversationId] || [];\n if (!messages.length) {\n return;\n }\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: messages.filter(message => {\n const remoteMatched = syncedMessages.some(syncedMessage => {\n return syncedMessage.id !== message.id && isSameMessage(syncedMessage, message);\n });\n if (remoteMatched && message.status !== 'failed') {\n return false;\n }\n return Date.now() - Number(message.displayTimestamp || message.timestamp || 0) < 30000 || message.status === 'failed';\n })\n };\n },\n loadActiveMessages(options = {}) {\n const syncOptions = typeof options === 'boolean' ? {\n allowReadReceipt: options\n } : options;\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n this.loading = true;\n const messages = _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.getMessages(conversation, 30);\n this.pruneOptimisticMessages(conversation.id, messages);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversation.id]: mergeVisibleMessages(this.messagesByConversation[conversation.id] || [], messages)\n };\n this.syncVisibleMessages(conversation.id);\n this.loading = false;\n this.syncActiveMessages(syncOptions);\n },\n async syncActiveMessages(options = {}) {\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n const wantsReadReceipt = Boolean(options.allowReadReceipt);\n const explicitReadReceipt = wantsReadReceipt && canMarkReadNow({\n userAction: Boolean(options.userAction)\n });\n const pollingReadReceipt = canMarkReadNow();\n const markRead = explicitReadReceipt || pollingReadReceipt;\n if (this.syncInFlight) {\n if (wantsReadReceipt) {\n this.pendingReadReceiptConversationId = conversation.id;\n }\n return;\n }\n this.syncInFlight = true;\n const syncedConversationId = conversation.id;\n const previousMessages = this.messagesByConversation[syncedConversationId] || [];\n try {\n const messages = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.fetchRemoteMessages(conversation, 50, {\n markRead,\n includeConversations: Boolean(options.includeConversations)\n });\n const editedIncomingMessages = incomingEditedMessages(previousMessages, messages);\n this.pruneOptimisticMessages(syncedConversationId, messages);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [syncedConversationId]: mergeVisibleMessages(this.messagesByConversation[syncedConversationId] || [], messages)\n };\n this.syncVisibleMessages(syncedConversationId);\n if (editedIncomingMessages.length && syncedConversationId === this.activeId) {\n this.focusMessage(editedIncomingMessages.sort((a, b) => messageActivityTimestamp(b) - messageActivityTimestamp(a))[0]);\n playNotificationSound();\n }\n const latest = messages.reduce((latestMessage, message) => {\n if (!latestMessage || messageActivityTimestamp(message) > messageActivityTimestamp(latestMessage)) {\n return message;\n }\n return latestMessage;\n }, null);\n if (latest) {\n conversation.subtitle = messagePreviewText(latest);\n conversation.updatedAt = messageActivityTimestamp(latest);\n writeLocalConversations(this.conversations);\n }\n } catch (error) {\n // Keep the local view usable if a polling request misses.\n } finally {\n this.syncInFlight = false;\n if (this.pendingReadReceiptConversationId === this.activeId && canMarkReadNow()) {\n this.pendingReadReceiptConversationId = '';\n window.setTimeout(() => this.syncActiveMessages({\n allowReadReceipt: true\n }), 0);\n }\n }\n },\n scheduleActiveMessagesSync(options = {}, delay = 500) {\n if (!this.activeId || typeof document !== 'undefined' && document.visibilityState !== 'visible') {\n return;\n }\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => {\n this.syncAfterSendTimer = null;\n this.syncActiveMessages(options);\n }, Math.max(0, Number(delay) || 0));\n },\n startMessageSync() {\n this.bindReadPresenceEvents();\n if (!this.syncTimer) {\n this.syncTimer = window.setInterval(() => {\n if (document.visibilityState === 'visible' && !_services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__.realtimeNotifications.isConnected()) {\n this.syncActiveMessages();\n }\n }, Math.max(250, _config__WEBPACK_IMPORTED_MODULE_21__.appConfig.syncIntervalMs));\n }\n if (!this.conversationSyncTimer) {\n this.conversationSyncTimer = window.setInterval(() => {\n if (document.visibilityState === 'visible' && !_services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__.realtimeNotifications.isConnected()) {\n this.refreshRemoteConversations();\n }\n }, Math.max(5000, _config__WEBPACK_IMPORTED_MODULE_21__.appConfig.syncIntervalMs * 2));\n this.refreshRemoteConversations();\n }\n },\n handleRealtimeNotification() {\n window.clearTimeout(this.realtimeSyncTimer);\n this.realtimeSyncTimer = window.setTimeout(() => {\n this.refreshRemoteConversations();\n this.scheduleActiveMessagesSync({\n allowReadReceipt: canMarkReadNow(),\n includeConversations: true\n }, 300);\n }, 300);\n },\n bindReadPresenceEvents() {\n if (this.readPresenceEventsBound || typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n this.readPresenceEventsBound = true;\n const syncWhenReadable = () => {\n if (canMarkReadNow()) {\n this.refreshRemoteConversations();\n this.scheduleActiveMessagesSync({\n allowReadReceipt: true\n }, 200);\n }\n };\n window.addEventListener('focus', syncWhenReadable);\n document.addEventListener('visibilitychange', syncWhenReadable);\n },\n async refreshRemoteConversations() {\n this.bindImEvents();\n this.usingDemoData = false;\n if (this.conversationSyncInFlight) {\n return;\n }\n this.conversationSyncInFlight = true;\n try {\n const remoteConversations = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.fetchRemoteConversations(50);\n this.applyRemoteConversations(remoteConversations);\n } catch (error) {\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.refreshConversationList();\n } finally {\n this.conversationSyncInFlight = false;\n }\n },\n setActionNotice(message) {\n this.actionNotice = message;\n this.actionError = '';\n },\n setActionError(message) {\n this.actionError = message;\n this.actionNotice = '';\n },\n focusMessage(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n this.attentionMessageId = key;\n window.clearTimeout(this.attentionMessageTimer);\n this.attentionMessageTimer = window.setTimeout(() => {\n if (this.attentionMessageId === key) {\n this.attentionMessageId = '';\n }\n }, 2800);\n },\n async handleMessageAction({\n action,\n message\n }) {\n if (!message) {\n return;\n }\n if (action === 'copy') {\n await this.copyMessages([message]);\n } else if (action === 'edit') {\n this.startEditMessage(message);\n } else if (action === 'delete') {\n this.deleteMessages([message]);\n } else if (action === 'forward') {\n this.startForward([message]);\n } else if (action === 'favorite') {\n this.toggleFavorite(message);\n } else if (action === 'detail') {\n await this.openMessageDetail(message);\n } else if (action === 'quote') {\n this.quoteMessage(message);\n } else if (action === 'select') {\n this.enterSelectionMode(message);\n } else if (action === 'recall') {\n await this.recallMessage(message);\n }\n },\n async openMessageDetail(message) {\n const conversation = this.activeConversation;\n if (!conversation || !message) {\n return;\n }\n const key = messageStableKey(message);\n this.messageDetailOpen = true;\n this.messageDetailLoading = true;\n this.messageDetailError = '';\n this.messageDetail = {\n messageUid: key,\n conversationType: conversation.type || conversation.raw?.type || 'single',\n sentAt: Number(message.displayTimestamp || message.timestamp || 0),\n editedAt: Number(message.editedAt || 0),\n recalled: isRecalledMessage(message),\n localOnly: true,\n sender: {\n uid: message.from || '',\n name: message.senderName || message.from || ''\n }\n };\n try {\n if (!/^\\d+$/.test(key)) {\n this.messageDetailError = '本地临时消息暂无送达/已读详情';\n return;\n }\n const detail = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.getMessageDetail(conversation, message);\n this.messageDetail = detail || this.messageDetail;\n } catch (error) {\n this.messageDetailError = error.message || '消息详情加载失败';\n } finally {\n this.messageDetailLoading = false;\n }\n },\n closeMessageDetail() {\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n },\n async copyMessages(messages) {\n const text = messages.map(message => message.text || '').join('\\n');\n if (!text.trim()) {\n return;\n }\n try {\n await writeClipboard(text);\n this.setActionNotice(messages.length > 1 ? '已复制所选消息' : '已复制');\n } catch (error) {\n this.setActionError('复制失败');\n }\n },\n deleteMessages(messages) {\n const conversation = this.activeConversation;\n if (!conversation || !messages.length) {\n return;\n }\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.hideMessages(conversation, messages);\n this.removeMessages(conversation.id, messages);\n if (!this.selectedMessageIds.length) {\n this.selectionMode = false;\n }\n this.setActionNotice(messages.length > 1 ? '已删除所选消息' : '已删除');\n },\n toggleFavorite(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n const index = this.favoriteMessages.findIndex(item => item.key === key);\n if (index >= 0) {\n this.favoriteMessages.splice(index, 1);\n if (this.activeFavoriteKey === key) {\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n }\n this.setActionNotice('已取消收藏');\n } else {\n const conversation = this.conversations.find(item => item.id === message.conversationId) || {};\n this.favoriteMessages.unshift({\n key,\n id: message.id,\n messageUid: message.messageUid,\n conversationId: message.conversationId,\n conversationTitle: conversation.title || message.conversationTitle || '',\n type: message.type || 'text',\n text: message.text || '',\n preview: messagePreviewText(message),\n senderName: message.senderName || message.from || '',\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now()),\n editedAt: Number(message.editedAt || 0),\n recalled: isRecalledMessage(message),\n recallStatus: message.recallStatus || (isRecalledMessage(message) ? '已撤回' : ''),\n attachment: message.attachment ? {\n ...message.attachment\n } : null\n });\n this.activeFavoriteKey = key;\n this.setActionNotice('已收藏');\n }\n this.favoriteMessages = this.favoriteMessages.slice(0, 200);\n writeFavoriteMessages(this.favoriteMessages);\n },\n setActiveFavorite(key) {\n this.activeFavoriteKey = String(key || '');\n },\n removeFavorite(key) {\n const value = String(key || '');\n if (!value) {\n return;\n }\n this.favoriteMessages = this.favoriteMessages.filter(message => message.key !== value);\n if (this.activeFavoriteKey === value) {\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n }\n writeFavoriteMessages(this.favoriteMessages);\n },\n quoteMessage(message) {\n this.quotedMessage = {\n ...message,\n quoteText: quotePrefix(message)\n };\n this.setActionNotice('已引用,输入后发送');\n },\n cancelQuote() {\n this.quotedMessage = null;\n },\n enterSelectionMode(message = null) {\n this.selectionMode = true;\n if (message) {\n const key = messageStableKey(message);\n this.selectedMessageIds = key ? [key] : [];\n }\n },\n toggleSelectedMessage(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n const selected = new Set(this.selectedMessageIds);\n if (selected.has(key)) {\n selected.delete(key);\n } else {\n selected.add(key);\n }\n this.selectedMessageIds = Array.from(selected);\n this.selectionMode = this.selectedMessageIds.length > 0;\n },\n clearSelection() {\n this.selectionMode = false;\n this.selectedMessageIds = [];\n },\n copySelectedMessages() {\n return this.copyMessages(this.selectedMessages);\n },\n deleteSelectedMessages() {\n this.deleteMessages(this.selectedMessages);\n },\n startForward(messages) {\n this.forwardingMessages = messages.filter(message => message?.text);\n if (!this.forwardingMessages.length) {\n this.setActionError('没有可转发的消息');\n }\n },\n startForwardSelectedMessages() {\n this.startForward(this.selectedMessages);\n },\n cancelForward() {\n this.forwardingMessages = [];\n },\n startEditMessage(message) {\n const isResend = isRecalledMessage(message);\n if (!isResend && !message?.text) {\n this.setActionError('没有可编辑的文字内容');\n return;\n }\n this.editingMessage = message;\n this.editingText = message.text || '';\n this.editingMode = isResend ? 'resend' : 'edit';\n },\n cancelEditMessage() {\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n },\n async completeEditMessage() {\n const conversation = this.activeConversation;\n const message = this.editingMessage;\n const text = this.editingText.trim();\n const isResend = this.editingMode === 'resend' || isRecalledMessage(message);\n if (!conversation || !message) {\n this.cancelEditMessage();\n return;\n }\n if (!text) {\n this.setActionError('编辑内容不能为空');\n return;\n }\n if (!isResend && text === String(message.text || '').trim()) {\n this.cancelEditMessage();\n return;\n }\n try {\n if (isResend) {\n await this.sendTextToConversation(conversation, text);\n this.cancelEditMessage();\n this.setActionNotice('已重新发送');\n return;\n }\n const editedMessage = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.editMessage(conversation, message, text);\n this.replaceLocalMessage(conversation.id, message, editedMessage);\n if (messageActivityTimestamp(editedMessage) >= Number(conversation.updatedAt || 0)) {\n conversation.subtitle = editedMessage.text;\n conversation.updatedAt = messageActivityTimestamp(editedMessage);\n writeLocalConversations(this.conversations);\n }\n this.cancelEditMessage();\n this.setActionNotice('已编辑');\n } catch (error) {\n this.setActionError(error.message || '编辑失败');\n }\n },\n async completeForward(targetConversationId) {\n const target = this.conversations.find(conversation => conversation.id === targetConversationId);\n if (!target || !this.forwardingMessages.length) {\n return;\n }\n const text = this.forwardingMessages.map(message => `转发:${message.text || ''}`).join('\\n\\n');\n try {\n await this.sendTextToConversation(target, text);\n this.forwardingMessages = [];\n this.clearSelection();\n this.setActionNotice('已转发');\n } catch (error) {\n this.setActionError(error.message || '转发失败');\n }\n },\n async recallMessage(message) {\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.recallMessage(conversation, message);\n if (message.direction !== 'out') {\n this.removeMessages(conversation.id, [message]);\n this.setActionNotice('已撤回');\n this.syncActiveMessages();\n return;\n }\n this.replaceLocalMessage(conversation.id, message, {\n status: 'recalled',\n deliveryStatus: '',\n recalled: true,\n recallStatus: '已撤回'\n });\n this.setActionNotice('已撤回');\n } catch (error) {\n this.setActionError(error.message || '撤回失败');\n }\n },\n async createGroup(options = {}) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const conversation = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.createGroup(session.userId, options);\n this.upsertConversation(conversation);\n this.setActiveConversation(conversation.id);\n this.setActionNotice(options.channel ? '公告群已创建' : '群组已创建');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || (options.channel ? '创建公告群失败' : '创建群组失败'));\n return false;\n }\n },\n async joinGroup(groupKey) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const conversation = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.joinGroup(session.userId, groupKey);\n this.upsertConversation(conversation);\n this.setActiveConversation(conversation.id);\n this.setActionNotice('已加入群组');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '加入群组失败');\n return false;\n }\n },\n async broadcastMessage(targetIds, text) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.broadcastMessage(session.userId, targetIds, text);\n const successCount = Number(result.successCount || 0);\n const failedCount = Number(result.failedCount || 0);\n this.setActionNotice(failedCount > 0 ? `已群发 ${successCount} 条,失败 ${failedCount} 条` : `已群发 ${successCount} 条`);\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '群发失败');\n return false;\n }\n },\n async leaveGroup(conversation) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId || !conversation?.target) {\n this.setActionError('缺少群组信息');\n return false;\n }\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.leaveGroup(session.userId, conversation.target);\n this.removeConversation(conversation.id);\n this.setActionNotice('已退出群组');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '退出群组失败');\n return false;\n }\n },\n async dismissGroup(conversation) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId || !conversation?.target) {\n this.setActionError('缺少群组信息');\n return false;\n }\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.dismissGroup(session.userId, conversation.target);\n this.removeConversation(conversation.id);\n this.setActionNotice('群组已解散');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '解散群组失败');\n return false;\n }\n }\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/stores/conversations.js?\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ useConversationStore: function() { return /* binding */ useConversationStore; }\n/* harmony export */ });\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.array.includes.js */ \"./node_modules/core-js/modules/es.array.includes.js\");\n/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/es.array.push.js */ \"./node_modules/core-js/modules/es.array.push.js\");\n/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! core-js/modules/es.iterator.constructor.js */ \"./node_modules/core-js/modules/es.iterator.constructor.js\");\n/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! core-js/modules/es.iterator.filter.js */ \"./node_modules/core-js/modules/es.iterator.filter.js\");\n/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! core-js/modules/es.iterator.find.js */ \"./node_modules/core-js/modules/es.iterator.find.js\");\n/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! core-js/modules/es.iterator.flat-map.js */ \"./node_modules/core-js/modules/es.iterator.flat-map.js\");\n/* harmony import */ var core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_flat_map_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! core-js/modules/es.iterator.for-each.js */ \"./node_modules/core-js/modules/es.iterator.for-each.js\");\n/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! core-js/modules/es.iterator.map.js */ \"./node_modules/core-js/modules/es.iterator.map.js\");\n/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_es_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! core-js/modules/es.iterator.reduce.js */ \"./node_modules/core-js/modules/es.iterator.reduce.js\");\n/* harmony import */ var core_js_modules_es_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_reduce_js__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! core-js/modules/es.iterator.some.js */ \"./node_modules/core-js/modules/es.iterator.some.js\");\n/* harmony import */ var core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_some_js__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert.js */ \"./node_modules/core-js/modules/es.map.get-or-insert.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! core-js/modules/es.map.get-or-insert-computed.js */ \"./node_modules/core-js/modules/es.map.get-or-insert-computed.js\");\n/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! core-js/modules/es.set.difference.v2.js */ \"./node_modules/core-js/modules/es.set.difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! core-js/modules/es.set.intersection.v2.js */ \"./node_modules/core-js/modules/es.set.intersection.v2.js\");\n/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! core-js/modules/es.set.is-disjoint-from.v2.js */ \"./node_modules/core-js/modules/es.set.is-disjoint-from.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! core-js/modules/es.set.is-subset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-subset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! core-js/modules/es.set.is-superset-of.v2.js */ \"./node_modules/core-js/modules/es.set.is-superset-of.v2.js\");\n/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_16__);\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! core-js/modules/es.set.symmetric-difference.v2.js */ \"./node_modules/core-js/modules/es.set.symmetric-difference.v2.js\");\n/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_17__);\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! core-js/modules/es.set.union.v2.js */ \"./node_modules/core-js/modules/es.set.union.v2.js\");\n/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_18___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_18__);\n/* harmony import */ var pinia__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! pinia */ \"./node_modules/pinia/dist/pinia.mjs\");\n/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @/services/imClient */ \"./src/services/imClient.js\");\n/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @/config */ \"./src/config.js\");\n/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @/stores/session */ \"./src/stores/session.js\");\n/* harmony import */ var _services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @/services/realtimeNotifications */ \"./src/services/realtimeNotifications.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst LOCAL_CONVERSATION_STORAGE_KEY = 'qmt-web-im-local-conversations-v2';\nconst LOCAL_FAVORITE_MESSAGES_KEY = 'qmt-web-im-favorite-messages-v1';\nconst LOCAL_PINNED_MESSAGES_KEY = 'qmt-web-im-pinned-messages-v1';\nconst LOCAL_HIDDEN_CONVERSATIONS_KEY = 'qmt-web-im-hidden-conversations-v1';\nfunction scopedStorageKey(baseKey) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n const scope = `${_config__WEBPACK_IMPORTED_MODULE_21__.appConfig.appServer || ''}:${session.userId || 'anonymous'}`;\n return `${baseKey}:${encodeURIComponent(scope)}`;\n}\nfunction readFavoriteMessages() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY)) || '[]');\n } catch (error) {\n return [];\n }\n}\nfunction writeFavoriteMessages(messages) {\n localStorage.setItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY), JSON.stringify(messages));\n}\nfunction readLocalConversations() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY)) || '[]');\n } catch (error) {\n return [];\n }\n}\nfunction writeLocalConversations(conversations) {\n localStorage.setItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY), JSON.stringify(conversations));\n}\nfunction readHiddenConversationIds() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_HIDDEN_CONVERSATIONS_KEY)) || '[]');\n } catch (error) {\n return [];\n }\n}\nfunction writeHiddenConversationIds(ids) {\n localStorage.setItem(scopedStorageKey(LOCAL_HIDDEN_CONVERSATIONS_KEY), JSON.stringify(ids));\n}\nfunction readPinnedMessages() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_PINNED_MESSAGES_KEY)) || '{}');\n } catch (error) {\n return {};\n }\n}\nfunction writePinnedMessages(messages) {\n localStorage.setItem(scopedStorageKey(LOCAL_PINNED_MESSAGES_KEY), JSON.stringify(messages));\n}\nfunction parseNativePinnedMessage(item, messages = []) {\n if (!item) return null;\n const messageId = String(item.messageId || item.messageUid || '').trim();\n const matched = messages.find(message => [message.messageId, message.messageUid, message.id].filter(Boolean).some(value => String(value) === messageId));\n let encoded = {};\n try {\n encoded = typeof item.messageText === 'string' ? JSON.parse(item.messageText) : item.messageText || {};\n } catch (error) {\n encoded = {};\n }\n const text = String(encoded?.content?.searchableContent || encoded?.messageContent?.searchableContent || encoded?.text || matched?.text || '[消息]');\n return {\n ...(matched || {}),\n key: messageId || `group-pin-${item.id}`,\n id: messageId || `group-pin-${item.id}`,\n messageUid: messageId || matched?.messageUid || '',\n serverPinId: String(item.id || ''),\n text,\n type: matched?.type || encoded?.type || 'text',\n attachment: matched?.attachment || encoded?.attachment || null,\n senderName: matched?.senderName || encoded?.senderName || encoded?.from || '',\n timestamp: Number(matched?.displayTimestamp || matched?.timestamp || item.updateTime || item.createTime || Date.now())\n };\n}\nfunction sortConversations(conversations) {\n return [...conversations].sort((left, right) => {\n const leftPinned = Number(left.pinnedAt || left.top || 0);\n const rightPinned = Number(right.pinnedAt || right.top || 0);\n if (Boolean(leftPinned) !== Boolean(rightPinned)) {\n return rightPinned ? 1 : -1;\n }\n if (leftPinned && rightPinned && leftPinned !== rightPinned) {\n return rightPinned - leftPinned;\n }\n return Number(right.updatedAt || 0) - Number(left.updatedAt || 0);\n });\n}\nfunction randomId() {\n if (window.crypto && window.crypto.randomUUID) {\n return window.crypto.randomUUID().replaceAll('-', '');\n }\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\n}\nfunction messageKey(message) {\n return message.id || message.messageUid;\n}\nfunction messageStableKey(message) {\n return String(message?.messageUid || message?.id || '');\n}\nfunction messageActivityTimestamp(message) {\n return Number(message?.activityTimestamp || message?.editedAt || message?.displayTimestamp || message?.timestamp || 0);\n}\nfunction isRecalledMessage(message) {\n return Boolean(message?.recalled) || message?.status === 'recalled';\n}\nfunction attachmentLabel(message) {\n const attachment = message?.attachment;\n if (!attachment) {\n return '';\n }\n if (attachment.type === 'image') {\n return '[图片]';\n }\n return `[文件] ${attachment.name || '文件'}`;\n}\nfunction messagePreviewText(message) {\n if (isRecalledMessage(message)) {\n return `[${message?.recallStatus || '已撤回'}]`;\n }\n const text = String(message?.text || '').replace(/\\s+/g, ' ').trim();\n return text || attachmentLabel(message);\n}\nfunction quotePrefix(message) {\n const text = messagePreviewText(message);\n return text.length > 48 ? `${text.slice(0, 48)}...` : text;\n}\nasync function writeClipboard(text) {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n const element = document.createElement('textarea');\n element.value = text;\n element.setAttribute('readonly', 'readonly');\n element.style.position = 'fixed';\n element.style.left = '-9999px';\n document.body.appendChild(element);\n element.select();\n document.execCommand('copy');\n document.body.removeChild(element);\n}\nfunction isSameMessage(left, right) {\n if (left.messageUid && right.messageUid && left.messageUid === right.messageUid) {\n return true;\n }\n if (left.id && right.id && left.id === right.id) {\n return true;\n }\n return left.direction === right.direction && left.text === right.text && (left.type || 'text') === (right.type || 'text') && Math.abs(Number(left.displayTimestamp || left.timestamp || 0) - Number(right.displayTimestamp || right.timestamp || 0)) < 15000;\n}\nfunction hasExactMessage(messages, message) {\n return messages.some(item => {\n if (item.id && message.id && item.id === message.id) {\n return true;\n }\n return item.messageUid && message.messageUid && item.messageUid === message.messageUid;\n });\n}\nfunction shouldUseMessagePolling() {\n return _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.shouldUseMessagePolling ? _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.shouldUseMessagePolling() : true;\n}\nfunction canMarkReadNow(options = {}) {\n if (typeof document === 'undefined') {\n return false;\n }\n if (document.visibilityState !== 'visible') {\n return false;\n }\n if (options.userAction) {\n return true;\n }\n return true;\n}\nfunction forwardedText(message) {\n return String(message?.text || '').replace(/^转发\\s*[::]\\s*/u, '').trim();\n}\nfunction normalizeMessageForDisplay(message) {\n if (!message || message.attachment || String(message.text || '').trim()) {\n return message;\n }\n const contentType = Number(message.contentType || 0);\n const labels = {\n 3: '[图片加载失败]',\n 6: '[视频加载失败]',\n 90: '[红包]',\n 92: '以上是打招呼的内容',\n 93: '你们已经是好友了,可以开始聊天了。',\n 105: '[领取了红包]'\n };\n if (!labels[contentType]) {\n return message;\n }\n return {\n ...message,\n type: 'text',\n text: labels[contentType]\n };\n}\nfunction mergeVisibleMessages(currentMessages, syncedMessages) {\n const merged = [...syncedMessages].map(normalizeMessageForDisplay);\n currentMessages.forEach(currentMessage => {\n currentMessage = normalizeMessageForDisplay(currentMessage);\n const exists = merged.some(message => isSameMessage(message, currentMessage));\n const shouldKeepLocal = currentMessage.status === 'sending' || currentMessage.status === 'failed' || currentMessage.direction === 'out' && currentMessage.status === 'sent' && Date.now() - Number(currentMessage.timestamp || 0) < 30000;\n if (!exists && shouldKeepLocal) {\n merged.push(currentMessage);\n }\n });\n return merged.filter((message, index, messages) => {\n const key = messageKey(message);\n return messages.findIndex(item => messageKey(item) === key) === index;\n }).sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0));\n}\nfunction incomingEditedMessages(previousMessages, nextMessages) {\n const previousByKey = new Map();\n (previousMessages || []).forEach(message => {\n const key = messageStableKey(message);\n if (key) {\n previousByKey.set(key, message);\n }\n });\n return (nextMessages || []).filter(message => {\n if (message.direction !== 'in') {\n return false;\n }\n const editedAt = Number(message.editedAt || 0);\n if (editedAt <= 0) {\n return false;\n }\n const previous = previousByKey.get(messageStableKey(message));\n return previous && editedAt > Number(previous.editedAt || 0);\n });\n}\nlet notificationAudioContext = null;\nfunction playNotificationSound() {\n if (typeof window === 'undefined') {\n return;\n }\n try {\n const AudioContext = window.AudioContext || window.webkitAudioContext;\n if (!AudioContext) {\n return;\n }\n notificationAudioContext = notificationAudioContext || new AudioContext();\n if (notificationAudioContext.state === 'suspended') {\n notificationAudioContext.resume().catch(() => {});\n }\n const oscillator = notificationAudioContext.createOscillator();\n const gain = notificationAudioContext.createGain();\n const startAt = notificationAudioContext.currentTime;\n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(880, startAt);\n oscillator.frequency.setValueAtTime(660, startAt + 0.1);\n gain.gain.setValueAtTime(0.0001, startAt);\n gain.gain.exponentialRampToValueAtTime(0.12, startAt + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, startAt + 0.22);\n oscillator.connect(gain);\n gain.connect(notificationAudioContext.destination);\n oscillator.start(startAt);\n oscillator.stop(startAt + 0.24);\n } catch (error) {\n // Notification sound is best-effort; browsers may block audio until user interaction.\n }\n}\nconst useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__.defineStore)('conversations', {\n state: () => ({\n activeId: '',\n conversations: [],\n messagesByConversation: {},\n visibleMessagesByConversation: {},\n eventsBound: false,\n usingDemoData: false,\n loading: false,\n syncTimer: null,\n conversationSyncTimer: null,\n readPresenceEventsBound: false,\n syncInFlight: false,\n pendingReadReceiptConversationId: '',\n conversationSyncInFlight: false,\n syncAfterSendTimer: null,\n optimisticMessagesByConversation: {},\n quotedMessage: null,\n forwardingMessages: [],\n editingMessage: null,\n editingText: '',\n editingMode: '',\n messageDetailOpen: false,\n messageDetailLoading: false,\n messageDetailError: '',\n messageDetail: null,\n attentionMessageId: '',\n attentionMessageTimer: null,\n selectionMode: false,\n selectedMessageIds: [],\n favoriteMessages: [],\n pinnedMessagesByConversation: {},\n groupPinnedSyncAt: {},\n hiddenConversationIds: [],\n activeFavoriteKey: '',\n actionNotice: '',\n actionError: '',\n actionNoticeTimer: null,\n realtimeSyncTimer: null\n }),\n getters: {\n activeConversation(state) {\n return state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\n },\n activeMessages(state) {\n return state.visibleMessagesByConversation[state.activeId] || [];\n },\n totalUnread(state) {\n return state.conversations.reduce((sum, item) => sum + Number(item.unread || 0), 0);\n },\n canSendActiveConversation(state) {\n const conversation = state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\n if (!conversation) {\n return false;\n }\n if (conversation.type !== 'channel') {\n return true;\n }\n return ['owner', 'admin'].includes(conversation.role || conversation.raw?.role || '');\n },\n favoriteMessageIds(state) {\n return state.favoriteMessages.map(message => message.key);\n },\n activeFavorite(state) {\n return state.favoriteMessages.find(message => message.key === state.activeFavoriteKey) || state.favoriteMessages[0] || null;\n },\n activePinnedMessage(state) {\n const pinned = state.pinnedMessagesByConversation[state.activeId] || null;\n if (!pinned) return null;\n const message = (state.visibleMessagesByConversation[state.activeId] || []).find(item => messageStableKey(item) === pinned.key);\n return message ? {\n ...pinned,\n ...message,\n key: pinned.key\n } : pinned;\n },\n selectedMessages(state) {\n const selectedIds = new Set(state.selectedMessageIds);\n return (state.visibleMessagesByConversation[state.activeId] || []).filter(message => selectedIds.has(messageStableKey(message)));\n }\n },\n actions: {\n bootstrapDemoData() {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n this.bindImEvents();\n this.usingDemoData = false;\n if (!session.userId) {\n this.clearUserState();\n return;\n }\n this.loadScopedLocalState();\n this.startMessageSync();\n _services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__.realtimeNotifications.start(session.userId, payload => this.handleRealtimeNotification(payload));\n },\n loadScopedLocalState() {\n this.conversations = [];\n this.favoriteMessages = readFavoriteMessages();\n this.pinnedMessagesByConversation = readPinnedMessages();\n this.groupPinnedSyncAt = {};\n this.hiddenConversationIds = readHiddenConversationIds();\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n this.activeId = '';\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n this.quotedMessage = null;\n this.forwardingMessages = [];\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n this.selectionMode = false;\n this.selectedMessageIds = [];\n },\n clearUserState() {\n window.clearInterval(this.syncTimer);\n window.clearInterval(this.conversationSyncTimer);\n window.clearTimeout(this.syncAfterSendTimer);\n window.clearTimeout(this.attentionMessageTimer);\n window.clearTimeout(this.actionNoticeTimer);\n window.clearTimeout(this.realtimeSyncTimer);\n _services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__.realtimeNotifications.stop();\n this.syncTimer = null;\n this.conversationSyncTimer = null;\n this.syncAfterSendTimer = null;\n this.attentionMessageTimer = null;\n this.actionNoticeTimer = null;\n this.realtimeSyncTimer = null;\n this.syncInFlight = false;\n this.conversationSyncInFlight = false;\n this.pendingReadReceiptConversationId = '';\n this.activeId = '';\n this.conversations = [];\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n this.quotedMessage = null;\n this.forwardingMessages = [];\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n this.attentionMessageId = '';\n this.selectionMode = false;\n this.selectedMessageIds = [];\n this.favoriteMessages = [];\n this.hiddenConversationIds = [];\n this.activeFavoriteKey = '';\n this.actionNotice = '';\n this.actionError = '';\n },\n bindImEvents() {\n if (this.eventsBound) {\n return;\n }\n this.eventsBound = true;\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.on('messageSent', message => {\n this.appendMessage(message.conversationId, message);\n });\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.on('messageReceived', message => {\n this.appendMessage(message.conversationId, message);\n if (message.conversationId === this.activeId) {\n this.scheduleActiveMessagesSync({\n allowReadReceipt: true\n }, 500);\n }\n });\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.on('messageStatusChanged', message => {\n this.replaceMessage(message.conversationId, message);\n });\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.on('conversationsChanged', remoteConversations => {\n this.usingDemoData = false;\n this.applyRemoteConversations(remoteConversations);\n });\n },\n setActiveConversation(id) {\n this.activeId = id;\n const conversation = this.conversations.find(item => item.id === id);\n if (conversation) {\n conversation.unread = 0;\n }\n this.loadActiveMessages({\n allowReadReceipt: true,\n userAction: true\n });\n },\n sendText(payload) {\n const conversation = this.activeConversation;\n const text = typeof payload === 'string' ? payload : String(payload?.text || '');\n const mentionedUserIds = Array.isArray(payload?.mentionedUserIds) ? payload.mentionedUserIds : [];\n if (!conversation || !text.trim()) {\n return;\n }\n let value = text.trim();\n if (this.quotedMessage) {\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`;\n this.quotedMessage = null;\n }\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n direction: 'out',\n type: 'text',\n text: value,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now(),\n displayTimestamp: Date.now()\n };\n this.appendVisibleMessage(conversation.id, message);\n this.appendMessage(conversation.id, message);\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.sendTextMessage(conversation, value, message, {\n mentionedUserIds\n });\n conversation.subtitle = value;\n conversation.updatedAt = Date.now();\n writeLocalConversations(this.conversations);\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 250);\n },\n sendAttachment({\n type,\n file,\n text = ''\n }) {\n const conversation = this.activeConversation;\n if (!conversation || !file || !['image', 'file'].includes(type)) {\n return;\n }\n let value = text.trim();\n if (this.quotedMessage) {\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`.trim();\n this.quotedMessage = null;\n }\n const now = Date.now();\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n senderRole: conversation.role || conversation.raw?.role || '',\n direction: 'out',\n type,\n text: value,\n attachment: {\n type,\n name: file.name || (type === 'image' ? '图片' : '文件'),\n mime: file.type || '',\n size: file.size || 0,\n url: type === 'image' ? URL.createObjectURL(file) : ''\n },\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: now,\n displayTimestamp: now\n };\n this.appendVisibleMessage(conversation.id, message);\n this.appendMessage(conversation.id, message);\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.sendAttachmentMessage(conversation, {\n type,\n file,\n text: value\n }, message);\n conversation.subtitle = messagePreviewText(message);\n conversation.updatedAt = now;\n writeLocalConversations(this.conversations);\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 350);\n },\n async sendTextToConversation(conversation, text) {\n if (!conversation || !text.trim()) {\n return null;\n }\n const value = text.trim();\n const message = {\n id: randomId(),\n conversationId: conversation.id,\n from: 'me',\n direction: 'out',\n type: 'text',\n text: value,\n status: 'sending',\n deliveryStatus: 'sending',\n timestamp: Date.now(),\n displayTimestamp: Date.now()\n };\n this.appendMessage(conversation.id, message);\n const sentMessage = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.sendTextMessage(conversation, value, message);\n this.replaceMessage(conversation.id, sentMessage);\n return sentMessage;\n },\n upsertConversation(conversation) {\n const index = this.conversations.findIndex(item => item.id === conversation.id);\n if (index >= 0) {\n this.conversations.splice(index, 1, {\n ...this.conversations[index],\n ...conversation\n });\n } else {\n this.conversations.unshift(conversation);\n }\n this.usingDemoData = false;\n writeLocalConversations(this.conversations);\n },\n removeConversation(conversationId) {\n if (!this.hiddenConversationIds.includes(conversationId)) {\n this.hiddenConversationIds = [...this.hiddenConversationIds, conversationId];\n writeHiddenConversationIds(this.hiddenConversationIds);\n }\n this.conversations = this.conversations.filter(conversation => conversation.id !== conversationId);\n const {\n [conversationId]: removedMessages,\n ...messagesByConversation\n } = this.messagesByConversation;\n const {\n [conversationId]: removedVisibleMessages,\n ...visibleMessagesByConversation\n } = this.visibleMessagesByConversation;\n const {\n [conversationId]: removedOptimisticMessages,\n ...optimisticMessagesByConversation\n } = this.optimisticMessagesByConversation;\n void removedMessages;\n void removedVisibleMessages;\n void removedOptimisticMessages;\n this.messagesByConversation = messagesByConversation;\n this.visibleMessagesByConversation = visibleMessagesByConversation;\n this.optimisticMessagesByConversation = optimisticMessagesByConversation;\n if (this.activeId === conversationId) {\n this.activeId = this.conversations[0]?.id || '';\n }\n writeLocalConversations(this.conversations);\n if (this.activeId) {\n this.loadActiveMessages();\n }\n },\n applyRemoteConversations(remoteConversations) {\n const hidden = new Set(this.hiddenConversationIds);\n const remote = (Array.isArray(remoteConversations) ? remoteConversations : []).filter(conversation => !hidden.has(conversation.id));\n if (!remote.length && this.conversations.length) {\n return;\n }\n const merged = new Map();\n this.conversations.forEach(conversation => {\n merged.set(conversation.id, conversation);\n });\n remote.forEach(conversation => {\n const unread = conversation.id === this.activeId && canMarkReadNow() ? 0 : Number(conversation.unread || 0);\n merged.set(conversation.id, {\n ...(merged.get(conversation.id) || {}),\n ...conversation,\n unread\n });\n });\n this.conversations = sortConversations(Array.from(merged.values())).slice(0, 100);\n if (!this.conversations.length) {\n this.activeId = '';\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n writeLocalConversations(this.conversations);\n return;\n }\n if (!this.conversations.find(item => item.id === this.activeId)) {\n this.activeId = this.conversations[0].id;\n }\n writeLocalConversations(this.conversations);\n this.loadActiveMessages();\n },\n togglePinnedConversation(conversationId) {\n const conversation = this.conversations.find(item => item.id === conversationId);\n if (!conversation) return;\n conversation.pinnedAt = Number(conversation.pinnedAt || conversation.top || 0) > 0 ? 0 : Date.now();\n conversation.top = conversation.pinnedAt;\n this.conversations = sortConversations(this.conversations);\n writeLocalConversations(this.conversations);\n },\n appendMessage(conversationId, message) {\n if (message?.direction === 'in' && this.hiddenConversationIds.includes(conversationId)) {\n this.hiddenConversationIds = this.hiddenConversationIds.filter(id => id !== conversationId);\n writeHiddenConversationIds(this.hiddenConversationIds);\n }\n if (!this.messagesByConversation[conversationId]) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: []\n };\n }\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent')) {\n this.keepOptimisticMessage(conversationId, message);\n }\n if (!hasExactMessage(this.messagesByConversation[conversationId], message)) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: [...this.messagesByConversation[conversationId], message]\n };\n }\n this.updateConversationFromMessage(conversationId, message);\n this.syncVisibleMessages(conversationId);\n writeLocalConversations(this.conversations);\n },\n removeMessages(conversationId, messages) {\n const ids = new Set(messages.flatMap(message => [message.id, message.messageUid].filter(Boolean).map(String)));\n const filterMessages = list => (list || []).filter(message => {\n return ![message.id, message.messageUid].filter(Boolean).some(id => ids.has(String(id)));\n });\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: filterMessages(this.messagesByConversation[conversationId])\n };\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: filterMessages(this.visibleMessagesByConversation[conversationId])\n };\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: filterMessages(this.optimisticMessagesByConversation[conversationId])\n };\n this.selectedMessageIds = this.selectedMessageIds.filter(id => !ids.has(String(id)));\n },\n replaceLocalMessage(conversationId, targetMessage, nextMessage) {\n const keys = new Set([targetMessage.id, targetMessage.messageUid].filter(Boolean).map(String));\n const replaceInList = list => (list || []).map(message => {\n const matched = [message.id, message.messageUid].filter(Boolean).some(id => keys.has(String(id)));\n return matched ? {\n ...message,\n ...nextMessage\n } : message;\n });\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: replaceInList(this.messagesByConversation[conversationId])\n };\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: replaceInList(this.visibleMessagesByConversation[conversationId])\n };\n },\n updateConversationFromMessage(conversationId, message) {\n const conversation = this.conversations.find(item => item.id === conversationId);\n if (!conversation) {\n return;\n }\n conversation.subtitle = message.text || conversation.subtitle || '';\n conversation.updatedAt = messageActivityTimestamp(message) || Date.now();\n if (message.direction === 'in') {\n conversation.unread = conversationId === this.activeId ? 0 : Number(conversation.unread || 0) + 1;\n }\n this.conversations = [...this.conversations].sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0));\n },\n appendVisibleMessage(conversationId, message) {\n const messages = this.visibleMessagesByConversation[conversationId] || [];\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: [...messages.filter(item => item.id !== message.id), message].sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0))\n };\n },\n replaceMessage(conversationId, message) {\n if (!this.messagesByConversation[conversationId]) {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: []\n };\n }\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent' || message.status === 'failed')) {\n this.keepOptimisticMessage(conversationId, message);\n }\n const index = this.messagesByConversation[conversationId].findIndex(item => item.id === message.id);\n if (index >= 0) {\n const messages = [...this.messagesByConversation[conversationId]];\n messages.splice(index, 1, message);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: messages\n };\n } else {\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversationId]: [...this.messagesByConversation[conversationId], message]\n };\n }\n this.syncVisibleMessages(conversationId);\n },\n syncVisibleMessages(conversationId) {\n this.visibleMessagesByConversation = {\n ...this.visibleMessagesByConversation,\n [conversationId]: mergeVisibleMessages(this.optimisticMessagesByConversation[conversationId] || [], this.messagesByConversation[conversationId] || [])\n };\n },\n keepOptimisticMessage(conversationId, message) {\n if (!this.optimisticMessagesByConversation[conversationId]) {\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: []\n };\n }\n const messages = this.optimisticMessagesByConversation[conversationId];\n const index = messages.findIndex(item => item.id === message.id);\n let nextMessages;\n if (index >= 0) {\n nextMessages = [...messages];\n nextMessages.splice(index, 1, message);\n } else {\n nextMessages = [...messages, message];\n }\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: nextMessages\n };\n },\n pruneOptimisticMessages(conversationId, syncedMessages) {\n const messages = this.optimisticMessagesByConversation[conversationId] || [];\n if (!messages.length) {\n return;\n }\n this.optimisticMessagesByConversation = {\n ...this.optimisticMessagesByConversation,\n [conversationId]: messages.filter(message => {\n const remoteMatched = syncedMessages.some(syncedMessage => {\n return syncedMessage.id !== message.id && isSameMessage(syncedMessage, message);\n });\n if (remoteMatched && message.status !== 'failed') {\n return false;\n }\n return Date.now() - Number(message.displayTimestamp || message.timestamp || 0) < 30000 || message.status === 'failed';\n })\n };\n },\n loadActiveMessages(options = {}) {\n const syncOptions = typeof options === 'boolean' ? {\n allowReadReceipt: options\n } : options;\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n this.loading = true;\n const messages = _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.getMessages(conversation, 30);\n this.pruneOptimisticMessages(conversation.id, messages);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [conversation.id]: mergeVisibleMessages(this.messagesByConversation[conversation.id] || [], messages)\n };\n this.syncVisibleMessages(conversation.id);\n this.loading = false;\n this.syncActiveMessages(syncOptions);\n },\n async syncActiveMessages(options = {}) {\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n const wantsReadReceipt = Boolean(options.allowReadReceipt);\n const explicitReadReceipt = wantsReadReceipt && canMarkReadNow({\n userAction: Boolean(options.userAction)\n });\n const pollingReadReceipt = canMarkReadNow();\n const markRead = explicitReadReceipt || pollingReadReceipt;\n if (this.syncInFlight) {\n if (wantsReadReceipt) {\n this.pendingReadReceiptConversationId = conversation.id;\n }\n return;\n }\n this.syncInFlight = true;\n const syncedConversationId = conversation.id;\n const previousMessages = this.messagesByConversation[syncedConversationId] || [];\n try {\n const messages = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.fetchRemoteMessages(conversation, 50, {\n markRead,\n includeConversations: Boolean(options.includeConversations)\n });\n const isGroupConversation = ['group', 'channel'].includes(conversation.type) || ['group', 'channel', 1, '1'].includes(conversation.raw?.type);\n const shouldSyncGroupPin = isGroupConversation && Date.now() - Number(this.groupPinnedSyncAt[syncedConversationId] || 0) >= 3000;\n if (shouldSyncGroupPin) {\n try {\n const nativePins = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.fetchGroupPinnedMessages(conversation);\n this.groupPinnedSyncAt = {\n ...this.groupPinnedSyncAt,\n [syncedConversationId]: Date.now()\n };\n const nextPinned = {\n ...this.pinnedMessagesByConversation\n };\n if (nativePins.length) {\n nextPinned[syncedConversationId] = parseNativePinnedMessage(nativePins[0], messages);\n } else {\n delete nextPinned[syncedConversationId];\n }\n this.pinnedMessagesByConversation = nextPinned;\n writePinnedMessages(nextPinned);\n } catch (error) {\n console.warn('群置顶消息同步失败', error);\n }\n }\n const remotePinnedKey = String(messages.pinnedMessageUid || '');\n if (!isGroupConversation && remotePinnedKey) {\n const pinnedMessage = messages.find(item => messageStableKey(item) === remotePinnedKey) || messages.pinnedMessage || (this.pinnedMessagesByConversation[syncedConversationId]?.key === remotePinnedKey ? this.pinnedMessagesByConversation[syncedConversationId] : null);\n this.pinnedMessagesByConversation = {\n ...this.pinnedMessagesByConversation,\n [syncedConversationId]: pinnedMessage ? {\n key: remotePinnedKey,\n id: remotePinnedKey,\n text: messagePreviewText(pinnedMessage),\n type: pinnedMessage.type || 'text',\n attachment: pinnedMessage.attachment ? {\n ...pinnedMessage.attachment\n } : null,\n senderName: pinnedMessage.senderName || pinnedMessage.from || '',\n timestamp: Number(pinnedMessage.displayTimestamp || pinnedMessage.timestamp || Date.now())\n } : {\n key: remotePinnedKey,\n id: remotePinnedKey,\n text: '[置顶消息]'\n }\n };\n writePinnedMessages(this.pinnedMessagesByConversation);\n }\n const editedIncomingMessages = incomingEditedMessages(previousMessages, messages);\n this.pruneOptimisticMessages(syncedConversationId, messages);\n this.messagesByConversation = {\n ...this.messagesByConversation,\n [syncedConversationId]: mergeVisibleMessages(this.messagesByConversation[syncedConversationId] || [], messages)\n };\n this.syncVisibleMessages(syncedConversationId);\n if (editedIncomingMessages.length && syncedConversationId === this.activeId) {\n this.focusMessage(editedIncomingMessages.sort((a, b) => messageActivityTimestamp(b) - messageActivityTimestamp(a))[0]);\n playNotificationSound();\n }\n const latest = messages.reduce((latestMessage, message) => {\n if (!latestMessage || messageActivityTimestamp(message) > messageActivityTimestamp(latestMessage)) {\n return message;\n }\n return latestMessage;\n }, null);\n if (latest) {\n conversation.subtitle = messagePreviewText(latest);\n conversation.updatedAt = messageActivityTimestamp(latest);\n writeLocalConversations(this.conversations);\n }\n } catch (error) {\n // Keep the local view usable if a polling request misses.\n } finally {\n this.syncInFlight = false;\n if (this.pendingReadReceiptConversationId === this.activeId && canMarkReadNow()) {\n this.pendingReadReceiptConversationId = '';\n window.setTimeout(() => this.syncActiveMessages({\n allowReadReceipt: true\n }), 0);\n }\n }\n },\n scheduleActiveMessagesSync(options = {}, delay = 500) {\n if (!this.activeId || typeof document !== 'undefined' && document.visibilityState !== 'visible') {\n return;\n }\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => {\n this.syncAfterSendTimer = null;\n this.syncActiveMessages(options);\n }, Math.max(0, Number(delay) || 0));\n },\n startMessageSync() {\n this.bindReadPresenceEvents();\n if (!this.syncTimer) {\n this.syncTimer = window.setInterval(() => {\n if (document.visibilityState === 'visible' && !_services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__.realtimeNotifications.isConnected()) {\n this.syncActiveMessages();\n }\n }, Math.max(250, _config__WEBPACK_IMPORTED_MODULE_21__.appConfig.syncIntervalMs));\n }\n if (!this.conversationSyncTimer) {\n this.conversationSyncTimer = window.setInterval(() => {\n if (document.visibilityState === 'visible' && !_services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__.realtimeNotifications.isConnected()) {\n this.refreshRemoteConversations();\n }\n }, Math.max(5000, _config__WEBPACK_IMPORTED_MODULE_21__.appConfig.syncIntervalMs * 2));\n this.refreshRemoteConversations();\n }\n },\n handleRealtimeNotification() {\n window.clearTimeout(this.realtimeSyncTimer);\n this.realtimeSyncTimer = window.setTimeout(() => {\n this.refreshRemoteConversations();\n this.scheduleActiveMessagesSync({\n allowReadReceipt: canMarkReadNow(),\n includeConversations: true\n }, 300);\n }, 300);\n },\n bindReadPresenceEvents() {\n if (this.readPresenceEventsBound || typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n this.readPresenceEventsBound = true;\n const syncWhenReadable = () => {\n if (canMarkReadNow()) {\n this.refreshRemoteConversations();\n this.scheduleActiveMessagesSync({\n allowReadReceipt: true\n }, 200);\n }\n };\n window.addEventListener('focus', syncWhenReadable);\n document.addEventListener('visibilitychange', syncWhenReadable);\n },\n async refreshRemoteConversations() {\n this.bindImEvents();\n this.usingDemoData = false;\n if (this.conversationSyncInFlight) {\n return;\n }\n this.conversationSyncInFlight = true;\n try {\n const remoteConversations = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.fetchRemoteConversations(50);\n this.applyRemoteConversations(remoteConversations);\n } catch (error) {\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.refreshConversationList();\n } finally {\n this.conversationSyncInFlight = false;\n }\n },\n setActionNotice(message) {\n this.actionNotice = message;\n this.actionError = '';\n window.clearTimeout(this.actionNoticeTimer);\n this.actionNoticeTimer = window.setTimeout(() => {\n this.actionNotice = '';\n this.actionNoticeTimer = null;\n }, 3000);\n },\n setActionError(message) {\n this.actionError = message;\n this.actionNotice = '';\n window.clearTimeout(this.actionNoticeTimer);\n this.actionNoticeTimer = window.setTimeout(() => {\n this.actionError = '';\n this.actionNoticeTimer = null;\n }, 3000);\n },\n focusMessage(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n this.attentionMessageId = key;\n window.clearTimeout(this.attentionMessageTimer);\n this.attentionMessageTimer = window.setTimeout(() => {\n if (this.attentionMessageId === key) {\n this.attentionMessageId = '';\n }\n }, 2800);\n },\n async handleMessageAction({\n action,\n message\n }) {\n if (!message) {\n return;\n }\n if (action === 'copy') {\n await this.copyMessages([message]);\n } else if (action === 'edit') {\n this.startEditMessage(message);\n } else if (action === 'delete') {\n this.deleteMessages([message]);\n } else if (action === 'forward') {\n this.startForward([message]);\n } else if (action === 'favorite') {\n this.toggleFavorite(message);\n } else if (action === 'pin') {\n this.togglePinnedMessage(message);\n } else if (action === 'detail') {\n await this.openMessageDetail(message);\n } else if (action === 'quote') {\n this.quoteMessage(message);\n } else if (action === 'select') {\n this.enterSelectionMode(message);\n } else if (action === 'recall') {\n await this.recallMessage(message);\n }\n },\n async openMessageDetail(message) {\n const conversation = this.activeConversation;\n if (!conversation || !message) {\n return;\n }\n const key = messageStableKey(message);\n this.messageDetailOpen = true;\n this.messageDetailLoading = true;\n this.messageDetailError = '';\n this.messageDetail = {\n messageUid: key,\n conversationType: conversation.type || conversation.raw?.type || 'single',\n sentAt: Number(message.displayTimestamp || message.timestamp || 0),\n editedAt: Number(message.editedAt || 0),\n recalled: isRecalledMessage(message),\n localOnly: true,\n sender: {\n uid: message.from || '',\n name: message.senderName || message.from || ''\n }\n };\n try {\n if (!/^\\d+$/.test(key)) {\n this.messageDetailError = '本地临时消息暂无送达/已读详情';\n return;\n }\n const detail = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.getMessageDetail(conversation, message);\n this.messageDetail = detail || this.messageDetail;\n } catch (error) {\n this.messageDetailError = error.message || '消息详情加载失败';\n } finally {\n this.messageDetailLoading = false;\n }\n },\n closeMessageDetail() {\n this.messageDetailOpen = false;\n this.messageDetailLoading = false;\n this.messageDetailError = '';\n this.messageDetail = null;\n },\n async copyMessages(messages) {\n const text = messages.map(message => message.text || '').join('\\n');\n if (!text.trim()) {\n return;\n }\n try {\n await writeClipboard(text);\n this.setActionNotice(messages.length > 1 ? '已复制所选消息' : '已复制');\n } catch (error) {\n this.setActionError('复制失败');\n }\n },\n deleteMessages(messages) {\n const conversation = this.activeConversation;\n if (!conversation || !messages.length) {\n return;\n }\n _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.hideMessages(conversation, messages);\n this.removeMessages(conversation.id, messages);\n if (!this.selectedMessageIds.length) {\n this.selectionMode = false;\n }\n this.setActionNotice(messages.length > 1 ? '已删除所选消息' : '已删除');\n },\n toggleFavorite(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n const index = this.favoriteMessages.findIndex(item => item.key === key);\n if (index >= 0) {\n this.favoriteMessages.splice(index, 1);\n if (this.activeFavoriteKey === key) {\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n }\n this.setActionNotice('已取消收藏');\n } else {\n const conversation = this.conversations.find(item => item.id === message.conversationId) || {};\n this.favoriteMessages.unshift({\n key,\n id: message.id,\n messageUid: message.messageUid,\n conversationId: message.conversationId,\n conversationTitle: conversation.title || message.conversationTitle || '',\n type: message.type || 'text',\n text: message.text || '',\n preview: messagePreviewText(message),\n senderName: message.senderName || message.from || '',\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now()),\n editedAt: Number(message.editedAt || 0),\n recalled: isRecalledMessage(message),\n recallStatus: message.recallStatus || (isRecalledMessage(message) ? '已撤回' : ''),\n attachment: message.attachment ? {\n ...message.attachment\n } : null\n });\n this.activeFavoriteKey = key;\n this.setActionNotice('已收藏');\n }\n this.favoriteMessages = this.favoriteMessages.slice(0, 200);\n writeFavoriteMessages(this.favoriteMessages);\n },\n async togglePinnedMessage(message) {\n const conversationId = message?.conversationId || this.activeId;\n const key = messageStableKey(message);\n if (!conversationId || !key) return;\n const current = this.pinnedMessagesByConversation[conversationId];\n const next = {\n ...this.pinnedMessagesByConversation\n };\n if (current && current.key === key) {\n delete next[conversationId];\n this.pinnedMessagesByConversation = next;\n writePinnedMessages(next);\n this.setActionNotice('已取消置顶');\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.setPinnedMessage(this.activeConversation, '', current);\n } catch (error) {\n this.setActionError(`已在本地取消,服务器同步失败:${error.message || '取消置顶失败'}`);\n }\n } else {\n next[conversationId] = {\n key,\n id: key,\n text: messagePreviewText(message),\n type: message.type || 'text',\n attachment: message.attachment ? {\n ...message.attachment\n } : null,\n senderName: message.senderName || message.from || '',\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now())\n };\n this.pinnedMessagesByConversation = next;\n writePinnedMessages(next);\n this.setActionNotice('消息已置顶');\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.setPinnedMessage(this.activeConversation, key, message);\n const nativePins = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.fetchGroupPinnedMessages(this.activeConversation).catch(() => []);\n if (nativePins.length) {\n const refreshed = parseNativePinnedMessage(nativePins[0], this.activeMessages);\n this.pinnedMessagesByConversation = {\n ...this.pinnedMessagesByConversation,\n [conversationId]: refreshed\n };\n writePinnedMessages(this.pinnedMessagesByConversation);\n }\n } catch (error) {\n const rollback = {\n ...this.pinnedMessagesByConversation\n };\n delete rollback[conversationId];\n this.pinnedMessagesByConversation = rollback;\n writePinnedMessages(rollback);\n this.setActionError(`置顶失败:${error.message || '服务器同步失败'}`);\n }\n }\n },\n async clearPinnedMessage() {\n const current = this.pinnedMessagesByConversation[this.activeId] || null;\n const next = {\n ...this.pinnedMessagesByConversation\n };\n delete next[this.activeId];\n this.pinnedMessagesByConversation = next;\n writePinnedMessages(next);\n this.setActionNotice('已取消置顶');\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.setPinnedMessage(this.activeConversation, '', current);\n } catch (error) {\n this.setActionError(`已在本地取消,服务器同步失败:${error.message || '取消置顶失败'}`);\n }\n },\n setActiveFavorite(key) {\n this.activeFavoriteKey = String(key || '');\n },\n removeFavorite(key) {\n const value = String(key || '');\n if (!value) {\n return;\n }\n this.favoriteMessages = this.favoriteMessages.filter(message => message.key !== value);\n if (this.activeFavoriteKey === value) {\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n }\n writeFavoriteMessages(this.favoriteMessages);\n },\n quoteMessage(message) {\n this.quotedMessage = {\n ...message,\n quoteText: quotePrefix(message)\n };\n this.setActionNotice('已引用,输入后发送');\n },\n cancelQuote() {\n this.quotedMessage = null;\n },\n enterSelectionMode(message = null) {\n this.selectionMode = true;\n if (message) {\n const key = messageStableKey(message);\n this.selectedMessageIds = key ? [key] : [];\n }\n },\n toggleSelectedMessage(message) {\n const key = messageStableKey(message);\n if (!key) {\n return;\n }\n const selected = new Set(this.selectedMessageIds);\n if (selected.has(key)) {\n selected.delete(key);\n } else {\n selected.add(key);\n }\n this.selectedMessageIds = Array.from(selected);\n this.selectionMode = this.selectedMessageIds.length > 0;\n },\n clearSelection() {\n this.selectionMode = false;\n this.selectedMessageIds = [];\n },\n copySelectedMessages() {\n return this.copyMessages(this.selectedMessages);\n },\n deleteSelectedMessages() {\n this.deleteMessages(this.selectedMessages);\n },\n startForward(messages) {\n this.forwardingMessages = messages.filter(message => message?.text || message?.attachment?.url);\n if (!this.forwardingMessages.length) {\n this.setActionError('没有可转发的消息');\n }\n },\n startForwardSelectedMessages() {\n this.startForward(this.selectedMessages);\n },\n cancelForward() {\n this.forwardingMessages = [];\n },\n startEditMessage(message) {\n const isResend = isRecalledMessage(message);\n if (!isResend && !message?.text) {\n this.setActionError('没有可编辑的文字内容');\n return;\n }\n this.editingMessage = message;\n this.editingText = message.text || '';\n this.editingMode = isResend ? 'resend' : 'edit';\n },\n cancelEditMessage() {\n this.editingMessage = null;\n this.editingText = '';\n this.editingMode = '';\n },\n async completeEditMessage() {\n const conversation = this.activeConversation;\n const message = this.editingMessage;\n const text = this.editingText.trim();\n const isResend = this.editingMode === 'resend' || isRecalledMessage(message);\n if (!conversation || !message) {\n this.cancelEditMessage();\n return;\n }\n if (!text) {\n this.setActionError('编辑内容不能为空');\n return;\n }\n if (!isResend && text === String(message.text || '').trim()) {\n this.cancelEditMessage();\n return;\n }\n try {\n if (isResend) {\n await this.sendTextToConversation(conversation, text);\n this.cancelEditMessage();\n this.setActionNotice('已重新发送');\n return;\n }\n const editedMessage = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.editMessage(conversation, message, text);\n this.replaceLocalMessage(conversation.id, message, editedMessage);\n if (messageActivityTimestamp(editedMessage) >= Number(conversation.updatedAt || 0)) {\n conversation.subtitle = editedMessage.text;\n conversation.updatedAt = messageActivityTimestamp(editedMessage);\n writeLocalConversations(this.conversations);\n }\n this.cancelEditMessage();\n this.setActionNotice('已编辑');\n } catch (error) {\n this.setActionError(error.message || '编辑失败');\n }\n },\n async completeForward(targetConversationId) {\n const target = this.conversations.find(conversation => conversation.id === targetConversationId);\n if (!target || !this.forwardingMessages.length) {\n return;\n }\n const messages = [...this.forwardingMessages];\n let successCount = 0;\n const errors = [];\n for (const message of messages) {\n try {\n if (message.attachment?.url) {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.forwardAttachmentMessage(target, message);\n } else if (message.text) {\n const text = forwardedText(message);\n if (!text) {\n throw new Error('消息内容为空');\n }\n const sentMessage = await this.sendTextToConversation(target, text);\n if (sentMessage?.status === 'failed') {\n throw new Error(sentMessage.error || '转发失败');\n }\n }\n successCount += 1;\n } catch (error) {\n errors.push(error.message || '转发失败');\n }\n }\n if (successCount > 0) {\n this.forwardingMessages = [];\n this.clearSelection();\n this.refreshRemoteConversations();\n }\n if (errors.length) {\n this.setActionError(`成功 ${successCount} 条,失败 ${errors.length} 条:${errors[0]}`);\n } else {\n this.setActionNotice(`已转发 ${successCount} 条`);\n }\n },\n async recallMessage(message) {\n const conversation = this.activeConversation;\n if (!conversation) {\n return;\n }\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.recallMessage(conversation, message);\n if (message.direction !== 'out') {\n this.removeMessages(conversation.id, [message]);\n this.setActionNotice('已撤回');\n this.syncActiveMessages();\n return;\n }\n this.replaceLocalMessage(conversation.id, message, {\n status: 'recalled',\n deliveryStatus: '',\n recalled: true,\n recallStatus: '已撤回'\n });\n this.setActionNotice('已撤回');\n } catch (error) {\n this.setActionError(error.message || '撤回失败');\n }\n },\n async createGroup(options = {}) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const conversation = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.createGroup(session.userId, options);\n this.upsertConversation(conversation);\n this.setActiveConversation(conversation.id);\n this.setActionNotice(options.channel ? '公告群已创建' : '群组已创建');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || (options.channel ? '创建公告群失败' : '创建群组失败'));\n return false;\n }\n },\n async joinGroup(groupKey) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const conversation = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.joinGroup(session.userId, groupKey);\n this.upsertConversation(conversation);\n this.setActiveConversation(conversation.id);\n this.setActionNotice('已加入群组');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '加入群组失败');\n return false;\n }\n },\n async broadcastMessage(targetIds, text) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId) {\n this.setActionError('请先登录');\n return false;\n }\n try {\n const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.broadcastMessage(session.userId, targetIds, text);\n const successCount = Number(result.successCount || 0);\n const failedCount = Number(result.failedCount || 0);\n this.setActionNotice(failedCount > 0 ? `已群发 ${successCount} 条,失败 ${failedCount} 条` : `已群发 ${successCount} 条`);\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '群发失败');\n return false;\n }\n },\n async leaveGroup(conversation) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId || !conversation?.target) {\n this.setActionError('缺少群组信息');\n return false;\n }\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.leaveGroup(session.userId, conversation.target);\n this.removeConversation(conversation.id);\n this.setActionNotice('已退出群组');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '退出群组失败');\n return false;\n }\n },\n async dismissGroup(conversation) {\n const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__.useSessionStore)();\n if (!session.userId || !conversation?.target) {\n this.setActionError('缺少群组信息');\n return false;\n }\n try {\n await _services_imClient__WEBPACK_IMPORTED_MODULE_20__.imClient.dismissGroup(session.userId, conversation.target);\n this.removeConversation(conversation.id);\n this.setActionNotice('群组已解散');\n this.refreshRemoteConversations();\n return true;\n } catch (error) {\n this.setActionError(error.message || '解散群组失败');\n return false;\n }\n }\n }\n});\n\n//# sourceURL=webpack://jc-web-im/./src/stores/conversations.js?\n}");
/***/ }),
@@ -423,7 +434,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
-eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root {\\r\\n color-scheme: light;\\r\\n --bg: #f4f6f8;\\r\\n --panel: #ffffff;\\r\\n --panel-soft: #f8fafc;\\r\\n --line: #d9e0e7;\\r\\n --text: #18212f;\\r\\n --muted: #6a7584;\\r\\n --primary: #177d72;\\r\\n --primary-strong: #0f625a;\\r\\n --accent: #d84e3f;\\r\\n --bubble-in: #ffffff;\\r\\n --bubble-out: #dff4ef;\\r\\n --rail: #202a33;\\r\\n}\\r\\n\\r\\n* {\\r\\n box-sizing: border-box;\\r\\n}\\r\\n\\r\\nhtml,\\r\\nbody,\\r\\n#app {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\nbody {\\r\\n margin: 0;\\r\\n min-width: 320px;\\r\\n background: var(--bg);\\r\\n color: var(--text);\\r\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif;\\r\\n}\\r\\n\\r\\nbutton,\\r\\ninput,\\r\\ntextarea {\\r\\n font: inherit;\\r\\n}\\r\\n\\r\\nbutton {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.login-page {\\r\\n min-height: 100vh;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 24px;\\r\\n background: linear-gradient(135deg, #eef6f3 0%, #f7f3ee 55%, #eef2f7 100%);\\r\\n}\\r\\n\\r\\n.login-panel {\\r\\n width: min(420px, 100%);\\r\\n padding: 32px;\\r\\n background: var(--panel);\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 18px 48px rgba(30, 40, 50, 0.12);\\r\\n}\\r\\n\\r\\n.brand-lockup {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 14px;\\r\\n margin-bottom: 28px;\\r\\n}\\r\\n\\r\\n.brand-mark,\\r\\n.rail-avatar,\\r\\n.conversation-avatar {\\r\\n display: grid;\\r\\n place-items: center;\\r\\n flex: 0 0 auto;\\r\\n}\\r\\n\\r\\n.image-avatar {\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.brand-mark {\\r\\n width: 48px;\\r\\n height: 48px;\\r\\n border-radius: 8px;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.brand-lockup h1,\\r\\n.list-header h2,\\r\\n.chat-header h2 {\\r\\n margin: 0;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.brand-lockup p,\\r\\n.list-header p,\\r\\n.chat-header p {\\r\\n margin: 4px 0 0;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.login-form {\\r\\n display: grid;\\r\\n gap: 16px;\\r\\n}\\r\\n\\r\\n.login-tabs,\\r\\n.code-row,\\r\\n.phone-row,\\r\\n.captcha-row {\\r\\n display: grid;\\r\\n grid-template-columns: 1fr 1fr;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.login-tabs button,\\r\\n.code-action {\\r\\n height: 38px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.login-tabs button.active {\\r\\n border-color: var(--primary);\\r\\n background: #e8f4f2;\\r\\n color: var(--primary-strong);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.login-tabs {\\r\\n grid-template-columns: repeat(3, minmax(0, 1fr));\\r\\n}\\r\\n\\r\\n.login-tabs button {\\r\\n min-width: 0;\\r\\n padding: 0 6px;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.code-row {\\r\\n grid-template-columns: minmax(0, 1fr) 112px;\\r\\n}\\r\\n\\r\\n.captcha-row {\\r\\n grid-template-columns: minmax(0, 1fr) 112px;\\r\\n}\\r\\n\\r\\n.phone-row {\\r\\n grid-template-columns: 86px minmax(0, 1fr);\\r\\n}\\r\\n\\r\\n.country-code-field {\\r\\n height: 42px;\\r\\n display: grid;\\r\\n grid-template-columns: 24px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.country-code-field:focus-within {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.country-code-field span {\\r\\n display: grid;\\r\\n place-items: center;\\r\\n color: var(--muted);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.code-action:disabled {\\r\\n cursor: not-allowed;\\r\\n opacity: 0.55;\\r\\n}\\r\\n\\r\\n.login-form label {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.label-row {\\r\\n min-height: 18px;\\r\\n display: grid;\\r\\n grid-template-columns: 86px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.field-error-badge {\\r\\n min-height: 28px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 4px 10px;\\r\\n border-radius: 2px;\\r\\n background: var(--accent);\\r\\n color: #fff;\\r\\n font-weight: 700;\\r\\n line-height: 1.2;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.login-form input,\\r\\n.login-form select,\\r\\n.modal-panel input,\\r\\n.modal-panel textarea,\\r\\n.search-box input,\\r\\n.message-composer textarea {\\r\\n width: 100%;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.login-form input,\\r\\n.login-form select,\\r\\n.modal-panel input,\\r\\n.search-box input {\\r\\n height: 42px;\\r\\n padding: 0 12px;\\r\\n}\\r\\n\\r\\n.modal-panel textarea {\\r\\n min-height: 92px;\\r\\n resize: vertical;\\r\\n padding: 10px 12px;\\r\\n line-height: 1.5;\\r\\n}\\r\\n\\r\\n.login-form .country-code-field input {\\r\\n height: 40px;\\r\\n padding: 0 10px 0 0;\\r\\n border: 0;\\r\\n border-radius: 0;\\r\\n}\\r\\n\\r\\n.login-form .country-code-field input:focus {\\r\\n border-color: transparent;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.login-form input:focus,\\r\\n.login-form select:focus,\\r\\n.modal-panel input:focus,\\r\\n.modal-panel textarea:focus,\\r\\n.search-box input:focus,\\r\\n.message-composer textarea:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.login-form input.captcha-input-valid {\\r\\n border-color: var(--primary);\\r\\n background: var(--primary);\\r\\n color: #fff;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.login-form input.captcha-input-valid::-moz-placeholder {\\r\\n color: rgba(255, 255, 255, 0.75);\\r\\n}\\r\\n\\r\\n.login-form input.captcha-input-valid::placeholder {\\r\\n color: rgba(255, 255, 255, 0.75);\\r\\n}\\r\\n\\r\\n.login-form input.captcha-input-invalid {\\r\\n border-color: var(--accent);\\r\\n color: var(--accent);\\r\\n box-shadow: 0 0 0 3px rgba(216, 78, 63, 0.12);\\r\\n}\\r\\n\\r\\n.login-form input.field-input-error {\\r\\n border-color: var(--accent);\\r\\n color: var(--accent);\\r\\n box-shadow: 0 0 0 3px rgba(216, 78, 63, 0.12);\\r\\n}\\r\\n\\r\\n.login-form input.field-input-error::-moz-placeholder {\\r\\n color: rgba(216, 78, 63, 0.78);\\r\\n}\\r\\n\\r\\n.login-form input.field-input-error::placeholder {\\r\\n color: rgba(216, 78, 63, 0.78);\\r\\n}\\r\\n\\r\\n.captcha-button {\\r\\n width: 112px;\\r\\n height: 42px;\\r\\n padding: 0;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #f7fbfa;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.captcha-button img {\\r\\n display: block;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n}\\r\\n\\r\\n.qr-login-card {\\r\\n position: relative;\\r\\n width: min(248px, 100%);\\r\\n aspect-ratio: 1;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n justify-self: center;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: #fff;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.qr-code-button {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 18px;\\r\\n border: 0;\\r\\n background: #fff;\\r\\n color: var(--muted);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.qr-code-button:disabled {\\r\\n cursor: default;\\r\\n}\\r\\n\\r\\n.qr-code-button img {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n image-rendering: pixelated;\\r\\n}\\r\\n\\r\\n.qr-login-card.scanned .qr-code-button,\\r\\n.qr-login-card.expired .qr-code-button,\\r\\n.qr-login-card.error .qr-code-button {\\r\\n opacity: 0.22;\\r\\n}\\r\\n\\r\\n.qr-scan-user {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n background: rgba(255, 255, 255, 0.76);\\r\\n}\\r\\n\\r\\n.qr-scan-user img,\\r\\n.qr-scan-user span {\\r\\n width: 70px;\\r\\n height: 70px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 8px;\\r\\n background: var(--primary);\\r\\n color: #fff;\\r\\n font-size: 28px;\\r\\n font-weight: 800;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.qr-login-status {\\r\\n min-height: 48px;\\r\\n display: grid;\\r\\n gap: 4px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.qr-login-status strong {\\r\\n color: var(--text);\\r\\n font-size: 15px;\\r\\n}\\r\\n\\r\\n.qr-login-status span {\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.primary-action,\\r\\n.primary-inline-action,\\r\\n.send-button {\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: var(--primary);\\r\\n color: #fff;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.primary-action {\\r\\n height: 44px;\\r\\n}\\r\\n\\r\\n.primary-action:hover,\\r\\n.primary-inline-action:hover,\\r\\n.send-button:hover {\\r\\n background: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.primary-action:disabled,\\r\\n.primary-inline-action:disabled,\\r\\n.send-button:disabled {\\r\\n cursor: not-allowed;\\r\\n opacity: 0.55;\\r\\n}\\r\\n\\r\\n.ghost-action {\\r\\n width: 100%;\\r\\n height: 40px;\\r\\n margin-top: 12px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.ghost-inline-action,\\r\\n.primary-inline-action,\\r\\n.danger-inline-action {\\r\\n height: 38px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n padding: 0 16px;\\r\\n border-radius: 6px;\\r\\n font-weight: 700;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.ghost-inline-action {\\r\\n border: 1px solid var(--line);\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.ghost-inline-action:hover {\\r\\n background: #edf2f5;\\r\\n}\\r\\n\\r\\n.danger-inline-action {\\r\\n border: 1px solid #ef4444;\\r\\n background: #fff;\\r\\n color: #b91c1c;\\r\\n}\\r\\n\\r\\n.danger-inline-action:hover {\\r\\n background: #fee2e2;\\r\\n}\\r\\n\\r\\n.form-error {\\r\\n margin: 0;\\r\\n color: var(--accent);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.form-info {\\r\\n margin: 0;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.app-shell {\\n height: 100dvh;\\n min-height: 0;\\n display: grid;\\n grid-template-columns: 64px minmax(260px, 340px) minmax(0, 1fr);\\n overflow: hidden;\\n background: var(--panel);\\n}\\n\\n.documented-shell {\\n min-height: 100dvh;\\n display: grid;\\n grid-template-columns: 260px minmax(0, 1fr);\\n background:\\n radial-gradient(circle at top left, rgba(23, 125, 114, 0.08), transparent 28%),\\n linear-gradient(180deg, #f4f8f7 0%, #eef3f7 100%);\\n}\\n\\n.documented-rail {\\n min-height: 0;\\n display: grid;\\n align-content: start;\\n gap: 14px;\\n padding: 24px 20px;\\n border-right: 1px solid var(--line);\\n background: rgba(255, 255, 255, 0.82);\\n backdrop-filter: blur(12px);\\n}\\n\\n.documented-avatar {\\n width: 64px;\\n height: 64px;\\n display: grid;\\n place-items: center;\\n overflow: hidden;\\n border-radius: 16px;\\n background: #dff4ef;\\n color: var(--primary-strong);\\n font-size: 28px;\\n font-weight: 800;\\n}\\n\\n.documented-avatar img {\\n width: 100%;\\n height: 100%;\\n -o-object-fit: cover;\\n object-fit: cover;\\n}\\n\\n.documented-rail-copy {\\n display: grid;\\n gap: 4px;\\n}\\n\\n.documented-rail-copy strong {\\n font-size: 16px;\\n}\\n\\n.documented-rail-copy small {\\n color: var(--muted);\\n overflow-wrap: anywhere;\\n}\\n\\n.documented-rail-button {\\n min-height: 40px;\\n padding: 0 14px;\\n border: 0;\\n border-radius: 10px;\\n background: var(--primary);\\n color: #fff;\\n font-weight: 700;\\n text-align: left;\\n}\\n\\n.documented-rail-button.ghost {\\n border: 1px solid var(--line);\\n background: #fff;\\n color: var(--text);\\n}\\n\\n.documented-main {\\n min-width: 0;\\n min-height: 0;\\n overflow: auto;\\n padding: 28px;\\n display: grid;\\n align-content: start;\\n gap: 18px;\\n}\\n\\n.documented-header {\\n display: flex;\\n align-items: end;\\n justify-content: space-between;\\n gap: 18px;\\n}\\n\\n.documented-header h1 {\\n margin: 0;\\n font-size: 28px;\\n}\\n\\n.documented-header p {\\n margin: 6px 0 0;\\n color: var(--muted);\\n}\\n\\n.documented-status {\\n min-width: 180px;\\n display: grid;\\n gap: 4px;\\n padding: 14px 16px;\\n border: 1px solid var(--line);\\n border-radius: 14px;\\n background: rgba(255, 255, 255, 0.88);\\n}\\n\\n.documented-status span {\\n color: var(--muted);\\n font-size: 12px;\\n}\\n\\n.documented-status strong {\\n font-size: 15px;\\n}\\n\\n.documented-card {\\n display: grid;\\n gap: 12px;\\n padding: 20px;\\n border: 1px solid var(--line);\\n border-radius: 16px;\\n background: rgba(255, 255, 255, 0.88);\\n box-shadow: 0 16px 36px rgba(24, 33, 47, 0.06);\\n}\\n\\n.documented-card h2 {\\n margin: 0;\\n font-size: 18px;\\n}\\n\\n.documented-text {\\n margin: 0;\\n color: var(--muted);\\n line-height: 1.6;\\n}\\n\\n.documented-list {\\n margin: 0;\\n padding-left: 18px;\\n display: grid;\\n gap: 8px;\\n line-height: 1.55;\\n}\\n\\n.documented-list.muted {\\n color: var(--muted);\\n}\\n\\n.documented-meta {\\n margin: 0;\\n display: grid;\\n gap: 10px;\\n}\\n\\n.documented-meta div {\\n display: grid;\\n grid-template-columns: 110px minmax(0, 1fr);\\n gap: 12px;\\n padding-top: 10px;\\n border-top: 1px solid var(--line);\\n}\\n\\n.documented-meta dt {\\n color: var(--muted);\\n}\\n\\n.documented-meta dd {\\n margin: 0;\\n overflow-wrap: anywhere;\\n}\\n\\n.documented-password-panel {\\n width: min(100%, 360px);\\n}\\n\\r\\n.navigation-rail {\\r\\n min-height: 0;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n align-items: center;\\r\\n gap: 14px;\\r\\n padding: 16px 10px;\\r\\n background: var(--rail);\\r\\n}\\r\\n\\r\\n.rail-avatar {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n border-radius: 8px;\\r\\n background: #e9f7f4;\\r\\n color: var(--primary-strong);\\r\\n font-weight: 800;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.rail-avatar-button {\\r\\n position: relative;\\r\\n border: 0;\\r\\n padding: 0;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.rail-avatar-button::after {\\r\\n content: \\\"+\\\";\\r\\n position: absolute;\\r\\n right: -2px;\\r\\n bottom: -2px;\\r\\n width: 15px;\\r\\n height: 15px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border: 1px solid var(--rail);\\r\\n border-radius: 50%;\\r\\n background: var(--primary);\\r\\n color: #fff;\\r\\n font-size: 11px;\\r\\n font-weight: 800;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.rail-avatar-button:hover,\\r\\n.rail-avatar-button:focus-visible {\\r\\n box-shadow: 0 0 0 3px rgba(47, 196, 178, 0.28);\\r\\n}\\r\\n\\r\\n.rail-avatar img {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.rail-button,\\r\\n.icon-button {\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n}\\r\\n\\r\\n.rail-button {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n color: #dbe5ea;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.rail-button svg {\\r\\n width: 22px;\\r\\n height: 22px;\\r\\n fill: none;\\r\\n stroke: currentColor;\\r\\n stroke-width: 1.8;\\r\\n stroke-linecap: round;\\r\\n stroke-linejoin: round;\\r\\n}\\r\\n\\r\\n.rail-button.active,\\r\\n.rail-button:hover {\\r\\n background: rgba(255, 255, 255, 0.12);\\r\\n}\\r\\n\\r\\n.rail-logout-button:hover {\\r\\n background: rgba(239, 68, 68, 0.2);\\r\\n color: #fecaca;\\r\\n}\\r\\n\\r\\n.rail-spacer {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.conversation-list {\\r\\n position: relative;\\r\\n min-height: 0;\\r\\n display: grid;\\r\\n grid-template-rows: 72px auto minmax(0, 1fr);\\r\\n border-right: 1px solid var(--line);\\r\\n background: var(--panel-soft);\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.modal-backdrop {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n z-index: 5;\\r\\n display: grid;\\r\\n place-items: start center;\\r\\n padding: 88px 16px 16px;\\r\\n background: rgba(24, 33, 47, 0.28);\\r\\n}\\r\\n\\r\\n.modal-panel {\\r\\n width: min(100%, 308px);\\r\\n display: grid;\\r\\n gap: 14px;\\r\\n padding: 16px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.modal-panel header,\\r\\n.modal-actions {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.modal-panel header strong {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.modal-panel label {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.settings-backdrop {\\r\\n z-index: 24;\\r\\n place-items: center;\\r\\n padding: 24px 16px;\\r\\n}\\r\\n\\r\\n.settings-panel {\\r\\n width: min(620px, calc(100vw - 32px));\\r\\n max-height: calc(100dvh - 48px);\\r\\n display: grid;\\r\\n gap: 14px;\\r\\n overflow: auto;\\r\\n padding: 16px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.settings-panel header,\\r\\n.settings-password-form footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.settings-panel header strong {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.settings-layout {\\r\\n display: grid;\\r\\n grid-template-columns: 170px minmax(0, 1fr);\\r\\n gap: 14px;\\r\\n}\\r\\n\\r\\n.settings-menu {\\r\\n display: grid;\\r\\n align-content: start;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.settings-menu button {\\r\\n min-height: 46px;\\r\\n display: grid;\\r\\n gap: 2px;\\r\\n justify-items: start;\\r\\n padding: 8px 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.settings-menu button.active,\\r\\n.settings-menu button:hover {\\r\\n border-color: var(--primary);\\r\\n background: #e8f4f2;\\r\\n color: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.settings-menu button span {\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.settings-menu button small {\\r\\n color: var(--muted);\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.settings-password-form,\\r\\n.settings-placeholder {\\r\\n min-height: 250px;\\r\\n display: grid;\\r\\n align-content: start;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.settings-password-form h3,\\r\\n.settings-placeholder h3 {\\r\\n margin: 0;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.settings-password-form label {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.settings-password-form input {\\r\\n width: 100%;\\r\\n height: 42px;\\r\\n padding: 0 12px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.settings-password-form input:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.settings-password-form footer {\\r\\n margin-top: 4px;\\r\\n justify-content: flex-end;\\r\\n flex-wrap: wrap;\\r\\n}\\r\\n\\r\\n.settings-password-form footer .inline-save-status {\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n.settings-placeholder {\\r\\n place-items: center;\\r\\n border: 1px dashed var(--line);\\r\\n border-radius: 8px;\\r\\n color: var(--muted);\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.settings-placeholder p {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.profile-edit-panel {\\r\\n width: min(100%, 360px);\\r\\n}\\r\\n\\r\\n.profile-avatar-field {\\r\\n display: grid;\\r\\n justify-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.profile-avatar-field input[type=\\\"file\\\"] {\\r\\n position: absolute;\\r\\n inline-size: 1px;\\r\\n block-size: 1px;\\r\\n opacity: 0;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.profile-avatar-preview {\\r\\n width: 88px;\\r\\n height: 88px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n overflow: hidden;\\r\\n padding: 0;\\r\\n border: 0;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n cursor: default;\\r\\n font-size: 30px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.profile-avatar-preview.clickable {\\r\\n cursor: zoom-in;\\r\\n}\\r\\n\\r\\n.profile-avatar-preview.clickable:hover {\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.16);\\r\\n}\\r\\n\\r\\n.profile-avatar-preview img {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.profile-avatar-change-button {\\r\\n min-width: 96px;\\r\\n}\\r\\n\\r\\n.avatar-preview-backdrop {\\r\\n z-index: 32;\\r\\n place-items: center;\\r\\n padding: 24px 16px;\\r\\n}\\r\\n\\r\\n.avatar-preview-dialog {\\r\\n width: min(520px, calc(100vw - 32px));\\r\\n max-height: calc(100dvh - 48px);\\r\\n display: grid;\\r\\n gap: 12px;\\r\\n padding: 14px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.avatar-preview-dialog header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.avatar-preview-actions {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 6px;\\r\\n}\\r\\n\\r\\n.avatar-preview-actions button {\\r\\n min-width: 34px;\\r\\n height: 34px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.avatar-preview-actions .icon-button {\\r\\n border: 0;\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.avatar-preview-stage {\\r\\n height: min(430px, calc(100dvh - 160px));\\r\\n min-height: 260px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n overflow: hidden;\\r\\n border-radius: 8px;\\r\\n background: #101820;\\r\\n cursor: zoom-in;\\r\\n touch-action: none;\\r\\n}\\r\\n\\r\\n.avatar-preview-stage.dragging {\\r\\n cursor: grabbing;\\r\\n}\\r\\n\\r\\n.avatar-preview-stage img {\\r\\n max-width: min(100%, 430px);\\r\\n max-height: 100%;\\r\\n border-radius: 8px;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n transform-origin: center center;\\r\\n transition: transform 0.08s ease-out;\\r\\n -webkit-user-select: none;\\r\\n -moz-user-select: none;\\r\\n user-select: none;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.avatar-preview-stage.dragging img {\\r\\n transition: none;\\r\\n}\\r\\n\\r\\n.avatar-cropper-backdrop {\\r\\n z-index: 30;\\r\\n place-items: center;\\r\\n padding: 24px 16px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-panel {\\r\\n width: min(720px, calc(100vw - 32px));\\r\\n max-height: calc(100dvh - 48px);\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.avatar-cropper-header-actions {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-layout {\\r\\n display: grid;\\r\\n grid-template-columns: minmax(0, 1fr) 190px;\\r\\n gap: 14px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-stage {\\r\\n position: relative;\\r\\n height: 360px;\\r\\n min-height: 360px;\\r\\n overflow: hidden;\\r\\n border: 1px dashed #b8ccd7;\\r\\n border-radius: 8px;\\r\\n background: #0f1b24;\\r\\n touch-action: none;\\r\\n cursor: grab;\\r\\n}\\r\\n\\r\\n.avatar-cropper-stage.dragging {\\r\\n cursor: grabbing;\\r\\n}\\r\\n\\r\\n.avatar-cropper-stage canvas {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.avatar-cropper-box {\\r\\n position: absolute;\\r\\n left: 50%;\\r\\n top: 50%;\\r\\n width: 74%;\\r\\n aspect-ratio: 1;\\r\\n max-width: calc(100% - 44px);\\r\\n max-height: calc(100% - 44px);\\r\\n transform: translate(-50%, -50%);\\r\\n border: 2px dashed var(--primary);\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.72);\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.avatar-cropper-mask {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.avatar-cropper-placeholder {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n color: #d9e8ee;\\r\\n font-size: 13px;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.avatar-cropper-controls {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n align-content: start;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-tools {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-tools button {\\r\\n min-height: 34px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.avatar-cropper-tools button:hover {\\r\\n border-color: var(--primary);\\r\\n color: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.avatar-cropper-preview {\\r\\n width: 108px;\\r\\n height: 108px;\\r\\n justify-self: center;\\r\\n overflow: hidden;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: #eef4f7;\\r\\n}\\r\\n\\r\\n.avatar-cropper-preview canvas {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.avatar-cropper-controls footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n flex-wrap: wrap;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-controls footer .inline-save-status {\\r\\n flex: 1 1 100%;\\r\\n}\\r\\n\\r\\n.modal-actions {\\r\\n justify-content: flex-end;\\r\\n}\\r\\n\\r\\n.list-header,\\r\\n.chat-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n min-height: 72px;\\r\\n padding: 16px 18px;\\r\\n border-bottom: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.icon-button {\\r\\n width: 34px;\\r\\n height: 34px;\\r\\n color: var(--muted);\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.icon-button:hover {\\r\\n background: #edf2f5;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.search-box {\\r\\n padding: 12px 14px;\\r\\n}\\r\\n\\r\\n.sidebar-scroll {\\r\\n min-height: 0;\\r\\n overflow: auto;\\r\\n overscroll-behavior: contain;\\r\\n}\\r\\n\\r\\n.conversation-item {\\r\\n width: 100%;\\r\\n display: grid;\\r\\n grid-template-columns: 42px minmax(0, 1fr) auto;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n padding: 12px 14px;\\r\\n border: 0;\\r\\n border-top: 1px solid rgba(217, 224, 231, 0.7);\\r\\n background: transparent;\\r\\n color: inherit;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.conversation-item.active,\\r\\n.conversation-item:hover {\\r\\n background: #eaf3f1;\\r\\n}\\r\\n\\r\\n.favorite-item {\\r\\n width: 100%;\\r\\n display: grid;\\r\\n grid-template-columns: 32px minmax(0, 1fr) auto;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n padding: 12px 14px;\\r\\n border: 0;\\r\\n border-top: 1px solid rgba(217, 224, 231, 0.7);\\r\\n background: transparent;\\r\\n color: inherit;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.favorite-item.active,\\r\\n.favorite-item:hover {\\r\\n background: #eaf3f1;\\r\\n}\\r\\n\\r\\n.favorite-item-icon {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 6px;\\r\\n background: #fff7df;\\r\\n color: #c79520;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.favorite-item-main {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.favorite-item-main strong,\\r\\n.favorite-item-main small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.favorite-item-main strong {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.favorite-item-main small,\\r\\n.favorite-item time {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.favorite-panel {\\r\\n min-width: 0;\\r\\n min-height: 0;\\r\\n display: grid;\\r\\n grid-template-rows: auto minmax(0, 1fr);\\r\\n background: #eef3f6;\\r\\n}\\r\\n\\r\\n.favorite-detail {\\r\\n min-height: 0;\\r\\n display: grid;\\r\\n align-content: start;\\r\\n gap: 16px;\\r\\n padding: 28px;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.favorite-detail-message {\\r\\n width: min(680px, 100%);\\r\\n display: grid;\\r\\n grid-template-columns: auto minmax(0, 1fr);\\r\\n gap: 10px 12px;\\r\\n padding: 18px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 8px 24px rgba(24, 33, 47, 0.08);\\r\\n}\\r\\n\\r\\n.favorite-detail-message.recalled {\\r\\n border-color: #f1c7c1;\\r\\n background: #fff7f6;\\r\\n}\\r\\n\\r\\n.favorite-detail-star {\\r\\n color: #c79520;\\r\\n font-size: 18px;\\r\\n line-height: 1.4;\\r\\n}\\r\\n\\r\\n.favorite-detail-body {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.favorite-detail-message p {\\r\\n margin: 0;\\r\\n white-space: pre-wrap;\\r\\n overflow-wrap: anywhere;\\r\\n line-height: 1.55;\\r\\n}\\r\\n\\r\\n.favorite-detail-message time {\\r\\n grid-column: 2;\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.favorite-detail-image {\\r\\n width: min(420px, 100%);\\r\\n display: block;\\r\\n overflow: hidden;\\r\\n border: 1px solid #b9ded8;\\r\\n border-radius: 8px;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.favorite-detail-image img {\\r\\n display: block;\\r\\n width: 100%;\\r\\n max-height: 360px;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n background: #f8fbfc;\\r\\n}\\r\\n\\r\\n.favorite-detail-file {\\r\\n width: min(360px, 100%);\\r\\n}\\r\\n\\r\\n.favorite-detail-actions {\\r\\n width: min(680px, 100%);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.favorite-detail-actions .inline-save-status {\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n.empty-list,\\r\\n.empty-chat {\\r\\n display: grid;\\r\\n place-items: center;\\r\\n align-content: center;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.empty-list {\\r\\n min-height: 180px;\\r\\n padding: 24px;\\r\\n}\\r\\n\\r\\n.empty-chat {\\r\\n min-height: 0;\\r\\n padding: 24px;\\r\\n}\\r\\n\\r\\n.empty-list strong,\\r\\n.empty-chat strong {\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.conversation-avatar {\\r\\n width: 42px;\\r\\n height: 42px;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.conversation-copy {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.conversation-copy strong,\\r\\n.conversation-copy small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.conversation-copy small {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.unread-badge {\\r\\n justify-self: end;\\r\\n min-width: 20px;\\r\\n height: 20px;\\r\\n padding: 0 6px;\\r\\n border-radius: 999px;\\r\\n background: #ef4444;\\r\\n color: #fff;\\r\\n font-size: 12px;\\r\\n font-weight: 800;\\r\\n line-height: 20px;\\r\\n text-align: center;\\r\\n box-shadow: 0 0 0 2px #f7fafc;\\r\\n}\\r\\n\\r\\n.chat-panel {\\r\\n position: relative;\\r\\n min-width: 0;\\r\\n min-height: 0;\\r\\n height: 100%;\\r\\n display: grid;\\r\\n grid-template-rows: 72px minmax(0, 1fr) auto auto;\\r\\n overflow: hidden;\\r\\n background: #eef2f5;\\r\\n}\\r\\n\\r\\n.contact-panel {\\r\\n min-width: 0;\\r\\n min-height: 0;\\r\\n height: 100%;\\r\\n display: grid;\\r\\n grid-template-rows: 72px minmax(0, 1fr);\\r\\n overflow: auto;\\r\\n background: #eef2f5;\\r\\n}\\r\\n\\r\\n.contact-profile {\\r\\n align-self: start;\\r\\n width: min(520px, calc(100% - 48px));\\r\\n margin: 48px auto;\\r\\n display: grid;\\r\\n justify-items: center;\\r\\n gap: 18px;\\r\\n padding: 32px;\\r\\n background: var(--panel);\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n.profile-avatar {\\r\\n width: 76px;\\r\\n height: 76px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n font-size: 28px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.profile-main {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.remark-row {\\r\\n min-width: 0;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.profile-main h3 {\\r\\n margin: 0;\\r\\n font-size: 22px;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.remark-edit-button {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n flex: 0 0 auto;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.profile-main p {\\r\\n margin: 6px 0 0;\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.profile-fields {\\r\\n width: 100%;\\r\\n display: grid;\\r\\n gap: 12px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.profile-fields div {\\r\\n display: grid;\\r\\n grid-template-columns: 80px minmax(0, 1fr);\\r\\n gap: 12px;\\r\\n padding: 10px 0;\\r\\n border-top: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.profile-fields dt {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.profile-fields dd {\\r\\n margin: 0;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.profile-action {\\r\\n width: 160px;\\r\\n}\\r\\n\\r\\n.contact-panel .contact-modal-backdrop {\\r\\n position: fixed;\\r\\n}\\r\\n\\r\\n.header-actions {\\r\\n display: flex;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.chat-header-actions {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.chat-title-button {\\r\\n display: grid;\\r\\n grid-template-columns: 38px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n max-width: min(460px, 52vw);\\r\\n padding: 0;\\r\\n border: 0;\\r\\n background: transparent;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.chat-title-avatar {\\r\\n width: 38px;\\r\\n height: 38px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n font-size: 16px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.chat-title-copy {\\r\\n min-width: 0;\\r\\n}\\r\\n\\r\\n.chat-title-button h2 {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.chat-title-button:hover h2 {\\r\\n color: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.chat-more-menu {\\r\\n top: 38px;\\r\\n width: 150px;\\r\\n}\\r\\n\\r\\n.action-menu-anchor {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.quick-action-menu {\\r\\n position: absolute;\\r\\n top: 40px;\\r\\n right: 0;\\r\\n z-index: 7;\\r\\n width: 168px;\\r\\n display: grid;\\r\\n padding: 6px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 14px 34px rgba(24, 33, 47, 0.16);\\r\\n}\\r\\n\\r\\n.quick-action-menu button {\\r\\n height: 34px;\\r\\n padding: 0 10px;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.quick-action-menu button:hover {\\r\\n background: #edf2f5;\\r\\n}\\r\\n\\r\\n.quick-action-menu.chat-more-menu {\\r\\n top: 38px;\\r\\n width: 150px;\\r\\n}\\r\\n\\r\\n.conversation-action-panel {\\r\\n width: min(100%, 340px);\\r\\n max-height: calc(100dvh - 116px);\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.contact-picker {\\r\\n display: grid;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.contact-picker > input {\\r\\n width: 100%;\\r\\n height: 38px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n}\\r\\n\\r\\n.contact-picker-list {\\r\\n max-height: 220px;\\r\\n overflow: auto;\\r\\n display: grid;\\r\\n gap: 6px;\\r\\n padding-right: 2px;\\r\\n}\\r\\n\\r\\n.contact-picker-row {\\r\\n width: 100%;\\r\\n min-height: 48px;\\r\\n display: grid;\\r\\n grid-template-columns: 22px 36px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n padding: 6px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.contact-picker-row:hover,\\r\\n.contact-picker-row.selected {\\r\\n border-color: #9fd4cc;\\r\\n background: #edf8f5;\\r\\n}\\r\\n\\r\\n.contact-picker-row .conversation-avatar {\\r\\n width: 36px;\\r\\n height: 36px;\\r\\n border-radius: 6px;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.contact-check {\\r\\n width: 20px;\\r\\n height: 20px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 4px;\\r\\n color: var(--primary-strong);\\r\\n font-size: 13px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.contact-picker-copy {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 2px;\\r\\n}\\r\\n\\r\\n.contact-picker-copy strong,\\r\\n.contact-picker-copy small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.contact-picker-copy small {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.contact-picker-empty {\\r\\n min-height: 64px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n color: var(--muted);\\r\\n border: 1px dashed var(--line);\\r\\n border-radius: 6px;\\r\\n}\\r\\n\\r\\n.group-dialog {\\r\\n width: min(420px, calc(100% - 32px));\\r\\n max-height: calc(100dvh - 116px);\\r\\n display: grid;\\r\\n gap: 16px;\\r\\n padding: 18px;\\r\\n overflow: auto;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.group-dialog header,\\r\\n.group-dialog footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.group-dialog h3 {\\r\\n margin: 0;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.single-profile-dialog {\\r\\n width: min(420px, calc(100% - 32px));\\r\\n}\\r\\n\\r\\n.single-profile-summary {\\r\\n display: grid;\\r\\n justify-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.single-profile-summary strong {\\r\\n max-width: 100%;\\r\\n overflow-wrap: anywhere;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.single-profile-footer {\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n}\\r\\n\\r\\n.single-profile-footer .inline-save-status {\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n.message-detail-dialog {\\r\\n width: min(560px, calc(100% - 32px));\\r\\n}\\r\\n\\r\\n.message-detail-meta div {\\r\\n grid-template-columns: 88px minmax(0, 1fr);\\r\\n}\\r\\n\\r\\n.message-detail-muted {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.message-detail-summary {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.message-detail-summary span {\\r\\n min-height: 30px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n gap: 4px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #f8fbfb;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.message-detail-summary strong {\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.message-detail-groups {\\r\\n display: grid;\\r\\n gap: 14px;\\r\\n}\\r\\n\\r\\n.message-detail-section {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.message-detail-section header {\\r\\n min-height: 28px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n border-bottom: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.message-detail-section header strong {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.message-detail-section header span {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.message-detail-member-list {\\r\\n display: grid;\\r\\n overflow: hidden;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.message-detail-member-row {\\r\\n display: grid;\\r\\n grid-template-columns: 34px minmax(0, 1fr) auto auto;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n min-height: 48px;\\r\\n padding: 7px 8px;\\r\\n border-top: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.message-detail-member-row:first-child {\\r\\n border-top: 0;\\r\\n}\\r\\n\\r\\n.message-detail-member-row .conversation-avatar {\\r\\n width: 34px;\\r\\n height: 34px;\\r\\n border-radius: 6px;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.message-detail-member-main {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 2px;\\r\\n}\\r\\n\\r\\n.message-detail-member-main strong,\\r\\n.message-detail-member-main small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.message-detail-member-main strong {\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.message-detail-member-main small,\\r\\n.message-detail-member-time {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.message-detail-member-time {\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.message-detail-role {\\r\\n min-height: 22px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n padding: 0 7px;\\r\\n border: 1px solid #c7d9e5;\\r\\n border-radius: 6px;\\r\\n color: #416272;\\r\\n font-size: 12px;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.group-dialog label {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.group-dialog input {\\r\\n width: 100%;\\r\\n height: 42px;\\r\\n padding: 0 12px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n}\\r\\n\\r\\n.group-dialog textarea,\\r\\n.group-dialog select {\\r\\n width: 100%;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.group-dialog textarea {\\r\\n min-height: 86px;\\r\\n resize: vertical;\\r\\n padding: 10px 12px;\\r\\n line-height: 1.5;\\r\\n}\\r\\n\\r\\n.group-dialog select {\\r\\n height: 42px;\\r\\n padding: 0 10px;\\r\\n}\\r\\n\\r\\n.group-dialog input:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.group-dialog textarea:focus,\\r\\n.group-dialog select:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.group-profile {\\r\\n display: grid;\\r\\n gap: 10px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.group-profile div {\\r\\n display: grid;\\r\\n grid-template-columns: 78px minmax(0, 1fr);\\r\\n gap: 12px;\\r\\n padding: 10px 0;\\r\\n border-top: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.group-profile dt {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.group-profile dd {\\r\\n margin: 0;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.group-loading {\\r\\n min-height: 96px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.group-member-list {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.group-member-row {\\r\\n display: grid;\\r\\n grid-template-columns: 42px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n min-height: 54px;\\r\\n padding: 8px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.group-member-row.selectable {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.group-member-row.with-check {\\r\\n grid-template-columns: 24px 42px minmax(0, 1fr);\\r\\n}\\r\\n\\r\\n.group-member-row.selectable:hover,\\r\\n.group-member-row.selectable.selected {\\r\\n border-color: #9fd4cc;\\r\\n background: #edf8f5;\\r\\n}\\r\\n\\r\\n.group-member-row input[type=\\\"checkbox\\\"] {\\r\\n justify-self: center;\\r\\n width: 16px;\\r\\n height: 16px;\\r\\n}\\r\\n\\r\\n.group-member-row span:last-child {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 3px;\\r\\n}\\r\\n\\r\\n.group-member-row strong,\\r\\n.group-member-row small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.group-member-row small {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.group-management-dialog {\\r\\n width: min(520px, calc(100% - 32px));\\r\\n}\\r\\n\\r\\n.group-management-tabs {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.group-management-tabs button {\\r\\n height: 34px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.group-management-tabs button.active,\\r\\n.group-management-tabs button:hover {\\r\\n border-color: var(--primary);\\r\\n background: #e8f4f2;\\r\\n color: var(--primary-strong);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.group-manage-section {\\r\\n display: grid;\\r\\n gap: 14px;\\r\\n}\\r\\n\\r\\n.group-manage-section footer {\\r\\n justify-content: flex-end;\\r\\n}\\r\\n\\r\\n.mute-save-footer {\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.inline-save-status {\\r\\n color: var(--primary-strong);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.inline-save-status.error {\\r\\n color: var(--accent);\\r\\n}\\r\\n\\r\\n.mute-time-grid {\\r\\n display: grid;\\r\\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.message-list {\\r\\n min-height: 0;\\r\\n overflow: auto;\\r\\n overscroll-behavior: contain;\\r\\n padding: 24px;\\r\\n}\\r\\n\\r\\n.message-row {\\r\\n display: flex;\\r\\n align-items: flex-end;\\r\\n gap: 8px;\\r\\n margin-bottom: 14px;\\r\\n}\\r\\n\\r\\n.message-row.out {\\r\\n justify-content: flex-end;\\r\\n}\\r\\n\\r\\n.message-sender-avatar {\\r\\n width: 34px;\\r\\n height: 34px;\\r\\n flex: 0 0 auto;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n overflow: hidden;\\r\\n padding: 0;\\r\\n border: 0;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n font-size: 14px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.message-sender-avatar img {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.message-stack {\\r\\n max-width: min(68%, 720px);\\r\\n display: grid;\\r\\n justify-items: start;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.message-row.out .message-stack {\\r\\n justify-items: end;\\r\\n}\\r\\n\\r\\n.message-sender-name {\\r\\n min-height: 18px;\\r\\n max-width: 100%;\\r\\n padding: 0;\\r\\n border: 0;\\r\\n background: transparent;\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n font-weight: 700;\\r\\n text-align: left;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.message-sender-name:hover {\\r\\n color: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.message-sender-role {\\r\\n margin-left: 4px;\\r\\n color: var(--primary-strong);\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.message-row.selected .message-bubble {\\r\\n box-shadow: 0 0 0 2px rgba(24, 138, 121, 0.26);\\r\\n}\\r\\n\\r\\n.message-row.attention .message-bubble {\\r\\n animation: message-attention 1.4s ease-in-out 2;\\r\\n box-shadow: 0 0 0 3px rgba(24, 138, 121, 0.3);\\r\\n}\\r\\n\\r\\n@keyframes message-attention {\\r\\n 0%,\\r\\n 100% {\\r\\n box-shadow: 0 0 0 2px rgba(24, 138, 121, 0.16);\\r\\n }\\r\\n\\r\\n 45% {\\r\\n box-shadow: 0 0 0 5px rgba(24, 138, 121, 0.36);\\r\\n }\\r\\n}\\r\\n\\r\\n.message-select {\\r\\n width: 24px;\\r\\n height: 24px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n}\\r\\n\\r\\n.message-select input {\\r\\n width: 16px;\\r\\n height: 16px;\\r\\n}\\r\\n\\r\\n.message-bubble {\\r\\n position: relative;\\r\\n max-width: min(68%, 720px);\\r\\n padding: 10px 12px 8px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--bubble-in);\\r\\n box-shadow: 0 2px 8px rgba(30, 40, 50, 0.05);\\r\\n}\\r\\n\\r\\n.message-stack .message-bubble {\\r\\n max-width: 100%;\\r\\n}\\r\\n\\r\\n.message-row.out .message-bubble {\\r\\n background: var(--bubble-out);\\r\\n border-color: #bfe4dc;\\r\\n}\\r\\n\\r\\n.message-bubble:hover {\\r\\n border-color: #9fd4cc;\\r\\n}\\r\\n\\r\\n.message-bubble.role-bubble-owner,\\r\\n.message-bubble.role-bubble-admin {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.message-bubble.role-bubble-owner::after,\\r\\n.message-bubble.role-bubble-admin::after {\\r\\n content: \\\"\\\";\\r\\n position: absolute;\\r\\n top: 0;\\r\\n right: 0;\\r\\n width: 0;\\r\\n height: 0;\\r\\n border-top: 16px solid #d79d22;\\r\\n border-left: 16px solid transparent;\\r\\n}\\r\\n\\r\\n.message-bubble.role-bubble-admin::after {\\r\\n border-top-color: #178a79;\\r\\n}\\r\\n\\r\\n.message-bubble p {\\r\\n margin: 0;\\r\\n line-height: 1.5;\\r\\n white-space: pre-wrap;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.message-image {\\r\\n padding: 0;\\r\\n border: 0;\\r\\n display: block;\\r\\n max-width: min(280px, 62vw);\\r\\n overflow: hidden;\\r\\n border-radius: 6px;\\r\\n background: #edf2f5;\\r\\n cursor: zoom-in;\\r\\n}\\r\\n\\r\\n.message-image + p,\\r\\n.message-file + p {\\r\\n margin-top: 8px;\\r\\n}\\r\\n\\r\\n.message-image img {\\r\\n display: block;\\r\\n max-width: 100%;\\r\\n max-height: 320px;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n}\\r\\n\\r\\n.image-viewer-backdrop {\\r\\n position: fixed;\\r\\n inset: 0;\\r\\n z-index: 80;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 24px;\\r\\n background: rgba(12, 18, 26, 0.58);\\r\\n}\\r\\n\\r\\n.image-viewer-dialog {\\r\\n width: min(880px, calc(100vw - 48px));\\r\\n height: min(640px, calc(100vh - 48px));\\r\\n min-width: 360px;\\r\\n min-height: 280px;\\r\\n max-width: calc(100vw - 48px);\\r\\n max-height: calc(100vh - 48px);\\r\\n display: grid;\\r\\n grid-template-rows: 52px minmax(0, 1fr);\\r\\n overflow: hidden;\\r\\n resize: both;\\r\\n border: 1px solid rgba(255, 255, 255, 0.18);\\r\\n border-radius: 8px;\\r\\n background: #101820;\\r\\n box-shadow: 0 24px 70px rgba(0, 0, 0, 0.36);\\r\\n}\\r\\n\\r\\n.image-viewer-toolbar {\\r\\n min-width: 0;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n gap: 8px;\\r\\n padding: 8px 10px;\\r\\n border-bottom: 1px solid rgba(255, 255, 255, 0.12);\\r\\n background: rgba(24, 33, 47, 0.94);\\r\\n}\\r\\n\\r\\n.image-viewer-title {\\r\\n min-width: 0;\\r\\n flex: 1;\\r\\n overflow: hidden;\\r\\n color: #f8fafc;\\r\\n font-size: 13px;\\r\\n font-weight: 700;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.image-viewer-toolbar button {\\r\\n width: 36px;\\r\\n height: 36px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: #f8fafc;\\r\\n font-size: 17px;\\r\\n font-weight: 700;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.image-viewer-toolbar button:hover {\\r\\n background: rgba(255, 255, 255, 0.14);\\r\\n}\\r\\n\\r\\n.image-viewer-stage {\\r\\n min-width: 0;\\r\\n min-height: 0;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n overflow: hidden;\\r\\n background: #0c121a;\\r\\n cursor: default;\\r\\n touch-action: none;\\r\\n}\\r\\n\\r\\n.image-viewer-stage.zoomed {\\r\\n cursor: grab;\\r\\n}\\r\\n\\r\\n.image-viewer-stage.dragging {\\r\\n cursor: grabbing;\\r\\n}\\r\\n\\r\\n.image-viewer-img {\\r\\n max-width: calc(100% - 32px);\\r\\n max-height: calc(100% - 32px);\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n transform-origin: center center;\\r\\n transition: transform 0.08s ease-out;\\r\\n -webkit-user-select: none;\\r\\n -moz-user-select: none;\\r\\n user-select: none;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.image-viewer-stage.dragging .image-viewer-img {\\r\\n transition: none;\\r\\n}\\r\\n\\r\\n.sender-profile-backdrop {\\r\\n position: fixed;\\r\\n inset: 0;\\r\\n z-index: 84;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 24px;\\r\\n background: rgba(24, 33, 47, 0.32);\\r\\n}\\r\\n\\r\\n.sender-profile-dialog {\\r\\n width: min(380px, calc(100vw - 32px));\\r\\n display: grid;\\r\\n gap: 16px;\\r\\n padding: 18px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.sender-profile-dialog header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.sender-profile-main {\\r\\n display: grid;\\r\\n justify-items: center;\\r\\n gap: 8px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.sender-profile-main strong {\\r\\n max-width: 100%;\\r\\n overflow-wrap: anywhere;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.sender-profile-main span {\\r\\n color: var(--primary-strong);\\r\\n font-size: 12px;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.sender-profile-fields {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.sender-profile-fields div {\\r\\n display: grid;\\r\\n grid-template-columns: 72px minmax(0, 1fr);\\r\\n gap: 10px;\\r\\n padding-top: 8px;\\r\\n border-top: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.sender-profile-fields dt {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.sender-profile-fields dd {\\r\\n margin: 0;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.sender-profile-alias {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.sender-profile-alias input {\\r\\n width: 100%;\\r\\n height: 40px;\\r\\n padding: 0 12px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.sender-profile-alias input:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.sender-profile-actions {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.sender-profile-actions .inline-save-status {\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n@media (max-width: 480px) {\\r\\n .image-viewer-backdrop {\\r\\n padding: 12px;\\r\\n }\\r\\n\\r\\n .image-viewer-dialog {\\r\\n width: calc(100vw - 24px);\\r\\n height: min(560px, calc(100vh - 24px));\\r\\n min-width: 280px;\\r\\n min-height: 240px;\\r\\n max-width: calc(100vw - 24px);\\r\\n max-height: calc(100vh - 24px);\\r\\n }\\r\\n\\r\\n .image-viewer-toolbar {\\r\\n gap: 4px;\\r\\n padding: 6px;\\r\\n }\\r\\n\\r\\n .image-viewer-toolbar button {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n font-size: 15px;\\r\\n }\\r\\n\\r\\n .message-detail-member-row {\\r\\n grid-template-columns: 34px minmax(0, 1fr);\\r\\n }\\r\\n\\r\\n .message-detail-member-time,\\r\\n .message-detail-role {\\r\\n grid-column: 2;\\r\\n justify-self: start;\\r\\n }\\r\\n\\r\\n .avatar-cropper-panel {\\r\\n width: calc(100vw - 24px);\\r\\n max-height: calc(100dvh - 24px);\\r\\n }\\r\\n\\r\\n .avatar-cropper-layout {\\r\\n grid-template-columns: minmax(0, 1fr);\\r\\n }\\r\\n\\r\\n .avatar-cropper-stage {\\r\\n height: 300px;\\r\\n min-height: 300px;\\r\\n }\\r\\n\\r\\n .avatar-cropper-controls {\\r\\n grid-template-columns: minmax(0, 1fr) auto;\\r\\n align-items: center;\\r\\n }\\r\\n\\r\\n .avatar-cropper-tools {\\r\\n grid-template-columns: repeat(3, minmax(0, 1fr));\\r\\n }\\r\\n\\r\\n .avatar-cropper-preview {\\r\\n width: 82px;\\r\\n height: 82px;\\r\\n }\\r\\n\\r\\n .avatar-cropper-controls footer {\\r\\n grid-column: 1 / -1;\\r\\n }\\r\\n\\r\\n .settings-panel {\\r\\n width: calc(100vw - 24px);\\r\\n max-height: calc(100dvh - 24px);\\r\\n }\\r\\n\\r\\n .settings-layout {\\r\\n grid-template-columns: minmax(0, 1fr);\\r\\n }\\r\\n\\r\\n .settings-menu {\\r\\n grid-auto-flow: column;\\r\\n grid-auto-columns: minmax(120px, 1fr);\\r\\n overflow-x: auto;\\r\\n padding-bottom: 2px;\\r\\n }\\r\\n\\r\\n .settings-password-form footer .inline-save-status {\\r\\n flex: 1 1 100%;\\r\\n }\\r\\n}\\r\\n\\r\\n.message-file {\\r\\n width: min(280px, 62vw);\\r\\n display: grid;\\r\\n grid-template-columns: 38px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n padding: 10px;\\r\\n border: 1px solid #d6e2e7;\\r\\n border-radius: 6px;\\r\\n background: #f8fbfc;\\r\\n color: var(--text);\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\n.message-file:hover {\\r\\n border-color: #9fd4cc;\\r\\n background: #edf8f5;\\r\\n}\\r\\n\\r\\n.message-file-icon {\\r\\n width: 38px;\\r\\n height: 38px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 6px;\\r\\n background: #e3eff2;\\r\\n color: var(--primary-strong);\\r\\n font-size: 18px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.message-file-main {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 3px;\\r\\n}\\r\\n\\r\\n.message-file-main strong,\\r\\n.message-file-main small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.message-file-main strong {\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.message-file-main small {\\r\\n color: var(--muted);\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.message-bubble time {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n flex-wrap: wrap;\\r\\n gap: 4px;\\r\\n margin-top: 4px;\\r\\n color: var(--muted);\\r\\n font-size: 11px;\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.recall-mark {\\r\\n margin-right: auto;\\r\\n color: #d93025;\\r\\n font-size: 11px;\\r\\n font-weight: 700;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.edit-mark {\\r\\n color: #7a8792;\\r\\n font-size: 11px;\\r\\n font-weight: 600;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.delivery-mark {\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n min-width: 14px;\\r\\n color: #8f9aa3;\\r\\n font-size: 14px;\\r\\n font-weight: 800;\\r\\n letter-spacing: 0;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.delivery-mark-delivered,\\r\\n.delivery-mark-read {\\r\\n min-width: 19px;\\r\\n}\\r\\n\\r\\n.delivery-mark-read {\\r\\n color: #1aa66a;\\r\\n}\\r\\n\\r\\n.favorite-mark {\\r\\n color: #c79520;\\r\\n font-size: 12px;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.delivery-check {\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.delivery-check-second {\\r\\n margin-left: -5px;\\r\\n}\\r\\n\\r\\n.delivery-error {\\r\\n color: #c0392b;\\r\\n}\\r\\n\\r\\n.message-context-menu {\\r\\n position: fixed;\\r\\n z-index: 30;\\r\\n width: 136px;\\r\\n padding: 6px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 16px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.message-context-menu button {\\r\\n width: 100%;\\r\\n min-height: 32px;\\r\\n padding: 0 10px;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.message-context-menu button:hover {\\r\\n background: #eaf3f1;\\r\\n}\\r\\n\\r\\n.selection-toolbar {\\r\\n min-height: 42px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n padding: 8px 16px;\\r\\n border-top: 1px solid var(--line);\\r\\n background: #f7fafc;\\r\\n}\\r\\n\\r\\n.selection-toolbar span {\\r\\n flex: 1;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.selection-toolbar button {\\r\\n min-height: 30px;\\r\\n padding: 0 10px;\\r\\n border-radius: 6px;\\r\\n}\\r\\n\\r\\n.forward-dialog,\\r\\n.edit-dialog {\\r\\n width: min(100%, 340px);\\r\\n max-height: min(520px, calc(100vh - 130px));\\r\\n display: grid;\\r\\n gap: 4px;\\r\\n padding: 14px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.forward-dialog header,\\r\\n.edit-dialog header,\\r\\n.forward-target {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.forward-dialog header,\\r\\n.edit-dialog header {\\r\\n justify-content: space-between;\\r\\n margin-bottom: 6px;\\r\\n}\\r\\n\\r\\n.forward-dialog h3,\\r\\n.edit-dialog h3 {\\r\\n margin: 0;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.edit-dialog {\\r\\n width: min(100%, 420px);\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.edit-dialog textarea {\\r\\n width: 100%;\\r\\n min-height: 132px;\\r\\n resize: vertical;\\r\\n border-radius: 8px;\\r\\n border: 1px solid var(--line);\\r\\n padding: 10px;\\r\\n background: #f9fbfc;\\r\\n color: var(--text);\\r\\n line-height: 1.5;\\r\\n}\\r\\n\\r\\n.edit-dialog textarea:focus {\\r\\n border-color: var(--accent);\\r\\n outline: 0;\\r\\n box-shadow: 0 0 0 3px rgba(24, 138, 121, 0.14);\\r\\n}\\r\\n\\r\\n.edit-dialog footer {\\r\\n display: flex;\\r\\n justify-content: flex-end;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.edit-dialog footer button {\\r\\n min-height: 34px;\\r\\n padding: 0 14px;\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n.forward-target {\\r\\n min-height: 52px;\\r\\n padding: 6px;\\r\\n border: 0;\\r\\n border-radius: 8px;\\r\\n background: transparent;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.forward-target:hover {\\r\\n background: #eaf3f1;\\r\\n}\\r\\n\\r\\n.chat-toast {\\r\\n position: absolute;\\r\\n left: 50%;\\r\\n bottom: 132px;\\r\\n z-index: 20;\\r\\n transform: translateX(-50%);\\r\\n padding: 8px 12px;\\r\\n border-radius: 8px;\\r\\n background: rgba(35, 45, 58, 0.92);\\r\\n color: #fff;\\r\\n font-size: 13px;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.chat-toast.error {\\r\\n background: rgba(192, 57, 43, 0.94);\\r\\n}\\r\\n\\r\\n.message-composer {\\r\\n position: relative;\\r\\n min-height: 0;\\r\\n border-top: 1px solid var(--line);\\r\\n background: var(--panel);\\r\\n}\\r\\n\\r\\n.message-composer::after {\\r\\n content: \\\"\\\";\\r\\n position: absolute;\\r\\n inset: 6px;\\r\\n z-index: 4;\\r\\n border: 2px dashed transparent;\\r\\n border-radius: 8px;\\r\\n pointer-events: none;\\r\\n transition: border-color 0.12s ease, background-color 0.12s ease;\\r\\n}\\r\\n\\r\\n.message-composer.drop-active::after {\\r\\n border-color: var(--primary);\\r\\n background: rgba(23, 125, 114, 0.08);\\r\\n}\\r\\n\\r\\n.quote-preview {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n padding: 8px 16px 0;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.quote-preview span {\\r\\n min-width: 0;\\r\\n flex: 1;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n border-left: 3px solid var(--accent);\\r\\n padding-left: 8px;\\r\\n}\\r\\n\\r\\n.quote-preview strong {\\r\\n margin-right: 6px;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.quote-preview button {\\r\\n width: 26px;\\r\\n height: 26px;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: var(--muted);\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.quote-preview button:hover {\\r\\n background: #edf2f5;\\r\\n}\\r\\n\\r\\n.composer-tools {\\r\\n position: relative;\\r\\n display: flex;\\r\\n gap: 4px;\\r\\n padding: 8px 16px 0;\\r\\n}\\r\\n\\r\\n.composer-tools input[type=\\\"file\\\"] {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.composer-tools button {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: var(--muted);\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.composer-tools button:hover {\\r\\n background: #edf2f5;\\r\\n}\\r\\n\\r\\n.emoji-picker {\\r\\n position: absolute;\\r\\n left: 16px;\\r\\n bottom: 38px;\\r\\n z-index: 12;\\r\\n width: 256px;\\r\\n display: grid;\\r\\n grid-template-columns: repeat(8, 1fr);\\r\\n gap: 2px;\\r\\n padding: 8px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 14px 34px rgba(24, 33, 47, 0.16);\\r\\n}\\r\\n\\r\\n.emoji-picker button {\\r\\n width: 28px;\\r\\n height: 28px;\\r\\n border-radius: 6px;\\r\\n font-size: 17px;\\r\\n}\\r\\n\\r\\n.message-composer textarea {\\r\\n display: block;\\r\\n min-height: 86px;\\r\\n max-height: 180px;\\r\\n padding: 12px 16px;\\r\\n border: 0;\\r\\n border-radius: 0;\\r\\n resize: none;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.composer-footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n padding: 0 16px 14px;\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.send-button {\\r\\n min-width: 72px;\\r\\n height: 34px;\\r\\n}\\r\\n\\r\\n@media (max-width: 760px) {\\r\\n .app-shell {\\r\\n grid-template-columns: 56px minmax(0, 1fr);\\r\\n }\\r\\n\\r\\n .conversation-list {\\r\\n display: none;\\r\\n }\\r\\n\\r\\n .message-bubble {\\r\\n max-width: 86%;\\r\\n }\\r\\n}\\r\\n\", \"\"]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://jc-web-im/./src/styles/base.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-14.use%5B1%5D!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-14.use%5B2%5D\n}");
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ \"./node_modules/css-loader/dist/runtime/noSourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \":root {\\r\\n color-scheme: light;\\r\\n --bg: #f4f6f8;\\r\\n --panel: #ffffff;\\r\\n --panel-soft: #f8fafc;\\r\\n --line: #d9e0e7;\\r\\n --text: #18212f;\\r\\n --muted: #6a7584;\\r\\n --primary: #177d72;\\r\\n --primary-strong: #0f625a;\\r\\n --accent: #d84e3f;\\r\\n --bubble-in: #ffffff;\\r\\n --bubble-out: #dff4ef;\\r\\n --rail: #202a33;\\r\\n}\\r\\n\\r\\n* {\\r\\n box-sizing: border-box;\\r\\n}\\r\\n\\r\\nhtml,\\r\\nbody,\\r\\n#app {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\nbody {\\r\\n margin: 0;\\r\\n min-width: 320px;\\r\\n background: var(--bg);\\r\\n color: var(--text);\\r\\n font-family: -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", sans-serif;\\r\\n}\\r\\n\\r\\nbutton,\\r\\ninput,\\r\\ntextarea {\\r\\n font: inherit;\\r\\n}\\r\\n\\r\\nbutton {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.login-page {\\r\\n min-height: 100vh;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 24px;\\r\\n background: linear-gradient(135deg, #eef6f3 0%, #f7f3ee 55%, #eef2f7 100%);\\r\\n}\\r\\n\\r\\n.login-panel {\\r\\n width: min(420px, 100%);\\r\\n padding: 32px;\\r\\n background: var(--panel);\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 18px 48px rgba(30, 40, 50, 0.12);\\r\\n}\\r\\n\\r\\n.brand-lockup {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 14px;\\r\\n margin-bottom: 28px;\\r\\n}\\r\\n\\r\\n.brand-mark,\\r\\n.rail-avatar,\\r\\n.conversation-avatar {\\r\\n display: grid;\\r\\n place-items: center;\\r\\n flex: 0 0 auto;\\r\\n}\\r\\n\\r\\n.image-avatar {\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.brand-mark {\\r\\n width: 48px;\\r\\n height: 48px;\\r\\n border-radius: 8px;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.brand-lockup h1,\\r\\n.list-header h2,\\r\\n.chat-header h2 {\\r\\n margin: 0;\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.brand-lockup p,\\r\\n.list-header p,\\r\\n.chat-header p {\\r\\n margin: 4px 0 0;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.login-form {\\r\\n display: grid;\\r\\n gap: 16px;\\r\\n}\\r\\n\\r\\n.login-tabs,\\r\\n.code-row,\\r\\n.phone-row,\\r\\n.captcha-row {\\r\\n display: grid;\\r\\n grid-template-columns: 1fr 1fr;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.login-tabs button,\\r\\n.code-action {\\r\\n height: 38px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.login-tabs button.active {\\r\\n border-color: var(--primary);\\r\\n background: #e8f4f2;\\r\\n color: var(--primary-strong);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.login-tabs {\\r\\n grid-template-columns: repeat(3, minmax(0, 1fr));\\r\\n}\\r\\n\\r\\n.login-tabs button {\\r\\n min-width: 0;\\r\\n padding: 0 6px;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.code-row {\\r\\n grid-template-columns: minmax(0, 1fr) 112px;\\r\\n}\\r\\n\\r\\n.captcha-row {\\r\\n grid-template-columns: minmax(0, 1fr) 112px;\\r\\n}\\r\\n\\r\\n.phone-row {\\r\\n grid-template-columns: 86px minmax(0, 1fr);\\r\\n}\\r\\n\\r\\n.country-code-field {\\r\\n height: 42px;\\r\\n display: grid;\\r\\n grid-template-columns: 24px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.country-code-field:focus-within {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.country-code-field span {\\r\\n display: grid;\\r\\n place-items: center;\\r\\n color: var(--muted);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.code-action:disabled {\\r\\n cursor: not-allowed;\\r\\n opacity: 0.55;\\r\\n}\\r\\n\\r\\n.login-form label {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.label-row {\\r\\n min-height: 18px;\\r\\n display: grid;\\r\\n grid-template-columns: 86px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.field-error-badge {\\r\\n min-height: 28px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 4px 10px;\\r\\n border-radius: 2px;\\r\\n background: var(--accent);\\r\\n color: #fff;\\r\\n font-weight: 700;\\r\\n line-height: 1.2;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.login-form input,\\r\\n.login-form select,\\r\\n.modal-panel input,\\r\\n.modal-panel textarea,\\r\\n.search-box input,\\r\\n.message-composer textarea {\\r\\n width: 100%;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.login-form input,\\r\\n.login-form select,\\r\\n.modal-panel input,\\r\\n.search-box input {\\r\\n height: 42px;\\r\\n padding: 0 12px;\\r\\n}\\r\\n\\r\\n.modal-panel textarea {\\r\\n min-height: 92px;\\r\\n resize: vertical;\\r\\n padding: 10px 12px;\\r\\n line-height: 1.5;\\r\\n}\\r\\n\\r\\n.login-form .country-code-field input {\\r\\n height: 40px;\\r\\n padding: 0 10px 0 0;\\r\\n border: 0;\\r\\n border-radius: 0;\\r\\n}\\r\\n\\r\\n.login-form .country-code-field input:focus {\\r\\n border-color: transparent;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.login-form input:focus,\\r\\n.login-form select:focus,\\r\\n.modal-panel input:focus,\\r\\n.modal-panel textarea:focus,\\r\\n.search-box input:focus,\\r\\n.message-composer textarea:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.login-form input.captcha-input-valid {\\r\\n border-color: var(--primary);\\r\\n background: var(--primary);\\r\\n color: #fff;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.login-form input.captcha-input-valid::-moz-placeholder {\\r\\n color: rgba(255, 255, 255, 0.75);\\r\\n}\\r\\n\\r\\n.login-form input.captcha-input-valid::placeholder {\\r\\n color: rgba(255, 255, 255, 0.75);\\r\\n}\\r\\n\\r\\n.login-form input.captcha-input-invalid {\\r\\n border-color: var(--accent);\\r\\n color: var(--accent);\\r\\n box-shadow: 0 0 0 3px rgba(216, 78, 63, 0.12);\\r\\n}\\r\\n\\r\\n.login-form input.field-input-error {\\r\\n border-color: var(--accent);\\r\\n color: var(--accent);\\r\\n box-shadow: 0 0 0 3px rgba(216, 78, 63, 0.12);\\r\\n}\\r\\n\\r\\n.login-form input.field-input-error::-moz-placeholder {\\r\\n color: rgba(216, 78, 63, 0.78);\\r\\n}\\r\\n\\r\\n.login-form input.field-input-error::placeholder {\\r\\n color: rgba(216, 78, 63, 0.78);\\r\\n}\\r\\n\\r\\n.captcha-button {\\r\\n width: 112px;\\r\\n height: 42px;\\r\\n padding: 0;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #f7fbfa;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.captcha-button img {\\r\\n display: block;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n}\\r\\n\\r\\n.qr-login-card {\\r\\n position: relative;\\r\\n width: min(248px, 100%);\\r\\n aspect-ratio: 1;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n justify-self: center;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: #fff;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.qr-code-button {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 18px;\\r\\n border: 0;\\r\\n background: #fff;\\r\\n color: var(--muted);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.qr-code-button:disabled {\\r\\n cursor: default;\\r\\n}\\r\\n\\r\\n.qr-code-button img {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n image-rendering: pixelated;\\r\\n}\\r\\n\\r\\n.qr-login-card.scanned .qr-code-button,\\r\\n.qr-login-card.expired .qr-code-button,\\r\\n.qr-login-card.error .qr-code-button {\\r\\n opacity: 0.22;\\r\\n}\\r\\n\\r\\n.qr-scan-user {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n background: rgba(255, 255, 255, 0.76);\\r\\n}\\r\\n\\r\\n.qr-scan-user img,\\r\\n.qr-scan-user span {\\r\\n width: 70px;\\r\\n height: 70px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 8px;\\r\\n background: var(--primary);\\r\\n color: #fff;\\r\\n font-size: 28px;\\r\\n font-weight: 800;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.qr-login-status {\\r\\n min-height: 48px;\\r\\n display: grid;\\r\\n gap: 4px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.qr-login-status strong {\\r\\n color: var(--text);\\r\\n font-size: 15px;\\r\\n}\\r\\n\\r\\n.qr-login-status span {\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.primary-action,\\r\\n.primary-inline-action,\\r\\n.send-button {\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: var(--primary);\\r\\n color: #fff;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.primary-action {\\r\\n height: 44px;\\r\\n}\\r\\n\\r\\n.primary-action:hover,\\r\\n.primary-inline-action:hover,\\r\\n.send-button:hover {\\r\\n background: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.primary-action:disabled,\\r\\n.primary-inline-action:disabled,\\r\\n.send-button:disabled {\\r\\n cursor: not-allowed;\\r\\n opacity: 0.55;\\r\\n}\\r\\n\\r\\n.ghost-action {\\r\\n width: 100%;\\r\\n height: 40px;\\r\\n margin-top: 12px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.ghost-inline-action,\\r\\n.primary-inline-action,\\r\\n.danger-inline-action {\\r\\n height: 38px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n padding: 0 16px;\\r\\n border-radius: 6px;\\r\\n font-weight: 700;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.ghost-inline-action {\\r\\n border: 1px solid var(--line);\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.ghost-inline-action:hover {\\r\\n background: #edf2f5;\\r\\n}\\r\\n\\r\\n.danger-inline-action {\\r\\n border: 1px solid #ef4444;\\r\\n background: #fff;\\r\\n color: #b91c1c;\\r\\n}\\r\\n\\r\\n.danger-inline-action:hover {\\r\\n background: #fee2e2;\\r\\n}\\r\\n\\r\\n.form-error {\\r\\n margin: 0;\\r\\n color: var(--accent);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.form-info {\\r\\n margin: 0;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.app-shell {\\n height: 100dvh;\\n min-height: 0;\\n display: grid;\\n grid-template-columns: 64px minmax(260px, 340px) minmax(0, 1fr);\\n overflow: hidden;\\n background: var(--panel);\\n}\\n\\n.documented-shell {\\n min-height: 100dvh;\\n display: grid;\\n grid-template-columns: 260px minmax(0, 1fr);\\n background:\\n radial-gradient(circle at top left, rgba(23, 125, 114, 0.08), transparent 28%),\\n linear-gradient(180deg, #f4f8f7 0%, #eef3f7 100%);\\n}\\n\\n.documented-rail {\\n min-height: 0;\\n display: grid;\\n align-content: start;\\n gap: 14px;\\n padding: 24px 20px;\\n border-right: 1px solid var(--line);\\n background: rgba(255, 255, 255, 0.82);\\n backdrop-filter: blur(12px);\\n}\\n\\n.documented-avatar {\\n width: 64px;\\n height: 64px;\\n display: grid;\\n place-items: center;\\n overflow: hidden;\\n border-radius: 16px;\\n background: #dff4ef;\\n color: var(--primary-strong);\\n font-size: 28px;\\n font-weight: 800;\\n}\\n\\n.documented-avatar img {\\n width: 100%;\\n height: 100%;\\n -o-object-fit: cover;\\n object-fit: cover;\\n}\\n\\n.documented-rail-copy {\\n display: grid;\\n gap: 4px;\\n}\\n\\n.documented-rail-copy strong {\\n font-size: 16px;\\n}\\n\\n.documented-rail-copy small {\\n color: var(--muted);\\n overflow-wrap: anywhere;\\n}\\n\\n.documented-rail-button {\\n min-height: 40px;\\n padding: 0 14px;\\n border: 0;\\n border-radius: 10px;\\n background: var(--primary);\\n color: #fff;\\n font-weight: 700;\\n text-align: left;\\n}\\n\\n.documented-rail-button.ghost {\\n border: 1px solid var(--line);\\n background: #fff;\\n color: var(--text);\\n}\\n\\n.documented-main {\\n min-width: 0;\\n min-height: 0;\\n overflow: auto;\\n padding: 28px;\\n display: grid;\\n align-content: start;\\n gap: 18px;\\n}\\n\\n.documented-header {\\n display: flex;\\n align-items: end;\\n justify-content: space-between;\\n gap: 18px;\\n}\\n\\n.documented-header h1 {\\n margin: 0;\\n font-size: 28px;\\n}\\n\\n.documented-header p {\\n margin: 6px 0 0;\\n color: var(--muted);\\n}\\n\\n.documented-status {\\n min-width: 180px;\\n display: grid;\\n gap: 4px;\\n padding: 14px 16px;\\n border: 1px solid var(--line);\\n border-radius: 14px;\\n background: rgba(255, 255, 255, 0.88);\\n}\\n\\n.documented-status span {\\n color: var(--muted);\\n font-size: 12px;\\n}\\n\\n.documented-status strong {\\n font-size: 15px;\\n}\\n\\n.documented-card {\\n display: grid;\\n gap: 12px;\\n padding: 20px;\\n border: 1px solid var(--line);\\n border-radius: 16px;\\n background: rgba(255, 255, 255, 0.88);\\n box-shadow: 0 16px 36px rgba(24, 33, 47, 0.06);\\n}\\n\\n.documented-card h2 {\\n margin: 0;\\n font-size: 18px;\\n}\\n\\n.documented-text {\\n margin: 0;\\n color: var(--muted);\\n line-height: 1.6;\\n}\\n\\n.documented-list {\\n margin: 0;\\n padding-left: 18px;\\n display: grid;\\n gap: 8px;\\n line-height: 1.55;\\n}\\n\\n.documented-list.muted {\\n color: var(--muted);\\n}\\n\\n.documented-meta {\\n margin: 0;\\n display: grid;\\n gap: 10px;\\n}\\n\\n.documented-meta div {\\n display: grid;\\n grid-template-columns: 110px minmax(0, 1fr);\\n gap: 12px;\\n padding-top: 10px;\\n border-top: 1px solid var(--line);\\n}\\n\\n.documented-meta dt {\\n color: var(--muted);\\n}\\n\\n.documented-meta dd {\\n margin: 0;\\n overflow-wrap: anywhere;\\n}\\n\\n.documented-password-panel {\\n width: min(100%, 360px);\\n}\\n\\r\\n.navigation-rail {\\r\\n min-height: 0;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n align-items: center;\\r\\n gap: 14px;\\r\\n padding: 16px 10px;\\r\\n background: var(--rail);\\r\\n}\\r\\n\\r\\n.rail-avatar {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n border-radius: 8px;\\r\\n background: #e9f7f4;\\r\\n color: var(--primary-strong);\\r\\n font-weight: 800;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.rail-avatar-button {\\r\\n position: relative;\\r\\n border: 0;\\r\\n padding: 0;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.rail-avatar-button::after {\\r\\n content: \\\"+\\\";\\r\\n position: absolute;\\r\\n right: -2px;\\r\\n bottom: -2px;\\r\\n width: 15px;\\r\\n height: 15px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border: 1px solid var(--rail);\\r\\n border-radius: 50%;\\r\\n background: var(--primary);\\r\\n color: #fff;\\r\\n font-size: 11px;\\r\\n font-weight: 800;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.rail-avatar-button:hover,\\r\\n.rail-avatar-button:focus-visible {\\r\\n box-shadow: 0 0 0 3px rgba(47, 196, 178, 0.28);\\r\\n}\\r\\n\\r\\n.rail-avatar img {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.rail-button,\\r\\n.icon-button {\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n}\\r\\n\\r\\n.rail-button {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n color: #dbe5ea;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.rail-button svg {\\r\\n width: 22px;\\r\\n height: 22px;\\r\\n fill: none;\\r\\n stroke: currentColor;\\r\\n stroke-width: 1.8;\\r\\n stroke-linecap: round;\\r\\n stroke-linejoin: round;\\r\\n}\\r\\n\\r\\n.rail-button.active,\\r\\n.rail-button:hover {\\r\\n background: rgba(255, 255, 255, 0.12);\\r\\n}\\r\\n\\r\\n.rail-logout-button:hover {\\r\\n background: rgba(239, 68, 68, 0.2);\\r\\n color: #fecaca;\\r\\n}\\r\\n\\r\\n.rail-spacer {\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.conversation-list {\\r\\n position: relative;\\r\\n min-height: 0;\\r\\n display: grid;\\r\\n grid-template-rows: 72px auto minmax(0, 1fr);\\r\\n border-right: 1px solid var(--line);\\r\\n background: var(--panel-soft);\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.modal-backdrop {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n z-index: 5;\\r\\n display: grid;\\r\\n place-items: start center;\\r\\n padding: 88px 16px 16px;\\r\\n background: rgba(24, 33, 47, 0.28);\\r\\n}\\r\\n\\r\\n.modal-panel {\\r\\n width: min(100%, 308px);\\r\\n display: grid;\\r\\n gap: 14px;\\r\\n padding: 16px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.modal-panel header,\\r\\n.modal-actions {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.modal-panel header strong {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.modal-panel label {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.settings-backdrop {\\r\\n z-index: 24;\\r\\n place-items: center;\\r\\n padding: 24px 16px;\\r\\n}\\r\\n\\r\\n.settings-panel {\\r\\n width: min(620px, calc(100vw - 32px));\\r\\n max-height: calc(100dvh - 48px);\\r\\n display: grid;\\r\\n gap: 14px;\\r\\n overflow: auto;\\r\\n padding: 16px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.settings-panel header,\\r\\n.settings-password-form footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.settings-panel header strong {\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.settings-layout {\\r\\n display: grid;\\r\\n grid-template-columns: 170px minmax(0, 1fr);\\r\\n gap: 14px;\\r\\n}\\r\\n\\r\\n.settings-menu {\\r\\n display: grid;\\r\\n align-content: start;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.settings-menu button {\\r\\n min-height: 46px;\\r\\n display: grid;\\r\\n gap: 2px;\\r\\n justify-items: start;\\r\\n padding: 8px 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.settings-menu button.active,\\r\\n.settings-menu button:hover {\\r\\n border-color: var(--primary);\\r\\n background: #e8f4f2;\\r\\n color: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.settings-menu button span {\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.settings-menu button small {\\r\\n color: var(--muted);\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.settings-password-form,\\r\\n.settings-placeholder {\\r\\n min-height: 250px;\\r\\n display: grid;\\r\\n align-content: start;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.settings-password-form h3,\\r\\n.settings-placeholder h3 {\\r\\n margin: 0;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.settings-password-form label {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.settings-password-form input {\\r\\n width: 100%;\\r\\n height: 42px;\\r\\n padding: 0 12px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.settings-password-form input:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.settings-password-form footer {\\r\\n margin-top: 4px;\\r\\n justify-content: flex-end;\\r\\n flex-wrap: wrap;\\r\\n}\\r\\n\\r\\n.settings-password-form footer .inline-save-status {\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n.settings-placeholder {\\r\\n place-items: center;\\r\\n border: 1px dashed var(--line);\\r\\n border-radius: 8px;\\r\\n color: var(--muted);\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.settings-placeholder p {\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.profile-edit-panel {\\r\\n width: min(100%, 360px);\\r\\n}\\r\\n\\r\\n.profile-avatar-field {\\r\\n display: grid;\\r\\n justify-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.profile-avatar-field input[type=\\\"file\\\"] {\\r\\n position: absolute;\\r\\n inline-size: 1px;\\r\\n block-size: 1px;\\r\\n opacity: 0;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.profile-avatar-preview {\\r\\n width: 88px;\\r\\n height: 88px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n overflow: hidden;\\r\\n padding: 0;\\r\\n border: 0;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n cursor: default;\\r\\n font-size: 30px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.profile-avatar-preview.clickable {\\r\\n cursor: zoom-in;\\r\\n}\\r\\n\\r\\n.profile-avatar-preview.clickable:hover {\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.16);\\r\\n}\\r\\n\\r\\n.profile-avatar-preview img {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.profile-avatar-change-button {\\r\\n min-width: 96px;\\r\\n}\\r\\n\\r\\n.avatar-preview-backdrop {\\r\\n z-index: 32;\\r\\n place-items: center;\\r\\n padding: 24px 16px;\\r\\n}\\r\\n\\r\\n.avatar-preview-dialog {\\r\\n width: min(520px, calc(100vw - 32px));\\r\\n max-height: calc(100dvh - 48px);\\r\\n display: grid;\\r\\n gap: 12px;\\r\\n padding: 14px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.avatar-preview-dialog header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.avatar-preview-actions {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 6px;\\r\\n}\\r\\n\\r\\n.avatar-preview-actions button {\\r\\n min-width: 34px;\\r\\n height: 34px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.avatar-preview-actions .icon-button {\\r\\n border: 0;\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.avatar-preview-stage {\\r\\n height: min(430px, calc(100dvh - 160px));\\r\\n min-height: 260px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n overflow: hidden;\\r\\n border-radius: 8px;\\r\\n background: #101820;\\r\\n cursor: zoom-in;\\r\\n touch-action: none;\\r\\n}\\r\\n\\r\\n.avatar-preview-stage.dragging {\\r\\n cursor: grabbing;\\r\\n}\\r\\n\\r\\n.avatar-preview-stage img {\\r\\n max-width: min(100%, 430px);\\r\\n max-height: 100%;\\r\\n border-radius: 8px;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n transform-origin: center center;\\r\\n transition: transform 0.08s ease-out;\\r\\n -webkit-user-select: none;\\r\\n -moz-user-select: none;\\r\\n user-select: none;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.avatar-preview-stage.dragging img {\\r\\n transition: none;\\r\\n}\\r\\n\\r\\n.avatar-cropper-backdrop {\\r\\n z-index: 30;\\r\\n place-items: center;\\r\\n padding: 24px 16px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-panel {\\r\\n width: min(720px, calc(100vw - 32px));\\r\\n max-height: calc(100dvh - 48px);\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.avatar-cropper-header-actions {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-layout {\\r\\n display: grid;\\r\\n grid-template-columns: minmax(0, 1fr) 190px;\\r\\n gap: 14px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-stage {\\r\\n position: relative;\\r\\n height: 360px;\\r\\n min-height: 360px;\\r\\n overflow: hidden;\\r\\n border: 1px dashed #b8ccd7;\\r\\n border-radius: 8px;\\r\\n background: #0f1b24;\\r\\n touch-action: none;\\r\\n cursor: grab;\\r\\n}\\r\\n\\r\\n.avatar-cropper-stage.dragging {\\r\\n cursor: grabbing;\\r\\n}\\r\\n\\r\\n.avatar-cropper-stage canvas {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.avatar-cropper-box {\\r\\n position: absolute;\\r\\n left: 50%;\\r\\n top: 50%;\\r\\n width: 74%;\\r\\n aspect-ratio: 1;\\r\\n max-width: calc(100% - 44px);\\r\\n max-height: calc(100% - 44px);\\r\\n transform: translate(-50%, -50%);\\r\\n border: 2px dashed var(--primary);\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.72);\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.avatar-cropper-mask {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.avatar-cropper-placeholder {\\r\\n position: absolute;\\r\\n inset: 0;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n color: #d9e8ee;\\r\\n font-size: 13px;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.avatar-cropper-controls {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n align-content: start;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-tools {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-tools button {\\r\\n min-height: 34px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.avatar-cropper-tools button:hover {\\r\\n border-color: var(--primary);\\r\\n color: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.avatar-cropper-preview {\\r\\n width: 108px;\\r\\n height: 108px;\\r\\n justify-self: center;\\r\\n overflow: hidden;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: #eef4f7;\\r\\n}\\r\\n\\r\\n.avatar-cropper-preview canvas {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n display: block;\\r\\n}\\r\\n\\r\\n.avatar-cropper-controls footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n flex-wrap: wrap;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.avatar-cropper-controls footer .inline-save-status {\\r\\n flex: 1 1 100%;\\r\\n}\\r\\n\\r\\n.modal-actions {\\r\\n justify-content: flex-end;\\r\\n}\\r\\n\\r\\n.list-header,\\r\\n.chat-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n min-height: 72px;\\r\\n padding: 16px 18px;\\r\\n border-bottom: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.icon-button {\\r\\n width: 34px;\\r\\n height: 34px;\\r\\n color: var(--muted);\\r\\n font-size: 20px;\\r\\n}\\r\\n\\r\\n.icon-button:hover {\\r\\n background: #edf2f5;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.search-box {\\r\\n padding: 12px 14px;\\r\\n}\\r\\n\\r\\n.sidebar-scroll {\\r\\n min-height: 0;\\r\\n overflow: auto;\\r\\n overscroll-behavior: contain;\\r\\n}\\r\\n\\r\\n.conversation-item {\\r\\n width: 100%;\\r\\n display: grid;\\r\\n grid-template-columns: 42px minmax(0, 1fr) auto;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n padding: 12px 14px;\\r\\n border: 0;\\r\\n border-top: 1px solid rgba(217, 224, 231, 0.7);\\r\\n background: transparent;\\r\\n color: inherit;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.conversation-item.active,\\n.conversation-item:hover {\\n background: #eaf3f1;\\n}\\n\\n.conversation-item.pinned {\\n background: rgba(15, 118, 110, 0.055);\\n}\\n\\n.conversation-pin {\\n display: inline-block;\\n margin-right: 5px;\\n color: #0f766e;\\n font-size: 12px;\\n transform: rotate(-25deg);\\n}\\n\\n.conversation-context-menu {\\n position: fixed;\\n z-index: 1200;\\n min-width: 124px;\\n padding: 6px;\\n border: 1px solid #d7e0e8;\\n border-radius: 10px;\\n background: #fff;\\n box-shadow: 0 12px 30px rgba(15, 23, 42, 0.18);\\n}\\n\\n.conversation-context-menu button {\\n width: 100%;\\n padding: 9px 12px;\\n border: 0;\\n border-radius: 7px;\\n background: transparent;\\n color: #1f2937;\\n text-align: left;\\n cursor: pointer;\\n}\\n\\n.conversation-context-menu button:hover {\\n background: #eef7f6;\\n}\\n\\r\\n.favorite-item {\\r\\n width: 100%;\\r\\n display: grid;\\r\\n grid-template-columns: 32px minmax(0, 1fr) auto;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n padding: 12px 14px;\\r\\n border: 0;\\r\\n border-top: 1px solid rgba(217, 224, 231, 0.7);\\r\\n background: transparent;\\r\\n color: inherit;\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.favorite-item.active,\\r\\n.favorite-item:hover {\\r\\n background: #eaf3f1;\\r\\n}\\r\\n\\r\\n.favorite-item-icon {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 6px;\\r\\n background: #fff7df;\\r\\n color: #c79520;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.favorite-item-main {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.favorite-item-main strong,\\r\\n.favorite-item-main small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.favorite-item-main strong {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.favorite-item-main small,\\r\\n.favorite-item time {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.favorite-panel {\\r\\n min-width: 0;\\r\\n min-height: 0;\\r\\n display: grid;\\r\\n grid-template-rows: auto minmax(0, 1fr);\\r\\n background: #eef3f6;\\r\\n}\\r\\n\\r\\n.favorite-detail {\\r\\n min-height: 0;\\r\\n display: grid;\\r\\n align-content: start;\\r\\n gap: 16px;\\r\\n padding: 28px;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.favorite-detail-message {\\r\\n width: min(680px, 100%);\\r\\n display: grid;\\r\\n grid-template-columns: auto minmax(0, 1fr);\\r\\n gap: 10px 12px;\\r\\n padding: 18px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 8px 24px rgba(24, 33, 47, 0.08);\\r\\n}\\r\\n\\r\\n.favorite-detail-message.recalled {\\r\\n border-color: #f1c7c1;\\r\\n background: #fff7f6;\\r\\n}\\r\\n\\r\\n.favorite-detail-star {\\r\\n color: #c79520;\\r\\n font-size: 18px;\\r\\n line-height: 1.4;\\r\\n}\\r\\n\\r\\n.favorite-detail-body {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.favorite-detail-message p {\\r\\n margin: 0;\\r\\n white-space: pre-wrap;\\r\\n overflow-wrap: anywhere;\\r\\n line-height: 1.55;\\r\\n}\\r\\n\\r\\n.favorite-detail-message time {\\r\\n grid-column: 2;\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.favorite-detail-image {\\r\\n width: min(420px, 100%);\\r\\n display: block;\\r\\n overflow: hidden;\\r\\n border: 1px solid #b9ded8;\\r\\n border-radius: 8px;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.favorite-detail-image img {\\r\\n display: block;\\r\\n width: 100%;\\r\\n max-height: 360px;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n background: #f8fbfc;\\r\\n}\\r\\n\\r\\n.favorite-detail-file {\\r\\n width: min(360px, 100%);\\r\\n}\\r\\n\\r\\n.favorite-detail-actions {\\r\\n width: min(680px, 100%);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.favorite-detail-actions .inline-save-status {\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n.empty-list,\\r\\n.empty-chat {\\r\\n display: grid;\\r\\n place-items: center;\\r\\n align-content: center;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.empty-list {\\r\\n min-height: 180px;\\r\\n padding: 24px;\\r\\n}\\r\\n\\r\\n.empty-chat {\\r\\n min-height: 0;\\r\\n padding: 24px;\\r\\n}\\r\\n\\r\\n.empty-list strong,\\r\\n.empty-chat strong {\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.conversation-avatar {\\r\\n width: 42px;\\r\\n height: 42px;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.conversation-copy {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.conversation-copy strong,\\r\\n.conversation-copy small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.conversation-copy small {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.unread-badge {\\r\\n justify-self: end;\\r\\n min-width: 20px;\\r\\n height: 20px;\\r\\n padding: 0 6px;\\r\\n border-radius: 999px;\\r\\n background: #ef4444;\\r\\n color: #fff;\\r\\n font-size: 12px;\\r\\n font-weight: 800;\\r\\n line-height: 20px;\\r\\n text-align: center;\\r\\n box-shadow: 0 0 0 2px #f7fafc;\\r\\n}\\r\\n\\r\\n.chat-panel {\\n position: relative;\\r\\n min-width: 0;\\r\\n min-height: 0;\\r\\n height: 100%;\\r\\n display: grid;\\r\\n grid-template-rows: 72px minmax(0, 1fr) auto auto;\\r\\n overflow: hidden;\\r\\n background: #eef2f5;\\n}\\n\\n.chat-panel.has-pinned-message {\\n grid-template-rows: 72px auto minmax(0, 1fr) auto auto;\\n}\\n\\r\\n.contact-panel {\\r\\n min-width: 0;\\r\\n min-height: 0;\\r\\n height: 100%;\\r\\n display: grid;\\r\\n grid-template-rows: 72px minmax(0, 1fr);\\r\\n overflow: auto;\\r\\n background: #eef2f5;\\r\\n}\\r\\n\\r\\n.contact-profile {\\r\\n align-self: start;\\r\\n width: min(520px, calc(100% - 48px));\\r\\n margin: 48px auto;\\r\\n display: grid;\\r\\n justify-items: center;\\r\\n gap: 18px;\\r\\n padding: 32px;\\r\\n background: var(--panel);\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n.profile-avatar {\\r\\n width: 76px;\\r\\n height: 76px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n font-size: 28px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.profile-main {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.remark-row {\\r\\n min-width: 0;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.profile-main h3 {\\r\\n margin: 0;\\r\\n font-size: 22px;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.remark-edit-button {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n flex: 0 0 auto;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.profile-main p {\\r\\n margin: 6px 0 0;\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.profile-fields {\\r\\n width: 100%;\\r\\n display: grid;\\r\\n gap: 12px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.profile-fields div {\\r\\n display: grid;\\r\\n grid-template-columns: 80px minmax(0, 1fr);\\r\\n gap: 12px;\\r\\n padding: 10px 0;\\r\\n border-top: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.profile-fields dt {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.profile-fields dd {\\r\\n margin: 0;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.profile-action {\\r\\n width: 160px;\\r\\n}\\r\\n\\r\\n.contact-panel .contact-modal-backdrop {\\r\\n position: fixed;\\r\\n}\\r\\n\\r\\n.header-actions {\\r\\n display: flex;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.chat-header-actions {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.chat-title-button {\\r\\n display: grid;\\r\\n grid-template-columns: 38px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n max-width: min(460px, 52vw);\\r\\n padding: 0;\\r\\n border: 0;\\r\\n background: transparent;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.chat-title-avatar {\\r\\n width: 38px;\\r\\n height: 38px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n font-size: 16px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.chat-title-copy {\\r\\n min-width: 0;\\r\\n}\\r\\n\\r\\n.chat-title-button h2 {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.chat-title-button:hover h2 {\\r\\n color: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.chat-more-menu {\\r\\n top: 38px;\\r\\n width: 150px;\\r\\n}\\r\\n\\r\\n.action-menu-anchor {\\r\\n position: relative;\\r\\n}\\r\\n\\r\\n.quick-action-menu {\\r\\n position: absolute;\\r\\n top: 40px;\\r\\n right: 0;\\r\\n z-index: 7;\\r\\n width: 168px;\\r\\n display: grid;\\r\\n padding: 6px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 14px 34px rgba(24, 33, 47, 0.16);\\r\\n}\\r\\n\\r\\n.quick-action-menu button {\\r\\n height: 34px;\\r\\n padding: 0 10px;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.quick-action-menu button:hover {\\r\\n background: #edf2f5;\\r\\n}\\r\\n\\r\\n.quick-action-menu.chat-more-menu {\\r\\n top: 38px;\\r\\n width: 150px;\\r\\n}\\r\\n\\r\\n.conversation-action-panel {\\r\\n width: min(100%, 340px);\\r\\n max-height: calc(100dvh - 116px);\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.contact-picker {\\r\\n display: grid;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.contact-picker > input {\\r\\n width: 100%;\\r\\n height: 38px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n}\\r\\n\\r\\n.contact-picker-list {\\r\\n max-height: 220px;\\r\\n overflow: auto;\\r\\n display: grid;\\r\\n gap: 6px;\\r\\n padding-right: 2px;\\r\\n}\\r\\n\\r\\n.contact-picker-row {\\r\\n width: 100%;\\r\\n min-height: 48px;\\r\\n display: grid;\\r\\n grid-template-columns: 22px 36px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n padding: 6px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.contact-picker-row:hover,\\r\\n.contact-picker-row.selected {\\r\\n border-color: #9fd4cc;\\r\\n background: #edf8f5;\\r\\n}\\r\\n\\r\\n.contact-picker-row .conversation-avatar {\\r\\n width: 36px;\\r\\n height: 36px;\\r\\n border-radius: 6px;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.contact-check {\\r\\n width: 20px;\\r\\n height: 20px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 4px;\\r\\n color: var(--primary-strong);\\r\\n font-size: 13px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.contact-picker-copy {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 2px;\\r\\n}\\r\\n\\r\\n.contact-picker-copy strong,\\r\\n.contact-picker-copy small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.contact-picker-copy small {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.contact-picker-empty {\\r\\n min-height: 64px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n color: var(--muted);\\r\\n border: 1px dashed var(--line);\\r\\n border-radius: 6px;\\r\\n}\\r\\n\\r\\n.group-dialog {\\r\\n width: min(420px, calc(100% - 32px));\\r\\n max-height: calc(100dvh - 116px);\\r\\n display: grid;\\r\\n gap: 16px;\\r\\n padding: 18px;\\r\\n overflow: auto;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.group-dialog header,\\r\\n.group-dialog footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.group-dialog h3 {\\r\\n margin: 0;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.single-profile-dialog {\\r\\n width: min(420px, calc(100% - 32px));\\r\\n}\\r\\n\\r\\n.single-profile-summary {\\r\\n display: grid;\\r\\n justify-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.single-profile-summary strong {\\r\\n max-width: 100%;\\r\\n overflow-wrap: anywhere;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.single-profile-footer {\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n}\\r\\n\\r\\n.single-profile-footer .inline-save-status {\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n.message-detail-dialog {\\r\\n width: min(560px, calc(100% - 32px));\\r\\n}\\r\\n\\r\\n.message-detail-meta div {\\r\\n grid-template-columns: 88px minmax(0, 1fr);\\r\\n}\\r\\n\\r\\n.message-detail-muted {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.message-detail-summary {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.message-detail-summary span {\\r\\n min-height: 30px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n gap: 4px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #f8fbfb;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.message-detail-summary strong {\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.message-detail-groups {\\r\\n display: grid;\\r\\n gap: 14px;\\r\\n}\\r\\n\\r\\n.message-detail-section {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.message-detail-section header {\\r\\n min-height: 28px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n border-bottom: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.message-detail-section header strong {\\r\\n font-size: 14px;\\r\\n}\\r\\n\\r\\n.message-detail-section header span {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.message-detail-member-list {\\r\\n display: grid;\\r\\n overflow: hidden;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.message-detail-member-row {\\r\\n display: grid;\\r\\n grid-template-columns: 34px minmax(0, 1fr) auto auto;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n min-height: 48px;\\r\\n padding: 7px 8px;\\r\\n border-top: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.message-detail-member-row:first-child {\\r\\n border-top: 0;\\r\\n}\\r\\n\\r\\n.message-detail-member-row .conversation-avatar {\\r\\n width: 34px;\\r\\n height: 34px;\\r\\n border-radius: 6px;\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.message-detail-member-main {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 2px;\\r\\n}\\r\\n\\r\\n.message-detail-member-main strong,\\r\\n.message-detail-member-main small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.message-detail-member-main strong {\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.message-detail-member-main small,\\r\\n.message-detail-member-time {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.message-detail-member-time {\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.message-detail-role {\\r\\n min-height: 22px;\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n padding: 0 7px;\\r\\n border: 1px solid #c7d9e5;\\r\\n border-radius: 6px;\\r\\n color: #416272;\\r\\n font-size: 12px;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.group-dialog label {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.group-dialog input {\\r\\n width: 100%;\\r\\n height: 42px;\\r\\n padding: 0 12px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n}\\r\\n\\r\\n.group-dialog textarea,\\r\\n.group-dialog select {\\r\\n width: 100%;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.group-dialog textarea {\\r\\n min-height: 86px;\\r\\n resize: vertical;\\r\\n padding: 10px 12px;\\r\\n line-height: 1.5;\\r\\n}\\r\\n\\r\\n.group-dialog select {\\r\\n height: 42px;\\r\\n padding: 0 10px;\\r\\n}\\r\\n\\r\\n.group-dialog input:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.group-dialog textarea:focus,\\r\\n.group-dialog select:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.group-profile {\\r\\n display: grid;\\r\\n gap: 10px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.group-profile div {\\r\\n display: grid;\\r\\n grid-template-columns: 78px minmax(0, 1fr);\\r\\n gap: 12px;\\r\\n padding: 10px 0;\\r\\n border-top: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.group-profile dt {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.group-profile dd {\\r\\n margin: 0;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.group-loading {\\r\\n min-height: 96px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.group-member-list {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.group-member-row {\\r\\n display: grid;\\r\\n grid-template-columns: 42px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n min-height: 54px;\\r\\n padding: 8px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n}\\r\\n\\r\\n.group-member-row.selectable {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.group-member-row.with-check {\\r\\n grid-template-columns: 24px 42px minmax(0, 1fr);\\r\\n}\\r\\n\\r\\n.group-member-row.selectable:hover,\\r\\n.group-member-row.selectable.selected {\\r\\n border-color: #9fd4cc;\\r\\n background: #edf8f5;\\r\\n}\\r\\n\\r\\n.group-member-row input[type=\\\"checkbox\\\"] {\\r\\n justify-self: center;\\r\\n width: 16px;\\r\\n height: 16px;\\r\\n}\\r\\n\\r\\n.group-member-row span:last-child {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 3px;\\r\\n}\\r\\n\\r\\n.group-member-row strong,\\r\\n.group-member-row small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.group-member-row small {\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.group-management-dialog {\\r\\n width: min(520px, calc(100% - 32px));\\r\\n}\\r\\n\\r\\n.group-management-tabs {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.group-management-tabs button {\\r\\n height: 34px;\\r\\n padding: 0 10px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.group-management-tabs button.active,\\r\\n.group-management-tabs button:hover {\\r\\n border-color: var(--primary);\\r\\n background: #e8f4f2;\\r\\n color: var(--primary-strong);\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.group-manage-section {\\r\\n display: grid;\\r\\n gap: 14px;\\r\\n}\\r\\n\\r\\n.group-manage-section footer {\\r\\n justify-content: flex-end;\\r\\n}\\r\\n\\r\\n.mute-save-footer {\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.inline-save-status {\\r\\n color: var(--primary-strong);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.inline-save-status.error {\\r\\n color: var(--accent);\\r\\n}\\r\\n\\r\\n.mute-time-grid {\\r\\n display: grid;\\r\\n grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.message-list {\\r\\n min-height: 0;\\r\\n overflow: auto;\\r\\n overscroll-behavior: contain;\\r\\n padding: 24px;\\r\\n}\\r\\n\\r\\n.message-row {\\r\\n display: flex;\\r\\n align-items: flex-end;\\r\\n gap: 8px;\\r\\n margin-bottom: 14px;\\r\\n}\\r\\n\\r\\n.message-row.out {\\r\\n justify-content: flex-end;\\r\\n}\\r\\n\\r\\n.message-sender-avatar {\\r\\n width: 34px;\\r\\n height: 34px;\\r\\n flex: 0 0 auto;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n overflow: hidden;\\r\\n padding: 0;\\r\\n border: 0;\\r\\n border-radius: 8px;\\r\\n background: #dce8f2;\\r\\n color: #24435c;\\r\\n font-size: 14px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.message-sender-avatar img {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n -o-object-fit: cover;\\r\\n object-fit: cover;\\r\\n}\\r\\n\\r\\n.message-stack {\\r\\n max-width: min(68%, 720px);\\r\\n display: grid;\\r\\n justify-items: start;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.message-row.out .message-stack {\\r\\n justify-items: end;\\r\\n}\\r\\n\\r\\n.message-sender-name {\\r\\n min-height: 18px;\\r\\n max-width: 100%;\\r\\n padding: 0;\\r\\n border: 0;\\r\\n background: transparent;\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n font-weight: 700;\\r\\n text-align: left;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.message-sender-name:hover {\\r\\n color: var(--primary-strong);\\r\\n}\\r\\n\\r\\n.message-sender-role {\\r\\n margin-left: 4px;\\r\\n color: var(--primary-strong);\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.message-row.selected .message-bubble {\\r\\n box-shadow: 0 0 0 2px rgba(24, 138, 121, 0.26);\\r\\n}\\r\\n\\r\\n.message-row.attention .message-bubble {\\r\\n animation: message-attention 1.4s ease-in-out 2;\\r\\n box-shadow: 0 0 0 3px rgba(24, 138, 121, 0.3);\\r\\n}\\r\\n\\r\\n@keyframes message-attention {\\r\\n 0%,\\r\\n 100% {\\r\\n box-shadow: 0 0 0 2px rgba(24, 138, 121, 0.16);\\r\\n }\\r\\n\\r\\n 45% {\\r\\n box-shadow: 0 0 0 5px rgba(24, 138, 121, 0.36);\\r\\n }\\r\\n}\\r\\n\\r\\n.message-select {\\r\\n width: 24px;\\r\\n height: 24px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n}\\r\\n\\r\\n.message-select input {\\r\\n width: 16px;\\r\\n height: 16px;\\r\\n}\\r\\n\\r\\n.message-bubble {\\r\\n position: relative;\\r\\n max-width: min(68%, 720px);\\r\\n padding: 10px 12px 8px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--bubble-in);\\r\\n box-shadow: 0 2px 8px rgba(30, 40, 50, 0.05);\\r\\n}\\r\\n\\r\\n.message-stack .message-bubble {\\r\\n max-width: 100%;\\r\\n}\\r\\n\\r\\n.message-row.out .message-bubble {\\n background: var(--bubble-out);\\r\\n border-color: #bfe4dc;\\r\\n}\\r\\n\\r\\n.message-bubble:hover {\\r\\n border-color: #9fd4cc;\\r\\n}\\r\\n\\r\\n.message-bubble.role-bubble-owner,\\r\\n.message-bubble.role-bubble-admin {\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.message-bubble.role-bubble-owner::after,\\r\\n.message-bubble.role-bubble-admin::after {\\r\\n content: \\\"\\\";\\r\\n position: absolute;\\r\\n top: 0;\\r\\n right: 0;\\r\\n width: 0;\\r\\n height: 0;\\r\\n border-top: 16px solid #d79d22;\\r\\n border-left: 16px solid transparent;\\r\\n}\\r\\n\\r\\n.message-bubble.role-bubble-admin::after {\\r\\n border-top-color: #178a79;\\r\\n}\\r\\n\\r\\n.message-bubble p {\\r\\n margin: 0;\\r\\n line-height: 1.5;\\r\\n white-space: pre-wrap;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.message-image {\\r\\n padding: 0;\\r\\n border: 0;\\r\\n display: block;\\r\\n max-width: min(280px, 62vw);\\r\\n overflow: hidden;\\r\\n border-radius: 6px;\\r\\n background: #edf2f5;\\r\\n cursor: zoom-in;\\r\\n}\\r\\n\\r\\n.message-image + p,\\r\\n.message-file + p {\\r\\n margin-top: 8px;\\r\\n}\\r\\n\\r\\n.message-image img {\\n display: block;\\r\\n max-width: 100%;\\r\\n max-height: 320px;\\r\\n -o-object-fit: contain;\\r\\n object-fit: contain;\\r\\n}\\n\\n.pinned-message-banner {\\n width: calc(100% - 28px);\\n height: 42px;\\n min-height: 42px;\\n margin: 8px 14px;\\n align-self: center;\\n display: grid;\\n grid-template-columns: auto auto minmax(0, 1fr) auto;\\n align-items: center;\\n gap: 8px;\\n padding: 8px 12px;\\n border: 1px solid #d5e2df;\\n border-radius: 9px;\\n background: #f7fbfa;\\n color: #52606d;\\n text-align: left;\\n cursor: pointer;\\n}\\n\\n.pinned-message-banner strong {\\n color: #0f766e;\\n white-space: nowrap;\\n}\\n\\n.pinned-message-preview {\\n min-width: 0;\\n display: flex;\\n align-items: center;\\n gap: 7px;\\n overflow: hidden;\\n}\\n\\n.pinned-message-preview > span {\\n min-width: 0;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n.pinned-message-preview img {\\n width: 28px;\\n height: 28px;\\n flex: 0 0 28px;\\n border-radius: 4px;\\n -o-object-fit: cover;\\n object-fit: cover;\\n}\\n\\n.pinned-message-close {\\n padding: 0 4px;\\n color: #748091;\\n font-size: 20px;\\n}\\n\\n.message-row.system {\\n justify-content: center;\\n padding-top: 5px;\\n padding-bottom: 5px;\\n}\\n\\n.system-message-pill {\\n max-width: min(78%, 620px);\\n padding: 5px 12px;\\n border-radius: 5px;\\n background: #c8c8c8;\\n color: #fff;\\n font-size: 12px;\\n line-height: 1.45;\\n text-align: center;\\n}\\n\\n.message-video {\\n display: block;\\n width: min(360px, 68vw);\\n max-height: 360px;\\n border-radius: 7px;\\n background: #111;\\n}\\n\\n.mention-picker {\\n position: absolute;\\n left: 18px;\\n bottom: 112px;\\n z-index: 20;\\n width: min(320px, calc(100% - 36px));\\n max-height: 260px;\\n overflow-y: auto;\\n padding: 6px;\\n border: 1px solid #d7e0e8;\\n border-radius: 10px;\\n background: #fff;\\n box-shadow: 0 12px 32px rgb(15 23 42 / 18%);\\n}\\n\\n.mention-picker button {\\n display: flex;\\n width: 100%;\\n align-items: center;\\n gap: 10px;\\n padding: 8px 10px;\\n border: 0;\\n border-radius: 7px;\\n background: transparent;\\n text-align: left;\\n}\\n\\n.mention-picker button:hover {\\n background: #eef7f5;\\n}\\n\\n.mention-picker img,\\n.mention-picker button > span {\\n width: 32px;\\n height: 32px;\\n border-radius: 7px;\\n -o-object-fit: cover;\\n object-fit: cover;\\n}\\n\\n.mention-picker button > span {\\n display: grid;\\n place-items: center;\\n background: #dceaf3;\\n color: #23445c;\\n}\\n\\n.red-packet-card {\\n width: min(320px, 68vw);\\n margin: -10px -12px -8px;\\n overflow: hidden;\\n border-radius: 7px;\\n background: #ff9f32;\\n color: #fff;\\n}\\n\\n.red-packet-card-main {\\n display: flex;\\n align-items: center;\\n gap: 13px;\\n padding: 20px 18px 17px;\\n}\\n\\n.red-packet-card-main > span:last-child {\\n display: grid;\\n gap: 7px;\\n}\\n\\n.red-packet-card-main strong {\\n font-size: 17px;\\n font-weight: 700;\\n}\\n\\n.red-packet-card-main small {\\n color: rgba(255, 255, 255, 0.9);\\n font-size: 13px;\\n}\\n\\n.red-packet-icon,\\n.red-packet-mini-icon {\\n display: grid;\\n place-items: center;\\n flex: 0 0 auto;\\n border-radius: 3px;\\n background: #d92f27;\\n color: #ffd968;\\n font-weight: 800;\\n}\\n\\n.red-packet-icon {\\n width: 34px;\\n height: 44px;\\n font-size: 17px;\\n}\\n\\n.red-packet-card-footer {\\n padding: 9px 15px;\\n background: #fff;\\n color: #8a8f94;\\n font-size: 12px;\\n}\\n\\n.red-packet-receipt {\\n display: flex;\\n align-items: center;\\n gap: 7px;\\n color: #69747d;\\n}\\n\\n.red-packet-mini-icon {\\n width: 22px;\\n height: 28px;\\n font-size: 11px;\\n}\\n\\r\\n.image-viewer-backdrop {\\n position: fixed;\\r\\n inset: 0;\\r\\n z-index: 80;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 20px;\\n background: rgba(7, 12, 20, 0.82);\\n backdrop-filter: blur(6px);\\n}\\n\\n.image-viewer-dialog {\\n width: min(920px, calc(100vw - 64px));\\n height: min(660px, calc(100vh - 64px));\\n min-width: 320px;\\n min-height: 260px;\\n max-width: calc(100vw - 64px);\\n max-height: calc(100vh - 64px);\\n display: grid;\\r\\n grid-template-rows: 52px minmax(0, 1fr);\\r\\n overflow: hidden;\\r\\n border: 1px solid rgba(255, 255, 255, 0.18);\\n border-radius: 14px;\\n background: #0b1119;\\n box-shadow: 0 28px 90px rgba(0, 0, 0, 0.56);\\n}\\r\\n\\r\\n.image-viewer-toolbar {\\r\\n min-width: 0;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n gap: 8px;\\r\\n padding: 8px 10px;\\r\\n border-bottom: 1px solid rgba(255, 255, 255, 0.12);\\r\\n background: rgba(24, 33, 47, 0.94);\\r\\n}\\r\\n\\r\\n.image-viewer-toolbar button {\\r\\n width: 36px;\\r\\n height: 36px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: #f8fafc;\\r\\n font-size: 17px;\\r\\n font-weight: 700;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.image-viewer-toolbar button:hover {\\r\\n background: rgba(255, 255, 255, 0.14);\\r\\n}\\r\\n\\r\\n.image-viewer-stage {\\n position: relative;\\n min-width: 0;\\r\\n min-height: 0;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n overflow: hidden;\\n background: #0c121a;\\n cursor: default;\\n}\\n\\n.image-viewer-nav {\\n position: absolute;\\n top: 50%;\\n z-index: 2;\\n width: 52px;\\n height: 52px;\\n display: grid;\\n place-items: center;\\n border: 1px solid rgba(255, 255, 255, 0.18);\\n border-radius: 50%;\\n background: rgba(18, 27, 39, 0.76);\\n color: #fff;\\n font-size: 42px;\\n font-weight: 300;\\n line-height: 1;\\n transform: translateY(-50%);\\n cursor: pointer;\\n backdrop-filter: blur(5px);\\n}\\n\\n.image-viewer-nav:hover {\\n background: rgba(41, 57, 75, 0.94);\\n}\\n\\n.image-viewer-prev {\\n left: 18px;\\n}\\n\\n.image-viewer-next {\\n right: 18px;\\n}\\n\\r\\n.image-viewer-img {\\n position: absolute;\\n top: 20px;\\n left: 90px;\\n width: calc(100% - 180px);\\n height: calc(100% - 40px);\\n max-width: none;\\n max-height: none;\\n -o-object-fit: contain;\\n object-fit: contain;\\n transform-origin: center center;\\r\\n transition: transform 0.12s ease-out;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n user-select: none;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.sender-profile-backdrop {\\r\\n position: fixed;\\r\\n inset: 0;\\r\\n z-index: 84;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n padding: 24px;\\r\\n background: rgba(24, 33, 47, 0.32);\\r\\n}\\r\\n\\r\\n.sender-profile-dialog {\\r\\n width: min(380px, calc(100vw - 32px));\\r\\n display: grid;\\r\\n gap: 16px;\\r\\n padding: 18px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.sender-profile-dialog header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.sender-profile-main {\\r\\n display: grid;\\r\\n justify-items: center;\\r\\n gap: 8px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.sender-profile-main strong {\\r\\n max-width: 100%;\\r\\n overflow-wrap: anywhere;\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.sender-profile-main span {\\r\\n color: var(--primary-strong);\\r\\n font-size: 12px;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.sender-profile-fields {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n margin: 0;\\r\\n}\\r\\n\\r\\n.sender-profile-fields div {\\r\\n display: grid;\\r\\n grid-template-columns: 72px minmax(0, 1fr);\\r\\n gap: 10px;\\r\\n padding-top: 8px;\\r\\n border-top: 1px solid var(--line);\\r\\n}\\r\\n\\r\\n.sender-profile-fields dt {\\r\\n color: var(--muted);\\r\\n}\\r\\n\\r\\n.sender-profile-fields dd {\\r\\n margin: 0;\\r\\n overflow-wrap: anywhere;\\r\\n}\\r\\n\\r\\n.sender-profile-alias {\\r\\n display: grid;\\r\\n gap: 8px;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.sender-profile-alias input {\\r\\n width: 100%;\\r\\n height: 40px;\\r\\n padding: 0 12px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 6px;\\r\\n outline: none;\\r\\n background: #fff;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.sender-profile-alias input:focus {\\r\\n border-color: var(--primary);\\r\\n box-shadow: 0 0 0 3px rgba(23, 125, 114, 0.12);\\r\\n}\\r\\n\\r\\n.sender-profile-actions {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.sender-profile-actions .inline-save-status {\\r\\n margin-right: auto;\\r\\n}\\r\\n\\r\\n@media (max-width: 480px) {\\r\\n .image-viewer-backdrop {\\r\\n padding: 12px;\\r\\n }\\r\\n\\r\\n .image-viewer-dialog {\\r\\n width: calc(100vw - 24px);\\r\\n height: min(560px, calc(100vh - 24px));\\r\\n min-width: 280px;\\r\\n min-height: 240px;\\r\\n max-width: calc(100vw - 24px);\\r\\n max-height: calc(100vh - 24px);\\r\\n }\\r\\n\\r\\n .image-viewer-toolbar {\\r\\n gap: 4px;\\r\\n padding: 6px;\\r\\n }\\r\\n\\r\\n .image-viewer-toolbar button {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n font-size: 15px;\\r\\n }\\r\\n\\r\\n .message-detail-member-row {\\r\\n grid-template-columns: 34px minmax(0, 1fr);\\r\\n }\\r\\n\\r\\n .message-detail-member-time,\\r\\n .message-detail-role {\\r\\n grid-column: 2;\\r\\n justify-self: start;\\r\\n }\\r\\n\\r\\n .avatar-cropper-panel {\\r\\n width: calc(100vw - 24px);\\r\\n max-height: calc(100dvh - 24px);\\r\\n }\\r\\n\\r\\n .avatar-cropper-layout {\\r\\n grid-template-columns: minmax(0, 1fr);\\r\\n }\\r\\n\\r\\n .avatar-cropper-stage {\\r\\n height: 300px;\\r\\n min-height: 300px;\\r\\n }\\r\\n\\r\\n .avatar-cropper-controls {\\r\\n grid-template-columns: minmax(0, 1fr) auto;\\r\\n align-items: center;\\r\\n }\\r\\n\\r\\n .avatar-cropper-tools {\\r\\n grid-template-columns: repeat(3, minmax(0, 1fr));\\r\\n }\\r\\n\\r\\n .avatar-cropper-preview {\\r\\n width: 82px;\\r\\n height: 82px;\\r\\n }\\r\\n\\r\\n .avatar-cropper-controls footer {\\r\\n grid-column: 1 / -1;\\r\\n }\\r\\n\\r\\n .settings-panel {\\r\\n width: calc(100vw - 24px);\\r\\n max-height: calc(100dvh - 24px);\\r\\n }\\r\\n\\r\\n .settings-layout {\\r\\n grid-template-columns: minmax(0, 1fr);\\r\\n }\\r\\n\\r\\n .settings-menu {\\r\\n grid-auto-flow: column;\\r\\n grid-auto-columns: minmax(120px, 1fr);\\r\\n overflow-x: auto;\\r\\n padding-bottom: 2px;\\r\\n }\\r\\n\\r\\n .settings-password-form footer .inline-save-status {\\r\\n flex: 1 1 100%;\\r\\n }\\r\\n}\\r\\n\\r\\n.message-file {\\r\\n width: min(280px, 62vw);\\r\\n display: grid;\\r\\n grid-template-columns: 38px minmax(0, 1fr);\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n padding: 10px;\\r\\n border: 1px solid #d6e2e7;\\r\\n border-radius: 6px;\\r\\n background: #f8fbfc;\\r\\n color: var(--text);\\r\\n text-decoration: none;\\r\\n}\\r\\n\\r\\n.message-file:hover {\\r\\n border-color: #9fd4cc;\\r\\n background: #edf8f5;\\r\\n}\\r\\n\\r\\n.message-file-icon {\\r\\n width: 38px;\\r\\n height: 38px;\\r\\n display: grid;\\r\\n place-items: center;\\r\\n border-radius: 6px;\\r\\n background: #e3eff2;\\r\\n color: var(--primary-strong);\\r\\n font-size: 18px;\\r\\n font-weight: 800;\\r\\n}\\r\\n\\r\\n.message-file-main {\\r\\n min-width: 0;\\r\\n display: grid;\\r\\n gap: 3px;\\r\\n}\\r\\n\\r\\n.message-file-main strong,\\r\\n.message-file-main small {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.message-file-main strong {\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.message-file-main small {\\r\\n color: var(--muted);\\r\\n font-size: 11px;\\r\\n}\\r\\n\\r\\n.message-bubble time {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n flex-wrap: wrap;\\r\\n gap: 4px;\\r\\n margin-top: 4px;\\r\\n color: var(--muted);\\r\\n font-size: 11px;\\r\\n text-align: right;\\r\\n}\\r\\n\\r\\n.recall-mark {\\r\\n margin-right: auto;\\r\\n color: #d93025;\\r\\n font-size: 11px;\\r\\n font-weight: 700;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.edit-mark {\\r\\n color: #7a8792;\\r\\n font-size: 11px;\\r\\n font-weight: 600;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.delivery-mark {\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: flex-end;\\r\\n min-width: 14px;\\r\\n color: #8f9aa3;\\r\\n font-size: 14px;\\r\\n font-weight: 800;\\r\\n letter-spacing: 0;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.delivery-mark-delivered,\\r\\n.delivery-mark-read {\\r\\n min-width: 19px;\\r\\n}\\r\\n\\r\\n.delivery-mark-read {\\r\\n color: #1aa66a;\\r\\n}\\r\\n\\r\\n.favorite-mark {\\r\\n color: #c79520;\\r\\n font-size: 12px;\\r\\n line-height: 1;\\r\\n}\\r\\n\\r\\n.delivery-check {\\r\\n display: inline-block;\\r\\n}\\r\\n\\r\\n.delivery-check-second {\\r\\n margin-left: -5px;\\r\\n}\\r\\n\\r\\n.delivery-error {\\r\\n color: #c0392b;\\r\\n}\\r\\n\\r\\n.message-context-menu {\\r\\n position: fixed;\\r\\n z-index: 30;\\r\\n width: 136px;\\r\\n padding: 6px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 16px 40px rgba(24, 33, 47, 0.18);\\r\\n}\\r\\n\\r\\n.message-context-menu button {\\r\\n width: 100%;\\r\\n min-height: 32px;\\r\\n padding: 0 10px;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.message-context-menu button:hover {\\r\\n background: #eaf3f1;\\r\\n}\\r\\n\\r\\n.selection-toolbar {\\r\\n min-height: 42px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n padding: 8px 16px;\\r\\n border-top: 1px solid var(--line);\\r\\n background: #f7fafc;\\r\\n}\\r\\n\\r\\n.selection-toolbar span {\\r\\n flex: 1;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.selection-toolbar button {\\r\\n min-height: 30px;\\r\\n padding: 0 10px;\\r\\n border-radius: 6px;\\r\\n}\\r\\n\\r\\n.forward-dialog,\\r\\n.edit-dialog {\\r\\n width: min(100%, 340px);\\r\\n max-height: min(520px, calc(100vh - 130px));\\r\\n display: grid;\\r\\n gap: 4px;\\r\\n padding: 14px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 18px 40px rgba(24, 33, 47, 0.18);\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.forward-dialog header,\\r\\n.edit-dialog header,\\r\\n.forward-target {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.forward-dialog header,\\r\\n.edit-dialog header {\\r\\n justify-content: space-between;\\r\\n margin-bottom: 6px;\\r\\n}\\r\\n\\r\\n.forward-dialog h3,\\r\\n.edit-dialog h3 {\\r\\n margin: 0;\\r\\n font-size: 16px;\\r\\n}\\r\\n\\r\\n.edit-dialog {\\r\\n width: min(100%, 420px);\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.edit-dialog textarea {\\r\\n width: 100%;\\r\\n min-height: 132px;\\r\\n resize: vertical;\\r\\n border-radius: 8px;\\r\\n border: 1px solid var(--line);\\r\\n padding: 10px;\\r\\n background: #f9fbfc;\\r\\n color: var(--text);\\r\\n line-height: 1.5;\\r\\n}\\r\\n\\r\\n.edit-dialog textarea:focus {\\r\\n border-color: var(--accent);\\r\\n outline: 0;\\r\\n box-shadow: 0 0 0 3px rgba(24, 138, 121, 0.14);\\r\\n}\\r\\n\\r\\n.edit-dialog footer {\\r\\n display: flex;\\r\\n justify-content: flex-end;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.edit-dialog footer button {\\r\\n min-height: 34px;\\r\\n padding: 0 14px;\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n.forward-target {\\r\\n min-height: 52px;\\r\\n padding: 6px;\\r\\n border: 0;\\r\\n border-radius: 8px;\\r\\n background: transparent;\\r\\n color: var(--text);\\r\\n text-align: left;\\r\\n}\\r\\n\\r\\n.forward-target:hover {\\r\\n background: #eaf3f1;\\r\\n}\\r\\n\\r\\n.chat-toast {\\r\\n position: absolute;\\r\\n left: 50%;\\r\\n bottom: 132px;\\r\\n z-index: 20;\\r\\n transform: translateX(-50%);\\r\\n padding: 8px 12px;\\r\\n border-radius: 8px;\\r\\n background: rgba(35, 45, 58, 0.92);\\r\\n color: #fff;\\r\\n font-size: 13px;\\r\\n pointer-events: none;\\r\\n}\\r\\n\\r\\n.chat-toast.error {\\r\\n background: rgba(192, 57, 43, 0.94);\\r\\n}\\r\\n\\r\\n.message-composer {\\r\\n position: relative;\\r\\n min-height: 0;\\r\\n border-top: 1px solid var(--line);\\r\\n background: var(--panel);\\r\\n}\\r\\n\\r\\n.message-composer::after {\\r\\n content: \\\"\\\";\\r\\n position: absolute;\\r\\n inset: 6px;\\r\\n z-index: 4;\\r\\n border: 2px dashed transparent;\\r\\n border-radius: 8px;\\r\\n pointer-events: none;\\r\\n transition: border-color 0.12s ease, background-color 0.12s ease;\\r\\n}\\r\\n\\r\\n.message-composer.drop-active::after {\\r\\n border-color: var(--primary);\\r\\n background: rgba(23, 125, 114, 0.08);\\r\\n}\\r\\n\\r\\n.quote-preview {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n padding: 8px 16px 0;\\r\\n color: var(--muted);\\r\\n font-size: 13px;\\r\\n}\\r\\n\\r\\n.quote-preview span {\\r\\n min-width: 0;\\r\\n flex: 1;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n border-left: 3px solid var(--accent);\\r\\n padding-left: 8px;\\r\\n}\\r\\n\\r\\n.quote-preview strong {\\r\\n margin-right: 6px;\\r\\n color: var(--text);\\r\\n}\\r\\n\\r\\n.quote-preview button {\\r\\n width: 26px;\\r\\n height: 26px;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: var(--muted);\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.quote-preview button:hover {\\r\\n background: #edf2f5;\\r\\n}\\r\\n\\r\\n.composer-tools {\\r\\n position: relative;\\r\\n display: flex;\\r\\n gap: 4px;\\r\\n padding: 8px 16px 0;\\r\\n}\\r\\n\\r\\n.composer-tools input[type=\\\"file\\\"] {\\r\\n display: none;\\r\\n}\\r\\n\\r\\n.composer-tools button {\\r\\n width: 32px;\\r\\n height: 32px;\\r\\n border: 0;\\r\\n border-radius: 6px;\\r\\n background: transparent;\\r\\n color: var(--muted);\\r\\n font-size: 18px;\\r\\n}\\r\\n\\r\\n.composer-tools button:hover {\\r\\n background: #edf2f5;\\r\\n}\\r\\n\\r\\n.emoji-picker {\\r\\n position: absolute;\\r\\n left: 16px;\\r\\n bottom: 38px;\\r\\n z-index: 12;\\r\\n width: 256px;\\r\\n display: grid;\\r\\n grid-template-columns: repeat(8, 1fr);\\r\\n gap: 2px;\\r\\n padding: 8px;\\r\\n border: 1px solid var(--line);\\r\\n border-radius: 8px;\\r\\n background: var(--panel);\\r\\n box-shadow: 0 14px 34px rgba(24, 33, 47, 0.16);\\r\\n}\\r\\n\\r\\n.emoji-picker button {\\r\\n width: 28px;\\r\\n height: 28px;\\r\\n border-radius: 6px;\\r\\n font-size: 17px;\\r\\n}\\r\\n\\r\\n.message-composer textarea {\\r\\n display: block;\\r\\n min-height: 86px;\\r\\n max-height: 180px;\\r\\n padding: 12px 16px;\\r\\n border: 0;\\r\\n border-radius: 0;\\r\\n resize: none;\\r\\n box-shadow: none;\\r\\n}\\r\\n\\r\\n.composer-footer {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: space-between;\\r\\n gap: 12px;\\r\\n padding: 0 16px 14px;\\r\\n color: var(--muted);\\r\\n font-size: 12px;\\r\\n}\\r\\n\\r\\n.send-button {\\r\\n min-width: 72px;\\r\\n height: 34px;\\r\\n}\\r\\n\\r\\n@media (max-width: 760px) {\\r\\n .app-shell {\\r\\n grid-template-columns: 56px minmax(0, 1fr);\\r\\n }\\r\\n\\r\\n .conversation-list {\\r\\n display: none;\\r\\n }\\r\\n\\r\\n .message-bubble {\\r\\n max-width: 86%;\\r\\n }\\r\\n}\\r\\n\", \"\"]);\n// Exports\n/* harmony default export */ __webpack_exports__[\"default\"] = (___CSS_LOADER_EXPORT___);\n\n\n//# sourceURL=webpack://jc-web-im/./src/styles/base.css?./node_modules/css-loader/dist/cjs.js??clonedRuleSet-14.use%5B1%5D!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-14.use%5B2%5D\n}");
/***/ }),
diff --git a/dist/api/conversation_actions.php b/dist/api/conversation_actions.php
index 299cc7e..61241c6 100644
--- a/dist/api/conversation_actions.php
+++ b/dist/api/conversation_actions.php
@@ -425,12 +425,38 @@ function currentMuteSetting(PDO $appDb, string $groupId): array
];
}
-function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
-{
- $group = fetchWebGroup($appDb, $groupId);
- if (!$group) {
- respond(404, '没有找到该群组');
- }
+function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
+{
+ $group = fetchWebGroup($appDb, $groupId);
+ if (!$group) {
+ $groupStatement = $imDb->prepare('select * from `t_group` where `_gid` = ? and `_deleted` = 0 limit 1');
+ $groupStatement->execute([$groupId]);
+ $nativeGroup = $groupStatement->fetch();
+ $memberStatement = $imDb->prepare('select `_type`, `_alias` from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1');
+ $memberStatement->execute([$groupId, $userId]);
+ $nativeMember = $memberStatement->fetch();
+ if (!$nativeGroup || !$nativeMember) {
+ respond(403, '你不在该群组中');
+ }
+ $ownerStatement = $imDb->prepare('select `_mid` from `t_group_member` where `_gid` = ? and `_type` = 2 limit 1');
+ $ownerStatement->execute([$groupId]);
+ $ownerId = (string)($ownerStatement->fetchColumn() ?: '');
+ $users = fetchWebUserMap($imDb, array_filter([$ownerId, $userId]), $userId);
+ return ['group' => [
+ 'groupId' => $groupId,
+ 'publicId' => (string)($nativeGroup['id'] ?? ''),
+ 'name' => (string)($nativeGroup['_name'] ?? $groupId),
+ 'category' => 'group',
+ 'announcement' => (string)($nativeGroup['_bulletin'] ?? ''),
+ 'welcomeText' => '',
+ 'ownerUid' => $ownerId,
+ 'ownerName' => (string)($users[$ownerId]['displayName'] ?? $ownerId),
+ 'myRole' => ((int)($nativeMember['_type'] ?? 0) === 2 ? 'owner' : ((int)($nativeMember['_type'] ?? 0) === 1 ? 'admin' : 'member')),
+ 'myAlias' => (string)($nativeMember['_alias'] ?? ''),
+ 'myDisplayName' => (string)($nativeMember['_alias'] ?? '') ?: (string)($users[$userId]['displayName'] ?? $userId),
+ 'muteSetting' => ['enabled' => false, 'mode' => 'off'],
+ ]];
+ }
$member = fetchWebGroupMember($appDb, $groupId, $userId);
if (!$member) {
respond(403, '你不在该群组中');
@@ -443,8 +469,9 @@ function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupI
$myAlias = (string)($member['alias'] ?? '');
return [
- 'group' => [
- 'groupId' => (string)$group['group_id'],
+ 'group' => [
+ 'groupId' => (string)$group['group_id'],
+ 'publicId' => (string)($group['id'] ?? ''),
'name' => (string)$group['name'],
'category' => (string)$group['category'],
'announcement' => (string)($group['announcement'] ?? ''),
@@ -459,11 +486,42 @@ function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupI
];
}
-function groupMembersAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
-{
- if (!fetchWebGroupMember($appDb, $groupId, $userId)) {
- respond(403, '你不在该群组中');
- }
+function groupMembersAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
+{
+ if (!fetchWebGroupMember($appDb, $groupId, $userId)) {
+ $membership = $imDb->prepare('select 1 from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1');
+ $membership->execute([$groupId, $userId]);
+ if (!$membership->fetchColumn()) {
+ respond(403, '你不在该群组中');
+ }
+ $nativeStatement = $imDb->prepare(
+ 'select `_mid` as `user_id`, `_type`, `_alias`, `_create_dt` from `t_group_member`'
+ . ' where `_gid` = ? order by (`_type` = 2) desc, `_create_dt` asc'
+ );
+ $nativeStatement->execute([$groupId]);
+ $nativeMembers = $nativeStatement->fetchAll();
+ $nativeUsers = fetchWebUserMap($imDb, array_column($nativeMembers, 'user_id'), $userId);
+ return ['members' => array_map(static function (array $member) use ($nativeUsers): array {
+ $uid = (string)$member['user_id'];
+ $user = $nativeUsers[$uid] ?? ['displayName' => $uid, 'mobile' => '', 'portrait' => '', 'isContact' => false];
+ $alias = trim((string)($member['_alias'] ?? ''));
+ $type = (int)($member['_type'] ?? 0);
+ return [
+ 'uid' => $uid,
+ 'role' => $type === 2 ? 'owner' : ($type === 1 ? 'admin' : 'member'),
+ 'alias' => $alias,
+ 'contactAlias' => trim((string)($user['contactAlias'] ?? '')),
+ 'friendAlias' => trim((string)($user['friendAlias'] ?? '')),
+ 'remarkAlias' => trim((string)($user['remarkAlias'] ?? '')),
+ 'isContact' => (bool)($user['isContact'] ?? false),
+ 'displayName' => trim((string)($user['contactAlias'] ?? '')) ?: ($alias ?: (string)$user['displayName']),
+ 'rawDisplayName' => (string)$user['displayName'],
+ 'groupDisplayName' => $alias,
+ 'mobile' => (string)($user['mobile'] ?? ''),
+ 'portrait' => (string)($user['portrait'] ?? ''),
+ ];
+ }, $nativeMembers)];
+ }
$statement = $appDb->prepare(
'select `user_id`, `role`, `alias`, `joined_at_ms` from `t_web_group_members`'
diff --git a/dist/api/media_stream.php b/dist/api/media_stream.php
new file mode 100644
index 0000000..7ccd61f
--- /dev/null
+++ b/dist/api/media_stream.php
@@ -0,0 +1,71 @@
+ $end || $start >= $size) {
+ header('Content-Range: bytes */' . $size);
+ failMediaStream(416, '请求范围无效');
+ }
+ http_response_code(206);
+ header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);
+}
+
+$length = $end - $start + 1;
+header('Content-Type: ' . $mime);
+header('Content-Length: ' . $length);
+header('Accept-Ranges: bytes');
+header('Content-Disposition: inline');
+header('Cache-Control: public, max-age=86400');
+header('X-Content-Type-Options: nosniff');
+
+$stream = fopen($fullPath, 'rb');
+if ($stream === false) failMediaStream(500, '视频文件无法读取');
+fseek($stream, $start);
+$remaining = $length;
+while ($remaining > 0 && !feof($stream)) {
+ $chunk = fread($stream, min(1024 * 1024, $remaining));
+ if ($chunk === false || $chunk === '') break;
+ echo $chunk;
+ $remaining -= strlen($chunk);
+ flush();
+}
+fclose($stream);
diff --git a/dist/api/message_action.php b/dist/api/message_action.php
index e4c337b..e7bd9e9 100644
--- a/dist/api/message_action.php
+++ b/dist/api/message_action.php
@@ -97,26 +97,41 @@ function ensureMessageEditsTable(): void
function ensurePinnedMessagesTable(): void
{
- imAppDb()->exec(
+ $db = imAppDb();
+ $db->exec(
'create table if not exists `t_web_pinned_messages` ('
. '`user_id` varchar(64) not null,'
. '`conversation_type` varchar(16) not null,'
. '`target_id` varchar(128) not null,'
. '`message_uid` varchar(32) not null,'
+ . '`message_json` text null,'
. '`updated_at_ms` bigint not null,'
. 'primary key (`user_id`, `conversation_type`, `target_id`)'
. ') engine=InnoDB default charset=utf8mb4'
);
+ try {
+ $db->exec('alter table `t_web_pinned_messages` add column `message_json` text null after `message_uid`');
+ } catch (Throwable) {
+ // The column already exists.
+ }
}
-function savePinnedMessage(string $userId, string $conversationType, string $targetId, string $messageUid): void
+function savePinnedMessage(string $userId, string $conversationType, string $targetId, string $messageUid, array $message): void
{
ensurePinnedMessagesTable();
$statement = imAppDb()->prepare(
- 'insert into `t_web_pinned_messages` (`user_id`, `conversation_type`, `target_id`, `message_uid`, `updated_at_ms`)'
- . ' values (?, ?, ?, ?, ?) on duplicate key update `message_uid` = values(`message_uid`), `updated_at_ms` = values(`updated_at_ms`)'
+ 'insert into `t_web_pinned_messages` (`user_id`, `conversation_type`, `target_id`, `message_uid`, `message_json`, `updated_at_ms`)'
+ . ' values (?, ?, ?, ?, ?, ?) on duplicate key update `message_uid` = values(`message_uid`),'
+ . ' `message_json` = values(`message_json`), `updated_at_ms` = values(`updated_at_ms`)'
);
- $statement->execute([$userId, $conversationType, $targetId, $messageUid, nowTimestampMs()]);
+ $statement->execute([
+ $userId,
+ $conversationType,
+ $targetId,
+ $messageUid,
+ json_encode($message, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
+ nowTimestampMs(),
+ ]);
}
function removePinnedMessage(string $userId, string $conversationType, string $targetId): void
@@ -263,7 +278,8 @@ try {
if ($targetId === '') respond(400, '缺少会话ID');
$userId = resolveActionUserId($userId);
if ($action === 'pin') {
- savePinnedMessage($userId, $conversationType, $targetId, $messageUidText);
+ $message = is_array($payload['message'] ?? null) ? $payload['message'] : [];
+ savePinnedMessage($userId, $conversationType, $targetId, $messageUidText, $message);
} else {
removePinnedMessage($userId, $conversationType, $targetId);
}
diff --git a/dist/api/messages.php b/dist/api/messages.php
index 9ca2f0f..c1d2771 100644
--- a/dist/api/messages.php
+++ b/dist/api/messages.php
@@ -597,6 +597,7 @@ function formatWebGroupMessage(
'senderPortrait' => (string)($senderUser['_portrait'] ?? ''),
'senderProfile' => [
'uid' => $from,
+ 'userId' => (string)($senderUser['_name'] ?? ''),
'displayName' => $senderName,
'rawName' => $senderRawName,
'contactAlias' => $senderContactAlias,
@@ -964,6 +965,7 @@ function formatNativeGroupMessage(
'senderPortrait' => (string)($senderUser['_portrait'] ?? ''),
'senderProfile' => [
'uid' => $from,
+ 'userId' => (string)($senderUser['_name'] ?? ''),
'displayName' => $senderName,
'rawName' => $senderRawName,
'contactAlias' => $senderContactAlias,
@@ -1064,7 +1066,7 @@ function loadNativeGroupMessages(PDO $db, string $userId, string $groupId, int $
}
$table = imUserMessagesTable($userId);
- $scanLimit = min(max($limit * 4, $limit), 400);
+ $scanLimit = min(max($limit * 4, $limit), 5000);
$statement = $db->prepare(
'select `_mid`, `_dt` from `' . $table . '`'
. ' where `_uid` = ? and `_type` = 1 and `_line` = 0 and `_target` = ?'
@@ -1624,16 +1626,26 @@ function messageSyncResult(
'create table if not exists `t_web_pinned_messages` ('
. '`user_id` varchar(64) not null, `conversation_type` varchar(16) not null,'
. '`target_id` varchar(128) not null, `message_uid` varchar(32) not null,'
+ . '`message_json` text null,'
. '`updated_at_ms` bigint not null, primary key (`user_id`, `conversation_type`, `target_id`)'
. ') engine=InnoDB default charset=utf8mb4'
);
+ try {
+ imAppDb()->exec('alter table `t_web_pinned_messages` add column `message_json` text null after `message_uid`');
+ } catch (Throwable) {
+ // The column already exists.
+ }
$statement = imAppDb()->prepare(
- 'select `message_uid` from `t_web_pinned_messages` where `user_id` = ? and `conversation_type` = ? and `target_id` = ? limit 1'
+ 'select `message_uid`, `message_json` from `t_web_pinned_messages` where `user_id` = ? and `conversation_type` = ? and `target_id` = ? limit 1'
);
$statement->execute([$userId, $conversationType, $targetId]);
- $result['pinnedMessageUid'] = (string)($statement->fetchColumn() ?: '');
+ $pinnedRow = $statement->fetch();
+ $result['pinnedMessageUid'] = (string)($pinnedRow['message_uid'] ?? '');
+ $pinnedMessage = json_decode((string)($pinnedRow['message_json'] ?? ''), true);
+ $result['pinnedMessage'] = is_array($pinnedMessage) ? $pinnedMessage : null;
} catch (Throwable) {
$result['pinnedMessageUid'] = '';
+ $result['pinnedMessage'] = null;
}
}
@@ -1643,7 +1655,7 @@ function messageSyncResult(
$payload = readJsonPayload();
$userId = trim((string)($payload['userId'] ?? ''));
$target = trim((string)($payload['target'] ?? ''));
-$limit = clampLimit($payload['limit'] ?? 50, 50, 100);
+$limit = clampLimit($payload['limit'] ?? 1000, 50, 1000);
$markRead = payloadBool($payload['markRead'] ?? false);
$includeConversations = payloadBool($payload['includeConversations'] ?? false);
$conversationType = normalizeConversationType($payload['conversationType'] ?? $payload['type'] ?? 0);
diff --git a/dist/api/send_message.php b/dist/api/send_message.php
index c06af18..aa133bd 100644
--- a/dist/api/send_message.php
+++ b/dist/api/send_message.php
@@ -8,8 +8,9 @@ require __DIR__ . '/im_web_bootstrap.php';
const WEB_MEDIA_ROOT = '/opt/im-server/media';
const WEB_MEDIA_PUBLIC_PORT = 18000;
-const WEB_MEDIA_TYPE_IMAGE = 1;
-const WEB_MEDIA_TYPE_FILE = 4;
+const WEB_MEDIA_TYPE_IMAGE = 1;
+const WEB_MEDIA_TYPE_VIDEO = 3;
+const WEB_MEDIA_TYPE_FILE = 4;
const WEB_IMAGE_MAX_BYTES = 10 * 1024 * 1024;
const WEB_FILE_MAX_BYTES = 50 * 1024 * 1024;
@@ -245,13 +246,32 @@ function storeMessageAttachment(
]);
}
-function attachmentFromRequest(string $messageType): ?array
-{
- if (!in_array($messageType, ['image', 'file'], true)) {
- return null;
- }
-
- $attachmentFile = $_FILES['attachment'] ?? $_FILES['file'] ?? null;
+function attachmentFromRequest(string $messageType): ?array
+{
+ if (!in_array($messageType, ['image', 'video', 'file'], true)) {
+ return null;
+ }
+
+ $forwardUrl = trim((string)($_POST['attachmentUrl'] ?? ''));
+ if ($forwardUrl !== '') {
+ $parts = parse_url($forwardUrl);
+ $scheme = strtolower((string)($parts['scheme'] ?? ''));
+ if (!in_array($scheme, ['http', 'https'], true) || empty($parts['host']) || strlen($forwardUrl) > 2048) {
+ respond(400, '媒体地址不合法');
+ }
+ $mime = trim((string)($_POST['attachmentMime'] ?? 'application/octet-stream'));
+ $name = safeUploadName((string)($_POST['attachmentName'] ?? ($messageType === 'image' ? '图片' : ($messageType === 'video' ? '视频.mp4' : '文件'))));
+ return [
+ 'type' => $messageType,
+ 'url' => $forwardUrl,
+ 'name' => $name,
+ 'mime' => $mime,
+ 'size' => max(0, (int)($_POST['attachmentSize'] ?? 0)),
+ 'mediaType' => $messageType === 'image' ? WEB_MEDIA_TYPE_IMAGE : ($messageType === 'video' ? WEB_MEDIA_TYPE_VIDEO : WEB_MEDIA_TYPE_FILE),
+ ];
+ }
+
+ $attachmentFile = $_FILES['attachment'] ?? $_FILES['file'] ?? null;
if (!is_array($attachmentFile)) {
respond(400, '缺少上传文件');
}
@@ -266,11 +286,15 @@ $sender = messageRequestValue($payload, 'sender');
$target = messageRequestValue($payload, 'target');
$text = messageRequestValue($payload, 'text');
$messageType = messageRequestValue($payload, 'messageType', 'text');
-$conversationType = $_POST['conversationType'] ?? $_POST['type'] ?? $payload['conversationType'] ?? $payload['type'] ?? 0;
-$isGroupConversation = in_array((string)$conversationType, ['1', 'group', 'channel'], true);
+$conversationType = $_POST['conversationType'] ?? $_POST['type'] ?? $payload['conversationType'] ?? $payload['type'] ?? 0;
+$isGroupConversation = in_array((string)$conversationType, ['1', 'group', 'channel'], true);
+$mentionedUserIds = $payload['mentionedUserIds'] ?? [];
+$mentionedUserIds = is_array($mentionedUserIds)
+ ? array_values(array_unique(array_filter(array_map(static fn($value): string => trim((string)$value), $mentionedUserIds))))
+ : [];
$attachment = null;
-if ($sender === '' || $target === '' || ($text === '' && !in_array($messageType, ['image', 'file'], true))) {
+if ($sender === '' || $target === '' || ($text === '' && !in_array($messageType, ['image', 'video', 'file'], true))) {
respond(400, '缺少发送者、接收者或消息内容');
}
@@ -285,11 +309,69 @@ try {
. ' where g.`deleted` = 0 and g.`group_id` = ? and m.`user_id` = ?'
. ' limit 1'
);
- $memberStatement->execute([$target, $sender]);
- $group = $memberStatement->fetch();
- if (!$group) {
- respond(403, '你不在该群组中');
- }
+ $memberStatement->execute([$target, $sender]);
+ $group = $memberStatement->fetch();
+ if (!$group) {
+ // 手机端创建的原生群不一定存在于 Web 自建群表中,需回退检查 IM 群成员表。
+ $imDb = imDb();
+ $nativeGroupStatement = $imDb->prepare(
+ 'select 1 from `t_group` where `_gid` = ? and `_deleted` = 0 limit 1'
+ );
+ $nativeGroupStatement->execute([$target]);
+ $nativeMemberStatement = $imDb->prepare(
+ 'select `_type` from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1'
+ );
+ $nativeMemberStatement->execute([$target, $sender]);
+ $nativeMemberType = $nativeMemberStatement->fetchColumn();
+ if (!$nativeGroupStatement->fetchColumn() || $nativeMemberType === false) {
+ respond(403, '你不在该群组中');
+ }
+
+ $attachment = attachmentFromRequest($messageType);
+ $pushContent = $text !== ''
+ ? $text
+ : ($attachment
+ ? ((string)$attachment['type'] === 'image' ? '[图片]' : ((string)$attachment['type'] === 'video' ? '[视频]' : '[文件] ' . (string)$attachment['name']))
+ : $text);
+ $payloadBody = [
+ 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : ((string)$attachment['type'] === 'video' ? 6 : 5)) : 1,
+ 'searchableContent' => $pushContent,
+ 'pushContent' => $pushContent,
+ 'content' => $text,
+ 'persistFlag' => 3,
+ ];
+ if ($mentionedUserIds) {
+ $payloadBody['mentionedType'] = 1;
+ $payloadBody['mentionedTarget'] = $mentionedUserIds;
+ }
+ if ($attachment) {
+ $payloadBody['mediaType'] = (int)$attachment['mediaType'];
+ $payloadBody['remoteMediaUrl'] = (string)$attachment['url'];
+ $payloadBody['extra'] = json_encode([
+ 'name' => (string)$attachment['name'],
+ 'mime' => (string)$attachment['mime'],
+ 'size' => (int)$attachment['size'],
+ ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
+ }
+ $nativeResult = requireImSuccess(imAdminPost('/admin/message/send', [
+ 'sender' => $sender,
+ 'conv' => ['type' => 1, 'target' => $target, 'line' => 0],
+ 'payload' => $payloadBody,
+ ]), '原生群消息发送失败');
+ $messageUid = isset($nativeResult['messageUid']) ? (string)$nativeResult['messageUid'] : '';
+ $timestamp = (int)($nativeResult['timestamp'] ?? webImNowMs());
+ if ($attachment && $messageUid !== '') {
+ storeMessageAttachment($appDb, $messageUid, 'group', $target, $sender, $attachment, $timestamp);
+ }
+ $role = (int)$nativeMemberType === 2 ? 'owner' : ((int)$nativeMemberType === 1 ? 'admin' : 'member');
+ respond(0, 'success', [
+ 'messageUid' => $messageUid,
+ 'timestamp' => $timestamp,
+ 'senderRole' => $role,
+ 'attachment' => $attachment,
+ 'nativeError' => '',
+ ]);
+ }
$category = (string)($group['category'] ?? 'group');
$role = (string)($group['role'] ?? 'member');
if ($category === 'channel' && !in_array($role, ['owner', 'admin'], true)) {
@@ -319,15 +401,19 @@ try {
$pushContent = $text !== ''
? $text
: ($attachment
- ? ((string)$attachment['type'] === 'image' ? '[图片]' : '[文件] ' . (string)$attachment['name'])
+ ? ((string)$attachment['type'] === 'image' ? '[图片]' : ((string)$attachment['type'] === 'video' ? '[视频]' : '[文件] ' . (string)$attachment['name']))
: $text);
- $payloadBody = [
- 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : 5) : 1,
+ $payloadBody = [
+ 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : ((string)$attachment['type'] === 'video' ? 6 : 5)) : 1,
'searchableContent' => $pushContent,
'pushContent' => $pushContent,
'content' => $text,
- 'persistFlag' => 3,
- ];
+ 'persistFlag' => 3,
+ ];
+ if ($mentionedUserIds) {
+ $payloadBody['mentionedType'] = 1;
+ $payloadBody['mentionedTarget'] = $mentionedUserIds;
+ }
if ($attachment) {
$payloadBody['mediaType'] = (int)$attachment['mediaType'];
$payloadBody['remoteMediaUrl'] = (string)$attachment['url'];
@@ -344,8 +430,7 @@ try {
'target' => $target,
'line' => 0,
],
- 'payload' => $payloadBody,
- 'userMessage' => true,
+ 'payload' => $payloadBody,
]), '原生群消息发送失败');
} catch (Throwable $error) {
$nativeError = $error->getMessage() ?: '原生群消息发送失败';
@@ -364,10 +449,10 @@ try {
$pushContent = $text !== ''
? $text
: ($attachment
- ? ((string)$attachment['type'] === 'image' ? '[图片]' : '[文件] ' . (string)$attachment['name'])
+ ? ((string)$attachment['type'] === 'image' ? '[图片]' : ((string)$attachment['type'] === 'video' ? '[视频]' : '[文件] ' . (string)$attachment['name']))
: $text);
$payloadBody = [
- 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : 5) : 1,
+ 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : ((string)$attachment['type'] === 'video' ? 6 : 5)) : 1,
'searchableContent' => $pushContent,
'pushContent' => $pushContent,
'content' => $text,
@@ -390,8 +475,7 @@ try {
'target' => $target,
'line' => 0,
],
- 'payload' => $payloadBody,
- 'userMessage' => true,
+ 'payload' => $payloadBody,
]), '发送失败');
$messageUid = isset($result['messageUid']) ? (string)$result['messageUid'] : '';
diff --git a/dist/css/app.3ff3e457.css b/dist/css/app.0488f79e.css
similarity index 93%
rename from dist/css/app.3ff3e457.css
rename to dist/css/app.0488f79e.css
index e1aa894..476edd1 100644
--- a/dist/css/app.3ff3e457.css
+++ b/dist/css/app.0488f79e.css
@@ -2455,6 +2455,53 @@ button {
background: #111;
}
+.mention-picker {
+ position: absolute;
+ left: 18px;
+ bottom: 112px;
+ z-index: 20;
+ width: min(320px, calc(100% - 36px));
+ max-height: 260px;
+ overflow-y: auto;
+ padding: 6px;
+ border: 1px solid #d7e0e8;
+ border-radius: 10px;
+ background: #fff;
+ box-shadow: 0 12px 32px rgb(15 23 42 / 18%);
+}
+
+.mention-picker button {
+ display: flex;
+ width: 100%;
+ align-items: center;
+ gap: 10px;
+ padding: 8px 10px;
+ border: 0;
+ border-radius: 7px;
+ background: transparent;
+ text-align: left;
+}
+
+.mention-picker button:hover {
+ background: #eef7f5;
+}
+
+.mention-picker img,
+.mention-picker button > span {
+ width: 32px;
+ height: 32px;
+ border-radius: 7px;
+ -o-object-fit: cover;
+ object-fit: cover;
+}
+
+.mention-picker button > span {
+ display: grid;
+ place-items: center;
+ background: #dceaf3;
+ color: #23445c;
+}
+
.red-packet-card {
width: min(320px, 68vw);
margin: -10px -12px -8px;
diff --git a/dist/index.html b/dist/index.html
index 0d6f6d1..d31a2c9 100644
--- a/dist/index.html
+++ b/dist/index.html
@@ -1 +1 @@
-
Web IM 请启用 JavaScript 后使用 Web IM。
\ No newline at end of file
+Web IM 请启用 JavaScript 后使用 Web IM。
\ No newline at end of file
diff --git a/dist/js/app.1158390e.js.map b/dist/js/app.1158390e.js.map
deleted file mode 100644
index 594e882..0000000
--- a/dist/js/app.1158390e.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"js/app.1158390e.js","mappings":"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A;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC,oHAAoH,iDAAiD;WACrK;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC7BA;WACA;WACA;WACA,eAAe,4BAA4B;WAC3C,eAAe;WACf,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,2CAA2C,0CAA0C;WACrF,MAAM;WACN,2CAA2C,gCAAgC;WAC3E;WACA,KAAK,yBAAyB;WAC9B;WACA,GAAG;WACH;WACA;WACA,0CAA0C,wCAAwC;WAClF;WACA;WACA;WACA,E;;;;;WCtBA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,8CAA8C,yD;;;;;WCA9C;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA,kDAAkD,iDAAiD,sCAAsC;WACzI,E;;;;;WCHA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA,8CAA8C;;WAE9C;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,iCAAiC,mCAAmC;WACpE;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA,4G;;;;;UElDA;UACA;UACA;UACA,+EAA+E,mCAAmC;UAClH","sources":["webpack://jc-web-im/./src/App.vue","webpack://jc-web-im/./src/components/ChatShell.vue","webpack://jc-web-im/./src/components/LoginView.vue","webpack://jc-web-im/./src/components/chat/ChatPanel.vue","webpack://jc-web-im/./src/components/chat/MessageComposer.vue","webpack://jc-web-im/./src/components/chat/MessageList.vue","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue","webpack://jc-web-im/./src/components/sidebar/ContactList.vue","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue","webpack://jc-web-im/./src/config.js","webpack://jc-web-im/./src/main.js","webpack://jc-web-im/./src/services/appServerClient.js","webpack://jc-web-im/./src/services/documentedHttpImClient.js","webpack://jc-web-im/./src/services/httpImClient.js","webpack://jc-web-im/./src/services/imClient.js","webpack://jc-web-im/./src/services/longConnectionImClient.js","webpack://jc-web-im/./src/services/mediaProxy.js","webpack://jc-web-im/./src/services/realtimeNotifications.js","webpack://jc-web-im/./src/stores/contacts.js","webpack://jc-web-im/./src/stores/conversations.js","webpack://jc-web-im/./src/stores/navigation.js","webpack://jc-web-im/./src/stores/session.js","webpack://jc-web-im/./src/App.vue?7ccd","webpack://jc-web-im/./src/components/ChatShell.vue?96ef","webpack://jc-web-im/./src/components/LoginView.vue?3311","webpack://jc-web-im/./src/components/chat/ChatPanel.vue?ffa3","webpack://jc-web-im/./src/components/chat/MessageComposer.vue?d45c","webpack://jc-web-im/./src/components/chat/MessageList.vue?73ad","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?11f7","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue?7e83","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?9ce0","webpack://jc-web-im/./src/components/sidebar/ContactList.vue?8b7f","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?8a4a","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?e8e6","webpack://jc-web-im/./src/App.vue?455b","webpack://jc-web-im/./src/components/ChatShell.vue?ef53","webpack://jc-web-im/./src/components/LoginView.vue?f595","webpack://jc-web-im/./src/components/chat/ChatPanel.vue?402c","webpack://jc-web-im/./src/components/chat/MessageComposer.vue?bb22","webpack://jc-web-im/./src/components/chat/MessageList.vue?c1a2","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?96e0","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue?bdf3","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?ee85","webpack://jc-web-im/./src/components/sidebar/ContactList.vue?dff0","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?0914","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?c3d8","webpack://jc-web-im/webpack/bootstrap","webpack://jc-web-im/webpack/runtime/chunk loaded","webpack://jc-web-im/webpack/runtime/compat get default export","webpack://jc-web-im/webpack/runtime/define property getters","webpack://jc-web-im/webpack/runtime/global","webpack://jc-web-im/webpack/runtime/hasOwnProperty shorthand","webpack://jc-web-im/webpack/runtime/make namespace object","webpack://jc-web-im/webpack/runtime/set anonymous default export name","webpack://jc-web-im/webpack/runtime/jsonp chunk loading","webpack://jc-web-im/webpack/before-startup","webpack://jc-web-im/webpack/startup","webpack://jc-web-im/webpack/after-startup"],"sourcesContent":["\n \n \n \n\n\n","\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n","\n \n \n \n
\n
\n
{{ platformName }} \n \n \n
\n\n \n\n \n\n \n 新用户注册\n \n \n 返回登录\n \n \n \n \n\n\n","\r\n \n \r\n\r\n \n 选择一个会话 \r\n 真实会话同步完成后,可以在左侧打开聊天 \r\n
\n \n 📌 \n 置顶消息 \n \n \n {{ pinnedMessageText }} \n \n × \n \n \r\n \r\n 已选 {{ conversations.selectedMessageIds.length }} 条 \r\n 复制 \r\n 删除 \r\n 转发 \r\n 取消 \r\n
\r\n \r\n \r\n \r\n \r\n \r\n {{ item.avatarText }} \r\n {{ item.title }} \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n \r\n 正在加载
\r\n \r\n \r\n \r\n
发送时间 \r\n {{ formatDetailTime(messageDetail?.sentAt) }} \r\n \r\n \r\n
编辑时间 \r\n {{ formatDetailTime(messageDetail.editedAt) }} \r\n \r\n \r\n
发送人 \r\n {{ detailMemberName(messageDetail?.sender) }} \r\n \r\n \r\n \r\n
接收人 \r\n {{ detailMemberName(messageDetail?.receiver) }} \r\n \r\n \r\n
送达时间 \r\n \r\n {{ messageDetail?.deliveredAt ? formatDetailTime(messageDetail.deliveredAt) : '未送达' }}\r\n \r\n \r\n \r\n
已读时间 \r\n \r\n {{ messageDetail?.readAt ? formatDetailTime(messageDetail.readAt) : '未读' }}\r\n \r\n \r\n \r\n \r\n {{ conversations.messageDetailError }} \r\n \r\n \r\n 已读 {{ messageDetailCounts.read || 0 }} \r\n 未读 {{ messageDetailCounts.unread || 0 }} \r\n 未送达 {{ messageDetailCounts.undelivered || 0 }} \r\n 成员 {{ messageDetailCounts.total || 0 }} \r\n
\r\n \r\n
\r\n \r\n 已读 \r\n {{ messageDetailCounts.read || 0 }} 人 \r\n \r\n \r\n
\r\n
\n
{{ detailMemberAvatar(member) }} \r\n
\r\n {{ detailMemberName(member) }} \r\n {{ member.uid }} \r\n \r\n
{{ formatDetailTime(member.time) }} \r\n
{{ detailRoleLabel(member.role) }} \r\n
\r\n
\r\n 暂无已读成员
\r\n \r\n\r\n
\r\n \r\n 未读 \r\n {{ messageDetailCounts.unread || 0 }} 人 \r\n \r\n \r\n
\r\n
\n
{{ detailMemberAvatar(member) }} \r\n
\r\n {{ detailMemberName(member) }} \r\n {{ member.uid }} \r\n \r\n
送达 {{ formatDetailTime(member.time) }} \r\n
{{ detailRoleLabel(member.role) }} \r\n
\r\n
\r\n 暂无未读成员
\r\n \r\n\r\n
\r\n \r\n 未送达 \r\n {{ messageDetailCounts.undelivered || 0 }} 人 \r\n \r\n \r\n
\r\n
\n
{{ detailMemberAvatar(member) }} \r\n
\r\n {{ detailMemberName(member) }} \r\n {{ member.uid }} \r\n \r\n
未送达 \r\n
{{ detailRoleLabel(member.role) }} \r\n
\r\n
\r\n 暂无未送达成员
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\n
{{ singleProfile.avatarText }}
\r\n
{{ singleProfile.displayName }} \r\n
\r\n \r\n \n
用户ID \n {{ singleProfile.userId || '-' }} \n \n \n
用户UID \n {{ singleProfile.uid }} \n \n \r\n
昵称 \r\n {{ singleProfile.rawName || '-' }} \r\n \r\n \r\n
手机号 \r\n {{ singleProfile.mobile || '未知' }} \r\n \r\n \r\n
地区 \r\n {{ singleProfile.address || '未知' }} \r\n \r\n \r\n \r\n 备注名称 \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n 正在加载
\r\n \r\n \r\n
群名 \r\n {{ groupDetail?.name || activeConversation?.title || '-' }} \r\n \r\n \r\n
群ID \n {{ groupDisplayId }} \n \r\n \r\n
群说明 \r\n {{ groupDetail?.announcement || '未设置' }} \r\n \r\n \r\n
群主昵称 \r\n {{ groupDetail?.ownerName || '-' }} \r\n \r\n \r\n \r\n \r\n 解散群组 \r\n 转让群组 \r\n \r\n 退出群组 \r\n \r\n \r\n\r\n
\r\n \r\n 正在加载
\r\n \r\n
\r\n
\n
{{ memberAvatar(member) }} \r\n
\r\n {{ member.displayName }} \r\n {{ member.role === 'owner' ? '群主' : member.rawDisplayName }} \r\n \r\n
\r\n
暂无群员
\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n 昵称 \r\n \r\n \r\n \r\n 取消 \r\n {{ groupBusy ? '保存中...' : '保存' }} \r\n \r\n \r\n\r\n
\r\n \r\n 正在加载
\r\n \r\n
\r\n \n {{ memberAvatar(member) }} \r\n \r\n {{ member.displayName }} \r\n {{ member.rawDisplayName }} \r\n \r\n \r\n
暂无可转让成员
\r\n
\r\n \r\n \r\n\r\n
\r\n \r\n \r\n 管理员设置 \r\n 修改群资料 \r\n 踢人 \r\n 禁言设置 \r\n \r\n\r\n 正在加载
\r\n\r\n \r\n \r\n
\r\n \r\n \n {{ memberAvatar(member) }} \r\n \r\n {{ member.displayName }} \r\n {{ member.rawDisplayName }} \r\n \r\n \r\n
暂无可设置成员
\r\n
\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n
\r\n \r\n \n {{ memberAvatar(member) }} \r\n \r\n {{ member.displayName }} \r\n {{ member.role === 'admin' ? '管理员' : member.rawDisplayName }} \r\n \r\n \r\n
暂无可移除成员
\r\n
\r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n {{ conversations.actionError || conversations.actionNotice }}\r\n
\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n \r\n 引用 \r\n {{ quoteMessage.quoteText || quoteMessage.text }}\r\n \r\n × \r\n
\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n","\r\n \r\n
\r\n {{ systemMessageText(message) }}
\n \n \r\n \r\n \r\n \n {{ groupSenderAvatarText(message) }} \r\n \r\n \n
\r\n {{ groupSenderName(message) }}\r\n {{ senderRoleLabel(message) }} \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\n ⟳ \r\n ⇩ \r\n × \r\n
\r\n
\n
1\"\n type=\"button\"\n class=\"image-viewer-nav image-viewer-prev\"\n title=\"上一张\"\n aria-label=\"上一张\"\n @pointerdown.stop\n @click.stop=\"showPreviousImage\"\n >‹ \n
\n
1\"\n type=\"button\"\n class=\"image-viewer-nav image-viewer-next\"\n title=\"下一张\"\n aria-label=\"下一张\"\n @pointerdown.stop\n @click.stop=\"showNextImage\"\n >› \n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\n
{{ senderProfile.avatarText }}
\r\n
{{ senderProfile.displayName || senderProfile.uid }} \r\n
{{ senderProfile.roleLabel }} \r\n
\r\n \r\n \n
用户ID \n {{ senderProfile.userId || senderProfile.uid || '-' }} \n \n \n
用户UID \n {{ senderProfile.uid }} \n \n \r\n
昵称 \r\n {{ senderProfile.rawName || senderProfile.displayName || '-' }} \r\n \r\n \r\n
手机号 \r\n {{ senderProfile.mobile || '未知' }} \r\n \r\n \r\n
地区 \r\n {{ senderProfile.address || '未知' }} \r\n \r\n \r\n \r\n 备注名称 \r\n \r\n \r\n \r\n {{ senderProfile.notice }} \r\n {{ senderProfile.error }} \r\n \r\n {{ senderProfile.adding ? '添加中...' : '添加为好友' }}\r\n \r\n \r\n {{ senderProfile.saving ? '保存中...' : '保存备注' }}\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n\r\n\r\n","\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n \r\n \r\n
\r\n
★ \r\n
\r\n
{{ formatFavoriteTime(favorite.timestamp) }} \r\n
\r\n
\r\n {{ notice }} \r\n {{ error }} \r\n 复制 \r\n 打开原会话 \r\n 取消收藏 \r\n
\r\n
\r\n \r\n \r\n 暂无收藏消息 \r\n 右键消息气泡选择“收藏”后,会显示在这里 \r\n
\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n\r\n \r\n \r\n
\r\n\r\n \r\n\r\n \r\n
\r\n \r\n \r\n 用户ID / 手机号 / 用户名 \r\n \r\n \r\n {{ contacts.actionError }}
\r\n {{ contacts.actionInfo }}
\r\n \r\n 取消 \r\n \r\n {{ contacts.loading ? '添加中...' : '添加' }}\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n \n {{ initials }} \r\n \r\n 💬 \r\n 👥 \r\n ☆ \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
图片加载中
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n\r\n\r\n","const currentHost = window.location.hostname || '127.0.0.1';\nconst runtimeConfig = window.JC_WEB_IM_CONFIG || {};\nconst appServerOrigin = `${window.location.protocol}//${currentHost}:8888`;\nconst qrAppServerOrigin = `${window.location.protocol}//${currentHost}:18888`;\nconst adminServerOrigin = `${window.location.protocol}//${currentHost}:8024`;\n\r\nexport const appConfig = {\r\n appName: 'Web IM',\r\n adminServer: runtimeConfig.adminServer || process.env.VUE_APP_ADMIN_SERVER || adminServerOrigin,\n appServer: runtimeConfig.appServer || process.env.VUE_APP_APP_SERVER || appServerOrigin,\n qrAppServer: runtimeConfig.qrAppServer || process.env.VUE_APP_QR_APP_SERVER || qrAppServerOrigin,\n platformConfigApi: runtimeConfig.platformConfigApi || process.env.VUE_APP_PLATFORM_CONFIG_API || (process.env.NODE_ENV === 'development' ? '/local-api/platform_config.php' : '/api/platform_config.php'),\n registerConfigApi: runtimeConfig.registerConfigApi || process.env.VUE_APP_REGISTER_CONFIG_API || `${adminServerOrigin}/api/register-config`,\r\n registerPhoneExistsApi: runtimeConfig.registerPhoneExistsApi || process.env.VUE_APP_REGISTER_PHONE_EXISTS_API || `${adminServerOrigin}/api/register-phone-exists`,\r\n contactsApi: runtimeConfig.contactsApi || process.env.VUE_APP_CONTACTS_API || (process.env.NODE_ENV === 'development' ? '/local-api/contacts.php' : '/api/contacts.php'),\r\n updateAliasApi: runtimeConfig.updateAliasApi || process.env.VUE_APP_UPDATE_ALIAS_API || (process.env.NODE_ENV === 'development' ? '/local-api/update_alias.php' : '/api/update_alias.php'),\r\n addContactApi: runtimeConfig.addContactApi || process.env.VUE_APP_ADD_CONTACT_API || (process.env.NODE_ENV === 'development' ? '/local-api/add_contact.php' : '/api/add_contact.php'),\r\n conversationActionsApi: runtimeConfig.conversationActionsApi || process.env.VUE_APP_CONVERSATION_ACTIONS_API || (process.env.NODE_ENV === 'development' ? '/local-api/conversation_actions.php' : '/api/conversation_actions.php'),\r\n sendMessageApi: runtimeConfig.sendMessageApi || process.env.VUE_APP_SEND_MESSAGE_API || (process.env.NODE_ENV === 'development' ? '/local-api/send_message.php' : '/api/send_message.php'),\r\n messageActionApi: runtimeConfig.messageActionApi || process.env.VUE_APP_MESSAGE_ACTION_API || (process.env.NODE_ENV === 'development' ? '/local-api/message_action.php' : '/api/message_action.php'),\r\n messageDetailApi: runtimeConfig.messageDetailApi || process.env.VUE_APP_MESSAGE_DETAIL_API || (process.env.NODE_ENV === 'development' ? '/local-api/message_detail.php' : '/api/message_detail.php'),\r\n messagesApi: runtimeConfig.messagesApi || process.env.VUE_APP_MESSAGES_API || (process.env.NODE_ENV === 'development' ? '/local-api/messages.php' : '/api/messages.php'),\r\n profileApi: runtimeConfig.profileApi || process.env.VUE_APP_PROFILE_API || (process.env.NODE_ENV === 'development' ? '/local-api/profile.php' : '/api/profile.php'),\r\n changePasswordApi: runtimeConfig.changePasswordApi || process.env.VUE_APP_CHANGE_PASSWORD_API || `${appServerOrigin}/auth/changePassword`,\n logoutApi: runtimeConfig.logoutApi || process.env.VUE_APP_LOGOUT_API || `${appServerOrigin}/auth/logout`,\n imServerHost: runtimeConfig.imServerHost || process.env.VUE_APP_IM_SERVER_HOST || currentHost,\n imRoutePort: Number(runtimeConfig.imRoutePort || process.env.VUE_APP_IM_ROUTE_PORT || 18000),\r\n useWss: runtimeConfig.useWss ?? process.env.VUE_APP_USE_WSS === 'true',\n wsPath: runtimeConfig.wsPath || process.env.VUE_APP_WS_PATH || '/ws',\n wsUrl: runtimeConfig.wsUrl || process.env.VUE_APP_WS_URL || '',\n sdkMode: runtimeConfig.sdkMode || process.env.VUE_APP_IM_MODE || 'http',\n syncIntervalMs: Number(runtimeConfig.syncIntervalMs || process.env.VUE_APP_SYNC_INTERVAL_MS || 300),\n sseEnabled: runtimeConfig.sseEnabled ?? process.env.VUE_APP_SSE_ENABLED === 'true',\n sseTicketApi: runtimeConfig.sseTicketApi || process.env.VUE_APP_SSE_TICKET_API || '/api/sse_ticket.php',\n sseUrl: runtimeConfig.sseUrl || process.env.VUE_APP_SSE_URL || '/ws-events',\n platform: 5,\n clientIdStorageKey: 'qmt-web-im-client-id',\n authTokenStoragePrefix: 'qmt-web-im-auth-token-'\n};\n","import { createApp } from 'vue';\r\nimport { createPinia } from 'pinia';\r\nimport App from './App.vue';\r\nimport './styles/base.css';\r\n\r\ncreateApp(App).use(createPinia()).mount('#app');\r\n","import axios from 'axios';\nimport { appConfig } from '@/config';\n\nconst AES_KEY = 'xczx2026!@#secKe';\nconst ENCRYPTION_EXCLUDE_PATHS = ['/avatar/', '/f/', '/amr2mp3', '/appVersion/check'];\nconst AUTH_STORAGE_KEY = 'qmt-web-im-app-auth-v1';\nconst AUTH_ERROR_CODE = 13;\nconst REFRESH_ERROR_CODE = 20045;\n\nlet importedCryptoKeyPromise = null;\nlet refreshPromise = null;\n\nfunction storageScope() {\n return appConfig.appServer || '';\n}\n\nfunction readAuthStore() {\n try {\n return JSON.parse(localStorage.getItem(AUTH_STORAGE_KEY) || '{}');\n } catch (error) {\n return {};\n }\n}\n\nfunction writeAuthStore(store) {\n localStorage.setItem(AUTH_STORAGE_KEY, JSON.stringify(store));\n}\n\nfunction normalizeAuthBundle(bundle = {}) {\n const accessToken = String(bundle.accessToken || '').trim();\n const refreshToken = String(bundle.refreshToken || '').trim();\n if (!accessToken || !refreshToken) {\n return null;\n }\n return {\n accessToken,\n refreshToken,\n tokenType: String(bundle.tokenType || 'Bearer').trim() || 'Bearer',\n accessTokenExpireIn: Number(bundle.accessTokenExpireIn || 0) || 0,\n accessTokenExpireAt: Number(bundle.accessTokenExpireAt || 0) || 0,\n refreshTokenExpireIn: Number(bundle.refreshTokenExpireIn || 0) || 0,\n refreshTokenExpireAt: Number(bundle.refreshTokenExpireAt || 0) || 0\n };\n}\n\nexport function getStoredAppAuth() {\n const store = readAuthStore();\n return normalizeAuthBundle(store[storageScope()]);\n}\n\nexport function persistAppAuth(bundle) {\n const normalized = normalizeAuthBundle(bundle);\n const store = readAuthStore();\n if (!normalized) {\n delete store[storageScope()];\n writeAuthStore(store);\n return null;\n }\n store[storageScope()] = normalized;\n writeAuthStore(store);\n return normalized;\n}\n\nexport function clearStoredAppAuth() {\n persistAppAuth(null);\n}\n\nfunction hasFormData(value) {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\nfunction absoluteUrl(url) {\n return new URL(url, window.location.origin);\n}\n\nfunction shouldEncrypt(url) {\n const pathname = absoluteUrl(url).pathname;\n return !ENCRYPTION_EXCLUDE_PATHS.some(path => pathname === path || pathname.startsWith(path));\n}\n\nfunction shouldAttachAuth(config) {\n return !config.skipAuth;\n}\n\nfunction textEncoder() {\n return new TextEncoder();\n}\n\nfunction textDecoder() {\n return new TextDecoder();\n}\n\nfunction bytesToBase64(bytes) {\n let binary = '';\n bytes.forEach(byte => {\n binary += String.fromCharCode(byte);\n });\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nasync function getCryptoKey() {\n if (!importedCryptoKeyPromise) {\n importedCryptoKeyPromise = window.crypto.subtle.importKey(\n 'raw',\n textEncoder().encode(AES_KEY),\n { name: 'AES-CBC' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n return importedCryptoKeyPromise;\n}\n\nasync function encryptPayload(plainText) {\n const iv = window.crypto.getRandomValues(new Uint8Array(16));\n const key = await getCryptoKey();\n const encrypted = await window.crypto.subtle.encrypt(\n { name: 'AES-CBC', iv },\n key,\n textEncoder().encode(plainText)\n );\n return `${bytesToBase64(iv)}:${bytesToBase64(new Uint8Array(encrypted))}`;\n}\n\nasync function decryptPayload(cipherText) {\n const [ivBase64, encryptedBase64] = String(cipherText || '').split(':', 2);\n if (!ivBase64 || !encryptedBase64) {\n throw new Error('Encrypted payload format is invalid');\n }\n const key = await getCryptoKey();\n const decrypted = await window.crypto.subtle.decrypt(\n { name: 'AES-CBC', iv: base64ToBytes(ivBase64) },\n key,\n base64ToBytes(encryptedBase64)\n );\n return textDecoder().decode(decrypted);\n}\n\nfunction normalizeBusinessResponse(payload) {\n if (payload && typeof payload === 'object' && !Array.isArray(payload)) {\n return payload;\n }\n return {\n code: 0,\n message: 'success',\n data: payload\n };\n}\n\nasync function decodeResponsePayload(response) {\n const encrypted = String(response.headers?.['x-encrypted'] || '').toLowerCase() === 'true';\n if (encrypted && typeof response.data === 'string') {\n const plainText = await decryptPayload(response.data);\n response.data = normalizeBusinessResponse(JSON.parse(plainText));\n return response;\n }\n response.data = normalizeBusinessResponse(response.data);\n return response;\n}\n\nconst client = axios.create({\n withCredentials: false\n});\n\nclient.interceptors.request.use(async config => {\n const nextConfig = { ...config };\n const url = absoluteUrl(nextConfig.url || '').toString();\n\n if (shouldAttachAuth(nextConfig)) {\n const auth = getStoredAppAuth();\n if (auth?.accessToken) {\n nextConfig.headers = {\n ...(nextConfig.headers || {}),\n Authorization: `${auth.tokenType || 'Bearer'} ${auth.accessToken}`\n };\n }\n }\n\n if (!hasFormData(nextConfig.data) && nextConfig.method?.toLowerCase() !== 'get' && shouldEncrypt(url)) {\n const plainBody = JSON.stringify(nextConfig.data ?? {});\n nextConfig.data = await encryptPayload(plainBody);\n nextConfig.headers = {\n ...(nextConfig.headers || {}),\n 'Content-Type': 'text/plain;charset=UTF-8',\n 'X-Timestamp': `${Math.floor(Date.now() / 1000)}`\n };\n }\n\n return nextConfig;\n});\n\nclient.interceptors.response.use(async response => decodeResponsePayload(response));\n\nasync function refreshAccessToken() {\n if (refreshPromise) {\n return refreshPromise;\n }\n const auth = getStoredAppAuth();\n if (!auth?.refreshToken) {\n clearStoredAppAuth();\n throw new Error('登录状态已失效,请重新登录');\n }\n\n refreshPromise = client.post(`${appConfig.appServer}/auth/refreshToken`, {\n refreshToken: auth.refreshToken\n }, {\n skipAuth: true\n }).then(response => {\n const payload = response.data || {};\n if (Number(payload.code) !== 0 || !payload.data) {\n if (Number(payload.code) === REFRESH_ERROR_CODE) {\n clearStoredAppAuth();\n }\n throw new Error(payload.message || '刷新登录状态失败');\n }\n persistAppAuth(payload.data);\n return payload.data;\n }).finally(() => {\n refreshPromise = null;\n });\n\n return refreshPromise;\n}\n\nasync function request(config) {\n const response = await client.request(config);\n const payload = response.data || {};\n if (Number(payload.code) === AUTH_ERROR_CODE && shouldAttachAuth(config) && !config._retriedAfterRefresh) {\n await refreshAccessToken();\n return request({\n ...config,\n _retriedAfterRefresh: true\n });\n }\n return response;\n}\n\nexport async function appServerRequest(config) {\n return request(config);\n}\n\nexport async function appServerGet(url, config = {}) {\n return request({\n ...config,\n method: 'get',\n url\n });\n}\n\nexport async function appServerPost(url, data = {}, config = {}) {\n return request({\n ...config,\n method: 'post',\n url,\n data\n });\n}\n","import { appConfig } from '@/config';\nimport { HttpImClient } from './httpImClient';\nimport axios from 'axios';\nimport {\n appServerGet,\n appServerPost,\n clearStoredAppAuth,\n getStoredAppAuth,\n persistAppAuth\n} from './appServerClient';\n\nfunction inferAccountType(account) {\n return String(account || '').includes('@') ? 2 : 1;\n}\n\nfunction unwrapData(response) {\n return response.data?.data ?? response.data?.result ?? null;\n}\n\nfunction unwrapMessage(response, fallback) {\n return response.data?.message || response.data?.msg || fallback;\n}\n\nexport class DocumentedHttpImClient extends HttpImClient {\n unsupported(feature) {\n throw new Error(`当前对接文档未提供“${feature}”接口,已禁用旧本地代理链路`);\n }\n\n async loginWithPassword(account, password, type = inferAccountType(account)) {\n const response = await appServerPost(`${appConfig.appServer}/auth/login_pwd`, {\n type,\n number: account,\n password,\n platform: appConfig.platform,\n clientId: this.getClientId()\n }, {\n skipAuth: true\n });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '登录失败'));\n }\n\n persistAppAuth(unwrapData(response));\n return unwrapData(response);\n }\n\n async requestAuthCode(email) {\n const response = await appServerPost(`${appConfig.appServer}/auth/sendEmailCode`, {\n email\n }, {\n skipAuth: true\n });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '验证码发送失败'));\n }\n\n return unwrapData(response);\n }\n\n async loginWithCode(account, code) {\n void account;\n void code;\n throw new Error('接口文档未提供验证码登录接口,请使用密码登录');\n }\n\n async register({ type, number, code = '', password, invitationCode = '' }) {\n const response = await appServerPost(`${appConfig.appServer}/auth/register`, {\n type,\n number,\n code,\n password,\n clientId: this.getClientId(),\n platform: appConfig.platform,\n invitationCode\n }, {\n skipAuth: true\n });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '注册失败'));\n }\n\n persistAppAuth(unwrapData(response));\n return unwrapData(response);\n }\n\n async createPcSession(userId = '') {\n const response = await axios.post(`${appConfig.qrAppServer}/pc_session`, {\n flag: 1,\n device_name: 'Web IM',\n userId,\n clientId: this.getClientId(),\n platform: appConfig.platform\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '二维码登录会话创建失败'));\n }\n\n return unwrapData(response) || {};\n }\n\n async loginWithPcSession(token) {\n const url = `${appConfig.qrAppServer}/session_login/${encodeURIComponent(token)}`;\n let response;\n try {\n response = await axios.post(url, null, { withCredentials: false });\n } catch (postError) {\n response = await axios.get(url, { withCredentials: false });\n }\n\n this.persistAppToken(url, response);\n\n const payload = response.data || {};\n const result = payload.result ?? payload.data ?? null;\n\n if (Number(payload.code) === 0 && result) {\n persistAppAuth(result);\n }\n\n if ([0, 8, 9, 10, 13, 18, 20042].includes(Number(payload.code))) {\n return {\n ...payload,\n data: result\n };\n }\n\n throw new Error(payload.message || '扫码登录失败');\n }\n\n async changePassword({ oldPassword, newPassword }) {\n const response = await appServerPost(appConfig.changePasswordApi, {\n oldPassword,\n newPassword\n });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '密码修改失败'));\n }\n\n return true;\n }\n\n async resetPasswordWithCode({ mobile, resetCode, newPassword }) {\n void mobile;\n void resetCode;\n void newPassword;\n throw new Error('接口文档未提供重置密码接口,请联系服务端确认流程');\n }\n\n async logout() {\n const auth = getStoredAppAuth();\n if (!auth?.refreshToken) {\n clearStoredAppAuth();\n return true;\n }\n\n try {\n const response = await appServerPost(appConfig.logoutApi, {\n refreshToken: auth.refreshToken\n });\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '退出登录失败'));\n }\n } finally {\n clearStoredAppAuth();\n }\n\n return true;\n }\n\n async fetchRemoteConversations() {\n return [];\n }\n\n async fetchRemoteMessages() {\n return [];\n }\n\n async getServerContactList() {\n return [];\n }\n\n async getProfile() {\n return null;\n }\n\n async sendTextMessage() {\n this.unsupported('发送消息');\n }\n\n async sendAttachmentMessage() {\n this.unsupported('发送附件消息');\n }\n\n async addContact() {\n this.unsupported('添加联系人');\n }\n\n async updateContactAlias() {\n this.unsupported('联系人备注');\n }\n\n async createGroup() {\n this.unsupported('创建群组');\n }\n\n async joinGroup() {\n this.unsupported('加入群组');\n }\n\n async broadcastMessage() {\n this.unsupported('群发消息');\n }\n\n async getGroupDetail() {\n this.unsupported('群详情');\n }\n\n async getGroupMembers() {\n this.unsupported('群成员');\n }\n\n async updateGroupAlias() {\n this.unsupported('群备注');\n }\n\n async leaveGroup() {\n this.unsupported('退出群组');\n }\n\n async dismissGroup() {\n this.unsupported('解散群组');\n }\n\n async transferGroup() {\n this.unsupported('转让群组');\n }\n\n async setGroupAdmins() {\n this.unsupported('设置群管理员');\n }\n\n async updateGroupProfile() {\n this.unsupported('更新群资料');\n }\n\n async kickGroupMembers() {\n this.unsupported('移除群成员');\n }\n\n async updateGroupMuteSetting() {\n this.unsupported('群禁言设置');\n }\n\n async updateProfile() {\n this.unsupported('更新个人资料');\n }\n\n async recallMessage() {\n this.unsupported('撤回消息');\n }\n\n async editMessage() {\n this.unsupported('编辑消息');\n }\n\n async getMessageDetail() {\n this.unsupported('消息详情');\n }\n}\n","import axios from 'axios';\nimport { appConfig } from '@/config';\nimport {\n appServerGet,\n appServerPost,\n clearStoredAppAuth,\n getStoredAppAuth,\n persistAppAuth\n} from '@/services/appServerClient';\n\r\nconst LOCAL_MESSAGE_STORAGE_KEY = 'qmt-web-im-local-messages-v2';\r\nconst LOCAL_HIDDEN_MESSAGE_STORAGE_KEY = 'qmt-web-im-hidden-messages-v1';\r\nconst LOCAL_RECALLED_MESSAGE_STORAGE_KEY = 'qmt-web-im-recalled-messages-v1';\r\n\r\nfunction scopedStorageKey(baseKey, userId = '') {\r\n const scope = `${appConfig.appServer || ''}:${userId || 'anonymous'}`;\r\n return `${baseKey}:${encodeURIComponent(scope)}`;\r\n}\r\n\r\nfunction randomId() {\r\n if (window.crypto && window.crypto.randomUUID) {\r\n return window.crypto.randomUUID().replaceAll('-', '');\r\n }\r\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\r\n}\r\n\r\nfunction readLocalMessages(userId) {\r\n try {\r\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId)) || '{}');\r\n } catch (error) {\r\n return {};\r\n }\r\n}\r\n\r\nfunction readMessageSet(storageKey, userId) {\r\n try {\r\n return JSON.parse(localStorage.getItem(scopedStorageKey(storageKey, userId)) || '{}');\r\n } catch (error) {\r\n return {};\r\n }\r\n}\r\n\r\nfunction writeMessageSet(storageKey, messagesByConversation, userId) {\r\n localStorage.setItem(scopedStorageKey(storageKey, userId), JSON.stringify(messagesByConversation));\r\n}\r\n\r\nfunction messageKeys(message) {\r\n return [message?.id, message?.messageUid]\r\n .filter(Boolean)\r\n .map(value => String(value));\r\n}\r\n\r\nfunction hasStoredMessage(storageKey, conversationId, message, userId) {\r\n const stored = readMessageSet(storageKey, userId);\r\n const ids = new Set(stored[conversationId] || []);\r\n return messageKeys(message).some(id => ids.has(id));\r\n}\r\n\r\nfunction storeMessageKeys(storageKey, conversationId, messages, userId) {\r\n const stored = readMessageSet(storageKey, userId);\r\n const ids = new Set(stored[conversationId] || []);\r\n messages.forEach(message => {\r\n messageKeys(message).forEach(id => ids.add(id));\r\n });\r\n stored[conversationId] = Array.from(ids);\r\n writeMessageSet(storageKey, stored, userId);\r\n}\r\n\r\nfunction withRecalledState(message) {\r\n return {\r\n ...message,\r\n status: 'recalled',\r\n deliveryStatus: '',\r\n recalled: true,\r\n recallStatus: '已撤回'\r\n };\r\n}\r\n\r\nfunction applyLocalMessageState(conversationId, messages, userId) {\r\n return messages\r\n .filter(message => !hasStoredMessage(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversationId, message, userId))\r\n .map(message => {\r\n const isRecalled = Boolean(message.recalled)\r\n || message.status === 'recalled'\r\n || hasStoredMessage(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversationId, message, userId);\r\n if (!isRecalled) {\r\n return message;\r\n }\r\n return withRecalledState(message);\r\n });\r\n}\r\n\r\nfunction writeLocalMessages(messagesByConversation, userId) {\r\n localStorage.setItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId), JSON.stringify(messagesByConversation));\r\n}\r\n\r\nfunction saveLocalMessage(message, userId) {\r\n const messagesByConversation = readLocalMessages(userId);\r\n messagesByConversation[message.conversationId] = messagesByConversation[message.conversationId] || [];\r\n const index = messagesByConversation[message.conversationId].findIndex(item => item.id === message.id);\r\n if (index >= 0) {\r\n messagesByConversation[message.conversationId].splice(index, 1, message);\r\n } else {\r\n messagesByConversation[message.conversationId].push(message);\r\n }\r\n writeLocalMessages(messagesByConversation, userId);\r\n}\r\n\r\nfunction mergeSyncedMessages(localMessages, remoteMessages, conversationId, userId) {\r\n const visibleLocalMessages = applyLocalMessageState(conversationId, localMessages, userId);\r\n const localByKey = new Map();\r\n visibleLocalMessages.forEach(message => {\r\n messageKeys(message).forEach(key => {\r\n if (!localByKey.has(key)) {\r\n localByKey.set(key, message);\r\n }\r\n });\r\n });\r\n\r\n const visibleRemoteMessages = applyLocalMessageState(conversationId, remoteMessages, userId).map(remoteMessage => {\r\n if (!remoteMessage.recalled || String(remoteMessage.text || '').trim()) {\r\n return remoteMessage;\r\n }\r\n const localMessage = messageKeys(remoteMessage)\r\n .map(key => localByKey.get(key))\r\n .find(message => message?.text && message.text !== '你撤回了一条消息');\r\n return localMessage ? { ...remoteMessage, text: localMessage.text } : remoteMessage;\r\n });\r\n const remoteKeys = new Set();\r\n visibleRemoteMessages.forEach(message => {\r\n messageKeys(message).forEach(key => remoteKeys.add(key));\r\n });\r\n const now = Date.now();\r\n\r\n function hasRemoteMatch(localMessage) {\r\n if (localMessage.messageUid && remoteKeys.has(localMessage.messageUid)) {\r\n return true;\r\n }\r\n return visibleRemoteMessages.some(remoteMessage => {\r\n return remoteMessage.direction === localMessage.direction\r\n && remoteMessage.text === localMessage.text\r\n && Math.abs(Number(remoteMessage.timestamp || 0) - Number(localMessage.timestamp || 0)) < 15000;\r\n });\r\n }\r\n\r\n const pendingLocalMessages = visibleLocalMessages.filter(message => {\r\n if (message.status === 'recalled' || message.recalled) {\r\n return message.direction === 'out' && !hasRemoteMatch(message);\r\n }\r\n if (message.direction !== 'out') {\r\n return false;\r\n }\r\n if (message.status === 'sent' && message.messageUid) {\r\n return !hasRemoteMatch(message);\r\n }\r\n if (message.status === 'sent') {\r\n return !hasRemoteMatch(message) && now - Number(message.timestamp || 0) < 30000;\r\n }\r\n return message.status === 'sending' || message.status === 'failed';\r\n });\r\n\r\n return [...visibleRemoteMessages, ...pendingLocalMessages].sort((a, b) => {\r\n return Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0);\r\n });\r\n}\r\n\r\nfunction getTitle(value, fallback) {\r\n return value || fallback || '';\r\n}\r\n\r\nfunction getUniqueEquipment(mobile, fallback) {\r\n const allowedDevices = {\r\n '18301902119': '67072d37062c4f31b1165073552933ba',\r\n '18301902116': '1777479418113eeea8e236edce',\r\n '18301902118': 'de89fb2f2a61480a8c381f6c16e28bd8',\r\n '18301902117': 'd117f480faa64145b6162107b1b49617'\r\n };\r\n return allowedDevices[mobile] || localStorage.getItem('uniqueEquipment') || fallback;\r\n}\r\n\r\nfunction canUseLocalLoginFallback(response) {\r\n const message = response.data?.message || '';\r\n return process.env.NODE_ENV === 'development' && message.includes('允许此设备登录');\r\n}\r\n\r\nexport class HttpImClient {\r\n constructor() {\r\n this.listeners = new Map();\r\n this.connected = false;\r\n this.currentUser = null;\r\n }\r\n\r\n getClientId() {\r\n let clientId = localStorage.getItem(appConfig.clientIdStorageKey);\r\n if (!clientId) {\r\n clientId = randomId();\r\n localStorage.setItem(appConfig.clientIdStorageKey, clientId);\r\n }\r\n return clientId;\r\n }\r\n\r\n restoreClientId(clientId) {\r\n if (clientId) {\r\n localStorage.setItem(appConfig.clientIdStorageKey, clientId);\r\n }\r\n }\r\n\r\n getSdkVersion() {\r\n return 'HTTP';\r\n }\r\n\r\n async ensureSdk() {\r\n return true;\r\n }\r\n\r\n async loginWithPassword(mobile, password) {\n const url = `${appConfig.appServer}/login_pwd`;\n const response = await axios.post(url, {\n mobile,\n password,\n platform: appConfig.platform,\n clientId: this.getClientId()\n }, { withCredentials: false });\n\r\n this.persistAppToken(url, response);\r\n if (response.data?.code !== 0) {\r\n if (canUseLocalLoginFallback(response)) {\r\n return {\r\n userId: mobile,\r\n token: `local-device-pending-${Date.now()}`,\r\n displayName: mobile,\r\n localOnly: true\r\n };\r\n }\r\n throw new Error(response.data?.message || '登录失败');\r\n }\r\n return response.data.result;\r\n }\r\n\r\n async requestAuthCode(mobile) {\r\n const response = await axios.post(`${appConfig.appServer}/send_code`, { mobile }, { withCredentials: false });\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '验证码发送失败');\r\n }\r\n return response.data.result;\r\n }\r\n\r\n async loginWithCode(mobile, code) {\n const url = `${appConfig.appServer}/login`;\n const response = await axios.post(url, {\n mobile,\n code,\n platform: appConfig.platform,\n clientId: this.getClientId()\n }, { withCredentials: false });\n\r\n this.persistAppToken(url, response);\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '登录失败');\r\n }\r\n return response.data.result;\r\n }\r\n\r\n async createPcSession(userId = '') {\r\n const response = await axios.post(`${appConfig.appServer}/pc_session`, {\r\n flag: 1,\r\n device_name: 'Web IM',\r\n userId,\r\n clientId: this.getClientId(),\r\n platform: appConfig.platform\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '二维码登录会话创建失败');\r\n }\r\n return response.data.result || {};\r\n }\r\n\r\n async loginWithPcSession(token) {\r\n const url = `${appConfig.appServer}/session_login/${encodeURIComponent(token)}`;\r\n const response = await axios.post(url, null, { withCredentials: false });\r\n this.persistAppToken(url, response);\r\n const data = response.data || {};\r\n if ([0, 8, 9, 10, 18].includes(Number(data.code))) {\r\n return data;\r\n }\r\n throw new Error(data.message || '扫码登录失败');\r\n }\r\n\r\n async registerWithPhone(mobile, code) {\r\n const url = `${appConfig.appServer}/register`;\r\n const deviceId = getUniqueEquipment(mobile, this.getClientId());\r\n\r\n try {\r\n const response = await axios.post(url, {\r\n mobile,\r\n code,\r\n platform: appConfig.platform,\r\n clientId: deviceId,\r\n uniqueEquipment: deviceId\r\n }, { withCredentials: false });\r\n\r\n this.persistAppToken(url, response);\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '注册失败');\r\n }\r\n return response.data.result;\r\n } catch (error) {\r\n const status = error.response?.status;\r\n if (status === 404 || status === 405) {\r\n return this.loginWithCode(mobile, code);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n connect(userId, token) {\r\n this.currentUser = { userId, token };\r\n this.connected = true;\r\n this.emit('connectionStatusChanged', { connected: true, statusText: '已连接' });\r\n this.refreshConversationList();\r\n }\r\n\r\n disconnect() {\r\n this.connected = false;\r\n this.currentUser = null;\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '未连接' });\r\n }\r\n\r\n getConversationList() {\r\n return [];\r\n }\r\n\r\n refreshConversationList() {\r\n const conversations = this.getConversationList();\r\n if (conversations.length) {\r\n this.emit('conversationsChanged', conversations);\r\n }\r\n if (this.currentUser?.userId) {\r\n this.fetchRemoteConversations().then(remoteConversations => {\r\n this.emit('conversationsChanged', remoteConversations);\r\n }).catch(() => {});\r\n }\r\n return conversations;\r\n }\r\n\r\n async fetchRemoteConversations(limit = 50) {\r\n if (!this.currentUser?.userId) {\r\n return [];\r\n }\r\n const response = await axios.post(appConfig.messagesApi, {\r\n userId: this.currentUser.userId,\r\n limit\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '会话同步失败');\r\n }\r\n\r\n return (response.data?.result?.conversations || []).map(conversation => ({\r\n ...conversation,\r\n updatedAt: Number(conversation.updatedAt || Date.now()),\r\n avatarText: conversation.avatarText || String(conversation.title || conversation.target || '?').slice(0, 1).toUpperCase(),\r\n raw: conversation.raw || { type: 'single', target: conversation.target, line: 0 }\r\n }));\r\n }\r\n\r\n getMessages(conversation) {\r\n if (!conversation?.id) {\r\n return [];\r\n }\r\n const userId = this.currentUser?.userId || '';\r\n return applyLocalMessageState(conversation.id, readLocalMessages(userId)[conversation.id] || [], userId);\r\n }\r\n\r\n async fetchRemoteMessages(conversation, limit = 50, options = {}) {\r\n if (!conversation?.id || !this.currentUser?.userId) {\r\n return [];\r\n }\r\n const response = await axios.post(appConfig.messagesApi, {\r\n userId: this.currentUser.userId,\r\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\r\n limit,\n conversationType: conversation.type || conversation.raw?.type || 0,\n markRead: Boolean(options.markRead),\n includeConversations: Boolean(options.includeConversations)\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '消息同步失败');\r\n }\r\n\r\n const messages = (response.data?.result?.messages || []).map(message => ({\n ...message,\r\n displayTimestamp: message.displayTimestamp || message.timestamp,\r\n conversationId: conversation.id\n }));\n messages.pinnedMessageUid = String(response.data?.result?.pinnedMessageUid || '');\n if (options.includeConversations && Array.isArray(response.data?.result?.conversations)) {\n const remoteConversations = response.data.result.conversations.map(remoteConversation => ({\n ...remoteConversation,\n updatedAt: Number(remoteConversation.updatedAt || Date.now()),\n avatarText: remoteConversation.avatarText || String(remoteConversation.title || remoteConversation.target || '?').slice(0, 1).toUpperCase(),\n raw: remoteConversation.raw || { type: 'single', target: remoteConversation.target, line: 0 }\n }));\n this.emit('conversationsChanged', remoteConversations);\n }\n const userId = this.currentUser?.userId || '';\r\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = mergeSyncedMessages(messagesByConversation[conversation.id] || [], messages, conversation.id, userId);\n messagesByConversation[conversation.id].pinnedMessageUid = messages.pinnedMessageUid;\n writeLocalMessages(messagesByConversation, userId);\r\n return messagesByConversation[conversation.id];\n }\n\n async setPinnedMessage(conversation, messageUid = '') {\n const action = messageUid ? 'pin' : 'unpin';\n const response = await axios.post(appConfig.messageActionApi, {\n action,\n userId: this.currentUser?.userId || '',\n messageUid: messageUid || '1',\n target: conversation.target || conversation.raw?.target || '',\n conversationType: ['group', 'channel'].includes(conversation.type) ? 'group' : 'single'\n }, { withCredentials: false });\n if (response.data?.code !== 0) throw new Error(response.data?.message || '置顶失败');\n }\n\r\n hideMessages(conversation, messages) {\r\n const items = Array.isArray(messages) ? messages : [messages];\r\n if (!conversation?.id || !items.length) {\r\n return;\r\n }\r\n const userId = this.currentUser?.userId || '';\r\n storeMessageKeys(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\r\n const messagesByConversation = readLocalMessages(userId);\r\n messagesByConversation[conversation.id] = applyLocalMessageState(\r\n conversation.id,\r\n messagesByConversation[conversation.id] || [],\r\n userId\r\n );\r\n writeLocalMessages(messagesByConversation, userId);\r\n }\r\n\r\n markMessagesRecalled(conversation, messages) {\r\n const items = Array.isArray(messages) ? messages : [messages];\r\n if (!conversation?.id || !items.length) {\r\n return;\r\n }\r\n const userId = this.currentUser?.userId || '';\r\n storeMessageKeys(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\r\n const messagesByConversation = readLocalMessages(userId);\r\n messagesByConversation[conversation.id] = applyLocalMessageState(\r\n conversation.id,\r\n messagesByConversation[conversation.id] || [],\r\n userId\r\n );\r\n writeLocalMessages(messagesByConversation, userId);\r\n }\r\n\r\n async recallMessage(conversation, message) {\r\n const messageUid = String(message?.messageUid || message?.id || '').trim();\r\n if (!/^\\d+$/.test(messageUid)) {\r\n throw new Error('缺少可撤回的消息ID');\r\n }\r\n\r\n const response = await axios.post(appConfig.messageActionApi, {\r\n action: 'recall',\r\n userId: this.currentUser?.userId || message.from || '',\r\n messageUid\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '撤回失败');\r\n }\r\n this.markMessagesRecalled(conversation, [message]);\r\n return response.data.result;\r\n }\r\n\r\n async editMessage(conversation, message, text) {\r\n const messageUid = String(message?.messageUid || message?.id || '').trim();\r\n if (!/^\\d+$/.test(messageUid)) {\r\n throw new Error('缺少可编辑的消息ID');\r\n }\r\n const nextText = String(text || '').trim();\r\n if (!nextText) {\r\n throw new Error('编辑内容不能为空');\r\n }\r\n\r\n const response = await axios.post(appConfig.messageActionApi, {\r\n action: 'edit',\r\n userId: this.currentUser?.userId || message.from || '',\r\n messageUid,\r\n text: nextText\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '编辑失败');\r\n }\r\n\r\n const result = response.data?.result?.message || {};\r\n const editedMessage = {\r\n ...message,\r\n text: result.text || nextText,\r\n status: 'delivered',\r\n deliveryStatus: 'delivered',\r\n editedAt: Number(result.editedAt || Date.now()),\r\n activityTimestamp: Number(result.editedAt || Date.now())\r\n };\r\n saveLocalMessage(editedMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', editedMessage);\r\n return editedMessage;\r\n }\r\n\r\n async getMessageDetail(conversation, message) {\r\n const messageUid = String(message?.messageUid || message?.id || '').trim();\r\n if (!messageUid) {\r\n throw new Error('缺少消息ID');\r\n }\r\n const response = await axios.post(appConfig.messageDetailApi, {\r\n userId: this.currentUser?.userId || '',\r\n target: conversation?.target || conversation?.raw?.target || conversation?.id?.replace(/^single-/, '') || '',\r\n conversationType: conversation?.type || conversation?.raw?.type || 'single',\r\n messageUid\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '消息详情加载失败');\r\n }\r\n\r\n return response.data?.result?.detail || null;\r\n }\r\n\r\n async sendTextMessage(conversation, text, initialMessage = null) {\r\n const senderRole = conversation?.role || conversation?.raw?.role || '';\r\n const message = initialMessage || {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: this.currentUser?.userId || 'me',\r\n senderRole,\r\n direction: 'out',\r\n type: 'text',\r\n text,\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: Date.now()\r\n };\r\n saveLocalMessage(message, this.currentUser?.userId || '');\r\n if (!initialMessage) {\r\n this.emit('messageSent', message);\r\n }\r\n\r\n try {\r\n const response = await axios.post(appConfig.sendMessageApi, {\r\n sender: this.currentUser?.userId || '',\r\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\r\n conversationType: conversation.type || conversation.raw?.type || 0,\r\n text\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '发送失败');\r\n }\r\n\r\n const sentMessage = {\r\n ...message,\r\n status: 'sent',\r\n deliveryStatus: 'sent',\r\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\r\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\r\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\r\n timestamp: message.timestamp,\r\n displayTimestamp: message.displayTimestamp || message.timestamp\r\n };\r\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', sentMessage);\r\n return sentMessage;\r\n } catch (error) {\r\n const failedMessage = {\r\n ...message,\r\n status: 'failed',\r\n deliveryStatus: '',\r\n error: error.response?.data?.message || error.message || '发送失败'\r\n };\r\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', failedMessage);\r\n return failedMessage;\r\n }\r\n }\r\n\r\n async sendAttachmentMessage(conversation, { type, file, text = '' }, initialMessage = null) {\r\n const senderRole = conversation?.role || conversation?.raw?.role || '';\r\n const message = initialMessage || {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: this.currentUser?.userId || 'me',\r\n senderRole,\r\n direction: 'out',\r\n type,\r\n text,\r\n attachment: {\r\n type,\r\n name: file?.name || (type === 'image' ? '图片' : '文件'),\r\n mime: file?.type || '',\r\n size: file?.size || 0,\r\n url: type === 'image' && file ? URL.createObjectURL(file) : ''\r\n },\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: Date.now()\r\n };\r\n saveLocalMessage(message, this.currentUser?.userId || '');\r\n if (!initialMessage) {\r\n this.emit('messageSent', message);\r\n }\r\n\r\n try {\r\n const formData = new FormData();\r\n formData.append('sender', this.currentUser?.userId || '');\r\n formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''));\r\n formData.append('conversationType', conversation.type || conversation.raw?.type || 0);\r\n formData.append('messageType', type);\r\n formData.append('text', text || '');\r\n formData.append('attachment', file);\r\n\r\n const response = await axios.post(appConfig.sendMessageApi, formData, {\r\n withCredentials: false\r\n });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '发送失败');\r\n }\r\n\r\n const sentMessage = {\r\n ...message,\r\n status: 'sent',\r\n deliveryStatus: 'sent',\r\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\r\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\r\n attachment: response.data?.result?.attachment || message.attachment,\r\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\r\n timestamp: message.timestamp,\r\n displayTimestamp: message.displayTimestamp || message.timestamp\r\n };\r\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', sentMessage);\r\n return sentMessage;\r\n } catch (error) {\r\n const failedMessage = {\r\n ...message,\r\n status: 'failed',\r\n deliveryStatus: '',\r\n error: error.response?.data?.message || error.message || '发送失败'\r\n };\r\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', failedMessage);\r\n return failedMessage;\r\n }\r\n }\r\n\r\n getContactList() {\r\n return [];\r\n }\r\n\r\n async getServerContactList(userId) {\r\n if (!userId) {\r\n return [];\r\n }\r\n const response = await axios.post(appConfig.contactsApi, { userId }, {\r\n withCredentials: false,\r\n headers: this.getAppAuthHeaders(appConfig.contactsApi)\r\n });\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '联系人加载失败');\r\n }\r\n return (response.data?.result?.contacts || []).map(item => {\r\n return this.mapContact(item.uid, { alias: item.alias }, {\r\n uid: item.uid,\r\n displayName: item.displayName,\r\n name: item.name,\r\n mobile: item.mobile,\r\n portrait: item.portrait,\r\n address: item.address,\r\n friendAlias: item.alias\r\n });\r\n }).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));\r\n }\r\n\r\n async addContact(userId, keyword, reason = '') {\r\n const response = await axios.post(appConfig.addContactApi, {\r\n userId,\r\n keyword,\r\n reason\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '添加联系人失败');\r\n }\r\n\r\n const item = response.data?.result?.contact;\r\n if (!item?.uid) {\r\n return null;\r\n }\r\n\r\n return this.mapContact(item.uid, { alias: item.alias }, {\r\n uid: item.uid,\r\n displayName: item.displayName,\r\n name: item.name,\r\n mobile: item.mobile,\r\n portrait: item.portrait,\r\n address: item.address,\r\n friendAlias: item.alias\r\n });\r\n }\r\n\r\n normalizeConversation(conversation) {\r\n const title = getTitle(conversation?.title, conversation?.target || '');\r\n return {\r\n ...conversation,\r\n id: conversation?.id || `${conversation?.type === 'single' ? 'single' : 'group'}-${conversation?.target}`,\r\n target: conversation?.target || conversation?.raw?.target || '',\r\n title,\r\n subtitle: conversation?.subtitle || '',\r\n unread: Number(conversation?.unread || 0),\r\n portrait: conversation?.portrait || '',\r\n avatarText: conversation?.avatarText || title.slice(0, 1).toUpperCase(),\r\n updatedAt: Number(conversation?.updatedAt || Date.now()),\r\n raw: conversation?.raw || {\r\n type: conversation?.type === 'single' ? 'single' : 'group',\r\n target: conversation?.target || '',\r\n line: 0\r\n }\r\n };\r\n }\r\n\r\n async createGroup(userId, { name, memberIds = [], announcement = '', welcomeText = '', channel = false }) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: channel ? 'create_channel' : 'create_group',\r\n userId,\r\n name,\r\n memberIds,\r\n announcement,\r\n welcomeText\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || (channel ? '创建公告群失败' : '创建群组失败'));\r\n }\r\n\r\n return this.normalizeConversation(response.data?.result?.conversation || {});\r\n }\r\n\r\n async joinGroup(userId, groupKey) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'join_group',\r\n userId,\r\n groupKey\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '加入群组失败');\r\n }\r\n\r\n return this.normalizeConversation(response.data?.result?.conversation || {});\r\n }\r\n\r\n async broadcastMessage(userId, targetIds, text) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'broadcast',\r\n userId,\r\n targetIds,\r\n text\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '群发失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async getGroupDetail(userId, groupId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'group_detail',\r\n userId,\r\n groupId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '群资料加载失败');\r\n }\r\n\r\n return response.data?.result?.group || null;\r\n }\r\n\r\n async getGroupMembers(userId, groupId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'group_members',\r\n userId,\r\n groupId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '群员加载失败');\r\n }\r\n\r\n return response.data?.result?.members || [];\r\n }\r\n\r\n async updateGroupAlias(userId, groupId, alias) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'update_group_alias',\r\n userId,\r\n groupId,\r\n alias\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '本群昵称保存失败');\r\n }\r\n\r\n return response.data?.result?.alias || '';\r\n }\r\n\r\n async leaveGroup(userId, groupId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'leave_group',\r\n userId,\r\n groupId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '退出群组失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async dismissGroup(userId, groupId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'dismiss_group',\r\n userId,\r\n groupId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '解散群组失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async transferGroup(userId, groupId, targetUserId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'transfer_group',\r\n userId,\r\n groupId,\r\n targetUserId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '转让群组失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async setGroupAdmins(userId, groupId, adminIds) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'set_group_admins',\r\n userId,\r\n groupId,\r\n adminIds\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '管理员设置失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async updateGroupProfile(userId, groupId, { name, announcement, welcomeText }) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'update_group_profile',\r\n userId,\r\n groupId,\r\n name,\r\n announcement,\r\n welcomeText\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '群资料保存失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async kickGroupMembers(userId, groupId, targetIds) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'kick_group_members',\r\n userId,\r\n groupId,\r\n targetIds\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '踢人失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async updateGroupMuteSetting(userId, groupId, setting) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'update_mute_setting',\r\n userId,\r\n groupId,\r\n ...setting\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '禁言设置保存失败');\r\n }\r\n\r\n return response.data?.result?.muteSetting || null;\r\n }\r\n\r\n async updateContactAlias(userId, targetId, alias) {\r\n const response = await axios.post(appConfig.updateAliasApi, {\r\n userId,\r\n targetId,\r\n alias\r\n }, {\r\n withCredentials: false,\r\n headers: this.getAppAuthHeaders(appConfig.updateAliasApi)\r\n });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '备注名修改失败');\r\n }\r\n\r\n return response.data?.result?.contact?.alias || '';\r\n }\r\n\r\n async getProfile(userId) {\r\n const response = await axios.post(appConfig.profileApi, {\r\n action: 'get',\r\n userId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '用户资料加载失败');\r\n }\r\n\r\n return response.data?.result?.profile || null;\r\n }\r\n\r\n async updateProfile(userId, { displayName, portraitFile }) {\r\n const formData = new FormData();\r\n formData.append('action', 'update');\r\n formData.append('userId', userId);\r\n formData.append('displayName', displayName);\r\n if (portraitFile) {\r\n formData.append('portraitFile', portraitFile);\r\n }\r\n\r\n const response = await axios.post(appConfig.profileApi, formData, {\r\n withCredentials: false,\r\n headers: this.getAppAuthHeaders(appConfig.appServer)\r\n });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '用户资料保存失败');\r\n }\r\n\r\n return response.data?.result?.profile || null;\r\n }\r\n\r\n async changePassword({ oldPassword, newPassword }) {\r\n const response = await axios.post(appConfig.changePasswordApi, {\r\n oldPassword,\r\n newPassword\r\n }, {\r\n withCredentials: false,\r\n headers: this.getAppAuthHeaders(appConfig.changePasswordApi)\r\n });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || response.data?.msg || '密码修改失败');\r\n }\r\n\r\n return true;\r\n }\r\n\r\n async resetPasswordWithCode({ mobile, resetCode, newPassword }) {\r\n const response = await axios.post(appConfig.resetPasswordApi, {\r\n mobile,\r\n resetCode,\r\n newPassword\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || response.data?.msg || '密码设置失败');\r\n }\r\n\r\n return true;\r\n }\r\n\r\n refreshContactList() {\r\n const contacts = this.getContactList();\r\n this.emit('contactsChanged', contacts);\r\n return contacts;\r\n }\r\n\r\n createSingleConversation(userId, userInfo = null) {\r\n const title = getTitle(userInfo?.title || userInfo?.displayName || userInfo?.name, userId);\r\n return {\r\n id: `single-${userId}`,\r\n type: 'single',\r\n target: userId,\r\n title,\r\n subtitle: '',\r\n unread: 0,\r\n portrait: userInfo?.portrait || '',\r\n avatarText: title.slice(0, 1).toUpperCase(),\r\n updatedAt: Date.now(),\r\n raw: { type: 'single', target: userId, line: 0 }\r\n };\r\n }\r\n\r\n mapContact(userId, friend, userInfo) {\r\n const title = getTitle(userInfo?.friendAlias || friend?.alias || userInfo?.displayName || userInfo?.name, userId);\r\n return {\r\n id: userId,\r\n uid: userId,\r\n title,\r\n subtitle: userInfo?.mobile || userInfo?.name || userId,\r\n portrait: userInfo?.portrait || '',\r\n address: userInfo?.address || '',\r\n avatarText: title.slice(0, 1).toUpperCase(),\r\n alias: friend?.alias || userInfo?.friendAlias || '',\r\n rawFriend: friend,\r\n rawUser: userInfo\r\n };\r\n }\r\n\r\n on(eventName, handler) {\r\n if (!this.listeners.has(eventName)) {\r\n this.listeners.set(eventName, new Set());\r\n }\r\n this.listeners.get(eventName).add(handler);\r\n return () => this.off(eventName, handler);\r\n }\r\n\r\n off(eventName, handler) {\r\n this.listeners.get(eventName)?.delete(handler);\r\n }\r\n\r\n emit(eventName, payload) {\r\n this.listeners.get(eventName)?.forEach(handler => handler(payload));\r\n }\r\n\r\n persistAppToken(url, response) {\r\n const appToken = response.headers?.authtoken || response.headers?.authToken;\r\n if (appToken) {\r\n localStorage.setItem(appConfig.authTokenStoragePrefix + this.getUrlHost(url), appToken);\r\n }\r\n }\r\n\r\n getAppAuthHeaders(url) {\r\n const host = this.getUrlHost(url);\r\n if (!host) {\r\n return {};\r\n }\r\n const token = localStorage.getItem(appConfig.authTokenStoragePrefix + host);\r\n return token ? { authToken: token } : {};\r\n }\r\n\r\n getUrlHost(url) {\r\n try {\r\n return new URL(url, window.location.origin).host;\r\n } catch (error) {\r\n return '';\r\n }\r\n }\r\n}\r\n\r\nexport const imClient = new HttpImClient();\r\n","import { appConfig } from '@/config';\nimport { HttpImClient } from './httpImClient';\nimport { LongConnectionImClient } from './longConnectionImClient';\nimport { DocumentedHttpImClient } from './documentedHttpImClient';\n\nclass UnsupportedWildfireImClient {\n constructor() {\n throw new Error('当前本地社区版 Web 客户端未启用 WildFire Web SDK');\n }\n}\n\nexport const imClient = appConfig.sdkMode === 'wildfire'\n ? new UnsupportedWildfireImClient()\n : appConfig.sdkMode === 'custom-ws' || appConfig.sdkMode === 'long'\n ? new LongConnectionImClient()\n : appConfig.sdkMode === 'legacy-http'\n ? new HttpImClient()\n : new DocumentedHttpImClient();\n\nexport {\n DocumentedHttpImClient,\n HttpImClient,\n LongConnectionImClient,\n UnsupportedWildfireImClient as WildfireImClient\n};\n","import { appConfig } from '@/config';\r\nimport { HttpImClient } from './httpImClient';\r\n\r\nconst HEARTBEAT_INTERVAL_MS = 25000;\r\nconst RECONNECT_MIN_MS = 1000;\r\nconst RECONNECT_MAX_MS = 15000;\r\n\r\nfunction buildWsUrl() {\r\n if (appConfig.wsUrl) {\r\n return appConfig.wsUrl;\r\n }\r\n const protocol = appConfig.useWss ? 'wss' : 'ws';\r\n const host = appConfig.imServerHost || window.location.hostname;\r\n const port = appConfig.imRoutePort ? `:${appConfig.imRoutePort}` : '';\r\n const path = appConfig.wsPath?.startsWith('/') ? appConfig.wsPath : `/${appConfig.wsPath || 'ws'}`;\r\n return `${protocol}://${host}${port}${path}`;\r\n}\r\n\r\nfunction normalizeConversationId(payload) {\r\n const target = payload.target || payload.to || payload.receiver || payload.conversationTarget || payload.from || payload.sender;\r\n return payload.conversationId || (target ? `single-${target}` : '');\r\n}\r\n\r\nfunction normalizeIncomingMessage(payload, currentUserId) {\r\n const item = payload.message || payload;\r\n const from = item.from || item.sender || item.fromUser || '';\r\n const target = item.target || item.to || item.receiver || '';\r\n const direction = from && String(from) === String(currentUserId) ? 'out' : 'in';\r\n const conversationId = item.conversationId || normalizeConversationId({\r\n ...item,\r\n target: direction === 'out' ? target : from\r\n });\r\n\r\n if (!conversationId) {\r\n return null;\r\n }\r\n\r\n const status = item.status || item.deliveryStatus || 'sent';\r\n\r\n return {\r\n id: item.id || item.messageId || item.messageUid || `${Date.now()}${Math.random().toString(16).slice(2)}`,\r\n messageUid: item.messageUid || item.uid || item.messageId || '',\r\n conversationId,\r\n from,\r\n target,\r\n direction,\r\n type: item.type || 'text',\r\n text: item.text || item.content || item.searchableContent || '',\r\n status,\r\n deliveryStatus: item.deliveryStatus || (direction === 'out' ? status : ''),\r\n timestamp: Number(item.timestamp || item.serverTimestamp || Date.now()),\r\n displayTimestamp: Number(item.displayTimestamp || item.timestamp || item.serverTimestamp || Date.now()),\r\n raw: item\r\n };\r\n}\r\n\r\nexport class LongConnectionImClient extends HttpImClient {\r\n constructor() {\r\n super();\r\n this.socket = null;\r\n this.wsUrl = buildWsUrl();\r\n this.heartbeatTimer = null;\r\n this.reconnectTimer = null;\r\n this.reconnectAttempts = 0;\r\n this.manualClose = false;\r\n }\r\n\r\n getSdkVersion() {\r\n return 'JC-LC/0.1';\r\n }\r\n\r\n shouldUseMessagePolling() {\r\n return !this.connected;\r\n }\r\n\r\n async ensureSdk() {\r\n if (typeof WebSocket === 'undefined') {\r\n throw new Error('当前浏览器不支持 WebSocket 长连接');\r\n }\r\n return true;\r\n }\r\n\r\n connect(userId, token) {\r\n this.currentUser = { userId, token };\r\n this.manualClose = false;\r\n this.openSocket();\r\n }\r\n\r\n disconnect() {\r\n this.manualClose = true;\r\n this.clearReconnectTimer();\r\n this.clearHeartbeatTimer();\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n super.disconnect();\r\n }\r\n\r\n openSocket() {\r\n if (this.socket?.readyState === WebSocket.OPEN) {\r\n this.sendAuthFrame();\r\n return;\r\n }\r\n if (this.socket?.readyState === WebSocket.CONNECTING) {\r\n return;\r\n }\r\n\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接连接中' });\r\n\r\n try {\r\n this.socket = new WebSocket(this.wsUrl);\r\n this.socket.binaryType = 'arraybuffer';\r\n } catch (error) {\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接创建失败,使用HTTP补偿' });\r\n this.scheduleReconnect();\r\n return;\r\n }\r\n\r\n this.socket.onopen = () => {\r\n this.connected = true;\r\n this.reconnectAttempts = 0;\r\n this.emit('connectionStatusChanged', { connected: true, statusText: '长连接已连接' });\r\n this.sendAuthFrame();\r\n this.startHeartbeat();\r\n this.refreshConversationList();\r\n };\r\n\r\n this.socket.onmessage = event => {\r\n this.handleFrame(event.data);\r\n };\r\n\r\n this.socket.onerror = () => {\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接异常,使用HTTP补偿' });\r\n };\r\n\r\n this.socket.onclose = () => {\r\n this.connected = false;\r\n this.clearHeartbeatTimer();\r\n this.socket = null;\r\n if (this.manualClose) {\r\n return;\r\n }\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接重连中' });\r\n this.scheduleReconnect();\r\n };\r\n }\r\n\r\n sendAuthFrame() {\r\n this.sendFrame({\r\n type: 'auth',\r\n userId: this.currentUser?.userId || '',\r\n token: this.currentUser?.token || '',\r\n clientId: this.getClientId(),\r\n platform: appConfig.platform,\r\n timestamp: Date.now()\r\n });\r\n }\r\n\r\n sendFrame(frame) {\r\n if (this.socket?.readyState !== WebSocket.OPEN) {\r\n return false;\r\n }\r\n this.socket.send(JSON.stringify(frame));\r\n return true;\r\n }\r\n\r\n handleFrame(rawData) {\r\n if (rawData instanceof ArrayBuffer) {\r\n this.emit('rawFrameReceived', rawData);\r\n return;\r\n }\r\n\r\n let payload;\r\n try {\r\n payload = typeof rawData === 'string' ? JSON.parse(rawData) : rawData;\r\n } catch (error) {\r\n return;\r\n }\r\n\r\n const type = payload.type || payload.event || payload.cmd || '';\r\n if (type === 'pong' || type === 'auth_ok' || type === 'connected') {\r\n return;\r\n }\r\n if (type === 'contactsChanged') {\r\n this.emit('contactsChanged', payload.contacts || []);\r\n return;\r\n }\r\n if (type === 'conversationsChanged') {\r\n this.emit('conversationsChanged', payload.conversations || []);\r\n return;\r\n }\r\n if (type === 'messages' && Array.isArray(payload.messages)) {\r\n payload.messages\r\n .map(message => normalizeIncomingMessage(message, this.currentUser?.userId))\r\n .filter(Boolean)\r\n .forEach(message => this.emit('messageReceived', message));\r\n return;\r\n }\r\n\r\n const message = normalizeIncomingMessage(payload, this.currentUser?.userId);\r\n if (message) {\r\n this.emit(message.direction === 'out' ? 'messageStatusChanged' : 'messageReceived', message);\r\n }\r\n }\r\n\r\n startHeartbeat() {\r\n this.clearHeartbeatTimer();\r\n this.heartbeatTimer = window.setInterval(() => {\r\n this.sendFrame({ type: 'ping', timestamp: Date.now() });\r\n }, HEARTBEAT_INTERVAL_MS);\r\n }\r\n\r\n clearHeartbeatTimer() {\r\n if (this.heartbeatTimer) {\r\n window.clearInterval(this.heartbeatTimer);\r\n this.heartbeatTimer = null;\r\n }\r\n }\r\n\r\n scheduleReconnect() {\r\n this.clearReconnectTimer();\r\n const delay = Math.min(RECONNECT_MAX_MS, RECONNECT_MIN_MS * 2 ** this.reconnectAttempts);\r\n this.reconnectAttempts += 1;\r\n this.reconnectTimer = window.setTimeout(() => {\r\n this.openSocket();\r\n }, delay);\r\n }\r\n\r\n clearReconnectTimer() {\r\n if (this.reconnectTimer) {\r\n window.clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n }\r\n}\r\n","function configuredProxyHosts() {\n const configured = window.JC_WEB_IM_CONFIG?.mediaProxyHosts;\n const values = Array.isArray(configured)\n ? configured\n : String(configured || '').split(/[\\s,]+/);\n return new Set(\n ['zhiyanim.dfpnm.cn', ...values]\n .map(value => String(value || '').trim().toLowerCase().replace(/\\.$/, ''))\n .filter(Boolean)\n );\n}\n\nexport function imageDisplayUrl(value) {\n const source = String(value || '').trim();\n if (!source || source.startsWith('blob:') || source.startsWith('data:')) {\n return source;\n }\n\n try {\n const url = new URL(source, window.location.origin);\n if (url.protocol !== 'https:' || !configuredProxyHosts().has(url.hostname.toLowerCase())) {\n return source;\n }\n const proxyUrl = new URL('/api/media_proxy.php', window.location.origin);\n proxyUrl.searchParams.set('url', url.toString());\n return proxyUrl.toString();\n } catch (error) {\n return source;\n }\n}\n","import axios from 'axios';\nimport { appConfig } from '@/config';\nimport { imClient } from '@/services/imClient';\n\nclass RealtimeNotificationClient {\n constructor() {\n this.source = null;\n this.userId = '';\n this.handler = null;\n this.reconnectTimer = null;\n this.reconnectAttempt = 0;\n this.generation = 0;\n }\n\n isConnected() {\n return this.source?.readyState === WebSocket.OPEN;\n }\n\n start(userId, handler) {\n this.stop();\n if (!appConfig.sseEnabled || !userId || typeof window.WebSocket !== 'function') return;\n this.userId = userId;\n this.handler = handler;\n this.generation += 1;\n this.open(this.generation);\n }\n\n stop() {\n this.generation += 1;\n window.clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n if (this.source) this.source.close();\n this.source = null;\n this.userId = '';\n this.handler = null;\n this.reconnectAttempt = 0;\n }\n\n async open(generation) {\n try {\n const response = await axios.post(appConfig.sseTicketApi, { userId: this.userId }, {\n withCredentials: false,\n headers: imClient.getAppAuthHeaders(appConfig.appServer)\n });\n if (generation !== this.generation) return;\n if (response.data?.code !== 0) throw new Error(response.data?.message || '实时通知凭证申请失败');\n const ticket = response.data?.result?.ticket || '';\n if (!ticket) throw new Error('实时通知凭证为空');\n const separator = appConfig.sseUrl.includes('?') ? '&' : '?';\n const endpoint = `${appConfig.sseUrl}${separator}ticket=${encodeURIComponent(ticket)}`;\n const socketUrl = endpoint.startsWith('ws://') || endpoint.startsWith('wss://')\n ? endpoint\n : `${window.location.protocol === 'https:' ? 'wss:' : 'ws:'}//${window.location.host}${endpoint.startsWith('/') ? '' : '/'}${endpoint}`;\n const source = new WebSocket(socketUrl);\n this.source = source;\n source.onopen = () => {\n this.reconnectAttempt = 0;\n };\n source.onmessage = event => {\n if (generation !== this.generation) return;\n let payload = {};\n try { payload = JSON.parse(event.data || '{}'); } catch (error) { payload = {}; }\n if (payload.type !== 'message-notification') return;\n this.handler?.(payload);\n };\n source.onerror = () => {\n if (generation !== this.generation) return;\n source.close();\n if (this.source === source) this.source = null;\n this.scheduleReconnect(generation);\n };\n source.onclose = () => {\n if (generation !== this.generation || this.source !== source) return;\n this.source = null;\n this.scheduleReconnect(generation);\n };\n } catch (error) {\n if (generation === this.generation) this.scheduleReconnect(generation);\n }\n }\n\n scheduleReconnect(generation) {\n window.clearTimeout(this.reconnectTimer);\n const delay = Math.min(30000, 1000 * (2 ** Math.min(this.reconnectAttempt, 5)));\n this.reconnectAttempt += 1;\n this.reconnectTimer = window.setTimeout(() => this.open(generation), delay);\n }\n}\n\nexport const realtimeNotifications = new RealtimeNotificationClient();\n","import { defineStore } from 'pinia';\r\nimport { imClient } from '@/services/imClient';\r\nimport { useConversationStore } from '@/stores/conversations';\r\nimport { useNavigationStore } from '@/stores/navigation';\r\nimport { useSessionStore } from '@/stores/session';\r\n\r\nconst CONTACT_CACHE_MS = 15000;\r\n\r\nfunction normalizeContacts(contacts) {\r\n const unique = new Map();\r\n contacts.forEach(contact => {\r\n const uid = String(contact.uid || contact.id || '').trim();\r\n if (!uid) {\r\n return;\r\n }\r\n const normalized = {\r\n ...contact,\r\n id: String(contact.id || uid),\r\n uid\r\n };\r\n unique.set(uid, {\r\n ...(unique.get(uid) || {}),\r\n ...normalized\r\n });\r\n });\r\n return Array.from(unique.values()).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));\r\n}\r\n\r\nexport const useContactStore = defineStore('contacts', {\r\n state: () => ({\r\n contacts: [],\r\n activeId: '',\r\n loading: false,\r\n eventsBound: false,\r\n refreshSerial: 0,\r\n refreshPromise: null,\r\n loadedForUserId: '',\r\n loadedAt: 0,\r\n actionError: '',\r\n actionInfo: ''\r\n }),\r\n getters: {\r\n activeContact(state) {\r\n return state.contacts.find(item => item.id === state.activeId) || state.contacts[0] || null;\r\n }\r\n },\r\n actions: {\r\n bindImEvents() {\r\n if (this.eventsBound) {\r\n return;\r\n }\r\n this.eventsBound = true;\r\n imClient.on('contactsChanged', contacts => {\r\n if (!contacts.length && this.contacts.length) {\r\n return;\r\n }\r\n this.contacts = normalizeContacts(contacts);\r\n if (!this.contacts.find(item => item.id === this.activeId)) {\r\n this.activeId = this.contacts[0]?.id || '';\r\n }\r\n });\r\n },\r\n async refreshContacts(options = {}) {\r\n this.bindImEvents();\r\n const session = useSessionStore();\r\n const requestUserId = session.userId;\r\n const force = Boolean(options.force);\r\n if (!requestUserId) {\r\n this.clearContacts();\r\n return [];\r\n }\r\n if (!force\r\n && this.contacts.length\r\n && this.loadedForUserId === requestUserId\r\n && Date.now() - this.loadedAt < CONTACT_CACHE_MS\r\n ) {\r\n return this.contacts;\r\n }\r\n if (this.refreshPromise && !force) {\r\n return this.refreshPromise;\r\n }\r\n const serial = this.refreshSerial + 1;\r\n this.refreshSerial = serial;\r\n this.loading = true;\r\n\r\n this.refreshPromise = (async () => {\r\n this.contacts = normalizeContacts(imClient.refreshContactList());\r\n if (!this.contacts.find(item => item.id === this.activeId)) {\r\n this.activeId = this.contacts[0]?.id || '';\r\n }\r\n if (!this.contacts.length || force) {\r\n const serverContacts = await imClient.getServerContactList(requestUserId);\r\n if (serial !== this.refreshSerial || useSessionStore().userId !== requestUserId) {\r\n return this.contacts;\r\n }\r\n this.contacts = normalizeContacts(serverContacts);\r\n this.loadedForUserId = requestUserId;\r\n this.loadedAt = Date.now();\r\n if (!this.contacts.find(item => item.id === this.activeId)) {\r\n this.activeId = this.contacts[0]?.id || '';\r\n }\r\n }\r\n window.setTimeout(() => {\r\n if (serial !== this.refreshSerial || useSessionStore().userId !== requestUserId) {\r\n return;\r\n }\r\n const latest = imClient.getContactList(false);\r\n if (latest.length || !this.contacts.length) {\r\n this.contacts = normalizeContacts(latest);\r\n this.loadedForUserId = requestUserId;\r\n this.loadedAt = Date.now();\r\n if (!this.contacts.find(item => item.id === this.activeId)) {\r\n this.activeId = this.contacts[0]?.id || '';\r\n }\r\n }\r\n }, 1200);\r\n return this.contacts;\r\n })();\r\n\r\n try {\r\n return await this.refreshPromise;\r\n } finally {\r\n if (serial === this.refreshSerial) {\r\n this.loading = false;\r\n this.refreshPromise = null;\r\n }\r\n }\r\n },\r\n async addContact(keyword) {\r\n const session = useSessionStore();\r\n const value = String(keyword || '').trim();\r\n this.actionError = '';\r\n this.actionInfo = '';\r\n if (!session.userId) {\r\n this.actionError = '请先登录';\r\n return false;\r\n }\r\n if (!value) {\r\n this.actionError = '请输入用户ID、手机号或用户名';\r\n return false;\r\n }\r\n\r\n this.loading = true;\r\n try {\r\n const contact = await imClient.addContact(session.userId, value, '添加联系人');\r\n if (contact) {\r\n this.contacts = normalizeContacts([...this.contacts, contact]);\r\n this.activeId = contact.id;\r\n }\r\n this.actionInfo = '联系人已添加';\r\n await this.refreshContacts({ force: true });\r\n return true;\r\n } catch (error) {\r\n this.actionError = error.message || '添加联系人失败';\r\n return false;\r\n } finally {\r\n this.loading = false;\r\n }\r\n },\r\n async updateContactAlias(contactId, alias) {\r\n const session = useSessionStore();\r\n const targetId = String(contactId || '').trim();\r\n const nextAlias = String(alias || '').trim();\r\n this.actionError = '';\r\n this.actionInfo = '';\r\n if (!session.userId) {\r\n this.actionError = '请先登录';\r\n return false;\r\n }\r\n if (!targetId) {\r\n this.actionError = '缺少联系人ID';\r\n return false;\r\n }\r\n\r\n try {\r\n const savedAlias = await imClient.updateContactAlias(session.userId, targetId, nextAlias);\r\n this.contacts = normalizeContacts(this.contacts.map(item => {\r\n if (item.uid !== targetId && item.id !== targetId) {\r\n return item;\r\n }\r\n const rawUser = {\r\n ...(item.rawUser || {}),\r\n friendAlias: savedAlias\r\n };\r\n const rawFriend = {\r\n ...(item.rawFriend || {}),\r\n alias: savedAlias\r\n };\r\n const title = savedAlias || rawUser.displayName || rawUser.name || item.uid;\r\n return {\r\n ...item,\r\n title,\r\n avatarText: title.slice(0, 1).toUpperCase(),\r\n alias: savedAlias,\r\n rawFriend,\r\n rawUser\r\n };\r\n }));\r\n this.loadedAt = Date.now();\r\n this.actionInfo = '备注名已修改';\r\n return true;\r\n } catch (error) {\r\n this.actionError = error.message || '备注名修改失败';\r\n return false;\r\n }\r\n },\r\n clearContacts() {\r\n this.refreshSerial += 1;\r\n this.contacts = [];\r\n this.activeId = '';\r\n this.loading = false;\r\n this.refreshPromise = null;\r\n this.loadedForUserId = '';\r\n this.loadedAt = 0;\r\n this.actionError = '';\r\n this.actionInfo = '';\r\n },\r\n setActiveContact(id) {\r\n this.activeId = id;\r\n },\r\n openChat(contact) {\r\n if (!contact) {\r\n return;\r\n }\r\n const conversations = useConversationStore();\r\n const navigation = useNavigationStore();\r\n const conversation = imClient.createSingleConversation(contact.uid, contact);\r\n conversations.upsertConversation(conversation);\r\n conversations.setActiveConversation(conversation.id);\r\n navigation.showMessages();\r\n }\r\n }\r\n});\r\n","import { defineStore } from 'pinia';\r\nimport { imClient } from '@/services/imClient';\r\nimport { appConfig } from '@/config';\nimport { useSessionStore } from '@/stores/session';\nimport { realtimeNotifications } from '@/services/realtimeNotifications';\nimport { imageDisplayUrl } from '@/services/mediaProxy';\n\r\nconst LOCAL_CONVERSATION_STORAGE_KEY = 'qmt-web-im-local-conversations-v2';\r\nconst LOCAL_FAVORITE_MESSAGES_KEY = 'qmt-web-im-favorite-messages-v1';\nconst LOCAL_PINNED_MESSAGES_KEY = 'qmt-web-im-pinned-messages-v1';\n\r\nfunction scopedStorageKey(baseKey) {\r\n const session = useSessionStore();\r\n const scope = `${appConfig.appServer || ''}:${session.userId || 'anonymous'}`;\r\n return `${baseKey}:${encodeURIComponent(scope)}`;\r\n}\r\n\r\nfunction readFavoriteMessages() {\r\n try {\r\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY)) || '[]');\r\n } catch (error) {\r\n return [];\r\n }\r\n}\r\n\r\nfunction writeFavoriteMessages(messages) {\n localStorage.setItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY), JSON.stringify(messages));\r\n}\r\n\r\nfunction readLocalConversations() {\r\n try {\r\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY)) || '[]');\r\n } catch (error) {\r\n return [];\r\n }\r\n}\r\n\r\nfunction writeLocalConversations(conversations) {\n localStorage.setItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY), JSON.stringify(conversations));\n}\n\nfunction readPinnedMessages() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_PINNED_MESSAGES_KEY)) || '{}');\n } catch (error) {\n return {};\n }\n}\n\nfunction writePinnedMessages(messages) {\n localStorage.setItem(scopedStorageKey(LOCAL_PINNED_MESSAGES_KEY), JSON.stringify(messages));\n}\n\nfunction sortConversations(conversations) {\n return [...conversations].sort((left, right) => {\n const leftPinned = Number(left.pinnedAt || left.top || 0);\n const rightPinned = Number(right.pinnedAt || right.top || 0);\n if (Boolean(leftPinned) !== Boolean(rightPinned)) {\n return rightPinned ? 1 : -1;\n }\n if (leftPinned && rightPinned && leftPinned !== rightPinned) {\n return rightPinned - leftPinned;\n }\n return Number(right.updatedAt || 0) - Number(left.updatedAt || 0);\n });\n}\n\r\nfunction randomId() {\r\n if (window.crypto && window.crypto.randomUUID) {\r\n return window.crypto.randomUUID().replaceAll('-', '');\r\n }\r\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\r\n}\r\n\r\nfunction messageKey(message) {\r\n return message.id || message.messageUid;\r\n}\r\n\r\nfunction messageStableKey(message) {\r\n return String(message?.messageUid || message?.id || '');\r\n}\r\n\r\nfunction messageActivityTimestamp(message) {\r\n return Number(message?.activityTimestamp || message?.editedAt || message?.displayTimestamp || message?.timestamp || 0);\r\n}\r\n\r\nfunction isRecalledMessage(message) {\r\n return Boolean(message?.recalled) || message?.status === 'recalled';\r\n}\r\n\r\nfunction attachmentLabel(message) {\r\n const attachment = message?.attachment;\r\n if (!attachment) {\r\n return '';\r\n }\r\n if (attachment.type === 'image') {\r\n return '[图片]';\r\n }\r\n return `[文件] ${attachment.name || '文件'}`;\r\n}\r\n\r\nfunction messagePreviewText(message) {\r\n if (isRecalledMessage(message)) {\r\n return `[${message?.recallStatus || '已撤回'}]`;\r\n }\r\n const text = String(message?.text || '').replace(/\\s+/g, ' ').trim();\r\n return text || attachmentLabel(message);\r\n}\r\n\r\nfunction quotePrefix(message) {\r\n const text = messagePreviewText(message);\r\n return text.length > 48 ? `${text.slice(0, 48)}...` : text;\r\n}\r\n\r\nasync function writeClipboard(text) {\r\n if (navigator.clipboard?.writeText) {\r\n await navigator.clipboard.writeText(text);\r\n return;\r\n }\r\n const element = document.createElement('textarea');\r\n element.value = text;\r\n element.setAttribute('readonly', 'readonly');\r\n element.style.position = 'fixed';\r\n element.style.left = '-9999px';\r\n document.body.appendChild(element);\r\n element.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(element);\r\n}\r\n\r\nfunction isSameMessage(left, right) {\r\n if (left.messageUid && right.messageUid && left.messageUid === right.messageUid) {\r\n return true;\r\n }\r\n if (left.id && right.id && left.id === right.id) {\r\n return true;\r\n }\r\n return left.direction === right.direction\r\n && left.text === right.text\r\n && (left.type || 'text') === (right.type || 'text')\r\n && Math.abs(Number(left.displayTimestamp || left.timestamp || 0) - Number(right.displayTimestamp || right.timestamp || 0)) < 15000;\r\n}\r\n\r\nfunction hasExactMessage(messages, message) {\r\n return messages.some(item => {\r\n if (item.id && message.id && item.id === message.id) {\r\n return true;\r\n }\r\n return item.messageUid && message.messageUid && item.messageUid === message.messageUid;\r\n });\r\n}\r\n\r\nfunction shouldUseMessagePolling() {\r\n return imClient.shouldUseMessagePolling ? imClient.shouldUseMessagePolling() : true;\r\n}\r\n\r\nfunction canMarkReadNow(options = {}) {\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n if (document.visibilityState !== 'visible') {\r\n return false;\r\n }\r\n if (options.userAction) {\r\n return true;\r\n }\r\n return true;\n}\n\nfunction normalizeMessageForDisplay(message) {\n if (!message || message.attachment || String(message.text || '').trim()) {\n return message;\n }\n const contentType = Number(message.contentType || 0);\n const labels = {\n 3: '[图片加载失败]',\n 6: '[视频加载失败]',\n 90: '[红包]',\n 92: '以上是打招呼的内容',\n 93: '你们已经是好友了,可以开始聊天了。',\n 105: '[领取了红包]'\n };\n if (!labels[contentType]) {\n return message;\n }\n return {\n ...message,\n type: 'text',\n text: labels[contentType]\n };\n}\n\nfunction mergeVisibleMessages(currentMessages, syncedMessages) {\n const merged = [...syncedMessages].map(normalizeMessageForDisplay);\n currentMessages.forEach(currentMessage => {\n currentMessage = normalizeMessageForDisplay(currentMessage);\n const exists = merged.some(message => isSameMessage(message, currentMessage));\r\n const shouldKeepLocal = currentMessage.status === 'sending'\r\n || currentMessage.status === 'failed'\r\n || (currentMessage.direction === 'out'\r\n && currentMessage.status === 'sent'\r\n && Date.now() - Number(currentMessage.timestamp || 0) < 30000);\r\n if (!exists && shouldKeepLocal) {\r\n merged.push(currentMessage);\r\n }\r\n });\r\n\r\n return merged\r\n .filter((message, index, messages) => {\r\n const key = messageKey(message);\r\n return messages.findIndex(item => messageKey(item) === key) === index;\r\n })\r\n .sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0));\r\n}\r\n\r\nfunction incomingEditedMessages(previousMessages, nextMessages) {\r\n const previousByKey = new Map();\r\n (previousMessages || []).forEach(message => {\r\n const key = messageStableKey(message);\r\n if (key) {\r\n previousByKey.set(key, message);\r\n }\r\n });\r\n\r\n return (nextMessages || []).filter(message => {\r\n if (message.direction !== 'in') {\r\n return false;\r\n }\r\n const editedAt = Number(message.editedAt || 0);\r\n if (editedAt <= 0) {\r\n return false;\r\n }\r\n const previous = previousByKey.get(messageStableKey(message));\r\n return previous && editedAt > Number(previous.editedAt || 0);\r\n });\r\n}\r\n\r\nlet notificationAudioContext = null;\r\n\r\nfunction playNotificationSound() {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n try {\r\n const AudioContext = window.AudioContext || window.webkitAudioContext;\r\n if (!AudioContext) {\r\n return;\r\n }\r\n notificationAudioContext = notificationAudioContext || new AudioContext();\r\n if (notificationAudioContext.state === 'suspended') {\r\n notificationAudioContext.resume().catch(() => {});\r\n }\r\n const oscillator = notificationAudioContext.createOscillator();\r\n const gain = notificationAudioContext.createGain();\r\n const startAt = notificationAudioContext.currentTime;\r\n oscillator.type = 'sine';\r\n oscillator.frequency.setValueAtTime(880, startAt);\r\n oscillator.frequency.setValueAtTime(660, startAt + 0.1);\r\n gain.gain.setValueAtTime(0.0001, startAt);\r\n gain.gain.exponentialRampToValueAtTime(0.12, startAt + 0.02);\r\n gain.gain.exponentialRampToValueAtTime(0.0001, startAt + 0.22);\r\n oscillator.connect(gain);\r\n gain.connect(notificationAudioContext.destination);\r\n oscillator.start(startAt);\r\n oscillator.stop(startAt + 0.24);\r\n } catch (error) {\r\n // Notification sound is best-effort; browsers may block audio until user interaction.\r\n }\r\n}\r\n\r\nexport const useConversationStore = defineStore('conversations', {\r\n state: () => ({\r\n activeId: '',\r\n conversations: [],\r\n messagesByConversation: {},\r\n visibleMessagesByConversation: {},\r\n eventsBound: false,\r\n usingDemoData: false,\r\n loading: false,\r\n syncTimer: null,\r\n conversationSyncTimer: null,\r\n readPresenceEventsBound: false,\r\n syncInFlight: false,\r\n pendingReadReceiptConversationId: '',\r\n conversationSyncInFlight: false,\r\n syncAfterSendTimer: null,\r\n optimisticMessagesByConversation: {},\r\n quotedMessage: null,\r\n forwardingMessages: [],\r\n editingMessage: null,\r\n editingText: '',\r\n editingMode: '',\r\n messageDetailOpen: false,\r\n messageDetailLoading: false,\r\n messageDetailError: '',\r\n messageDetail: null,\r\n attentionMessageId: '',\r\n attentionMessageTimer: null,\r\n selectionMode: false,\r\n selectedMessageIds: [],\r\n favoriteMessages: [],\n pinnedMessagesByConversation: {},\n activeFavoriteKey: '',\r\n actionNotice: '',\n actionError: '',\n actionNoticeTimer: null,\n realtimeSyncTimer: null\n }),\r\n getters: {\r\n activeConversation(state) {\r\n return state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\r\n },\r\n activeMessages(state) {\r\n return state.visibleMessagesByConversation[state.activeId] || [];\r\n },\r\n totalUnread(state) {\r\n return state.conversations.reduce((sum, item) => sum + Number(item.unread || 0), 0);\r\n },\r\n canSendActiveConversation(state) {\r\n const conversation = state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\r\n if (!conversation) {\r\n return false;\r\n }\r\n if (conversation.type !== 'channel') {\r\n return true;\r\n }\r\n return ['owner', 'admin'].includes(conversation.role || conversation.raw?.role || '');\r\n },\r\n favoriteMessageIds(state) {\r\n return state.favoriteMessages.map(message => message.key);\r\n },\r\n activeFavorite(state) {\n return state.favoriteMessages.find(message => message.key === state.activeFavoriteKey)\n || state.favoriteMessages[0]\n || null;\n },\n activePinnedMessage(state) {\n const pinned = state.pinnedMessagesByConversation[state.activeId] || null;\n if (!pinned) return null;\n const message = (state.visibleMessagesByConversation[state.activeId] || [])\n .find(item => messageStableKey(item) === pinned.key);\n return message ? { ...pinned, ...message, key: pinned.key } : pinned;\n },\n selectedMessages(state) {\r\n const selectedIds = new Set(state.selectedMessageIds);\r\n return (state.visibleMessagesByConversation[state.activeId] || [])\r\n .filter(message => selectedIds.has(messageStableKey(message)));\r\n }\r\n },\r\n actions: {\r\n bootstrapDemoData() {\n const session = useSessionStore();\n this.bindImEvents();\n this.usingDemoData = false;\n if (!session.userId) {\n this.clearUserState();\n return;\n }\n this.loadScopedLocalState();\n this.startMessageSync();\n realtimeNotifications.start(session.userId, payload => this.handleRealtimeNotification(payload));\n },\n loadScopedLocalState() {\n this.conversations = [];\n this.favoriteMessages = readFavoriteMessages();\n this.pinnedMessagesByConversation = readPinnedMessages();\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n this.activeId = '';\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n this.quotedMessage = null;\r\n this.forwardingMessages = [];\r\n this.editingMessage = null;\r\n this.editingText = '';\r\n this.editingMode = '';\r\n this.messageDetailOpen = false;\r\n this.messageDetailLoading = false;\r\n this.messageDetailError = '';\r\n this.messageDetail = null;\n this.selectionMode = false;\n this.selectedMessageIds = [];\n },\n clearUserState() {\r\n window.clearInterval(this.syncTimer);\r\n window.clearInterval(this.conversationSyncTimer);\r\n window.clearTimeout(this.syncAfterSendTimer);\n window.clearTimeout(this.attentionMessageTimer);\n window.clearTimeout(this.actionNoticeTimer);\n window.clearTimeout(this.realtimeSyncTimer);\n realtimeNotifications.stop();\n this.syncTimer = null;\r\n this.conversationSyncTimer = null;\r\n this.syncAfterSendTimer = null;\r\n this.attentionMessageTimer = null;\n this.actionNoticeTimer = null;\n this.realtimeSyncTimer = null;\n this.syncInFlight = false;\r\n this.conversationSyncInFlight = false;\r\n this.pendingReadReceiptConversationId = '';\r\n this.activeId = '';\r\n this.conversations = [];\r\n this.messagesByConversation = {};\r\n this.visibleMessagesByConversation = {};\r\n this.optimisticMessagesByConversation = {};\r\n this.quotedMessage = null;\r\n this.forwardingMessages = [];\r\n this.editingMessage = null;\r\n this.editingText = '';\r\n this.editingMode = '';\r\n this.messageDetailOpen = false;\r\n this.messageDetailLoading = false;\r\n this.messageDetailError = '';\r\n this.messageDetail = null;\r\n this.attentionMessageId = '';\r\n this.selectionMode = false;\r\n this.selectedMessageIds = [];\r\n this.favoriteMessages = [];\r\n this.activeFavoriteKey = '';\r\n this.actionNotice = '';\r\n this.actionError = '';\r\n },\r\n bindImEvents() {\r\n if (this.eventsBound) {\r\n return;\r\n }\r\n this.eventsBound = true;\r\n imClient.on('messageSent', message => {\r\n this.appendMessage(message.conversationId, message);\r\n });\r\n imClient.on('messageReceived', message => {\n this.appendMessage(message.conversationId, message);\n if (message.conversationId === this.activeId) {\n this.scheduleActiveMessagesSync({ allowReadReceipt: true }, 500);\n }\r\n });\r\n imClient.on('messageStatusChanged', message => {\r\n this.replaceMessage(message.conversationId, message);\r\n });\r\n imClient.on('conversationsChanged', remoteConversations => {\r\n this.usingDemoData = false;\r\n this.applyRemoteConversations(remoteConversations);\r\n });\r\n },\r\n setActiveConversation(id) {\r\n this.activeId = id;\r\n const conversation = this.conversations.find(item => item.id === id);\r\n if (conversation) {\r\n conversation.unread = 0;\r\n }\r\n this.loadActiveMessages({ allowReadReceipt: true, userAction: true });\r\n },\r\n sendText(text) {\r\n const conversation = this.activeConversation;\r\n if (!conversation || !text.trim()) {\r\n return;\r\n }\r\n let value = text.trim();\r\n if (this.quotedMessage) {\r\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`;\r\n this.quotedMessage = null;\r\n }\r\n const message = {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: 'me',\r\n direction: 'out',\r\n type: 'text',\r\n text: value,\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: Date.now(),\r\n displayTimestamp: Date.now()\r\n };\r\n this.appendVisibleMessage(conversation.id, message);\r\n this.appendMessage(conversation.id, message);\r\n imClient.sendTextMessage(conversation, value, message);\r\n conversation.subtitle = value;\r\n conversation.updatedAt = Date.now();\r\n writeLocalConversations(this.conversations);\r\n window.clearTimeout(this.syncAfterSendTimer);\r\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 250);\r\n },\r\n sendAttachment({ type, file, text = '' }) {\r\n const conversation = this.activeConversation;\r\n if (!conversation || !file || !['image', 'file'].includes(type)) {\r\n return;\r\n }\r\n let value = text.trim();\r\n if (this.quotedMessage) {\r\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`.trim();\r\n this.quotedMessage = null;\r\n }\r\n const now = Date.now();\r\n const message = {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: 'me',\r\n senderRole: conversation.role || conversation.raw?.role || '',\r\n direction: 'out',\r\n type,\r\n text: value,\r\n attachment: {\r\n type,\r\n name: file.name || (type === 'image' ? '图片' : '文件'),\r\n mime: file.type || '',\r\n size: file.size || 0,\r\n url: type === 'image' ? URL.createObjectURL(file) : ''\r\n },\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: now,\r\n displayTimestamp: now\r\n };\r\n this.appendVisibleMessage(conversation.id, message);\r\n this.appendMessage(conversation.id, message);\r\n imClient.sendAttachmentMessage(conversation, { type, file, text: value }, message);\r\n conversation.subtitle = messagePreviewText(message);\r\n conversation.updatedAt = now;\r\n writeLocalConversations(this.conversations);\r\n window.clearTimeout(this.syncAfterSendTimer);\r\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 350);\r\n },\r\n async sendTextToConversation(conversation, text) {\r\n if (!conversation || !text.trim()) {\r\n return null;\r\n }\r\n const value = text.trim();\r\n const message = {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: 'me',\r\n direction: 'out',\r\n type: 'text',\r\n text: value,\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: Date.now(),\r\n displayTimestamp: Date.now()\r\n };\r\n this.appendMessage(conversation.id, message);\r\n const sentMessage = await imClient.sendTextMessage(conversation, value, message);\r\n this.replaceMessage(conversation.id, sentMessage);\r\n return sentMessage;\r\n },\r\n upsertConversation(conversation) {\r\n const index = this.conversations.findIndex(item => item.id === conversation.id);\r\n if (index >= 0) {\r\n this.conversations.splice(index, 1, {\r\n ...this.conversations[index],\r\n ...conversation\r\n });\r\n } else {\r\n this.conversations.unshift(conversation);\r\n }\r\n this.usingDemoData = false;\r\n writeLocalConversations(this.conversations);\r\n },\r\n removeConversation(conversationId) {\r\n this.conversations = this.conversations.filter(conversation => conversation.id !== conversationId);\r\n const {\r\n [conversationId]: removedMessages,\r\n ...messagesByConversation\r\n } = this.messagesByConversation;\r\n const {\r\n [conversationId]: removedVisibleMessages,\r\n ...visibleMessagesByConversation\r\n } = this.visibleMessagesByConversation;\r\n const {\r\n [conversationId]: removedOptimisticMessages,\r\n ...optimisticMessagesByConversation\r\n } = this.optimisticMessagesByConversation;\r\n void removedMessages;\r\n void removedVisibleMessages;\r\n void removedOptimisticMessages;\r\n this.messagesByConversation = messagesByConversation;\r\n this.visibleMessagesByConversation = visibleMessagesByConversation;\r\n this.optimisticMessagesByConversation = optimisticMessagesByConversation;\r\n if (this.activeId === conversationId) {\r\n this.activeId = this.conversations[0]?.id || '';\r\n }\r\n writeLocalConversations(this.conversations);\r\n if (this.activeId) {\r\n this.loadActiveMessages();\r\n }\r\n },\r\n applyRemoteConversations(remoteConversations) {\r\n const remote = Array.isArray(remoteConversations) ? remoteConversations : [];\r\n if (!remote.length && this.conversations.length) {\r\n return;\r\n }\r\n\r\n const merged = new Map();\r\n this.conversations.forEach(conversation => {\r\n merged.set(conversation.id, conversation);\r\n });\r\n remote.forEach(conversation => {\r\n const unread = conversation.id === this.activeId && canMarkReadNow() ? 0 : Number(conversation.unread || 0);\r\n merged.set(conversation.id, {\r\n ...(merged.get(conversation.id) || {}),\r\n ...conversation,\r\n unread\r\n });\r\n });\r\n\r\n this.conversations = sortConversations(Array.from(merged.values()))\n .slice(0, 100);\n\r\n if (!this.conversations.length) {\r\n this.activeId = '';\r\n this.messagesByConversation = {};\r\n this.visibleMessagesByConversation = {};\r\n this.optimisticMessagesByConversation = {};\r\n writeLocalConversations(this.conversations);\r\n return;\r\n }\r\n\r\n if (!this.conversations.find(item => item.id === this.activeId)) {\r\n this.activeId = this.conversations[0].id;\r\n }\r\n writeLocalConversations(this.conversations);\n this.loadActiveMessages();\n },\n togglePinnedConversation(conversationId) {\n const conversation = this.conversations.find(item => item.id === conversationId);\n if (!conversation) return;\n conversation.pinnedAt = Number(conversation.pinnedAt || conversation.top || 0) > 0 ? 0 : Date.now();\n conversation.top = conversation.pinnedAt;\n this.conversations = sortConversations(this.conversations);\n writeLocalConversations(this.conversations);\n },\n appendMessage(conversationId, message) {\r\n if (!this.messagesByConversation[conversationId]) {\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: []\r\n };\r\n }\r\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent')) {\r\n this.keepOptimisticMessage(conversationId, message);\r\n }\r\n if (!hasExactMessage(this.messagesByConversation[conversationId], message)) {\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: [...this.messagesByConversation[conversationId], message]\r\n };\r\n }\r\n this.updateConversationFromMessage(conversationId, message);\r\n this.syncVisibleMessages(conversationId);\r\n writeLocalConversations(this.conversations);\r\n },\r\n removeMessages(conversationId, messages) {\r\n const ids = new Set(messages.flatMap(message => [message.id, message.messageUid].filter(Boolean).map(String)));\r\n const filterMessages = list => (list || []).filter(message => {\r\n return ![message.id, message.messageUid].filter(Boolean).some(id => ids.has(String(id)));\r\n });\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: filterMessages(this.messagesByConversation[conversationId])\r\n };\r\n this.visibleMessagesByConversation = {\r\n ...this.visibleMessagesByConversation,\r\n [conversationId]: filterMessages(this.visibleMessagesByConversation[conversationId])\r\n };\r\n this.optimisticMessagesByConversation = {\r\n ...this.optimisticMessagesByConversation,\r\n [conversationId]: filterMessages(this.optimisticMessagesByConversation[conversationId])\r\n };\r\n this.selectedMessageIds = this.selectedMessageIds.filter(id => !ids.has(String(id)));\r\n },\r\n replaceLocalMessage(conversationId, targetMessage, nextMessage) {\r\n const keys = new Set([targetMessage.id, targetMessage.messageUid].filter(Boolean).map(String));\r\n const replaceInList = list => (list || []).map(message => {\r\n const matched = [message.id, message.messageUid].filter(Boolean).some(id => keys.has(String(id)));\r\n return matched ? { ...message, ...nextMessage } : message;\r\n });\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: replaceInList(this.messagesByConversation[conversationId])\r\n };\r\n this.visibleMessagesByConversation = {\r\n ...this.visibleMessagesByConversation,\r\n [conversationId]: replaceInList(this.visibleMessagesByConversation[conversationId])\r\n };\r\n },\r\n updateConversationFromMessage(conversationId, message) {\r\n const conversation = this.conversations.find(item => item.id === conversationId);\r\n if (!conversation) {\r\n return;\r\n }\r\n\r\n conversation.subtitle = message.text || conversation.subtitle || '';\r\n conversation.updatedAt = messageActivityTimestamp(message) || Date.now();\r\n if (message.direction === 'in') {\r\n conversation.unread = conversationId === this.activeId ? 0 : Number(conversation.unread || 0) + 1;\r\n }\r\n this.conversations = [...this.conversations]\r\n .sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0));\r\n },\r\n appendVisibleMessage(conversationId, message) {\r\n const messages = this.visibleMessagesByConversation[conversationId] || [];\r\n this.visibleMessagesByConversation = {\r\n ...this.visibleMessagesByConversation,\r\n [conversationId]: [...messages.filter(item => item.id !== message.id), message]\r\n .sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0))\r\n };\r\n },\r\n replaceMessage(conversationId, message) {\r\n if (!this.messagesByConversation[conversationId]) {\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: []\r\n };\r\n }\r\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent' || message.status === 'failed')) {\r\n this.keepOptimisticMessage(conversationId, message);\r\n }\r\n const index = this.messagesByConversation[conversationId].findIndex(item => item.id === message.id);\r\n if (index >= 0) {\r\n const messages = [...this.messagesByConversation[conversationId]];\r\n messages.splice(index, 1, message);\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: messages\r\n };\r\n } else {\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: [...this.messagesByConversation[conversationId], message]\r\n };\r\n }\r\n this.syncVisibleMessages(conversationId);\r\n },\r\n syncVisibleMessages(conversationId) {\r\n this.visibleMessagesByConversation = {\r\n ...this.visibleMessagesByConversation,\r\n [conversationId]: mergeVisibleMessages(\r\n this.optimisticMessagesByConversation[conversationId] || [],\r\n this.messagesByConversation[conversationId] || []\r\n )\r\n };\r\n },\r\n keepOptimisticMessage(conversationId, message) {\r\n if (!this.optimisticMessagesByConversation[conversationId]) {\r\n this.optimisticMessagesByConversation = {\r\n ...this.optimisticMessagesByConversation,\r\n [conversationId]: []\r\n };\r\n }\r\n const messages = this.optimisticMessagesByConversation[conversationId];\r\n const index = messages.findIndex(item => item.id === message.id);\r\n let nextMessages;\r\n if (index >= 0) {\r\n nextMessages = [...messages];\r\n nextMessages.splice(index, 1, message);\r\n } else {\r\n nextMessages = [...messages, message];\r\n }\r\n this.optimisticMessagesByConversation = {\r\n ...this.optimisticMessagesByConversation,\r\n [conversationId]: nextMessages\r\n };\r\n },\r\n pruneOptimisticMessages(conversationId, syncedMessages) {\r\n const messages = this.optimisticMessagesByConversation[conversationId] || [];\r\n if (!messages.length) {\r\n return;\r\n }\r\n this.optimisticMessagesByConversation = {\r\n ...this.optimisticMessagesByConversation,\r\n [conversationId]: messages.filter(message => {\r\n const remoteMatched = syncedMessages.some(syncedMessage => {\r\n return syncedMessage.id !== message.id && isSameMessage(syncedMessage, message);\r\n });\r\n if (remoteMatched && message.status !== 'failed') {\r\n return false;\r\n }\r\n return Date.now() - Number(message.displayTimestamp || message.timestamp || 0) < 30000 || message.status === 'failed';\r\n })\r\n };\r\n },\r\n loadActiveMessages(options = {}) {\r\n const syncOptions = typeof options === 'boolean'\r\n ? { allowReadReceipt: options }\r\n : options;\r\n const conversation = this.activeConversation;\r\n if (!conversation) {\r\n return;\r\n }\r\n this.loading = true;\r\n const messages = imClient.getMessages(conversation, 30);\r\n this.pruneOptimisticMessages(conversation.id, messages);\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversation.id]: mergeVisibleMessages(this.messagesByConversation[conversation.id] || [], messages)\r\n };\r\n this.syncVisibleMessages(conversation.id);\r\n this.loading = false;\r\n this.syncActiveMessages(syncOptions);\r\n },\r\n async syncActiveMessages(options = {}) {\r\n const conversation = this.activeConversation;\r\n if (!conversation) {\r\n return;\r\n }\r\n const wantsReadReceipt = Boolean(options.allowReadReceipt);\r\n const explicitReadReceipt = wantsReadReceipt && canMarkReadNow({ userAction: Boolean(options.userAction) });\r\n const pollingReadReceipt = canMarkReadNow();\r\n const markRead = explicitReadReceipt || pollingReadReceipt;\r\n\r\n if (this.syncInFlight) {\n if (wantsReadReceipt) {\r\n this.pendingReadReceiptConversationId = conversation.id;\r\n }\r\n return;\n }\r\n this.syncInFlight = true;\r\n const syncedConversationId = conversation.id;\r\n const previousMessages = this.messagesByConversation[syncedConversationId] || [];\r\n try {\r\n const messages = await imClient.fetchRemoteMessages(conversation, 50, {\n markRead,\n includeConversations: Boolean(options.includeConversations)\n });\n const remotePinnedKey = String(messages.pinnedMessageUid || '');\n if (remotePinnedKey) {\n const pinnedMessage = messages.find(item => messageStableKey(item) === remotePinnedKey);\n this.pinnedMessagesByConversation = {\n ...this.pinnedMessagesByConversation,\n [syncedConversationId]: pinnedMessage\n ? {\n key: remotePinnedKey,\n id: remotePinnedKey,\n text: messagePreviewText(pinnedMessage),\n type: pinnedMessage.type || 'text',\n attachment: pinnedMessage.attachment ? { ...pinnedMessage.attachment } : null,\n senderName: pinnedMessage.senderName || pinnedMessage.from || '',\n timestamp: Number(pinnedMessage.displayTimestamp || pinnedMessage.timestamp || Date.now())\n }\n : { key: remotePinnedKey, id: remotePinnedKey, text: '[置顶消息]' }\n };\n writePinnedMessages(this.pinnedMessagesByConversation);\n }\n const editedIncomingMessages = incomingEditedMessages(previousMessages, messages);\r\n this.pruneOptimisticMessages(syncedConversationId, messages);\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [syncedConversationId]: mergeVisibleMessages(this.messagesByConversation[syncedConversationId] || [], messages)\r\n };\r\n this.syncVisibleMessages(syncedConversationId);\r\n if (editedIncomingMessages.length && syncedConversationId === this.activeId) {\r\n this.focusMessage(editedIncomingMessages.sort((a, b) => messageActivityTimestamp(b) - messageActivityTimestamp(a))[0]);\r\n playNotificationSound();\r\n }\r\n const latest = messages.reduce((latestMessage, message) => {\r\n if (!latestMessage || messageActivityTimestamp(message) > messageActivityTimestamp(latestMessage)) {\r\n return message;\r\n }\r\n return latestMessage;\r\n }, null);\r\n if (latest) {\r\n conversation.subtitle = messagePreviewText(latest);\r\n conversation.updatedAt = messageActivityTimestamp(latest);\r\n writeLocalConversations(this.conversations);\r\n }\r\n } catch (error) {\r\n // Keep the local view usable if a polling request misses.\r\n } finally {\r\n this.syncInFlight = false;\r\n if (this.pendingReadReceiptConversationId === this.activeId && canMarkReadNow()) {\r\n this.pendingReadReceiptConversationId = '';\r\n window.setTimeout(() => this.syncActiveMessages({ allowReadReceipt: true }), 0);\r\n }\r\n }\n },\n scheduleActiveMessagesSync(options = {}, delay = 500) {\n if (!this.activeId || (typeof document !== 'undefined' && document.visibilityState !== 'visible')) {\n return;\n }\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => {\n this.syncAfterSendTimer = null;\n this.syncActiveMessages(options);\n }, Math.max(0, Number(delay) || 0));\n },\n startMessageSync() {\n this.bindReadPresenceEvents();\n if (!this.syncTimer) {\n this.syncTimer = window.setInterval(() => {\n if (document.visibilityState === 'visible' && !realtimeNotifications.isConnected()) {\n this.syncActiveMessages();\n }\n }, Math.max(250, appConfig.syncIntervalMs));\n }\n if (!this.conversationSyncTimer) {\n this.conversationSyncTimer = window.setInterval(() => {\n if (document.visibilityState === 'visible' && !realtimeNotifications.isConnected()) {\n this.refreshRemoteConversations();\n }\n }, Math.max(5000, appConfig.syncIntervalMs * 2));\n this.refreshRemoteConversations();\n }\n },\n handleRealtimeNotification() {\n window.clearTimeout(this.realtimeSyncTimer);\n this.realtimeSyncTimer = window.setTimeout(() => {\n this.refreshRemoteConversations();\n this.scheduleActiveMessagesSync({\n allowReadReceipt: canMarkReadNow(),\n includeConversations: true\n }, 300);\n }, 300);\n },\n bindReadPresenceEvents() {\r\n if (this.readPresenceEventsBound || typeof window === 'undefined' || typeof document === 'undefined') {\r\n return;\r\n }\r\n this.readPresenceEventsBound = true;\r\n const syncWhenReadable = () => {\n if (canMarkReadNow()) {\n this.refreshRemoteConversations();\n this.scheduleActiveMessagesSync({ allowReadReceipt: true }, 200);\n }\r\n };\r\n window.addEventListener('focus', syncWhenReadable);\r\n document.addEventListener('visibilitychange', syncWhenReadable);\r\n },\r\n async refreshRemoteConversations() {\r\n this.bindImEvents();\r\n this.usingDemoData = false;\r\n if (this.conversationSyncInFlight) {\r\n return;\r\n }\r\n this.conversationSyncInFlight = true;\r\n try {\r\n const remoteConversations = await imClient.fetchRemoteConversations(50);\r\n this.applyRemoteConversations(remoteConversations);\r\n } catch (error) {\r\n imClient.refreshConversationList();\r\n } finally {\r\n this.conversationSyncInFlight = false;\r\n }\r\n },\r\n setActionNotice(message) {\n this.actionNotice = message;\n this.actionError = '';\n window.clearTimeout(this.actionNoticeTimer);\n this.actionNoticeTimer = window.setTimeout(() => {\n this.actionNotice = '';\n this.actionNoticeTimer = null;\n }, 3000);\n },\n setActionError(message) {\n this.actionError = message;\n this.actionNotice = '';\n window.clearTimeout(this.actionNoticeTimer);\n },\n focusMessage(message) {\r\n const key = messageStableKey(message);\r\n if (!key) {\r\n return;\r\n }\r\n this.attentionMessageId = key;\r\n window.clearTimeout(this.attentionMessageTimer);\r\n this.attentionMessageTimer = window.setTimeout(() => {\r\n if (this.attentionMessageId === key) {\r\n this.attentionMessageId = '';\r\n }\r\n }, 2800);\r\n },\r\n async handleMessageAction({ action, message }) {\r\n if (!message) {\r\n return;\r\n }\r\n if (action === 'copy') {\r\n await this.copyMessages([message]);\r\n } else if (action === 'edit') {\r\n this.startEditMessage(message);\r\n } else if (action === 'delete') {\r\n this.deleteMessages([message]);\r\n } else if (action === 'forward') {\r\n this.startForward([message]);\r\n } else if (action === 'favorite') {\n this.toggleFavorite(message);\n } else if (action === 'pin') {\n this.togglePinnedMessage(message);\n } else if (action === 'detail') {\r\n await this.openMessageDetail(message);\r\n } else if (action === 'quote') {\r\n this.quoteMessage(message);\r\n } else if (action === 'select') {\r\n this.enterSelectionMode(message);\r\n } else if (action === 'recall') {\r\n await this.recallMessage(message);\r\n }\r\n },\r\n async openMessageDetail(message) {\r\n const conversation = this.activeConversation;\r\n if (!conversation || !message) {\r\n return;\r\n }\r\n const key = messageStableKey(message);\r\n this.messageDetailOpen = true;\r\n this.messageDetailLoading = true;\r\n this.messageDetailError = '';\r\n this.messageDetail = {\r\n messageUid: key,\r\n conversationType: conversation.type || conversation.raw?.type || 'single',\r\n sentAt: Number(message.displayTimestamp || message.timestamp || 0),\r\n editedAt: Number(message.editedAt || 0),\r\n recalled: isRecalledMessage(message),\r\n localOnly: true,\r\n sender: {\r\n uid: message.from || '',\r\n name: message.senderName || message.from || ''\r\n }\r\n };\r\n try {\r\n if (!/^\\d+$/.test(key)) {\r\n this.messageDetailError = '本地临时消息暂无送达/已读详情';\r\n return;\r\n }\r\n const detail = await imClient.getMessageDetail(conversation, message);\r\n this.messageDetail = detail || this.messageDetail;\r\n } catch (error) {\r\n this.messageDetailError = error.message || '消息详情加载失败';\r\n } finally {\r\n this.messageDetailLoading = false;\r\n }\r\n },\r\n closeMessageDetail() {\r\n this.messageDetailOpen = false;\r\n this.messageDetailLoading = false;\r\n this.messageDetailError = '';\r\n this.messageDetail = null;\r\n },\r\n async copyMessages(messages) {\r\n const text = messages.map(message => message.text || '').join('\\n');\r\n if (!text.trim()) {\r\n return;\r\n }\r\n try {\r\n await writeClipboard(text);\r\n this.setActionNotice(messages.length > 1 ? '已复制所选消息' : '已复制');\r\n } catch (error) {\r\n this.setActionError('复制失败');\r\n }\r\n },\r\n deleteMessages(messages) {\r\n const conversation = this.activeConversation;\r\n if (!conversation || !messages.length) {\r\n return;\r\n }\r\n imClient.hideMessages(conversation, messages);\r\n this.removeMessages(conversation.id, messages);\r\n if (!this.selectedMessageIds.length) {\r\n this.selectionMode = false;\r\n }\r\n this.setActionNotice(messages.length > 1 ? '已删除所选消息' : '已删除');\r\n },\r\n toggleFavorite(message) {\n const key = messageStableKey(message);\r\n if (!key) {\r\n return;\r\n }\r\n const index = this.favoriteMessages.findIndex(item => item.key === key);\r\n if (index >= 0) {\r\n this.favoriteMessages.splice(index, 1);\r\n if (this.activeFavoriteKey === key) {\r\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\r\n }\r\n this.setActionNotice('已取消收藏');\r\n } else {\r\n const conversation = this.conversations.find(item => item.id === message.conversationId) || {};\r\n this.favoriteMessages.unshift({\r\n key,\r\n id: message.id,\r\n messageUid: message.messageUid,\r\n conversationId: message.conversationId,\r\n conversationTitle: conversation.title || message.conversationTitle || '',\r\n type: message.type || 'text',\r\n text: message.text || '',\r\n preview: messagePreviewText(message),\r\n senderName: message.senderName || message.from || '',\r\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now()),\r\n editedAt: Number(message.editedAt || 0),\r\n recalled: isRecalledMessage(message),\r\n recallStatus: message.recallStatus || (isRecalledMessage(message) ? '已撤回' : ''),\r\n attachment: message.attachment ? { ...message.attachment } : null\r\n });\r\n this.activeFavoriteKey = key;\r\n this.setActionNotice('已收藏');\r\n }\r\n this.favoriteMessages = this.favoriteMessages.slice(0, 200);\r\n writeFavoriteMessages(this.favoriteMessages);\n },\n async togglePinnedMessage(message) {\n const conversationId = message?.conversationId || this.activeId;\n const key = messageStableKey(message);\n if (!conversationId || !key) return;\n const current = this.pinnedMessagesByConversation[conversationId];\n const next = { ...this.pinnedMessagesByConversation };\n if (current && current.key === key) {\n await imClient.setPinnedMessage(this.activeConversation, '').catch(error => this.setActionError(error.message || '取消置顶失败'));\n delete next[conversationId];\n this.setActionNotice('已取消置顶');\n } else {\n try {\n await imClient.setPinnedMessage(this.activeConversation, key);\n } catch (error) {\n this.setActionError(error.message || '置顶失败');\n return;\n }\n next[conversationId] = {\n key,\n id: key,\n text: messagePreviewText(message),\n type: message.type || 'text',\n attachment: message.attachment ? { ...message.attachment } : null,\n senderName: message.senderName || message.from || '',\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now())\n };\n this.setActionNotice('消息已置顶');\n }\n this.pinnedMessagesByConversation = next;\n writePinnedMessages(next);\n },\n async clearPinnedMessage() {\n await imClient.setPinnedMessage(this.activeConversation, '').catch(error => this.setActionError(error.message || '取消置顶失败'));\n const next = { ...this.pinnedMessagesByConversation };\n delete next[this.activeId];\n this.pinnedMessagesByConversation = next;\n writePinnedMessages(next);\n this.setActionNotice('已取消置顶');\n },\n setActiveFavorite(key) {\r\n this.activeFavoriteKey = String(key || '');\r\n },\r\n removeFavorite(key) {\r\n const value = String(key || '');\r\n if (!value) {\r\n return;\r\n }\r\n this.favoriteMessages = this.favoriteMessages.filter(message => message.key !== value);\r\n if (this.activeFavoriteKey === value) {\r\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\r\n }\r\n writeFavoriteMessages(this.favoriteMessages);\r\n },\r\n quoteMessage(message) {\r\n this.quotedMessage = {\r\n ...message,\r\n quoteText: quotePrefix(message)\r\n };\r\n this.setActionNotice('已引用,输入后发送');\r\n },\r\n cancelQuote() {\r\n this.quotedMessage = null;\r\n },\r\n enterSelectionMode(message = null) {\r\n this.selectionMode = true;\r\n if (message) {\r\n const key = messageStableKey(message);\r\n this.selectedMessageIds = key ? [key] : [];\r\n }\r\n },\r\n toggleSelectedMessage(message) {\r\n const key = messageStableKey(message);\r\n if (!key) {\r\n return;\r\n }\r\n const selected = new Set(this.selectedMessageIds);\r\n if (selected.has(key)) {\r\n selected.delete(key);\r\n } else {\r\n selected.add(key);\r\n }\r\n this.selectedMessageIds = Array.from(selected);\r\n this.selectionMode = this.selectedMessageIds.length > 0;\r\n },\r\n clearSelection() {\r\n this.selectionMode = false;\r\n this.selectedMessageIds = [];\r\n },\r\n copySelectedMessages() {\r\n return this.copyMessages(this.selectedMessages);\r\n },\r\n deleteSelectedMessages() {\r\n this.deleteMessages(this.selectedMessages);\r\n },\r\n startForward(messages) {\n this.forwardingMessages = messages.filter(message => message?.text || message?.attachment?.url);\n if (!this.forwardingMessages.length) {\r\n this.setActionError('没有可转发的消息');\r\n }\r\n },\r\n startForwardSelectedMessages() {\r\n this.startForward(this.selectedMessages);\r\n },\r\n cancelForward() {\r\n this.forwardingMessages = [];\r\n },\r\n startEditMessage(message) {\r\n const isResend = isRecalledMessage(message);\r\n if (!isResend && !message?.text) {\r\n this.setActionError('没有可编辑的文字内容');\r\n return;\r\n }\r\n this.editingMessage = message;\r\n this.editingText = message.text || '';\r\n this.editingMode = isResend ? 'resend' : 'edit';\r\n },\r\n cancelEditMessage() {\r\n this.editingMessage = null;\r\n this.editingText = '';\r\n this.editingMode = '';\r\n },\r\n async completeEditMessage() {\r\n const conversation = this.activeConversation;\r\n const message = this.editingMessage;\r\n const text = this.editingText.trim();\r\n const isResend = this.editingMode === 'resend' || isRecalledMessage(message);\r\n if (!conversation || !message) {\r\n this.cancelEditMessage();\r\n return;\r\n }\r\n if (!text) {\r\n this.setActionError('编辑内容不能为空');\r\n return;\r\n }\r\n if (!isResend && text === String(message.text || '').trim()) {\r\n this.cancelEditMessage();\r\n return;\r\n }\r\n try {\r\n if (isResend) {\r\n await this.sendTextToConversation(conversation, text);\r\n this.cancelEditMessage();\r\n this.setActionNotice('已重新发送');\r\n return;\r\n }\r\n const editedMessage = await imClient.editMessage(conversation, message, text);\r\n this.replaceLocalMessage(conversation.id, message, editedMessage);\r\n if (messageActivityTimestamp(editedMessage) >= Number(conversation.updatedAt || 0)) {\r\n conversation.subtitle = editedMessage.text;\r\n conversation.updatedAt = messageActivityTimestamp(editedMessage);\r\n writeLocalConversations(this.conversations);\r\n }\r\n this.cancelEditMessage();\r\n this.setActionNotice('已编辑');\r\n } catch (error) {\r\n this.setActionError(error.message || '编辑失败');\r\n }\r\n },\r\n async completeForward(targetConversationId) {\n const target = this.conversations.find(conversation => conversation.id === targetConversationId);\r\n if (!target || !this.forwardingMessages.length) {\r\n return;\r\n }\r\n try {\n for (const message of this.forwardingMessages) {\n if (message.attachment?.url) {\n const response = await fetch(imageDisplayUrl(message.attachment.url));\n if (!response.ok) throw new Error('图片读取失败');\n const blob = await response.blob();\n const type = message.attachment.type || message.type || 'file';\n const file = new File(\n [blob],\n message.attachment.name || (type === 'image' ? '转发图片.jpg' : '转发文件'),\n { type: message.attachment.mime || blob.type || 'application/octet-stream' }\n );\n const sent = await imClient.sendAttachmentMessage(target, { type, file, text: message.text || '' });\n if (sent?.status === 'failed') throw new Error(sent.error || '转发失败');\n } else if (message.text) {\n await this.sendTextToConversation(target, message.text);\n }\n }\n this.forwardingMessages = [];\n this.clearSelection();\r\n this.setActionNotice('已转发');\r\n } catch (error) {\r\n this.setActionError(error.message || '转发失败');\r\n }\r\n },\r\n async recallMessage(message) {\r\n const conversation = this.activeConversation;\r\n if (!conversation) {\r\n return;\r\n }\r\n try {\r\n await imClient.recallMessage(conversation, message);\r\n if (message.direction !== 'out') {\r\n this.removeMessages(conversation.id, [message]);\r\n this.setActionNotice('已撤回');\r\n this.syncActiveMessages();\r\n return;\r\n }\r\n this.replaceLocalMessage(conversation.id, message, {\r\n status: 'recalled',\r\n deliveryStatus: '',\r\n recalled: true,\r\n recallStatus: '已撤回'\r\n });\r\n this.setActionNotice('已撤回');\r\n } catch (error) {\r\n this.setActionError(error.message || '撤回失败');\r\n }\r\n },\r\n async createGroup(options = {}) {\r\n const session = useSessionStore();\r\n if (!session.userId) {\r\n this.setActionError('请先登录');\r\n return false;\r\n }\r\n try {\r\n const conversation = await imClient.createGroup(session.userId, options);\r\n this.upsertConversation(conversation);\r\n this.setActiveConversation(conversation.id);\r\n this.setActionNotice(options.channel ? '公告群已创建' : '群组已创建');\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || (options.channel ? '创建公告群失败' : '创建群组失败'));\r\n return false;\r\n }\r\n },\r\n async joinGroup(groupKey) {\r\n const session = useSessionStore();\r\n if (!session.userId) {\r\n this.setActionError('请先登录');\r\n return false;\r\n }\r\n try {\r\n const conversation = await imClient.joinGroup(session.userId, groupKey);\r\n this.upsertConversation(conversation);\r\n this.setActiveConversation(conversation.id);\r\n this.setActionNotice('已加入群组');\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || '加入群组失败');\r\n return false;\r\n }\r\n },\r\n async broadcastMessage(targetIds, text) {\r\n const session = useSessionStore();\r\n if (!session.userId) {\r\n this.setActionError('请先登录');\r\n return false;\r\n }\r\n try {\r\n const result = await imClient.broadcastMessage(session.userId, targetIds, text);\r\n const successCount = Number(result.successCount || 0);\r\n const failedCount = Number(result.failedCount || 0);\r\n this.setActionNotice(failedCount > 0 ? `已群发 ${successCount} 条,失败 ${failedCount} 条` : `已群发 ${successCount} 条`);\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || '群发失败');\r\n return false;\r\n }\r\n },\r\n async leaveGroup(conversation) {\r\n const session = useSessionStore();\r\n if (!session.userId || !conversation?.target) {\r\n this.setActionError('缺少群组信息');\r\n return false;\r\n }\r\n try {\r\n await imClient.leaveGroup(session.userId, conversation.target);\r\n this.removeConversation(conversation.id);\r\n this.setActionNotice('已退出群组');\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || '退出群组失败');\r\n return false;\r\n }\r\n },\r\n async dismissGroup(conversation) {\r\n const session = useSessionStore();\r\n if (!session.userId || !conversation?.target) {\r\n this.setActionError('缺少群组信息');\r\n return false;\r\n }\r\n try {\r\n await imClient.dismissGroup(session.userId, conversation.target);\r\n this.removeConversation(conversation.id);\r\n this.setActionNotice('群组已解散');\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || '解散群组失败');\r\n return false;\r\n }\r\n }\r\n }\r\n});\r\n","import { defineStore } from 'pinia';\r\n\r\nexport const useNavigationStore = defineStore('navigation', {\r\n state: () => ({\r\n section: 'messages'\r\n }),\r\n actions: {\r\n showMessages() {\r\n this.section = 'messages';\r\n },\r\n showContacts() {\r\n this.section = 'contacts';\r\n },\r\n showFavorites() {\r\n this.section = 'favorites';\r\n }\r\n }\r\n});\r\n","import { defineStore } from 'pinia';\nimport { imClient } from '@/services/imClient';\nimport { appConfig } from '@/config';\n\nconst STORAGE_KEY = 'qmt-web-im-session';\n\nfunction normalizeStoredPortrait(portrait) {\n return portrait || '';\n}\n\nfunction nextProfilePortrait(profilePortrait, currentPortrait) {\n return normalizeStoredPortrait(profilePortrait) || normalizeStoredPortrait(currentPortrait);\n}\n\nfunction inferAccountType(account) {\n return String(account || '').includes('@') ? 2 : 1;\n}\n\nexport const useSessionStore = defineStore('session', {\n state: () => ({\n isAuthenticated: false,\n connecting: false,\n connected: false,\n connectionStatusText: '未连接',\n userId: '',\n token: '',\n displayName: '',\n portrait: '',\n error: '',\n sdkVersion: '',\n eventsBound: false\n }),\n actions: {\n restore() {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) {\n return;\n }\n\n try {\n const session = JSON.parse(raw);\n if (session.appServer !== appConfig.appServer) {\n localStorage.removeItem(STORAGE_KEY);\n return;\n }\n\n if (session.userId && session.token) {\n if (!session.clientId) {\n localStorage.removeItem(STORAGE_KEY);\n return;\n }\n this.userId = session.userId;\n this.token = session.token;\n this.displayName = session.displayName || session.userId;\n this.portrait = normalizeStoredPortrait(session.portrait);\n this.isAuthenticated = true;\n imClient.restoreClientId(session.clientId);\n this.connect();\n this.refreshProfile();\n }\n } catch (error) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n\n async loginWithPassword(account, password, type = inferAccountType(account)) {\n this.error = '';\n this.connecting = true;\n try {\n const result = await imClient.loginWithPassword(account, password, type);\n this.applyLoginResult(result);\n await this.connect();\n } catch (error) {\n this.error = error.message || '登录失败';\n } finally {\n this.connecting = false;\n }\n },\n\n async loginWithCode(account, code) {\n this.error = '';\n this.connecting = true;\n try {\n const result = await imClient.loginWithCode(account, code);\n this.applyLoginResult(result);\n await this.connect();\n } catch (error) {\n this.error = error.message || '登录失败';\n } finally {\n this.connecting = false;\n }\n },\n\n async completePcSessionLogin(result) {\n this.error = '';\n this.connecting = true;\n try {\n this.applyLoginResult(result);\n await this.connect();\n } catch (error) {\n this.error = error.message || '扫码登录失败';\n } finally {\n this.connecting = false;\n }\n },\n\n async register(payload) {\n this.error = '';\n this.connecting = true;\n try {\n const result = await imClient.register(payload);\n this.applyLoginResult(result);\n await this.connect();\n return result;\n } catch (error) {\n this.error = error.message || '注册失败';\n return null;\n } finally {\n this.connecting = false;\n }\n },\n\n applyLoginResult(result) {\n this.userId = result.userId || result.uid || result.id || '';\n this.token = result.token || result.imToken || '';\n this.displayName = result.displayName || result.userName || result.name || this.userId;\n this.portrait = normalizeStoredPortrait(result.portrait);\n this.isAuthenticated = Boolean(this.userId && this.token);\n this.persistSession();\n },\n\n persistSession() {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n userId: this.userId,\n token: this.token,\n displayName: this.displayName,\n portrait: this.portrait,\n clientId: imClient.getClientId(),\n appServer: appConfig.appServer\n }));\n },\n\n applyProfile(profile) {\n if (!profile) {\n return;\n }\n this.userId = profile.userId || profile.uid || this.userId;\n this.displayName = profile.displayName || profile.name || this.displayName || this.userId;\n this.portrait = nextProfilePortrait(profile.portrait, this.portrait);\n this.persistSession();\n },\n\n async refreshProfile() {\n if (!this.userId) {\n return null;\n }\n try {\n const profile = await imClient.getProfile(this.userId);\n this.applyProfile(profile);\n return profile;\n } catch (error) {\n return null;\n }\n },\n\n async saveProfile({ displayName, portraitFile }) {\n if (!this.userId) {\n throw new Error('请先登录');\n }\n const profile = await imClient.updateProfile(this.userId, {\n displayName,\n portraitFile\n });\n this.applyProfile(profile);\n return profile;\n },\n\n async changePassword({ oldPassword, newPassword }) {\n if (!this.userId) {\n throw new Error('请先登录');\n }\n await imClient.changePassword({ oldPassword, newPassword });\n await this.logout();\n return true;\n },\n\n async resetPasswordWithCode({ mobile, resetCode, newPassword }) {\n await imClient.resetPasswordWithCode({ mobile, resetCode, newPassword });\n return true;\n },\n\n async connect() {\n if (!this.userId || !this.token) {\n return;\n }\n await imClient.ensureSdk();\n this.sdkVersion = imClient.getSdkVersion();\n this.bindImEvents();\n await imClient.connect(this.userId, this.token);\n },\n\n bindImEvents() {\n if (this.eventsBound) {\n return;\n }\n this.eventsBound = true;\n imClient.on('connectionStatusChanged', status => {\n this.connected = status.connected;\n this.connectionStatusText = status.statusText || (status.connected ? '已连接' : '未连接');\n });\n },\n\n async logout() {\n try {\n await imClient.logout?.();\n } catch (error) {\n this.error = error.message || '退出登录失败';\n } finally {\n imClient.disconnect();\n localStorage.removeItem(STORAGE_KEY);\n this.$reset();\n }\n }\n }\n});\n","import script from \"./App.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./App.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ChatShell.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ChatShell.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./LoginView.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./LoginView.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ChatPanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ChatPanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./MessageComposer.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./MessageComposer.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./MessageList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./MessageList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ContactPanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ContactPanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./FavoriteList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./FavoriteList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ContactList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ContactList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ConversationList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ConversationList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./NavigationRail.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./NavigationRail.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","export { default } from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./App.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./App.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatShell.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatShell.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoginView.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoginView.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatPanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatPanel.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageComposer.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageComposer.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactPanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactPanel.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoriteList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoriteList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ConversationList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ConversationList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./NavigationRail.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./NavigationRail.vue?vue&type=script&setup=true&lang=js\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// set .name for anonymous default exports per ES spec\n__webpack_require__.dn = function(x) {\n\t(Object.getOwnPropertyDescriptor(x, \"name\") || {}).writable || Object.defineProperty(x, \"name\", { value: \"default\", configurable: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkjc_web_im\"] = self[\"webpackChunkjc_web_im\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(1406); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["onMounted","LoginView","ChatShell","useSessionStore","session","restore","NavigationRail","ConversationList","ContactList","ChatPanel","ContactPanel","FavoriteList","FavoritePanel","useConversationStore","useNavigationStore","useContactStore","conversations","navigation","contacts","refreshRemoteConversations","refreshContacts","axios","jrQRCode","computed","onBeforeUnmount","reactive","ref","appConfig","imClient","QR_CODE_PREFIX_PC_SESSION","defaultPlatformLogo","view","loginMode","loginAccount","loginPassword","registerType","registerForm","number","code","password","confirmPassword","invitationCode","sendingCode","info","qrStatus","qrCodeImage","qrSessionToken","qrUserName","qrUserPortrait","qrGeneration","qrExpireTimer","defaultPlatformName","appName","platformName","platformLogo","canSubmitLogin","value","length","canRequestEmailCode","test","canSubmitRegister","qrUserInitial","String","slice","toUpperCase","qrStatusTitle","connecting","qrStatusText","qrRefreshText","loadPlatformConfig","stopQrLogin","clearFormMessage","error","setLoginMode","mode","startQrLogin","submitLogin","type","loginWithPassword","switchRegisterType","requestEmailCode","requestAuthCode","message","submitRegister","result","register","openRegister","backToLogin","resetQrState","clearQrExpireTimer","window","clearTimeout","refreshQrLogin","force","includes","generation","pcSession","createPcSession","token","Error","getQrBase64","expireMs","Math","max","min","Number","expired","setTimeout","isAuthenticated","pollQrLogin","payload","loginWithPcSession","data","status","imToken","completePcSessionLogin","userName","displayName","portrait","delay","ms","Promise","resolve","response","get","platformConfigApi","withCredentials","config","name","trim","logo","logoUrl","version","resolveBrandLogo","applyDocumentBrand","appendBrandVersion","startsWith","location","protocol","base","adminServer","URL","toString","url","parsed","href","searchParams","set","document","title","icon","querySelector","createElement","setAttribute","head","appendChild","handleBrandLogoError","watch","MessageList","MessageComposer","imageDisplayUrl","activeConversation","pinnedMessageIsImage","activePinnedMessage","attachment","pinnedMessageText","text","groupMenuOpen","singleProfileOpen","singleAliasDraft","singleProfileSaving","singleProfileNotice","singleProfileError","groupPanel","groupBusy","groupDetail","groupMembers","groupAliasDraft","manageSection","selectedAdminIds","selectedKickIds","transferTargetId","profileDraft","announcement","welcomeText","muteDraft","scheduleType","startsAtLocal","endsAtLocal","dailyStart","dailyEnd","muteSaveNotice","muteSaveError","singlePeerId","isGroupConversation","target","raw","id","replace","singleContact","peerId","find","contact","uid","singleProfile","conversation","rawUser","alias","rawName","userId","mobile","address","avatarText","groupDisplayId","groupId","currentGroupRole","myRole","role","isGroupOwner","canManageGroup","adminCandidateMembers","filter","member","transferableMembers","messageDetail","messageDetailGroup","group","isMessageDetailGroup","conversationType","Boolean","messageDetailCounts","counts","read","unread","undelivered","total","kickCandidateMembers","statusText","canSendActiveConversation","connectionStatusText","connected","formatDetailTime","timestamp","Intl","DateTimeFormat","year","month","day","hour","minute","second","hour12","timeZone","resolvedOptions","format","detailMemberName","detailMemberAvatar","detailRoleLabel","closeGroupMenu","toggleGroupMenu","openSingleProfile","then","catch","closeSingleProfile","saveSingleAlias","ok","updateContactAlias","actionError","refreshedContact","nextTitle","upsertConversation","handleSenderProfileUpdated","syncActiveMessages","allowReadReceipt","loadGroupMembers","closeGroupPanel","clearMuteSaveFeedback","loadGroupDetail","getGroupDetail","setActionError","openGroupOverview","openGroupMembers","getGroupMembers","map","openGroupAlias","detail","myAlias","msToLocalInput","date","Date","local","getTime","getTimezoneOffset","toISOString","localInputToMs","prepareManagementDrafts","setting","muteSetting","startsAtMs","endsAtMs","openGroupManage","openTransferGroup","saveGroupAlias","updateGroupAlias","setActionNotice","toggleAdmin","selected","Set","has","delete","add","Array","from","toggleKick","saveGroupAdmins","setGroupAdmins","saveGroupProfile","updateGroupProfile","updatedAt","now","kickSelectedMembers","confirm","kickGroupMembers","removed","removedIds","saveMuteSetting","updateGroupMuteSetting","leaveCurrentGroup","leaveGroup","dismissCurrentGroup","dismissGroup","transferCurrentGroup","transferGroup","memberAvatar","addEventListener","removeEventListener","props","__props","emit","__emit","emojiOpen","dropActive","textareaEl","imageInput","fileInput","dragDepth","emojiList","submit","toggleEmojiPicker","insertEmoji","emoji","element","start","selectionStart","end","selectionEnd","requestAnimationFrame","focus","cursor","setSelectionRange","chooseImage","click","chooseFile","attachmentTypeForFile","file","fallbackType","emitFiles","files","disabled","validFiles","File","size","caption","forEach","index","selectAttachment","event","input","hasDraggedFiles","types","dataTransfer","handleDragEnter","dropEffect","handleDragOver","handleDragLeave","filesFromDataTransfer","items","item","kind","webkitGetAsEntry","isDirectory","getAsFile","handleDrop","imageFilesFromClipboard","clipboardData","handlePaste","imageFiles","preventDefault","nextTick","IMAGE_MIN_SCALE","IMAGE_MAX_SCALE","listEl","viewerStage","contextMenu","visible","x","y","imageViewer","sourceUrl","scale","rotation","offsetX","offsetY","dragging","dragStartX","dragStartY","dragOffsetX","dragOffsetY","senderProfile","roleLabel","contactAlias","groupAlias","isContact","aliasDraft","saving","adding","notice","imageViewerStyle","transform","viewerImages","messages","isImageMessage","menuItems","isOwnMessage","direction","isRecalledMessage","action","label","favoriteLabel","isFavorite","pinnedLabel","pinnedMessageId","messageIdentity","unshift","push","canRecallOthers","scrollToBottom","scrollTop","scrollHeight","scrollToMessage","messageId","row","querySelectorAll","dataset","messageKey","scrollIntoView","block","behavior","deliveryStatus","messageUid","recalled","join","immediate","attentionMessageId","closeMenu","closeMenuOnEscape","moveImageDrag","stopImageDrag","canOpenMessageMenu","isSelected","selectedMessageIds","favoriteMessageIds","isAttention","isRecallNotice","isFileMessage","isVideoMessage","contentType","isRedPacketMessage","redPacketPayload","isRedPacketReceipt","isSystemMessage","systemMessageText","redPacketReceiptText","receiverName","senderName","packetSenderName","redPacketSenderName","nearestRedPacketSenderName","receiptMessage","receiptIndex","findIndex","candidate","redPacket","JSON","parse","redPackets","redPacketBlessing","blessing","isGroupMessage","showGroupSender","senderRoleLabel","senderRole","groupSenderName","groupSenderAvatarText","openSenderProfile","profile","cachedContact","cachedAlias","remarkAlias","senderPortrait","closeSenderProfile","addSenderAsContact","addContact","aliasSaved","saveSenderAlias","roleBubbleClass","formatFileSize","bytes","toFixed","handleMessageClick","selectionMode","handleImageClick","openImageViewer","showViewerImage","images","closeImageViewer","normalizedIndex","resetImageViewer","showPreviousImage","showNextImage","clampImageScale","setImageScale","originX","originY","previousScale","nextScale","rect","getBoundingClientRect","centerX","left","width","centerY","top","height","ratio","zoomImage","delta","rotateImage","handleImageWheel","factor","deltaY","clientX","clientY","startImageDrag","saveViewerImage","downloadUrl","origin","link","download","body","remove","openMenu","innerWidth","innerHeight","key","chooseMenuAction","formatTime","deliveryState","state","deliveryTitle","failureText","errorCode","activeContact","remarkName","username","editingAlias","aliasSaving","aliasError","openAliasEditor","closeAliasEditor","submitAlias","activeKey","activeFavorite","favoriteTitle","conversationTitle","entry","conversationId","favoritePreview","recallStatus","preview","formatFavoriteTime","favorite","clearFeedback","favoriteText","isImageFavorite","isFileFavorite","favoriteCopyText","copyFavorite","writeClipboard","copyError","navigator","clipboard","writeText","style","position","select","execCommand","removeChild","openConversation","showMessages","setActiveConversation","focusMessage","removeFavorite","keyword","addingContact","addKeyword","filteredContacts","toLowerCase","subtitle","openAddContact","actionInfo","closeAddContact","submitAddContact","added","defineComponent","h","actionMenuOpen","activeAction","actionBusy","searchKeyword","groupName","groupAnnouncement","groupWelcomeText","joinGroupKey","broadcastText","channelName","channelAnnouncement","contactKeyword","selectedContactIds","conversationMenu","actionTitles","createGroup","joinGroup","broadcast","createChannel","submitLabels","actionTitle","submitLabel","modalError","modalInfo","actionNotice","normalizedSearchKeyword","contactsByUid","Map","filteredConversationItems","conversationResult","conversationResults","matchesConversation","contactForConversation","conversationTargets","conversationTarget","contactResults","matchesContact","contactResult","submitDisabled","isPinned","resultKind","pinnedAt","openConversationMenu","closeConversationMenu","togglePinned","togglePinnedConversation","ContactPicker","default","selectedIds","emptyText","emits","setup","class","placeholder","onInput","onClick","src","alt","searchableValues","values","flatMap","isArray","Object","matchesKeyword","compactKeyword","some","group_id","owner_uid","friendAlias","rawFriend","resultKey","isListItemActive","activeId","selectListItem","openChat","clearStoreMessages","resetActionFields","toggleActionMenu","closeActionMenu","openAction","closeActionModal","toggleContact","contactId","submitAction","memberIds","broadcastMessage","channel","formatUnread","count","CROP_OUTPUT_SIZE","settingsItems","initials","settingsOpen","settingsSection","passwordSaving","settingsNotice","settingsError","profileOpen","profileSaving","profileNotice","profileError","profileFile","profilePreview","portraitInput","cropperCanvas","cropperPreviewCanvas","passwordDraft","oldPassword","newPassword","currentAvatarUrl","activeSettingsItem","avatarPreviewViewer","open","avatarCropper","loaded","busy","objectUrl","fileName","image","baseScale","avatarPreviewStyle","refreshProfile","drawAvatarCropper","revokeProfilePreview","closeAvatarCropper","showContacts","clearProfileFeedback","clearSettingsFeedback","resetPasswordDraft","openSettings","closeSettings","selectSettingsSection","section","revokeObjectURL","revokeCropperObjectUrl","openProfileEditor","closeProfileEditor","closeAvatarPreview","selectPortrait","openAvatarCropper","choosePortraitFile","openAvatarPreview","resetAvatarPreview","zoomAvatarPreview","handleAvatarPreviewWheel","startAvatarPreviewDrag","currentTarget","setPointerCapture","pointerId","moveAvatarPreviewDrag","stopAvatarPreviewDrag","dropPortrait","cropperStageSize","canvas","round","cropperBoxSize","rotatedImageSize","quarterTurn","abs","naturalHeight","naturalWidth","clampCropperOffset","cropSize","rotated","scaledWidth","scaledHeight","maxX","maxY","updateCropperBaseScale","drawCanvasImage","outputScale","cropOnly","dpr","devicePixelRatio","context","getContext","setTransform","clearRect","fillStyle","fillRect","save","translate","rotate","PI","drawImage","beginPath","fill","previewCanvas","resetCropperTransform","createObjectURL","Image","onload","onerror","zoomCropper","rotateCropper","degrees","handleCropperWheel","startCropperDrag","moveCropperDrag","stopCropperDrag","canvasToBlob","quality","reject","toBlob","blob","confirmAvatarCrop","outputCanvas","croppedFile","saveProfile","portraitFile","savePassword","changePassword","logout","clearContacts","currentHost","hostname","runtimeConfig","JC_WEB_IM_CONFIG","appServerOrigin","qrAppServerOrigin","adminServerOrigin","process","env","VUE_APP_ADMIN_SERVER","appServer","VUE_APP_APP_SERVER","qrAppServer","VUE_APP_QR_APP_SERVER","VUE_APP_PLATFORM_CONFIG_API","NODE_ENV","registerConfigApi","VUE_APP_REGISTER_CONFIG_API","registerPhoneExistsApi","VUE_APP_REGISTER_PHONE_EXISTS_API","contactsApi","VUE_APP_CONTACTS_API","updateAliasApi","VUE_APP_UPDATE_ALIAS_API","addContactApi","VUE_APP_ADD_CONTACT_API","conversationActionsApi","VUE_APP_CONVERSATION_ACTIONS_API","sendMessageApi","VUE_APP_SEND_MESSAGE_API","messageActionApi","VUE_APP_MESSAGE_ACTION_API","messageDetailApi","VUE_APP_MESSAGE_DETAIL_API","messagesApi","VUE_APP_MESSAGES_API","profileApi","VUE_APP_PROFILE_API","changePasswordApi","VUE_APP_CHANGE_PASSWORD_API","logoutApi","VUE_APP_LOGOUT_API","imServerHost","VUE_APP_IM_SERVER_HOST","imRoutePort","VUE_APP_IM_ROUTE_PORT","useWss","VUE_APP_USE_WSS","wsPath","VUE_APP_WS_PATH","wsUrl","VUE_APP_WS_URL","sdkMode","VUE_APP_IM_MODE","syncIntervalMs","VUE_APP_SYNC_INTERVAL_MS","sseEnabled","VUE_APP_SSE_ENABLED","sseTicketApi","VUE_APP_SSE_TICKET_API","sseUrl","VUE_APP_SSE_URL","platform","clientIdStorageKey","authTokenStoragePrefix","createApp","createPinia","App","use","mount","AES_KEY","ENCRYPTION_EXCLUDE_PATHS","AUTH_STORAGE_KEY","AUTH_ERROR_CODE","REFRESH_ERROR_CODE","importedCryptoKeyPromise","refreshPromise","storageScope","readAuthStore","localStorage","getItem","writeAuthStore","store","setItem","stringify","normalizeAuthBundle","bundle","accessToken","refreshToken","tokenType","accessTokenExpireIn","accessTokenExpireAt","refreshTokenExpireIn","refreshTokenExpireAt","getStoredAppAuth","persistAppAuth","normalized","clearStoredAppAuth","hasFormData","FormData","absoluteUrl","shouldEncrypt","pathname","path","shouldAttachAuth","skipAuth","textEncoder","TextEncoder","textDecoder","TextDecoder","bytesToBase64","binary","byte","fromCharCode","btoa","base64ToBytes","base64","atob","Uint8Array","charCodeAt","getCryptoKey","crypto","subtle","importKey","encode","encryptPayload","plainText","iv","getRandomValues","encrypted","encrypt","decryptPayload","cipherText","ivBase64","encryptedBase64","split","decrypted","decrypt","decode","normalizeBusinessResponse","decodeResponsePayload","headers","client","create","interceptors","request","nextConfig","auth","Authorization","method","plainBody","floor","refreshAccessToken","post","finally","_retriedAfterRefresh","appServerRequest","appServerGet","appServerPost","HttpImClient","inferAccountType","account","unwrapData","unwrapMessage","fallback","msg","DocumentedHttpImClient","unsupported","feature","clientId","getClientId","email","loginWithCode","flag","device_name","encodeURIComponent","postError","persistAppToken","resetPasswordWithCode","resetCode","fetchRemoteConversations","fetchRemoteMessages","getServerContactList","getProfile","sendTextMessage","sendAttachmentMessage","updateProfile","recallMessage","editMessage","getMessageDetail","LOCAL_MESSAGE_STORAGE_KEY","LOCAL_HIDDEN_MESSAGE_STORAGE_KEY","LOCAL_RECALLED_MESSAGE_STORAGE_KEY","scopedStorageKey","baseKey","scope","randomId","randomUUID","replaceAll","random","readLocalMessages","readMessageSet","storageKey","writeMessageSet","messagesByConversation","messageKeys","hasStoredMessage","stored","ids","storeMessageKeys","withRecalledState","applyLocalMessageState","isRecalled","writeLocalMessages","saveLocalMessage","splice","mergeSyncedMessages","localMessages","remoteMessages","visibleLocalMessages","localByKey","visibleRemoteMessages","remoteMessage","localMessage","remoteKeys","hasRemoteMatch","pendingLocalMessages","sort","a","b","displayTimestamp","getTitle","getUniqueEquipment","allowedDevices","canUseLocalLoginFallback","constructor","listeners","currentUser","restoreClientId","getSdkVersion","ensureSdk","localOnly","registerWithPhone","deviceId","uniqueEquipment","connect","refreshConversationList","disconnect","getConversationList","remoteConversations","limit","line","getMessages","options","markRead","includeConversations","pinnedMessageUid","remoteConversation","setPinnedMessage","hideMessages","markMessagesRecalled","nextText","editedMessage","editedAt","activityTimestamp","initialMessage","sender","sentMessage","serverTimestamp","failedMessage","mime","formData","append","getContactList","getAppAuthHeaders","mapContact","localeCompare","reason","normalizeConversation","groupKey","targetIds","members","targetUserId","adminIds","targetId","resetPasswordApi","refreshContactList","createSingleConversation","userInfo","friend","on","eventName","handler","off","appToken","authtoken","authToken","getUrlHost","host","LongConnectionImClient","UnsupportedWildfireImClient","WildfireImClient","HEARTBEAT_INTERVAL_MS","RECONNECT_MIN_MS","RECONNECT_MAX_MS","buildWsUrl","port","normalizeConversationId","to","receiver","normalizeIncomingMessage","currentUserId","fromUser","content","searchableContent","socket","heartbeatTimer","reconnectTimer","reconnectAttempts","manualClose","shouldUseMessagePolling","WebSocket","openSocket","clearReconnectTimer","clearHeartbeatTimer","close","readyState","OPEN","sendAuthFrame","CONNECTING","binaryType","scheduleReconnect","onopen","startHeartbeat","onmessage","handleFrame","onclose","sendFrame","frame","send","rawData","ArrayBuffer","cmd","setInterval","clearInterval","configuredProxyHosts","configured","mediaProxyHosts","source","proxyUrl","RealtimeNotificationClient","reconnectAttempt","isConnected","stop","ticket","separator","endpoint","socketUrl","realtimeNotifications","defineStore","CONTACT_CACHE_MS","normalizeContacts","unique","loading","eventsBound","refreshSerial","loadedForUserId","loadedAt","getters","actions","bindImEvents","requestUserId","serial","serverContacts","latest","nextAlias","savedAlias","setActiveContact","LOCAL_CONVERSATION_STORAGE_KEY","LOCAL_FAVORITE_MESSAGES_KEY","LOCAL_PINNED_MESSAGES_KEY","readFavoriteMessages","writeFavoriteMessages","readLocalConversations","writeLocalConversations","readPinnedMessages","writePinnedMessages","sortConversations","right","leftPinned","rightPinned","messageStableKey","messageActivityTimestamp","attachmentLabel","messagePreviewText","quotePrefix","isSameMessage","hasExactMessage","canMarkReadNow","visibilityState","userAction","normalizeMessageForDisplay","labels","mergeVisibleMessages","currentMessages","syncedMessages","merged","currentMessage","exists","shouldKeepLocal","incomingEditedMessages","previousMessages","nextMessages","previousByKey","previous","notificationAudioContext","playNotificationSound","AudioContext","webkitAudioContext","resume","oscillator","createOscillator","gain","createGain","startAt","currentTime","frequency","setValueAtTime","exponentialRampToValueAtTime","destination","visibleMessagesByConversation","usingDemoData","syncTimer","conversationSyncTimer","readPresenceEventsBound","syncInFlight","pendingReadReceiptConversationId","conversationSyncInFlight","syncAfterSendTimer","optimisticMessagesByConversation","quotedMessage","forwardingMessages","editingMessage","editingText","editingMode","messageDetailOpen","messageDetailLoading","messageDetailError","attentionMessageTimer","favoriteMessages","pinnedMessagesByConversation","activeFavoriteKey","actionNoticeTimer","realtimeSyncTimer","activeMessages","totalUnread","reduce","sum","pinned","selectedMessages","bootstrapDemoData","clearUserState","loadScopedLocalState","startMessageSync","handleRealtimeNotification","appendMessage","scheduleActiveMessagesSync","replaceMessage","applyRemoteConversations","loadActiveMessages","sendText","appendVisibleMessage","sendAttachment","sendTextToConversation","removeConversation","removedMessages","removedVisibleMessages","removedOptimisticMessages","remote","keepOptimisticMessage","updateConversationFromMessage","syncVisibleMessages","removeMessages","filterMessages","list","replaceLocalMessage","targetMessage","nextMessage","keys","replaceInList","matched","pruneOptimisticMessages","remoteMatched","syncedMessage","syncOptions","wantsReadReceipt","explicitReadReceipt","pollingReadReceipt","syncedConversationId","remotePinnedKey","pinnedMessage","editedIncomingMessages","latestMessage","bindReadPresenceEvents","syncWhenReadable","handleMessageAction","copyMessages","startEditMessage","deleteMessages","startForward","toggleFavorite","togglePinnedMessage","openMessageDetail","quoteMessage","enterSelectionMode","sentAt","closeMessageDetail","current","next","clearPinnedMessage","setActiveFavorite","quoteText","cancelQuote","toggleSelectedMessage","clearSelection","copySelectedMessages","deleteSelectedMessages","startForwardSelectedMessages","cancelForward","isResend","cancelEditMessage","completeEditMessage","completeForward","targetConversationId","fetch","sent","successCount","failedCount","showFavorites","STORAGE_KEY","normalizeStoredPortrait","nextProfilePortrait","profilePortrait","currentPortrait","sdkVersion","removeItem","applyLoginResult","persistSession","applyProfile","$reset"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/js/app.1158390e.js b/dist/js/app.21e75967.js
similarity index 81%
rename from dist/js/app.1158390e.js
rename to dist/js/app.21e75967.js
index c2a18d3..e0b8631 100644
--- a/dist/js/app.1158390e.js
+++ b/dist/js/app.21e75967.js
@@ -49,6 +49,7 @@
/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(7566);
/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(1414);
/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(9045);
+/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(6384);
const _hoisted_1 = {
class: "app-shell"
@@ -64,12 +65,25 @@ const _hoisted_1 = {
+
/* harmony default export */ __webpack_exports__.A = ({
__name: 'ChatShell',
setup(__props) {
const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_9__/* .useConversationStore */ .w)();
const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_10__/* .useNavigationStore */ .l)();
const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_11__/* .useContactStore */ .p)();
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_12__/* .useAutoDismiss */ .R)(() => conversations.actionError || conversations.actionNotice, value => {
+ if ((conversations.actionError || conversations.actionNotice) === value) {
+ conversations.actionError = '';
+ conversations.actionNotice = '';
+ }
+ });
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_12__/* .useAutoDismiss */ .R)(() => contacts.actionError || contacts.actionInfo, value => {
+ if ((contacts.actionError || contacts.actionInfo) === value) {
+ contacts.actionError = '';
+ contacts.actionInfo = '';
+ }
+ });
(0,vue__WEBPACK_IMPORTED_MODULE_0__/* .onMounted */ .sV)(() => {
conversations.refreshRemoteConversations();
contacts.refreshContacts();
@@ -109,6 +123,7 @@ const _hoisted_1 = {
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(2169);
/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(926);
/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(5051);
+/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(6384);
const _hoisted_1 = {
@@ -183,6 +198,7 @@ const _hoisted_25 = {
+
const QR_CODE_PREFIX_PC_SESSION = 'wildfirechat://pcsession/';
const defaultPlatformLogo = '/favicon.ico';
/* harmony default export */ __webpack_exports__.A = ({
@@ -203,6 +219,12 @@ const defaultPlatformLogo = '/favicon.ico';
});
const sendingCode = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)(false);
const info = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)('');
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_10__/* .useAutoDismiss */ .R)(() => session.error, value => {
+ if (session.error === value) session.error = '';
+ });
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_10__/* .useAutoDismiss */ .R)(info, value => {
+ if (info.value === value) info.value = '';
+ });
const qrStatus = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)('idle');
const qrCodeImage = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)('');
const qrSessionToken = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)('');
@@ -671,33 +693,43 @@ const defaultPlatformLogo = '/favicon.ico';
/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);
/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(116);
/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_3__);
-/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1701);
-/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7642);
-/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_5__);
-/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(8004);
-/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_6__);
-/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(3853);
-/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_7__);
-/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5876);
-/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_8__);
-/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(2475);
-/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_9__);
-/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(5024);
-/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_10__);
-/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(1698);
-/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_11__);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(5130);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(6768);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(144);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(5187);
-/* harmony import */ var _MessageList_vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(9847);
-/* harmony import */ var _MessageComposer_vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(1653);
-/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(5051);
-/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(7566);
-/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(9045);
-/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(926);
-/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(446);
+/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7588);
+/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1701);
+/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(5367);
+/* harmony import */ var core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_js__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(2731);
+/* harmony import */ var core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_map_get_or_insert_computed_js__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(7642);
+/* harmony import */ var core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_difference_v2_js__WEBPACK_IMPORTED_MODULE_8__);
+/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(8004);
+/* harmony import */ var core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_intersection_v2_js__WEBPACK_IMPORTED_MODULE_9__);
+/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(3853);
+/* harmony import */ var core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_disjoint_from_v2_js__WEBPACK_IMPORTED_MODULE_10__);
+/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(5876);
+/* harmony import */ var core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_subset_of_v2_js__WEBPACK_IMPORTED_MODULE_11__);
+/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(2475);
+/* harmony import */ var core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_is_superset_of_v2_js__WEBPACK_IMPORTED_MODULE_12__);
+/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(5024);
+/* harmony import */ var core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_symmetric_difference_v2_js__WEBPACK_IMPORTED_MODULE_13__);
+/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(1698);
+/* harmony import */ var core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_set_union_v2_js__WEBPACK_IMPORTED_MODULE_14__);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(5130);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(6768);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(144);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(5187);
+/* harmony import */ var _MessageList_vue__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(9847);
+/* harmony import */ var _MessageComposer_vue__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(1653);
+/* harmony import */ var _services_imClient__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(5051);
+/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(7566);
+/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(9045);
+/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(926);
+/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(6384);
+/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(446);
+
+
+
@@ -788,7 +820,7 @@ const _hoisted_26 = {
key: 0,
class: "message-detail-member-list"
};
-const _hoisted_27 = ["src"];
+const _hoisted_27 = ["src", "onError"];
const _hoisted_28 = {
key: 1,
class: "conversation-avatar"
@@ -814,7 +846,7 @@ const _hoisted_34 = {
key: 0,
class: "message-detail-member-list"
};
-const _hoisted_35 = ["src"];
+const _hoisted_35 = ["src", "onError"];
const _hoisted_36 = {
key: 1,
class: "conversation-avatar"
@@ -840,7 +872,7 @@ const _hoisted_42 = {
key: 0,
class: "message-detail-member-list"
};
-const _hoisted_43 = ["src"];
+const _hoisted_43 = ["src", "onError"];
const _hoisted_44 = {
key: 1,
class: "conversation-avatar"
@@ -871,33 +903,33 @@ const _hoisted_52 = {
class: "group-profile"
};
const _hoisted_53 = {
- key: 0
-};
-const _hoisted_54 = {
class: "single-profile-footer"
};
-const _hoisted_55 = {
+const _hoisted_54 = {
key: 0,
class: "inline-save-status"
};
-const _hoisted_56 = {
+const _hoisted_55 = {
key: 1,
class: "inline-save-status error"
};
+const _hoisted_56 = ["disabled"];
const _hoisted_57 = ["disabled"];
-const _hoisted_58 = ["disabled"];
-const _hoisted_59 = {
+const _hoisted_58 = {
key: 0,
class: "group-dialog"
};
-const _hoisted_60 = {
+const _hoisted_59 = {
key: 0,
class: "group-loading"
};
-const _hoisted_61 = {
+const _hoisted_60 = {
key: 1,
class: "group-profile"
};
+const _hoisted_61 = {
+ key: 0
+};
const _hoisted_62 = ["disabled"];
const _hoisted_63 = ["disabled"];
const _hoisted_64 = ["disabled"];
@@ -913,7 +945,7 @@ const _hoisted_67 = {
key: 1,
class: "group-member-list"
};
-const _hoisted_68 = ["src"];
+const _hoisted_68 = ["src", "onError"];
const _hoisted_69 = {
key: 1,
class: "conversation-avatar"
@@ -936,7 +968,7 @@ const _hoisted_74 = {
class: "group-member-list"
};
const _hoisted_75 = ["onClick"];
-const _hoisted_76 = ["src"];
+const _hoisted_76 = ["src", "onError"];
const _hoisted_77 = {
key: 1,
class: "conversation-avatar"
@@ -965,7 +997,7 @@ const _hoisted_84 = {
class: "group-member-list"
};
const _hoisted_85 = ["checked", "onChange"];
-const _hoisted_86 = ["src"];
+const _hoisted_86 = ["src", "onError"];
const _hoisted_87 = {
key: 1,
class: "conversation-avatar"
@@ -986,7 +1018,7 @@ const _hoisted_91 = {
class: "group-member-list"
};
const _hoisted_92 = ["checked", "onChange"];
-const _hoisted_93 = ["src"];
+const _hoisted_93 = ["src", "onError"];
const _hoisted_94 = {
key: 1,
class: "conversation-avatar"
@@ -1028,18 +1060,19 @@ const _hoisted_103 = ["disabled"];
+
/* harmony default export */ __webpack_exports__.A = ({
__name: 'ChatPanel',
setup(__props) {
- const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_19__/* .useConversationStore */ .w)();
- const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_20__/* .useContactStore */ .p)();
- const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_21__/* .useSessionStore */ .B)();
- const activeConversation = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => conversations.activeConversation);
- const pinnedMessageIsImage = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_22__/* .useConversationStore */ .w)();
+ const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_23__/* .useContactStore */ .p)();
+ const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_24__/* .useSessionStore */ .B)();
+ const activeConversation = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => conversations.activeConversation);
+ const pinnedMessageIsImage = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
const message = conversations.activePinnedMessage;
return message?.attachment?.url && (message.type === 'image' || message.attachment.type === 'image');
});
- const pinnedMessageText = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const pinnedMessageText = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
const message = conversations.activePinnedMessage;
if (!message) return '';
const text = String(message.text || '').trim();
@@ -1050,27 +1083,27 @@ const _hoisted_103 = ["disabled"];
if (attachment.url) return attachment.name || '文件';
return '[消息]';
});
- const groupMenuOpen = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)(false);
- const singleProfileOpen = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)(false);
- const singleAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const singleProfileSaving = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)(false);
- const singleProfileNotice = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const singleProfileError = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const groupPanel = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const groupBusy = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)(false);
- const groupDetail = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)(null);
- const groupMembers = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)([]);
- const groupAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const manageSection = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const selectedAdminIds = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)([]);
- const selectedKickIds = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)([]);
- const transferTargetId = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const profileDraft = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)({
+ const groupMenuOpen = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)(false);
+ const singleProfileOpen = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)(false);
+ const singleAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ const singleProfileSaving = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)(false);
+ const singleProfileNotice = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ const singleProfileError = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ const groupPanel = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ const groupBusy = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)(false);
+ const groupDetail = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)(null);
+ const groupMembers = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)([]);
+ const groupAliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ const manageSection = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ const selectedAdminIds = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)([]);
+ const selectedKickIds = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)([]);
+ const transferTargetId = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ const profileDraft = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)({
name: '',
announcement: '',
welcomeText: ''
});
- const muteDraft = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)({
+ const muteDraft = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)({
mode: 'off',
scheduleType: 'once',
startsAtLocal: '',
@@ -1078,22 +1111,34 @@ const _hoisted_103 = ["disabled"];
dailyStart: '09:00',
dailyEnd: '18:00'
});
- const muteSaveNotice = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const muteSaveError = (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .ref */ .KR)('');
- const singlePeerId = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const muteSaveNotice = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ const muteSaveError = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .ref */ .KR)('');
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_25__/* .useAutoDismiss */ .R)(() => singleProfileError.value || singleProfileNotice.value, value => {
+ if ((singleProfileError.value || singleProfileNotice.value) === value) {
+ singleProfileError.value = '';
+ singleProfileNotice.value = '';
+ }
+ });
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_25__/* .useAutoDismiss */ .R)(() => muteSaveError.value || muteSaveNotice.value, value => {
+ if ((muteSaveError.value || muteSaveNotice.value) === value) {
+ muteSaveError.value = '';
+ muteSaveNotice.value = '';
+ }
+ });
+ const singlePeerId = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
if (!activeConversation.value || isGroupConversation.value) {
return '';
}
return String(activeConversation.value.target || activeConversation.value.raw?.target || activeConversation.value.id?.replace(/^single-/, '') || '');
});
- const singleContact = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const singleContact = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
const peerId = singlePeerId.value;
if (!peerId) {
return null;
}
return contacts.contacts.find(contact => String(contact.uid || contact.id || '') === peerId) || null;
});
- const singleProfile = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const singleProfile = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
const contact = singleContact.value;
const conversation = activeConversation.value || {};
const rawUser = contact?.rawUser || {};
@@ -1111,25 +1156,43 @@ const _hoisted_103 = ["disabled"];
alias: contact?.alias || ''
};
});
- const groupDisplayId = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
- return String(groupDetail.value?.groupId || activeConversation.value?.raw?.groupId || activeConversation.value?.raw?.target || activeConversation.value?.target || activeConversation.value?.id?.replace(/^group-/, '') || '-');
+ const groupDisplayId = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
+ return String(groupDetail.value?.publicId || '');
});
- const isGroupConversation = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const isGroupConversation = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
return ['group', 'channel'].includes(activeConversation.value?.type) || activeConversation.value?.raw?.type === 'group';
});
- const currentGroupRole = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const currentGroupRole = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
return groupDetail.value?.myRole || activeConversation.value?.role || activeConversation.value?.raw?.role || '';
});
- const isGroupOwner = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => currentGroupRole.value === 'owner');
- const canManageGroup = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => ['owner', 'admin'].includes(currentGroupRole.value));
- const adminCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => groupMembers.value.filter(member => member.role !== 'owner'));
- const transferableMembers = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => groupMembers.value.filter(member => member.role !== 'owner'));
- const messageDetail = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => conversations.messageDetail || null);
- const messageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => messageDetail.value?.group || null);
- const isMessageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const isGroupOwner = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => currentGroupRole.value === 'owner');
+ const canManageGroup = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => ['owner', 'admin'].includes(currentGroupRole.value));
+ const adminCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => groupMembers.value.filter(member => member.role !== 'owner'));
+ const transferableMembers = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => groupMembers.value.filter(member => member.role !== 'owner'));
+ const mentionCandidates = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
+ const members = new Map();
+ groupMembers.value.forEach(member => {
+ const uid = String(member?.uid || '').trim();
+ if (uid && uid !== String(session.userId || '')) members.set(uid, member);
+ });
+ conversations.activeMessages.forEach(message => {
+ const uid = String(message?.from || '').trim();
+ if (!uid || uid === 'me' || uid === session.userId || members.has(uid)) return;
+ members.set(uid, {
+ uid,
+ displayName: message?.senderName || uid,
+ portrait: message?.senderPortrait || message?.portrait || '',
+ role: message?.senderRole || 'member'
+ });
+ });
+ return Array.from(members.values());
+ });
+ const messageDetail = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => conversations.messageDetail || null);
+ const messageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => messageDetail.value?.group || null);
+ const isMessageDetailGroup = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
return messageDetail.value?.conversationType === 'group' || Boolean(messageDetail.value?.group);
});
- const messageDetailCounts = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const messageDetailCounts = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
return messageDetailGroup.value?.counts || {
read: 0,
unread: 0,
@@ -1137,7 +1200,7 @@ const _hoisted_103 = ["disabled"];
total: 0
};
});
- const kickCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const kickCandidateMembers = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
return groupMembers.value.filter(member => {
if (member.uid === session.userId || member.role === 'owner') {
return false;
@@ -1148,7 +1211,7 @@ const _hoisted_103 = ["disabled"];
return currentGroupRole.value === 'owner';
});
});
- const statusText = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .computed */ .EW)(() => {
+ const statusText = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .computed */ .EW)(() => {
if (activeConversation.value?.type === 'channel' && !conversations.canSendActiveConversation) {
return '公告群,仅管理员可发言';
}
@@ -1277,15 +1340,21 @@ const _hoisted_103 = ["disabled"];
if (!session.userId || !activeConversation.value?.target) {
return null;
}
+ const requestedConversationId = activeConversation.value.id;
+ const requestedTarget = activeConversation.value.target;
groupBusy.value = true;
try {
- groupDetail.value = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__/* .imClient */ .wD.getGroupDetail(session.userId, activeConversation.value.target);
+ const detail = await _services_imClient__WEBPACK_IMPORTED_MODULE_21__/* .imClient */ .wD.getGroupDetail(session.userId, requestedTarget);
+ if (activeConversation.value?.id !== requestedConversationId) return null;
+ groupDetail.value = detail;
return groupDetail.value;
} catch (error) {
- conversations.setActionError(error.message || '群资料加载失败');
+ if (activeConversation.value?.id === requestedConversationId) {
+ conversations.setActionError(error.message || '群资料加载失败');
+ }
return null;
} finally {
- groupBusy.value = false;
+ if (activeConversation.value?.id === requestedConversationId) groupBusy.value = false;
}
}
async function openGroupOverview() {
@@ -1301,17 +1370,26 @@ const _hoisted_103 = ["disabled"];
groupPanel.value = 'members';
await loadGroupMembers();
}
- async function loadGroupMembers() {
+ async function loadGroupMembers({
+ silent = false
+ } = {}) {
+ const requestedConversationId = activeConversation.value?.id;
+ const requestedTarget = activeConversation.value?.target;
+ if (!session.userId || !requestedConversationId || !requestedTarget) return [];
groupBusy.value = true;
try {
- groupMembers.value = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__/* .imClient */ .wD.getGroupMembers(session.userId, activeConversation.value.target);
+ const members = await _services_imClient__WEBPACK_IMPORTED_MODULE_21__/* .imClient */ .wD.getGroupMembers(session.userId, requestedTarget);
+ if (activeConversation.value?.id !== requestedConversationId) return [];
+ groupMembers.value = members;
selectedAdminIds.value = groupMembers.value.filter(member => member.role === 'admin').map(member => member.uid);
return groupMembers.value;
} catch (error) {
- conversations.setActionError(error.message || '群员加载失败');
+ if (!silent && activeConversation.value?.id === requestedConversationId) {
+ conversations.setActionError(error.message || '群员加载失败');
+ }
return [];
} finally {
- groupBusy.value = false;
+ if (activeConversation.value?.id === requestedConversationId) groupBusy.value = false;
}
}
async function openGroupAlias() {
@@ -1375,7 +1453,7 @@ const _hoisted_103 = ["disabled"];
}
groupBusy.value = true;
try {
- const alias = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__/* .imClient */ .wD.updateGroupAlias(session.userId, activeConversation.value.target, groupAliasDraft.value);
+ const alias = await _services_imClient__WEBPACK_IMPORTED_MODULE_21__/* .imClient */ .wD.updateGroupAlias(session.userId, activeConversation.value.target, groupAliasDraft.value);
groupDetail.value = {
...(groupDetail.value || {}),
myAlias: alias
@@ -1412,7 +1490,7 @@ const _hoisted_103 = ["disabled"];
}
groupBusy.value = true;
try {
- await _services_imClient__WEBPACK_IMPORTED_MODULE_18__/* .imClient */ .wD.setGroupAdmins(session.userId, activeConversation.value.target, selectedAdminIds.value);
+ await _services_imClient__WEBPACK_IMPORTED_MODULE_21__/* .imClient */ .wD.setGroupAdmins(session.userId, activeConversation.value.target, selectedAdminIds.value);
groupMembers.value = groupMembers.value.map(member => {
if (member.role === 'owner') {
return member;
@@ -1435,7 +1513,7 @@ const _hoisted_103 = ["disabled"];
}
groupBusy.value = true;
try {
- const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__/* .imClient */ .wD.updateGroupProfile(session.userId, activeConversation.value.target, profileDraft.value);
+ const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_21__/* .imClient */ .wD.updateGroupProfile(session.userId, activeConversation.value.target, profileDraft.value);
groupDetail.value = {
...(groupDetail.value || {}),
name: result.name,
@@ -1464,7 +1542,7 @@ const _hoisted_103 = ["disabled"];
}
groupBusy.value = true;
try {
- const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__/* .imClient */ .wD.kickGroupMembers(session.userId, activeConversation.value.target, selectedKickIds.value);
+ const result = await _services_imClient__WEBPACK_IMPORTED_MODULE_21__/* .imClient */ .wD.kickGroupMembers(session.userId, activeConversation.value.target, selectedKickIds.value);
const removed = new Set(result.removedIds || selectedKickIds.value);
groupMembers.value = groupMembers.value.filter(member => !removed.has(member.uid));
selectedKickIds.value = [];
@@ -1482,7 +1560,7 @@ const _hoisted_103 = ["disabled"];
clearMuteSaveFeedback();
groupBusy.value = true;
try {
- const setting = await _services_imClient__WEBPACK_IMPORTED_MODULE_18__/* .imClient */ .wD.updateGroupMuteSetting(session.userId, activeConversation.value.target, {
+ const setting = await _services_imClient__WEBPACK_IMPORTED_MODULE_21__/* .imClient */ .wD.updateGroupMuteSetting(session.userId, activeConversation.value.target, {
mode: muteDraft.value.mode,
scheduleType: muteDraft.value.scheduleType,
startsAtMs: localInputToMs(muteDraft.value.startsAtLocal),
@@ -1538,7 +1616,7 @@ const _hoisted_103 = ["disabled"];
}
groupBusy.value = true;
try {
- await _services_imClient__WEBPACK_IMPORTED_MODULE_18__/* .imClient */ .wD.transferGroup(session.userId, activeConversation.value.target, transferTargetId.value);
+ await _services_imClient__WEBPACK_IMPORTED_MODULE_21__/* .imClient */ .wD.transferGroup(session.userId, activeConversation.value.target, transferTargetId.value);
groupDetail.value = {
...(groupDetail.value || {}),
myRole: 'member'
@@ -1560,10 +1638,12 @@ const _hoisted_103 = ["disabled"];
return String(member.displayName || member.uid || '?').slice(0, 1).toUpperCase();
}
document.addEventListener('click', closeGroupMenu);
- (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .onBeforeUnmount */ .xo)(() => {
+ (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .onBeforeUnmount */ .xo)(() => {
document.removeEventListener('click', closeGroupMenu);
});
- (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .watch */ .wB)(() => activeConversation.value?.id, () => {
+ (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .watch */ .wB)(() => activeConversation.value?.id, async () => {
+ conversations.actionError = '';
+ conversations.actionNotice = '';
closeGroupMenu();
closeSingleProfile();
closeGroupPanel();
@@ -1574,446 +1654,464 @@ const _hoisted_103 = ["disabled"];
selectedKickIds.value = [];
transferTargetId.value = '';
manageSection.value = '';
+ if (isGroupConversation.value) {
+ await loadGroupMembers({
+ silent: true
+ });
+ }
+ }, {
+ immediate: true
});
return (_ctx, _cache) => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", {
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)(["chat-panel", {
- 'has-pinned-message': Boolean((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).activePinnedMessage)
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", {
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)(["chat-panel", {
+ 'has-pinned-message': Boolean((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).activePinnedMessage)
}])
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [isGroupConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("button", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [isGroupConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", {
key: 0,
type: "button",
class: "chat-title-button",
onClick: openGroupOverview
- }, [activeConversation.value?.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, [activeConversation.value?.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "chat-title-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(activeConversation.value.portrait),
- alt: ""
- }, null, 8, _hoisted_2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(activeConversation.value?.avatarText || '?'), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h2", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(activeConversation.value?.title || '未选择会话'), 1)])])) : activeConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("button", {
+ src: activeConversation.value.portrait,
+ alt: "",
+ onError: _cache[0] || (_cache[0] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, activeConversation.value.portrait))
+ }, null, 40, _hoisted_2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(activeConversation.value?.avatarText || '?'), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h2", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(activeConversation.value?.title || '未选择会话'), 1)])])) : activeConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", {
key: 1,
type: "button",
class: "chat-title-button",
onClick: openSingleProfile
- }, [singleProfile.value.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, [singleProfile.value.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "chat-title-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(singleProfile.value.portrait),
- alt: ""
- }, null, 8, _hoisted_5)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_6, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfile.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h2", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(activeConversation.value?.title || '未选择会话'), 1)])])) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("h2", _hoisted_8, "未选择会话")), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(statusText.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", _hoisted_9, [_cache[31] || (_cache[31] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ src: singleProfile.value.portrait,
+ alt: "",
+ onError: _cache[1] || (_cache[1] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, singleProfile.value.portrait))
+ }, null, 40, _hoisted_5)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_6, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfile.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h2", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(activeConversation.value?.title || '未选择会话'), 1)])])) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("h2", _hoisted_8, "未选择会话")), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(statusText.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_9, [_cache[34] || (_cache[34] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
class: "icon-button",
title: "搜索"
- }, "⌕", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, "⌕", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
class: "icon-button",
title: "更多",
- onClick: (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)(toggleGroupMenu, ["stop"])
- }, "⋯"), groupMenuOpen.value && isGroupConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ onClick: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)(toggleGroupMenu, ["stop"])
+ }, "⋯"), groupMenuOpen.value && isGroupConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: 0,
class: "quick-action-menu chat-more-menu",
- onClick: _cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)(() => {}, ["stop"]))
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)(() => {}, ["stop"]))
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
onClick: openGroupMembers
- }, "查看群员"), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, "查看群员"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
onClick: openGroupAlias
- }, "我在本群的昵称"), canManageGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("button", {
+ }, "我在本群的昵称"), canManageGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", {
key: 0,
type: "button",
onClick: openGroupManage
- }, "群组管理")) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)])]), !activeConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_10, _cache[32] || (_cache[32] = [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, "选择一个会话", -1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "真实会话同步完成后,可以在左侧打开聊天", -1)]))) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), activeConversation.value && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).activePinnedMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("button", {
+ }, "群组管理")) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)])]), !activeConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_10, _cache[35] || (_cache[35] = [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, "选择一个会话", -1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "真实会话同步完成后,可以在左侧打开聊天", -1)]))) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), activeConversation.value && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).activePinnedMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", {
key: 1,
type: "button",
class: "pinned-message-banner",
title: "点击定位该消息",
- onClick: _cache[2] || (_cache[2] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).focusMessage((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).activePinnedMessage))
- }, [_cache[33] || (_cache[33] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "📌", -1)), _cache[34] || (_cache[34] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, "置顶消息", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_11, [pinnedMessageIsImage.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ onClick: _cache[4] || (_cache[4] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).focusMessage((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).activePinnedMessage))
+ }, [_cache[36] || (_cache[36] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "📌", -1)), _cache[37] || (_cache[37] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, "置顶消息", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_11, [pinnedMessageIsImage.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).activePinnedMessage.attachment.url),
+ src: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).activePinnedMessage.attachment.url,
alt: "置顶图片"
- }, null, 8, _hoisted_12)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(pinnedMessageText.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", {
+ }, null, 8, _hoisted_12)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(pinnedMessageText.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", {
class: "pinned-message-close",
title: "取消置顶",
- onClick: _cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).clearPinnedMessage && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).clearPinnedMessage(...args), ["stop"]))
- }, "×")])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), activeConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createBlock */ .Wv)(_MessageList_vue__WEBPACK_IMPORTED_MODULE_16__/* ["default"] */ .A, {
+ onClick: _cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).clearPinnedMessage && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).clearPinnedMessage(...args), ["stop"]))
+ }, "×")])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), activeConversation.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createBlock */ .Wv)(_MessageList_vue__WEBPACK_IMPORTED_MODULE_19__/* ["default"] */ .A, {
key: 2,
- messages: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).activeMessages,
- "selection-mode": (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).selectionMode,
- "selected-message-ids": (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).selectedMessageIds,
- "favorite-message-ids": (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).favoriteMessageIds,
- "pinned-message-id": (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).activePinnedMessage?.key || '',
- "attention-message-id": (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).attentionMessageId,
+ messages: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).activeMessages,
+ "selection-mode": (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).selectionMode,
+ "selected-message-ids": (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).selectedMessageIds,
+ "favorite-message-ids": (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).favoriteMessageIds,
+ "pinned-message-id": (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).activePinnedMessage?.key || '',
+ "attention-message-id": (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).attentionMessageId,
"can-recall-others": canManageGroup.value && isGroupConversation.value,
- onMessageAction: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).handleMessageAction,
- onToggleSelect: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).toggleSelectedMessage,
+ onMessageAction: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).handleMessageAction,
+ onToggleSelect: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).toggleSelectedMessage,
onSenderProfileUpdated: handleSenderProfileUpdated
- }, null, 8, ["messages", "selection-mode", "selected-message-ids", "favorite-message-ids", "pinned-message-id", "attention-message-id", "can-recall-others", "onMessageAction", "onToggleSelect"])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).selectionMode ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "已选 " + (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).selectedMessageIds.length) + " 条", 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, null, 8, ["messages", "selection-mode", "selected-message-ids", "favorite-message-ids", "pinned-message-id", "attention-message-id", "can-recall-others", "onMessageAction", "onToggleSelect"])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).selectionMode ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_13, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "已选 " + (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).selectedMessageIds.length) + " 条", 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
- onClick: _cache[3] || (_cache[3] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).copySelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).copySelectedMessages(...args))
- }, "复制"), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[5] || (_cache[5] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).copySelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).copySelectedMessages(...args))
+ }, "复制"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
- onClick: _cache[4] || (_cache[4] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).deleteSelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).deleteSelectedMessages(...args))
- }, "删除"), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[6] || (_cache[6] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).deleteSelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).deleteSelectedMessages(...args))
+ }, "删除"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
- onClick: _cache[5] || (_cache[5] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).startForwardSelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).startForwardSelectedMessages(...args))
- }, "转发"), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[7] || (_cache[7] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).startForwardSelectedMessages && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).startForwardSelectedMessages(...args))
+ }, "转发"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
- onClick: _cache[6] || (_cache[6] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).clearSelection && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).clearSelection(...args))
- }, "取消")])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createVNode */ .bF)(_MessageComposer_vue__WEBPACK_IMPORTED_MODULE_17__/* ["default"] */ .A, {
- disabled: !activeConversation.value || !(0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(session).isAuthenticated || !(0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).canSendActiveConversation,
- "quote-message": (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).quotedMessage,
- onCancelQuote: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelQuote,
- onSend: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).sendText,
- onSendAttachment: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).sendAttachment
- }, null, 8, ["disabled", "quote-message", "onCancelQuote", "onSend", "onSendAttachment"]), (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).forwardingMessages.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ onClick: _cache[8] || (_cache[8] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).clearSelection && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).clearSelection(...args))
+ }, "取消")])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createVNode */ .bF)(_MessageComposer_vue__WEBPACK_IMPORTED_MODULE_20__/* ["default"] */ .A, {
+ disabled: !activeConversation.value || !(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(session).isAuthenticated || !(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).canSendActiveConversation,
+ "quote-message": (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).quotedMessage,
+ "mention-users": isGroupConversation.value ? mentionCandidates.value : [],
+ onCancelQuote: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelQuote,
+ onSend: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).sendText,
+ onSendAttachment: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).sendAttachment
+ }, null, 8, ["disabled", "quote-message", "mention-users", "onCancelQuote", "onSend", "onSendAttachment"]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).forwardingMessages.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: 4,
class: "modal-backdrop",
- onClick: _cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelForward && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelForward(...args), ["self"]))
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("section", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[35] || (_cache[35] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, "转发给", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelForward && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelForward(...args), ["self"]))
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("section", _hoisted_14, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[38] || (_cache[38] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, "转发给", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
- onClick: _cache[7] || (_cache[7] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelForward && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelForward(...args))
- }, "×")]), ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .renderList */ .pI)((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).conversations, item => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("button", {
+ onClick: _cache[9] || (_cache[9] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelForward && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelForward(...args))
+ }, "×")]), ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).conversations, item => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", {
key: item.id,
type: "button",
class: "forward-target",
- onClick: $event => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).completeForward(item.id)
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(item.avatarText), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(item.title), 1)], 8, _hoisted_15);
- }), 128))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).editingMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ onClick: $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).completeForward(item.id)
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_16, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(item.avatarText), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(item.title), 1)], 8, _hoisted_15);
+ }), 128))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).editingMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: 5,
class: "modal-backdrop",
- onClick: _cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelEditMessage(...args), ["self"]))
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("form", {
+ onClick: _cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelEditMessage(...args), ["self"]))
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("form", {
class: "edit-dialog",
- onSubmit: _cache[12] || (_cache[12] = (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).completeEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).completeEditMessage(...args), ["prevent"]))
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).editingMode === 'resend' ? '重新编辑' : '编辑消息'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onSubmit: _cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).completeEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).completeEditMessage(...args), ["prevent"]))
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).editingMode === 'resend' ? '重新编辑' : '编辑消息'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
- onClick: _cache[9] || (_cache[9] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelEditMessage(...args))
- }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("textarea", {
- "onUpdate:modelValue": _cache[10] || (_cache[10] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).editingText = $event),
+ onClick: _cache[11] || (_cache[11] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelEditMessage(...args))
+ }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("textarea", {
+ "onUpdate:modelValue": _cache[12] || (_cache[12] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).editingText = $event),
maxlength: "5000",
rows: "5",
autofocus: ""
- }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).editingText]]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).editingText]]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
- onClick: _cache[11] || (_cache[11] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).cancelEditMessage(...args))
- }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", _hoisted_17, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).editingMode === 'resend' ? '发送' : '保存'), 1)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).messageDetailOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ onClick: _cache[13] || (_cache[13] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelEditMessage && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).cancelEditMessage(...args))
+ }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", _hoisted_17, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).editingMode === 'resend' ? '发送' : '保存'), 1)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).messageDetailOpen ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: 6,
class: "modal-backdrop",
- onClick: _cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).closeMessageDetail && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).closeMessageDetail(...args), ["self"]))
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("section", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[36] || (_cache[36] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, "消息详情", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)((...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).closeMessageDetail && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).closeMessageDetail(...args), ["self"]))
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("section", _hoisted_18, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[39] || (_cache[39] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, "消息详情", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
- onClick: _cache[14] || (_cache[14] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).closeMessageDetail && (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).closeMessageDetail(...args))
- }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).messageDetailLoading ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_19, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, {
+ onClick: _cache[16] || (_cache[16] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).closeMessageDetail && (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).closeMessageDetail(...args))
+ }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).messageDetailLoading ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_19, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, {
key: 1
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dl", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[37] || (_cache[37] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "发送时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(formatDetailTime(messageDetail.value?.sentAt)), 1)]), messageDetail.value?.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_21, [_cache[38] || (_cache[38] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "编辑时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(formatDetailTime(messageDetail.value.editedAt)), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[39] || (_cache[39] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "发送人", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailMemberName(messageDetail.value?.sender)), 1)]), !isMessageDetailGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dl", _hoisted_20, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[40] || (_cache[40] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "发送时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(formatDetailTime(messageDetail.value?.sentAt)), 1)]), messageDetail.value?.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_21, [_cache[41] || (_cache[41] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "编辑时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(formatDetailTime(messageDetail.value.editedAt)), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[42] || (_cache[42] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "发送人", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailMemberName(messageDetail.value?.sender)), 1)]), !isMessageDetailGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, {
key: 1
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[40] || (_cache[40] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "接收人", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailMemberName(messageDetail.value?.receiver)), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[41] || (_cache[41] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "送达时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", {
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)({
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[43] || (_cache[43] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "接收人", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailMemberName(messageDetail.value?.receiver)), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[44] || (_cache[44] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "送达时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", {
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)({
'message-detail-muted': !messageDetail.value?.deliveredAt
})
- }, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetail.value?.deliveredAt ? formatDetailTime(messageDetail.value.deliveredAt) : '未送达'), 3)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[42] || (_cache[42] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "已读时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", {
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)({
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetail.value?.deliveredAt ? formatDetailTime(messageDetail.value.deliveredAt) : '未送达'), 3)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[45] || (_cache[45] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "已读时间", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", {
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)({
'message-detail-muted': !messageDetail.value?.readAt
})
- }, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetail.value?.readAt ? formatDetailTime(messageDetail.value.readAt) : '未读'), 3)])], 64)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).messageDetailError ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_22, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).messageDetailError), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), isMessageDetailGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, {
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetail.value?.readAt ? formatDetailTime(messageDetail.value.readAt) : '未读'), 3)])], 64)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).messageDetailError ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_22, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).messageDetailError), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), isMessageDetailGroup.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, {
key: 1
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, [_cache[43] || (_cache[43] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createTextVNode */ .eW)("已读 ")), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetailCounts.value.read || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, [_cache[44] || (_cache[44] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createTextVNode */ .eW)("未读 ")), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetailCounts.value.unread || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, [_cache[45] || (_cache[45] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createTextVNode */ .eW)("未送达 ")), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetailCounts.value.undelivered || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, [_cache[46] || (_cache[46] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createTextVNode */ .eW)("成员 ")), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetailCounts.value.total || 0), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("section", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[47] || (_cache[47] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, "已读", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetailCounts.value.read || 0) + " 人", 1)]), messageDetailGroup.value?.read?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_26, [((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .renderList */ .pI)(messageDetailGroup.value.read, member => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_23, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, [_cache[46] || (_cache[46] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createTextVNode */ .eW)("已读 ")), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetailCounts.value.read || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, [_cache[47] || (_cache[47] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createTextVNode */ .eW)("未读 ")), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetailCounts.value.unread || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, [_cache[48] || (_cache[48] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createTextVNode */ .eW)("未送达 ")), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetailCounts.value.undelivered || 0), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, [_cache[49] || (_cache[49] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createTextVNode */ .eW)("成员 ")), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetailCounts.value.total || 0), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("section", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[50] || (_cache[50] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, "已读", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetailCounts.value.read || 0) + " 人", 1)]), messageDetailGroup.value?.read?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_26, [((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)(messageDetailGroup.value.read, member => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: `read-${member.uid}`,
class: "message-detail-member-row"
- }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(member.portrait),
- alt: ""
- }, null, 8, _hoisted_27)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_28, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_29, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.uid), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_30, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(formatDetailTime(member.time)), 1), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_31, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)]);
- }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_32, "暂无已读成员"))]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("section", _hoisted_33, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[48] || (_cache[48] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, "未读", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetailCounts.value.unread || 0) + " 人", 1)]), messageDetailGroup.value?.unread?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_34, [((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .renderList */ .pI)(messageDetailGroup.value.unread, member => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ src: member.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, member.portrait)
+ }, null, 40, _hoisted_27)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_28, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_29, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.uid), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_30, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(formatDetailTime(member.time)), 1), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_31, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]);
+ }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_32, "暂无已读成员"))]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("section", _hoisted_33, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[51] || (_cache[51] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, "未读", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetailCounts.value.unread || 0) + " 人", 1)]), messageDetailGroup.value?.unread?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_34, [((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)(messageDetailGroup.value.unread, member => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: `unread-${member.uid}`,
class: "message-detail-member-row"
- }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(member.portrait),
- alt: ""
- }, null, 8, _hoisted_35)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_36, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_37, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.uid), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_38, "送达 " + (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(formatDetailTime(member.time)), 1), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_39, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)]);
- }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_40, "暂无未读成员"))]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("section", _hoisted_41, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[49] || (_cache[49] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, "未送达", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(messageDetailCounts.value.undelivered || 0) + " 人", 1)]), messageDetailGroup.value?.undelivered?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_42, [((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .renderList */ .pI)(messageDetailGroup.value.undelivered, member => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ src: member.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, member.portrait)
+ }, null, 40, _hoisted_35)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_36, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_37, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.uid), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_38, "送达 " + (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(formatDetailTime(member.time)), 1), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_39, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]);
+ }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_40, "暂无未读成员"))]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("section", _hoisted_41, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[52] || (_cache[52] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, "未送达", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(messageDetailCounts.value.undelivered || 0) + " 人", 1)]), messageDetailGroup.value?.undelivered?.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_42, [((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)(messageDetailGroup.value.undelivered, member => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: `undelivered-${member.uid}`,
class: "message-detail-member-row"
- }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(member.portrait),
- alt: ""
- }, null, 8, _hoisted_43)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_44, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", _hoisted_45, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.uid), 1)]), _cache[50] || (_cache[50] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", {
+ src: member.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, member.portrait)
+ }, null, 40, _hoisted_43)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_44, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailMemberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", _hoisted_45, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailMemberName(member)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.uid), 1)]), _cache[53] || (_cache[53] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", {
class: "message-detail-member-time message-detail-muted"
- }, "未送达", -1)), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_46, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)]);
- }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_47, "暂无未送达成员"))])])], 64)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)], 64))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), singleProfileOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ }, "未送达", -1)), detailRoleLabel(member.role) ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_46, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(detailRoleLabel(member.role)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]);
+ }), 128))])) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_47, "暂无未送达成员"))])])], 64)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)], 64))])])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), singleProfileOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: 7,
class: "modal-backdrop",
- onClick: (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)(closeSingleProfile, ["self"])
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("section", _hoisted_48, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[51] || (_cache[51] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, "联系人资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)(closeSingleProfile, ["self"])
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("section", _hoisted_48, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[54] || (_cache[54] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, "联系人资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
onClick: closeSingleProfile
- }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", _hoisted_49, [singleProfile.value.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_49, [singleProfile.value.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "profile-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(singleProfile.value.portrait),
- alt: ""
- }, null, 8, _hoisted_50)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_51, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfile.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfile.value.displayName), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dl", _hoisted_52, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[52] || (_cache[52] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfile.value.userId || '-'), 1)]), singleProfile.value.uid && singleProfile.value.uid !== singleProfile.value.userId ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_53, [_cache[53] || (_cache[53] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "用户UID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfile.value.uid), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[54] || (_cache[54] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfile.value.rawName || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[55] || (_cache[55] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfile.value.mobile || '未知'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[56] || (_cache[56] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfile.value.address || '未知'), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[57] || (_cache[57] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "备注名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[16] || (_cache[16] = $event => singleAliasDraft.value = $event),
+ src: singleProfile.value.portrait,
+ alt: "",
+ onError: _cache[18] || (_cache[18] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, singleProfile.value.portrait))
+ }, null, 40, _hoisted_50)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_51, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfile.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfile.value.displayName), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dl", _hoisted_52, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[55] || (_cache[55] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfile.value.userId || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[56] || (_cache[56] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfile.value.rawName || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[57] || (_cache[57] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfile.value.mobile || '未知'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[58] || (_cache[58] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfile.value.address || '未知'), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[59] || (_cache[59] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "备注名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[19] || (_cache[19] = $event => singleAliasDraft.value = $event),
maxlength: "32",
autocomplete: "off",
placeholder: "留空使用对方昵称"
- }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, singleAliasDraft.value, void 0, {
+ }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, singleAliasDraft.value, void 0, {
trim: true
- }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", _hoisted_54, [singleProfileNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_55, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfileNotice.value), 1)) : singleProfileError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_56, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfileError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", _hoisted_53, [singleProfileNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_54, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfileNotice.value), 1)) : singleProfileError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_55, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfileError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "ghost-inline-action",
disabled: singleProfileSaving.value,
onClick: closeSingleProfile
- }, "取消", 8, _hoisted_57), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, "取消", 8, _hoisted_56), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "primary-inline-action",
disabled: singleProfileSaving.value || !singleProfile.value.uid,
onClick: saveSingleAlias
- }, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(singleProfileSaving.value ? '保存中...' : '保存备注'), 9, _hoisted_58)])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), groupPanel.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(singleProfileSaving.value ? '保存中...' : '保存备注'), 9, _hoisted_57)])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), groupPanel.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: 8,
class: "modal-backdrop",
- onClick: (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)(closeGroupPanel, ["self"])
- }, [groupPanel.value === 'overview' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", _hoisted_59, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[58] || (_cache[58] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, "群概况", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)(closeGroupPanel, ["self"])
+ }, [groupPanel.value === 'overview' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", _hoisted_58, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[60] || (_cache[60] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, "群概况", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
onClick: closeGroupPanel
- }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_60, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("dl", _hoisted_61, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[59] || (_cache[59] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "群名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(groupDetail.value?.name || activeConversation.value?.title || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[60] || (_cache[60] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "群ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(groupDisplayId.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[61] || (_cache[61] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "群说明", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(groupDetail.value?.announcement || '未设置'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", null, [_cache[62] || (_cache[62] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dt", null, "群主昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(groupDetail.value?.ownerName || '-'), 1)])])), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", null, [isGroupOwner.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, {
+ }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_59, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("dl", _hoisted_60, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[61] || (_cache[61] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "群名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(groupDetail.value?.name || activeConversation.value?.title || '-'), 1)]), groupDisplayId.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_61, [_cache[62] || (_cache[62] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "群ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(groupDisplayId.value), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[63] || (_cache[63] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "群说明", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(groupDetail.value?.announcement || '未设置'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", null, [_cache[64] || (_cache[64] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dt", null, "群主昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(groupDetail.value?.ownerName || '-'), 1)])])), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", null, [isGroupOwner.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, {
key: 0
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "danger-inline-action",
disabled: groupBusy.value,
onClick: dismissCurrentGroup
- }, "解散群组", 8, _hoisted_62), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, "解散群组", 8, _hoisted_62), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "primary-inline-action",
disabled: groupBusy.value,
onClick: openTransferGroup
- }, "转让群组", 8, _hoisted_63)], 64)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("button", {
+ }, "转让群组", 8, _hoisted_63)], 64)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", {
key: 1,
type: "button",
class: "danger-inline-action",
disabled: groupBusy.value,
onClick: leaveCurrentGroup
- }, "退出群组", 8, _hoisted_64))])])) : groupPanel.value === 'members' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", _hoisted_65, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[63] || (_cache[63] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, "群员", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, "退出群组", 8, _hoisted_64))])])) : groupPanel.value === 'members' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", _hoisted_65, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[65] || (_cache[65] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, "群员", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
onClick: closeGroupPanel
- }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_66, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_67, [((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .renderList */ .pI)(groupMembers.value, member => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_66, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_67, [((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)(groupMembers.value, member => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: member.uid,
class: "group-member-row"
- }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(member.portrait),
- alt: ""
- }, null, 8, _hoisted_68)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_69, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.role === 'owner' ? '群主' : member.rawDisplayName), 1)])]);
- }), 128)), !groupMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_70, "暂无群员")) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)]))])) : groupPanel.value === 'alias' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("form", {
+ src: member.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, member.portrait)
+ }, null, 40, _hoisted_68)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_69, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.role === 'owner' ? '群主' : member.rawDisplayName), 1)])]);
+ }), 128)), !groupMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_70, "暂无群员")) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]))])) : groupPanel.value === 'alias' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("form", {
key: 2,
class: "group-dialog",
- onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_12__/* .withModifiers */ .D$)(saveGroupAlias, ["prevent"])
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[64] || (_cache[64] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, "我在本群的昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .withModifiers */ .D$)(saveGroupAlias, ["prevent"])
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[66] || (_cache[66] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, "我在本群的昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
onClick: closeGroupPanel
- }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[65] || (_cache[65] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[17] || (_cache[17] = $event => groupAliasDraft.value = $event),
+ }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[67] || (_cache[67] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[20] || (_cache[20] = $event => groupAliasDraft.value = $event),
maxlength: "64",
autocomplete: "off",
placeholder: "留空使用个人昵称"
- }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, groupAliasDraft.value, void 0, {
+ }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, groupAliasDraft.value, void 0, {
trim: true
- }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "ghost-inline-action",
onClick: closeGroupPanel
- }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
class: "primary-inline-action",
disabled: groupBusy.value
- }, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(groupBusy.value ? '保存中...' : '保存'), 9, _hoisted_71)])], 32)) : groupPanel.value === 'transfer' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", _hoisted_72, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[66] || (_cache[66] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, "转让群组", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(groupBusy.value ? '保存中...' : '保存'), 9, _hoisted_71)])], 32)) : groupPanel.value === 'transfer' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", _hoisted_72, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[68] || (_cache[68] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, "转让群组", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
onClick: closeGroupPanel
- }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_73, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_74, [((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .renderList */ .pI)(transferableMembers.value, member => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("button", {
+ }, "×")]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_73, "正在加载")) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_74, [((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)(transferableMembers.value, member => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", {
key: member.uid,
type: "button",
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)(["group-member-row selectable", {
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)(["group-member-row selectable", {
selected: transferTargetId.value === member.uid
}]),
onClick: $event => transferTargetId.value = member.uid
- }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(member.portrait),
- alt: ""
- }, null, 8, _hoisted_76)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_77, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.rawDisplayName), 1)])], 10, _hoisted_75);
- }), 128)), !transferableMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_78, "暂无可转让成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)])), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ src: member.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, member.portrait)
+ }, null, 40, _hoisted_76)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_77, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.rawDisplayName), 1)])], 10, _hoisted_75);
+ }), 128)), !transferableMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_78, "暂无可转让成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)])), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "ghost-inline-action",
onClick: closeGroupPanel
- }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, "取消"), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "primary-inline-action",
disabled: groupBusy.value || !transferTargetId.value,
onClick: transferCurrentGroup
- }, "确认转让", 8, _hoisted_79)])])) : groupPanel.value === 'manage' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", _hoisted_80, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("header", null, [_cache[67] || (_cache[67] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("h3", null, "群组管理", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, "确认转让", 8, _hoisted_79)])])) : groupPanel.value === 'manage' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", _hoisted_80, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("header", null, [_cache[69] || (_cache[69] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("h3", null, "群组管理", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
onClick: closeGroupPanel
- }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("nav", _hoisted_81, [isGroupOwner.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("button", {
+ }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("nav", _hoisted_81, [isGroupOwner.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("button", {
key: 0,
type: "button",
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)({
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)({
active: manageSection.value === 'admins'
}),
- onClick: _cache[18] || (_cache[18] = $event => manageSection.value = 'admins')
- }, "管理员设置", 2)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[21] || (_cache[21] = $event => manageSection.value = 'admins')
+ }, "管理员设置", 2)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)({
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)({
active: manageSection.value === 'profile'
}),
- onClick: _cache[19] || (_cache[19] = $event => manageSection.value = 'profile')
- }, "修改群资料", 2), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[22] || (_cache[22] = $event => manageSection.value = 'profile')
+ }, "修改群资料", 2), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)({
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)({
active: manageSection.value === 'kick'
}),
- onClick: _cache[20] || (_cache[20] = $event => manageSection.value = 'kick')
- }, "踢人", 2), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[23] || (_cache[23] = $event => manageSection.value = 'kick')
+ }, "踢人", 2), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)({
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)({
active: manageSection.value === 'mute'
}),
- onClick: _cache[21] || (_cache[21] = $event => manageSection.value = 'mute')
- }, "禁言设置", 2)]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_82, "正在加载")) : manageSection.value === 'admins' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", _hoisted_83, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", _hoisted_84, [((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .renderList */ .pI)(adminCandidateMembers.value, member => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("label", {
+ onClick: _cache[24] || (_cache[24] = $event => manageSection.value = 'mute')
+ }, "禁言设置", 2)]), groupBusy.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_82, "正在加载")) : manageSection.value === 'admins' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", _hoisted_83, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_84, [((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)(adminCandidateMembers.value, member => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("label", {
key: member.uid,
class: "group-member-row selectable with-check"
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
type: "checkbox",
checked: selectedAdminIds.value.includes(member.uid),
onChange: $event => toggleAdmin(member.uid)
- }, null, 40, _hoisted_85), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, null, 40, _hoisted_85), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(member.portrait),
- alt: ""
- }, null, 8, _hoisted_86)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_87, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.rawDisplayName), 1)])]);
- }), 128)), !adminCandidateMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_88, "暂无可设置成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ src: member.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, member.portrait)
+ }, null, 40, _hoisted_86)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_87, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.rawDisplayName), 1)])]);
+ }), 128)), !adminCandidateMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_88, "暂无可设置成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "primary-inline-action",
onClick: saveGroupAdmins
- }, "保存管理员")])])) : manageSection.value === 'profile' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", _hoisted_89, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[68] || (_cache[68] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "群名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[22] || (_cache[22] = $event => profileDraft.value.name = $event),
+ }, "保存管理员")])])) : manageSection.value === 'profile' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", _hoisted_89, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[70] || (_cache[70] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "群名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[25] || (_cache[25] = $event => profileDraft.value.name = $event),
maxlength: "128",
autocomplete: "off"
- }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, profileDraft.value.name, void 0, {
+ }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, profileDraft.value.name, void 0, {
trim: true
- }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[69] || (_cache[69] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "群说明", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("textarea", {
- "onUpdate:modelValue": _cache[23] || (_cache[23] = $event => profileDraft.value.announcement = $event),
+ }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[71] || (_cache[71] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "群说明", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("textarea", {
+ "onUpdate:modelValue": _cache[26] || (_cache[26] = $event => profileDraft.value.announcement = $event),
maxlength: "1000",
rows: "3"
- }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, profileDraft.value.announcement, void 0, {
+ }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, profileDraft.value.announcement, void 0, {
trim: true
- }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[70] || (_cache[70] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "欢迎词", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("textarea", {
- "onUpdate:modelValue": _cache[24] || (_cache[24] = $event => profileDraft.value.welcomeText = $event),
+ }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[72] || (_cache[72] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "欢迎词", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("textarea", {
+ "onUpdate:modelValue": _cache[27] || (_cache[27] = $event => profileDraft.value.welcomeText = $event),
maxlength: "1000",
rows: "3"
- }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, profileDraft.value.welcomeText, void 0, {
+ }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, profileDraft.value.welcomeText, void 0, {
trim: true
- }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "primary-inline-action",
onClick: saveGroupProfile
- }, "保存资料")])])) : manageSection.value === 'kick' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", _hoisted_90, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("div", _hoisted_91, [((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_13__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .renderList */ .pI)(kickCandidateMembers.value, member => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("label", {
+ }, "保存资料")])])) : manageSection.value === 'kick' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", _hoisted_90, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("div", _hoisted_91, [((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_16__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .renderList */ .pI)(kickCandidateMembers.value, member => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("label", {
key: member.uid,
class: "group-member-row selectable with-check"
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
type: "checkbox",
checked: selectedKickIds.value.includes(member.uid),
onChange: $event => toggleKick(member.uid)
- }, null, 40, _hoisted_92), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("img", {
+ }, null, 40, _hoisted_92), member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(member.portrait),
- alt: ""
- }, null, 8, _hoisted_93)) : ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_94, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(member.role === 'admin' ? '管理员' : member.rawDisplayName), 1)])]);
- }), 128)), !kickCandidateMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_95, "暂无可移除成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ src: member.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_26__/* .useImageProxyFallback */ .TJ)($event, member.portrait)
+ }, null, 40, _hoisted_93)) : ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_94, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(memberAvatar(member)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.displayName), 1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(member.role === 'admin' ? '管理员' : member.rawDisplayName), 1)])]);
+ }), 128)), !kickCandidateMembers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_95, "暂无可移除成员")) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", null, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "danger-inline-action",
disabled: !selectedKickIds.value.length,
onClick: kickSelectedMembers
- }, "移出群组", 8, _hoisted_96)])])) : manageSection.value === 'mute' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("section", _hoisted_97, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[72] || (_cache[72] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "禁言模式", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("select", {
- "onUpdate:modelValue": _cache[25] || (_cache[25] = $event => muteDraft.value.mode = $event),
+ }, "移出群组", 8, _hoisted_96)])])) : manageSection.value === 'mute' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("section", _hoisted_97, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[74] || (_cache[74] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "禁言模式", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("select", {
+ "onUpdate:modelValue": _cache[28] || (_cache[28] = $event => muteDraft.value.mode = $event),
onChange: clearMuteSaveFeedback
- }, _cache[71] || (_cache[71] = [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("option", {
+ }, _cache[73] || (_cache[73] = [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("option", {
value: "off"
- }, "关闭禁言", -1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("option", {
+ }, "关闭禁言", -1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("option", {
value: "all_include_admins"
- }, "全体禁言包含管理员", -1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("option", {
+ }, "全体禁言包含管理员", -1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("option", {
value: "all_except_admins"
- }, "除管理员外全体禁言", -1)]), 544), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelSelect */ .u1, muteDraft.value.mode]])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[74] || (_cache[74] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "时段类型", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("select", {
- "onUpdate:modelValue": _cache[26] || (_cache[26] = $event => muteDraft.value.scheduleType = $event),
+ }, "除管理员外全体禁言", -1)]), 544), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelSelect */ .u1, muteDraft.value.mode]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[76] || (_cache[76] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "时段类型", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("select", {
+ "onUpdate:modelValue": _cache[29] || (_cache[29] = $event => muteDraft.value.scheduleType = $event),
onChange: clearMuteSaveFeedback
- }, _cache[73] || (_cache[73] = [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("option", {
+ }, _cache[75] || (_cache[75] = [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("option", {
value: "manual"
- }, "立即禁言直到管理解除", -1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("option", {
+ }, "立即禁言直到管理解除", -1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("option", {
value: "once"
- }, "单次", -1), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("option", {
+ }, "单次", -1), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("option", {
value: "daily"
- }, "每天固定时段", -1)]), 544), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelSelect */ .u1, muteDraft.value.scheduleType]])]), muteDraft.value.mode !== 'off' && muteDraft.value.scheduleType === 'once' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_98, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[75] || (_cache[75] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "开始", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[27] || (_cache[27] = $event => muteDraft.value.startsAtLocal = $event),
+ }, "每天固定时段", -1)]), 544), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelSelect */ .u1, muteDraft.value.scheduleType]])]), muteDraft.value.mode !== 'off' && muteDraft.value.scheduleType === 'once' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_98, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[77] || (_cache[77] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "开始", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[30] || (_cache[30] = $event => muteDraft.value.startsAtLocal = $event),
type: "datetime-local",
onInput: clearMuteSaveFeedback
- }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, muteDraft.value.startsAtLocal]])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[76] || (_cache[76] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "结束", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[28] || (_cache[28] = $event => muteDraft.value.endsAtLocal = $event),
+ }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, muteDraft.value.startsAtLocal]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[78] || (_cache[78] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "结束", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[31] || (_cache[31] = $event => muteDraft.value.endsAtLocal = $event),
type: "datetime-local",
onInput: clearMuteSaveFeedback
- }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, muteDraft.value.endsAtLocal]])])])) : muteDraft.value.mode !== 'off' && muteDraft.value.scheduleType === 'daily' ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", _hoisted_99, [(0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[77] || (_cache[77] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "开始", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[29] || (_cache[29] = $event => muteDraft.value.dailyStart = $event),
+ }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, muteDraft.value.endsAtLocal]])])])) : muteDraft.value.mode !== 'off' && muteDraft.value.scheduleType === 'daily' ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", _hoisted_99, [(0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[79] || (_cache[79] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "开始", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[32] || (_cache[32] = $event => muteDraft.value.dailyStart = $event),
type: "time",
onInput: clearMuteSaveFeedback
- }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, muteDraft.value.dailyStart]])]), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("label", null, [_cache[78] || (_cache[78] = (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("span", null, "结束", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[30] || (_cache[30] = $event => muteDraft.value.dailyEnd = $event),
+ }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, muteDraft.value.dailyStart]])]), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("label", null, [_cache[80] || (_cache[80] = (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("span", null, "结束", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[33] || (_cache[33] = $event => muteDraft.value.dailyEnd = $event),
type: "time",
onInput: clearMuteSaveFeedback
- }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_12__/* .vModelText */ .Jo, muteDraft.value.dailyEnd]])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("footer", _hoisted_100, [muteSaveNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_101, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(muteSaveNotice.value), 1)) : muteSaveError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("span", _hoisted_102, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)(muteSaveError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementVNode */ .Lk)("button", {
+ }, null, 544), [[vue__WEBPACK_IMPORTED_MODULE_15__/* .vModelText */ .Jo, muteDraft.value.dailyEnd]])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("footer", _hoisted_100, [muteSaveNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_101, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(muteSaveNotice.value), 1)) : muteSaveError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("span", _hoisted_102, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)(muteSaveError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "primary-inline-action",
disabled: groupBusy.value,
onClick: saveMuteSetting
- }, "保存禁言", 8, _hoisted_103)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).actionNotice || (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).actionError ? ((0,vue__WEBPACK_IMPORTED_MODULE_13__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createElementBlock */ .CE)("div", {
+ }, "保存禁言", 8, _hoisted_103)])])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)])) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).actionNotice || (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).actionError ? ((0,vue__WEBPACK_IMPORTED_MODULE_16__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createElementBlock */ .CE)("div", {
key: 9,
- class: (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .normalizeClass */ .C4)(["chat-toast", {
- error: (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).actionError
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .normalizeClass */ .C4)(["chat-toast", {
+ error: (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).actionError
}])
- }, (0,vue__WEBPACK_IMPORTED_MODULE_15__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).actionError || (0,vue__WEBPACK_IMPORTED_MODULE_14__/* .unref */ .R1)(conversations).actionNotice), 3)) : (0,vue__WEBPACK_IMPORTED_MODULE_13__/* .createCommentVNode */ .Q3)("", true)], 2);
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).actionError || (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .unref */ .R1)(conversations).actionNotice), 3)) : (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .createCommentVNode */ .Q3)("", true)], 2);
};
}
});
@@ -2025,18 +2123,21 @@ const _hoisted_103 = ["disabled"];
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4423);
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8111);
-/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(2489);
-/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7588);
-/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_3__);
-/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1701);
-/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5130);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(6768);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(5187);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(144);
+/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4114);
+/* harmony import */ var core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_push_js__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8111);
+/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2489);
+/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7588);
+/* harmony import */ var core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_for_each_js__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1701);
+/* harmony import */ var core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_map_js__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(5130);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(6768);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5187);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(144);
+
@@ -2053,12 +2154,22 @@ const _hoisted_2 = {
const _hoisted_3 = ["disabled"];
const _hoisted_4 = ["disabled"];
const _hoisted_5 = ["disabled"];
-const _hoisted_6 = ["onClick"];
-const _hoisted_7 = ["disabled", "onKeydown"];
-const _hoisted_8 = {
+const _hoisted_6 = ["disabled"];
+const _hoisted_7 = ["onClick"];
+const _hoisted_8 = ["disabled", "onKeydown"];
+const _hoisted_9 = {
+ key: 1,
+ class: "mention-picker"
+};
+const _hoisted_10 = ["onClick"];
+const _hoisted_11 = ["src"];
+const _hoisted_12 = {
+ key: 1
+};
+const _hoisted_13 = {
class: "composer-footer"
};
-const _hoisted_9 = ["disabled"];
+const _hoisted_14 = ["disabled"];
/* harmony default export */ __webpack_exports__.A = ({
__name: 'MessageComposer',
@@ -2070,6 +2181,10 @@ const _hoisted_9 = ["disabled"];
quoteMessage: {
type: Object,
default: null
+ },
+ mentionUsers: {
+ type: Array,
+ default: () => []
}
},
emits: ['send', 'send-attachment', 'cancel-quote'],
@@ -2078,23 +2193,79 @@ const _hoisted_9 = ["disabled"];
}) {
const props = __props;
const emit = __emit;
- const text = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)('');
- const emojiOpen = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(false);
- const dropActive = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(false);
- const textareaEl = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(null);
- const imageInput = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(null);
- const fileInput = (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .ref */ .KR)(null);
+ const text = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)('');
+ const emojiOpen = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(false);
+ const dropActive = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(false);
+ const textareaEl = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(null);
+ const imageInput = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(null);
+ const fileInput = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(null);
+ const mentionOpen = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(false);
+ const mentionQuery = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)('');
+ const mentionStart = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)(-1);
+ const mentionedUserIds = (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .ref */ .KR)([]);
let dragDepth = 0;
const emojiList = ['😀', '😄', '😂', '😊', '😍', '😘', '😎', '😢', '😡', '👍', '🙏', '👏', '💪', '🎉', '❤️', '🔥', '🌹', '☕', '✅', '⭐', '💰', '🎁', '🤝', '👌'];
+ const filteredMentionUsers = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .computed */ .EW)(() => {
+ const query = mentionQuery.value.toLowerCase();
+ return props.mentionUsers.filter(member => member?.uid).filter(member => !query || mentionName(member).toLowerCase().includes(query)).slice(0, 12);
+ });
function submit() {
const value = text.value.trim();
if (!value) {
return;
}
- emit('send', value);
+ emit('send', {
+ text: value,
+ mentionedUserIds: [...mentionedUserIds.value]
+ });
text.value = '';
+ mentionedUserIds.value = [];
+ mentionOpen.value = false;
emojiOpen.value = false;
}
+ function mentionName(member) {
+ return String(member?.displayName || member?.name || member?.rawName || member?.uid || '群成员');
+ }
+ function handleMentionInput(event) {
+ const cursor = event?.target?.selectionStart ?? text.value.length;
+ const beforeCursor = text.value.slice(0, cursor);
+ const match = beforeCursor.match(/@([^\s@]*)$/);
+ mentionOpen.value = Boolean(match && props.mentionUsers.length);
+ mentionQuery.value = match?.[1] || '';
+ mentionStart.value = match ? cursor - match[1].length - 1 : -1;
+ }
+ function openMentionPicker() {
+ if (!props.mentionUsers.length) return;
+ const element = textareaEl.value;
+ const start = element?.selectionStart ?? text.value.length;
+ const end = element?.selectionEnd ?? start;
+ text.value = `${text.value.slice(0, start)}@${text.value.slice(end)}`;
+ mentionStart.value = start;
+ mentionQuery.value = '';
+ mentionOpen.value = true;
+ (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .nextTick */ .dY)(() => {
+ element?.focus();
+ element?.setSelectionRange(start + 1, start + 1);
+ });
+ }
+ function selectMention(member) {
+ const element = textareaEl.value;
+ const cursor = element?.selectionStart ?? text.value.length;
+ const start = mentionStart.value >= 0 ? mentionStart.value : cursor;
+ const name = mentionName(member);
+ text.value = `${text.value.slice(0, start)}@${name} ${text.value.slice(cursor)}`;
+ if (!mentionedUserIds.value.includes(String(member.uid))) {
+ mentionedUserIds.value.push(String(member.uid));
+ }
+ mentionOpen.value = false;
+ mentionQuery.value = '';
+ mentionStart.value = -1;
+ (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .nextTick */ .dY)(() => {
+ const nextCursor = start + name.length + 2;
+ element?.focus();
+ element?.setSelectionRange(nextCursor, nextCursor);
+ });
+ }
function toggleEmojiPicker() {
emojiOpen.value = !emojiOpen.value;
}
@@ -2209,70 +2380,86 @@ const _hoisted_9 = ["disabled"];
emitFiles(imageFiles, 'image');
}
return (_ctx, _cache) => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementBlock */ .CE)("form", {
- class: (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .normalizeClass */ .C4)(["message-composer", {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("form", {
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .normalizeClass */ .C4)(["message-composer", {
'drop-active': dropActive.value
}]),
- onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withModifiers */ .D$)(submit, ["prevent"]),
- onDragenter: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withModifiers */ .D$)(handleDragEnter, ["prevent"]),
- onDragover: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withModifiers */ .D$)(handleDragOver, ["prevent"]),
- onDragleave: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withModifiers */ .D$)(handleDragLeave, ["prevent"]),
- onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withModifiers */ .D$)(handleDrop, ["prevent"]),
+ onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(submit, ["prevent"]),
+ onDragenter: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(handleDragEnter, ["prevent"]),
+ onDragover: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(handleDragOver, ["prevent"]),
+ onDragleave: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(handleDragLeave, ["prevent"]),
+ onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(handleDrop, ["prevent"]),
onPaste: handlePaste
- }, [__props.quoteMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_6__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementBlock */ .CE)("div", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("span", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("strong", null, "引用", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createTextVNode */ .eW)(" " + (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .toDisplayString */ .v_)(__props.quoteMessage.quoteText || __props.quoteMessage.text), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("button", {
+ }, [__props.quoteMessage ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, "引用", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createTextVNode */ .eW)(" " + (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .toDisplayString */ .v_)(__props.quoteMessage.quoteText || __props.quoteMessage.text), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "取消引用",
onClick: _cache[0] || (_cache[0] = $event => _ctx.$emit('cancel-quote'))
- }, "×")])) : (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("div", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("button", {
+ }, "×")])) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "表情",
disabled: __props.disabled,
onClick: toggleEmojiPicker
- }, "☺", 8, _hoisted_3), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("button", {
+ }, "☺", 8, _hoisted_3), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
+ type: "button",
+ title: "艾特群成员",
+ disabled: __props.disabled || !__props.mentionUsers.length,
+ onClick: openMentionPicker
+ }, "@", 8, _hoisted_4), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "图片",
disabled: __props.disabled,
onClick: chooseImage
- }, "▧", 8, _hoisted_4), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("button", {
+ }, "▧", 8, _hoisted_5), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "文件",
disabled: __props.disabled,
onClick: chooseFile
- }, "▤", 8, _hoisted_5), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("input", {
+ }, "▤", 8, _hoisted_6), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("input", {
ref_key: "imageInput",
ref: imageInput,
type: "file",
accept: "image/*",
multiple: "",
onChange: _cache[1] || (_cache[1] = $event => selectAttachment($event, 'image'))
- }, null, 544), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("input", {
+ }, null, 544), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("input", {
ref_key: "fileInput",
ref: fileInput,
type: "file",
multiple: "",
onChange: _cache[2] || (_cache[2] = $event => selectAttachment($event, 'file'))
- }, null, 544), emojiOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_6__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementBlock */ .CE)("div", {
+ }, null, 544), emojiOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", {
key: 0,
class: "emoji-picker",
- onClick: _cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withModifiers */ .D$)(() => {}, ["stop"]))
- }, [((0,vue__WEBPACK_IMPORTED_MODULE_6__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_6__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .renderList */ .pI)(emojiList, emoji => {
- return (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(() => {}, ["stop"]))
+ }, [((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_7__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .renderList */ .pI)(emojiList, emoji => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
key: emoji,
type: "button",
onClick: $event => insertEmoji(emoji)
- }, (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .toDisplayString */ .v_)(emoji), 9, _hoisted_6);
- }), 64))])) : (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("textarea", {
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .toDisplayString */ .v_)(emoji), 9, _hoisted_7);
+ }), 64))])) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("textarea", {
ref_key: "textareaEl",
ref: textareaEl,
"onUpdate:modelValue": _cache[4] || (_cache[4] = $event => text.value = $event),
disabled: __props.disabled,
placeholder: "输入消息",
rows: "3",
- onKeydown: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withKeys */ .jR)((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .withModifiers */ .D$)(submit, ["exact", "prevent"]), ["enter"])
- }, null, 40, _hoisted_7), [[vue__WEBPACK_IMPORTED_MODULE_5__/* .vModelText */ .Jo, text.value]]), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("div", _hoisted_8, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("span", null, "Enter 发送,Shift + Enter 换行", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .createElementVNode */ .Lk)("button", {
+ onInput: handleMentionInput,
+ onKeydown: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withKeys */ .jR)((0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(submit, ["exact", "prevent"]), ["enter"])
+ }, null, 40, _hoisted_8), [[vue__WEBPACK_IMPORTED_MODULE_6__/* .vModelText */ .Jo, text.value]]), mentionOpen.value && filteredMentionUsers.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_9, [((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_7__/* .Fragment */ .FK, null, (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .renderList */ .pI)(filteredMentionUsers.value, member => {
+ return (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("button", {
+ key: member.uid,
+ type: "button",
+ onClick: $event => selectMention(member)
+ }, [member.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("img", {
+ key: 0,
+ src: member.portrait,
+ alt: ""
+ }, null, 8, _hoisted_11)) : ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .toDisplayString */ .v_)(mentionName(member).slice(0, 1)), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .toDisplayString */ .v_)(mentionName(member)), 1)], 8, _hoisted_10);
+ }), 128))])) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", _hoisted_13, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, "Enter 发送,Shift + Enter 换行", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
class: "send-button",
disabled: __props.disabled || !text.value.trim()
- }, "发送", 8, _hoisted_9)])], 34);
+ }, "发送", 8, _hoisted_14)])], 34);
};
}
});
@@ -2300,6 +2487,7 @@ const _hoisted_9 = ["disabled"];
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(5187);
/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(9045);
/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(446);
+/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(6384);
@@ -2318,7 +2506,7 @@ const _hoisted_3 = {
};
const _hoisted_4 = ["checked", "onChange"];
const _hoisted_5 = ["title", "onClick"];
-const _hoisted_6 = ["src"];
+const _hoisted_6 = ["src", "onError"];
const _hoisted_7 = {
key: 1
};
@@ -2345,7 +2533,7 @@ const _hoisted_14 = {
};
const _hoisted_15 = ["onClick"];
const _hoisted_16 = ["src", "alt"];
-const _hoisted_17 = ["src"];
+const _hoisted_17 = ["src", "onError"];
const _hoisted_18 = ["href"];
const _hoisted_19 = {
class: "message-file-main"
@@ -2415,6 +2603,7 @@ const _hoisted_41 = ["disabled"];
+
const IMAGE_MIN_SCALE = 0.5;
const IMAGE_MAX_SCALE = 6;
/* harmony default export */ __webpack_exports__.A = ({
@@ -2501,6 +2690,12 @@ const IMAGE_MAX_SCALE = 6;
notice: '',
error: ''
});
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_12__/* .useAutoDismiss */ .R)(() => senderProfile.error || senderProfile.notice, value => {
+ if ((senderProfile.error || senderProfile.notice) === value) {
+ senderProfile.error = '';
+ senderProfile.notice = '';
+ }
+ });
const imageViewerStyle = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .computed */ .EW)(() => ({
transform: `translate3d(${imageViewer.offsetX}px, ${imageViewer.offsetY}px, 0) scale(${imageViewer.scale}) rotate(${imageViewer.rotation}deg)`
}));
@@ -2633,6 +2828,11 @@ const IMAGE_MAX_SCALE = 6;
function isFileMessage(message) {
return message?.type === 'file' && message?.attachment?.url;
}
+ function displayFileName(message) {
+ const text = String(message?.text || '').trim();
+ const attachmentName = String(message?.attachment?.name || '').trim();
+ return text || attachmentName || '文件';
+ }
function isVideoMessage(message) {
return (message?.type === 'video' || Number(message?.contentType || 0) === 6) && message?.attachment?.url;
}
@@ -2725,7 +2925,7 @@ const IMAGE_MAX_SCALE = 6;
const displayName = contactAlias || groupAlias || rawName || uid;
senderProfile.visible = true;
senderProfile.uid = uid;
- senderProfile.userId = profile.userId || profile.name || cachedContact?.rawUser?.name || uid;
+ senderProfile.userId = profile.userId || profile.name || cachedContact?.rawUser?.name || '';
senderProfile.displayName = displayName;
senderProfile.rawName = rawName || '';
senderProfile.mobile = profile.mobile || cachedContact?.rawUser?.mobile || '';
@@ -2864,7 +3064,7 @@ const IMAGE_MAX_SCALE = 6;
const attachment = images[normalizedIndex]?.attachment || {};
imageViewer.index = normalizedIndex;
imageViewer.sourceUrl = attachment.url || '';
- imageViewer.url = (0,_services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__/* .imageDisplayUrl */ .B)(attachment.url || '');
+ imageViewer.url = attachment.url || '';
imageViewer.name = attachment.name || `图片 ${normalizedIndex + 1}`;
resetImageViewer();
}
@@ -3071,9 +3271,10 @@ const IMAGE_MAX_SCALE = 6;
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)($event => openSenderProfile(message), ["stop"])
}, [message.senderPortrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("img", {
key: 0,
- src: (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__/* .imageDisplayUrl */ .B)(message.senderPortrait),
- alt: ""
- }, null, 8, _hoisted_6)) : ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_7, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(groupSenderAvatarText(message)), 1))], 8, _hoisted_5)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), !isSystemMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_8, [showGroupSender(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("button", {
+ src: message.senderPortrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__/* .useImageProxyFallback */ .TJ)($event, message.senderPortrait)
+ }, null, 40, _hoisted_6)) : ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_7, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(groupSenderAvatarText(message)), 1))], 8, _hoisted_5)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), !isSystemMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_8, [showGroupSender(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("button", {
key: 0,
type: "button",
class: "message-sender-name",
@@ -3081,11 +3282,11 @@ const IMAGE_MAX_SCALE = 6;
}, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createTextVNode */ .eW)((0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(groupSenderName(message)) + " ", 1), senderRoleLabel(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderRoleLabel(message)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true)], 8, _hoisted_9)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", {
class: (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .normalizeClass */ .C4)(["message-bubble", roleBubbleClass(message)]),
onContextmenu: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)($event => openMenu($event, message), ["prevent"])
- }, [isRedPacketMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", _hoisted_13, [_cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", {
+ }, [isRedPacketMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", _hoisted_13, [_cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", {
class: "red-packet-icon"
- }, "福", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(redPacketBlessing(message)), 1), _cache[7] || (_cache[7] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("small", null, "请在 App 上领取", -1))])]), _cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", {
+ }, "福", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(redPacketBlessing(message)), 1), _cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("small", null, "请在 App 上领取", -1))])]), _cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", {
class: "red-packet-card-footer"
- }, "中聊红包", -1))])) : isRedPacketReceipt(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_14, [_cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", {
+ }, "中聊红包", -1))])) : isRedPacketReceipt(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_14, [_cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", {
class: "red-packet-mini-icon"
}, "福", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(redPacketReceiptText(message)), 1)])) : isImageMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("button", {
key: 2,
@@ -3093,30 +3294,31 @@ const IMAGE_MAX_SCALE = 6;
class: "message-image",
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)($event => handleImageClick(message), ["stop"])
}, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("img", {
- src: (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__/* .imageDisplayUrl */ .B)(message.attachment.url),
+ src: message.attachment.url,
alt: message.attachment.name || '图片'
}, null, 8, _hoisted_16)], 8, _hoisted_15)) : isVideoMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("video", {
key: 3,
class: "message-video",
- src: message.attachment.url,
+ src: (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__/* .videoDisplayUrl */ .nM)(message.attachment.url),
controls: "",
playsinline: "",
- preload: "metadata"
- }, " 当前浏览器无法播放该视频 ", 8, _hoisted_17)) : isFileMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("a", {
+ preload: "metadata",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__/* .useVideoOriginalFallback */ .eR)($event, message.attachment.url)
+ }, " 当前浏览器无法播放该视频 ", 40, _hoisted_17)) : isFileMessage(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("a", {
key: 4,
class: "message-file",
href: message.attachment.url,
target: "_blank",
rel: "noreferrer",
download: ""
- }, [_cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", {
+ }, [_cache[12] || (_cache[12] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", {
class: "message-file-icon"
- }, "▤", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(message.attachment.name || '文件'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(formatFileSize(message.attachment.size)), 1)])], 8, _hoisted_18)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), message.text && !isRedPacketMessage(message) && !isRedPacketReceipt(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("p", _hoisted_20, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(message.text), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("time", null, [isRecallNotice(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(message.recallStatus || '已撤回'), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(formatTime(message.displayTimestamp || message.timestamp)), 1), message.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_22, "【edit " + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(formatTime(message.editedAt)) + "】", 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), isFavorite(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_23, "★")) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), deliveryState(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", {
+ }, "▤", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", _hoisted_19, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(displayFileName(message)), 1), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(formatFileSize(message.attachment.size)), 1)])], 8, _hoisted_18)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), message.text && !isFileMessage(message) && !isRedPacketMessage(message) && !isRedPacketReceipt(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("p", _hoisted_20, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(message.text), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("time", null, [isRecallNotice(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(message.recallStatus || '已撤回'), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(formatTime(message.displayTimestamp || message.timestamp)), 1), message.editedAt ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_22, "【edit " + (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(formatTime(message.editedAt)) + "】", 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), isFavorite(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_23, "★")) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), deliveryState(message) ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", {
key: 3,
class: (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .normalizeClass */ .C4)(["delivery-mark", `delivery-mark-${deliveryState(message)}`]),
title: deliveryTitle(message),
"aria-label": deliveryTitle(message)
- }, [_cache[12] || (_cache[12] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", {
+ }, [_cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", {
class: "delivery-check"
}, "✓", -1)), deliveryState(message) !== 'sent' ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_25, "✓")) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true)], 10, _hoisted_24)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), message.status === 'failed' ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_26, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(failureText(message)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true)])], 42, _hoisted_11)])) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true)], 10, _hoisted_1);
}), 128)), contextMenu.visible ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", {
@@ -3193,8 +3395,8 @@ const IMAGE_MAX_SCALE = 6;
onClick: closeSenderProfile
}, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("section", {
class: "sender-profile-dialog",
- onClick: _cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(() => {}, ["stop"]))
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("header", null, [_cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, "用户资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
+ onClick: _cache[7] || (_cache[7] = (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .withModifiers */ .D$)(() => {}, ["stop"]))
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("header", null, [_cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, "用户资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
@@ -3202,10 +3404,11 @@ const IMAGE_MAX_SCALE = 6;
}, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", _hoisted_29, [senderProfile.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "profile-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__/* .imageDisplayUrl */ .B)(senderProfile.portrait),
- alt: ""
- }, null, 8, _hoisted_30)) : ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_31, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.displayName || senderProfile.uid), 1), senderProfile.roleLabel ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_32, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.roleLabel), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dl", _hoisted_33, [(0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", null, [_cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.userId || senderProfile.uid || '-'), 1)]), senderProfile.uid && senderProfile.userId && senderProfile.uid !== senderProfile.userId ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_34, [_cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "用户UID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.uid), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", null, [_cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.rawName || senderProfile.displayName || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", null, [_cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.mobile || '未知'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.address || '未知'), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("label", _hoisted_35, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, "备注名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[5] || (_cache[5] = $event => senderProfile.aliasDraft = $event),
+ src: senderProfile.portrait,
+ alt: "",
+ onError: _cache[5] || (_cache[5] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_8__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_11__/* .useImageProxyFallback */ .TJ)($event, senderProfile.portrait))
+ }, null, 40, _hoisted_30)) : ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_31, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.displayName || senderProfile.uid), 1), senderProfile.roleLabel ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("span", _hoisted_32, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.roleLabel), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dl", _hoisted_33, [senderProfile.isContact ? ((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementBlock */ .CE)("div", _hoisted_34, [_cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.userId || '-'), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", null, [_cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.rawName || senderProfile.displayName || '-'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", null, [_cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.mobile || '未知'), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("div", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_9__/* .toDisplayString */ .v_)(senderProfile.address || '未知'), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("label", _hoisted_35, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("span", null, "备注名称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_7__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_7__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = $event => senderProfile.aliasDraft = $event),
maxlength: "32",
autocomplete: "off",
placeholder: "可给群员设置备注",
@@ -3238,7 +3441,8 @@ const IMAGE_MAX_SCALE = 6;
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(144);
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5187);
/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9045);
-/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(446);
+/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6384);
+/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(446);
const _hoisted_1 = {
class: "contact-panel"
@@ -3279,6 +3483,7 @@ const _hoisted_13 = {
+
/* harmony default export */ __webpack_exports__.A = ({
__name: 'ContactPanel',
setup(__props) {
@@ -3292,6 +3497,9 @@ const _hoisted_13 = {
const aliasDraft = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .ref */ .KR)('');
const aliasSaving = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .ref */ .KR)(false);
const aliasError = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .ref */ .KR)('');
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_5__/* .useAutoDismiss */ .R)(aliasError, value => {
+ if (aliasError.value === value) aliasError.value = '';
+ });
(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .watch */ .wB)(contact, () => {
editingAlias.value = false;
aliasError.value = '';
@@ -3328,16 +3536,17 @@ const _hoisted_13 = {
}, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("h2", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(remarkName.value), 1), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(username.value), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_3, [contact.value.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "profile-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_5__/* .imageDisplayUrl */ .B)(contact.value.portrait),
- alt: ""
- }, null, 8, _hoisted_4)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("div", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(contact.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_6, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(remarkName.value), 1), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", {
+ src: contact.value.portrait,
+ alt: "",
+ onError: _cache[0] || (_cache[0] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_6__/* .useImageProxyFallback */ .TJ)($event, contact.value.portrait))
+ }, null, 40, _hoisted_4)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("div", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(contact.value.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_6, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", _hoisted_7, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(remarkName.value), 1), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button remark-edit-button",
title: "编辑备注名",
onClick: openAliasEditor
- }, "✏️")])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dl", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "用户名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(username.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(mobile.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(address.value), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", {
+ }, "✏️")])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dl", _hoisted_8, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[3] || (_cache[3] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "用户名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(username.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[4] || (_cache[4] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "手机号", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(mobile.value), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("div", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dt", null, "地区", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("dd", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(address.value), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", {
class: "primary-action profile-action",
- onClick: _cache[0] || (_cache[0] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .unref */ .R1)(contacts).openChat(contact.value))
+ onClick: _cache[1] || (_cache[1] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .unref */ .R1)(contacts).openChat(contact.value))
}, "发消息")]), editingAlias.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("div", {
key: 0,
class: "modal-backdrop contact-modal-backdrop",
@@ -3345,13 +3554,13 @@ const _hoisted_13 = {
}, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("form", {
class: "modal-panel",
onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_0__/* .withModifiers */ .D$)(submitAlias, ["prevent"])
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("header", null, [_cache[5] || (_cache[5] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("strong", null, "编辑备注名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("header", null, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("strong", null, "编辑备注名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
onClick: closeAliasEditor
- }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("label", null, [_cache[6] || (_cache[6] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("span", null, "备注名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => aliasDraft.value = $event),
+ }, "×")]), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("label", null, [_cache[7] || (_cache[7] = (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("span", null, "备注名", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => aliasDraft.value = $event),
maxlength: "32",
autocomplete: "off",
autofocus: ""
@@ -3366,7 +3575,7 @@ const _hoisted_13 = {
type: "submit",
class: "primary-inline-action",
disabled: aliasSaving.value
- }, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(aliasSaving.value ? '保存中' : '保存'), 9, _hoisted_12)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createCommentVNode */ .Q3)("", true)], 64)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("div", _hoisted_13, _cache[7] || (_cache[7] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("strong", null, "选择一个联系人", -1), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("span", null, "好友列表同步完成后,可以在左侧查看资料", -1)])))]);
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(aliasSaving.value ? '保存中' : '保存'), 9, _hoisted_12)])], 32)])) : (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createCommentVNode */ .Q3)("", true)], 64)) : ((0,vue__WEBPACK_IMPORTED_MODULE_1__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementBlock */ .CE)("div", _hoisted_13, _cache[8] || (_cache[8] = [(0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("strong", null, "选择一个联系人", -1), (0,vue__WEBPACK_IMPORTED_MODULE_1__/* .createElementVNode */ .Lk)("span", null, "好友列表同步完成后,可以在左侧查看资料", -1)])))]);
};
}
});
@@ -3476,11 +3685,11 @@ const _hoisted_6 = {
/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(116);
/* harmony import */ var core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_find_js__WEBPACK_IMPORTED_MODULE_1__);
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6768);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(144);
-/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5187);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5187);
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(144);
/* harmony import */ var _stores_conversations__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(7566);
/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(1414);
-/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(446);
+/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(6384);
@@ -3534,8 +3743,11 @@ const _hoisted_14 = {
const conversations = (0,_stores_conversations__WEBPACK_IMPORTED_MODULE_5__/* .useConversationStore */ .w)();
const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_6__/* .useNavigationStore */ .l)();
const favorite = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .computed */ .EW)(() => conversations.activeFavorite);
- const notice = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)('');
- const error = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .ref */ .KR)('');
+ const notice = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .ref */ .KR)('');
+ const error = (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .ref */ .KR)('');
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_7__/* .useAutoDismiss */ .R)(() => error.value || notice.value, value => {
+ if ((error.value || notice.value) === value) clearFeedback();
+ });
function clearFeedback() {
notice.value = '';
error.value = '';
@@ -3661,20 +3873,20 @@ const _hoisted_14 = {
return (_ctx, _cache) => {
return (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("section", _hoisted_1, [favorite.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)(vue__WEBPACK_IMPORTED_MODULE_2__/* .Fragment */ .FK, {
key: 0
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", null, [_cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("h2", null, "收藏详情", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(favoriteTitle(favorite.value)), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", {
- class: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .normalizeClass */ .C4)(["favorite-detail-message", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("header", _hoisted_2, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", null, [_cache[0] || (_cache[0] = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("h2", null, "收藏详情", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("p", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(favoriteTitle(favorite.value)), 1)])]), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", {
+ class: (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .normalizeClass */ .C4)(["favorite-detail-message", {
recalled: favorite.value.recalled
}])
}, [_cache[2] || (_cache[2] = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("span", {
class: "favorite-detail-star"
- }, "★", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", _hoisted_4, [favorite.value.recalled ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("span", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(favorite.value.recallStatus || '已撤回'), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createCommentVNode */ .Q3)("", true), isImageFavorite(favorite.value) ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("a", {
+ }, "★", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", _hoisted_4, [favorite.value.recalled ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("span", _hoisted_5, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(favorite.value.recallStatus || '已撤回'), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createCommentVNode */ .Q3)("", true), isImageFavorite(favorite.value) ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("a", {
key: 1,
class: "favorite-detail-image",
href: favorite.value.attachment.url,
target: "_blank",
rel: "noreferrer"
}, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("img", {
- src: (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__/* .imageDisplayUrl */ .B)(favorite.value.attachment.url),
+ src: favorite.value.attachment.url,
alt: favorite.value.attachment.name || '图片'
}, null, 8, _hoisted_7)], 8, _hoisted_6)) : isFileFavorite(favorite.value) ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("a", {
key: 2,
@@ -3685,7 +3897,7 @@ const _hoisted_14 = {
download: ""
}, [_cache[1] || (_cache[1] = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("span", {
class: "message-file-icon"
- }, "▤", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(favorite.value.attachment.name || '文件'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(formatFileSize(favorite.value.attachment.size)), 1)])], 8, _hoisted_8)) : (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createCommentVNode */ .Q3)("", true), favoriteText(favorite.value) ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("p", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(favoriteText(favorite.value)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("time", null, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(formatFavoriteTime(favorite.value.timestamp)), 1)], 2), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", _hoisted_11, [notice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("span", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(notice.value), 1)) : error.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("span", _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .toDisplayString */ .v_)(error.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("button", {
+ }, "▤", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(favorite.value.attachment.name || '文件'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(formatFileSize(favorite.value.attachment.size)), 1)])], 8, _hoisted_8)) : (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createCommentVNode */ .Q3)("", true), favoriteText(favorite.value) ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("p", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(favoriteText(favorite.value)), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createCommentVNode */ .Q3)("", true)]), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("time", null, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(formatFavoriteTime(favorite.value.timestamp)), 1)], 2), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("div", _hoisted_11, [notice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("span", _hoisted_12, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(notice.value), 1)) : error.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_2__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementBlock */ .CE)("span", _hoisted_13, (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .toDisplayString */ .v_)(error.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "ghost-inline-action",
onClick: copyFavorite
@@ -3739,7 +3951,7 @@ const _hoisted_5 = {
class: "sidebar-scroll"
};
const _hoisted_6 = ["onClick"];
-const _hoisted_7 = ["src"];
+const _hoisted_7 = ["src", "onError"];
const _hoisted_8 = {
key: 1,
class: "conversation-avatar"
@@ -3825,9 +4037,10 @@ const _hoisted_14 = ["disabled"];
}, [item.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_8__/* .imageDisplayUrl */ .B)(item.portrait),
- alt: ""
- }, null, 8, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("span", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(item.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(item.title), 1), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(item.subtitle), 1)])], 10, _hoisted_6);
+ src: item.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_8__/* .useImageProxyFallback */ .TJ)($event, item.portrait)
+ }, null, 40, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("span", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(item.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(item.title), 1), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)(item.subtitle), 1)])], 10, _hoisted_6);
}), 128)), !filteredContacts.value.length ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("div", _hoisted_10, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("strong", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(contacts).loading ? '正在加载' : '暂无联系人'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementVNode */ .Lk)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_6__/* .toDisplayString */ .v_)((0,vue__WEBPACK_IMPORTED_MODULE_5__/* .unref */ .R1)(contacts).loading ? '请稍候' : '好友同步完成后会显示在这里'), 1)])) : (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createCommentVNode */ .Q3)("", true)]), addingContact.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .createElementBlock */ .CE)("div", {
key: 0,
class: "modal-backdrop",
@@ -3935,7 +4148,7 @@ const _hoisted_5 = {
class: "sidebar-scroll"
};
const _hoisted_6 = ["onClick", "onContextmenu"];
-const _hoisted_7 = ["src"];
+const _hoisted_7 = ["src", "onError"];
const _hoisted_8 = {
key: 1,
class: "conversation-avatar"
@@ -4095,6 +4308,14 @@ const _hoisted_19 = ["disabled"];
if (item) conversations.togglePinnedConversation(item.id);
closeConversationMenu();
}
+ function deleteConversation() {
+ const item = conversationMenu.value.item;
+ if (item && window.confirm(`确定删除与“${item.title}”的会话吗?`)) {
+ conversations.removeConversation(item.id);
+ conversations.setActionNotice('会话已删除');
+ }
+ closeConversationMenu();
+ }
const ContactPicker = (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .defineComponent */ .pM)({
name: 'ContactPicker',
props: {
@@ -4360,9 +4581,10 @@ const _hoisted_19 = ["disabled"];
}, [item.portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("img", {
key: 0,
class: "conversation-avatar image-avatar",
- src: (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .imageDisplayUrl */ .B)(item.portrait),
- alt: ""
- }, null, 8, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(item.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, [isPinned(item) ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_10, "⌖")) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createTextVNode */ .eW)((0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(item.title), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(item.subtitle), 1)]), Number(item.unread || 0) > 0 ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", {
+ src: item.portrait,
+ alt: "",
+ onError: $event => (0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_22__/* .useImageProxyFallback */ .TJ)($event, item.portrait)
+ }, null, 40, _hoisted_7)) : ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_8, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(item.avatarText), 1)), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", _hoisted_9, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, [isPinned(item) ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", _hoisted_10, "⌖")) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createTextVNode */ .eW)((0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(item.title), 1)]), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("small", null, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(item.subtitle), 1)]), Number(item.unread || 0) > 0 ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("span", {
key: 2,
class: "unread-badge",
"aria-label": `${item.unread} 条未读消息`
@@ -4378,7 +4600,10 @@ const _hoisted_19 = ["disabled"];
}, [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", {
type: "button",
onClick: togglePinned
- }, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(isPinned(conversationMenu.value.item) ? '取消置顶' : '置顶会话'), 1)], 4)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), !filteredConversationItems.value.length && searchKeyword.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_12, _cache[20] || (_cache[20] = [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, "没有匹配结果", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "换个关键词再试试", -1)]))) : !(0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).conversations.length && !(0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).usingDemoData ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_13, _cache[21] || (_cache[21] = [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, "暂无会话", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "收到或发起消息后会出现在这里", -1)]))) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]), activeAction.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", {
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_19__/* .toDisplayString */ .v_)(isPinned(conversationMenu.value.item) ? '取消置顶' : '置顶会话'), 1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("button", {
+ type: "button",
+ onClick: deleteConversation
+ }, "删除会话")], 4)) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true), !filteredConversationItems.value.length && searchKeyword.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_12, _cache[20] || (_cache[20] = [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, "没有匹配结果", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "换个关键词再试试", -1)]))) : !(0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).conversations.length && !(0,vue__WEBPACK_IMPORTED_MODULE_18__/* .unref */ .R1)(conversations).usingDemoData ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", _hoisted_13, _cache[21] || (_cache[21] = [(0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("strong", null, "暂无会话", -1), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementVNode */ .Lk)("span", null, "收到或发起消息后会出现在这里", -1)]))) : (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createCommentVNode */ .Q3)("", true)]), activeAction.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_17__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_17__/* .createElementBlock */ .CE)("div", {
key: 0,
class: "modal-backdrop",
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_16__/* .withModifiers */ .D$)(closeActionModal, ["self"])
@@ -4497,9 +4722,10 @@ const _hoisted_19 = ["disabled"];
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(144);
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5187);
/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(926);
-/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(446);
-/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(1414);
-/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(9045);
+/* harmony import */ var _stores_navigation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(1414);
+/* harmony import */ var _stores_contacts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(9045);
+/* harmony import */ var _composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(6384);
+/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(446);
@@ -4598,13 +4824,14 @@ const _hoisted_34 = ["disabled"];
+
const CROP_OUTPUT_SIZE = 512;
/* harmony default export */ __webpack_exports__.A = ({
__name: 'NavigationRail',
setup(__props) {
const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_6__/* .useSessionStore */ .B)();
- const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_8__/* .useNavigationStore */ .l)();
- const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_9__/* .useContactStore */ .p)();
+ const navigation = (0,_stores_navigation__WEBPACK_IMPORTED_MODULE_7__/* .useNavigationStore */ .l)();
+ const contacts = (0,_stores_contacts__WEBPACK_IMPORTED_MODULE_8__/* .useContactStore */ .p)();
const settingsItems = [{
key: 'notifications',
label: '通知设置'
@@ -4677,6 +4904,21 @@ const CROP_OUTPUT_SIZE = 512;
dragOffsetX: 0,
dragOffsetY: 0
});
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_9__/* .useAutoDismiss */ .R)(() => settingsError.value || settingsNotice.value, value => {
+ if ((settingsError.value || settingsNotice.value) === value) {
+ settingsError.value = '';
+ settingsNotice.value = '';
+ }
+ });
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_9__/* .useAutoDismiss */ .R)(() => profileError.value || profileNotice.value, value => {
+ if ((profileError.value || profileNotice.value) === value) {
+ profileError.value = '';
+ profileNotice.value = '';
+ }
+ });
+ (0,_composables_useAutoDismiss__WEBPACK_IMPORTED_MODULE_9__/* .useAutoDismiss */ .R)(() => avatarCropper.error, value => {
+ if (avatarCropper.error === value) avatarCropper.error = '';
+ });
const avatarPreviewStyle = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .computed */ .EW)(() => ({
transform: `translate3d(${avatarPreviewViewer.offsetX}px, ${avatarPreviewViewer.offsetY}px, 0) scale(${avatarPreviewViewer.scale})`
}));
@@ -5104,14 +5346,15 @@ const CROP_OUTPUT_SIZE = 512;
onClick: openProfileEditor
}, [(0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(session).portrait ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("img", {
key: 0,
- src: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_7__/* .imageDisplayUrl */ .B)((0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(session).portrait),
- alt: ""
- }, null, 8, _hoisted_2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("span", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(initials.value), 1))]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
+ src: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(session).portrait,
+ alt: "",
+ onError: _cache[0] || (_cache[0] = $event => (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(_services_mediaProxy__WEBPACK_IMPORTED_MODULE_10__/* .useImageProxyFallback */ .TJ)($event, (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(session).portrait))
+ }, null, 40, _hoisted_2)) : ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("span", _hoisted_3, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(initials.value), 1))]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
class: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .normalizeClass */ .C4)(["rail-button", {
active: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).section === 'messages'
}]),
title: "消息",
- onClick: _cache[0] || (_cache[0] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).showMessages && (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).showMessages(...args))
+ onClick: _cache[1] || (_cache[1] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).showMessages && (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).showMessages(...args))
}, "💬", 2), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
class: (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .normalizeClass */ .C4)(["rail-button", {
active: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).section === 'contacts'
@@ -5123,15 +5366,15 @@ const CROP_OUTPUT_SIZE = 512;
active: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).section === 'favorites'
}]),
title: "收藏",
- onClick: _cache[1] || (_cache[1] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).showFavorites && (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).showFavorites(...args))
- }, "☆", 2), _cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", {
+ onClick: _cache[2] || (_cache[2] = (...args) => (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).showFavorites && (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(navigation).showFavorites(...args))
+ }, "☆", 2), _cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", {
class: "rail-spacer"
}, null, -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
class: "rail-button",
title: "设置",
"aria-label": "设置",
onClick: openSettings
- }, _cache[13] || (_cache[13] = [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("svg", {
+ }, _cache[14] || (_cache[14] = [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("svg", {
viewBox: "0 0 24 24",
"aria-hidden": "true"
}, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("path", {
@@ -5143,11 +5386,11 @@ const CROP_OUTPUT_SIZE = 512;
title: "退出登录",
"aria-label": "退出登录",
onClick: logout
- }, _cache[14] || (_cache[14] = [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createStaticVNode */ .Fv)(" ", 1)]))]), settingsOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("div", {
+ }, _cache[15] || (_cache[15] = [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createStaticVNode */ .Fv)(" ", 1)]))]), settingsOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("div", {
key: 0,
class: "modal-backdrop settings-backdrop",
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(closeSettings, ["self"])
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("section", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", null, [_cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, "设置", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("section", _hoisted_4, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", null, [_cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, "设置", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
@@ -5165,30 +5408,30 @@ const CROP_OUTPUT_SIZE = 512;
key: 0,
class: "settings-password-form",
onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(savePassword, ["prevent"])
- }, [_cache[20] || (_cache[20] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("h3", null, "更改密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "当前密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => passwordDraft.oldPassword = $event),
+ }, [_cache[21] || (_cache[21] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("h3", null, "更改密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "当前密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = $event => passwordDraft.oldPassword = $event),
type: "password",
autocomplete: "current-password"
- }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_2__/* .vModelText */ .Jo, passwordDraft.oldPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "新密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[3] || (_cache[3] = $event => passwordDraft.newPassword = $event),
+ }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_2__/* .vModelText */ .Jo, passwordDraft.oldPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "新密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => passwordDraft.newPassword = $event),
type: "password",
autocomplete: "new-password"
- }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_2__/* .vModelText */ .Jo, passwordDraft.newPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "确认新密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[4] || (_cache[4] = $event => passwordDraft.confirmPassword = $event),
+ }, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_2__/* .vModelText */ .Jo, passwordDraft.newPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[20] || (_cache[20] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "确认新密码", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = $event => passwordDraft.confirmPassword = $event),
type: "password",
autocomplete: "new-password"
}, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_2__/* .vModelText */ .Jo, passwordDraft.confirmPassword]])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("footer", null, [settingsNotice.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("span", _hoisted_9, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(settingsNotice.value), 1)) : settingsError.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("span", _hoisted_10, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(settingsError.value), 1)) : (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createCommentVNode */ .Q3)("", true), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "submit",
class: "primary-inline-action",
disabled: passwordSaving.value
- }, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(passwordSaving.value ? '保存中...' : '保存密码'), 9, _hoisted_11)])], 32)) : ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("section", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(activeSettingsItem.value?.label || '设置'), 1), _cache[21] || (_cache[21] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("p", null, "该功能稍后开放。", -1))]))])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createCommentVNode */ .Q3)("", true), profileOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("div", {
+ }, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(passwordSaving.value ? '保存中...' : '保存密码'), 9, _hoisted_11)])], 32)) : ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("section", _hoisted_12, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("h3", null, (0,vue__WEBPACK_IMPORTED_MODULE_5__/* .toDisplayString */ .v_)(activeSettingsItem.value?.label || '设置'), 1), _cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("p", null, "该功能稍后开放。", -1))]))])])])) : (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createCommentVNode */ .Q3)("", true), profileOpen.value ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("div", {
key: 1,
class: "modal-backdrop",
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(closeProfileEditor, ["self"])
}, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("form", {
class: "modal-panel profile-edit-panel",
onSubmit: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(saveProfile, ["prevent"])
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", null, [_cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, "个人资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", null, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, "个人资料", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "icon-button",
title: "关闭",
@@ -5214,13 +5457,13 @@ const CROP_OUTPUT_SIZE = 512;
type: "file",
accept: "image/*",
onChange: selectPortrait
- }, null, 544)]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
- "onUpdate:modelValue": _cache[5] || (_cache[5] = $event => profileDraft.value.displayName = $event),
+ }, null, 544)]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "昵称", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .withDirectives */ .bo)((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = $event => profileDraft.value.displayName = $event),
maxlength: "64",
autocomplete: "off"
}, null, 512), [[vue__WEBPACK_IMPORTED_MODULE_2__/* .vModelText */ .Jo, profileDraft.value.displayName, void 0, {
trim: true
- }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[24] || (_cache[24] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
+ }]])]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("label", null, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("span", null, "用户ID", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("input", {
value: (0,vue__WEBPACK_IMPORTED_MODULE_4__/* .unref */ .R1)(session).userId,
readonly: ""
}, null, 8, _hoisted_16)]), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", _hoisted_17, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
@@ -5234,14 +5477,14 @@ const CROP_OUTPUT_SIZE = 512;
key: 2,
class: "modal-backdrop avatar-preview-backdrop",
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(closeAvatarPreview, ["self"])
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("section", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", null, [_cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, "头像预览", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("section", _hoisted_21, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", null, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, "头像预览", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", _hoisted_22, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "缩小",
- onClick: _cache[6] || (_cache[6] = $event => zoomAvatarPreview(1 / 1.16))
+ onClick: _cache[7] || (_cache[7] = $event => zoomAvatarPreview(1 / 1.16))
}, "−"), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "放大",
- onClick: _cache[7] || (_cache[7] = $event => zoomAvatarPreview(1.16))
+ onClick: _cache[8] || (_cache[8] = $event => zoomAvatarPreview(1.16))
}, "+"), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "还原",
@@ -5269,7 +5512,7 @@ const CROP_OUTPUT_SIZE = 512;
key: 3,
class: "modal-backdrop avatar-cropper-backdrop",
onClick: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(closeAvatarCropper, ["self"])
- }, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("section", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", null, [_cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, "头像预裁切", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
+ }, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("section", _hoisted_24, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("header", null, [_cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("strong", null, "头像预裁切", -1)), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", _hoisted_25, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
class: "primary-inline-action",
disabled: avatarCropper.busy,
@@ -5288,33 +5531,33 @@ const CROP_OUTPUT_SIZE = 512;
onPointermove: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(moveCropperDrag, ["prevent"]),
onPointerup: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(stopCropperDrag, ["prevent"]),
onPointerleave: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(stopCropperDrag, ["prevent"]),
- onDragover: _cache[8] || (_cache[8] = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(() => {}, ["prevent"])),
+ onDragover: _cache[9] || (_cache[9] = (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(() => {}, ["prevent"])),
onDrop: (0,vue__WEBPACK_IMPORTED_MODULE_2__/* .withModifiers */ .D$)(dropPortrait, ["prevent"])
}, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("canvas", {
ref_key: "cropperCanvas",
ref: cropperCanvas
- }, null, 512), _cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", {
+ }, null, 512), _cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", {
class: "avatar-cropper-mask",
"aria-hidden": "true"
- }, null, -1)), _cache[28] || (_cache[28] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", {
+ }, null, -1)), _cache[29] || (_cache[29] = (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", {
class: "avatar-cropper-box",
"aria-hidden": "true"
}, null, -1)), !avatarCropper.loaded ? ((0,vue__WEBPACK_IMPORTED_MODULE_3__/* .openBlock */ .uX)(), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementBlock */ .CE)("div", _hoisted_28, "图片加载中")) : (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createCommentVNode */ .Q3)("", true)], 34), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("aside", _hoisted_29, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("div", _hoisted_30, [(0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "左旋90度",
- onClick: _cache[9] || (_cache[9] = $event => rotateCropper(-90))
+ onClick: _cache[10] || (_cache[10] = $event => rotateCropper(-90))
}, "↶90°"), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "右旋90度",
- onClick: _cache[10] || (_cache[10] = $event => rotateCropper(90))
+ onClick: _cache[11] || (_cache[11] = $event => rotateCropper(90))
}, "↷90°"), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "放大",
- onClick: _cache[11] || (_cache[11] = $event => zoomCropper(1.12))
+ onClick: _cache[12] || (_cache[12] = $event => zoomCropper(1.12))
}, "+"), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "缩小",
- onClick: _cache[12] || (_cache[12] = $event => zoomCropper(1 / 1.12))
+ onClick: _cache[13] || (_cache[13] = $event => zoomCropper(1 / 1.12))
}, "−"), (0,vue__WEBPACK_IMPORTED_MODULE_3__/* .createElementVNode */ .Lk)("button", {
type: "button",
title: "重置",
@@ -5339,6 +5582,33 @@ const CROP_OUTPUT_SIZE = 512;
/***/ }),
+/***/ 6384:
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ R: function() { return /* binding */ useAutoDismiss; }
+/* harmony export */ });
+/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6768);
+
+function useAutoDismiss(source, clear, delay = 3000) {
+ let timer = null;
+ (0,vue__WEBPACK_IMPORTED_MODULE_0__/* .watch */ .wB)(source, value => {
+ window.clearTimeout(timer);
+ timer = null;
+ if (!value) return;
+ const currentValue = value;
+ timer = window.setTimeout(() => {
+ clear(currentValue);
+ timer = null;
+ }, delay);
+ }, {
+ flush: 'post'
+ });
+ (0,vue__WEBPACK_IMPORTED_MODULE_0__/* .onBeforeUnmount */ .xo)(() => window.clearTimeout(timer));
+}
+
+/***/ }),
+
/***/ 2169:
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
@@ -6103,7 +6373,13 @@ function mergeSyncedMessages(localMessages, remoteMessages, conversationId, user
if (message.status === 'sent') {
return !hasRemoteMatch(message) && now - Number(message.timestamp || 0) < 30000;
}
- return message.status === 'sending' || message.status === 'failed';
+ if (message.status === 'failed') {
+ // Failed optimistic messages are only transient feedback. Keeping them in
+ // localStorage forever makes an old server error reappear every time the
+ // conversation is opened, even after later messages send successfully.
+ return now - Number(message.timestamp || 0) < 3000;
+ }
+ return message.status === 'sending';
});
return [...visibleRemoteMessages, ...pendingLocalMessages].sort((a, b) => {
return Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0);
@@ -6342,7 +6618,9 @@ class HttpImClient {
displayTimestamp: message.displayTimestamp || message.timestamp,
conversationId: conversation.id
}));
+ messages.hasPinnedMessageState = Object.prototype.hasOwnProperty.call(response.data?.result || {}, 'pinnedMessageUid');
messages.pinnedMessageUid = String(response.data?.result?.pinnedMessageUid || '');
+ messages.pinnedMessage = response.data?.result?.pinnedMessage || null;
if (options.includeConversations && Array.isArray(response.data?.result?.conversations)) {
const remoteConversations = response.data.result.conversations.map(remoteConversation => ({
...remoteConversation,
@@ -6360,22 +6638,111 @@ class HttpImClient {
const messagesByConversation = readLocalMessages(userId);
messagesByConversation[conversation.id] = mergeSyncedMessages(messagesByConversation[conversation.id] || [], messages, conversation.id, userId);
messagesByConversation[conversation.id].pinnedMessageUid = messages.pinnedMessageUid;
+ messagesByConversation[conversation.id].pinnedMessage = messages.pinnedMessage;
+ messagesByConversation[conversation.id].hasPinnedMessageState = messages.hasPinnedMessageState;
writeLocalMessages(messagesByConversation, userId);
return messagesByConversation[conversation.id];
}
- async setPinnedMessage(conversation, messageUid = '') {
+ async setPinnedMessage(conversation, messageUid = '', message = null) {
+ const isGroup = ['group', 'channel'].includes(conversation?.type) || ['group', 'channel', 1, '1'].includes(conversation?.raw?.type);
+ if (isGroup) {
+ if (messageUid && message) {
+ return this.addGroupPinnedMessage(conversation, message);
+ }
+ const serverPinId = String(message?.serverPinId || message?.pinId || '').trim();
+ if (!serverPinId) {
+ throw new Error('缺少置顶记录ID,请刷新会话后重试');
+ }
+ return this.removeGroupPinnedMessage(serverPinId);
+ }
const action = messageUid ? 'pin' : 'unpin';
const response = await axios__WEBPACK_IMPORTED_MODULE_17__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_18__/* .appConfig */ .U.messageActionApi, {
action,
userId: this.currentUser?.userId || '',
messageUid: messageUid || '1',
target: conversation.target || conversation.raw?.target || '',
- conversationType: ['group', 'channel'].includes(conversation.type) ? 'group' : 'single'
+ conversationType: ['group', 'channel'].includes(conversation.type) ? 'group' : 'single',
+ message: message ? {
+ id: String(message.messageUid || message.id || messageUid),
+ messageUid: String(message.messageUid || message.id || messageUid),
+ text: String(message.text || ''),
+ type: message.type || 'text',
+ attachment: message.attachment || null,
+ senderName: message.senderName || message.from || '',
+ timestamp: Number(message.displayTimestamp || message.timestamp || Date.now())
+ } : null
}, {
withCredentials: false
});
if (response.data?.code !== 0) throw new Error(response.data?.message || '置顶失败');
}
+ async fetchGroupPinnedMessages(conversation) {
+ const groupId = String(conversation?.target || conversation?.raw?.target || '').trim();
+ if (!groupId) return [];
+ const url = `${_config__WEBPACK_IMPORTED_MODULE_18__/* .appConfig */ .U.appServer}/groupTopMessage/gets`;
+ const response = await axios__WEBPACK_IMPORTED_MODULE_17__/* ["default"] */ .A.get(url, {
+ params: {
+ groupId
+ },
+ headers: this.getAppAuthHeaders(url),
+ withCredentials: false
+ });
+ const payload = response.data || {};
+ if (payload.code !== undefined && Number(payload.code) !== 0) {
+ throw new Error(payload.message || '置顶消息加载失败');
+ }
+ const result = payload.result ?? payload.data ?? payload;
+ return Array.isArray(result) ? result : [];
+ }
+ async addGroupPinnedMessage(conversation, message) {
+ const groupId = String(conversation?.target || conversation?.raw?.target || '').trim();
+ const messageId = String(message?.messageId || message?.messageUid || message?.id || '').trim();
+ if (!groupId || !messageId) throw new Error('缺少群ID或消息ID');
+ const searchableContent = String(message?.text || '').trim() || (message?.type === 'image' ? '[图片]' : message?.type === 'video' ? '[视频]' : '[消息]');
+ const rawConversationType = Number(conversation?.raw?.type);
+ const conversationType = Number.isFinite(rawConversationType) && rawConversationType > 0 ? rawConversationType : 1;
+ const url = `${_config__WEBPACK_IMPORTED_MODULE_18__/* .appConfig */ .U.appServer}/groupTopMessage/add`;
+ const response = await axios__WEBPACK_IMPORTED_MODULE_17__/* ["default"] */ .A.post(url, {
+ groupId,
+ userId: message?.from || this.currentUser?.userId || '',
+ messageId,
+ messageType: conversationType,
+ messageText: JSON.stringify({
+ ...message,
+ messageId,
+ from: message?.from || this.currentUser?.userId || '',
+ conversation: {
+ type: conversationType,
+ target: groupId,
+ line: Number(conversation?.raw?.line || 0)
+ },
+ content: {
+ searchableContent
+ }
+ })
+ }, {
+ headers: this.getAppAuthHeaders(url),
+ withCredentials: false
+ });
+ const payload = response.data || {};
+ if (payload.code !== undefined && Number(payload.code) !== 0) {
+ const detail = payload.message || payload.msg || payload.result?.message || '置顶失败';
+ throw new Error(payload.code !== undefined ? `${detail}(错误码 ${payload.code})` : detail);
+ }
+ return payload.result ?? payload.data ?? payload;
+ }
+ async removeGroupPinnedMessage(pinId) {
+ const url = `${_config__WEBPACK_IMPORTED_MODULE_18__/* .appConfig */ .U.appServer}/groupTopMessage/remove/?id=${encodeURIComponent(pinId)}`;
+ const response = await axios__WEBPACK_IMPORTED_MODULE_17__/* ["default"] */ .A.post(url, {}, {
+ headers: this.getAppAuthHeaders(url),
+ withCredentials: false
+ });
+ const payload = response.data || {};
+ if (payload.code !== undefined && Number(payload.code) !== 0) {
+ throw new Error(payload.message || '取消置顶失败');
+ }
+ return payload.result ?? payload.data ?? payload;
+ }
hideMessages(conversation, messages) {
const items = Array.isArray(messages) ? messages : [messages];
if (!conversation?.id || !items.length) {
@@ -6467,7 +6834,7 @@ class HttpImClient {
}
return response.data?.result?.detail || null;
}
- async sendTextMessage(conversation, text, initialMessage = null) {
+ async sendTextMessage(conversation, text, initialMessage = null, options = {}) {
const senderRole = conversation?.role || conversation?.raw?.role || '';
const message = initialMessage || {
id: randomId(),
@@ -6490,7 +6857,8 @@ class HttpImClient {
sender: this.currentUser?.userId || '',
target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),
conversationType: conversation.type || conversation.raw?.type || 0,
- text
+ text,
+ mentionedUserIds: Array.isArray(options.mentionedUserIds) ? options.mentionedUserIds : []
}, {
withCredentials: false
});
@@ -6591,6 +6959,27 @@ class HttpImClient {
return failedMessage;
}
}
+ async forwardAttachmentMessage(conversation, sourceMessage) {
+ const attachment = sourceMessage?.attachment || {};
+ const type = attachment.type || sourceMessage?.type || 'file';
+ const formData = new FormData();
+ formData.append('sender', this.currentUser?.userId || '');
+ formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''));
+ formData.append('conversationType', conversation.type || conversation.raw?.type || 0);
+ formData.append('messageType', type);
+ formData.append('text', sourceMessage?.text || '');
+ formData.append('attachmentUrl', attachment.url || '');
+ formData.append('attachmentName', attachment.name || (type === 'image' ? '转发图片' : type === 'video' ? '转发视频.mp4' : '转发文件'));
+ formData.append('attachmentMime', attachment.mime || (type === 'video' ? 'video/mp4' : 'application/octet-stream'));
+ formData.append('attachmentSize', String(attachment.size || 0));
+ const response = await axios__WEBPACK_IMPORTED_MODULE_17__/* ["default"] */ .A.post(_config__WEBPACK_IMPORTED_MODULE_18__/* .appConfig */ .U.sendMessageApi, formData, {
+ withCredentials: false
+ });
+ if (response.data?.code !== 0) {
+ throw new Error(response.data?.message || '转发失败');
+ }
+ return response.data?.result || {};
+ }
getContactList() {
return [];
}
@@ -7294,8 +7683,11 @@ class LongConnectionImClient extends _httpImClient__WEBPACK_IMPORTED_MODULE_5__/
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
-/* harmony export */ B: function() { return /* binding */ imageDisplayUrl; }
+/* harmony export */ TJ: function() { return /* binding */ useImageProxyFallback; },
+/* harmony export */ eR: function() { return /* binding */ useVideoOriginalFallback; },
+/* harmony export */ nM: function() { return /* binding */ videoDisplayUrl; }
/* harmony export */ });
+/* unused harmony export imageDisplayUrl */
/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8111);
/* harmony import */ var core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_iterator_constructor_js__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var core_js_modules_es_iterator_filter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2489);
@@ -7345,6 +7737,29 @@ function imageDisplayUrl(value) {
return source;
}
}
+function videoDisplayUrl(value) {
+ const source = String(value || '').trim();
+ if (!source || source.startsWith('blob:') || source.startsWith('data:')) return source;
+ const streamUrl = new URL('/api/media_stream.php', window.location.origin);
+ streamUrl.searchParams.set('url', source);
+ return streamUrl.toString();
+}
+function useVideoOriginalFallback(event, value) {
+ const video = event?.currentTarget;
+ const source = String(value || '').trim();
+ if (!video || !source || video.dataset.originalFallback === '1') return;
+ video.dataset.originalFallback = '1';
+ video.src = source;
+ video.load();
+}
+function useImageProxyFallback(event, value) {
+ const image = event?.currentTarget;
+ if (!image) return;
+ const fallback = imageDisplayUrl(value);
+ if (!fallback || fallback === value || image.dataset.proxyFallback === '1') return;
+ image.dataset.proxyFallback = '1';
+ image.src = fallback;
+}
/***/ }),
@@ -7755,8 +8170,6 @@ const useContactStore = (0,pinia__WEBPACK_IMPORTED_MODULE_6__/* .defineStore */
/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(2169);
/* harmony import */ var _stores_session__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(926);
/* harmony import */ var _services_realtimeNotifications__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(9687);
-/* harmony import */ var _services_mediaProxy__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(446);
-
@@ -7784,6 +8197,7 @@ const useContactStore = (0,pinia__WEBPACK_IMPORTED_MODULE_6__/* .defineStore */
const LOCAL_CONVERSATION_STORAGE_KEY = 'qmt-web-im-local-conversations-v2';
const LOCAL_FAVORITE_MESSAGES_KEY = 'qmt-web-im-favorite-messages-v1';
const LOCAL_PINNED_MESSAGES_KEY = 'qmt-web-im-pinned-messages-v1';
+const LOCAL_HIDDEN_CONVERSATIONS_KEY = 'qmt-web-im-hidden-conversations-v1';
function scopedStorageKey(baseKey) {
const session = (0,_stores_session__WEBPACK_IMPORTED_MODULE_22__/* .useSessionStore */ .B)();
const scope = `${_config__WEBPACK_IMPORTED_MODULE_21__/* .appConfig */ .U.appServer || ''}:${session.userId || 'anonymous'}`;
@@ -7809,6 +8223,16 @@ function readLocalConversations() {
function writeLocalConversations(conversations) {
localStorage.setItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY), JSON.stringify(conversations));
}
+function readHiddenConversationIds() {
+ try {
+ return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_HIDDEN_CONVERSATIONS_KEY)) || '[]');
+ } catch (error) {
+ return [];
+ }
+}
+function writeHiddenConversationIds(ids) {
+ localStorage.setItem(scopedStorageKey(LOCAL_HIDDEN_CONVERSATIONS_KEY), JSON.stringify(ids));
+}
function readPinnedMessages() {
try {
return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_PINNED_MESSAGES_KEY)) || '{}');
@@ -7819,6 +8243,30 @@ function readPinnedMessages() {
function writePinnedMessages(messages) {
localStorage.setItem(scopedStorageKey(LOCAL_PINNED_MESSAGES_KEY), JSON.stringify(messages));
}
+function parseNativePinnedMessage(item, messages = []) {
+ if (!item) return null;
+ const messageId = String(item.messageId || item.messageUid || '').trim();
+ const matched = messages.find(message => [message.messageId, message.messageUid, message.id].filter(Boolean).some(value => String(value) === messageId));
+ let encoded = {};
+ try {
+ encoded = typeof item.messageText === 'string' ? JSON.parse(item.messageText) : item.messageText || {};
+ } catch (error) {
+ encoded = {};
+ }
+ const text = String(encoded?.content?.searchableContent || encoded?.messageContent?.searchableContent || encoded?.text || matched?.text || '[消息]');
+ return {
+ ...(matched || {}),
+ key: messageId || `group-pin-${item.id}`,
+ id: messageId || `group-pin-${item.id}`,
+ messageUid: messageId || matched?.messageUid || '',
+ serverPinId: String(item.id || ''),
+ text,
+ type: matched?.type || encoded?.type || 'text',
+ attachment: matched?.attachment || encoded?.attachment || null,
+ senderName: matched?.senderName || encoded?.senderName || encoded?.from || '',
+ timestamp: Number(matched?.displayTimestamp || matched?.timestamp || item.updateTime || item.createTime || Date.now())
+ };
+}
function sortConversations(conversations) {
return [...conversations].sort((left, right) => {
const leftPinned = Number(left.pinnedAt || left.top || 0);
@@ -7918,6 +8366,9 @@ function canMarkReadNow(options = {}) {
}
return true;
}
+function forwardedText(message) {
+ return String(message?.text || '').replace(/^转发\s*[::]\s*/u, '').trim();
+}
function normalizeMessageForDisplay(message) {
if (!message || message.attachment || String(message.text || '').trim()) {
return message;
@@ -8038,6 +8489,8 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
selectedMessageIds: [],
favoriteMessages: [],
pinnedMessagesByConversation: {},
+ groupPinnedSyncAt: {},
+ hiddenConversationIds: [],
activeFavoriteKey: '',
actionNotice: '',
actionError: '',
@@ -8102,6 +8555,8 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
this.conversations = [];
this.favoriteMessages = readFavoriteMessages();
this.pinnedMessagesByConversation = readPinnedMessages();
+ this.groupPinnedSyncAt = {};
+ this.hiddenConversationIds = readHiddenConversationIds();
this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';
this.activeId = '';
this.messagesByConversation = {};
@@ -8154,6 +8609,7 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
this.selectionMode = false;
this.selectedMessageIds = [];
this.favoriteMessages = [];
+ this.hiddenConversationIds = [];
this.activeFavoriteKey = '';
this.actionNotice = '';
this.actionError = '';
@@ -8193,8 +8649,10 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
userAction: true
});
},
- sendText(text) {
+ sendText(payload) {
const conversation = this.activeConversation;
+ const text = typeof payload === 'string' ? payload : String(payload?.text || '');
+ const mentionedUserIds = Array.isArray(payload?.mentionedUserIds) ? payload.mentionedUserIds : [];
if (!conversation || !text.trim()) {
return;
}
@@ -8217,7 +8675,9 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
};
this.appendVisibleMessage(conversation.id, message);
this.appendMessage(conversation.id, message);
- _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.sendTextMessage(conversation, value, message);
+ _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.sendTextMessage(conversation, value, message, {
+ mentionedUserIds
+ });
conversation.subtitle = value;
conversation.updatedAt = Date.now();
writeLocalConversations(this.conversations);
@@ -8308,6 +8768,10 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
writeLocalConversations(this.conversations);
},
removeConversation(conversationId) {
+ if (!this.hiddenConversationIds.includes(conversationId)) {
+ this.hiddenConversationIds = [...this.hiddenConversationIds, conversationId];
+ writeHiddenConversationIds(this.hiddenConversationIds);
+ }
this.conversations = this.conversations.filter(conversation => conversation.id !== conversationId);
const {
[conversationId]: removedMessages,
@@ -8336,7 +8800,8 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
}
},
applyRemoteConversations(remoteConversations) {
- const remote = Array.isArray(remoteConversations) ? remoteConversations : [];
+ const hidden = new Set(this.hiddenConversationIds);
+ const remote = (Array.isArray(remoteConversations) ? remoteConversations : []).filter(conversation => !hidden.has(conversation.id));
if (!remote.length && this.conversations.length) {
return;
}
@@ -8376,6 +8841,10 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
writeLocalConversations(this.conversations);
},
appendMessage(conversationId, message) {
+ if (message?.direction === 'in' && this.hiddenConversationIds.includes(conversationId)) {
+ this.hiddenConversationIds = this.hiddenConversationIds.filter(id => id !== conversationId);
+ writeHiddenConversationIds(this.hiddenConversationIds);
+ }
if (!this.messagesByConversation[conversationId]) {
this.messagesByConversation = {
...this.messagesByConversation,
@@ -8562,13 +9031,36 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
const syncedConversationId = conversation.id;
const previousMessages = this.messagesByConversation[syncedConversationId] || [];
try {
- const messages = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.fetchRemoteMessages(conversation, 50, {
+ const messages = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.fetchRemoteMessages(conversation, 1000, {
markRead,
includeConversations: Boolean(options.includeConversations)
});
+ const isGroupConversation = ['group', 'channel'].includes(conversation.type) || ['group', 'channel', 1, '1'].includes(conversation.raw?.type);
+ const shouldSyncGroupPin = isGroupConversation && Date.now() - Number(this.groupPinnedSyncAt[syncedConversationId] || 0) >= 3000;
+ if (shouldSyncGroupPin) {
+ try {
+ const nativePins = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.fetchGroupPinnedMessages(conversation);
+ this.groupPinnedSyncAt = {
+ ...this.groupPinnedSyncAt,
+ [syncedConversationId]: Date.now()
+ };
+ const nextPinned = {
+ ...this.pinnedMessagesByConversation
+ };
+ if (nativePins.length) {
+ nextPinned[syncedConversationId] = parseNativePinnedMessage(nativePins[0], messages);
+ } else {
+ delete nextPinned[syncedConversationId];
+ }
+ this.pinnedMessagesByConversation = nextPinned;
+ writePinnedMessages(nextPinned);
+ } catch (error) {
+ console.warn('群置顶消息同步失败', error);
+ }
+ }
const remotePinnedKey = String(messages.pinnedMessageUid || '');
- if (remotePinnedKey) {
- const pinnedMessage = messages.find(item => messageStableKey(item) === remotePinnedKey);
+ if (!isGroupConversation && remotePinnedKey) {
+ const pinnedMessage = messages.find(item => messageStableKey(item) === remotePinnedKey) || messages.pinnedMessage || (this.pinnedMessagesByConversation[syncedConversationId]?.key === remotePinnedKey ? this.pinnedMessagesByConversation[syncedConversationId] : null);
this.pinnedMessagesByConversation = {
...this.pinnedMessagesByConversation,
[syncedConversationId]: pinnedMessage ? {
@@ -8706,6 +9198,10 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
this.actionError = message;
this.actionNotice = '';
window.clearTimeout(this.actionNoticeTimer);
+ this.actionNoticeTimer = window.setTimeout(() => {
+ this.actionError = '';
+ this.actionNoticeTimer = null;
+ }, 3000);
},
focusMessage(message) {
const key = messageStableKey(message);
@@ -8860,16 +9356,16 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
...this.pinnedMessagesByConversation
};
if (current && current.key === key) {
- await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.setPinnedMessage(this.activeConversation, '').catch(error => this.setActionError(error.message || '取消置顶失败'));
delete next[conversationId];
+ this.pinnedMessagesByConversation = next;
+ writePinnedMessages(next);
this.setActionNotice('已取消置顶');
- } else {
try {
- await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.setPinnedMessage(this.activeConversation, key);
+ await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.setPinnedMessage(this.activeConversation, '', current);
} catch (error) {
- this.setActionError(error.message || '置顶失败');
- return;
+ this.setActionError(`已在本地取消,服务器同步失败:${error.message || '取消置顶失败'}`);
}
+ } else {
next[conversationId] = {
key,
id: key,
@@ -8881,13 +9377,33 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
senderName: message.senderName || message.from || '',
timestamp: Number(message.displayTimestamp || message.timestamp || Date.now())
};
+ this.pinnedMessagesByConversation = next;
+ writePinnedMessages(next);
this.setActionNotice('消息已置顶');
+ try {
+ await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.setPinnedMessage(this.activeConversation, key, message);
+ const nativePins = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.fetchGroupPinnedMessages(this.activeConversation).catch(() => []);
+ if (nativePins.length) {
+ const refreshed = parseNativePinnedMessage(nativePins[0], this.activeMessages);
+ this.pinnedMessagesByConversation = {
+ ...this.pinnedMessagesByConversation,
+ [conversationId]: refreshed
+ };
+ writePinnedMessages(this.pinnedMessagesByConversation);
+ }
+ } catch (error) {
+ const rollback = {
+ ...this.pinnedMessagesByConversation
+ };
+ delete rollback[conversationId];
+ this.pinnedMessagesByConversation = rollback;
+ writePinnedMessages(rollback);
+ this.setActionError(`置顶失败:${error.message || '服务器同步失败'}`);
+ }
}
- this.pinnedMessagesByConversation = next;
- writePinnedMessages(next);
},
async clearPinnedMessage() {
- await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.setPinnedMessage(this.activeConversation, '').catch(error => this.setActionError(error.message || '取消置顶失败'));
+ const current = this.pinnedMessagesByConversation[this.activeId] || null;
const next = {
...this.pinnedMessagesByConversation
};
@@ -8895,6 +9411,11 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
this.pinnedMessagesByConversation = next;
writePinnedMessages(next);
this.setActionNotice('已取消置顶');
+ try {
+ await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.setPinnedMessage(this.activeConversation, '', current);
+ } catch (error) {
+ this.setActionError(`已在本地取消,服务器同步失败:${error.message || '取消置顶失败'}`);
+ }
},
setActiveFavorite(key) {
this.activeFavoriteKey = String(key || '');
@@ -9020,31 +9541,37 @@ const useConversationStore = (0,pinia__WEBPACK_IMPORTED_MODULE_19__/* .defineSto
if (!target || !this.forwardingMessages.length) {
return;
}
- try {
- for (const message of this.forwardingMessages) {
+ const messages = [...this.forwardingMessages];
+ let successCount = 0;
+ const errors = [];
+ for (const message of messages) {
+ try {
if (message.attachment?.url) {
- const response = await fetch((0,_services_mediaProxy__WEBPACK_IMPORTED_MODULE_24__/* .imageDisplayUrl */ .B)(message.attachment.url));
- if (!response.ok) throw new Error('图片读取失败');
- const blob = await response.blob();
- const type = message.attachment.type || message.type || 'file';
- const file = new File([blob], message.attachment.name || (type === 'image' ? '转发图片.jpg' : '转发文件'), {
- type: message.attachment.mime || blob.type || 'application/octet-stream'
- });
- const sent = await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.sendAttachmentMessage(target, {
- type,
- file,
- text: message.text || ''
- });
- if (sent?.status === 'failed') throw new Error(sent.error || '转发失败');
+ await _services_imClient__WEBPACK_IMPORTED_MODULE_20__/* .imClient */ .wD.forwardAttachmentMessage(target, message);
} else if (message.text) {
- await this.sendTextToConversation(target, message.text);
+ const text = forwardedText(message);
+ if (!text) {
+ throw new Error('消息内容为空');
+ }
+ const sentMessage = await this.sendTextToConversation(target, text);
+ if (sentMessage?.status === 'failed') {
+ throw new Error(sentMessage.error || '转发失败');
+ }
}
+ successCount += 1;
+ } catch (error) {
+ errors.push(error.message || '转发失败');
}
+ }
+ if (successCount > 0) {
this.forwardingMessages = [];
this.clearSelection();
- this.setActionNotice('已转发');
- } catch (error) {
- this.setActionError(error.message || '转发失败');
+ this.refreshRemoteConversations();
+ }
+ if (errors.length) {
+ this.setActionError(`成功 ${successCount} 条,失败 ${errors.length} 条:${errors[0]}`);
+ } else {
+ this.setActionNotice(`已转发 ${successCount} 条`);
}
},
async recallMessage(message) {
@@ -9925,4 +10452,4 @@ const __exports__ = _NavigationRail_vue_vue_type_script_setup_true_lang_js__WEBP
/******/
/******/ })()
;
-//# sourceMappingURL=app.1158390e.js.map
\ No newline at end of file
+//# sourceMappingURL=app.21e75967.js.map
\ No newline at end of file
diff --git a/dist/js/app.21e75967.js.map b/dist/js/app.21e75967.js.map
new file mode 100644
index 0000000..6b0ed24
--- /dev/null
+++ b/dist/js/app.21e75967.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"js/app.21e75967.js","mappings":"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;;;;;;;;;ACAF,C;;;;;;UCA/Q;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC,oHAAoH,iDAAiD;WACrK;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,E;;;;;WC7BA;WACA;WACA;WACA,eAAe,4BAA4B;WAC3C,eAAe;WACf,iCAAiC,WAAW;WAC5C;WACA,E;;;;;WCPA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,2CAA2C,0CAA0C;WACrF,MAAM;WACN,2CAA2C,gCAAgC;WAC3E;WACA,KAAK,yBAAyB;WAC9B;WACA,GAAG;WACH;WACA;WACA,0CAA0C,wCAAwC;WAClF;WACA;WACA;WACA,E;;;;;WCtBA;WACA;WACA;WACA;WACA,GAAG;WACH;WACA;WACA,CAAC,I;;;;;WCPD,8CAA8C,yD;;;;;WCA9C;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D,E;;;;;WCNA;WACA;WACA,kDAAkD,iDAAiD,sCAAsC;WACzI,E;;;;;WCHA;;WAEA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA,8CAA8C;;WAE9C;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,iCAAiC,mCAAmC;WACpE;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA,4G;;;;;UElDA;UACA;UACA;UACA,+EAA+E,mCAAmC;UAClH","sources":["webpack://jc-web-im/./src/App.vue","webpack://jc-web-im/./src/components/ChatShell.vue","webpack://jc-web-im/./src/components/LoginView.vue","webpack://jc-web-im/./src/components/chat/ChatPanel.vue","webpack://jc-web-im/./src/components/chat/MessageComposer.vue","webpack://jc-web-im/./src/components/chat/MessageList.vue","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue","webpack://jc-web-im/./src/components/sidebar/ContactList.vue","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue","webpack://jc-web-im/./src/composables/useAutoDismiss.js","webpack://jc-web-im/./src/config.js","webpack://jc-web-im/./src/main.js","webpack://jc-web-im/./src/services/appServerClient.js","webpack://jc-web-im/./src/services/documentedHttpImClient.js","webpack://jc-web-im/./src/services/httpImClient.js","webpack://jc-web-im/./src/services/imClient.js","webpack://jc-web-im/./src/services/longConnectionImClient.js","webpack://jc-web-im/./src/services/mediaProxy.js","webpack://jc-web-im/./src/services/realtimeNotifications.js","webpack://jc-web-im/./src/stores/contacts.js","webpack://jc-web-im/./src/stores/conversations.js","webpack://jc-web-im/./src/stores/navigation.js","webpack://jc-web-im/./src/stores/session.js","webpack://jc-web-im/./src/App.vue?7ccd","webpack://jc-web-im/./src/components/ChatShell.vue?96ef","webpack://jc-web-im/./src/components/LoginView.vue?3311","webpack://jc-web-im/./src/components/chat/ChatPanel.vue?ffa3","webpack://jc-web-im/./src/components/chat/MessageComposer.vue?d45c","webpack://jc-web-im/./src/components/chat/MessageList.vue?73ad","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?11f7","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue?7e83","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?9ce0","webpack://jc-web-im/./src/components/sidebar/ContactList.vue?8b7f","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?8a4a","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?e8e6","webpack://jc-web-im/./src/App.vue?455b","webpack://jc-web-im/./src/components/ChatShell.vue?ef53","webpack://jc-web-im/./src/components/LoginView.vue?f595","webpack://jc-web-im/./src/components/chat/ChatPanel.vue?402c","webpack://jc-web-im/./src/components/chat/MessageComposer.vue?bb22","webpack://jc-web-im/./src/components/chat/MessageList.vue?c1a2","webpack://jc-web-im/./src/components/contacts/ContactPanel.vue?96e0","webpack://jc-web-im/./src/components/favorites/FavoriteList.vue?bdf3","webpack://jc-web-im/./src/components/favorites/FavoritePanel.vue?ee85","webpack://jc-web-im/./src/components/sidebar/ContactList.vue?dff0","webpack://jc-web-im/./src/components/sidebar/ConversationList.vue?0914","webpack://jc-web-im/./src/components/sidebar/NavigationRail.vue?c3d8","webpack://jc-web-im/webpack/bootstrap","webpack://jc-web-im/webpack/runtime/chunk loaded","webpack://jc-web-im/webpack/runtime/compat get default export","webpack://jc-web-im/webpack/runtime/define property getters","webpack://jc-web-im/webpack/runtime/global","webpack://jc-web-im/webpack/runtime/hasOwnProperty shorthand","webpack://jc-web-im/webpack/runtime/make namespace object","webpack://jc-web-im/webpack/runtime/set anonymous default export name","webpack://jc-web-im/webpack/runtime/jsonp chunk loading","webpack://jc-web-im/webpack/before-startup","webpack://jc-web-im/webpack/startup","webpack://jc-web-im/webpack/after-startup"],"sourcesContent":["\n \n \n \n\n\n","\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n","\n \n \n \n \n\n\n","\r\n \n \r\n\r\n \n 选择一个会话 \r\n 真实会话同步完成后,可以在左侧打开聊天 \r\n
\n \n 📌 \n 置顶消息 \n \n \n {{ pinnedMessageText }} \n \n × \n \n \r\n \r\n 已选 {{ conversations.selectedMessageIds.length }} 条 \r\n 复制 \r\n 删除 \r\n 转发 \r\n 取消 \r\n
\r\n \r\n \r\n \r\n \r\n \r\n {{ item.avatarText }} \r\n {{ item.title }} \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n {{ conversations.editingMode === 'resend' ? '重新编辑' : '编辑消息' }} \r\n × \r\n \r\n \r\n \r\n 取消 \r\n {{ conversations.editingMode === 'resend' ? '发送' : '保存' }} \r\n \r\n \r\n \r\n \r\n
\r\n \r\n 正在加载
\r\n \r\n \r\n \r\n
发送时间 \r\n {{ formatDetailTime(messageDetail?.sentAt) }} \r\n \r\n \r\n
编辑时间 \r\n {{ formatDetailTime(messageDetail.editedAt) }} \r\n \r\n \r\n
发送人 \r\n {{ detailMemberName(messageDetail?.sender) }} \r\n \r\n \r\n \r\n
接收人 \r\n {{ detailMemberName(messageDetail?.receiver) }} \r\n \r\n \r\n
送达时间 \r\n \r\n {{ messageDetail?.deliveredAt ? formatDetailTime(messageDetail.deliveredAt) : '未送达' }}\r\n \r\n \r\n \r\n
已读时间 \r\n \r\n {{ messageDetail?.readAt ? formatDetailTime(messageDetail.readAt) : '未读' }}\r\n \r\n \r\n \r\n \r\n {{ conversations.messageDetailError }} \r\n \r\n \r\n 已读 {{ messageDetailCounts.read || 0 }} \r\n 未读 {{ messageDetailCounts.unread || 0 }} \r\n 未送达 {{ messageDetailCounts.undelivered || 0 }} \r\n 成员 {{ messageDetailCounts.total || 0 }} \r\n
\r\n \r\n
\r\n \r\n 已读 \r\n {{ messageDetailCounts.read || 0 }} 人 \r\n \r\n \r\n
\r\n
\n
{{ detailMemberAvatar(member) }} \r\n
\r\n {{ detailMemberName(member) }} \r\n {{ member.uid }} \r\n \r\n
{{ formatDetailTime(member.time) }} \r\n
{{ detailRoleLabel(member.role) }} \r\n
\r\n
\r\n 暂无已读成员
\r\n \r\n\r\n
\r\n \r\n 未读 \r\n {{ messageDetailCounts.unread || 0 }} 人 \r\n \r\n \r\n
\r\n
\n
{{ detailMemberAvatar(member) }} \r\n
\r\n {{ detailMemberName(member) }} \r\n {{ member.uid }} \r\n \r\n
送达 {{ formatDetailTime(member.time) }} \r\n
{{ detailRoleLabel(member.role) }} \r\n
\r\n
\r\n 暂无未读成员
\r\n \r\n\r\n
\r\n \r\n 未送达 \r\n {{ messageDetailCounts.undelivered || 0 }} 人 \r\n \r\n \r\n
\r\n
\n
{{ detailMemberAvatar(member) }} \r\n
\r\n {{ detailMemberName(member) }} \r\n {{ member.uid }} \r\n \r\n
未送达 \r\n
{{ detailRoleLabel(member.role) }} \r\n
\r\n
\r\n 暂无未送达成员
\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\n
{{ singleProfile.avatarText }}
\r\n
{{ singleProfile.displayName }} \r\n
\r\n \r\n \n
用户ID \n {{ singleProfile.userId || '-' }} \n \n \r\n
昵称 \r\n {{ singleProfile.rawName || '-' }} \r\n \r\n \r\n
手机号 \r\n {{ singleProfile.mobile || '未知' }} \r\n \r\n \r\n
地区 \r\n {{ singleProfile.address || '未知' }} \r\n \r\n \r\n \r\n 备注名称 \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n 正在加载
\r\n \r\n \r\n
群名 \r\n {{ groupDetail?.name || activeConversation?.title || '-' }} \r\n \r\n \n
群ID \n {{ groupDisplayId }} \n \r\n \r\n
群说明 \r\n {{ groupDetail?.announcement || '未设置' }} \r\n \r\n \r\n
群主昵称 \r\n {{ groupDetail?.ownerName || '-' }} \r\n \r\n \r\n \r\n \r\n 解散群组 \r\n 转让群组 \r\n \r\n 退出群组 \r\n \r\n \r\n\r\n
\r\n \r\n 正在加载
\r\n \r\n
\r\n
\n
{{ memberAvatar(member) }} \r\n
\r\n {{ member.displayName }} \r\n {{ member.role === 'owner' ? '群主' : member.rawDisplayName }} \r\n \r\n
\r\n
暂无群员
\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n 昵称 \r\n \r\n \r\n \r\n 取消 \r\n {{ groupBusy ? '保存中...' : '保存' }} \r\n \r\n \r\n\r\n
\r\n \r\n 正在加载
\r\n \r\n
\r\n \n {{ memberAvatar(member) }} \r\n \r\n {{ member.displayName }} \r\n {{ member.rawDisplayName }} \r\n \r\n \r\n
暂无可转让成员
\r\n
\r\n \r\n \r\n\r\n
\r\n \r\n \r\n 管理员设置 \r\n 修改群资料 \r\n 踢人 \r\n 禁言设置 \r\n \r\n\r\n 正在加载
\r\n\r\n \r\n \r\n
\r\n \r\n \n {{ memberAvatar(member) }} \r\n \r\n {{ member.displayName }} \r\n {{ member.rawDisplayName }} \r\n \r\n \r\n
暂无可设置成员
\r\n
\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n
\r\n \r\n \n {{ memberAvatar(member) }} \r\n \r\n {{ member.displayName }} \r\n {{ member.role === 'admin' ? '管理员' : member.rawDisplayName }} \r\n \r\n \r\n
暂无可移除成员
\r\n
\r\n \r\n \r\n\r\n \r\n \r\n
\r\n \r\n {{ conversations.actionError || conversations.actionNotice }}\r\n
\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n \r\n 引用 \r\n {{ quoteMessage.quoteText || quoteMessage.text }}\r\n \r\n × \r\n
\r\n \r\n \n \n
\n \n {{ mentionName(member).slice(0, 1) }} \n {{ mentionName(member) }} \n \n
\n \r\n \r\n \r\n\r\n\r\n","\r\n \r\n
\r\n {{ systemMessageText(message) }}
\n \n \r\n \r\n \r\n \n {{ groupSenderAvatarText(message) }} \r\n \r\n \n
\r\n {{ groupSenderName(message) }}\r\n {{ senderRoleLabel(message) }} \r\n \r\n
\n
\n
\n 福 \n \n {{ redPacketBlessing(message) }} \n 请在 App 上领取 \n \n
\n \n
\n
\n 福 \n {{ redPacketReceiptText(message) }} \n
\n
\r\n \n \n
\n 当前浏览器无法播放该视频\n \n
\r\n ▤ \r\n \r\n {{ displayFileName(message) }} \n {{ formatFileSize(message.attachment.size) }} \n \n \n
{{ message.text }}
\n
\r\n {{ message.recallStatus || '已撤回' }} \r\n {{ formatTime(message.displayTimestamp || message.timestamp) }} \r\n 【edit {{ formatTime(message.editedAt) }}】 \r\n ★ \r\n \r\n ✓ \r\n ✓ \r\n \r\n {{ failureText(message) }} \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\n ⟳ \r\n ⇩ \r\n × \r\n
\r\n
\n
1\"\n type=\"button\"\n class=\"image-viewer-nav image-viewer-prev\"\n title=\"上一张\"\n aria-label=\"上一张\"\n @pointerdown.stop\n @click.stop=\"showPreviousImage\"\n >‹ \n
\n
1\"\n type=\"button\"\n class=\"image-viewer-nav image-viewer-next\"\n title=\"下一张\"\n aria-label=\"下一张\"\n @pointerdown.stop\n @click.stop=\"showNextImage\"\n >› \n
\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n
\n
{{ senderProfile.avatarText }}
\r\n
{{ senderProfile.displayName || senderProfile.uid }} \r\n
{{ senderProfile.roleLabel }} \r\n
\r\n \r\n \n
用户ID \n {{ senderProfile.userId || '-' }} \n \n \n
昵称 \n {{ senderProfile.rawName || senderProfile.displayName || '-' }} \n \n \n
手机号 \n {{ senderProfile.mobile || '未知' }} \n \n \n
地区 \n {{ senderProfile.address || '未知' }} \r\n \r\n \r\n \r\n 备注名称 \r\n \r\n \r\n \r\n {{ senderProfile.notice }} \r\n {{ senderProfile.error }} \r\n \r\n {{ senderProfile.adding ? '添加中...' : '添加为好友' }}\r\n \r\n \r\n {{ senderProfile.saving ? '保存中...' : '保存备注' }}\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n\r\n\r\n","\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n \r\n \r\n
\r\n
★ \r\n
\r\n
{{ formatFavoriteTime(favorite.timestamp) }} \r\n
\r\n
\r\n {{ notice }} \r\n {{ error }} \r\n 复制 \r\n 打开原会话 \r\n 取消收藏 \r\n
\r\n
\r\n \r\n \r\n 暂无收藏消息 \r\n 右键消息气泡选择“收藏”后,会显示在这里 \r\n
\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n\r\n \r\n \r\n
\r\n\r\n \r\n\r\n \r\n
\r\n \r\n \r\n 用户ID / 手机号 / 用户名 \r\n \r\n \r\n {{ contacts.actionError }}
\r\n {{ contacts.actionInfo }}
\r\n \r\n 取消 \r\n \r\n {{ contacts.loading ? '添加中...' : '添加' }}\r\n \r\n
\r\n \r\n
\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n\r\n\r\n","\r\n \r\n \r\n \n {{ initials }} \r\n \r\n 💬 \r\n 👥 \r\n ☆ \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
图片加载中
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n\r\n\r\n","import { onBeforeUnmount, watch } from 'vue';\n\nexport function useAutoDismiss(source, clear, delay = 3000) {\n let timer = null;\n\n watch(source, value => {\n window.clearTimeout(timer);\n timer = null;\n if (!value) return;\n const currentValue = value;\n timer = window.setTimeout(() => {\n clear(currentValue);\n timer = null;\n }, delay);\n }, { flush: 'post' });\n\n onBeforeUnmount(() => window.clearTimeout(timer));\n}\n","const currentHost = window.location.hostname || '127.0.0.1';\nconst runtimeConfig = window.JC_WEB_IM_CONFIG || {};\nconst appServerOrigin = `${window.location.protocol}//${currentHost}:8888`;\nconst qrAppServerOrigin = `${window.location.protocol}//${currentHost}:18888`;\nconst adminServerOrigin = `${window.location.protocol}//${currentHost}:8024`;\n\r\nexport const appConfig = {\r\n appName: 'Web IM',\r\n adminServer: runtimeConfig.adminServer || process.env.VUE_APP_ADMIN_SERVER || adminServerOrigin,\n appServer: runtimeConfig.appServer || process.env.VUE_APP_APP_SERVER || appServerOrigin,\n qrAppServer: runtimeConfig.qrAppServer || process.env.VUE_APP_QR_APP_SERVER || qrAppServerOrigin,\n platformConfigApi: runtimeConfig.platformConfigApi || process.env.VUE_APP_PLATFORM_CONFIG_API || (process.env.NODE_ENV === 'development' ? '/local-api/platform_config.php' : '/api/platform_config.php'),\n registerConfigApi: runtimeConfig.registerConfigApi || process.env.VUE_APP_REGISTER_CONFIG_API || `${adminServerOrigin}/api/register-config`,\r\n registerPhoneExistsApi: runtimeConfig.registerPhoneExistsApi || process.env.VUE_APP_REGISTER_PHONE_EXISTS_API || `${adminServerOrigin}/api/register-phone-exists`,\r\n contactsApi: runtimeConfig.contactsApi || process.env.VUE_APP_CONTACTS_API || (process.env.NODE_ENV === 'development' ? '/local-api/contacts.php' : '/api/contacts.php'),\r\n updateAliasApi: runtimeConfig.updateAliasApi || process.env.VUE_APP_UPDATE_ALIAS_API || (process.env.NODE_ENV === 'development' ? '/local-api/update_alias.php' : '/api/update_alias.php'),\r\n addContactApi: runtimeConfig.addContactApi || process.env.VUE_APP_ADD_CONTACT_API || (process.env.NODE_ENV === 'development' ? '/local-api/add_contact.php' : '/api/add_contact.php'),\r\n conversationActionsApi: runtimeConfig.conversationActionsApi || process.env.VUE_APP_CONVERSATION_ACTIONS_API || (process.env.NODE_ENV === 'development' ? '/local-api/conversation_actions.php' : '/api/conversation_actions.php'),\r\n sendMessageApi: runtimeConfig.sendMessageApi || process.env.VUE_APP_SEND_MESSAGE_API || (process.env.NODE_ENV === 'development' ? '/local-api/send_message.php' : '/api/send_message.php'),\r\n messageActionApi: runtimeConfig.messageActionApi || process.env.VUE_APP_MESSAGE_ACTION_API || (process.env.NODE_ENV === 'development' ? '/local-api/message_action.php' : '/api/message_action.php'),\r\n messageDetailApi: runtimeConfig.messageDetailApi || process.env.VUE_APP_MESSAGE_DETAIL_API || (process.env.NODE_ENV === 'development' ? '/local-api/message_detail.php' : '/api/message_detail.php'),\r\n messagesApi: runtimeConfig.messagesApi || process.env.VUE_APP_MESSAGES_API || (process.env.NODE_ENV === 'development' ? '/local-api/messages.php' : '/api/messages.php'),\r\n profileApi: runtimeConfig.profileApi || process.env.VUE_APP_PROFILE_API || (process.env.NODE_ENV === 'development' ? '/local-api/profile.php' : '/api/profile.php'),\r\n changePasswordApi: runtimeConfig.changePasswordApi || process.env.VUE_APP_CHANGE_PASSWORD_API || `${appServerOrigin}/auth/changePassword`,\n logoutApi: runtimeConfig.logoutApi || process.env.VUE_APP_LOGOUT_API || `${appServerOrigin}/auth/logout`,\n imServerHost: runtimeConfig.imServerHost || process.env.VUE_APP_IM_SERVER_HOST || currentHost,\n imRoutePort: Number(runtimeConfig.imRoutePort || process.env.VUE_APP_IM_ROUTE_PORT || 18000),\r\n useWss: runtimeConfig.useWss ?? process.env.VUE_APP_USE_WSS === 'true',\n wsPath: runtimeConfig.wsPath || process.env.VUE_APP_WS_PATH || '/ws',\n wsUrl: runtimeConfig.wsUrl || process.env.VUE_APP_WS_URL || '',\n sdkMode: runtimeConfig.sdkMode || process.env.VUE_APP_IM_MODE || 'http',\n syncIntervalMs: Number(runtimeConfig.syncIntervalMs || process.env.VUE_APP_SYNC_INTERVAL_MS || 300),\n sseEnabled: runtimeConfig.sseEnabled ?? process.env.VUE_APP_SSE_ENABLED === 'true',\n sseTicketApi: runtimeConfig.sseTicketApi || process.env.VUE_APP_SSE_TICKET_API || '/api/sse_ticket.php',\n sseUrl: runtimeConfig.sseUrl || process.env.VUE_APP_SSE_URL || '/ws-events',\n platform: 5,\n clientIdStorageKey: 'qmt-web-im-client-id',\n authTokenStoragePrefix: 'qmt-web-im-auth-token-'\n};\n","import { createApp } from 'vue';\r\nimport { createPinia } from 'pinia';\r\nimport App from './App.vue';\r\nimport './styles/base.css';\r\n\r\ncreateApp(App).use(createPinia()).mount('#app');\r\n","import axios from 'axios';\nimport { appConfig } from '@/config';\n\nconst AES_KEY = 'xczx2026!@#secKe';\nconst ENCRYPTION_EXCLUDE_PATHS = ['/avatar/', '/f/', '/amr2mp3', '/appVersion/check'];\nconst AUTH_STORAGE_KEY = 'qmt-web-im-app-auth-v1';\nconst AUTH_ERROR_CODE = 13;\nconst REFRESH_ERROR_CODE = 20045;\n\nlet importedCryptoKeyPromise = null;\nlet refreshPromise = null;\n\nfunction storageScope() {\n return appConfig.appServer || '';\n}\n\nfunction readAuthStore() {\n try {\n return JSON.parse(localStorage.getItem(AUTH_STORAGE_KEY) || '{}');\n } catch (error) {\n return {};\n }\n}\n\nfunction writeAuthStore(store) {\n localStorage.setItem(AUTH_STORAGE_KEY, JSON.stringify(store));\n}\n\nfunction normalizeAuthBundle(bundle = {}) {\n const accessToken = String(bundle.accessToken || '').trim();\n const refreshToken = String(bundle.refreshToken || '').trim();\n if (!accessToken || !refreshToken) {\n return null;\n }\n return {\n accessToken,\n refreshToken,\n tokenType: String(bundle.tokenType || 'Bearer').trim() || 'Bearer',\n accessTokenExpireIn: Number(bundle.accessTokenExpireIn || 0) || 0,\n accessTokenExpireAt: Number(bundle.accessTokenExpireAt || 0) || 0,\n refreshTokenExpireIn: Number(bundle.refreshTokenExpireIn || 0) || 0,\n refreshTokenExpireAt: Number(bundle.refreshTokenExpireAt || 0) || 0\n };\n}\n\nexport function getStoredAppAuth() {\n const store = readAuthStore();\n return normalizeAuthBundle(store[storageScope()]);\n}\n\nexport function persistAppAuth(bundle) {\n const normalized = normalizeAuthBundle(bundle);\n const store = readAuthStore();\n if (!normalized) {\n delete store[storageScope()];\n writeAuthStore(store);\n return null;\n }\n store[storageScope()] = normalized;\n writeAuthStore(store);\n return normalized;\n}\n\nexport function clearStoredAppAuth() {\n persistAppAuth(null);\n}\n\nfunction hasFormData(value) {\n return typeof FormData !== 'undefined' && value instanceof FormData;\n}\n\nfunction absoluteUrl(url) {\n return new URL(url, window.location.origin);\n}\n\nfunction shouldEncrypt(url) {\n const pathname = absoluteUrl(url).pathname;\n return !ENCRYPTION_EXCLUDE_PATHS.some(path => pathname === path || pathname.startsWith(path));\n}\n\nfunction shouldAttachAuth(config) {\n return !config.skipAuth;\n}\n\nfunction textEncoder() {\n return new TextEncoder();\n}\n\nfunction textDecoder() {\n return new TextDecoder();\n}\n\nfunction bytesToBase64(bytes) {\n let binary = '';\n bytes.forEach(byte => {\n binary += String.fromCharCode(byte);\n });\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64) {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nasync function getCryptoKey() {\n if (!importedCryptoKeyPromise) {\n importedCryptoKeyPromise = window.crypto.subtle.importKey(\n 'raw',\n textEncoder().encode(AES_KEY),\n { name: 'AES-CBC' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n return importedCryptoKeyPromise;\n}\n\nasync function encryptPayload(plainText) {\n const iv = window.crypto.getRandomValues(new Uint8Array(16));\n const key = await getCryptoKey();\n const encrypted = await window.crypto.subtle.encrypt(\n { name: 'AES-CBC', iv },\n key,\n textEncoder().encode(plainText)\n );\n return `${bytesToBase64(iv)}:${bytesToBase64(new Uint8Array(encrypted))}`;\n}\n\nasync function decryptPayload(cipherText) {\n const [ivBase64, encryptedBase64] = String(cipherText || '').split(':', 2);\n if (!ivBase64 || !encryptedBase64) {\n throw new Error('Encrypted payload format is invalid');\n }\n const key = await getCryptoKey();\n const decrypted = await window.crypto.subtle.decrypt(\n { name: 'AES-CBC', iv: base64ToBytes(ivBase64) },\n key,\n base64ToBytes(encryptedBase64)\n );\n return textDecoder().decode(decrypted);\n}\n\nfunction normalizeBusinessResponse(payload) {\n if (payload && typeof payload === 'object' && !Array.isArray(payload)) {\n return payload;\n }\n return {\n code: 0,\n message: 'success',\n data: payload\n };\n}\n\nasync function decodeResponsePayload(response) {\n const encrypted = String(response.headers?.['x-encrypted'] || '').toLowerCase() === 'true';\n if (encrypted && typeof response.data === 'string') {\n const plainText = await decryptPayload(response.data);\n response.data = normalizeBusinessResponse(JSON.parse(plainText));\n return response;\n }\n response.data = normalizeBusinessResponse(response.data);\n return response;\n}\n\nconst client = axios.create({\n withCredentials: false\n});\n\nclient.interceptors.request.use(async config => {\n const nextConfig = { ...config };\n const url = absoluteUrl(nextConfig.url || '').toString();\n\n if (shouldAttachAuth(nextConfig)) {\n const auth = getStoredAppAuth();\n if (auth?.accessToken) {\n nextConfig.headers = {\n ...(nextConfig.headers || {}),\n Authorization: `${auth.tokenType || 'Bearer'} ${auth.accessToken}`\n };\n }\n }\n\n if (!hasFormData(nextConfig.data) && nextConfig.method?.toLowerCase() !== 'get' && shouldEncrypt(url)) {\n const plainBody = JSON.stringify(nextConfig.data ?? {});\n nextConfig.data = await encryptPayload(plainBody);\n nextConfig.headers = {\n ...(nextConfig.headers || {}),\n 'Content-Type': 'text/plain;charset=UTF-8',\n 'X-Timestamp': `${Math.floor(Date.now() / 1000)}`\n };\n }\n\n return nextConfig;\n});\n\nclient.interceptors.response.use(async response => decodeResponsePayload(response));\n\nasync function refreshAccessToken() {\n if (refreshPromise) {\n return refreshPromise;\n }\n const auth = getStoredAppAuth();\n if (!auth?.refreshToken) {\n clearStoredAppAuth();\n throw new Error('登录状态已失效,请重新登录');\n }\n\n refreshPromise = client.post(`${appConfig.appServer}/auth/refreshToken`, {\n refreshToken: auth.refreshToken\n }, {\n skipAuth: true\n }).then(response => {\n const payload = response.data || {};\n if (Number(payload.code) !== 0 || !payload.data) {\n if (Number(payload.code) === REFRESH_ERROR_CODE) {\n clearStoredAppAuth();\n }\n throw new Error(payload.message || '刷新登录状态失败');\n }\n persistAppAuth(payload.data);\n return payload.data;\n }).finally(() => {\n refreshPromise = null;\n });\n\n return refreshPromise;\n}\n\nasync function request(config) {\n const response = await client.request(config);\n const payload = response.data || {};\n if (Number(payload.code) === AUTH_ERROR_CODE && shouldAttachAuth(config) && !config._retriedAfterRefresh) {\n await refreshAccessToken();\n return request({\n ...config,\n _retriedAfterRefresh: true\n });\n }\n return response;\n}\n\nexport async function appServerRequest(config) {\n return request(config);\n}\n\nexport async function appServerGet(url, config = {}) {\n return request({\n ...config,\n method: 'get',\n url\n });\n}\n\nexport async function appServerPost(url, data = {}, config = {}) {\n return request({\n ...config,\n method: 'post',\n url,\n data\n });\n}\n","import { appConfig } from '@/config';\nimport { HttpImClient } from './httpImClient';\nimport axios from 'axios';\nimport {\n appServerGet,\n appServerPost,\n clearStoredAppAuth,\n getStoredAppAuth,\n persistAppAuth\n} from './appServerClient';\n\nfunction inferAccountType(account) {\n return String(account || '').includes('@') ? 2 : 1;\n}\n\nfunction unwrapData(response) {\n return response.data?.data ?? response.data?.result ?? null;\n}\n\nfunction unwrapMessage(response, fallback) {\n return response.data?.message || response.data?.msg || fallback;\n}\n\nexport class DocumentedHttpImClient extends HttpImClient {\n unsupported(feature) {\n throw new Error(`当前对接文档未提供“${feature}”接口,已禁用旧本地代理链路`);\n }\n\n async loginWithPassword(account, password, type = inferAccountType(account)) {\n const response = await appServerPost(`${appConfig.appServer}/auth/login_pwd`, {\n type,\n number: account,\n password,\n platform: appConfig.platform,\n clientId: this.getClientId()\n }, {\n skipAuth: true\n });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '登录失败'));\n }\n\n persistAppAuth(unwrapData(response));\n return unwrapData(response);\n }\n\n async requestAuthCode(email) {\n const response = await appServerPost(`${appConfig.appServer}/auth/sendEmailCode`, {\n email\n }, {\n skipAuth: true\n });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '验证码发送失败'));\n }\n\n return unwrapData(response);\n }\n\n async loginWithCode(account, code) {\n void account;\n void code;\n throw new Error('接口文档未提供验证码登录接口,请使用密码登录');\n }\n\n async register({ type, number, code = '', password, invitationCode = '' }) {\n const response = await appServerPost(`${appConfig.appServer}/auth/register`, {\n type,\n number,\n code,\n password,\n clientId: this.getClientId(),\n platform: appConfig.platform,\n invitationCode\n }, {\n skipAuth: true\n });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '注册失败'));\n }\n\n persistAppAuth(unwrapData(response));\n return unwrapData(response);\n }\n\n async createPcSession(userId = '') {\n const response = await axios.post(`${appConfig.qrAppServer}/pc_session`, {\n flag: 1,\n device_name: 'Web IM',\n userId,\n clientId: this.getClientId(),\n platform: appConfig.platform\n }, { withCredentials: false });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '二维码登录会话创建失败'));\n }\n\n return unwrapData(response) || {};\n }\n\n async loginWithPcSession(token) {\n const url = `${appConfig.qrAppServer}/session_login/${encodeURIComponent(token)}`;\n let response;\n try {\n response = await axios.post(url, null, { withCredentials: false });\n } catch (postError) {\n response = await axios.get(url, { withCredentials: false });\n }\n\n this.persistAppToken(url, response);\n\n const payload = response.data || {};\n const result = payload.result ?? payload.data ?? null;\n\n if (Number(payload.code) === 0 && result) {\n persistAppAuth(result);\n }\n\n if ([0, 8, 9, 10, 13, 18, 20042].includes(Number(payload.code))) {\n return {\n ...payload,\n data: result\n };\n }\n\n throw new Error(payload.message || '扫码登录失败');\n }\n\n async changePassword({ oldPassword, newPassword }) {\n const response = await appServerPost(appConfig.changePasswordApi, {\n oldPassword,\n newPassword\n });\n\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '密码修改失败'));\n }\n\n return true;\n }\n\n async resetPasswordWithCode({ mobile, resetCode, newPassword }) {\n void mobile;\n void resetCode;\n void newPassword;\n throw new Error('接口文档未提供重置密码接口,请联系服务端确认流程');\n }\n\n async logout() {\n const auth = getStoredAppAuth();\n if (!auth?.refreshToken) {\n clearStoredAppAuth();\n return true;\n }\n\n try {\n const response = await appServerPost(appConfig.logoutApi, {\n refreshToken: auth.refreshToken\n });\n if (response.data?.code !== 0) {\n throw new Error(unwrapMessage(response, '退出登录失败'));\n }\n } finally {\n clearStoredAppAuth();\n }\n\n return true;\n }\n\n async fetchRemoteConversations() {\n return [];\n }\n\n async fetchRemoteMessages() {\n return [];\n }\n\n async getServerContactList() {\n return [];\n }\n\n async getProfile() {\n return null;\n }\n\n async sendTextMessage() {\n this.unsupported('发送消息');\n }\n\n async sendAttachmentMessage() {\n this.unsupported('发送附件消息');\n }\n\n async addContact() {\n this.unsupported('添加联系人');\n }\n\n async updateContactAlias() {\n this.unsupported('联系人备注');\n }\n\n async createGroup() {\n this.unsupported('创建群组');\n }\n\n async joinGroup() {\n this.unsupported('加入群组');\n }\n\n async broadcastMessage() {\n this.unsupported('群发消息');\n }\n\n async getGroupDetail() {\n this.unsupported('群详情');\n }\n\n async getGroupMembers() {\n this.unsupported('群成员');\n }\n\n async updateGroupAlias() {\n this.unsupported('群备注');\n }\n\n async leaveGroup() {\n this.unsupported('退出群组');\n }\n\n async dismissGroup() {\n this.unsupported('解散群组');\n }\n\n async transferGroup() {\n this.unsupported('转让群组');\n }\n\n async setGroupAdmins() {\n this.unsupported('设置群管理员');\n }\n\n async updateGroupProfile() {\n this.unsupported('更新群资料');\n }\n\n async kickGroupMembers() {\n this.unsupported('移除群成员');\n }\n\n async updateGroupMuteSetting() {\n this.unsupported('群禁言设置');\n }\n\n async updateProfile() {\n this.unsupported('更新个人资料');\n }\n\n async recallMessage() {\n this.unsupported('撤回消息');\n }\n\n async editMessage() {\n this.unsupported('编辑消息');\n }\n\n async getMessageDetail() {\n this.unsupported('消息详情');\n }\n}\n","import axios from 'axios';\nimport { appConfig } from '@/config';\nimport {\n appServerGet,\n appServerPost,\n clearStoredAppAuth,\n getStoredAppAuth,\n persistAppAuth\n} from '@/services/appServerClient';\n\r\nconst LOCAL_MESSAGE_STORAGE_KEY = 'qmt-web-im-local-messages-v2';\r\nconst LOCAL_HIDDEN_MESSAGE_STORAGE_KEY = 'qmt-web-im-hidden-messages-v1';\r\nconst LOCAL_RECALLED_MESSAGE_STORAGE_KEY = 'qmt-web-im-recalled-messages-v1';\r\n\r\nfunction scopedStorageKey(baseKey, userId = '') {\r\n const scope = `${appConfig.appServer || ''}:${userId || 'anonymous'}`;\r\n return `${baseKey}:${encodeURIComponent(scope)}`;\r\n}\r\n\r\nfunction randomId() {\r\n if (window.crypto && window.crypto.randomUUID) {\r\n return window.crypto.randomUUID().replaceAll('-', '');\r\n }\r\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\r\n}\r\n\r\nfunction readLocalMessages(userId) {\r\n try {\r\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId)) || '{}');\r\n } catch (error) {\r\n return {};\r\n }\r\n}\r\n\r\nfunction readMessageSet(storageKey, userId) {\r\n try {\r\n return JSON.parse(localStorage.getItem(scopedStorageKey(storageKey, userId)) || '{}');\r\n } catch (error) {\r\n return {};\r\n }\r\n}\r\n\r\nfunction writeMessageSet(storageKey, messagesByConversation, userId) {\r\n localStorage.setItem(scopedStorageKey(storageKey, userId), JSON.stringify(messagesByConversation));\r\n}\r\n\r\nfunction messageKeys(message) {\r\n return [message?.id, message?.messageUid]\r\n .filter(Boolean)\r\n .map(value => String(value));\r\n}\r\n\r\nfunction hasStoredMessage(storageKey, conversationId, message, userId) {\r\n const stored = readMessageSet(storageKey, userId);\r\n const ids = new Set(stored[conversationId] || []);\r\n return messageKeys(message).some(id => ids.has(id));\r\n}\r\n\r\nfunction storeMessageKeys(storageKey, conversationId, messages, userId) {\r\n const stored = readMessageSet(storageKey, userId);\r\n const ids = new Set(stored[conversationId] || []);\r\n messages.forEach(message => {\r\n messageKeys(message).forEach(id => ids.add(id));\r\n });\r\n stored[conversationId] = Array.from(ids);\r\n writeMessageSet(storageKey, stored, userId);\r\n}\r\n\r\nfunction withRecalledState(message) {\r\n return {\r\n ...message,\r\n status: 'recalled',\r\n deliveryStatus: '',\r\n recalled: true,\r\n recallStatus: '已撤回'\r\n };\r\n}\r\n\r\nfunction applyLocalMessageState(conversationId, messages, userId) {\r\n return messages\r\n .filter(message => !hasStoredMessage(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversationId, message, userId))\r\n .map(message => {\r\n const isRecalled = Boolean(message.recalled)\r\n || message.status === 'recalled'\r\n || hasStoredMessage(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversationId, message, userId);\r\n if (!isRecalled) {\r\n return message;\r\n }\r\n return withRecalledState(message);\r\n });\r\n}\r\n\r\nfunction writeLocalMessages(messagesByConversation, userId) {\r\n localStorage.setItem(scopedStorageKey(LOCAL_MESSAGE_STORAGE_KEY, userId), JSON.stringify(messagesByConversation));\r\n}\r\n\r\nfunction saveLocalMessage(message, userId) {\r\n const messagesByConversation = readLocalMessages(userId);\r\n messagesByConversation[message.conversationId] = messagesByConversation[message.conversationId] || [];\r\n const index = messagesByConversation[message.conversationId].findIndex(item => item.id === message.id);\r\n if (index >= 0) {\r\n messagesByConversation[message.conversationId].splice(index, 1, message);\r\n } else {\r\n messagesByConversation[message.conversationId].push(message);\r\n }\r\n writeLocalMessages(messagesByConversation, userId);\r\n}\r\n\r\nfunction mergeSyncedMessages(localMessages, remoteMessages, conversationId, userId) {\r\n const visibleLocalMessages = applyLocalMessageState(conversationId, localMessages, userId);\r\n const localByKey = new Map();\r\n visibleLocalMessages.forEach(message => {\r\n messageKeys(message).forEach(key => {\r\n if (!localByKey.has(key)) {\r\n localByKey.set(key, message);\r\n }\r\n });\r\n });\r\n\r\n const visibleRemoteMessages = applyLocalMessageState(conversationId, remoteMessages, userId).map(remoteMessage => {\r\n if (!remoteMessage.recalled || String(remoteMessage.text || '').trim()) {\r\n return remoteMessage;\r\n }\r\n const localMessage = messageKeys(remoteMessage)\r\n .map(key => localByKey.get(key))\r\n .find(message => message?.text && message.text !== '你撤回了一条消息');\r\n return localMessage ? { ...remoteMessage, text: localMessage.text } : remoteMessage;\r\n });\r\n const remoteKeys = new Set();\r\n visibleRemoteMessages.forEach(message => {\r\n messageKeys(message).forEach(key => remoteKeys.add(key));\r\n });\r\n const now = Date.now();\r\n\r\n function hasRemoteMatch(localMessage) {\r\n if (localMessage.messageUid && remoteKeys.has(localMessage.messageUid)) {\r\n return true;\r\n }\r\n return visibleRemoteMessages.some(remoteMessage => {\r\n return remoteMessage.direction === localMessage.direction\r\n && remoteMessage.text === localMessage.text\r\n && Math.abs(Number(remoteMessage.timestamp || 0) - Number(localMessage.timestamp || 0)) < 15000;\r\n });\r\n }\r\n\r\n const pendingLocalMessages = visibleLocalMessages.filter(message => {\r\n if (message.status === 'recalled' || message.recalled) {\r\n return message.direction === 'out' && !hasRemoteMatch(message);\r\n }\r\n if (message.direction !== 'out') {\r\n return false;\r\n }\r\n if (message.status === 'sent' && message.messageUid) {\r\n return !hasRemoteMatch(message);\r\n }\r\n if (message.status === 'sent') {\r\n return !hasRemoteMatch(message) && now - Number(message.timestamp || 0) < 30000;\r\n }\r\n if (message.status === 'failed') {\n // Failed optimistic messages are only transient feedback. Keeping them in\n // localStorage forever makes an old server error reappear every time the\n // conversation is opened, even after later messages send successfully.\n return now - Number(message.timestamp || 0) < 3000;\n }\n return message.status === 'sending';\n });\r\n\r\n return [...visibleRemoteMessages, ...pendingLocalMessages].sort((a, b) => {\r\n return Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0);\r\n });\r\n}\r\n\r\nfunction getTitle(value, fallback) {\r\n return value || fallback || '';\r\n}\r\n\r\nfunction getUniqueEquipment(mobile, fallback) {\r\n const allowedDevices = {\r\n '18301902119': '67072d37062c4f31b1165073552933ba',\r\n '18301902116': '1777479418113eeea8e236edce',\r\n '18301902118': 'de89fb2f2a61480a8c381f6c16e28bd8',\r\n '18301902117': 'd117f480faa64145b6162107b1b49617'\r\n };\r\n return allowedDevices[mobile] || localStorage.getItem('uniqueEquipment') || fallback;\r\n}\r\n\r\nfunction canUseLocalLoginFallback(response) {\r\n const message = response.data?.message || '';\r\n return process.env.NODE_ENV === 'development' && message.includes('允许此设备登录');\r\n}\r\n\r\nexport class HttpImClient {\r\n constructor() {\r\n this.listeners = new Map();\r\n this.connected = false;\r\n this.currentUser = null;\r\n }\r\n\r\n getClientId() {\r\n let clientId = localStorage.getItem(appConfig.clientIdStorageKey);\r\n if (!clientId) {\r\n clientId = randomId();\r\n localStorage.setItem(appConfig.clientIdStorageKey, clientId);\r\n }\r\n return clientId;\r\n }\r\n\r\n restoreClientId(clientId) {\r\n if (clientId) {\r\n localStorage.setItem(appConfig.clientIdStorageKey, clientId);\r\n }\r\n }\r\n\r\n getSdkVersion() {\r\n return 'HTTP';\r\n }\r\n\r\n async ensureSdk() {\r\n return true;\r\n }\r\n\r\n async loginWithPassword(mobile, password) {\n const url = `${appConfig.appServer}/login_pwd`;\n const response = await axios.post(url, {\n mobile,\n password,\n platform: appConfig.platform,\n clientId: this.getClientId()\n }, { withCredentials: false });\n\r\n this.persistAppToken(url, response);\r\n if (response.data?.code !== 0) {\r\n if (canUseLocalLoginFallback(response)) {\r\n return {\r\n userId: mobile,\r\n token: `local-device-pending-${Date.now()}`,\r\n displayName: mobile,\r\n localOnly: true\r\n };\r\n }\r\n throw new Error(response.data?.message || '登录失败');\r\n }\r\n return response.data.result;\r\n }\r\n\r\n async requestAuthCode(mobile) {\r\n const response = await axios.post(`${appConfig.appServer}/send_code`, { mobile }, { withCredentials: false });\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '验证码发送失败');\r\n }\r\n return response.data.result;\r\n }\r\n\r\n async loginWithCode(mobile, code) {\n const url = `${appConfig.appServer}/login`;\n const response = await axios.post(url, {\n mobile,\n code,\n platform: appConfig.platform,\n clientId: this.getClientId()\n }, { withCredentials: false });\n\r\n this.persistAppToken(url, response);\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '登录失败');\r\n }\r\n return response.data.result;\r\n }\r\n\r\n async createPcSession(userId = '') {\r\n const response = await axios.post(`${appConfig.appServer}/pc_session`, {\r\n flag: 1,\r\n device_name: 'Web IM',\r\n userId,\r\n clientId: this.getClientId(),\r\n platform: appConfig.platform\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '二维码登录会话创建失败');\r\n }\r\n return response.data.result || {};\r\n }\r\n\r\n async loginWithPcSession(token) {\r\n const url = `${appConfig.appServer}/session_login/${encodeURIComponent(token)}`;\r\n const response = await axios.post(url, null, { withCredentials: false });\r\n this.persistAppToken(url, response);\r\n const data = response.data || {};\r\n if ([0, 8, 9, 10, 18].includes(Number(data.code))) {\r\n return data;\r\n }\r\n throw new Error(data.message || '扫码登录失败');\r\n }\r\n\r\n async registerWithPhone(mobile, code) {\r\n const url = `${appConfig.appServer}/register`;\r\n const deviceId = getUniqueEquipment(mobile, this.getClientId());\r\n\r\n try {\r\n const response = await axios.post(url, {\r\n mobile,\r\n code,\r\n platform: appConfig.platform,\r\n clientId: deviceId,\r\n uniqueEquipment: deviceId\r\n }, { withCredentials: false });\r\n\r\n this.persistAppToken(url, response);\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '注册失败');\r\n }\r\n return response.data.result;\r\n } catch (error) {\r\n const status = error.response?.status;\r\n if (status === 404 || status === 405) {\r\n return this.loginWithCode(mobile, code);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n connect(userId, token) {\r\n this.currentUser = { userId, token };\r\n this.connected = true;\r\n this.emit('connectionStatusChanged', { connected: true, statusText: '已连接' });\r\n this.refreshConversationList();\r\n }\r\n\r\n disconnect() {\r\n this.connected = false;\r\n this.currentUser = null;\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '未连接' });\r\n }\r\n\r\n getConversationList() {\r\n return [];\r\n }\r\n\r\n refreshConversationList() {\r\n const conversations = this.getConversationList();\r\n if (conversations.length) {\r\n this.emit('conversationsChanged', conversations);\r\n }\r\n if (this.currentUser?.userId) {\r\n this.fetchRemoteConversations().then(remoteConversations => {\r\n this.emit('conversationsChanged', remoteConversations);\r\n }).catch(() => {});\r\n }\r\n return conversations;\r\n }\r\n\r\n async fetchRemoteConversations(limit = 50) {\r\n if (!this.currentUser?.userId) {\r\n return [];\r\n }\r\n const response = await axios.post(appConfig.messagesApi, {\r\n userId: this.currentUser.userId,\r\n limit\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '会话同步失败');\r\n }\r\n\r\n return (response.data?.result?.conversations || []).map(conversation => ({\r\n ...conversation,\r\n updatedAt: Number(conversation.updatedAt || Date.now()),\r\n avatarText: conversation.avatarText || String(conversation.title || conversation.target || '?').slice(0, 1).toUpperCase(),\r\n raw: conversation.raw || { type: 'single', target: conversation.target, line: 0 }\r\n }));\r\n }\r\n\r\n getMessages(conversation) {\r\n if (!conversation?.id) {\r\n return [];\r\n }\r\n const userId = this.currentUser?.userId || '';\r\n return applyLocalMessageState(conversation.id, readLocalMessages(userId)[conversation.id] || [], userId);\r\n }\r\n\r\n async fetchRemoteMessages(conversation, limit = 50, options = {}) {\r\n if (!conversation?.id || !this.currentUser?.userId) {\r\n return [];\r\n }\r\n const response = await axios.post(appConfig.messagesApi, {\r\n userId: this.currentUser.userId,\r\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\r\n limit,\n conversationType: conversation.type || conversation.raw?.type || 0,\n markRead: Boolean(options.markRead),\n includeConversations: Boolean(options.includeConversations)\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '消息同步失败');\r\n }\r\n\r\n const messages = (response.data?.result?.messages || []).map(message => ({\n ...message,\r\n displayTimestamp: message.displayTimestamp || message.timestamp,\r\n conversationId: conversation.id\n }));\n messages.hasPinnedMessageState = Object.prototype.hasOwnProperty.call(response.data?.result || {}, 'pinnedMessageUid');\n messages.pinnedMessageUid = String(response.data?.result?.pinnedMessageUid || '');\n messages.pinnedMessage = response.data?.result?.pinnedMessage || null;\n if (options.includeConversations && Array.isArray(response.data?.result?.conversations)) {\n const remoteConversations = response.data.result.conversations.map(remoteConversation => ({\n ...remoteConversation,\n updatedAt: Number(remoteConversation.updatedAt || Date.now()),\n avatarText: remoteConversation.avatarText || String(remoteConversation.title || remoteConversation.target || '?').slice(0, 1).toUpperCase(),\n raw: remoteConversation.raw || { type: 'single', target: remoteConversation.target, line: 0 }\n }));\n this.emit('conversationsChanged', remoteConversations);\n }\n const userId = this.currentUser?.userId || '';\r\n const messagesByConversation = readLocalMessages(userId);\n messagesByConversation[conversation.id] = mergeSyncedMessages(messagesByConversation[conversation.id] || [], messages, conversation.id, userId);\n messagesByConversation[conversation.id].pinnedMessageUid = messages.pinnedMessageUid;\n messagesByConversation[conversation.id].pinnedMessage = messages.pinnedMessage;\n messagesByConversation[conversation.id].hasPinnedMessageState = messages.hasPinnedMessageState;\n writeLocalMessages(messagesByConversation, userId);\r\n return messagesByConversation[conversation.id];\n }\n\n async setPinnedMessage(conversation, messageUid = '', message = null) {\n const isGroup = ['group', 'channel'].includes(conversation?.type)\n || ['group', 'channel', 1, '1'].includes(conversation?.raw?.type);\n if (isGroup) {\n if (messageUid && message) {\n return this.addGroupPinnedMessage(conversation, message);\n }\n const serverPinId = String(message?.serverPinId || message?.pinId || '').trim();\n if (!serverPinId) {\n throw new Error('缺少置顶记录ID,请刷新会话后重试');\n }\n return this.removeGroupPinnedMessage(serverPinId);\n }\n const action = messageUid ? 'pin' : 'unpin';\n const response = await axios.post(appConfig.messageActionApi, {\n action,\n userId: this.currentUser?.userId || '',\n messageUid: messageUid || '1',\n target: conversation.target || conversation.raw?.target || '',\n conversationType: ['group', 'channel'].includes(conversation.type) ? 'group' : 'single',\n message: message ? {\n id: String(message.messageUid || message.id || messageUid),\n messageUid: String(message.messageUid || message.id || messageUid),\n text: String(message.text || ''),\n type: message.type || 'text',\n attachment: message.attachment || null,\n senderName: message.senderName || message.from || '',\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now())\n } : null\n }, { withCredentials: false });\n if (response.data?.code !== 0) throw new Error(response.data?.message || '置顶失败');\n }\n\n async fetchGroupPinnedMessages(conversation) {\n const groupId = String(conversation?.target || conversation?.raw?.target || '').trim();\n if (!groupId) return [];\n const url = `${appConfig.appServer}/groupTopMessage/gets`;\n const response = await axios.get(url, {\n params: { groupId },\n headers: this.getAppAuthHeaders(url),\n withCredentials: false\n });\n const payload = response.data || {};\n if (payload.code !== undefined && Number(payload.code) !== 0) {\n throw new Error(payload.message || '置顶消息加载失败');\n }\n const result = payload.result ?? payload.data ?? payload;\n return Array.isArray(result) ? result : [];\n }\n\n async addGroupPinnedMessage(conversation, message) {\n const groupId = String(conversation?.target || conversation?.raw?.target || '').trim();\n const messageId = String(message?.messageId || message?.messageUid || message?.id || '').trim();\n if (!groupId || !messageId) throw new Error('缺少群ID或消息ID');\n const searchableContent = String(message?.text || '').trim()\n || (message?.type === 'image' ? '[图片]' : message?.type === 'video' ? '[视频]' : '[消息]');\n const rawConversationType = Number(conversation?.raw?.type);\n const conversationType = Number.isFinite(rawConversationType) && rawConversationType > 0\n ? rawConversationType\n : 1;\n const url = `${appConfig.appServer}/groupTopMessage/add`;\n const response = await axios.post(url, {\n groupId,\n userId: message?.from || this.currentUser?.userId || '',\n messageId,\n messageType: conversationType,\n messageText: JSON.stringify({\n ...message,\n messageId,\n from: message?.from || this.currentUser?.userId || '',\n conversation: {\n type: conversationType,\n target: groupId,\n line: Number(conversation?.raw?.line || 0)\n },\n content: { searchableContent }\n })\n }, {\n headers: this.getAppAuthHeaders(url),\n withCredentials: false\n });\n const payload = response.data || {};\n if (payload.code !== undefined && Number(payload.code) !== 0) {\n const detail = payload.message || payload.msg || payload.result?.message || '置顶失败';\n throw new Error(payload.code !== undefined ? `${detail}(错误码 ${payload.code})` : detail);\n }\n return payload.result ?? payload.data ?? payload;\n }\n\n async removeGroupPinnedMessage(pinId) {\n const url = `${appConfig.appServer}/groupTopMessage/remove/?id=${encodeURIComponent(pinId)}`;\n const response = await axios.post(url, {}, {\n headers: this.getAppAuthHeaders(url),\n withCredentials: false\n });\n const payload = response.data || {};\n if (payload.code !== undefined && Number(payload.code) !== 0) {\n throw new Error(payload.message || '取消置顶失败');\n }\n return payload.result ?? payload.data ?? payload;\n }\n\r\n hideMessages(conversation, messages) {\r\n const items = Array.isArray(messages) ? messages : [messages];\r\n if (!conversation?.id || !items.length) {\r\n return;\r\n }\r\n const userId = this.currentUser?.userId || '';\r\n storeMessageKeys(LOCAL_HIDDEN_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\r\n const messagesByConversation = readLocalMessages(userId);\r\n messagesByConversation[conversation.id] = applyLocalMessageState(\r\n conversation.id,\r\n messagesByConversation[conversation.id] || [],\r\n userId\r\n );\r\n writeLocalMessages(messagesByConversation, userId);\r\n }\r\n\r\n markMessagesRecalled(conversation, messages) {\r\n const items = Array.isArray(messages) ? messages : [messages];\r\n if (!conversation?.id || !items.length) {\r\n return;\r\n }\r\n const userId = this.currentUser?.userId || '';\r\n storeMessageKeys(LOCAL_RECALLED_MESSAGE_STORAGE_KEY, conversation.id, items, userId);\r\n const messagesByConversation = readLocalMessages(userId);\r\n messagesByConversation[conversation.id] = applyLocalMessageState(\r\n conversation.id,\r\n messagesByConversation[conversation.id] || [],\r\n userId\r\n );\r\n writeLocalMessages(messagesByConversation, userId);\r\n }\r\n\r\n async recallMessage(conversation, message) {\r\n const messageUid = String(message?.messageUid || message?.id || '').trim();\r\n if (!/^\\d+$/.test(messageUid)) {\r\n throw new Error('缺少可撤回的消息ID');\r\n }\r\n\r\n const response = await axios.post(appConfig.messageActionApi, {\r\n action: 'recall',\r\n userId: this.currentUser?.userId || message.from || '',\r\n messageUid\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '撤回失败');\r\n }\r\n this.markMessagesRecalled(conversation, [message]);\r\n return response.data.result;\r\n }\r\n\r\n async editMessage(conversation, message, text) {\r\n const messageUid = String(message?.messageUid || message?.id || '').trim();\r\n if (!/^\\d+$/.test(messageUid)) {\r\n throw new Error('缺少可编辑的消息ID');\r\n }\r\n const nextText = String(text || '').trim();\r\n if (!nextText) {\r\n throw new Error('编辑内容不能为空');\r\n }\r\n\r\n const response = await axios.post(appConfig.messageActionApi, {\r\n action: 'edit',\r\n userId: this.currentUser?.userId || message.from || '',\r\n messageUid,\r\n text: nextText\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '编辑失败');\r\n }\r\n\r\n const result = response.data?.result?.message || {};\r\n const editedMessage = {\r\n ...message,\r\n text: result.text || nextText,\r\n status: 'delivered',\r\n deliveryStatus: 'delivered',\r\n editedAt: Number(result.editedAt || Date.now()),\r\n activityTimestamp: Number(result.editedAt || Date.now())\r\n };\r\n saveLocalMessage(editedMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', editedMessage);\r\n return editedMessage;\r\n }\r\n\r\n async getMessageDetail(conversation, message) {\r\n const messageUid = String(message?.messageUid || message?.id || '').trim();\r\n if (!messageUid) {\r\n throw new Error('缺少消息ID');\r\n }\r\n const response = await axios.post(appConfig.messageDetailApi, {\r\n userId: this.currentUser?.userId || '',\r\n target: conversation?.target || conversation?.raw?.target || conversation?.id?.replace(/^single-/, '') || '',\r\n conversationType: conversation?.type || conversation?.raw?.type || 'single',\r\n messageUid\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '消息详情加载失败');\r\n }\r\n\r\n return response.data?.result?.detail || null;\r\n }\r\n\r\n async sendTextMessage(conversation, text, initialMessage = null, options = {}) {\n const senderRole = conversation?.role || conversation?.raw?.role || '';\r\n const message = initialMessage || {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: this.currentUser?.userId || 'me',\r\n senderRole,\r\n direction: 'out',\r\n type: 'text',\r\n text,\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: Date.now()\r\n };\r\n saveLocalMessage(message, this.currentUser?.userId || '');\r\n if (!initialMessage) {\r\n this.emit('messageSent', message);\r\n }\r\n\r\n try {\r\n const response = await axios.post(appConfig.sendMessageApi, {\r\n sender: this.currentUser?.userId || '',\r\n target: conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''),\r\n conversationType: conversation.type || conversation.raw?.type || 0,\n text,\n mentionedUserIds: Array.isArray(options.mentionedUserIds) ? options.mentionedUserIds : []\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '发送失败');\r\n }\r\n\r\n const sentMessage = {\r\n ...message,\r\n status: 'sent',\r\n deliveryStatus: 'sent',\r\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\r\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\r\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\r\n timestamp: message.timestamp,\r\n displayTimestamp: message.displayTimestamp || message.timestamp\r\n };\r\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', sentMessage);\r\n return sentMessage;\r\n } catch (error) {\r\n const failedMessage = {\r\n ...message,\r\n status: 'failed',\r\n deliveryStatus: '',\r\n error: error.response?.data?.message || error.message || '发送失败'\r\n };\r\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', failedMessage);\r\n return failedMessage;\r\n }\r\n }\r\n\r\n async sendAttachmentMessage(conversation, { type, file, text = '' }, initialMessage = null) {\n const senderRole = conversation?.role || conversation?.raw?.role || '';\r\n const message = initialMessage || {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: this.currentUser?.userId || 'me',\r\n senderRole,\r\n direction: 'out',\r\n type,\r\n text,\r\n attachment: {\r\n type,\r\n name: file?.name || (type === 'image' ? '图片' : '文件'),\r\n mime: file?.type || '',\r\n size: file?.size || 0,\r\n url: type === 'image' && file ? URL.createObjectURL(file) : ''\r\n },\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: Date.now()\r\n };\r\n saveLocalMessage(message, this.currentUser?.userId || '');\r\n if (!initialMessage) {\r\n this.emit('messageSent', message);\r\n }\r\n\r\n try {\r\n const formData = new FormData();\r\n formData.append('sender', this.currentUser?.userId || '');\r\n formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''));\r\n formData.append('conversationType', conversation.type || conversation.raw?.type || 0);\r\n formData.append('messageType', type);\r\n formData.append('text', text || '');\r\n formData.append('attachment', file);\r\n\r\n const response = await axios.post(appConfig.sendMessageApi, formData, {\r\n withCredentials: false\r\n });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '发送失败');\r\n }\r\n\r\n const sentMessage = {\r\n ...message,\r\n status: 'sent',\r\n deliveryStatus: 'sent',\r\n messageUid: response.data?.result?.messageUid ? String(response.data.result.messageUid) : '',\r\n senderRole: response.data?.result?.senderRole || message.senderRole || '',\r\n attachment: response.data?.result?.attachment || message.attachment,\r\n serverTimestamp: Number(response.data?.result?.timestamp || 0) || null,\r\n timestamp: message.timestamp,\r\n displayTimestamp: message.displayTimestamp || message.timestamp\r\n };\r\n saveLocalMessage(sentMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', sentMessage);\r\n return sentMessage;\r\n } catch (error) {\r\n const failedMessage = {\r\n ...message,\r\n status: 'failed',\r\n deliveryStatus: '',\r\n error: error.response?.data?.message || error.message || '发送失败'\r\n };\r\n saveLocalMessage(failedMessage, this.currentUser?.userId || '');\r\n this.emit('messageStatusChanged', failedMessage);\r\n return failedMessage;\r\n }\r\n }\n\n async forwardAttachmentMessage(conversation, sourceMessage) {\n const attachment = sourceMessage?.attachment || {};\n const type = attachment.type || sourceMessage?.type || 'file';\n const formData = new FormData();\n formData.append('sender', this.currentUser?.userId || '');\n formData.append('target', conversation.target || conversation.raw?.target || conversation.id.replace(/^single-/, ''));\n formData.append('conversationType', conversation.type || conversation.raw?.type || 0);\n formData.append('messageType', type);\n formData.append('text', sourceMessage?.text || '');\n formData.append('attachmentUrl', attachment.url || '');\n formData.append('attachmentName', attachment.name || (type === 'image' ? '转发图片' : (type === 'video' ? '转发视频.mp4' : '转发文件')));\n formData.append('attachmentMime', attachment.mime || (type === 'video' ? 'video/mp4' : 'application/octet-stream'));\n formData.append('attachmentSize', String(attachment.size || 0));\n\n const response = await axios.post(appConfig.sendMessageApi, formData, { withCredentials: false });\n if (response.data?.code !== 0) {\n throw new Error(response.data?.message || '转发失败');\n }\n return response.data?.result || {};\n }\n\r\n getContactList() {\r\n return [];\r\n }\r\n\r\n async getServerContactList(userId) {\r\n if (!userId) {\r\n return [];\r\n }\r\n const response = await axios.post(appConfig.contactsApi, { userId }, {\r\n withCredentials: false,\r\n headers: this.getAppAuthHeaders(appConfig.contactsApi)\r\n });\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '联系人加载失败');\r\n }\r\n return (response.data?.result?.contacts || []).map(item => {\r\n return this.mapContact(item.uid, { alias: item.alias }, {\r\n uid: item.uid,\r\n displayName: item.displayName,\r\n name: item.name,\r\n mobile: item.mobile,\r\n portrait: item.portrait,\r\n address: item.address,\r\n friendAlias: item.alias\r\n });\r\n }).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));\r\n }\r\n\r\n async addContact(userId, keyword, reason = '') {\r\n const response = await axios.post(appConfig.addContactApi, {\r\n userId,\r\n keyword,\r\n reason\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '添加联系人失败');\r\n }\r\n\r\n const item = response.data?.result?.contact;\r\n if (!item?.uid) {\r\n return null;\r\n }\r\n\r\n return this.mapContact(item.uid, { alias: item.alias }, {\r\n uid: item.uid,\r\n displayName: item.displayName,\r\n name: item.name,\r\n mobile: item.mobile,\r\n portrait: item.portrait,\r\n address: item.address,\r\n friendAlias: item.alias\r\n });\r\n }\r\n\r\n normalizeConversation(conversation) {\r\n const title = getTitle(conversation?.title, conversation?.target || '');\r\n return {\r\n ...conversation,\r\n id: conversation?.id || `${conversation?.type === 'single' ? 'single' : 'group'}-${conversation?.target}`,\r\n target: conversation?.target || conversation?.raw?.target || '',\r\n title,\r\n subtitle: conversation?.subtitle || '',\r\n unread: Number(conversation?.unread || 0),\r\n portrait: conversation?.portrait || '',\r\n avatarText: conversation?.avatarText || title.slice(0, 1).toUpperCase(),\r\n updatedAt: Number(conversation?.updatedAt || Date.now()),\r\n raw: conversation?.raw || {\r\n type: conversation?.type === 'single' ? 'single' : 'group',\r\n target: conversation?.target || '',\r\n line: 0\r\n }\r\n };\r\n }\r\n\r\n async createGroup(userId, { name, memberIds = [], announcement = '', welcomeText = '', channel = false }) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: channel ? 'create_channel' : 'create_group',\r\n userId,\r\n name,\r\n memberIds,\r\n announcement,\r\n welcomeText\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || (channel ? '创建公告群失败' : '创建群组失败'));\r\n }\r\n\r\n return this.normalizeConversation(response.data?.result?.conversation || {});\r\n }\r\n\r\n async joinGroup(userId, groupKey) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'join_group',\r\n userId,\r\n groupKey\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '加入群组失败');\r\n }\r\n\r\n return this.normalizeConversation(response.data?.result?.conversation || {});\r\n }\r\n\r\n async broadcastMessage(userId, targetIds, text) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'broadcast',\r\n userId,\r\n targetIds,\r\n text\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '群发失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async getGroupDetail(userId, groupId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'group_detail',\r\n userId,\r\n groupId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '群资料加载失败');\r\n }\r\n\r\n return response.data?.result?.group || null;\r\n }\r\n\r\n async getGroupMembers(userId, groupId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'group_members',\r\n userId,\r\n groupId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '群员加载失败');\r\n }\r\n\r\n return response.data?.result?.members || [];\r\n }\r\n\r\n async updateGroupAlias(userId, groupId, alias) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'update_group_alias',\r\n userId,\r\n groupId,\r\n alias\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '本群昵称保存失败');\r\n }\r\n\r\n return response.data?.result?.alias || '';\r\n }\r\n\r\n async leaveGroup(userId, groupId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'leave_group',\r\n userId,\r\n groupId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '退出群组失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async dismissGroup(userId, groupId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'dismiss_group',\r\n userId,\r\n groupId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '解散群组失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async transferGroup(userId, groupId, targetUserId) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'transfer_group',\r\n userId,\r\n groupId,\r\n targetUserId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '转让群组失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async setGroupAdmins(userId, groupId, adminIds) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'set_group_admins',\r\n userId,\r\n groupId,\r\n adminIds\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '管理员设置失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async updateGroupProfile(userId, groupId, { name, announcement, welcomeText }) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'update_group_profile',\r\n userId,\r\n groupId,\r\n name,\r\n announcement,\r\n welcomeText\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '群资料保存失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async kickGroupMembers(userId, groupId, targetIds) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'kick_group_members',\r\n userId,\r\n groupId,\r\n targetIds\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '踢人失败');\r\n }\r\n\r\n return response.data?.result || {};\r\n }\r\n\r\n async updateGroupMuteSetting(userId, groupId, setting) {\r\n const response = await axios.post(appConfig.conversationActionsApi, {\r\n action: 'update_mute_setting',\r\n userId,\r\n groupId,\r\n ...setting\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '禁言设置保存失败');\r\n }\r\n\r\n return response.data?.result?.muteSetting || null;\r\n }\r\n\r\n async updateContactAlias(userId, targetId, alias) {\r\n const response = await axios.post(appConfig.updateAliasApi, {\r\n userId,\r\n targetId,\r\n alias\r\n }, {\r\n withCredentials: false,\r\n headers: this.getAppAuthHeaders(appConfig.updateAliasApi)\r\n });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '备注名修改失败');\r\n }\r\n\r\n return response.data?.result?.contact?.alias || '';\r\n }\r\n\r\n async getProfile(userId) {\r\n const response = await axios.post(appConfig.profileApi, {\r\n action: 'get',\r\n userId\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '用户资料加载失败');\r\n }\r\n\r\n return response.data?.result?.profile || null;\r\n }\r\n\r\n async updateProfile(userId, { displayName, portraitFile }) {\r\n const formData = new FormData();\r\n formData.append('action', 'update');\r\n formData.append('userId', userId);\r\n formData.append('displayName', displayName);\r\n if (portraitFile) {\r\n formData.append('portraitFile', portraitFile);\r\n }\r\n\r\n const response = await axios.post(appConfig.profileApi, formData, {\r\n withCredentials: false,\r\n headers: this.getAppAuthHeaders(appConfig.appServer)\r\n });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || '用户资料保存失败');\r\n }\r\n\r\n return response.data?.result?.profile || null;\r\n }\r\n\r\n async changePassword({ oldPassword, newPassword }) {\r\n const response = await axios.post(appConfig.changePasswordApi, {\r\n oldPassword,\r\n newPassword\r\n }, {\r\n withCredentials: false,\r\n headers: this.getAppAuthHeaders(appConfig.changePasswordApi)\r\n });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || response.data?.msg || '密码修改失败');\r\n }\r\n\r\n return true;\r\n }\r\n\r\n async resetPasswordWithCode({ mobile, resetCode, newPassword }) {\r\n const response = await axios.post(appConfig.resetPasswordApi, {\r\n mobile,\r\n resetCode,\r\n newPassword\r\n }, { withCredentials: false });\r\n\r\n if (response.data?.code !== 0) {\r\n throw new Error(response.data?.message || response.data?.msg || '密码设置失败');\r\n }\r\n\r\n return true;\r\n }\r\n\r\n refreshContactList() {\r\n const contacts = this.getContactList();\r\n this.emit('contactsChanged', contacts);\r\n return contacts;\r\n }\r\n\r\n createSingleConversation(userId, userInfo = null) {\r\n const title = getTitle(userInfo?.title || userInfo?.displayName || userInfo?.name, userId);\r\n return {\r\n id: `single-${userId}`,\r\n type: 'single',\r\n target: userId,\r\n title,\r\n subtitle: '',\r\n unread: 0,\r\n portrait: userInfo?.portrait || '',\r\n avatarText: title.slice(0, 1).toUpperCase(),\r\n updatedAt: Date.now(),\r\n raw: { type: 'single', target: userId, line: 0 }\r\n };\r\n }\r\n\r\n mapContact(userId, friend, userInfo) {\r\n const title = getTitle(userInfo?.friendAlias || friend?.alias || userInfo?.displayName || userInfo?.name, userId);\r\n return {\r\n id: userId,\r\n uid: userId,\r\n title,\r\n subtitle: userInfo?.mobile || userInfo?.name || userId,\r\n portrait: userInfo?.portrait || '',\r\n address: userInfo?.address || '',\r\n avatarText: title.slice(0, 1).toUpperCase(),\r\n alias: friend?.alias || userInfo?.friendAlias || '',\r\n rawFriend: friend,\r\n rawUser: userInfo\r\n };\r\n }\r\n\r\n on(eventName, handler) {\r\n if (!this.listeners.has(eventName)) {\r\n this.listeners.set(eventName, new Set());\r\n }\r\n this.listeners.get(eventName).add(handler);\r\n return () => this.off(eventName, handler);\r\n }\r\n\r\n off(eventName, handler) {\r\n this.listeners.get(eventName)?.delete(handler);\r\n }\r\n\r\n emit(eventName, payload) {\r\n this.listeners.get(eventName)?.forEach(handler => handler(payload));\r\n }\r\n\r\n persistAppToken(url, response) {\r\n const appToken = response.headers?.authtoken || response.headers?.authToken;\r\n if (appToken) {\r\n localStorage.setItem(appConfig.authTokenStoragePrefix + this.getUrlHost(url), appToken);\r\n }\r\n }\r\n\r\n getAppAuthHeaders(url) {\r\n const host = this.getUrlHost(url);\r\n if (!host) {\r\n return {};\r\n }\r\n const token = localStorage.getItem(appConfig.authTokenStoragePrefix + host);\r\n return token ? { authToken: token } : {};\r\n }\r\n\r\n getUrlHost(url) {\r\n try {\r\n return new URL(url, window.location.origin).host;\r\n } catch (error) {\r\n return '';\r\n }\r\n }\r\n}\r\n\r\nexport const imClient = new HttpImClient();\r\n","import { appConfig } from '@/config';\nimport { HttpImClient } from './httpImClient';\nimport { LongConnectionImClient } from './longConnectionImClient';\nimport { DocumentedHttpImClient } from './documentedHttpImClient';\n\nclass UnsupportedWildfireImClient {\n constructor() {\n throw new Error('当前本地社区版 Web 客户端未启用 WildFire Web SDK');\n }\n}\n\nexport const imClient = appConfig.sdkMode === 'wildfire'\n ? new UnsupportedWildfireImClient()\n : appConfig.sdkMode === 'custom-ws' || appConfig.sdkMode === 'long'\n ? new LongConnectionImClient()\n : appConfig.sdkMode === 'legacy-http'\n ? new HttpImClient()\n : new DocumentedHttpImClient();\n\nexport {\n DocumentedHttpImClient,\n HttpImClient,\n LongConnectionImClient,\n UnsupportedWildfireImClient as WildfireImClient\n};\n","import { appConfig } from '@/config';\r\nimport { HttpImClient } from './httpImClient';\r\n\r\nconst HEARTBEAT_INTERVAL_MS = 25000;\r\nconst RECONNECT_MIN_MS = 1000;\r\nconst RECONNECT_MAX_MS = 15000;\r\n\r\nfunction buildWsUrl() {\r\n if (appConfig.wsUrl) {\r\n return appConfig.wsUrl;\r\n }\r\n const protocol = appConfig.useWss ? 'wss' : 'ws';\r\n const host = appConfig.imServerHost || window.location.hostname;\r\n const port = appConfig.imRoutePort ? `:${appConfig.imRoutePort}` : '';\r\n const path = appConfig.wsPath?.startsWith('/') ? appConfig.wsPath : `/${appConfig.wsPath || 'ws'}`;\r\n return `${protocol}://${host}${port}${path}`;\r\n}\r\n\r\nfunction normalizeConversationId(payload) {\r\n const target = payload.target || payload.to || payload.receiver || payload.conversationTarget || payload.from || payload.sender;\r\n return payload.conversationId || (target ? `single-${target}` : '');\r\n}\r\n\r\nfunction normalizeIncomingMessage(payload, currentUserId) {\r\n const item = payload.message || payload;\r\n const from = item.from || item.sender || item.fromUser || '';\r\n const target = item.target || item.to || item.receiver || '';\r\n const direction = from && String(from) === String(currentUserId) ? 'out' : 'in';\r\n const conversationId = item.conversationId || normalizeConversationId({\r\n ...item,\r\n target: direction === 'out' ? target : from\r\n });\r\n\r\n if (!conversationId) {\r\n return null;\r\n }\r\n\r\n const status = item.status || item.deliveryStatus || 'sent';\r\n\r\n return {\r\n id: item.id || item.messageId || item.messageUid || `${Date.now()}${Math.random().toString(16).slice(2)}`,\r\n messageUid: item.messageUid || item.uid || item.messageId || '',\r\n conversationId,\r\n from,\r\n target,\r\n direction,\r\n type: item.type || 'text',\r\n text: item.text || item.content || item.searchableContent || '',\r\n status,\r\n deliveryStatus: item.deliveryStatus || (direction === 'out' ? status : ''),\r\n timestamp: Number(item.timestamp || item.serverTimestamp || Date.now()),\r\n displayTimestamp: Number(item.displayTimestamp || item.timestamp || item.serverTimestamp || Date.now()),\r\n raw: item\r\n };\r\n}\r\n\r\nexport class LongConnectionImClient extends HttpImClient {\r\n constructor() {\r\n super();\r\n this.socket = null;\r\n this.wsUrl = buildWsUrl();\r\n this.heartbeatTimer = null;\r\n this.reconnectTimer = null;\r\n this.reconnectAttempts = 0;\r\n this.manualClose = false;\r\n }\r\n\r\n getSdkVersion() {\r\n return 'JC-LC/0.1';\r\n }\r\n\r\n shouldUseMessagePolling() {\r\n return !this.connected;\r\n }\r\n\r\n async ensureSdk() {\r\n if (typeof WebSocket === 'undefined') {\r\n throw new Error('当前浏览器不支持 WebSocket 长连接');\r\n }\r\n return true;\r\n }\r\n\r\n connect(userId, token) {\r\n this.currentUser = { userId, token };\r\n this.manualClose = false;\r\n this.openSocket();\r\n }\r\n\r\n disconnect() {\r\n this.manualClose = true;\r\n this.clearReconnectTimer();\r\n this.clearHeartbeatTimer();\r\n if (this.socket) {\r\n this.socket.close();\r\n this.socket = null;\r\n }\r\n super.disconnect();\r\n }\r\n\r\n openSocket() {\r\n if (this.socket?.readyState === WebSocket.OPEN) {\r\n this.sendAuthFrame();\r\n return;\r\n }\r\n if (this.socket?.readyState === WebSocket.CONNECTING) {\r\n return;\r\n }\r\n\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接连接中' });\r\n\r\n try {\r\n this.socket = new WebSocket(this.wsUrl);\r\n this.socket.binaryType = 'arraybuffer';\r\n } catch (error) {\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接创建失败,使用HTTP补偿' });\r\n this.scheduleReconnect();\r\n return;\r\n }\r\n\r\n this.socket.onopen = () => {\r\n this.connected = true;\r\n this.reconnectAttempts = 0;\r\n this.emit('connectionStatusChanged', { connected: true, statusText: '长连接已连接' });\r\n this.sendAuthFrame();\r\n this.startHeartbeat();\r\n this.refreshConversationList();\r\n };\r\n\r\n this.socket.onmessage = event => {\r\n this.handleFrame(event.data);\r\n };\r\n\r\n this.socket.onerror = () => {\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接异常,使用HTTP补偿' });\r\n };\r\n\r\n this.socket.onclose = () => {\r\n this.connected = false;\r\n this.clearHeartbeatTimer();\r\n this.socket = null;\r\n if (this.manualClose) {\r\n return;\r\n }\r\n this.emit('connectionStatusChanged', { connected: false, statusText: '长连接重连中' });\r\n this.scheduleReconnect();\r\n };\r\n }\r\n\r\n sendAuthFrame() {\r\n this.sendFrame({\r\n type: 'auth',\r\n userId: this.currentUser?.userId || '',\r\n token: this.currentUser?.token || '',\r\n clientId: this.getClientId(),\r\n platform: appConfig.platform,\r\n timestamp: Date.now()\r\n });\r\n }\r\n\r\n sendFrame(frame) {\r\n if (this.socket?.readyState !== WebSocket.OPEN) {\r\n return false;\r\n }\r\n this.socket.send(JSON.stringify(frame));\r\n return true;\r\n }\r\n\r\n handleFrame(rawData) {\r\n if (rawData instanceof ArrayBuffer) {\r\n this.emit('rawFrameReceived', rawData);\r\n return;\r\n }\r\n\r\n let payload;\r\n try {\r\n payload = typeof rawData === 'string' ? JSON.parse(rawData) : rawData;\r\n } catch (error) {\r\n return;\r\n }\r\n\r\n const type = payload.type || payload.event || payload.cmd || '';\r\n if (type === 'pong' || type === 'auth_ok' || type === 'connected') {\r\n return;\r\n }\r\n if (type === 'contactsChanged') {\r\n this.emit('contactsChanged', payload.contacts || []);\r\n return;\r\n }\r\n if (type === 'conversationsChanged') {\r\n this.emit('conversationsChanged', payload.conversations || []);\r\n return;\r\n }\r\n if (type === 'messages' && Array.isArray(payload.messages)) {\r\n payload.messages\r\n .map(message => normalizeIncomingMessage(message, this.currentUser?.userId))\r\n .filter(Boolean)\r\n .forEach(message => this.emit('messageReceived', message));\r\n return;\r\n }\r\n\r\n const message = normalizeIncomingMessage(payload, this.currentUser?.userId);\r\n if (message) {\r\n this.emit(message.direction === 'out' ? 'messageStatusChanged' : 'messageReceived', message);\r\n }\r\n }\r\n\r\n startHeartbeat() {\r\n this.clearHeartbeatTimer();\r\n this.heartbeatTimer = window.setInterval(() => {\r\n this.sendFrame({ type: 'ping', timestamp: Date.now() });\r\n }, HEARTBEAT_INTERVAL_MS);\r\n }\r\n\r\n clearHeartbeatTimer() {\r\n if (this.heartbeatTimer) {\r\n window.clearInterval(this.heartbeatTimer);\r\n this.heartbeatTimer = null;\r\n }\r\n }\r\n\r\n scheduleReconnect() {\r\n this.clearReconnectTimer();\r\n const delay = Math.min(RECONNECT_MAX_MS, RECONNECT_MIN_MS * 2 ** this.reconnectAttempts);\r\n this.reconnectAttempts += 1;\r\n this.reconnectTimer = window.setTimeout(() => {\r\n this.openSocket();\r\n }, delay);\r\n }\r\n\r\n clearReconnectTimer() {\r\n if (this.reconnectTimer) {\r\n window.clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n }\r\n}\r\n","function configuredProxyHosts() {\n const configured = window.JC_WEB_IM_CONFIG?.mediaProxyHosts;\n const values = Array.isArray(configured)\n ? configured\n : String(configured || '').split(/[\\s,]+/);\n return new Set(\n ['zhiyanim.dfpnm.cn', ...values]\n .map(value => String(value || '').trim().toLowerCase().replace(/\\.$/, ''))\n .filter(Boolean)\n );\n}\n\nexport function imageDisplayUrl(value) {\n const source = String(value || '').trim();\n if (!source || source.startsWith('blob:') || source.startsWith('data:')) {\n return source;\n }\n\n try {\n const url = new URL(source, window.location.origin);\n if (url.protocol !== 'https:' || !configuredProxyHosts().has(url.hostname.toLowerCase())) {\n return source;\n }\n const proxyUrl = new URL('/api/media_proxy.php', window.location.origin);\n proxyUrl.searchParams.set('url', url.toString());\n return proxyUrl.toString();\n } catch (error) {\n return source;\n }\n}\n\nexport function videoDisplayUrl(value) {\n const source = String(value || '').trim();\n if (!source || source.startsWith('blob:') || source.startsWith('data:')) return source;\n const streamUrl = new URL('/api/media_stream.php', window.location.origin);\n streamUrl.searchParams.set('url', source);\n return streamUrl.toString();\n}\n\nexport function useVideoOriginalFallback(event, value) {\n const video = event?.currentTarget;\n const source = String(value || '').trim();\n if (!video || !source || video.dataset.originalFallback === '1') return;\n video.dataset.originalFallback = '1';\n video.src = source;\n video.load();\n}\n\nexport function useImageProxyFallback(event, value) {\n const image = event?.currentTarget;\n if (!image) return;\n const fallback = imageDisplayUrl(value);\n if (!fallback || fallback === value || image.dataset.proxyFallback === '1') return;\n image.dataset.proxyFallback = '1';\n image.src = fallback;\n}\n","import axios from 'axios';\nimport { appConfig } from '@/config';\nimport { imClient } from '@/services/imClient';\n\nclass RealtimeNotificationClient {\n constructor() {\n this.source = null;\n this.userId = '';\n this.handler = null;\n this.reconnectTimer = null;\n this.reconnectAttempt = 0;\n this.generation = 0;\n }\n\n isConnected() {\n return this.source?.readyState === WebSocket.OPEN;\n }\n\n start(userId, handler) {\n this.stop();\n if (!appConfig.sseEnabled || !userId || typeof window.WebSocket !== 'function') return;\n this.userId = userId;\n this.handler = handler;\n this.generation += 1;\n this.open(this.generation);\n }\n\n stop() {\n this.generation += 1;\n window.clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n if (this.source) this.source.close();\n this.source = null;\n this.userId = '';\n this.handler = null;\n this.reconnectAttempt = 0;\n }\n\n async open(generation) {\n try {\n const response = await axios.post(appConfig.sseTicketApi, { userId: this.userId }, {\n withCredentials: false,\n headers: imClient.getAppAuthHeaders(appConfig.appServer)\n });\n if (generation !== this.generation) return;\n if (response.data?.code !== 0) throw new Error(response.data?.message || '实时通知凭证申请失败');\n const ticket = response.data?.result?.ticket || '';\n if (!ticket) throw new Error('实时通知凭证为空');\n const separator = appConfig.sseUrl.includes('?') ? '&' : '?';\n const endpoint = `${appConfig.sseUrl}${separator}ticket=${encodeURIComponent(ticket)}`;\n const socketUrl = endpoint.startsWith('ws://') || endpoint.startsWith('wss://')\n ? endpoint\n : `${window.location.protocol === 'https:' ? 'wss:' : 'ws:'}//${window.location.host}${endpoint.startsWith('/') ? '' : '/'}${endpoint}`;\n const source = new WebSocket(socketUrl);\n this.source = source;\n source.onopen = () => {\n this.reconnectAttempt = 0;\n };\n source.onmessage = event => {\n if (generation !== this.generation) return;\n let payload = {};\n try { payload = JSON.parse(event.data || '{}'); } catch (error) { payload = {}; }\n if (payload.type !== 'message-notification') return;\n this.handler?.(payload);\n };\n source.onerror = () => {\n if (generation !== this.generation) return;\n source.close();\n if (this.source === source) this.source = null;\n this.scheduleReconnect(generation);\n };\n source.onclose = () => {\n if (generation !== this.generation || this.source !== source) return;\n this.source = null;\n this.scheduleReconnect(generation);\n };\n } catch (error) {\n if (generation === this.generation) this.scheduleReconnect(generation);\n }\n }\n\n scheduleReconnect(generation) {\n window.clearTimeout(this.reconnectTimer);\n const delay = Math.min(30000, 1000 * (2 ** Math.min(this.reconnectAttempt, 5)));\n this.reconnectAttempt += 1;\n this.reconnectTimer = window.setTimeout(() => this.open(generation), delay);\n }\n}\n\nexport const realtimeNotifications = new RealtimeNotificationClient();\n","import { defineStore } from 'pinia';\r\nimport { imClient } from '@/services/imClient';\r\nimport { useConversationStore } from '@/stores/conversations';\r\nimport { useNavigationStore } from '@/stores/navigation';\r\nimport { useSessionStore } from '@/stores/session';\r\n\r\nconst CONTACT_CACHE_MS = 15000;\r\n\r\nfunction normalizeContacts(contacts) {\r\n const unique = new Map();\r\n contacts.forEach(contact => {\r\n const uid = String(contact.uid || contact.id || '').trim();\r\n if (!uid) {\r\n return;\r\n }\r\n const normalized = {\r\n ...contact,\r\n id: String(contact.id || uid),\r\n uid\r\n };\r\n unique.set(uid, {\r\n ...(unique.get(uid) || {}),\r\n ...normalized\r\n });\r\n });\r\n return Array.from(unique.values()).sort((a, b) => a.title.localeCompare(b.title, 'zh-CN'));\r\n}\r\n\r\nexport const useContactStore = defineStore('contacts', {\r\n state: () => ({\r\n contacts: [],\r\n activeId: '',\r\n loading: false,\r\n eventsBound: false,\r\n refreshSerial: 0,\r\n refreshPromise: null,\r\n loadedForUserId: '',\r\n loadedAt: 0,\r\n actionError: '',\r\n actionInfo: ''\r\n }),\r\n getters: {\r\n activeContact(state) {\r\n return state.contacts.find(item => item.id === state.activeId) || state.contacts[0] || null;\r\n }\r\n },\r\n actions: {\r\n bindImEvents() {\r\n if (this.eventsBound) {\r\n return;\r\n }\r\n this.eventsBound = true;\r\n imClient.on('contactsChanged', contacts => {\r\n if (!contacts.length && this.contacts.length) {\r\n return;\r\n }\r\n this.contacts = normalizeContacts(contacts);\r\n if (!this.contacts.find(item => item.id === this.activeId)) {\r\n this.activeId = this.contacts[0]?.id || '';\r\n }\r\n });\r\n },\r\n async refreshContacts(options = {}) {\r\n this.bindImEvents();\r\n const session = useSessionStore();\r\n const requestUserId = session.userId;\r\n const force = Boolean(options.force);\r\n if (!requestUserId) {\r\n this.clearContacts();\r\n return [];\r\n }\r\n if (!force\r\n && this.contacts.length\r\n && this.loadedForUserId === requestUserId\r\n && Date.now() - this.loadedAt < CONTACT_CACHE_MS\r\n ) {\r\n return this.contacts;\r\n }\r\n if (this.refreshPromise && !force) {\r\n return this.refreshPromise;\r\n }\r\n const serial = this.refreshSerial + 1;\r\n this.refreshSerial = serial;\r\n this.loading = true;\r\n\r\n this.refreshPromise = (async () => {\r\n this.contacts = normalizeContacts(imClient.refreshContactList());\r\n if (!this.contacts.find(item => item.id === this.activeId)) {\r\n this.activeId = this.contacts[0]?.id || '';\r\n }\r\n if (!this.contacts.length || force) {\r\n const serverContacts = await imClient.getServerContactList(requestUserId);\r\n if (serial !== this.refreshSerial || useSessionStore().userId !== requestUserId) {\r\n return this.contacts;\r\n }\r\n this.contacts = normalizeContacts(serverContacts);\r\n this.loadedForUserId = requestUserId;\r\n this.loadedAt = Date.now();\r\n if (!this.contacts.find(item => item.id === this.activeId)) {\r\n this.activeId = this.contacts[0]?.id || '';\r\n }\r\n }\r\n window.setTimeout(() => {\r\n if (serial !== this.refreshSerial || useSessionStore().userId !== requestUserId) {\r\n return;\r\n }\r\n const latest = imClient.getContactList(false);\r\n if (latest.length || !this.contacts.length) {\r\n this.contacts = normalizeContacts(latest);\r\n this.loadedForUserId = requestUserId;\r\n this.loadedAt = Date.now();\r\n if (!this.contacts.find(item => item.id === this.activeId)) {\r\n this.activeId = this.contacts[0]?.id || '';\r\n }\r\n }\r\n }, 1200);\r\n return this.contacts;\r\n })();\r\n\r\n try {\r\n return await this.refreshPromise;\r\n } finally {\r\n if (serial === this.refreshSerial) {\r\n this.loading = false;\r\n this.refreshPromise = null;\r\n }\r\n }\r\n },\r\n async addContact(keyword) {\r\n const session = useSessionStore();\r\n const value = String(keyword || '').trim();\r\n this.actionError = '';\r\n this.actionInfo = '';\r\n if (!session.userId) {\r\n this.actionError = '请先登录';\r\n return false;\r\n }\r\n if (!value) {\r\n this.actionError = '请输入用户ID、手机号或用户名';\r\n return false;\r\n }\r\n\r\n this.loading = true;\r\n try {\r\n const contact = await imClient.addContact(session.userId, value, '添加联系人');\r\n if (contact) {\r\n this.contacts = normalizeContacts([...this.contacts, contact]);\r\n this.activeId = contact.id;\r\n }\r\n this.actionInfo = '联系人已添加';\r\n await this.refreshContacts({ force: true });\r\n return true;\r\n } catch (error) {\r\n this.actionError = error.message || '添加联系人失败';\r\n return false;\r\n } finally {\r\n this.loading = false;\r\n }\r\n },\r\n async updateContactAlias(contactId, alias) {\r\n const session = useSessionStore();\r\n const targetId = String(contactId || '').trim();\r\n const nextAlias = String(alias || '').trim();\r\n this.actionError = '';\r\n this.actionInfo = '';\r\n if (!session.userId) {\r\n this.actionError = '请先登录';\r\n return false;\r\n }\r\n if (!targetId) {\r\n this.actionError = '缺少联系人ID';\r\n return false;\r\n }\r\n\r\n try {\r\n const savedAlias = await imClient.updateContactAlias(session.userId, targetId, nextAlias);\r\n this.contacts = normalizeContacts(this.contacts.map(item => {\r\n if (item.uid !== targetId && item.id !== targetId) {\r\n return item;\r\n }\r\n const rawUser = {\r\n ...(item.rawUser || {}),\r\n friendAlias: savedAlias\r\n };\r\n const rawFriend = {\r\n ...(item.rawFriend || {}),\r\n alias: savedAlias\r\n };\r\n const title = savedAlias || rawUser.displayName || rawUser.name || item.uid;\r\n return {\r\n ...item,\r\n title,\r\n avatarText: title.slice(0, 1).toUpperCase(),\r\n alias: savedAlias,\r\n rawFriend,\r\n rawUser\r\n };\r\n }));\r\n this.loadedAt = Date.now();\r\n this.actionInfo = '备注名已修改';\r\n return true;\r\n } catch (error) {\r\n this.actionError = error.message || '备注名修改失败';\r\n return false;\r\n }\r\n },\r\n clearContacts() {\r\n this.refreshSerial += 1;\r\n this.contacts = [];\r\n this.activeId = '';\r\n this.loading = false;\r\n this.refreshPromise = null;\r\n this.loadedForUserId = '';\r\n this.loadedAt = 0;\r\n this.actionError = '';\r\n this.actionInfo = '';\r\n },\r\n setActiveContact(id) {\r\n this.activeId = id;\r\n },\r\n openChat(contact) {\r\n if (!contact) {\r\n return;\r\n }\r\n const conversations = useConversationStore();\r\n const navigation = useNavigationStore();\r\n const conversation = imClient.createSingleConversation(contact.uid, contact);\r\n conversations.upsertConversation(conversation);\r\n conversations.setActiveConversation(conversation.id);\r\n navigation.showMessages();\r\n }\r\n }\r\n});\r\n","import { defineStore } from 'pinia';\r\nimport { imClient } from '@/services/imClient';\r\nimport { appConfig } from '@/config';\nimport { useSessionStore } from '@/stores/session';\nimport { realtimeNotifications } from '@/services/realtimeNotifications';\n\r\nconst LOCAL_CONVERSATION_STORAGE_KEY = 'qmt-web-im-local-conversations-v2';\r\nconst LOCAL_FAVORITE_MESSAGES_KEY = 'qmt-web-im-favorite-messages-v1';\nconst LOCAL_PINNED_MESSAGES_KEY = 'qmt-web-im-pinned-messages-v1';\nconst LOCAL_HIDDEN_CONVERSATIONS_KEY = 'qmt-web-im-hidden-conversations-v1';\n\r\nfunction scopedStorageKey(baseKey) {\r\n const session = useSessionStore();\r\n const scope = `${appConfig.appServer || ''}:${session.userId || 'anonymous'}`;\r\n return `${baseKey}:${encodeURIComponent(scope)}`;\r\n}\r\n\r\nfunction readFavoriteMessages() {\r\n try {\r\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY)) || '[]');\r\n } catch (error) {\r\n return [];\r\n }\r\n}\r\n\r\nfunction writeFavoriteMessages(messages) {\n localStorage.setItem(scopedStorageKey(LOCAL_FAVORITE_MESSAGES_KEY), JSON.stringify(messages));\r\n}\r\n\r\nfunction readLocalConversations() {\r\n try {\r\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY)) || '[]');\r\n } catch (error) {\r\n return [];\r\n }\r\n}\r\n\r\nfunction writeLocalConversations(conversations) {\n localStorage.setItem(scopedStorageKey(LOCAL_CONVERSATION_STORAGE_KEY), JSON.stringify(conversations));\n}\n\nfunction readHiddenConversationIds() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_HIDDEN_CONVERSATIONS_KEY)) || '[]');\n } catch (error) {\n return [];\n }\n}\n\nfunction writeHiddenConversationIds(ids) {\n localStorage.setItem(scopedStorageKey(LOCAL_HIDDEN_CONVERSATIONS_KEY), JSON.stringify(ids));\n}\n\nfunction readPinnedMessages() {\n try {\n return JSON.parse(localStorage.getItem(scopedStorageKey(LOCAL_PINNED_MESSAGES_KEY)) || '{}');\n } catch (error) {\n return {};\n }\n}\n\nfunction writePinnedMessages(messages) {\n localStorage.setItem(scopedStorageKey(LOCAL_PINNED_MESSAGES_KEY), JSON.stringify(messages));\n}\n\nfunction parseNativePinnedMessage(item, messages = []) {\n if (!item) return null;\n const messageId = String(item.messageId || item.messageUid || '').trim();\n const matched = messages.find(message => [message.messageId, message.messageUid, message.id]\n .filter(Boolean)\n .some(value => String(value) === messageId));\n let encoded = {};\n try {\n encoded = typeof item.messageText === 'string' ? JSON.parse(item.messageText) : (item.messageText || {});\n } catch (error) {\n encoded = {};\n }\n const text = String(\n encoded?.content?.searchableContent\n || encoded?.messageContent?.searchableContent\n || encoded?.text\n || matched?.text\n || '[消息]'\n );\n return {\n ...(matched || {}),\n key: messageId || `group-pin-${item.id}`,\n id: messageId || `group-pin-${item.id}`,\n messageUid: messageId || matched?.messageUid || '',\n serverPinId: String(item.id || ''),\n text,\n type: matched?.type || encoded?.type || 'text',\n attachment: matched?.attachment || encoded?.attachment || null,\n senderName: matched?.senderName || encoded?.senderName || encoded?.from || '',\n timestamp: Number(matched?.displayTimestamp || matched?.timestamp || item.updateTime || item.createTime || Date.now())\n };\n}\n\nfunction sortConversations(conversations) {\n return [...conversations].sort((left, right) => {\n const leftPinned = Number(left.pinnedAt || left.top || 0);\n const rightPinned = Number(right.pinnedAt || right.top || 0);\n if (Boolean(leftPinned) !== Boolean(rightPinned)) {\n return rightPinned ? 1 : -1;\n }\n if (leftPinned && rightPinned && leftPinned !== rightPinned) {\n return rightPinned - leftPinned;\n }\n return Number(right.updatedAt || 0) - Number(left.updatedAt || 0);\n });\n}\n\r\nfunction randomId() {\r\n if (window.crypto && window.crypto.randomUUID) {\r\n return window.crypto.randomUUID().replaceAll('-', '');\r\n }\r\n return `${Date.now()}${Math.random().toString(16).slice(2)}`;\r\n}\r\n\r\nfunction messageKey(message) {\r\n return message.id || message.messageUid;\r\n}\r\n\r\nfunction messageStableKey(message) {\r\n return String(message?.messageUid || message?.id || '');\r\n}\r\n\r\nfunction messageActivityTimestamp(message) {\r\n return Number(message?.activityTimestamp || message?.editedAt || message?.displayTimestamp || message?.timestamp || 0);\r\n}\r\n\r\nfunction isRecalledMessage(message) {\r\n return Boolean(message?.recalled) || message?.status === 'recalled';\r\n}\r\n\r\nfunction attachmentLabel(message) {\r\n const attachment = message?.attachment;\r\n if (!attachment) {\r\n return '';\r\n }\r\n if (attachment.type === 'image') {\r\n return '[图片]';\r\n }\r\n return `[文件] ${attachment.name || '文件'}`;\r\n}\r\n\r\nfunction messagePreviewText(message) {\r\n if (isRecalledMessage(message)) {\r\n return `[${message?.recallStatus || '已撤回'}]`;\r\n }\r\n const text = String(message?.text || '').replace(/\\s+/g, ' ').trim();\r\n return text || attachmentLabel(message);\r\n}\r\n\r\nfunction quotePrefix(message) {\n const text = messagePreviewText(message);\r\n return text.length > 48 ? `${text.slice(0, 48)}...` : text;\r\n}\r\n\r\nasync function writeClipboard(text) {\r\n if (navigator.clipboard?.writeText) {\r\n await navigator.clipboard.writeText(text);\r\n return;\r\n }\r\n const element = document.createElement('textarea');\r\n element.value = text;\r\n element.setAttribute('readonly', 'readonly');\r\n element.style.position = 'fixed';\r\n element.style.left = '-9999px';\r\n document.body.appendChild(element);\r\n element.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(element);\r\n}\r\n\r\nfunction isSameMessage(left, right) {\r\n if (left.messageUid && right.messageUid && left.messageUid === right.messageUid) {\r\n return true;\r\n }\r\n if (left.id && right.id && left.id === right.id) {\r\n return true;\r\n }\r\n return left.direction === right.direction\r\n && left.text === right.text\r\n && (left.type || 'text') === (right.type || 'text')\r\n && Math.abs(Number(left.displayTimestamp || left.timestamp || 0) - Number(right.displayTimestamp || right.timestamp || 0)) < 15000;\r\n}\r\n\r\nfunction hasExactMessage(messages, message) {\r\n return messages.some(item => {\r\n if (item.id && message.id && item.id === message.id) {\r\n return true;\r\n }\r\n return item.messageUid && message.messageUid && item.messageUid === message.messageUid;\r\n });\r\n}\r\n\r\nfunction shouldUseMessagePolling() {\r\n return imClient.shouldUseMessagePolling ? imClient.shouldUseMessagePolling() : true;\r\n}\r\n\r\nfunction canMarkReadNow(options = {}) {\n if (typeof document === 'undefined') {\r\n return false;\r\n }\r\n if (document.visibilityState !== 'visible') {\r\n return false;\r\n }\r\n if (options.userAction) {\r\n return true;\r\n }\r\n return true;\n}\n\nfunction forwardedText(message) {\n return String(message?.text || '')\n .replace(/^转发\\s*[::]\\s*/u, '')\n .trim();\n}\n\nfunction normalizeMessageForDisplay(message) {\n if (!message || message.attachment || String(message.text || '').trim()) {\n return message;\n }\n const contentType = Number(message.contentType || 0);\n const labels = {\n 3: '[图片加载失败]',\n 6: '[视频加载失败]',\n 90: '[红包]',\n 92: '以上是打招呼的内容',\n 93: '你们已经是好友了,可以开始聊天了。',\n 105: '[领取了红包]'\n };\n if (!labels[contentType]) {\n return message;\n }\n return {\n ...message,\n type: 'text',\n text: labels[contentType]\n };\n}\n\nfunction mergeVisibleMessages(currentMessages, syncedMessages) {\n const merged = [...syncedMessages].map(normalizeMessageForDisplay);\n currentMessages.forEach(currentMessage => {\n currentMessage = normalizeMessageForDisplay(currentMessage);\n const exists = merged.some(message => isSameMessage(message, currentMessage));\r\n const shouldKeepLocal = currentMessage.status === 'sending'\r\n || currentMessage.status === 'failed'\r\n || (currentMessage.direction === 'out'\r\n && currentMessage.status === 'sent'\r\n && Date.now() - Number(currentMessage.timestamp || 0) < 30000);\r\n if (!exists && shouldKeepLocal) {\r\n merged.push(currentMessage);\r\n }\r\n });\r\n\r\n return merged\r\n .filter((message, index, messages) => {\r\n const key = messageKey(message);\r\n return messages.findIndex(item => messageKey(item) === key) === index;\r\n })\r\n .sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0));\r\n}\r\n\r\nfunction incomingEditedMessages(previousMessages, nextMessages) {\r\n const previousByKey = new Map();\r\n (previousMessages || []).forEach(message => {\r\n const key = messageStableKey(message);\r\n if (key) {\r\n previousByKey.set(key, message);\r\n }\r\n });\r\n\r\n return (nextMessages || []).filter(message => {\r\n if (message.direction !== 'in') {\r\n return false;\r\n }\r\n const editedAt = Number(message.editedAt || 0);\r\n if (editedAt <= 0) {\r\n return false;\r\n }\r\n const previous = previousByKey.get(messageStableKey(message));\r\n return previous && editedAt > Number(previous.editedAt || 0);\r\n });\r\n}\r\n\r\nlet notificationAudioContext = null;\r\n\r\nfunction playNotificationSound() {\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n try {\r\n const AudioContext = window.AudioContext || window.webkitAudioContext;\r\n if (!AudioContext) {\r\n return;\r\n }\r\n notificationAudioContext = notificationAudioContext || new AudioContext();\r\n if (notificationAudioContext.state === 'suspended') {\r\n notificationAudioContext.resume().catch(() => {});\r\n }\r\n const oscillator = notificationAudioContext.createOscillator();\r\n const gain = notificationAudioContext.createGain();\r\n const startAt = notificationAudioContext.currentTime;\r\n oscillator.type = 'sine';\r\n oscillator.frequency.setValueAtTime(880, startAt);\r\n oscillator.frequency.setValueAtTime(660, startAt + 0.1);\r\n gain.gain.setValueAtTime(0.0001, startAt);\r\n gain.gain.exponentialRampToValueAtTime(0.12, startAt + 0.02);\r\n gain.gain.exponentialRampToValueAtTime(0.0001, startAt + 0.22);\r\n oscillator.connect(gain);\r\n gain.connect(notificationAudioContext.destination);\r\n oscillator.start(startAt);\r\n oscillator.stop(startAt + 0.24);\r\n } catch (error) {\r\n // Notification sound is best-effort; browsers may block audio until user interaction.\r\n }\r\n}\r\n\r\nexport const useConversationStore = defineStore('conversations', {\r\n state: () => ({\r\n activeId: '',\r\n conversations: [],\r\n messagesByConversation: {},\r\n visibleMessagesByConversation: {},\r\n eventsBound: false,\r\n usingDemoData: false,\r\n loading: false,\r\n syncTimer: null,\r\n conversationSyncTimer: null,\r\n readPresenceEventsBound: false,\r\n syncInFlight: false,\r\n pendingReadReceiptConversationId: '',\r\n conversationSyncInFlight: false,\r\n syncAfterSendTimer: null,\r\n optimisticMessagesByConversation: {},\r\n quotedMessage: null,\r\n forwardingMessages: [],\r\n editingMessage: null,\r\n editingText: '',\r\n editingMode: '',\r\n messageDetailOpen: false,\r\n messageDetailLoading: false,\r\n messageDetailError: '',\r\n messageDetail: null,\r\n attentionMessageId: '',\r\n attentionMessageTimer: null,\r\n selectionMode: false,\r\n selectedMessageIds: [],\r\n favoriteMessages: [],\n pinnedMessagesByConversation: {},\n groupPinnedSyncAt: {},\n hiddenConversationIds: [],\n activeFavoriteKey: '',\r\n actionNotice: '',\n actionError: '',\n actionNoticeTimer: null,\n realtimeSyncTimer: null\n }),\r\n getters: {\r\n activeConversation(state) {\r\n return state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\r\n },\r\n activeMessages(state) {\r\n return state.visibleMessagesByConversation[state.activeId] || [];\r\n },\r\n totalUnread(state) {\r\n return state.conversations.reduce((sum, item) => sum + Number(item.unread || 0), 0);\r\n },\r\n canSendActiveConversation(state) {\r\n const conversation = state.conversations.find(item => item.id === state.activeId) || state.conversations[0] || null;\r\n if (!conversation) {\r\n return false;\r\n }\r\n if (conversation.type !== 'channel') {\r\n return true;\r\n }\r\n return ['owner', 'admin'].includes(conversation.role || conversation.raw?.role || '');\r\n },\r\n favoriteMessageIds(state) {\r\n return state.favoriteMessages.map(message => message.key);\r\n },\r\n activeFavorite(state) {\n return state.favoriteMessages.find(message => message.key === state.activeFavoriteKey)\n || state.favoriteMessages[0]\n || null;\n },\n activePinnedMessage(state) {\n const pinned = state.pinnedMessagesByConversation[state.activeId] || null;\n if (!pinned) return null;\n const message = (state.visibleMessagesByConversation[state.activeId] || [])\n .find(item => messageStableKey(item) === pinned.key);\n return message ? { ...pinned, ...message, key: pinned.key } : pinned;\n },\n selectedMessages(state) {\r\n const selectedIds = new Set(state.selectedMessageIds);\r\n return (state.visibleMessagesByConversation[state.activeId] || [])\r\n .filter(message => selectedIds.has(messageStableKey(message)));\r\n }\r\n },\r\n actions: {\r\n bootstrapDemoData() {\n const session = useSessionStore();\n this.bindImEvents();\n this.usingDemoData = false;\n if (!session.userId) {\n this.clearUserState();\n return;\n }\n this.loadScopedLocalState();\n this.startMessageSync();\n realtimeNotifications.start(session.userId, payload => this.handleRealtimeNotification(payload));\n },\n loadScopedLocalState() {\n this.conversations = [];\n this.favoriteMessages = readFavoriteMessages();\n this.pinnedMessagesByConversation = readPinnedMessages();\n this.groupPinnedSyncAt = {};\n this.hiddenConversationIds = readHiddenConversationIds();\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\n this.activeId = '';\n this.messagesByConversation = {};\n this.visibleMessagesByConversation = {};\n this.optimisticMessagesByConversation = {};\n this.quotedMessage = null;\r\n this.forwardingMessages = [];\r\n this.editingMessage = null;\r\n this.editingText = '';\r\n this.editingMode = '';\r\n this.messageDetailOpen = false;\r\n this.messageDetailLoading = false;\r\n this.messageDetailError = '';\r\n this.messageDetail = null;\n this.selectionMode = false;\n this.selectedMessageIds = [];\n },\n clearUserState() {\r\n window.clearInterval(this.syncTimer);\r\n window.clearInterval(this.conversationSyncTimer);\r\n window.clearTimeout(this.syncAfterSendTimer);\n window.clearTimeout(this.attentionMessageTimer);\n window.clearTimeout(this.actionNoticeTimer);\n window.clearTimeout(this.realtimeSyncTimer);\n realtimeNotifications.stop();\n this.syncTimer = null;\r\n this.conversationSyncTimer = null;\r\n this.syncAfterSendTimer = null;\r\n this.attentionMessageTimer = null;\n this.actionNoticeTimer = null;\n this.realtimeSyncTimer = null;\n this.syncInFlight = false;\r\n this.conversationSyncInFlight = false;\r\n this.pendingReadReceiptConversationId = '';\r\n this.activeId = '';\r\n this.conversations = [];\r\n this.messagesByConversation = {};\r\n this.visibleMessagesByConversation = {};\r\n this.optimisticMessagesByConversation = {};\r\n this.quotedMessage = null;\r\n this.forwardingMessages = [];\r\n this.editingMessage = null;\r\n this.editingText = '';\r\n this.editingMode = '';\r\n this.messageDetailOpen = false;\r\n this.messageDetailLoading = false;\r\n this.messageDetailError = '';\r\n this.messageDetail = null;\r\n this.attentionMessageId = '';\r\n this.selectionMode = false;\r\n this.selectedMessageIds = [];\r\n this.favoriteMessages = [];\n this.hiddenConversationIds = [];\n this.activeFavoriteKey = '';\r\n this.actionNotice = '';\r\n this.actionError = '';\r\n },\r\n bindImEvents() {\r\n if (this.eventsBound) {\r\n return;\r\n }\r\n this.eventsBound = true;\r\n imClient.on('messageSent', message => {\r\n this.appendMessage(message.conversationId, message);\r\n });\r\n imClient.on('messageReceived', message => {\n this.appendMessage(message.conversationId, message);\n if (message.conversationId === this.activeId) {\n this.scheduleActiveMessagesSync({ allowReadReceipt: true }, 500);\n }\r\n });\r\n imClient.on('messageStatusChanged', message => {\r\n this.replaceMessage(message.conversationId, message);\r\n });\r\n imClient.on('conversationsChanged', remoteConversations => {\r\n this.usingDemoData = false;\r\n this.applyRemoteConversations(remoteConversations);\r\n });\r\n },\r\n setActiveConversation(id) {\r\n this.activeId = id;\r\n const conversation = this.conversations.find(item => item.id === id);\r\n if (conversation) {\r\n conversation.unread = 0;\r\n }\r\n this.loadActiveMessages({ allowReadReceipt: true, userAction: true });\r\n },\r\n sendText(payload) {\n const conversation = this.activeConversation;\n const text = typeof payload === 'string' ? payload : String(payload?.text || '');\n const mentionedUserIds = Array.isArray(payload?.mentionedUserIds) ? payload.mentionedUserIds : [];\n if (!conversation || !text.trim()) {\n return;\r\n }\r\n let value = text.trim();\r\n if (this.quotedMessage) {\r\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`;\r\n this.quotedMessage = null;\r\n }\r\n const message = {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: 'me',\r\n direction: 'out',\r\n type: 'text',\r\n text: value,\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: Date.now(),\r\n displayTimestamp: Date.now()\r\n };\r\n this.appendVisibleMessage(conversation.id, message);\r\n this.appendMessage(conversation.id, message);\r\n imClient.sendTextMessage(conversation, value, message, { mentionedUserIds });\n conversation.subtitle = value;\r\n conversation.updatedAt = Date.now();\r\n writeLocalConversations(this.conversations);\r\n window.clearTimeout(this.syncAfterSendTimer);\r\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 250);\r\n },\r\n sendAttachment({ type, file, text = '' }) {\r\n const conversation = this.activeConversation;\r\n if (!conversation || !file || !['image', 'file'].includes(type)) {\r\n return;\r\n }\r\n let value = text.trim();\r\n if (this.quotedMessage) {\r\n value = `引用:${quotePrefix(this.quotedMessage)}\\n${value}`.trim();\r\n this.quotedMessage = null;\r\n }\r\n const now = Date.now();\r\n const message = {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: 'me',\r\n senderRole: conversation.role || conversation.raw?.role || '',\r\n direction: 'out',\r\n type,\r\n text: value,\r\n attachment: {\r\n type,\r\n name: file.name || (type === 'image' ? '图片' : '文件'),\r\n mime: file.type || '',\r\n size: file.size || 0,\r\n url: type === 'image' ? URL.createObjectURL(file) : ''\r\n },\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: now,\r\n displayTimestamp: now\r\n };\r\n this.appendVisibleMessage(conversation.id, message);\r\n this.appendMessage(conversation.id, message);\r\n imClient.sendAttachmentMessage(conversation, { type, file, text: value }, message);\r\n conversation.subtitle = messagePreviewText(message);\r\n conversation.updatedAt = now;\r\n writeLocalConversations(this.conversations);\r\n window.clearTimeout(this.syncAfterSendTimer);\r\n this.syncAfterSendTimer = window.setTimeout(() => this.syncActiveMessages(), 350);\r\n },\r\n async sendTextToConversation(conversation, text) {\r\n if (!conversation || !text.trim()) {\r\n return null;\r\n }\r\n const value = text.trim();\r\n const message = {\r\n id: randomId(),\r\n conversationId: conversation.id,\r\n from: 'me',\r\n direction: 'out',\r\n type: 'text',\r\n text: value,\r\n status: 'sending',\r\n deliveryStatus: 'sending',\r\n timestamp: Date.now(),\r\n displayTimestamp: Date.now()\r\n };\r\n this.appendMessage(conversation.id, message);\r\n const sentMessage = await imClient.sendTextMessage(conversation, value, message);\r\n this.replaceMessage(conversation.id, sentMessage);\r\n return sentMessage;\r\n },\r\n upsertConversation(conversation) {\r\n const index = this.conversations.findIndex(item => item.id === conversation.id);\r\n if (index >= 0) {\r\n this.conversations.splice(index, 1, {\r\n ...this.conversations[index],\r\n ...conversation\r\n });\r\n } else {\r\n this.conversations.unshift(conversation);\r\n }\r\n this.usingDemoData = false;\r\n writeLocalConversations(this.conversations);\r\n },\r\n removeConversation(conversationId) {\n if (!this.hiddenConversationIds.includes(conversationId)) {\n this.hiddenConversationIds = [...this.hiddenConversationIds, conversationId];\n writeHiddenConversationIds(this.hiddenConversationIds);\n }\n this.conversations = this.conversations.filter(conversation => conversation.id !== conversationId);\n const {\r\n [conversationId]: removedMessages,\r\n ...messagesByConversation\r\n } = this.messagesByConversation;\r\n const {\r\n [conversationId]: removedVisibleMessages,\r\n ...visibleMessagesByConversation\r\n } = this.visibleMessagesByConversation;\r\n const {\r\n [conversationId]: removedOptimisticMessages,\r\n ...optimisticMessagesByConversation\r\n } = this.optimisticMessagesByConversation;\r\n void removedMessages;\r\n void removedVisibleMessages;\r\n void removedOptimisticMessages;\r\n this.messagesByConversation = messagesByConversation;\r\n this.visibleMessagesByConversation = visibleMessagesByConversation;\r\n this.optimisticMessagesByConversation = optimisticMessagesByConversation;\r\n if (this.activeId === conversationId) {\r\n this.activeId = this.conversations[0]?.id || '';\r\n }\r\n writeLocalConversations(this.conversations);\r\n if (this.activeId) {\r\n this.loadActiveMessages();\r\n }\r\n },\r\n applyRemoteConversations(remoteConversations) {\n const hidden = new Set(this.hiddenConversationIds);\n const remote = (Array.isArray(remoteConversations) ? remoteConversations : [])\n .filter(conversation => !hidden.has(conversation.id));\n if (!remote.length && this.conversations.length) {\r\n return;\r\n }\r\n\r\n const merged = new Map();\r\n this.conversations.forEach(conversation => {\r\n merged.set(conversation.id, conversation);\r\n });\r\n remote.forEach(conversation => {\r\n const unread = conversation.id === this.activeId && canMarkReadNow() ? 0 : Number(conversation.unread || 0);\r\n merged.set(conversation.id, {\r\n ...(merged.get(conversation.id) || {}),\r\n ...conversation,\r\n unread\r\n });\r\n });\r\n\r\n this.conversations = sortConversations(Array.from(merged.values()))\n .slice(0, 100);\n\r\n if (!this.conversations.length) {\r\n this.activeId = '';\r\n this.messagesByConversation = {};\r\n this.visibleMessagesByConversation = {};\r\n this.optimisticMessagesByConversation = {};\r\n writeLocalConversations(this.conversations);\r\n return;\r\n }\r\n\r\n if (!this.conversations.find(item => item.id === this.activeId)) {\r\n this.activeId = this.conversations[0].id;\r\n }\r\n writeLocalConversations(this.conversations);\n this.loadActiveMessages();\n },\n togglePinnedConversation(conversationId) {\n const conversation = this.conversations.find(item => item.id === conversationId);\n if (!conversation) return;\n conversation.pinnedAt = Number(conversation.pinnedAt || conversation.top || 0) > 0 ? 0 : Date.now();\n conversation.top = conversation.pinnedAt;\n this.conversations = sortConversations(this.conversations);\n writeLocalConversations(this.conversations);\n },\n appendMessage(conversationId, message) {\n if (message?.direction === 'in' && this.hiddenConversationIds.includes(conversationId)) {\n this.hiddenConversationIds = this.hiddenConversationIds.filter(id => id !== conversationId);\n writeHiddenConversationIds(this.hiddenConversationIds);\n }\n if (!this.messagesByConversation[conversationId]) {\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: []\r\n };\r\n }\r\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent')) {\r\n this.keepOptimisticMessage(conversationId, message);\r\n }\r\n if (!hasExactMessage(this.messagesByConversation[conversationId], message)) {\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: [...this.messagesByConversation[conversationId], message]\r\n };\r\n }\r\n this.updateConversationFromMessage(conversationId, message);\r\n this.syncVisibleMessages(conversationId);\r\n writeLocalConversations(this.conversations);\r\n },\r\n removeMessages(conversationId, messages) {\r\n const ids = new Set(messages.flatMap(message => [message.id, message.messageUid].filter(Boolean).map(String)));\r\n const filterMessages = list => (list || []).filter(message => {\r\n return ![message.id, message.messageUid].filter(Boolean).some(id => ids.has(String(id)));\r\n });\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: filterMessages(this.messagesByConversation[conversationId])\r\n };\r\n this.visibleMessagesByConversation = {\r\n ...this.visibleMessagesByConversation,\r\n [conversationId]: filterMessages(this.visibleMessagesByConversation[conversationId])\r\n };\r\n this.optimisticMessagesByConversation = {\r\n ...this.optimisticMessagesByConversation,\r\n [conversationId]: filterMessages(this.optimisticMessagesByConversation[conversationId])\r\n };\r\n this.selectedMessageIds = this.selectedMessageIds.filter(id => !ids.has(String(id)));\r\n },\r\n replaceLocalMessage(conversationId, targetMessage, nextMessage) {\r\n const keys = new Set([targetMessage.id, targetMessage.messageUid].filter(Boolean).map(String));\r\n const replaceInList = list => (list || []).map(message => {\r\n const matched = [message.id, message.messageUid].filter(Boolean).some(id => keys.has(String(id)));\r\n return matched ? { ...message, ...nextMessage } : message;\r\n });\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: replaceInList(this.messagesByConversation[conversationId])\r\n };\r\n this.visibleMessagesByConversation = {\r\n ...this.visibleMessagesByConversation,\r\n [conversationId]: replaceInList(this.visibleMessagesByConversation[conversationId])\r\n };\r\n },\r\n updateConversationFromMessage(conversationId, message) {\r\n const conversation = this.conversations.find(item => item.id === conversationId);\r\n if (!conversation) {\r\n return;\r\n }\r\n\r\n conversation.subtitle = message.text || conversation.subtitle || '';\r\n conversation.updatedAt = messageActivityTimestamp(message) || Date.now();\r\n if (message.direction === 'in') {\r\n conversation.unread = conversationId === this.activeId ? 0 : Number(conversation.unread || 0) + 1;\r\n }\r\n this.conversations = [...this.conversations]\r\n .sort((a, b) => Number(b.updatedAt || 0) - Number(a.updatedAt || 0));\r\n },\r\n appendVisibleMessage(conversationId, message) {\r\n const messages = this.visibleMessagesByConversation[conversationId] || [];\r\n this.visibleMessagesByConversation = {\r\n ...this.visibleMessagesByConversation,\r\n [conversationId]: [...messages.filter(item => item.id !== message.id), message]\r\n .sort((a, b) => Number(a.displayTimestamp || a.timestamp || 0) - Number(b.displayTimestamp || b.timestamp || 0))\r\n };\r\n },\r\n replaceMessage(conversationId, message) {\r\n if (!this.messagesByConversation[conversationId]) {\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: []\r\n };\r\n }\r\n if (message.direction === 'out' && (message.status === 'sending' || message.status === 'sent' || message.status === 'failed')) {\r\n this.keepOptimisticMessage(conversationId, message);\r\n }\r\n const index = this.messagesByConversation[conversationId].findIndex(item => item.id === message.id);\r\n if (index >= 0) {\r\n const messages = [...this.messagesByConversation[conversationId]];\r\n messages.splice(index, 1, message);\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: messages\r\n };\r\n } else {\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversationId]: [...this.messagesByConversation[conversationId], message]\r\n };\r\n }\r\n this.syncVisibleMessages(conversationId);\r\n },\r\n syncVisibleMessages(conversationId) {\r\n this.visibleMessagesByConversation = {\r\n ...this.visibleMessagesByConversation,\r\n [conversationId]: mergeVisibleMessages(\r\n this.optimisticMessagesByConversation[conversationId] || [],\r\n this.messagesByConversation[conversationId] || []\r\n )\r\n };\r\n },\r\n keepOptimisticMessage(conversationId, message) {\r\n if (!this.optimisticMessagesByConversation[conversationId]) {\r\n this.optimisticMessagesByConversation = {\r\n ...this.optimisticMessagesByConversation,\r\n [conversationId]: []\r\n };\r\n }\r\n const messages = this.optimisticMessagesByConversation[conversationId];\r\n const index = messages.findIndex(item => item.id === message.id);\r\n let nextMessages;\r\n if (index >= 0) {\r\n nextMessages = [...messages];\r\n nextMessages.splice(index, 1, message);\r\n } else {\r\n nextMessages = [...messages, message];\r\n }\r\n this.optimisticMessagesByConversation = {\r\n ...this.optimisticMessagesByConversation,\r\n [conversationId]: nextMessages\r\n };\r\n },\r\n pruneOptimisticMessages(conversationId, syncedMessages) {\r\n const messages = this.optimisticMessagesByConversation[conversationId] || [];\r\n if (!messages.length) {\r\n return;\r\n }\r\n this.optimisticMessagesByConversation = {\r\n ...this.optimisticMessagesByConversation,\r\n [conversationId]: messages.filter(message => {\r\n const remoteMatched = syncedMessages.some(syncedMessage => {\r\n return syncedMessage.id !== message.id && isSameMessage(syncedMessage, message);\r\n });\r\n if (remoteMatched && message.status !== 'failed') {\r\n return false;\r\n }\r\n return Date.now() - Number(message.displayTimestamp || message.timestamp || 0) < 30000 || message.status === 'failed';\r\n })\r\n };\r\n },\r\n loadActiveMessages(options = {}) {\r\n const syncOptions = typeof options === 'boolean'\r\n ? { allowReadReceipt: options }\r\n : options;\r\n const conversation = this.activeConversation;\r\n if (!conversation) {\r\n return;\r\n }\r\n this.loading = true;\r\n const messages = imClient.getMessages(conversation, 30);\r\n this.pruneOptimisticMessages(conversation.id, messages);\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [conversation.id]: mergeVisibleMessages(this.messagesByConversation[conversation.id] || [], messages)\r\n };\r\n this.syncVisibleMessages(conversation.id);\r\n this.loading = false;\r\n this.syncActiveMessages(syncOptions);\r\n },\r\n async syncActiveMessages(options = {}) {\r\n const conversation = this.activeConversation;\r\n if (!conversation) {\r\n return;\r\n }\r\n const wantsReadReceipt = Boolean(options.allowReadReceipt);\r\n const explicitReadReceipt = wantsReadReceipt && canMarkReadNow({ userAction: Boolean(options.userAction) });\r\n const pollingReadReceipt = canMarkReadNow();\r\n const markRead = explicitReadReceipt || pollingReadReceipt;\r\n\r\n if (this.syncInFlight) {\n if (wantsReadReceipt) {\r\n this.pendingReadReceiptConversationId = conversation.id;\r\n }\r\n return;\n }\r\n this.syncInFlight = true;\r\n const syncedConversationId = conversation.id;\r\n const previousMessages = this.messagesByConversation[syncedConversationId] || [];\r\n try {\r\n const messages = await imClient.fetchRemoteMessages(conversation, 1000, {\n markRead,\n includeConversations: Boolean(options.includeConversations)\n });\n const isGroupConversation = ['group', 'channel'].includes(conversation.type)\n || ['group', 'channel', 1, '1'].includes(conversation.raw?.type);\n const shouldSyncGroupPin = isGroupConversation\n && Date.now() - Number(this.groupPinnedSyncAt[syncedConversationId] || 0) >= 3000;\n if (shouldSyncGroupPin) {\n try {\n const nativePins = await imClient.fetchGroupPinnedMessages(conversation);\n this.groupPinnedSyncAt = {\n ...this.groupPinnedSyncAt,\n [syncedConversationId]: Date.now()\n };\n const nextPinned = { ...this.pinnedMessagesByConversation };\n if (nativePins.length) {\n nextPinned[syncedConversationId] = parseNativePinnedMessage(nativePins[0], messages);\n } else {\n delete nextPinned[syncedConversationId];\n }\n this.pinnedMessagesByConversation = nextPinned;\n writePinnedMessages(nextPinned);\n } catch (error) {\n console.warn('群置顶消息同步失败', error);\n }\n }\n const remotePinnedKey = String(messages.pinnedMessageUid || '');\n if (!isGroupConversation && remotePinnedKey) {\n const pinnedMessage = messages.find(item => messageStableKey(item) === remotePinnedKey)\n || messages.pinnedMessage\n || (this.pinnedMessagesByConversation[syncedConversationId]?.key === remotePinnedKey\n ? this.pinnedMessagesByConversation[syncedConversationId]\n : null);\n this.pinnedMessagesByConversation = {\n ...this.pinnedMessagesByConversation,\n [syncedConversationId]: pinnedMessage\n ? {\n key: remotePinnedKey,\n id: remotePinnedKey,\n text: messagePreviewText(pinnedMessage),\n type: pinnedMessage.type || 'text',\n attachment: pinnedMessage.attachment ? { ...pinnedMessage.attachment } : null,\n senderName: pinnedMessage.senderName || pinnedMessage.from || '',\n timestamp: Number(pinnedMessage.displayTimestamp || pinnedMessage.timestamp || Date.now())\n }\n : { key: remotePinnedKey, id: remotePinnedKey, text: '[置顶消息]' }\n };\n writePinnedMessages(this.pinnedMessagesByConversation);\n }\n const editedIncomingMessages = incomingEditedMessages(previousMessages, messages);\r\n this.pruneOptimisticMessages(syncedConversationId, messages);\r\n this.messagesByConversation = {\r\n ...this.messagesByConversation,\r\n [syncedConversationId]: mergeVisibleMessages(this.messagesByConversation[syncedConversationId] || [], messages)\r\n };\r\n this.syncVisibleMessages(syncedConversationId);\r\n if (editedIncomingMessages.length && syncedConversationId === this.activeId) {\r\n this.focusMessage(editedIncomingMessages.sort((a, b) => messageActivityTimestamp(b) - messageActivityTimestamp(a))[0]);\r\n playNotificationSound();\r\n }\r\n const latest = messages.reduce((latestMessage, message) => {\r\n if (!latestMessage || messageActivityTimestamp(message) > messageActivityTimestamp(latestMessage)) {\r\n return message;\r\n }\r\n return latestMessage;\r\n }, null);\r\n if (latest) {\r\n conversation.subtitle = messagePreviewText(latest);\r\n conversation.updatedAt = messageActivityTimestamp(latest);\r\n writeLocalConversations(this.conversations);\r\n }\r\n } catch (error) {\r\n // Keep the local view usable if a polling request misses.\r\n } finally {\r\n this.syncInFlight = false;\r\n if (this.pendingReadReceiptConversationId === this.activeId && canMarkReadNow()) {\r\n this.pendingReadReceiptConversationId = '';\r\n window.setTimeout(() => this.syncActiveMessages({ allowReadReceipt: true }), 0);\r\n }\r\n }\n },\n scheduleActiveMessagesSync(options = {}, delay = 500) {\n if (!this.activeId || (typeof document !== 'undefined' && document.visibilityState !== 'visible')) {\n return;\n }\n window.clearTimeout(this.syncAfterSendTimer);\n this.syncAfterSendTimer = window.setTimeout(() => {\n this.syncAfterSendTimer = null;\n this.syncActiveMessages(options);\n }, Math.max(0, Number(delay) || 0));\n },\n startMessageSync() {\n this.bindReadPresenceEvents();\n if (!this.syncTimer) {\n this.syncTimer = window.setInterval(() => {\n if (document.visibilityState === 'visible' && !realtimeNotifications.isConnected()) {\n this.syncActiveMessages();\n }\n }, Math.max(250, appConfig.syncIntervalMs));\n }\n if (!this.conversationSyncTimer) {\n this.conversationSyncTimer = window.setInterval(() => {\n if (document.visibilityState === 'visible' && !realtimeNotifications.isConnected()) {\n this.refreshRemoteConversations();\n }\n }, Math.max(5000, appConfig.syncIntervalMs * 2));\n this.refreshRemoteConversations();\n }\n },\n handleRealtimeNotification() {\n window.clearTimeout(this.realtimeSyncTimer);\n this.realtimeSyncTimer = window.setTimeout(() => {\n this.refreshRemoteConversations();\n this.scheduleActiveMessagesSync({\n allowReadReceipt: canMarkReadNow(),\n includeConversations: true\n }, 300);\n }, 300);\n },\n bindReadPresenceEvents() {\r\n if (this.readPresenceEventsBound || typeof window === 'undefined' || typeof document === 'undefined') {\r\n return;\r\n }\r\n this.readPresenceEventsBound = true;\r\n const syncWhenReadable = () => {\n if (canMarkReadNow()) {\n this.refreshRemoteConversations();\n this.scheduleActiveMessagesSync({ allowReadReceipt: true }, 200);\n }\r\n };\r\n window.addEventListener('focus', syncWhenReadable);\r\n document.addEventListener('visibilitychange', syncWhenReadable);\r\n },\r\n async refreshRemoteConversations() {\r\n this.bindImEvents();\r\n this.usingDemoData = false;\r\n if (this.conversationSyncInFlight) {\r\n return;\r\n }\r\n this.conversationSyncInFlight = true;\r\n try {\r\n const remoteConversations = await imClient.fetchRemoteConversations(50);\r\n this.applyRemoteConversations(remoteConversations);\r\n } catch (error) {\r\n imClient.refreshConversationList();\r\n } finally {\r\n this.conversationSyncInFlight = false;\r\n }\r\n },\r\n setActionNotice(message) {\n this.actionNotice = message;\n this.actionError = '';\n window.clearTimeout(this.actionNoticeTimer);\n this.actionNoticeTimer = window.setTimeout(() => {\n this.actionNotice = '';\n this.actionNoticeTimer = null;\n }, 3000);\n },\n setActionError(message) {\n this.actionError = message;\n this.actionNotice = '';\n window.clearTimeout(this.actionNoticeTimer);\n this.actionNoticeTimer = window.setTimeout(() => {\n this.actionError = '';\n this.actionNoticeTimer = null;\n }, 3000);\n },\n focusMessage(message) {\r\n const key = messageStableKey(message);\r\n if (!key) {\r\n return;\r\n }\r\n this.attentionMessageId = key;\r\n window.clearTimeout(this.attentionMessageTimer);\r\n this.attentionMessageTimer = window.setTimeout(() => {\r\n if (this.attentionMessageId === key) {\r\n this.attentionMessageId = '';\r\n }\r\n }, 2800);\r\n },\r\n async handleMessageAction({ action, message }) {\r\n if (!message) {\r\n return;\r\n }\r\n if (action === 'copy') {\r\n await this.copyMessages([message]);\r\n } else if (action === 'edit') {\r\n this.startEditMessage(message);\r\n } else if (action === 'delete') {\r\n this.deleteMessages([message]);\r\n } else if (action === 'forward') {\r\n this.startForward([message]);\r\n } else if (action === 'favorite') {\n this.toggleFavorite(message);\n } else if (action === 'pin') {\n this.togglePinnedMessage(message);\n } else if (action === 'detail') {\r\n await this.openMessageDetail(message);\r\n } else if (action === 'quote') {\r\n this.quoteMessage(message);\r\n } else if (action === 'select') {\r\n this.enterSelectionMode(message);\r\n } else if (action === 'recall') {\r\n await this.recallMessage(message);\r\n }\r\n },\r\n async openMessageDetail(message) {\r\n const conversation = this.activeConversation;\r\n if (!conversation || !message) {\r\n return;\r\n }\r\n const key = messageStableKey(message);\r\n this.messageDetailOpen = true;\r\n this.messageDetailLoading = true;\r\n this.messageDetailError = '';\r\n this.messageDetail = {\r\n messageUid: key,\r\n conversationType: conversation.type || conversation.raw?.type || 'single',\r\n sentAt: Number(message.displayTimestamp || message.timestamp || 0),\r\n editedAt: Number(message.editedAt || 0),\r\n recalled: isRecalledMessage(message),\r\n localOnly: true,\r\n sender: {\r\n uid: message.from || '',\r\n name: message.senderName || message.from || ''\r\n }\r\n };\r\n try {\r\n if (!/^\\d+$/.test(key)) {\r\n this.messageDetailError = '本地临时消息暂无送达/已读详情';\r\n return;\r\n }\r\n const detail = await imClient.getMessageDetail(conversation, message);\r\n this.messageDetail = detail || this.messageDetail;\r\n } catch (error) {\r\n this.messageDetailError = error.message || '消息详情加载失败';\r\n } finally {\r\n this.messageDetailLoading = false;\r\n }\r\n },\r\n closeMessageDetail() {\r\n this.messageDetailOpen = false;\r\n this.messageDetailLoading = false;\r\n this.messageDetailError = '';\r\n this.messageDetail = null;\r\n },\r\n async copyMessages(messages) {\r\n const text = messages.map(message => message.text || '').join('\\n');\r\n if (!text.trim()) {\r\n return;\r\n }\r\n try {\r\n await writeClipboard(text);\r\n this.setActionNotice(messages.length > 1 ? '已复制所选消息' : '已复制');\r\n } catch (error) {\r\n this.setActionError('复制失败');\r\n }\r\n },\r\n deleteMessages(messages) {\r\n const conversation = this.activeConversation;\r\n if (!conversation || !messages.length) {\r\n return;\r\n }\r\n imClient.hideMessages(conversation, messages);\r\n this.removeMessages(conversation.id, messages);\r\n if (!this.selectedMessageIds.length) {\r\n this.selectionMode = false;\r\n }\r\n this.setActionNotice(messages.length > 1 ? '已删除所选消息' : '已删除');\r\n },\r\n toggleFavorite(message) {\n const key = messageStableKey(message);\r\n if (!key) {\r\n return;\r\n }\r\n const index = this.favoriteMessages.findIndex(item => item.key === key);\r\n if (index >= 0) {\r\n this.favoriteMessages.splice(index, 1);\r\n if (this.activeFavoriteKey === key) {\r\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\r\n }\r\n this.setActionNotice('已取消收藏');\r\n } else {\r\n const conversation = this.conversations.find(item => item.id === message.conversationId) || {};\r\n this.favoriteMessages.unshift({\r\n key,\r\n id: message.id,\r\n messageUid: message.messageUid,\r\n conversationId: message.conversationId,\r\n conversationTitle: conversation.title || message.conversationTitle || '',\r\n type: message.type || 'text',\r\n text: message.text || '',\r\n preview: messagePreviewText(message),\r\n senderName: message.senderName || message.from || '',\r\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now()),\r\n editedAt: Number(message.editedAt || 0),\r\n recalled: isRecalledMessage(message),\r\n recallStatus: message.recallStatus || (isRecalledMessage(message) ? '已撤回' : ''),\r\n attachment: message.attachment ? { ...message.attachment } : null\r\n });\r\n this.activeFavoriteKey = key;\r\n this.setActionNotice('已收藏');\r\n }\r\n this.favoriteMessages = this.favoriteMessages.slice(0, 200);\r\n writeFavoriteMessages(this.favoriteMessages);\n },\n async togglePinnedMessage(message) {\n const conversationId = message?.conversationId || this.activeId;\n const key = messageStableKey(message);\n if (!conversationId || !key) return;\n const current = this.pinnedMessagesByConversation[conversationId];\n const next = { ...this.pinnedMessagesByConversation };\n if (current && current.key === key) {\n delete next[conversationId];\n this.pinnedMessagesByConversation = next;\n writePinnedMessages(next);\n this.setActionNotice('已取消置顶');\n try {\n await imClient.setPinnedMessage(this.activeConversation, '', current);\n } catch (error) {\n this.setActionError(`已在本地取消,服务器同步失败:${error.message || '取消置顶失败'}`);\n }\n } else {\n next[conversationId] = {\n key,\n id: key,\n text: messagePreviewText(message),\n type: message.type || 'text',\n attachment: message.attachment ? { ...message.attachment } : null,\n senderName: message.senderName || message.from || '',\n timestamp: Number(message.displayTimestamp || message.timestamp || Date.now())\n };\n this.pinnedMessagesByConversation = next;\n writePinnedMessages(next);\n this.setActionNotice('消息已置顶');\n try {\n await imClient.setPinnedMessage(this.activeConversation, key, message);\n const nativePins = await imClient.fetchGroupPinnedMessages(this.activeConversation).catch(() => []);\n if (nativePins.length) {\n const refreshed = parseNativePinnedMessage(nativePins[0], this.activeMessages);\n this.pinnedMessagesByConversation = {\n ...this.pinnedMessagesByConversation,\n [conversationId]: refreshed\n };\n writePinnedMessages(this.pinnedMessagesByConversation);\n }\n } catch (error) {\n const rollback = { ...this.pinnedMessagesByConversation };\n delete rollback[conversationId];\n this.pinnedMessagesByConversation = rollback;\n writePinnedMessages(rollback);\n this.setActionError(`置顶失败:${error.message || '服务器同步失败'}`);\n }\n }\n },\n async clearPinnedMessage() {\n const current = this.pinnedMessagesByConversation[this.activeId] || null;\n const next = { ...this.pinnedMessagesByConversation };\n delete next[this.activeId];\n this.pinnedMessagesByConversation = next;\n writePinnedMessages(next);\n this.setActionNotice('已取消置顶');\n try {\n await imClient.setPinnedMessage(this.activeConversation, '', current);\n } catch (error) {\n this.setActionError(`已在本地取消,服务器同步失败:${error.message || '取消置顶失败'}`);\n }\n },\n setActiveFavorite(key) {\r\n this.activeFavoriteKey = String(key || '');\r\n },\r\n removeFavorite(key) {\r\n const value = String(key || '');\r\n if (!value) {\r\n return;\r\n }\r\n this.favoriteMessages = this.favoriteMessages.filter(message => message.key !== value);\r\n if (this.activeFavoriteKey === value) {\r\n this.activeFavoriteKey = this.favoriteMessages[0]?.key || '';\r\n }\r\n writeFavoriteMessages(this.favoriteMessages);\r\n },\r\n quoteMessage(message) {\r\n this.quotedMessage = {\r\n ...message,\r\n quoteText: quotePrefix(message)\r\n };\r\n this.setActionNotice('已引用,输入后发送');\r\n },\r\n cancelQuote() {\r\n this.quotedMessage = null;\r\n },\r\n enterSelectionMode(message = null) {\r\n this.selectionMode = true;\r\n if (message) {\r\n const key = messageStableKey(message);\r\n this.selectedMessageIds = key ? [key] : [];\r\n }\r\n },\r\n toggleSelectedMessage(message) {\r\n const key = messageStableKey(message);\r\n if (!key) {\r\n return;\r\n }\r\n const selected = new Set(this.selectedMessageIds);\r\n if (selected.has(key)) {\r\n selected.delete(key);\r\n } else {\r\n selected.add(key);\r\n }\r\n this.selectedMessageIds = Array.from(selected);\r\n this.selectionMode = this.selectedMessageIds.length > 0;\r\n },\r\n clearSelection() {\r\n this.selectionMode = false;\r\n this.selectedMessageIds = [];\r\n },\r\n copySelectedMessages() {\r\n return this.copyMessages(this.selectedMessages);\r\n },\r\n deleteSelectedMessages() {\r\n this.deleteMessages(this.selectedMessages);\r\n },\r\n startForward(messages) {\n this.forwardingMessages = messages.filter(message => message?.text || message?.attachment?.url);\n if (!this.forwardingMessages.length) {\r\n this.setActionError('没有可转发的消息');\r\n }\r\n },\r\n startForwardSelectedMessages() {\r\n this.startForward(this.selectedMessages);\r\n },\r\n cancelForward() {\r\n this.forwardingMessages = [];\r\n },\r\n startEditMessage(message) {\r\n const isResend = isRecalledMessage(message);\r\n if (!isResend && !message?.text) {\r\n this.setActionError('没有可编辑的文字内容');\r\n return;\r\n }\r\n this.editingMessage = message;\r\n this.editingText = message.text || '';\r\n this.editingMode = isResend ? 'resend' : 'edit';\r\n },\r\n cancelEditMessage() {\r\n this.editingMessage = null;\r\n this.editingText = '';\r\n this.editingMode = '';\r\n },\r\n async completeEditMessage() {\r\n const conversation = this.activeConversation;\r\n const message = this.editingMessage;\r\n const text = this.editingText.trim();\r\n const isResend = this.editingMode === 'resend' || isRecalledMessage(message);\r\n if (!conversation || !message) {\r\n this.cancelEditMessage();\r\n return;\r\n }\r\n if (!text) {\r\n this.setActionError('编辑内容不能为空');\r\n return;\r\n }\r\n if (!isResend && text === String(message.text || '').trim()) {\r\n this.cancelEditMessage();\r\n return;\r\n }\r\n try {\r\n if (isResend) {\r\n await this.sendTextToConversation(conversation, text);\r\n this.cancelEditMessage();\r\n this.setActionNotice('已重新发送');\r\n return;\r\n }\r\n const editedMessage = await imClient.editMessage(conversation, message, text);\r\n this.replaceLocalMessage(conversation.id, message, editedMessage);\r\n if (messageActivityTimestamp(editedMessage) >= Number(conversation.updatedAt || 0)) {\r\n conversation.subtitle = editedMessage.text;\r\n conversation.updatedAt = messageActivityTimestamp(editedMessage);\r\n writeLocalConversations(this.conversations);\r\n }\r\n this.cancelEditMessage();\r\n this.setActionNotice('已编辑');\r\n } catch (error) {\r\n this.setActionError(error.message || '编辑失败');\r\n }\r\n },\r\n async completeForward(targetConversationId) {\n const target = this.conversations.find(conversation => conversation.id === targetConversationId);\r\n if (!target || !this.forwardingMessages.length) {\r\n return;\r\n }\r\n const messages = [...this.forwardingMessages];\n let successCount = 0;\n const errors = [];\n for (const message of messages) {\n try {\n if (message.attachment?.url) {\n await imClient.forwardAttachmentMessage(target, message);\n } else if (message.text) {\n const text = forwardedText(message);\n if (!text) {\n throw new Error('消息内容为空');\n }\n const sentMessage = await this.sendTextToConversation(target, text);\n if (sentMessage?.status === 'failed') {\n throw new Error(sentMessage.error || '转发失败');\n }\n }\n successCount += 1;\n } catch (error) {\n errors.push(error.message || '转发失败');\n }\n }\n if (successCount > 0) {\n this.forwardingMessages = [];\n this.clearSelection();\n this.refreshRemoteConversations();\n }\n if (errors.length) {\n this.setActionError(`成功 ${successCount} 条,失败 ${errors.length} 条:${errors[0]}`);\n } else {\n this.setActionNotice(`已转发 ${successCount} 条`);\n }\n },\r\n async recallMessage(message) {\r\n const conversation = this.activeConversation;\r\n if (!conversation) {\r\n return;\r\n }\r\n try {\r\n await imClient.recallMessage(conversation, message);\r\n if (message.direction !== 'out') {\r\n this.removeMessages(conversation.id, [message]);\r\n this.setActionNotice('已撤回');\r\n this.syncActiveMessages();\r\n return;\r\n }\r\n this.replaceLocalMessage(conversation.id, message, {\r\n status: 'recalled',\r\n deliveryStatus: '',\r\n recalled: true,\r\n recallStatus: '已撤回'\r\n });\r\n this.setActionNotice('已撤回');\r\n } catch (error) {\r\n this.setActionError(error.message || '撤回失败');\r\n }\r\n },\r\n async createGroup(options = {}) {\r\n const session = useSessionStore();\r\n if (!session.userId) {\r\n this.setActionError('请先登录');\r\n return false;\r\n }\r\n try {\r\n const conversation = await imClient.createGroup(session.userId, options);\r\n this.upsertConversation(conversation);\r\n this.setActiveConversation(conversation.id);\r\n this.setActionNotice(options.channel ? '公告群已创建' : '群组已创建');\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || (options.channel ? '创建公告群失败' : '创建群组失败'));\r\n return false;\r\n }\r\n },\r\n async joinGroup(groupKey) {\r\n const session = useSessionStore();\r\n if (!session.userId) {\r\n this.setActionError('请先登录');\r\n return false;\r\n }\r\n try {\r\n const conversation = await imClient.joinGroup(session.userId, groupKey);\r\n this.upsertConversation(conversation);\r\n this.setActiveConversation(conversation.id);\r\n this.setActionNotice('已加入群组');\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || '加入群组失败');\r\n return false;\r\n }\r\n },\r\n async broadcastMessage(targetIds, text) {\r\n const session = useSessionStore();\r\n if (!session.userId) {\r\n this.setActionError('请先登录');\r\n return false;\r\n }\r\n try {\r\n const result = await imClient.broadcastMessage(session.userId, targetIds, text);\r\n const successCount = Number(result.successCount || 0);\r\n const failedCount = Number(result.failedCount || 0);\r\n this.setActionNotice(failedCount > 0 ? `已群发 ${successCount} 条,失败 ${failedCount} 条` : `已群发 ${successCount} 条`);\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || '群发失败');\r\n return false;\r\n }\r\n },\r\n async leaveGroup(conversation) {\r\n const session = useSessionStore();\r\n if (!session.userId || !conversation?.target) {\r\n this.setActionError('缺少群组信息');\r\n return false;\r\n }\r\n try {\r\n await imClient.leaveGroup(session.userId, conversation.target);\r\n this.removeConversation(conversation.id);\r\n this.setActionNotice('已退出群组');\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || '退出群组失败');\r\n return false;\r\n }\r\n },\r\n async dismissGroup(conversation) {\r\n const session = useSessionStore();\r\n if (!session.userId || !conversation?.target) {\r\n this.setActionError('缺少群组信息');\r\n return false;\r\n }\r\n try {\r\n await imClient.dismissGroup(session.userId, conversation.target);\r\n this.removeConversation(conversation.id);\r\n this.setActionNotice('群组已解散');\r\n this.refreshRemoteConversations();\r\n return true;\r\n } catch (error) {\r\n this.setActionError(error.message || '解散群组失败');\r\n return false;\r\n }\r\n }\r\n }\r\n});\r\n","import { defineStore } from 'pinia';\r\n\r\nexport const useNavigationStore = defineStore('navigation', {\r\n state: () => ({\r\n section: 'messages'\r\n }),\r\n actions: {\r\n showMessages() {\r\n this.section = 'messages';\r\n },\r\n showContacts() {\r\n this.section = 'contacts';\r\n },\r\n showFavorites() {\r\n this.section = 'favorites';\r\n }\r\n }\r\n});\r\n","import { defineStore } from 'pinia';\nimport { imClient } from '@/services/imClient';\nimport { appConfig } from '@/config';\n\nconst STORAGE_KEY = 'qmt-web-im-session';\n\nfunction normalizeStoredPortrait(portrait) {\n return portrait || '';\n}\n\nfunction nextProfilePortrait(profilePortrait, currentPortrait) {\n return normalizeStoredPortrait(profilePortrait) || normalizeStoredPortrait(currentPortrait);\n}\n\nfunction inferAccountType(account) {\n return String(account || '').includes('@') ? 2 : 1;\n}\n\nexport const useSessionStore = defineStore('session', {\n state: () => ({\n isAuthenticated: false,\n connecting: false,\n connected: false,\n connectionStatusText: '未连接',\n userId: '',\n token: '',\n displayName: '',\n portrait: '',\n error: '',\n sdkVersion: '',\n eventsBound: false\n }),\n actions: {\n restore() {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) {\n return;\n }\n\n try {\n const session = JSON.parse(raw);\n if (session.appServer !== appConfig.appServer) {\n localStorage.removeItem(STORAGE_KEY);\n return;\n }\n\n if (session.userId && session.token) {\n if (!session.clientId) {\n localStorage.removeItem(STORAGE_KEY);\n return;\n }\n this.userId = session.userId;\n this.token = session.token;\n this.displayName = session.displayName || session.userId;\n this.portrait = normalizeStoredPortrait(session.portrait);\n this.isAuthenticated = true;\n imClient.restoreClientId(session.clientId);\n this.connect();\n this.refreshProfile();\n }\n } catch (error) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n\n async loginWithPassword(account, password, type = inferAccountType(account)) {\n this.error = '';\n this.connecting = true;\n try {\n const result = await imClient.loginWithPassword(account, password, type);\n this.applyLoginResult(result);\n await this.connect();\n } catch (error) {\n this.error = error.message || '登录失败';\n } finally {\n this.connecting = false;\n }\n },\n\n async loginWithCode(account, code) {\n this.error = '';\n this.connecting = true;\n try {\n const result = await imClient.loginWithCode(account, code);\n this.applyLoginResult(result);\n await this.connect();\n } catch (error) {\n this.error = error.message || '登录失败';\n } finally {\n this.connecting = false;\n }\n },\n\n async completePcSessionLogin(result) {\n this.error = '';\n this.connecting = true;\n try {\n this.applyLoginResult(result);\n await this.connect();\n } catch (error) {\n this.error = error.message || '扫码登录失败';\n } finally {\n this.connecting = false;\n }\n },\n\n async register(payload) {\n this.error = '';\n this.connecting = true;\n try {\n const result = await imClient.register(payload);\n this.applyLoginResult(result);\n await this.connect();\n return result;\n } catch (error) {\n this.error = error.message || '注册失败';\n return null;\n } finally {\n this.connecting = false;\n }\n },\n\n applyLoginResult(result) {\n this.userId = result.userId || result.uid || result.id || '';\n this.token = result.token || result.imToken || '';\n this.displayName = result.displayName || result.userName || result.name || this.userId;\n this.portrait = normalizeStoredPortrait(result.portrait);\n this.isAuthenticated = Boolean(this.userId && this.token);\n this.persistSession();\n },\n\n persistSession() {\n localStorage.setItem(STORAGE_KEY, JSON.stringify({\n userId: this.userId,\n token: this.token,\n displayName: this.displayName,\n portrait: this.portrait,\n clientId: imClient.getClientId(),\n appServer: appConfig.appServer\n }));\n },\n\n applyProfile(profile) {\n if (!profile) {\n return;\n }\n this.userId = profile.userId || profile.uid || this.userId;\n this.displayName = profile.displayName || profile.name || this.displayName || this.userId;\n this.portrait = nextProfilePortrait(profile.portrait, this.portrait);\n this.persistSession();\n },\n\n async refreshProfile() {\n if (!this.userId) {\n return null;\n }\n try {\n const profile = await imClient.getProfile(this.userId);\n this.applyProfile(profile);\n return profile;\n } catch (error) {\n return null;\n }\n },\n\n async saveProfile({ displayName, portraitFile }) {\n if (!this.userId) {\n throw new Error('请先登录');\n }\n const profile = await imClient.updateProfile(this.userId, {\n displayName,\n portraitFile\n });\n this.applyProfile(profile);\n return profile;\n },\n\n async changePassword({ oldPassword, newPassword }) {\n if (!this.userId) {\n throw new Error('请先登录');\n }\n await imClient.changePassword({ oldPassword, newPassword });\n await this.logout();\n return true;\n },\n\n async resetPasswordWithCode({ mobile, resetCode, newPassword }) {\n await imClient.resetPasswordWithCode({ mobile, resetCode, newPassword });\n return true;\n },\n\n async connect() {\n if (!this.userId || !this.token) {\n return;\n }\n await imClient.ensureSdk();\n this.sdkVersion = imClient.getSdkVersion();\n this.bindImEvents();\n await imClient.connect(this.userId, this.token);\n },\n\n bindImEvents() {\n if (this.eventsBound) {\n return;\n }\n this.eventsBound = true;\n imClient.on('connectionStatusChanged', status => {\n this.connected = status.connected;\n this.connectionStatusText = status.statusText || (status.connected ? '已连接' : '未连接');\n });\n },\n\n async logout() {\n try {\n await imClient.logout?.();\n } catch (error) {\n this.error = error.message || '退出登录失败';\n } finally {\n imClient.disconnect();\n localStorage.removeItem(STORAGE_KEY);\n this.$reset();\n }\n }\n }\n});\n","import script from \"./App.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./App.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ChatShell.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ChatShell.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./LoginView.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./LoginView.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ChatPanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ChatPanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./MessageComposer.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./MessageComposer.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./MessageList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./MessageList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ContactPanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ContactPanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./FavoriteList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./FavoriteList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ContactList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ContactList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./ConversationList.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./ConversationList.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import script from \"./NavigationRail.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./NavigationRail.vue?vue&type=script&setup=true&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","export { default } from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./App.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./App.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatShell.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatShell.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoginView.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./LoginView.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatPanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ChatPanel.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageComposer.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageComposer.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./MessageList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactPanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactPanel.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoriteList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoriteList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./FavoritePanel.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ContactList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ConversationList.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./ConversationList.vue?vue&type=script&setup=true&lang=js\"","export { default } from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./NavigationRail.vue?vue&type=script&setup=true&lang=js\"; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./NavigationRail.vue?vue&type=script&setup=true&lang=js\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter/value functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tif(Array.isArray(definition)) {\n\t\tvar i = 0;\n\t\twhile(i < definition.length) {\n\t\t\tvar key = definition[i++];\n\t\t\tvar binding = definition[i++];\n\t\t\tif(!__webpack_require__.o(exports, key)) {\n\t\t\t\tif(binding === 0) {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, value: definition[i++] });\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: binding });\n\t\t\t\t}\n\t\t\t} else if(binding === 0) { i++; }\n\t\t}\n\t} else {\n\t\tfor(var key in definition) {\n\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t\t}\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// set .name for anonymous default exports per ES spec\n__webpack_require__.dn = function(x) {\n\t(Object.getOwnPropertyDescriptor(x, \"name\") || {}).writable || Object.defineProperty(x, \"name\", { value: \"default\", configurable: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t524: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkjc_web_im\"] = self[\"webpackChunkjc_web_im\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [504], function() { return __webpack_require__(1406); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["onMounted","LoginView","ChatShell","useSessionStore","session","restore","NavigationRail","ConversationList","ContactList","ChatPanel","ContactPanel","FavoriteList","FavoritePanel","useConversationStore","useNavigationStore","useContactStore","useAutoDismiss","conversations","navigation","contacts","actionError","actionNotice","value","actionInfo","refreshRemoteConversations","refreshContacts","axios","jrQRCode","computed","onBeforeUnmount","reactive","ref","appConfig","imClient","QR_CODE_PREFIX_PC_SESSION","defaultPlatformLogo","view","loginMode","loginAccount","loginPassword","registerType","registerForm","number","code","password","confirmPassword","invitationCode","sendingCode","info","error","qrStatus","qrCodeImage","qrSessionToken","qrUserName","qrUserPortrait","qrGeneration","qrExpireTimer","defaultPlatformName","appName","platformName","platformLogo","canSubmitLogin","length","canRequestEmailCode","test","canSubmitRegister","qrUserInitial","String","slice","toUpperCase","qrStatusTitle","connecting","qrStatusText","qrRefreshText","loadPlatformConfig","stopQrLogin","clearFormMessage","setLoginMode","mode","startQrLogin","submitLogin","type","loginWithPassword","switchRegisterType","requestEmailCode","requestAuthCode","message","submitRegister","result","register","openRegister","backToLogin","resetQrState","clearQrExpireTimer","window","clearTimeout","refreshQrLogin","force","includes","generation","pcSession","createPcSession","token","Error","getQrBase64","expireMs","Math","max","min","Number","expired","setTimeout","isAuthenticated","pollQrLogin","payload","loginWithPcSession","data","status","imToken","completePcSessionLogin","userName","displayName","portrait","delay","ms","Promise","resolve","response","get","platformConfigApi","withCredentials","config","name","trim","logo","logoUrl","version","resolveBrandLogo","applyDocumentBrand","appendBrandVersion","startsWith","location","protocol","base","adminServer","URL","toString","url","parsed","href","searchParams","set","document","title","icon","querySelector","createElement","setAttribute","head","appendChild","handleBrandLogoError","watch","MessageList","MessageComposer","useImageProxyFallback","activeConversation","pinnedMessageIsImage","activePinnedMessage","attachment","pinnedMessageText","text","groupMenuOpen","singleProfileOpen","singleAliasDraft","singleProfileSaving","singleProfileNotice","singleProfileError","groupPanel","groupBusy","groupDetail","groupMembers","groupAliasDraft","manageSection","selectedAdminIds","selectedKickIds","transferTargetId","profileDraft","announcement","welcomeText","muteDraft","scheduleType","startsAtLocal","endsAtLocal","dailyStart","dailyEnd","muteSaveNotice","muteSaveError","singlePeerId","isGroupConversation","target","raw","id","replace","singleContact","peerId","find","contact","uid","singleProfile","conversation","rawUser","alias","rawName","userId","mobile","address","avatarText","groupDisplayId","publicId","currentGroupRole","myRole","role","isGroupOwner","canManageGroup","adminCandidateMembers","filter","member","transferableMembers","mentionCandidates","members","Map","forEach","activeMessages","from","has","senderName","senderPortrait","senderRole","Array","values","messageDetail","messageDetailGroup","group","isMessageDetailGroup","conversationType","Boolean","messageDetailCounts","counts","read","unread","undelivered","total","kickCandidateMembers","statusText","canSendActiveConversation","connectionStatusText","connected","formatDetailTime","timestamp","Intl","DateTimeFormat","year","month","day","hour","minute","second","hour12","timeZone","resolvedOptions","format","detailMemberName","detailMemberAvatar","detailRoleLabel","closeGroupMenu","toggleGroupMenu","openSingleProfile","then","catch","closeSingleProfile","saveSingleAlias","ok","updateContactAlias","refreshedContact","nextTitle","upsertConversation","handleSenderProfileUpdated","syncActiveMessages","allowReadReceipt","loadGroupMembers","closeGroupPanel","clearMuteSaveFeedback","loadGroupDetail","requestedConversationId","requestedTarget","detail","getGroupDetail","setActionError","openGroupOverview","openGroupMembers","silent","getGroupMembers","map","openGroupAlias","myAlias","msToLocalInput","date","Date","local","getTime","getTimezoneOffset","toISOString","localInputToMs","prepareManagementDrafts","setting","muteSetting","startsAtMs","endsAtMs","openGroupManage","openTransferGroup","saveGroupAlias","updateGroupAlias","setActionNotice","toggleAdmin","selected","Set","delete","add","toggleKick","saveGroupAdmins","setGroupAdmins","saveGroupProfile","updateGroupProfile","updatedAt","now","kickSelectedMembers","confirm","kickGroupMembers","removed","removedIds","saveMuteSetting","updateGroupMuteSetting","leaveCurrentGroup","leaveGroup","dismissCurrentGroup","dismissGroup","transferCurrentGroup","transferGroup","memberAvatar","addEventListener","removeEventListener","immediate","nextTick","props","__props","emit","__emit","emojiOpen","dropActive","textareaEl","imageInput","fileInput","mentionOpen","mentionQuery","mentionStart","mentionedUserIds","dragDepth","emojiList","filteredMentionUsers","query","toLowerCase","mentionUsers","mentionName","submit","handleMentionInput","event","cursor","selectionStart","beforeCursor","match","openMentionPicker","element","start","end","selectionEnd","focus","setSelectionRange","selectMention","push","nextCursor","toggleEmojiPicker","insertEmoji","emoji","requestAnimationFrame","chooseImage","click","chooseFile","attachmentTypeForFile","file","fallbackType","emitFiles","files","disabled","validFiles","File","size","caption","index","selectAttachment","input","hasDraggedFiles","types","dataTransfer","handleDragEnter","dropEffect","handleDragOver","handleDragLeave","filesFromDataTransfer","items","item","kind","webkitGetAsEntry","isDirectory","getAsFile","handleDrop","imageFilesFromClipboard","clipboardData","handlePaste","imageFiles","preventDefault","useVideoOriginalFallback","videoDisplayUrl","IMAGE_MIN_SCALE","IMAGE_MAX_SCALE","listEl","viewerStage","contextMenu","visible","x","y","imageViewer","sourceUrl","scale","rotation","offsetX","offsetY","dragging","dragStartX","dragStartY","dragOffsetX","dragOffsetY","senderProfile","roleLabel","contactAlias","groupAlias","isContact","aliasDraft","saving","adding","notice","imageViewerStyle","transform","viewerImages","messages","isImageMessage","menuItems","isOwnMessage","direction","isRecalledMessage","action","label","favoriteLabel","isFavorite","pinnedLabel","pinnedMessageId","messageIdentity","unshift","canRecallOthers","scrollToBottom","scrollTop","scrollHeight","scrollToMessage","messageId","row","querySelectorAll","dataset","messageKey","scrollIntoView","block","behavior","deliveryStatus","messageUid","recalled","join","attentionMessageId","closeMenu","closeMenuOnEscape","moveImageDrag","stopImageDrag","canOpenMessageMenu","isSelected","selectedMessageIds","favoriteMessageIds","isAttention","isRecallNotice","isFileMessage","displayFileName","attachmentName","isVideoMessage","contentType","isRedPacketMessage","redPacketPayload","isRedPacketReceipt","isSystemMessage","systemMessageText","redPacketReceiptText","receiverName","packetSenderName","redPacketSenderName","nearestRedPacketSenderName","receiptMessage","receiptIndex","findIndex","candidate","redPacket","JSON","parse","redPackets","redPacketBlessing","blessing","isGroupMessage","showGroupSender","senderRoleLabel","groupSenderName","groupSenderAvatarText","openSenderProfile","profile","cachedContact","cachedAlias","remarkAlias","closeSenderProfile","addSenderAsContact","addContact","aliasSaved","saveSenderAlias","roleBubbleClass","formatFileSize","bytes","toFixed","handleMessageClick","selectionMode","handleImageClick","openImageViewer","showViewerImage","images","closeImageViewer","normalizedIndex","resetImageViewer","showPreviousImage","showNextImage","clampImageScale","setImageScale","originX","originY","previousScale","nextScale","rect","getBoundingClientRect","centerX","left","width","centerY","top","height","ratio","zoomImage","delta","rotateImage","handleImageWheel","factor","deltaY","clientX","clientY","startImageDrag","saveViewerImage","downloadUrl","origin","link","download","body","remove","openMenu","innerWidth","innerHeight","key","chooseMenuAction","formatTime","deliveryState","state","deliveryTitle","failureText","errorCode","activeContact","remarkName","username","editingAlias","aliasSaving","aliasError","openAliasEditor","closeAliasEditor","submitAlias","activeKey","activeFavorite","favoriteTitle","conversationTitle","entry","conversationId","favoritePreview","recallStatus","preview","formatFavoriteTime","favorite","clearFeedback","favoriteText","isImageFavorite","isFileFavorite","favoriteCopyText","copyFavorite","writeClipboard","copyError","navigator","clipboard","writeText","style","position","select","execCommand","removeChild","openConversation","showMessages","setActiveConversation","focusMessage","removeFavorite","keyword","addingContact","addKeyword","filteredContacts","subtitle","openAddContact","closeAddContact","submitAddContact","added","defineComponent","h","actionMenuOpen","activeAction","actionBusy","searchKeyword","groupName","groupAnnouncement","groupWelcomeText","joinGroupKey","broadcastText","channelName","channelAnnouncement","contactKeyword","selectedContactIds","conversationMenu","actionTitles","createGroup","joinGroup","broadcast","createChannel","submitLabels","actionTitle","submitLabel","modalError","modalInfo","normalizedSearchKeyword","contactsByUid","filteredConversationItems","conversationResult","conversationResults","matchesConversation","contactForConversation","conversationTargets","conversationTarget","contactResults","matchesContact","contactResult","submitDisabled","isPinned","resultKind","pinnedAt","openConversationMenu","closeConversationMenu","togglePinned","togglePinnedConversation","deleteConversation","removeConversation","ContactPicker","default","selectedIds","emptyText","emits","setup","class","placeholder","onInput","onClick","src","alt","searchableValues","flatMap","isArray","Object","matchesKeyword","compactKeyword","some","groupId","group_id","owner_uid","friendAlias","rawFriend","resultKey","isListItemActive","activeId","selectListItem","openChat","clearStoreMessages","resetActionFields","toggleActionMenu","closeActionMenu","openAction","closeActionModal","toggleContact","contactId","submitAction","memberIds","broadcastMessage","channel","formatUnread","count","CROP_OUTPUT_SIZE","settingsItems","initials","settingsOpen","settingsSection","passwordSaving","settingsNotice","settingsError","profileOpen","profileSaving","profileNotice","profileError","profileFile","profilePreview","portraitInput","cropperCanvas","cropperPreviewCanvas","passwordDraft","oldPassword","newPassword","currentAvatarUrl","activeSettingsItem","avatarPreviewViewer","open","avatarCropper","loaded","busy","objectUrl","fileName","image","baseScale","avatarPreviewStyle","refreshProfile","drawAvatarCropper","revokeProfilePreview","closeAvatarCropper","showContacts","clearProfileFeedback","clearSettingsFeedback","resetPasswordDraft","openSettings","closeSettings","selectSettingsSection","section","revokeObjectURL","revokeCropperObjectUrl","openProfileEditor","closeProfileEditor","closeAvatarPreview","selectPortrait","openAvatarCropper","choosePortraitFile","openAvatarPreview","resetAvatarPreview","zoomAvatarPreview","handleAvatarPreviewWheel","startAvatarPreviewDrag","currentTarget","setPointerCapture","pointerId","moveAvatarPreviewDrag","stopAvatarPreviewDrag","dropPortrait","cropperStageSize","canvas","round","cropperBoxSize","rotatedImageSize","quarterTurn","abs","naturalHeight","naturalWidth","clampCropperOffset","cropSize","rotated","scaledWidth","scaledHeight","maxX","maxY","updateCropperBaseScale","drawCanvasImage","outputScale","cropOnly","dpr","devicePixelRatio","context","getContext","setTransform","clearRect","fillStyle","fillRect","save","translate","rotate","PI","drawImage","beginPath","fill","previewCanvas","resetCropperTransform","createObjectURL","Image","onload","onerror","zoomCropper","rotateCropper","degrees","handleCropperWheel","startCropperDrag","moveCropperDrag","stopCropperDrag","canvasToBlob","quality","reject","toBlob","blob","confirmAvatarCrop","outputCanvas","croppedFile","saveProfile","portraitFile","savePassword","changePassword","logout","clearContacts","source","clear","timer","currentValue","flush","currentHost","hostname","runtimeConfig","JC_WEB_IM_CONFIG","appServerOrigin","qrAppServerOrigin","adminServerOrigin","process","env","VUE_APP_ADMIN_SERVER","appServer","VUE_APP_APP_SERVER","qrAppServer","VUE_APP_QR_APP_SERVER","VUE_APP_PLATFORM_CONFIG_API","NODE_ENV","registerConfigApi","VUE_APP_REGISTER_CONFIG_API","registerPhoneExistsApi","VUE_APP_REGISTER_PHONE_EXISTS_API","contactsApi","VUE_APP_CONTACTS_API","updateAliasApi","VUE_APP_UPDATE_ALIAS_API","addContactApi","VUE_APP_ADD_CONTACT_API","conversationActionsApi","VUE_APP_CONVERSATION_ACTIONS_API","sendMessageApi","VUE_APP_SEND_MESSAGE_API","messageActionApi","VUE_APP_MESSAGE_ACTION_API","messageDetailApi","VUE_APP_MESSAGE_DETAIL_API","messagesApi","VUE_APP_MESSAGES_API","profileApi","VUE_APP_PROFILE_API","changePasswordApi","VUE_APP_CHANGE_PASSWORD_API","logoutApi","VUE_APP_LOGOUT_API","imServerHost","VUE_APP_IM_SERVER_HOST","imRoutePort","VUE_APP_IM_ROUTE_PORT","useWss","VUE_APP_USE_WSS","wsPath","VUE_APP_WS_PATH","wsUrl","VUE_APP_WS_URL","sdkMode","VUE_APP_IM_MODE","syncIntervalMs","VUE_APP_SYNC_INTERVAL_MS","sseEnabled","VUE_APP_SSE_ENABLED","sseTicketApi","VUE_APP_SSE_TICKET_API","sseUrl","VUE_APP_SSE_URL","platform","clientIdStorageKey","authTokenStoragePrefix","createApp","createPinia","App","use","mount","AES_KEY","ENCRYPTION_EXCLUDE_PATHS","AUTH_STORAGE_KEY","AUTH_ERROR_CODE","REFRESH_ERROR_CODE","importedCryptoKeyPromise","refreshPromise","storageScope","readAuthStore","localStorage","getItem","writeAuthStore","store","setItem","stringify","normalizeAuthBundle","bundle","accessToken","refreshToken","tokenType","accessTokenExpireIn","accessTokenExpireAt","refreshTokenExpireIn","refreshTokenExpireAt","getStoredAppAuth","persistAppAuth","normalized","clearStoredAppAuth","hasFormData","FormData","absoluteUrl","shouldEncrypt","pathname","path","shouldAttachAuth","skipAuth","textEncoder","TextEncoder","textDecoder","TextDecoder","bytesToBase64","binary","byte","fromCharCode","btoa","base64ToBytes","base64","atob","Uint8Array","charCodeAt","getCryptoKey","crypto","subtle","importKey","encode","encryptPayload","plainText","iv","getRandomValues","encrypted","encrypt","decryptPayload","cipherText","ivBase64","encryptedBase64","split","decrypted","decrypt","decode","normalizeBusinessResponse","decodeResponsePayload","headers","client","create","interceptors","request","nextConfig","auth","Authorization","method","plainBody","floor","refreshAccessToken","post","finally","_retriedAfterRefresh","appServerRequest","appServerGet","appServerPost","HttpImClient","inferAccountType","account","unwrapData","unwrapMessage","fallback","msg","DocumentedHttpImClient","unsupported","feature","clientId","getClientId","email","loginWithCode","flag","device_name","encodeURIComponent","postError","persistAppToken","resetPasswordWithCode","resetCode","fetchRemoteConversations","fetchRemoteMessages","getServerContactList","getProfile","sendTextMessage","sendAttachmentMessage","updateProfile","recallMessage","editMessage","getMessageDetail","LOCAL_MESSAGE_STORAGE_KEY","LOCAL_HIDDEN_MESSAGE_STORAGE_KEY","LOCAL_RECALLED_MESSAGE_STORAGE_KEY","scopedStorageKey","baseKey","scope","randomId","randomUUID","replaceAll","random","readLocalMessages","readMessageSet","storageKey","writeMessageSet","messagesByConversation","messageKeys","hasStoredMessage","stored","ids","storeMessageKeys","withRecalledState","applyLocalMessageState","isRecalled","writeLocalMessages","saveLocalMessage","splice","mergeSyncedMessages","localMessages","remoteMessages","visibleLocalMessages","localByKey","visibleRemoteMessages","remoteMessage","localMessage","remoteKeys","hasRemoteMatch","pendingLocalMessages","sort","a","b","displayTimestamp","getTitle","getUniqueEquipment","allowedDevices","canUseLocalLoginFallback","constructor","listeners","currentUser","restoreClientId","getSdkVersion","ensureSdk","localOnly","registerWithPhone","deviceId","uniqueEquipment","connect","refreshConversationList","disconnect","getConversationList","remoteConversations","limit","line","getMessages","options","markRead","includeConversations","hasPinnedMessageState","prototype","hasOwnProperty","call","pinnedMessageUid","pinnedMessage","remoteConversation","setPinnedMessage","isGroup","addGroupPinnedMessage","serverPinId","pinId","removeGroupPinnedMessage","fetchGroupPinnedMessages","params","getAppAuthHeaders","undefined","searchableContent","rawConversationType","isFinite","messageType","messageText","content","hideMessages","markMessagesRecalled","nextText","editedMessage","editedAt","activityTimestamp","initialMessage","sender","sentMessage","serverTimestamp","failedMessage","mime","formData","append","forwardAttachmentMessage","sourceMessage","getContactList","mapContact","localeCompare","reason","normalizeConversation","groupKey","targetIds","targetUserId","adminIds","targetId","resetPasswordApi","refreshContactList","createSingleConversation","userInfo","friend","on","eventName","handler","off","appToken","authtoken","authToken","getUrlHost","host","LongConnectionImClient","UnsupportedWildfireImClient","WildfireImClient","HEARTBEAT_INTERVAL_MS","RECONNECT_MIN_MS","RECONNECT_MAX_MS","buildWsUrl","port","normalizeConversationId","to","receiver","normalizeIncomingMessage","currentUserId","fromUser","socket","heartbeatTimer","reconnectTimer","reconnectAttempts","manualClose","shouldUseMessagePolling","WebSocket","openSocket","clearReconnectTimer","clearHeartbeatTimer","close","readyState","OPEN","sendAuthFrame","CONNECTING","binaryType","scheduleReconnect","onopen","startHeartbeat","onmessage","handleFrame","onclose","sendFrame","frame","send","rawData","ArrayBuffer","cmd","setInterval","clearInterval","configuredProxyHosts","configured","mediaProxyHosts","imageDisplayUrl","proxyUrl","streamUrl","video","originalFallback","load","proxyFallback","RealtimeNotificationClient","reconnectAttempt","isConnected","stop","ticket","separator","endpoint","socketUrl","realtimeNotifications","defineStore","CONTACT_CACHE_MS","normalizeContacts","unique","loading","eventsBound","refreshSerial","loadedForUserId","loadedAt","getters","actions","bindImEvents","requestUserId","serial","serverContacts","latest","nextAlias","savedAlias","setActiveContact","LOCAL_CONVERSATION_STORAGE_KEY","LOCAL_FAVORITE_MESSAGES_KEY","LOCAL_PINNED_MESSAGES_KEY","LOCAL_HIDDEN_CONVERSATIONS_KEY","readFavoriteMessages","writeFavoriteMessages","readLocalConversations","writeLocalConversations","readHiddenConversationIds","writeHiddenConversationIds","readPinnedMessages","writePinnedMessages","parseNativePinnedMessage","matched","encoded","messageContent","updateTime","createTime","sortConversations","right","leftPinned","rightPinned","messageStableKey","messageActivityTimestamp","attachmentLabel","messagePreviewText","quotePrefix","isSameMessage","hasExactMessage","canMarkReadNow","visibilityState","userAction","forwardedText","normalizeMessageForDisplay","labels","mergeVisibleMessages","currentMessages","syncedMessages","merged","currentMessage","exists","shouldKeepLocal","incomingEditedMessages","previousMessages","nextMessages","previousByKey","previous","notificationAudioContext","playNotificationSound","AudioContext","webkitAudioContext","resume","oscillator","createOscillator","gain","createGain","startAt","currentTime","frequency","setValueAtTime","exponentialRampToValueAtTime","destination","visibleMessagesByConversation","usingDemoData","syncTimer","conversationSyncTimer","readPresenceEventsBound","syncInFlight","pendingReadReceiptConversationId","conversationSyncInFlight","syncAfterSendTimer","optimisticMessagesByConversation","quotedMessage","forwardingMessages","editingMessage","editingText","editingMode","messageDetailOpen","messageDetailLoading","messageDetailError","attentionMessageTimer","favoriteMessages","pinnedMessagesByConversation","groupPinnedSyncAt","hiddenConversationIds","activeFavoriteKey","actionNoticeTimer","realtimeSyncTimer","totalUnread","reduce","sum","pinned","selectedMessages","bootstrapDemoData","clearUserState","loadScopedLocalState","startMessageSync","handleRealtimeNotification","appendMessage","scheduleActiveMessagesSync","replaceMessage","applyRemoteConversations","loadActiveMessages","sendText","appendVisibleMessage","sendAttachment","sendTextToConversation","removedMessages","removedVisibleMessages","removedOptimisticMessages","hidden","remote","keepOptimisticMessage","updateConversationFromMessage","syncVisibleMessages","removeMessages","filterMessages","list","replaceLocalMessage","targetMessage","nextMessage","keys","replaceInList","pruneOptimisticMessages","remoteMatched","syncedMessage","syncOptions","wantsReadReceipt","explicitReadReceipt","pollingReadReceipt","syncedConversationId","shouldSyncGroupPin","nativePins","nextPinned","console","warn","remotePinnedKey","editedIncomingMessages","latestMessage","bindReadPresenceEvents","syncWhenReadable","handleMessageAction","copyMessages","startEditMessage","deleteMessages","startForward","toggleFavorite","togglePinnedMessage","openMessageDetail","quoteMessage","enterSelectionMode","sentAt","closeMessageDetail","current","next","refreshed","rollback","clearPinnedMessage","setActiveFavorite","quoteText","cancelQuote","toggleSelectedMessage","clearSelection","copySelectedMessages","deleteSelectedMessages","startForwardSelectedMessages","cancelForward","isResend","cancelEditMessage","completeEditMessage","completeForward","targetConversationId","successCount","errors","failedCount","showFavorites","STORAGE_KEY","normalizeStoredPortrait","nextProfilePortrait","profilePortrait","currentPortrait","sdkVersion","removeItem","applyLoginResult","persistSession","applyProfile","$reset"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public/api/conversation_actions.php b/public/api/conversation_actions.php
index 299cc7e..61241c6 100644
--- a/public/api/conversation_actions.php
+++ b/public/api/conversation_actions.php
@@ -425,12 +425,38 @@ function currentMuteSetting(PDO $appDb, string $groupId): array
];
}
-function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
-{
- $group = fetchWebGroup($appDb, $groupId);
- if (!$group) {
- respond(404, '没有找到该群组');
- }
+function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
+{
+ $group = fetchWebGroup($appDb, $groupId);
+ if (!$group) {
+ $groupStatement = $imDb->prepare('select * from `t_group` where `_gid` = ? and `_deleted` = 0 limit 1');
+ $groupStatement->execute([$groupId]);
+ $nativeGroup = $groupStatement->fetch();
+ $memberStatement = $imDb->prepare('select `_type`, `_alias` from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1');
+ $memberStatement->execute([$groupId, $userId]);
+ $nativeMember = $memberStatement->fetch();
+ if (!$nativeGroup || !$nativeMember) {
+ respond(403, '你不在该群组中');
+ }
+ $ownerStatement = $imDb->prepare('select `_mid` from `t_group_member` where `_gid` = ? and `_type` = 2 limit 1');
+ $ownerStatement->execute([$groupId]);
+ $ownerId = (string)($ownerStatement->fetchColumn() ?: '');
+ $users = fetchWebUserMap($imDb, array_filter([$ownerId, $userId]), $userId);
+ return ['group' => [
+ 'groupId' => $groupId,
+ 'publicId' => (string)($nativeGroup['id'] ?? ''),
+ 'name' => (string)($nativeGroup['_name'] ?? $groupId),
+ 'category' => 'group',
+ 'announcement' => (string)($nativeGroup['_bulletin'] ?? ''),
+ 'welcomeText' => '',
+ 'ownerUid' => $ownerId,
+ 'ownerName' => (string)($users[$ownerId]['displayName'] ?? $ownerId),
+ 'myRole' => ((int)($nativeMember['_type'] ?? 0) === 2 ? 'owner' : ((int)($nativeMember['_type'] ?? 0) === 1 ? 'admin' : 'member')),
+ 'myAlias' => (string)($nativeMember['_alias'] ?? ''),
+ 'myDisplayName' => (string)($nativeMember['_alias'] ?? '') ?: (string)($users[$userId]['displayName'] ?? $userId),
+ 'muteSetting' => ['enabled' => false, 'mode' => 'off'],
+ ]];
+ }
$member = fetchWebGroupMember($appDb, $groupId, $userId);
if (!$member) {
respond(403, '你不在该群组中');
@@ -443,8 +469,9 @@ function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupI
$myAlias = (string)($member['alias'] ?? '');
return [
- 'group' => [
- 'groupId' => (string)$group['group_id'],
+ 'group' => [
+ 'groupId' => (string)$group['group_id'],
+ 'publicId' => (string)($group['id'] ?? ''),
'name' => (string)$group['name'],
'category' => (string)$group['category'],
'announcement' => (string)($group['announcement'] ?? ''),
@@ -459,11 +486,42 @@ function groupDetailAction(PDO $imDb, PDO $appDb, string $userId, string $groupI
];
}
-function groupMembersAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
-{
- if (!fetchWebGroupMember($appDb, $groupId, $userId)) {
- respond(403, '你不在该群组中');
- }
+function groupMembersAction(PDO $imDb, PDO $appDb, string $userId, string $groupId): array
+{
+ if (!fetchWebGroupMember($appDb, $groupId, $userId)) {
+ $membership = $imDb->prepare('select 1 from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1');
+ $membership->execute([$groupId, $userId]);
+ if (!$membership->fetchColumn()) {
+ respond(403, '你不在该群组中');
+ }
+ $nativeStatement = $imDb->prepare(
+ 'select `_mid` as `user_id`, `_type`, `_alias`, `_create_dt` from `t_group_member`'
+ . ' where `_gid` = ? order by (`_type` = 2) desc, `_create_dt` asc'
+ );
+ $nativeStatement->execute([$groupId]);
+ $nativeMembers = $nativeStatement->fetchAll();
+ $nativeUsers = fetchWebUserMap($imDb, array_column($nativeMembers, 'user_id'), $userId);
+ return ['members' => array_map(static function (array $member) use ($nativeUsers): array {
+ $uid = (string)$member['user_id'];
+ $user = $nativeUsers[$uid] ?? ['displayName' => $uid, 'mobile' => '', 'portrait' => '', 'isContact' => false];
+ $alias = trim((string)($member['_alias'] ?? ''));
+ $type = (int)($member['_type'] ?? 0);
+ return [
+ 'uid' => $uid,
+ 'role' => $type === 2 ? 'owner' : ($type === 1 ? 'admin' : 'member'),
+ 'alias' => $alias,
+ 'contactAlias' => trim((string)($user['contactAlias'] ?? '')),
+ 'friendAlias' => trim((string)($user['friendAlias'] ?? '')),
+ 'remarkAlias' => trim((string)($user['remarkAlias'] ?? '')),
+ 'isContact' => (bool)($user['isContact'] ?? false),
+ 'displayName' => trim((string)($user['contactAlias'] ?? '')) ?: ($alias ?: (string)$user['displayName']),
+ 'rawDisplayName' => (string)$user['displayName'],
+ 'groupDisplayName' => $alias,
+ 'mobile' => (string)($user['mobile'] ?? ''),
+ 'portrait' => (string)($user['portrait'] ?? ''),
+ ];
+ }, $nativeMembers)];
+ }
$statement = $appDb->prepare(
'select `user_id`, `role`, `alias`, `joined_at_ms` from `t_web_group_members`'
diff --git a/public/api/message_action.php b/public/api/message_action.php
index e4c337b..e7bd9e9 100644
--- a/public/api/message_action.php
+++ b/public/api/message_action.php
@@ -97,26 +97,41 @@ function ensureMessageEditsTable(): void
function ensurePinnedMessagesTable(): void
{
- imAppDb()->exec(
+ $db = imAppDb();
+ $db->exec(
'create table if not exists `t_web_pinned_messages` ('
. '`user_id` varchar(64) not null,'
. '`conversation_type` varchar(16) not null,'
. '`target_id` varchar(128) not null,'
. '`message_uid` varchar(32) not null,'
+ . '`message_json` text null,'
. '`updated_at_ms` bigint not null,'
. 'primary key (`user_id`, `conversation_type`, `target_id`)'
. ') engine=InnoDB default charset=utf8mb4'
);
+ try {
+ $db->exec('alter table `t_web_pinned_messages` add column `message_json` text null after `message_uid`');
+ } catch (Throwable) {
+ // The column already exists.
+ }
}
-function savePinnedMessage(string $userId, string $conversationType, string $targetId, string $messageUid): void
+function savePinnedMessage(string $userId, string $conversationType, string $targetId, string $messageUid, array $message): void
{
ensurePinnedMessagesTable();
$statement = imAppDb()->prepare(
- 'insert into `t_web_pinned_messages` (`user_id`, `conversation_type`, `target_id`, `message_uid`, `updated_at_ms`)'
- . ' values (?, ?, ?, ?, ?) on duplicate key update `message_uid` = values(`message_uid`), `updated_at_ms` = values(`updated_at_ms`)'
+ 'insert into `t_web_pinned_messages` (`user_id`, `conversation_type`, `target_id`, `message_uid`, `message_json`, `updated_at_ms`)'
+ . ' values (?, ?, ?, ?, ?, ?) on duplicate key update `message_uid` = values(`message_uid`),'
+ . ' `message_json` = values(`message_json`), `updated_at_ms` = values(`updated_at_ms`)'
);
- $statement->execute([$userId, $conversationType, $targetId, $messageUid, nowTimestampMs()]);
+ $statement->execute([
+ $userId,
+ $conversationType,
+ $targetId,
+ $messageUid,
+ json_encode($message, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
+ nowTimestampMs(),
+ ]);
}
function removePinnedMessage(string $userId, string $conversationType, string $targetId): void
@@ -263,7 +278,8 @@ try {
if ($targetId === '') respond(400, '缺少会话ID');
$userId = resolveActionUserId($userId);
if ($action === 'pin') {
- savePinnedMessage($userId, $conversationType, $targetId, $messageUidText);
+ $message = is_array($payload['message'] ?? null) ? $payload['message'] : [];
+ savePinnedMessage($userId, $conversationType, $targetId, $messageUidText, $message);
} else {
removePinnedMessage($userId, $conversationType, $targetId);
}
diff --git a/public/api/messages.php b/public/api/messages.php
index 96ee37a..c1d2771 100644
--- a/public/api/messages.php
+++ b/public/api/messages.php
@@ -1066,7 +1066,7 @@ function loadNativeGroupMessages(PDO $db, string $userId, string $groupId, int $
}
$table = imUserMessagesTable($userId);
- $scanLimit = min(max($limit * 4, $limit), 400);
+ $scanLimit = min(max($limit * 4, $limit), 5000);
$statement = $db->prepare(
'select `_mid`, `_dt` from `' . $table . '`'
. ' where `_uid` = ? and `_type` = 1 and `_line` = 0 and `_target` = ?'
@@ -1626,16 +1626,26 @@ function messageSyncResult(
'create table if not exists `t_web_pinned_messages` ('
. '`user_id` varchar(64) not null, `conversation_type` varchar(16) not null,'
. '`target_id` varchar(128) not null, `message_uid` varchar(32) not null,'
+ . '`message_json` text null,'
. '`updated_at_ms` bigint not null, primary key (`user_id`, `conversation_type`, `target_id`)'
. ') engine=InnoDB default charset=utf8mb4'
);
+ try {
+ imAppDb()->exec('alter table `t_web_pinned_messages` add column `message_json` text null after `message_uid`');
+ } catch (Throwable) {
+ // The column already exists.
+ }
$statement = imAppDb()->prepare(
- 'select `message_uid` from `t_web_pinned_messages` where `user_id` = ? and `conversation_type` = ? and `target_id` = ? limit 1'
+ 'select `message_uid`, `message_json` from `t_web_pinned_messages` where `user_id` = ? and `conversation_type` = ? and `target_id` = ? limit 1'
);
$statement->execute([$userId, $conversationType, $targetId]);
- $result['pinnedMessageUid'] = (string)($statement->fetchColumn() ?: '');
+ $pinnedRow = $statement->fetch();
+ $result['pinnedMessageUid'] = (string)($pinnedRow['message_uid'] ?? '');
+ $pinnedMessage = json_decode((string)($pinnedRow['message_json'] ?? ''), true);
+ $result['pinnedMessage'] = is_array($pinnedMessage) ? $pinnedMessage : null;
} catch (Throwable) {
$result['pinnedMessageUid'] = '';
+ $result['pinnedMessage'] = null;
}
}
@@ -1645,7 +1655,7 @@ function messageSyncResult(
$payload = readJsonPayload();
$userId = trim((string)($payload['userId'] ?? ''));
$target = trim((string)($payload['target'] ?? ''));
-$limit = clampLimit($payload['limit'] ?? 50, 50, 100);
+$limit = clampLimit($payload['limit'] ?? 1000, 50, 1000);
$markRead = payloadBool($payload['markRead'] ?? false);
$includeConversations = payloadBool($payload['includeConversations'] ?? false);
$conversationType = normalizeConversationType($payload['conversationType'] ?? $payload['type'] ?? 0);
diff --git a/public/api/send_message.php b/public/api/send_message.php
index a617725..aa133bd 100644
--- a/public/api/send_message.php
+++ b/public/api/send_message.php
@@ -309,11 +309,69 @@ try {
. ' where g.`deleted` = 0 and g.`group_id` = ? and m.`user_id` = ?'
. ' limit 1'
);
- $memberStatement->execute([$target, $sender]);
- $group = $memberStatement->fetch();
- if (!$group) {
- respond(403, '你不在该群组中');
- }
+ $memberStatement->execute([$target, $sender]);
+ $group = $memberStatement->fetch();
+ if (!$group) {
+ // 手机端创建的原生群不一定存在于 Web 自建群表中,需回退检查 IM 群成员表。
+ $imDb = imDb();
+ $nativeGroupStatement = $imDb->prepare(
+ 'select 1 from `t_group` where `_gid` = ? and `_deleted` = 0 limit 1'
+ );
+ $nativeGroupStatement->execute([$target]);
+ $nativeMemberStatement = $imDb->prepare(
+ 'select `_type` from `t_group_member` where `_gid` = ? and `_mid` = ? limit 1'
+ );
+ $nativeMemberStatement->execute([$target, $sender]);
+ $nativeMemberType = $nativeMemberStatement->fetchColumn();
+ if (!$nativeGroupStatement->fetchColumn() || $nativeMemberType === false) {
+ respond(403, '你不在该群组中');
+ }
+
+ $attachment = attachmentFromRequest($messageType);
+ $pushContent = $text !== ''
+ ? $text
+ : ($attachment
+ ? ((string)$attachment['type'] === 'image' ? '[图片]' : ((string)$attachment['type'] === 'video' ? '[视频]' : '[文件] ' . (string)$attachment['name']))
+ : $text);
+ $payloadBody = [
+ 'type' => $attachment ? ((string)$attachment['type'] === 'image' ? 3 : ((string)$attachment['type'] === 'video' ? 6 : 5)) : 1,
+ 'searchableContent' => $pushContent,
+ 'pushContent' => $pushContent,
+ 'content' => $text,
+ 'persistFlag' => 3,
+ ];
+ if ($mentionedUserIds) {
+ $payloadBody['mentionedType'] = 1;
+ $payloadBody['mentionedTarget'] = $mentionedUserIds;
+ }
+ if ($attachment) {
+ $payloadBody['mediaType'] = (int)$attachment['mediaType'];
+ $payloadBody['remoteMediaUrl'] = (string)$attachment['url'];
+ $payloadBody['extra'] = json_encode([
+ 'name' => (string)$attachment['name'],
+ 'mime' => (string)$attachment['mime'],
+ 'size' => (int)$attachment['size'],
+ ], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
+ }
+ $nativeResult = requireImSuccess(imAdminPost('/admin/message/send', [
+ 'sender' => $sender,
+ 'conv' => ['type' => 1, 'target' => $target, 'line' => 0],
+ 'payload' => $payloadBody,
+ ]), '原生群消息发送失败');
+ $messageUid = isset($nativeResult['messageUid']) ? (string)$nativeResult['messageUid'] : '';
+ $timestamp = (int)($nativeResult['timestamp'] ?? webImNowMs());
+ if ($attachment && $messageUid !== '') {
+ storeMessageAttachment($appDb, $messageUid, 'group', $target, $sender, $attachment, $timestamp);
+ }
+ $role = (int)$nativeMemberType === 2 ? 'owner' : ((int)$nativeMemberType === 1 ? 'admin' : 'member');
+ respond(0, 'success', [
+ 'messageUid' => $messageUid,
+ 'timestamp' => $timestamp,
+ 'senderRole' => $role,
+ 'attachment' => $attachment,
+ 'nativeError' => '',
+ ]);
+ }
$category = (string)($group['category'] ?? 'group');
$role = (string)($group['role'] ?? 'member');
if ($category === 'channel' && !in_array($role, ['owner', 'admin'], true)) {
@@ -372,8 +430,7 @@ try {
'target' => $target,
'line' => 0,
],
- 'payload' => $payloadBody,
- 'userMessage' => true,
+ 'payload' => $payloadBody,
]), '原生群消息发送失败');
} catch (Throwable $error) {
$nativeError = $error->getMessage() ?: '原生群消息发送失败';
@@ -418,8 +475,7 @@ try {
'target' => $target,
'line' => 0,
],
- 'payload' => $payloadBody,
- 'userMessage' => true,
+ 'payload' => $payloadBody,
]), '发送失败');
$messageUid = isset($result['messageUid']) ? (string)$result['messageUid'] : '';
diff --git a/src/components/chat/ChatPanel.vue b/src/components/chat/ChatPanel.vue
index ec5678b..633b393 100644
--- a/src/components/chat/ChatPanel.vue
+++ b/src/components/chat/ChatPanel.vue
@@ -86,7 +86,7 @@
群名
{{ groupDetail?.name || activeConversation?.title || '-' }}
-
+
群ID
{{ groupDisplayId }}
@@ -619,14 +619,7 @@ const singleProfile = computed(() => {
};
});
const groupDisplayId = computed(() => {
- return String(
- groupDetail.value?.groupId
- || activeConversation.value?.raw?.groupId
- || activeConversation.value?.raw?.target
- || activeConversation.value?.target
- || activeConversation.value?.id?.replace(/^group-/, '')
- || '-'
- );
+ return String(groupDetail.value?.publicId || '');
});
const isGroupConversation = computed(() => {
return ['group', 'channel'].includes(activeConversation.value?.type)
@@ -637,8 +630,26 @@ const currentGroupRole = computed(() => {
});
const isGroupOwner = computed(() => currentGroupRole.value === 'owner');
const canManageGroup = computed(() => ['owner', 'admin'].includes(currentGroupRole.value));
-const adminCandidateMembers = computed(() => groupMembers.value.filter(member => member.role !== 'owner'));
-const transferableMembers = computed(() => groupMembers.value.filter(member => member.role !== 'owner'));
+const adminCandidateMembers = computed(() => groupMembers.value.filter(member => member.role !== 'owner'));
+const transferableMembers = computed(() => groupMembers.value.filter(member => member.role !== 'owner'));
+const mentionCandidates = computed(() => {
+ const members = new Map();
+ groupMembers.value.forEach(member => {
+ const uid = String(member?.uid || '').trim();
+ if (uid && uid !== String(session.userId || '')) members.set(uid, member);
+ });
+ conversations.activeMessages.forEach(message => {
+ const uid = String(message?.from || '').trim();
+ if (!uid || uid === 'me' || uid === session.userId || members.has(uid)) return;
+ members.set(uid, {
+ uid,
+ displayName: message?.senderName || uid,
+ portrait: message?.senderPortrait || message?.portrait || '',
+ role: message?.senderRole || 'member'
+ });
+ });
+ return Array.from(members.values());
+});
const messageDetail = computed(() => conversations.messageDetail || null);
const messageDetailGroup = computed(() => messageDetail.value?.group || null);
const isMessageDetailGroup = computed(() => {
@@ -795,19 +806,25 @@ function closeGroupPanel() {
clearMuteSaveFeedback();
}
-async function loadGroupDetail() {
+async function loadGroupDetail() {
if (!session.userId || !activeConversation.value?.target) {
return null;
}
- groupBusy.value = true;
- try {
- groupDetail.value = await imClient.getGroupDetail(session.userId, activeConversation.value.target);
+ const requestedConversationId = activeConversation.value.id;
+ const requestedTarget = activeConversation.value.target;
+ groupBusy.value = true;
+ try {
+ const detail = await imClient.getGroupDetail(session.userId, requestedTarget);
+ if (activeConversation.value?.id !== requestedConversationId) return null;
+ groupDetail.value = detail;
return groupDetail.value;
} catch (error) {
- conversations.setActionError(error.message || '群资料加载失败');
+ if (activeConversation.value?.id === requestedConversationId) {
+ conversations.setActionError(error.message || '群资料加载失败');
+ }
return null;
} finally {
- groupBusy.value = false;
+ if (activeConversation.value?.id === requestedConversationId) groupBusy.value = false;
}
}
@@ -826,19 +843,26 @@ async function openGroupMembers() {
await loadGroupMembers();
}
-async function loadGroupMembers() {
- groupBusy.value = true;
- try {
- groupMembers.value = await imClient.getGroupMembers(session.userId, activeConversation.value.target);
+async function loadGroupMembers({ silent = false } = {}) {
+ const requestedConversationId = activeConversation.value?.id;
+ const requestedTarget = activeConversation.value?.target;
+ if (!session.userId || !requestedConversationId || !requestedTarget) return [];
+ groupBusy.value = true;
+ try {
+ const members = await imClient.getGroupMembers(session.userId, requestedTarget);
+ if (activeConversation.value?.id !== requestedConversationId) return [];
+ groupMembers.value = members;
selectedAdminIds.value = groupMembers.value
.filter(member => member.role === 'admin')
.map(member => member.uid);
return groupMembers.value;
- } catch (error) {
- conversations.setActionError(error.message || '群员加载失败');
+ } catch (error) {
+ if (!silent && activeConversation.value?.id === requestedConversationId) {
+ conversations.setActionError(error.message || '群员加载失败');
+ }
return [];
} finally {
- groupBusy.value = false;
+ if (activeConversation.value?.id === requestedConversationId) groupBusy.value = false;
}
}
@@ -1113,7 +1137,9 @@ onBeforeUnmount(() => {
watch(
() => activeConversation.value?.id,
async () => {
- closeGroupMenu();
+ conversations.actionError = '';
+ conversations.actionNotice = '';
+ closeGroupMenu();
closeSingleProfile();
closeGroupPanel();
groupDetail.value = null;
@@ -1124,7 +1150,7 @@ watch(
transferTargetId.value = '';
manageSection.value = '';
if (isGroupConversation.value) {
- await loadGroupMembers();
+ await loadGroupMembers({ silent: true });
}
}
, { immediate: true });
diff --git a/src/components/chat/MessageComposer.vue b/src/components/chat/MessageComposer.vue
index 4d7364f..f660e52 100644
--- a/src/components/chat/MessageComposer.vue
+++ b/src/components/chat/MessageComposer.vue
@@ -17,8 +17,9 @@
×