110 lines
6.1 KiB
Plaintext
110 lines
6.1 KiB
Plaintext
<view class="chat-page">
|
||
<scroll-view class="chat-msg-list" scroll-y="true"
|
||
scroll-into-view="{{scrollToView}}"
|
||
refresher-enabled="{{true}}"
|
||
refresher-triggered="{{isRefreshing}}"
|
||
bindrefresherrefresh="onPullDownRefresh"
|
||
style="top: 20rpx; bottom: calc({{bottomSafeHeight}}rpx + {{keyboardHeight}}px + env(safe-area-inset-bottom) + 20rpx);">
|
||
<view class="chat-loading-more" wx:if="{{loadingHistory}}">加载更早消息...</view>
|
||
<block wx:for="{{messages}}" wx:key="messageId">
|
||
<view class="chat-msg-wrapper" data-messageid="{{item.messageId}}" bindlongpress="showAction">
|
||
<view class="chat-time-tag" wx:if="{{item.showTime}}">{{item.formattedTime}}</view>
|
||
<view class="chat-msg-row {{item.senderId === currentUser.id ? 'chat-msg-row--right' : 'chat-msg-row--left'}}">
|
||
<!-- 对方头像(客服) -->
|
||
<image wx:if="{{item.senderId !== currentUser.id}}" class="chat-avatar" src="{{defaultAvatarUrl}}" mode="aspectFill" binderror="onTeamAvatarError" />
|
||
<view class="chat-bubble {{item.senderId === currentUser.id ? 'chat-bubble--right' : 'chat-bubble--left'}}"
|
||
data-messageid="{{item.messageId}}"
|
||
data-text="{{item.type==='text' ? item.payload.text : ''}}"
|
||
bindtap="{{item.type==='text' ? 'onBubbleTap' : (item.type==='image' ? 'previewImage' : '')}}"
|
||
data-url="{{item.type==='image' ? item.payload.url : ''}}">
|
||
<text wx:if="{{item.type === 'text'}}" class="chat-msg-text">{{item.payload.text}}</text>
|
||
<image wx:elif="{{item.type === 'image'}}" class="chat-msg-image" src="{{item.payload.url}}" mode="widthFix" data-url="{{item.payload.url}}" bindtap="previewImage"/>
|
||
<view wx:elif="{{item.type === 'order'}}" class="chat-order-bubble">
|
||
<text class="chat-order-label">📋 订单消息</text>
|
||
<view class="chat-order-info">
|
||
<text>订单号:{{item.payload.dingdan_id || '无'}}</text>
|
||
<text>服务:{{item.payload.jieshao || ''}}</text>
|
||
<text style="color:#e6a23c;font-weight:bold">¥{{item.payload.jine}}</text>
|
||
</view>
|
||
<button class="chat-copy-btn" catchtap="showOrderDetailPopup" data-order="{{item.payload}}" size="mini">查看详情</button>
|
||
</view>
|
||
<text wx:else class="chat-msg-text">{{item.payload.text || '[未知消息]'}}</text>
|
||
</view>
|
||
<!-- 自己头像 -->
|
||
<image wx:if="{{item.senderId === currentUser.id}}" class="chat-avatar" src="{{currentUser.avatar || defaultAvatarUrl}}" mode="aspectFill" binderror="onSelfAvatarError" />
|
||
</view>
|
||
<!-- 🔥 已读/未读标签已彻底移除 -->
|
||
</view>
|
||
</block>
|
||
<view id="msg-bottom" style="height:56rpx;"></view>
|
||
</scroll-view>
|
||
|
||
<!-- 底部输入区域(保持不变) -->
|
||
<view class="chat-input-area" style="bottom: {{keyboardHeight}}px; padding-bottom: calc(10rpx + env(safe-area-inset-bottom));">
|
||
<view class="chat-plus-panel {{showPlusPanel ? 'show' : ''}}" catchtap="closePlusPanel">
|
||
<view class="chat-plus-grid">
|
||
<view class="chat-plus-item" catchtap="openEmojiFromPlus">
|
||
<text class="chat-plus-icon">😀</text>
|
||
<text class="chat-plus-label">表情</text>
|
||
</view>
|
||
<view class="chat-plus-item" catchtap="chooseImage">
|
||
<text class="chat-plus-icon">📷</text>
|
||
<text class="chat-plus-label">图片</text>
|
||
</view>
|
||
<view class="chat-plus-item" catchtap="openOrderSender">
|
||
<text class="chat-plus-icon">📋</text>
|
||
<text class="chat-plus-label">订单</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<view class="chat-emoji-mask" wx:if="{{showEmojiPanel}}" catchtap="closeEmojiPanel"></view>
|
||
<view class="chat-emoji-panel {{showEmojiPanel ? 'show' : ''}}">
|
||
<scroll-view scroll-y="true" class="chat-emoji-scroll">
|
||
<view class="chat-emoji-grid">
|
||
<block wx:for="{{emojiList}}" wx:key="*this">
|
||
<view class="chat-emoji-item" data-emoji="{{item}}" catchtap="insertEmoji">{{item}}</view>
|
||
</block>
|
||
</view>
|
||
</scroll-view>
|
||
</view>
|
||
|
||
<view class="chat-pending-image" wx:if="{{pendingImage}}">
|
||
<image class="chat-pending-thumb" src="{{pendingImage}}" mode="aspectFill" />
|
||
<view class="chat-pending-remove" catchtap="clearPendingImage">✕</view>
|
||
</view>
|
||
|
||
<view class="chat-write-row">
|
||
<input class="chat-text-input" placeholder="消息" value="{{inputText}}" bindinput="onInput" adjust-position="{{false}}" bindkeyboardheightchange="onKeyboardHeightChange" cursor-spacing="10"/>
|
||
<view class="chat-send-btn" bindtap="sendMessage">发送</view>
|
||
<view class="chat-plus-btn" bindtap="togglePlusPanel">
|
||
<text class="chat-plus-icon-single">➕</text>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 文本双击放大弹窗 -->
|
||
<view class="chat-detail-modal" wx:if="{{showDetailModal}}" catchtap="hideDetail">
|
||
<view class="chat-detail-content" catchtap="noop">
|
||
<text class="chat-detail-text" user-select="true">{{detailText}}</text>
|
||
<button class="chat-copy-btn" bindtap="copyDetail">复制</button>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 订单详情弹窗 -->
|
||
<view class="chat-detail-modal" wx:if="{{showOrderDetail}}" catchtap="hideOrderDetail">
|
||
<view class="chat-detail-content" catchtap="noop">
|
||
<view class="chat-detail-text">订单详情</view>
|
||
<view class="chat-detail-text">订单号:{{detailOrder.dingdan_id}}</view>
|
||
<view class="chat-detail-text">服务描述:{{detailOrder.jieshao}}</view>
|
||
<view class="chat-detail-text">金额:¥{{detailOrder.jine}}</view>
|
||
<view class="chat-detail-text">类型:{{detailOrder.leixing || '无'}}</view>
|
||
<view class="chat-detail-text">时间:{{detailOrder.shijian || '无'}}</view>
|
||
<button class="chat-copy-btn" catchtap="hideOrderDetail">关闭</button>
|
||
</view>
|
||
</view>
|
||
|
||
<!-- 订单发送组件 -->
|
||
<order-sender visible="{{showOrderSender}}" bind:send="onSendOrder" bind:close="closeOrderSender" />
|
||
</view>
|