| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997 |
- <template>
- <view class="chatInterface" @contextmenu.prevent="">
- <view class="scroll-view">
- <image v-if="history.loading" class="history-loaded" src="/static/images/loading.svg"/>
- <view v-else :class="history.allLoaded ? 'history-loaded':'load'" @click="loadHistoryMessage(false)">
- <view>{{ history.allLoaded ?$t('GoeasyExchange.nohistory'):$t('GoeasyExchange.gethistory') }}</view>
- </view>
- <checkbox-group @change="selectMessages">
- <!--消息记录-->
- <view v-for="(message,index) in history.messages" :key="message.messageId">
- <!--时间显示,类似于微信,隔5分钟不发言,才显示时间-->
- <view class="time-lag">
- {{ renderMessageDate(message, index) }}
- </view>
- <view class="message-recalled" v-if="message.recalled">
- <view v-if="message.recaller.id === currentUser.id" class="message-recalled-self">
- <view>{{$t('GoeasyExchange.nichlytxx')}}</view>
- <span v-if="message.type === 'text' && Date.now()-message.timestamp< 60 * 1000 "
- @click="editRecalledMessage(message.payload.text)">{{$t('GoeasyExchange.chongxbj')}}</span>
- </view>
- <view v-else>{{ message.recaller.data.name }}{{$t('GoeasyExchange.nichlytxx')}}</view>
- </view>
- <view class="message-item" v-else>
- <view class="message-item-checkbox">
- <checkbox v-show="messageSelector.visible && message.status !== 'sending'" :value="message.messageId"
- :checked="messageSelector.messages.includes(message)"/>
- </view>
- <view class="message-item-content" :class="{'self' : message.senderId === currentUser.id}">
- <view class="avatar">
- <image :src="message.senderId === currentUser.id? SplicingImgUrl(currentUser.avatar) : SplicingImgUrl(friend.avatar)"></image>
- </view>
- <view class="content" @click.right="showActionPopup(message)" @longpress="showActionPopup(message)">
- <view class="message-payload">
- <b class="pending" v-if="message.status === 'sending'"></b>
- <b class="send-fail" v-if="message.status === 'fail'"></b>
- <view v-if="message.type === 'text'" v-html="renderTextMessage(message)"></view>
- <image v-if="message.type === 'image'"
- :data-url="message.payload.url"
- :src="message.payload.thumbnail"
- class="image-content"
- @click="showImageFullScreen"
- ></image>
- <image v-if="message.type === 'Privateimage'"
- :data-url="SplicingImgUrl(message.payload.image)"
- :src="SplicingImgUrl(message.payload.image)"
- class="image-content"
- @click="showImageFullScreen"
- ></image>
- <view class="video-snapshot" v-if="message.type === 'video'" :data-url="message.payload.video.url"
- @click="playVideo">
- <image
- :src="message.payload.thumbnail.url"
- :style="{height: getImageHeight(message.payload.thumbnail.width,message.payload.thumbnail.height)+'rpx' }"
- mode="heightFix"
- ></image>
- <view class="video-play-icon"></view>
- </view>
- <view class="file-content" v-if="message.type === 'file'">
- <view class="file-info">
- <span class="file-name">{{ message.payload.name }}</span>
- <span class="file-size">{{ (message.payload.size / 1024).toFixed(2) }}KB</span>
- </view>
- <image class="file-img" src="/static/images/file-icon.png"></image>
- </view>
- <view v-if="message.type ==='audio'" class="audio-content" @click="playAudio(message)">
- <view class="audio-facade" :style="{width:Math.ceil(message.payload.duration)*7 + 50 + 'px'}">
- <view
- class="audio-facade-bg"
- :class="{'play-icon':audioPlayer.playingMessage && audioPlayer.playingMessage.messageId === message.messageId}"
- ></view>
- <view>{{Math.ceil(message.payload.duration) || 1}}<span>"</span></view>
- </view>
- </view>
- <view v-if="message.type === 'order'" class="order-content">
- <view class="order-id">{{$t('GoeasyExchange.dingdanhao')}}:{{ message.payload.id }}</view>
- <view class="order-body">
- <image :src="message.payload.url" class="order-img"></image>
- <view>
- <view class="order-name">{{ message.payload.name }}</view>
- <view class="order-info">
- <view class="order-price">{{ message.payload.price }}</view>
- <view class="order-count">{{$t('GoeasyExchange.gong')}}{{ message.payload.count }}{{$t('GoeasyExchange.jian')}}</view>
- </view>
- </view>
- </view>
- </view>
- </view>
- <view v-if="message.senderId === currentUser.id" :class="message.read ?'message-read':'message-unread'">
- <view v-if="message.status === 'success'">{{ message.read ? $t('GoeasyExchange.yidu') :$t('GoeasyExchange.weidu')}}</view>
- </view>
- </view>
- </view>
- </view>
- </view>
- </checkbox-group>
- </view>
- <view class="action-box" v-if="!videoPlayer.visible && !messageSelector.visible">
- <view class="action-top">
- <view @click="switchAudioKeyboard">
- <image class="more" v-if="audio.visible" src="/static/images/jianpan.png"></image>
- <image class="more" v-else src="/static/images/audio.png"></image>
- </view>
- <view v-if="audio.visible" class="record-input" @click="onRecordStart" @touchend.stop="onRecordEnd" @touchstart.stop="onRecordStart">
- {{ audio.recording ? $t('GoeasyExchange.songkfs') : $t('GoeasyExchange.anzhuly') }}
- </view>
- <!-- GoEasyIM最大支持3k的文本消息,如需发送长文本,需调整输入框maxlength值 -->
- <input v-else v-model="text" @confirm="sendTextMessage" class="consult-input" maxlength="700" :placeholder="$t('GoeasyExchange.fasongxx')" type="text" />
- <view @click="switchEmojiKeyboard">
- <image class="more" v-if="emoji.visible" src="/static/images/jianpan.png"></image>
- <image class="more" v-else src="/static/images/emoji.png"></image>
- </view>
- <view>
- <image @click="showOtherTypesMessagePanel()" class="more" src="/static/images/more.png"/>
- </view>
- <view v-if="text" class="send-btn-box">
- <text class="btn" @click="sendTextMessage()">{{$t('GoeasyExchange.fasong')}}</text>
- </view>
- </view>
- <!--展示表情列表-->
- <view class="action-bottom action-bottom-emoji" v-if="emoji.visible">
- <image class="emoji-item" v-for="(emojiItem, emojiKey, index) in emoji.map" :key="index"
- :src="emoji.url + emojiItem" @click="chooseEmoji(emojiKey)"></image>
- </view>
- <!--其他类型消息面板-->
- <view v-if="otherTypesMessagePanelVisible" class="action-bottom">
- <view class="more-icon">
- <image @click="sendPrivateMessage()" class="operation-icon" src="/static/images/picture.png"></image>
- <view class="operation-title">{{$t('GoeasyExchange.tupian')}}</view>
- </view>
- <view class="more-icon">
- <image @click="imcall()" class="operation-icon" src="/static/images/jietong.png"></image>
- <view class="operation-title">{{$t('GoeasyExchange.tonghua')}}</view>
- </view>
- <!-- <view class="more-icon">
- <image @click="sendVideoMessage()" class="operation-icon" src="/static/images/video.png"></image>
- <view class="operation-title">视频</view>
- </view>
- <view class="more-icon">
- <image @click="showOrderMessageList()" class="operation-icon" src="/static/images/order.png"></image>
- <view class="operation-title">订单</view>
- </view> -->
- </view>
- </view>
- <view class="action-popup" @touchmove.stop.prevent v-if="actionPopup.visible">
- <view class="layer"></view>
- <view class="action-list">
- <view class="action-item" @click="deleteSingleMessage">{{$t('GoeasyExchange.sanchu')}}</view>
- <view class="action-item" v-if="actionPopup.recallable" @click="recallMessage">{{$t('GoeasyExchange.chehui')}}</view>
- <view class="action-item" @click="showCheckBox">{{$t('GoeasyExchange.duoxuan')}}</view>
- <view class="action-item" @click="hideActionPopup">{{$t('GoeasyExchange.quxiao')}}</view>
- </view>
- </view>
- <view class="messageSelector-box" v-if="messageSelector.visible">
- <image class="messageSelector-btn" @click="deleteMultipleMessages" src="/static/images/delete.png"></image>
- </view>
- <view class="record-loading" v-if="audio.recording"></view>
- <video v-if="videoPlayer.visible" :src="videoPlayer.url" id="videoPlayer"
- @fullscreenchange="onVideoFullScreenChange"></video>
- <view v-if="orderList.visible" class="order-list">
- <view class="orders-content">
- <view class="title">
- <view>{{$t('GoeasyExchange.qingxuanzdd')}}</view>
- <view class="close" @click="hideOrderMessageList">×</view>
- </view>
- <view class="orders">
- <view
- v-for="(order, index) in orderList.orders"
- :key="index" class="order-item"
- @click="sendOrderMessage(order)"
- >
- <view class="order-id">{{$t('GoeasyExchange.dingdanhao')}}:{{ order.id }}</view>
- <view class="order-body">
- <image :src="order.url" class="order-img"></image>
- <view class="order-name">{{ order.name }}</view>
- <view class="order-right">
- <view class="order-price">{{ order.price }}</view>
- <view class="order-count">{{$t('GoeasyExchange.gong')}}{{ order.count }}{{$t('GoeasyExchange.jian')}}</view>
- </view>
- </view>
- </view>
- </view>
- </view>
- </view>
- </view>
- </template>
- <script>
- import EmojiDecoder from '@/pages/api/EmojiDecoder.js';
- import restApi from '@/pages/api/restapi';
- import {formatDate} from '@/pages/api/utils';
- import {
- UploadImage
- } from '@/pages/api/basic.js';
- const IMAGE_MAX_WIDTH = 200;
- const IMAGE_MAX_HEIGHT = 150;
- const recorderManager = uni.getRecorderManager();
- export default {
- name: 'privateChat',
- data() {
- const emojiUrl = 'https://imgcache.qq.com/open/qcloud/tim/assets/emoji/';
- const emojiMap = {
- '[么么哒]': 'emoji_3@2x.png',
- '[乒乓]': 'emoji_4@2x.png',
- '[便便]': 'emoji_5@2x.png',
- '[信封]': 'emoji_6@2x.png',
- '[偷笑]': 'emoji_7@2x.png',
- '[傲慢]': 'emoji_8@2x.png'
- };
- return {
- //聊天文本框
- text: '',
- friend: null,
- iscaller:false,
- issend:false,
- to: {},// 作为createMessage的参数
- currentUser: null,
- audioObj:null,
- soundPlay:false,
- //定义表情列表
- emoji: {
- url: emojiUrl,
- map: emojiMap,
- visible: false,
- decoder: new EmojiDecoder(emojiUrl, emojiMap),
- },
- //是否展示‘其他消息类型面板’
- otherTypesMessagePanelVisible: false,
- orderList: {
- orders: [],
- visible: false
- },
- history: {
- messages: [],
- allLoaded: false,
- loading: false
- },
- audio: {
- startTime: null,
- //语音录音中
- recording: false,
- //录音按钮展示
- visible: false
- },
- audioPlayer: {
- innerAudioContext: null,
- playingMessage: null,
- },
- videoPlayer: {
- visible: false,
- url: '',
- context: null
- },
- // 展示消息删除弹出框
- actionPopup: {
- visible: false,
- message: null,
- recallable: false,
- },
- // 消息选择
- messageSelector: {
- visible: false,
- messages: []
- }
- }
- },
- onLoad(option) {
- var systemInfo = uni.getSystemInfoSync();
- var isAndroid = systemInfo.platform.toLowerCase() === 'android';
- //聊天对象
- getApp().globalData.EXViewOpen=true;
- if(option.caller==1){
- this.iscaller=true;
- var friendinfo = uni.getStorageSync('imUser');
- this.friend = {
- id:'userid_'+friendinfo.userId,
- name:friendinfo.nickName,
- avatar:friendinfo.avatar
- }
- }
- else{
- var payload=uni.getStorageSync('impayload');
- this.doPushMessage(payload);
- if(!isAndroid){
- console.log('doPushMessageaudioObj')
- this.audioObj=uni.createInnerAudioContext();
- this.audioObj.src='hybrid/html/xuanfu/img/y800.mp3';
- this.audioObj.play();
- this.soundPlay=true;
- }
- }
- var userinfo = uni.getStorageSync('userInfo');
- this.currentUser={
- id:'userid_'+userinfo.userId,
- name:userinfo.nickName,
- avatar:userinfo.avatar
- };
- this.to = {
- id:this.friend.id,
- type: this.GoEasy.IM_SCENE.PRIVATE,
- data: {
- name: this.friend.name,
- avatar: this.friend.avatar
- }
- };
- this.initialGoEasyListeners();
- // 语音播放器
- this.initialAudioPlayer();
- // 录音监听器
- this.initRecorderListeners();
- },
- onShow() {
- this.otherTypesMessagePanelVisible = false;
- this.emoji.visible = false;
- },
- onReady() {
- this.loadHistoryMessage(true);
- this.videoPlayer.context = uni.createVideoContext('videoPlayer', this);
- // https://uniapp.dcloud.io/api/ui/navigationbar?id=setnavigationbartitle
- uni.setNavigationBarTitle({ title: this.friend.name });
- },
- onPullDownRefresh(e) {
- this.loadHistoryMessage(false);
- },
- onUnload() {
- if(this.soundPlay){
- this.audioObj.pause();
- }
- //退出聊天页面之前,清空监听器
- getApp().globalData.EXViewOpen=false;
- this.goEasy.im.off(this.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, this.onMessageReceived);
- this.goEasy.im.off(this.GoEasy.IM_EVENT.MESSAGE_DELETED, this.onMessageDeleted);
- //this.goEasy.im.off(this.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, this.onPrivateMessageReceived);
- },
- methods: {
- doPushMessage(str){
- if(str.indexOf("\\\"")!=-1){
- str=str.replace(/\\\"/g, '\"');
- str = str.replace(/\"{/g, '{');
- str = str.replace(/}\"/g, '}');
- }
- var obj = JSON.parse(str)
- this.friend = {
- id:'userid_'+obj.userId,
- name:obj.nickName,
- avatar:obj.avatar
- }
- console.log(obj);
- // this.imUser=obj;
- uni.setStorageSync('imUser',obj);
- },
- SplicingImgUrl(url){
- var baseUrl='https://backend.cityexpress168.com.vn/prod-api';
- if(!url){
- return '';
- }
- if(url.length<8){
- return '';
- }
- var http= url.substring(0,8);
- if(http==='https://'){
- return url;
- }
- else if(http==='/static/'){
- return url;
- }
- else{
- return (baseUrl+url);
- }
- return '';
- },
- //渲染文本消息,如果包含表情,替换为图片
- //todo:本不需要该方法,可以在标签里完成,但小程序有兼容性问题,被迫这样实现
- renderTextMessage(message) {
- return '<span class="text-content">' + this.emoji.decoder.decode(message.payload.text) + '</span>'
- },
- //像微信那样显示时间,如果有几分钟没发消息了,才显示时间
- //todo:本不需要该方法,可以在标签里完成,但小程序有兼容性问题,被迫这样实现
- renderMessageDate(message, index) {
- if (index === 0) {
- return formatDate(message.timestamp)
- } else {
- if (message.timestamp - this.history.messages[index - 1].timestamp > 5 * 60 * 1000) {
- return formatDate(message.timestamp)
- }
- }
- return '';
- },
- initialGoEasyListeners() {
- // 监听私聊消息
- this.goEasy.im.on(this.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, this.onMessageReceived);
- //监听消息删除
- this.goEasy.im.on(this.GoEasy.IM_EVENT.MESSAGE_DELETED, this.onMessageDeleted);
- //监听自定义消息
- //this.goEasy.im.on(this.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, this.onPrivateMessageReceived);
- },
- onMessageReceived (message) {
- console.log(message);
- let senderId = message.senderId;
- let receiverId = message.receiverId;
- let friendId = this.currentUser.id === senderId ? receiverId : senderId;
- if (friendId === this.friend.id) {
-
- this.history.messages.push(message);
- console.log(this.history.messages);
- //聊天时,收到消息标记为已读
- this.markPrivateMessageAsRead();
- //收到新消息,是滚动到最底部
- this.scrollToBottom();
- }
- },
- onMessageDeleted (deletedMessages) {
- deletedMessages.forEach(message => {
- let senderId = message.senderId;
- let receiverId = message.receiverId;
- let friendId = this.currentUser.id === senderId ? receiverId : senderId;
- if (friendId === this.friend.id) {
- let index = this.history.messages.indexOf(message);
- if (index > -1) {
- this.history.messages.splice(index, 1);
- }
- }
- });
- },
- onPrivateMessageReceived(message){
- let senderId = message.senderId;
- let receiverId = message.receiverId;
- let friendId = this.currentUser.id === senderId ? receiverId : senderId;
- if (friendId === this.friend.id) {
- this.history.messages.push(message);
- //聊天时,收到消息标记为已读
- this.markPrivateMessageAsRead();
- //收到新消息,是滚动到最底部
- this.scrollToBottom();
- }
- },
- initialAudioPlayer () {
- this.audioPlayer.innerAudioContext = uni.createInnerAudioContext();
- this.audioPlayer.innerAudioContext.onEnded(() => {
- this.audioPlayer.playingMessage = null;
- });
- this.audioPlayer.innerAudioContext.onStop(() => {
- this.audioPlayer.playingMessage = null;
- });
- },
- initRecorderListeners() {
- var that=this;
- // 监听录音开始
- recorderManager.onStart(() => {
- this.audio.recording = true;
- this.audio.startTime = Date.now();
- });
- //录音结束后,发送
- recorderManager.onStop((res) => {
- let endTime = Date.now();
- this.audio.recording = false;
- let duration = endTime - this.audio.startTime;
- if (duration < 1000) {
- uni.showToast({
- icon: 'error',
- title: that.$t('GoeasyExchange.luyinsjtd'),
- duration: 500
- });
- return;
- }
- res.duration = duration;
- this.goEasy.im.createAudioMessage({
- to: this.to,
- file: res,
- notification: {
- title: this.currentUser.name + 'message',
- body:that.$t('GoeasyExchange.yuyinxx'), // 字段最长 50 字符
- sound: 'message',
- badge: '+1'
- },
- onProgress: function (progress) {
- console.log(progress)
- },
- onSuccess: (message) => {
- this.sendMessage(message);
- },
- onFailed: (e) => {
- console.log('error :', e);
- }
- });
- });
- // 监听录音报错
- recorderManager.onError((res) => {
- this.audio.recording = false;
- recorderManager.stop();
- uni.showToast({
- icon: 'none',
- title:this.$t('GoeasyExchange.luyinshib'),
- duration: 1000
- });
- })
- },
- /**
- * 核心就是设置高度,产生明确占位
- *
- * 小 (宽度和高度都小于预设尺寸)
- * 设高=原始高度
- * 宽 (宽度>高度)
- * 高度= 根据宽度等比缩放
- * 窄 (宽度<高度)或方(宽度=高度)
- * 设高=MAX height
- *
- * @param width,height
- * @returns number
- */
- getImageHeight(width, height) {
- if (width < IMAGE_MAX_WIDTH && height < IMAGE_MAX_HEIGHT) {
- return height * 2;
- } else if (width > height) {
- return (IMAGE_MAX_WIDTH / width * height) * 2;
- } else if (width === height || width < height) {
- return IMAGE_MAX_HEIGHT * 2;
- }
- },
- sendMessage(message) {
- var that=this;
- this.history.messages.push(message);
- this.scrollToBottom();
- this.goEasy.im.sendMessage({
- message: message,
- onSuccess: function (message) {
- console.log('发送成功.', message);
- if(that.iscaller&&!that.issend){
- that.goEasypushmsg();
- }
- },
- onFailed: function (error) {
- if (error.code === 507) {
- console.log('发送语音/图片/视频/文件失败,没有配置OSS存储,详情参考:https://docs.goeasy.io/2.x/im/message/media/alioss');
- } else {
- console.log('发送失败:', error);
- }
- }
- });
- },
- sendTextMessage() {
- if (this.text.trim() !== '') {
- let body = this.text;
- if (this.text.length >= 50) {
- body = this.text.substring(0, 30) + '...';
- }
- this.goEasy.im.createTextMessage({
- text: this.text,
- to: this.to,
- notification: {
- title: this.currentUser.name + 'message',
- body: body,
- sound: 'message',
- badge: '+1'
- },
- onSuccess: (message) => {
- this.sendMessage(message);
- },
- onFailed: (e) => {
- console.log('error :', e);
- }
- });
- }
- this.text = '';
- },
- sendVideoMessage() {
- uni.chooseVideo({
- success: (res) => {
- this.goEasy.im.createVideoMessage({
- to: this.to,
- file: res,
- notification: {
- title: this.currentUser.name + 'message',
- body:this.$t('GoeasyExchange.shipinxx'), // 字段最长 50 字符
- sound: 'message',
- badge: '+1'
- },
- onProgress: function (progress) {
- console.log(progress)
- },
- onSuccess: (message) => {
- this.otherTypesMessagePanelVisible = false;
- this.sendMessage(message);
- },
- onFailed: (e) => {
- console.log('error :', e);
- }
- });
- }
- })
- },
- sendImageMessage() {
- var that = this;
- uni.chooseImage({
- count: 9,
- success: (res) => {
- res.tempFiles.forEach(file => {
- this.goEasy.im.createImageMessage({
- to: this.to,
- file: file,
- notification: {
- title: this.currentUser.name + 'message',
- body:that.$t('GoeasyExchange.tupianxx'), // 字段最长 50 字符
- sound: 'message',
- badge: '+1'
- },
- beforeSend:()=>{
- },
- customizedUpload:(file,message)=> {
- console.log('1------2',message);
- return new Promise((resolve, reject) => {
- //上传图片到自己的服务器
- uni.uploadFile({
- url: that.$baseurl+UploadImage, //仅为示例,非真实的接口地址
- filePath: file.path,
- name: 'file',
- success: (uploadFileRes) => {
- let data = JSON.parse(uploadFileRes.data);
- console.log('1------2',data);
- if (data.code === 0) {
- message.url = data.data.url;
- resolve();
- } else {
- reject();
- }
- },
- fail: (e) => {
- reject(e);
- }
- });
- })
- },
- onProgress: function (progress) {
- console.log(progress)
- },
- onSuccess: (message) => {
- console.log('onSuccess',message)
- this.otherTypesMessagePanelVisible = false;
- this.sendMessage(message);
- },
- onFailed: (e) => {
- console.log('error :', e);
- }
- });
- })
- }
- });
- },
- sendPrivateMessage() {
- var that = this;
- uni.chooseImage({
- count: 9,
- success: (res) => {
- res.tempFiles.forEach(file => {
- //上传图片到自己的服务器
- uni.uploadFile({
- url: that.$baseurl+UploadImage, //仅为示例,非真实的接口地址
- filePath: file.path,
- name: 'file',
- success: (uploadFileRes) => {
- let data = JSON.parse(uploadFileRes.data);
- console.log('1------2',data);
- if(data.code==200){
- var Pimage = {
- image:data.data,
- };
- var customMessage = that.goEasy.im.createCustomMessage({
- type: 'Privateimage', //字符串,可以任意自定义类型,比如红包'hongbao', 订单'order,处方'chufang'
- payload: Pimage,
- to: that.to
- });
- that.otherTypesMessagePanelVisible = false;
- that.sendMessage(customMessage);
- }
- },
- fail: (e) => {
- reject(e);
- }
- });
- })
- }
- });
- },
-
- imcall(){
- uni.navigateTo({
- url:'/pages/imcall/audioCall?caller=1'
- })
- },
- sendOrderMessage(order) {
- //GoEasyIM自定义消息,实现订单发送
- this.goEasy.im.createCustomMessage({
- type: 'order',
- payload: order,
- to: this.to,
- notification: {
- title: this.currentUser.name + 'message',
- body:this.$t('GoeasyExchange.dingdanxx'),
- sound: 'message',
- badge: '+1'
- },
- onSuccess: (message) => {
- this.otherTypesMessagePanelVisible = false;
- this.sendMessage(message);
- },
- onFailed: (e) => {
- console.log('error :', e);
- }
- });
- this.orderList.visible = false;
- },
- showActionPopup(message) {
- const MAX_RECALLABLE_TIME = 3 * 60 * 1000; //3分钟以内的消息才可以撤回
- this.messageSelector.messages = [message];
- if ((Date.now() - message.timestamp) < MAX_RECALLABLE_TIME && message.senderId === this.currentUser.id && message.status === 'success') {
- this.actionPopup.recallable = true;
- } else {
- this.actionPopup.recallable = false;
- }
- this.actionPopup.visible = true;
- },
- hideActionPopup () {
- this.actionPopup.visible = false;
- this.actionPopup.message = null;
- },
- deleteSingleMessage() {
- uni.showModal({
- content:this.$t('GoeasyExchange.querensanc'),
- success: (res) => {
- this.actionPopup.visible = false;
- if (res.confirm) {
- this.deleteMessage();
- }
- },
- })
- },
- deleteMultipleMessages() {
- if (this.messageSelector.messages.length > 0) {
- uni.showModal({
- content: this.$t('GoeasyExchange.querensanc'),
- success: (res) => {
- this.messageSelector.visible = false;
- if (res.confirm) {
- this.deleteMessage();
- }
- },
- })
- }
- },
- deleteMessage() {
- this.goEasy.im.deleteMessage({
- messages: this.messageSelector.messages,
- onSuccess: (result) => {
- this.messageSelector.messages.forEach(message => {
- let index = this.history.messages.indexOf(message);
- if (index > -1) {
- this.history.messages.splice(index, 1);
- }
- });
- this.messageSelector.messages = [];
- },
- onFailed: (error) => {
- console.log('error:', error);
- }
- });
- },
- recallMessage() {
- this.actionPopup.visible = false;
- this.goEasy.im.recallMessage({
- messages: this.messageSelector.messages,
- onSuccess: () => {
- console.log('撤回成功');
- },
- onFailed: (error) => {
- console.log('撤回失败,error:', error);
- }
- });
- },
- editRecalledMessage(text) {
- if (this.audio.visible) {
- this.audio.visible = false;
- }
- this.text = text;
- },
- showCheckBox() {
- this.messageSelector.messages = [];
- this.messageSelector.visible = true;
- this.actionPopup.visible = false;
- },
- selectMessages(e) {
- const selectedMessageIds = e.detail.value;
- let selectedMessages = [];
- this.history.messages.forEach(message => {
- if (selectedMessageIds.includes(message.messageId)) {
- selectedMessages.push(message);
- }
- })
- this.messageSelector.messages = selectedMessages;
- },
- loadHistoryMessage(scrollToBottom) {//历史消息
- this.history.loading = true;
- let lastMessageTimeStamp = null;
- let lastMessage = this.history.messages[0];
- if (lastMessage) {
- lastMessageTimeStamp = lastMessage.timestamp;
- }
- this.goEasy.im.history({
- userId: this.friend.id,
- lastTimestamp: lastMessageTimeStamp,
- limit: 10,
- onSuccess: (result) => {
- uni.stopPullDownRefresh();
- this.history.loading = false;
- let messages = result.content;
- console.log(messages);
- if (messages.length === 0) {
- this.history.allLoaded = true;
- } else {
- if (lastMessageTimeStamp) {
- this.history.messages = messages.concat(this.history.messages);
- } else {
- this.history.messages = messages;
- }
- if (messages.length < 10) {
- this.history.allLoaded = true;
- }
- if (scrollToBottom) {
- this.scrollToBottom();
- //收到的消息设置为已读
- this.markPrivateMessageAsRead();
- }
- }
- },
- onFailed: (error) => {
- //获取失败
- console.log('获取历史消息失败:', error);
- uni.stopPullDownRefresh();
- this.history.loading = false;
- }
- });
- },
- //语音录制按钮和键盘输入的切换
- switchAudioKeyboard() {
- this.audio.visible = !this.audio.visible;
- var that=this;
- if (uni.authorize) {
- uni.authorize({
- scope: 'scope.record',
- fail: () => {
- uni.showModal({
- title:that.$t('GoeasyExchange.huoquqxsb'),
- content:that.$t('GoeasyExchange.qingxsqly')
- });
- }
- });
- }
- },
- onRecordStart() {
- var that=this;
- try {
- // 更多配置参考uniapp:https://uniapp.dcloud.net.cn/api/media/record-manager.html#getrecordermanager
- recorderManager.start({
- duration: 600000 // 指定录音的时长,单位 ms
- });
- } catch (e) {
- uni.showModal({
- title:that.$t('GoeasyExchange.luyincw'),
- content:that.$t('GoeasyExchange.qingshcs')
- });
- }
- },
- onRecordEnd() {
- try {
- recorderManager.stop();
- } catch (e) {
- console.log(e);
- }
- },
- showImageFullScreen(e) {
- let imagesUrl = [e.currentTarget.dataset.url];
- uni.previewImage({
- urls: imagesUrl
- });
- },
- playVideo(e) {
- this.videoPlayer.visible = true;
- this.videoPlayer.url = e.currentTarget.dataset.url;
- this.$nextTick(() => {
- this.videoPlayer.context.requestFullScreen({
- direction: 0
- });
- this.videoPlayer.context.play();
- });
- },
- playAudio (audioMessage) {
- let playingMessage = this.audioPlayer.playingMessage;
- if (playingMessage) {
- this.audioPlayer.innerAudioContext.stop();
- // 如果点击的消息正在播放,就认为是停止播放操作
- if (playingMessage === audioMessage) {
- return;
- }
- }
- this.audioPlayer.playingMessage = audioMessage;
- this.audioPlayer.innerAudioContext.src = audioMessage.payload.url;
- this.audioPlayer.innerAudioContext.play();
- },
- onVideoFullScreenChange(e) {
- //当退出全屏播放时,隐藏播放器
- if (this.videoPlayer.visible && !e.detail.fullScreen) {
- this.videoPlayer.visible = false;
- this.videoPlayer.context.stop();
- }
- },
- messageInputFocusin() {
- this.otherTypesMessagePanelVisible = false;
- this.emoji.visible = false;
- },
- switchEmojiKeyboard() {
- this.emoji.visible = !this.emoji.visible;
- this.otherTypesMessagePanelVisible = false;
- },
- showOtherTypesMessagePanel() {
- this.otherTypesMessagePanelVisible = !this.otherTypesMessagePanelVisible;
- this.emoji.visible = false;
- },
- chooseEmoji(emojiKey) {
- this.text += emojiKey;
- },
- showOrderMessageList() {
- this.orderList.orders = restApi.getOrderList();
- this.orderList.visible = true;
- },
- hideOrderMessageList() {
- this.orderList.visible = false;
- },
- scrollToBottom() {
- this.$nextTick(() => {
- uni.pageScrollTo({
- scrollTop: 2000000,
- duration: 0
- });
- });
- },
- markPrivateMessageAsRead() {
- this.goEasy.im.markMessageAsRead({
- id: this.to.id,
- type: this.to.type,
- onSuccess: function () {
- console.log('标记私聊已读成功');
- },
- onFailed: function (error) {
- console.log("标记私聊已读失败", error);
-
- }
- });
- },
- goEasypushmsg(){
- var userinfo = uni.getStorageSync('userInfo');
- var payload={
- roomId:this.currentUser.id,
- userId:userinfo.userId,
- nickName:this.currentUser.name,
- avatar:this.currentUser.avatar,
- ptype:2
- }
- console.log('111111')
- var that = this;
- var pubsub = this.goEasy.pubsub;
- pubsub.publish({
- channel:this.friend.id, //请确认与接收端一致
- message:JSON.stringify(payload), //app内onMessage收到的消息内容
- notification: { //定义通知栏推送
- title: 'IM message', //通知栏提醒标题,仅显示于通知栏
- body:'message', //通知栏提醒内容,仅显示于通知栏
- },
- onSuccess: function () {
- that.issend=true;
- console.log("Publish successfully.")
- },
- onFailed: function (error) {
- console.log("Failed to publish message, code:" + error.code + ' error:' + error.content);
- }
- });
- },
- }
- }
- </script>
- <style lang="scss">
- @import url('@/static/style/chatInterface.css');
- </style>
|