Files
medical-mall/unpackage/cache/.app-android/sourcemap/pages/mall/consumer/chat.kt.map

1 line
27 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"version":3,"sources":["pages/mall/consumer/chat.uvue","pages/user/profile.uvue","pages/mall/consumer/index.uvue","pages/user/terms.uvue","pages/user/login.uvue","pages/mall/consumer/settings.uvue","pages/user/center.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<!-- pages/mall/consumer/chat.uvue -->\r\n<template>\r\n <view class=\"chat-page\">\r\n <!-- 聊天头部 -->\r\n <view class=\"chat-header\" :style=\"{ paddingTop: navPaddingTop }\">\r\n <view class=\"header-back\" @click=\"goBack\">\r\n <text class=\"back-icon\"></text>\r\n </view>\r\n <view class=\"header-info\">\r\n <text class=\"chat-title\">{{ headerTitle }}</text>\r\n <text class=\"chat-status\">在线</text>\r\n </view>\r\n <view class=\"header-actions\">\r\n <text class=\"action-icon\" @click=\"showMoreActions\">⋮</text>\r\n </view>\r\n </view>\r\n \r\n <!-- 聊天内容 -->\r\n <scroll-view \r\n scroll-y \r\n class=\"chat-content\"\r\n :scroll-into-view=\"scrollToView\"\r\n scroll-with-animation\r\n >\r\n <!-- 聊天消息列表 -->\r\n <view class=\"chat-messages\">\r\n <!-- 系统消息 -->\r\n <view class=\"message-item system\">\r\n <text class=\"system-text\">客服 小美 已接入,请描述您的问题</text>\r\n </view>\r\n \r\n <!-- 时间分割线 -->\r\n <view class=\"time-divider\">\r\n <text class=\"time-text\">今天 14:30</text>\r\n </view>\r\n \r\n <!-- 消息项 -->\r\n <view \r\n v-for=\"message in messages\" \r\n :key=\"message.id\"\r\n :class=\"['message-item', message.type]\"\r\n :id=\"'msg-' + message.id\"\r\n >\r\n <!-- 对方消息 -->\r\n <view v-if=\"message.type === 'received'\" class=\"message-wrapper\">\r\n <image \r\n class=\"avatar\" \r\n src=\"/static/icons/shop-default.png\" \r\n mode=\"aspectFill\"\r\n />\r\n <view class=\"message-content-wrapper\">\r\n <text class=\"sender-name\">{{ headerTitle }}</text>\r\n <view class=\"message-bubble\">\r\n <text class=\"message-text\">{{ message.content }}</text>\r\n <text class=\"message-time\">{{ message.time }}</text>\r\n </view>\r\n </view>\r\n </view>\r\n \r\n <!-- 我的消息 -->\r\n <view v-else class=\"message-wrapper me\">\r\n <view class=\"message-content-wrapper\">\r\n <view class=\"message-bubble me\">\r\n <text class=\"message-text\">{{ message.content }}</text>\r\n <text class=\"message-time\">{{ message.time }}</text>\r\n </view>\r\n </view>\r\n <image \r\n class=\"avatar me\" \r\n src=\"/static/avatar-default.png\" \r\n mode=\"aspectFill\"\r\n />\r\n </view>\r\n </view>\r\n </view>\r\n </scroll-view>\r\n \r\n <!-- 聊天输入区 -->\r\n <view class=\"chat-input\">\r\n <view class=\"input-tools\">\r\n <text class=\"tool-icon\" @click=\"showEmojiPicker\">😊</text>\r\n <text class=\"tool-icon\" @click=\"showImagePicker\">📷</text>\r\n <text class=\"tool-icon\" @click=\"showMoreTools\"></text>\r\n </view>\r\n \r\n <view class=\"input-wrapper\">\r\n <input \r\n class=\"message-input\" \r\n v-model=\"inputMessage\"\r\n placeholder=\"请输入消息...\"\r\n :focus=\"inputFocus\"\r\n @confirm=\"sendMessage\"\r\n confirm-type=\"send\"\r\n />\r\n <button \r\n class=\"send-button\" \r\n :class=\"{ active: inputMessage.trim() }\" \r\n @click=\"sendMessage\"\r\n >\r\n 发送\r\n </button>\r\n </view>\r\n </view>\r\n \r\n <!-- 表情选择器 -->\r\n <scroll-view v-if=\"showEmoji\" class=\"emoji-picker\" direction=\"vertical\">\r\n <view class=\"emoji-category\">\r\n <text \r\n v-for=\"emoji in emojiList\" \r\n :key=\"emoji\"\r\n class=\"emoji-item\"\r\n @click=\"insertEmoji(emoji)\"\r\n >\r\n {{ emoji }}\r\n </text>\r\n </view>\r\n </scroll-view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, reactive, onMounted, onUnmounted, nextTick } from 'vue'\r\nimport { supabaseService, type ChatMessage } from '@/utils/supabaseService.uts'\r\nimport supa from '@/components/supadb/aksupainstance.uts'\r\nimport type { AkSupaRealtimeChannel } from '@/components/supadb/aksupa.uts'\r\nimport { getCurrentUser } from '@/utils/store.uts'\r\n\r\ntype UiChatMessage = {\r\n\tid: string\r\n\ttype: string\r\n\tcontent: string\r\n\ttime: string\r\n}\r\n\r\n// 响应式数据\r\nconst messages = ref<UiChatMessage[]>([])\r\nconst inputMessage = ref<string>('')\r\nconst inputFocus = ref<boolean>(false)\r\nconst showEmoji = ref<boolean>(false)\r\nconst scrollToView = ref<string>('')\r\nconst currentUserId = ref<string>('')\r\nconst merchantId = ref<string>('') // 商家ID\r\nconst headerTitle = ref<string>('在线客服')\r\nconst navPaddingTop = ref<string>('30px') // 默认值,包含状态栏高度+原有内边距\r\nlet realtimeChannel: AkSupaRealtimeChannel | null = null\r\n\r\n// 模拟表情列表\r\nconst emojiList = ['😊', '😂', '🤣', '😍', '😘', '🥰', '😭', '😡', '👍', '👏', '🙏', '🎉', '❤️', '🔥', '⭐']\r\n\r\nfunction scrollToBottom(): void {\r\n nextTick(() => {\r\n if (messages.value.length > 0) {\r\n const lastMsgId = messages.value[messages.value.length - 1].id\r\n scrollToView.value = 'msg-' + lastMsgId\r\n }\r\n })\r\n}\r\n\r\nfunction getCurrentTime(): string {\r\n const now = new Date()\r\n const hours = now.getHours().toString().padStart(2, '0')\r\n const minutes = now.getMinutes().toString().padStart(2, '0')\r\n return `${hours}:${minutes}`\r\n}\r\n\r\nfunction setupRealtimeSubscription(): void {\r\n\tconsole.log('开始建立聊天实时订阅...')\r\n\tconst filter = ({\r\n\t\tevent: 'INSERT',\r\n\t\tschema: 'public',\r\n\t\ttable: 'ml_chat_messages'\r\n\t} as UTSJSONObject)\r\n\r\n\trealtimeChannel = supa.channel('public:ml_chat_messages')\r\n\t\t.on('postgres_changes', filter, (payload: any) => {\r\n\t\t\tconst payloadObj = (payload instanceof UTSJSONObject) ? (payload as UTSJSONObject) : (JSON.parse(JSON.stringify(payload ?? {})) as UTSJSONObject)\r\n\t\t\tconst newMsgAny = payloadObj.get('new')\r\n\t\t\tif (newMsgAny == null) return\r\n\t\t\tconst newMsg = (newMsgAny instanceof UTSJSONObject) ? (newMsgAny as UTSJSONObject) : (JSON.parse(JSON.stringify(newMsgAny)) as UTSJSONObject)\r\n\t\t\tconsole.log('收到新消息:', newMsg)\r\n\r\n\t\t\tconst senderId = newMsg.getString('sender_id') ?? ''\r\n\t\t\tconst receiverId = newMsg.getString('receiver_id') ?? ''\r\n\r\n\t\t\tif (senderId === currentUserId.value) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (receiverId === currentUserId.value) {\r\n\t\t\t\tif (merchantId.value != '' && senderId !== merchantId.value) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst createdAt = newMsg.getString('created_at') ?? new Date().toISOString()\r\n\t\t\t\tconst date = new Date(createdAt)\r\n\t\t\t\tconst timeStr = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`\r\n\r\n\t\t\t\tconst incomingMsg: UiChatMessage = {\r\n\t\t\t\t\tid: newMsg.getString('id') ?? Date.now().toString(),\r\n\t\t\t\t\ttype: 'received',\r\n\t\t\t\t\tcontent: newMsg.getString('content') ?? '',\r\n\t\t\t\t\ttime: timeStr\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmessages.value.push(incomingMsg)\r\n\t\t\t\tscrollToBottom()\r\n\t\t\t}\r\n\t\t})\r\n\t\t.subscribe((status: string, err: any | null) => {\r\n\t\t\tconsole.log('订阅状态:', status)\r\n\t\t})\r\n}\r\n\r\nasync function loadChatHistory(): Promise<void> {\r\n\tlet rawMsgs: ChatMessage[] = []\r\n\r\n\tif (merchantId.value != '') {\r\n\t\trawMsgs = await supabaseService.getChatMessages(merchantId.value)\r\n\t} else {\r\n\t\tconsole.warn(\"No merchant ID provided for chat\")\r\n\t\treturn\r\n\t}\r\n\r\n\tmessages.value = rawMsgs.reverse().map((m: ChatMessage): UiChatMessage => {\r\n\t\tconst date = new Date(m.created_at ?? new Date().toISOString())\r\n\t\tconst timeStr = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`\r\n\r\n\t\tconst sender = m.sender_id ?? ''\r\n\t\tconst msgType = (currentUserId.value != '' && sender == currentUserId.value) ? 'sent' : 'received'\r\n\t\tconst rawId = (m.id ?? '').toString()\r\n\t\tconst msgId = rawId !== '' ? rawId : Date.now().toString()\r\n\t\treturn {\r\n\t\t\tid: msgId,\r\n\t\t\ttype: msgType,\r\n\t\t\tcontent: m.content ?? '',\r\n\t\t\ttime: timeStr\r\n\t\t}\r\n\t})\r\n\r\n\tsetTimeout(() => {\r\n\t\tscrollToBottom()\r\n\t}, 100)\r\n}\r\n\r\n// 生命周期\r\nonLoad((options: any) => {\r\n // 动态获取状态栏高度\r\n const sysInfo = uni.getSystemInfoSync()\r\n const statusBarH = sysInfo.statusBarHeight\r\n // 状态栏高度 + 10px 原有顶部内边距\r\n navPaddingTop.value = (statusBarH + 10) + 'px'\r\n\r\n\tconst optObj = (options instanceof UTSJSONObject) ? (options as UTSJSONObject) : (JSON.parse(JSON.stringify(options ?? {})) as UTSJSONObject)\r\n\tconst mid = optObj.getString('merchantId') ?? ''\r\n\tif (mid !== '') {\r\n\t\tmerchantId.value = mid\r\n\t}\r\n\tconst mname = optObj.getString('merchantName') ?? ''\r\n\tif (mname !== '') {\r\n\t\theaderTitle.value = mname\r\n\t}\r\n})\r\n\r\nonMounted(() => {\r\n\tsupabaseService.ensureSession().then((uid) => {\r\n\t\tif (uid != null) {\r\n\t\t\tcurrentUserId.value = uid\r\n\t\t} else {\r\n\t\t\tgetCurrentUser().then((user) => {\r\n\t\t\t\tif (user != null) {\r\n\t\t\t\t\tcurrentUserId.value = user.id ?? ''\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tloadChatHistory()\r\n\t\tsetupRealtimeSubscription()\r\n\t})\r\n})\r\n\r\nonUnmounted(() => {\r\n if (realtimeChannel != null) {\r\n supa.removeChannel(realtimeChannel!!)\r\n }\r\n})\r\n\r\nconst sendMessage = async () => {\r\n const content = inputMessage.value.trim()\r\n if (content == '') return\r\n \r\n // 添加发送的消息 (乐观更新)\r\n const newMessage: UiChatMessage = {\r\n id: Date.now().toString(),\r\n type: 'sent',\r\n content: content,\r\n time: getCurrentTime()\r\n }\r\n \r\n messages.value.push(newMessage)\r\n inputMessage.value = ''\r\n \r\n // 滚动到底部\r\n scrollToBottom()\r\n\r\n // 发送到 Supabase\r\n if (merchantId.value != '') {\r\n const success = await supabaseService.sendMessage(merchantId.value, content)\r\n if (!success) {\r\n uni.showToast({\r\n title: '发送失败',\r\n icon: 'none'\r\n })\r\n }\r\n }\r\n}\r\n\r\n// 模拟客服回复 (已禁用,改用 Realtime)\r\n/*\r\nconst simulateCustomerReply = async () => {\r\n // ...\r\n}\r\n*/\r\n\r\n/* 移除不再使用的 simulateCustomerReply 和 addReceivedMessage */\r\n\r\n// 插入表情\r\nfunction insertEmoji(emoji: string): void {\r\n inputMessage.value += emoji\r\n inputFocus.value = true\r\n}\r\n\r\n// 显示表情选择器\r\nfunction showEmojiPicker(): void {\r\n showEmoji.value = !showEmoji.value\r\n}\r\n\r\n// 显示图片选择器\r\nfunction showImagePicker(): void {\r\n uni.chooseImage({\r\n count: 1,\r\n success: (res) => {\r\n console.log('选择图片:', res.tempFilePaths)\r\n // 这里可以处理图片上传\r\n }\r\n })\r\n}\r\n\r\n// 显示更多工具\r\nfunction showMoreTools(): void {\r\n uni.showActionSheet({\r\n itemList: ['发送位置', '发送文件', '发送语音'],\r\n success: (res) => {\r\n console.log('选择工具:', res.tapIndex)\r\n }\r\n })\r\n}\r\n\r\n// 显示更多操作\r\nfunction showMoreActions(): void {\r\n uni.showActionSheet({\r\n itemList: ['投诉客服', '结束对话', '清除记录'],\r\n success: (res) => {\r\n switch (res.tapIndex) {\r\n case 0:\r\n uni.navigateTo({ url: '/pages/mall/consumer/complaint' })\r\n break\r\n case 1:\r\n uni.showModal({\r\n title: '确认结束',\r\n content: '确定要结束本次对话吗?',\r\n success: (res) => {\r\n if (res.confirm) {\r\n uni.navigateBack()\r\n }\r\n }\r\n })\r\n break\r\n case 2:\r\n uni.showModal({\r\n title: '确认清除',\r\n content: '确定要清除聊天记录吗?',\r\n success: (res) => {\r\n if (res.confirm) {\r\n messages.value = []\r\n }\r\n }\r\n })\r\n break\r\n }\r\n }\r\n })\r\n}\r\n\r\n// 返回\r\nconst goBack = () => {\r\n uni.navigateBack()\r\n}\r\n</script>\r\n\r\n<style>\r\n.chat-page {\r\n width: 100%;\r\n flex: 1;\r\n background-color: #f5f5f5;\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n\r\n/* 聊天头部 */\r\n.chat-header {\r\n background-color: white;\r\n padding: 10px 15px;\r\n /* padding-top 由内联样式控制 */\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: space-between;\r\n border-bottom: 1px solid #eee;\r\n}\r\n\r\n.header-back {\r\n width: 40px;\r\n}\r\n\r\n.back-icon {\r\n font-size: 24px;\r\n color: #333;\r\n}\r\n\r\n.header-info {\r\n flex: 1;\r\n text-align: center;\r\n}\r\n\r\n.chat-title {\r\n font-size: 16px;\r\n font-weight: bold;\r\n color: #333;\r\n margin-bottom: 2px;\r\n}\r\n\r\n.chat-status {\r\n font-size: 12px;\r\n color: #34c759;\r\n}\r\n\r\n.header-actions .action-icon {\r\n font-size: 20px;\r\n color: #333;\r\n width: 40px;\r\n text-align: right;\r\n}\r\n\r\n/* 聊天内容区 */\r\n.chat-content {\r\n flex: 1;\r\n padding: 15px;\r\n padding-bottom: 70px; /* 为输入区留出空间 */\r\n}\r\n\r\n/* 系统消息 */\r\n.message-item.system {\r\n text-align: center;\r\n margin-bottom: 20px;\r\n}\r\n\r\n.system-text {\r\n font-size: 12px;\r\n color: #999;\r\n background-color: #f0f0f0;\r\n padding: 5px 15px;\r\n border-radius: 15px;\r\n\r\n}\r\n\r\n/* 时间分割线 */\r\n.time-divider {\r\n text-align: center;\r\n margin: 20px 0;\r\n}\r\n\r\n.time-text {\r\n font-size: 12px;\r\n color: #999;\r\n background-color: #f0f0f0;\r\n padding: 3px 10px;\r\n border-radius: 10px;\r\n}\r\n\r\n/* 消息项 */\r\n.message-wrapper {\r\n display: flex;\r\n flex-direction: row;\r\n margin-bottom: 15px;\r\n}\r\n\r\n.message-wrapper.me {\r\n justify-content: flex-end;\r\n}\r\n\r\n.avatar {\r\n width: 40px;\r\n height: 40px;\r\n border-radius: 20px;\r\n margin-right: 10px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.avatar.me {\r\n margin-right: 0;\r\n margin-left: 10px;\r\n /* order: 2; removed for uni-app-x */\r\n}\r\n\r\n.message-content-wrapper {\r\n /* max-width removed */\r\n}\r\n\r\n.sender-name {\r\n font-size: 12px;\r\n color: #999;\r\n margin-bottom: 5px;\r\n}\r\n\r\n.message-bubble {\r\n background-color: white;\r\n padding: 10px 15px;\r\n border-radius: 18px;\r\n position: relative;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\r\n /* max-width wrap removed */\r\n}\r\n\r\n.message-bubble.me {\r\n background-color: #95ec69;\r\n border-bottom-right-radius: 4px;\r\n}\r\n\r\n.message-bubble-not-me .message-content {\r\n border-bottom-left-radius: 4px;\r\n}\r\n\r\n.message-text {\r\n font-size: 15px;\r\n color: #333;\r\n line-height: 1.4;\r\n margin-bottom: 5px;\r\n}\r\n\r\n.message-time {\r\n font-size: 11px;\r\n color: #999;\r\n text-align: right;\r\n}\r\n\r\n/* 聊天输入区 */\r\n.chat-input {\r\n background-color: white;\r\n border-top: 1px solid #eee;\r\n padding: 10px 15px;\r\n position: fixed;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n z-index: 100;\r\n}\r\n\r\n.input-tools {\r\n display: flex;\r\n flex-direction: row;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.tool-icon {\r\n font-size: 20px;\r\n margin-right: 15px;\r\n color: #666;\r\n}\r\n\r\n.input-wrapper {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n}\r\n\r\n.message-input {\r\n flex: 1;\r\n background-color: #f5f5f5;\r\n border-radius: 20px;\r\n padding: 10px 15px;\r\n font-size: 15px;\r\n margin-right: 10px;\r\n min-height: 40px;\r\n max-height: 100px;\r\n}\r\n\r\n.send-button {\r\n background-color: #ccc;\r\n color: white;\r\n border: none;\r\n border-radius: 20px;\r\n padding: 8px 20px;\r\n font-size: 14px;\r\n min-width: 60px;\r\n transition: all 0.3s ease;\r\n}\r\n\r\n.send-button.active {\r\n background-color: #ff5000;\r\n}\r\n\r\n/* 表情选择器 */\r\n.emoji-picker {\r\n background-color: white;\r\n border-top: 1px solid #eee;\r\n padding: 10px;\r\n height: 200px;\r\n /* overflow-y removed */\r\n position: fixed;\r\n bottom: 60px;\r\n left: 0;\r\n right: 0;\r\n z-index: 99;\r\n}\r\n\r\n.emoji-category {\r\n display: flex;\r\n flex-direction: row;\r\n flex-wrap: wrap;\r\n}\r\n\r\n.emoji-item {\r\n font-size: 24px;\r\n padding: 8px;\r\n width: 45px;\r\n height: 45px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n/* 响应式适配 removed for strict uv-app-x compliance */\r\n</style>\r\n",null,null,null,null,null,null,null],"names":[],"mappings":"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"}