No Description

chats.js 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. mui.ready(function() {
  2. var oconsultTitle = document.getElementById("consultTitle");//咨询标题
  3. var ochatName = document.getElementById("chatName");//与。。聊天
  4. var oconfirmBtn = document.getElementById("confirmBtn");//我的需求,确认完成按钮
  5. var oassessBtn = document.getElementById("assessBtn");//我的需求,去评价按钮
  6. var oassessed = document.getElementById("assessed");//我的需求,已评价(评价星级和评价内容)
  7. var omy_starContainer = document.getElementById("my_starContainer");//我的需求,星级容器
  8. var othat_weiassess = document.getElementById("that_weiassess");//收到咨询,未评价状态
  9. var owaying = document.getElementById("waying");//收到咨询,进行中状态
  10. var othat_assessed = document.getElementById("that_assessed");//收到咨询,对方已评价
  11. var oconstarContainer = document.getElementById("consult_starContainer");//收到咨询星级容器
  12. var omsg_list = document.getElementById("msg-list");
  13. var omsg_text = document.getElementById("msg-text");
  14. var omsg_type = document.getElementById("msg-type");
  15. var ochatFooter = document.getElementById("chatFooter");
  16. function getHeadInfo(manFlag,consultId){
  17. var myData;
  18. if(manFlag == 'myNeed'){//我的需求
  19. //我的需求
  20. mui.ajax(baseUrl+'/ajax/consult/qacon',{
  21. data:{"consultId":consultId,"readStatus":"1"},
  22. dataType:'json',//服务器返回json格式数据
  23. type:'get',//HTTP请求类型
  24. success:function(data){
  25. myData = data.data;
  26. ochatName.innerHTML = myData["professor"]["name"];
  27. var consultTitle = '关于'+myData["consultTitle"]+"的咨询";
  28. oconsultTitle.innerHTML = consultTitle;
  29. //我的需求进行中
  30. if(myData["consultStatus"] == 0){
  31. oconfirmBtn.style.display = 'block';//我的需求,进行中
  32. ochatFooter.style.display = 'block';
  33. }else {
  34. if(myData["assessStatus"] == 0){
  35. oassessBtn.style.display = 'block';//我的需求,未评价
  36. }else {
  37. oassessed.style.display = 'block';//我的需求,已评价
  38. //评价星级
  39. console.log("我的需求已评价")
  40. var starCount = myData["assessStar"];
  41. for(var i=0;i<starCount;i++){
  42. if(i < starCount){
  43. nth(omy_starContainer,'.star',i+1)
  44. .removeClass('icon-favor')
  45. .addClass("icon-favorfill");
  46. }
  47. }
  48. }
  49. }
  50. },
  51. error:function(xhr,type,errorThrown){
  52. }
  53. });
  54. }else if(manFlag == 'consult'){
  55. mui.ajax(baseUrl+'/ajax/consult/qapro',{
  56. data:{"consultId":consultId,"readStatus":"1"},
  57. dataType:'json',//服务器返回json格式数据
  58. type:'get',//HTTP请求类型
  59. success:function(data){
  60. myData = data.data;
  61. ochatName.innerHTML = myData["professor"]["name"];
  62. var consultTitle = '回复:关于'+myData["consultTitle"]+"的咨询";
  63. oconsultTitle.innerHTML = consultTitle;
  64. //收到咨询进行中
  65. if(myData["consultStatus"] == 0){
  66. owaying.style.display = 'block';
  67. ochatFooter.style.display = 'block';
  68. }else {//收到咨询已完成
  69. if(myData["assessStatus"] == 0){//收到咨询未评价
  70. othat_weiassess.style.display = 'block';
  71. }else{//收到咨询已评价(评价星级和评价内容)
  72. othat_assessed.style.display = 'block';
  73. //评价星级
  74. var starItem = [];
  75. var starCount = myData["assessStar"];
  76. for(var i = 0;i < starCount;i++){
  77. if(i < starCount){
  78. // console.log("收到咨询已评价");
  79. /*starItem[i] = oconstarContainer.childNodes[i];
  80. starItem[i].setAttribute('class','icon-favorfill');
  81. oconstarContainer.childNodes[i].className = 'icon-favorfill';
  82. oconstarContainer.childNodes[i].removeClassName = 'mui-icon iconfont icon-favor star';
  83. console.log(oconstarContainer.childNodes[i].className)*/
  84. }
  85. }
  86. }
  87. }
  88. },
  89. error:function(xhr,type,errorThrown){
  90. }
  91. });
  92. };
  93. };
  94. //对话内容保存
  95. function saveChatFun(consultId,userid){
  96. var tidingsContant = omsg_text.innerHTML
  97. console.log(tidingsContant);
  98. mui.ajax(baseUrl +'/ajax/tidings',{
  99. data:{
  100. "consultId":consultId,
  101. "sendId":userid,
  102. "tidingsContant":tidingsContant
  103. },
  104. dataType:'json',//服务器返回json格式数据
  105. type:'post',//HTTP请求类型
  106. success:function(data){
  107. console.log(data);
  108. },
  109. error:function(xhr,type,errorThrown){
  110. }
  111. });
  112. }
  113. var MIN_SOUND_TIME = 800;
  114. mui.init({
  115. gestureConfig: {
  116. tap: true, //默认为true
  117. doubletap: true, //默认为false
  118. longtap: true, //默认为false
  119. swipe: true, //默认为true
  120. drag: true, //默认为true
  121. hold: true, //默认为false,不监听
  122. release: true //默认为false,不监听
  123. }
  124. });
  125. template.config('escape', false);
  126. //mui.plusReady=function(fn){fn();};
  127. mui.plusReady(function() {
  128. var userid = plus.storage.getItem('userid');
  129. var self = plus.webview.currentWebview();
  130. var consultId = self.consultId;
  131. // var manFlag = self.manFlag;
  132. var consultantId = self.consultantId;
  133. console.log(consultId);
  134. // console.log(manFlag);
  135. console.log('userid'+userid);
  136. console.log('consultantId'+consultantId);
  137. if(userid == consultantId){//我的需求
  138. //头部信息
  139. var manFlag = 'myNeed';
  140. getHeadInfo(manFlag,consultId);
  141. }else {//收到咨询
  142. //头部信息
  143. var manFlag = 'consult';
  144. getHeadInfo(manFlag,consultId);
  145. }
  146. plus.webview.currentWebview().setStyle({
  147. softinputMode: "adjustResize"
  148. });
  149. var showKeyboard = function() {
  150. if (mui.os.ios) {
  151. var webView = plus.webview.currentWebview().nativeInstanceObject();
  152. webView.plusCallMethod({
  153. "setKeyboardDisplayRequiresUserAction": false
  154. });
  155. } else {
  156. var Context = plus.android.importClass("android.content.Context");
  157. var InputMethodManager = plus.android.importClass("android.view.inputmethod.InputMethodManager");
  158. var main = plus.android.runtimeMainActivity();
  159. var imm = main.getSystemService(Context.INPUT_METHOD_SERVICE);
  160. imm.toggleSoftInput(0, InputMethodManager.SHOW_FORCED);
  161. //var view = ((ViewGroup)main.findViewById(android.R.id.content)).getChildAt(0);
  162. imm.showSoftInput(main.getWindow().getDecorView(), InputMethodManager.SHOW_IMPLICIT);
  163. //alert("ll");
  164. }
  165. };
  166. var record = [{
  167. sender: 'zs',
  168. type: 'text',
  169. content: 'Hi,我是 科袖 小管家!'
  170. }];
  171. //根据咨询id查询消息
  172. mui.ajax(baseUrl+'/ajax/tidings/qacon',{
  173. data:{
  174. "consultId":consultId
  175. },
  176. dataType:'json',//服务器返回json格式数据
  177. type:'get',//HTTP请求类型
  178. success:function(data){
  179. var myData = data.data;
  180. for(var i = 0; i < myData.length; i++ ){
  181. if(data.data[i]['professor']['id'] == userid){
  182. record.push({
  183. sender: 'self',
  184. type: 'text',
  185. content: data.data[i]["tidingsContant"]
  186. });
  187. }else{
  188. record.push({
  189. sender: 'zs',
  190. type: 'text',
  191. content: data.data[i]["tidingsContant"]
  192. });
  193. }
  194. }
  195. bindMsgList();
  196. },
  197. error:function(xhr,type,errorThrown){
  198. //根据消息id查询消息失败
  199. }
  200. });
  201. var ui = {
  202. body: document.querySelector('body'),
  203. footer: document.querySelector('footer'),
  204. footerRight: document.querySelector('.footer-right'),
  205. footerLeft: document.querySelector('.footer-left'),
  206. btnMsgType: document.querySelector('#msg-type'),
  207. boxMsgText: document.querySelector('#msg-text'),
  208. boxMsgSound: document.querySelector('#msg-sound'),
  209. btnMsgImage: document.querySelector('#msg-image'),
  210. areaMsgList: document.querySelector('#msg-list'),
  211. boxSoundAlert: document.querySelector('#sound-alert'),
  212. h: document.querySelector('#h'),
  213. content: document.querySelector('.mui-content')
  214. };
  215. ui.h.style.width = ui.boxMsgText.offsetWidth+'px';
  216. //alert(ui.boxMsgText.offsetWidth );
  217. var footerPadding = ui.footer.offsetHeight - ui.boxMsgText.offsetHeight;
  218. var msgItemTap = function(msgItem, event) {
  219. var msgType = msgItem.getAttribute('msg-type');
  220. var msgContent = msgItem.getAttribute('msg-content')
  221. if (msgType == 'sound') {
  222. player = plus.audio.createPlayer(msgContent);
  223. var playState = msgItem.querySelector('.play-state');
  224. playState.innerText = '正在播放...';
  225. player.play(function() {
  226. playState.innerText = '点击播放';
  227. }, function(e) {
  228. playState.innerText = '点击播放';
  229. });
  230. }
  231. };
  232. var imageViewer = new mui.ImageViewer('.msg-content-image', {
  233. dbl: false
  234. });
  235. var bindMsgList = function() {
  236. //绑定数据:
  237. /*tp.bind({
  238. template: 'msg-template',
  239. element: 'msg-list',
  240. model: record
  241. });*/
  242. ui.areaMsgList.innerHTML = template('msg-template', {
  243. "record": record
  244. });
  245. var msgItems = ui.areaMsgList.querySelectorAll('.msg-item');
  246. [].forEach.call(msgItems, function(item, index) {
  247. item.addEventListener('tap', function(event) {
  248. msgItemTap(item, event);
  249. }, false);
  250. });
  251. imageViewer.findAllImage();
  252. ui.areaMsgList.scrollTop = ui.areaMsgList.scrollHeight + ui.areaMsgList.offsetHeight;
  253. };
  254. bindMsgList();
  255. window.addEventListener('resize', function() {
  256. ui.areaMsgList.scrollTop = ui.areaMsgList.scrollHeight + ui.areaMsgList.offsetHeight;
  257. }, false);
  258. var send = function(msg) {
  259. record.push(msg);
  260. bindMsgList();
  261. toRobot(msg.content);
  262. };
  263. var toRobot = function(info) {
  264. // var apiUrl = 'http://www.tuling123.com/openapi/api';
  265. // var apiUrl = baseUrl+'/ajax/tidings/qacon';//根据咨询id查询对话消息
  266. var apiUrl = baseUrl+"/ajax/tidings";//保存消息接口
  267. mui.ajax(apiUrl,{
  268. data:{
  269. "tidingsContant":ui.boxMsgText.value, //消息内容
  270. "senderId":userid, //发送者ID
  271. "consultId":consultId //咨询ID
  272. },
  273. dataType:'json',//服务器返回json格式数据
  274. type:'post',//HTTP请求类型
  275. success:function(data){
  276. console.log('消息成功'+data.data);
  277. //alert(JSON.stringify(data));
  278. },
  279. error:function(xhr,type,errorThrown){
  280. //保存消息失败
  281. }
  282. });
  283. };
  284. function msgTextFocus() {
  285. ui.boxMsgText.focus();
  286. setTimeout(function() {
  287. ui.boxMsgText.focus();
  288. }, 150);
  289. }
  290. //解决长按“发送”按钮,导致键盘关闭的问题;
  291. ui.footerRight.addEventListener('touchstart', function(event) {
  292. if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  293. msgTextFocus();
  294. event.preventDefault();
  295. }
  296. });
  297. //解决长按“发送”按钮,导致键盘关闭的问题;
  298. ui.footerRight.addEventListener('touchmove', function(event) {
  299. if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  300. msgTextFocus();
  301. event.preventDefault();
  302. }
  303. });
  304. // ui.footerRight.addEventListener('touchcancel', function(event) {
  305. // if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  306. // msgTextFocus();
  307. // event.preventDefault();
  308. // }
  309. // });
  310. // ui.footerRight.addEventListener('touchend', function(event) {
  311. // if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) {
  312. // msgTextFocus();
  313. // event.preventDefault();
  314. // }
  315. // });
  316. ui.footerRight.addEventListener('release', function(event) {
  317. if (ui.btnMsgType.classList.contains('mui-icon-paperplane')) {//发送
  318. //showKeyboard();
  319. ui.boxMsgText.focus();
  320. setTimeout(function() {
  321. ui.boxMsgText.focus();//获取焦点
  322. }, 150);
  323. // event.detail.gesture.preventDefault();
  324. send({
  325. sender: 'self',
  326. type: 'text',
  327. content: ui.boxMsgText.value.replace(new RegExp('\n', 'gm'), '<br/>')
  328. });
  329. ui.boxMsgText.value = '';
  330. mui.trigger(ui.boxMsgText, 'input', null); //发送消息向后台传数据
  331. } else if (ui.btnMsgType.classList.contains('mui-icon-mic')) {//说话
  332. ui.btnMsgType.classList.add('mui-icon-compose');
  333. ui.btnMsgType.classList.remove('mui-icon-mic');
  334. ui.boxMsgText.style.display = 'none';
  335. ui.boxMsgSound.style.display = 'block';
  336. ui.boxMsgText.blur();
  337. document.body.focus();
  338. } else if (ui.btnMsgType.classList.contains('mui-icon-compose')) {//编辑
  339. ui.btnMsgType.classList.add('mui-icon-mic');
  340. ui.btnMsgType.classList.remove('mui-icon-compose');
  341. ui.boxMsgSound.style.display = 'none';
  342. ui.boxMsgText.style.display = 'block';
  343. //--
  344. //showKeyboard();
  345. ui.boxMsgText.focus();
  346. setTimeout(function() {
  347. ui.boxMsgText.focus();
  348. }, 150);
  349. }
  350. }, false);
  351. ui.footerLeft.addEventListener('tap', function(event) {
  352. var btnArray = [{
  353. title: "拍照"
  354. }, {
  355. title: "从相册选择"
  356. }];
  357. plus.nativeUI.actionSheet({
  358. title: "选择照片",
  359. cancel: "取消",
  360. buttons: btnArray
  361. }, function(e) {
  362. var index = e.index;
  363. switch (index) {
  364. case 0:
  365. break;
  366. case 1:
  367. var cmr = plus.camera.getCamera();
  368. cmr.captureImage(function(path) {
  369. send({
  370. sender: 'self',
  371. type: 'image',
  372. content: "file://" + plus.io.convertLocalFileSystemURL(path)
  373. });
  374. }, function(err) {});
  375. break;
  376. case 2:
  377. plus.gallery.pick(function(path) {
  378. send({
  379. sender: 'self',
  380. type: 'image',
  381. content: path
  382. });
  383. }, function(err) {}, null);
  384. break;
  385. }
  386. });
  387. }, false);
  388. var setSoundAlertVisable=function(show){
  389. if(show){
  390. ui.boxSoundAlert.style.display = 'block';
  391. ui.boxSoundAlert.style.opacity = 1;
  392. }else{
  393. ui.boxSoundAlert.style.opacity = 0;
  394. //fadeOut完成再真正隐藏
  395. setTimeout(function(){
  396. ui.boxSoundAlert.style.display = 'none';
  397. },200);
  398. }
  399. };
  400. var recordCancel = false;
  401. var recorder = null;
  402. var audio_tips = document.getElementById("audio_tips");
  403. var startTimestamp = null;
  404. var stopTimestamp = null;
  405. var stopTimer = null;
  406. ui.boxMsgSound.addEventListener('hold', function(event) {
  407. recordCancel = false;
  408. if(stopTimer)clearTimeout(stopTimer);
  409. audio_tips.innerHTML = "手指上划,取消发送";
  410. ui.boxSoundAlert.classList.remove('rprogress-sigh');
  411. setSoundAlertVisable(true);
  412. recorder = plus.audio.getRecorder();
  413. if (recorder == null) {
  414. plus.nativeUI.toast("不能获取录音对象");
  415. return;
  416. }
  417. startTimestamp = (new Date()).getTime();
  418. recorder.record({
  419. filename: "_doc/audio/"
  420. }, function(path) {
  421. if (recordCancel) return;
  422. send({
  423. sender: 'self',
  424. type: 'sound',
  425. content: path
  426. });
  427. }, function(e) {
  428. plus.nativeUI.toast("录音时出现异常: " + e.message);
  429. });
  430. }, false);
  431. ui.body.addEventListener('drag', function(event) {
  432. //console.log('drag');
  433. if (Math.abs(event.detail.deltaY) > 50) {
  434. if (!recordCancel) {
  435. recordCancel = true;
  436. if (!audio_tips.classList.contains("cancel")) {
  437. audio_tips.classList.add("cancel");
  438. }
  439. audio_tips.innerHTML = "松开手指,取消发送";
  440. }
  441. } else {
  442. if (recordCancel) {
  443. recordCancel = false;
  444. if (audio_tips.classList.contains("cancel")) {
  445. audio_tips.classList.remove("cancel");
  446. }
  447. audio_tips.innerHTML = "手指上划,取消发送";
  448. }
  449. }
  450. }, false);
  451. ui.boxMsgSound.addEventListener('release', function(event) {
  452. //console.log('release');
  453. if (audio_tips.classList.contains("cancel")) {
  454. audio_tips.classList.remove("cancel");
  455. audio_tips.innerHTML = "手指上划,取消发送";
  456. }
  457. //
  458. stopTimestamp = (new Date()).getTime();
  459. if (stopTimestamp - startTimestamp < MIN_SOUND_TIME) {
  460. audio_tips.innerHTML = "录音时间太短";
  461. ui.boxSoundAlert.classList.add('rprogress-sigh');
  462. recordCancel = true;
  463. stopTimer=setTimeout(function(){
  464. setSoundAlertVisable(false);
  465. },800);
  466. }else{
  467. setSoundAlertVisable(false);
  468. }
  469. recorder.stop();
  470. }, false);
  471. ui.boxMsgSound.addEventListener("touchstart", function(e) {
  472. //console.log("start....");
  473. e.preventDefault();
  474. });
  475. ui.boxMsgText.addEventListener('input', function(event) {
  476. ui.btnMsgType.classList[ui.boxMsgText.value == '' ? 'remove' : 'add']('mui-icon-paperplane');
  477. ui.btnMsgType.setAttribute("for", ui.boxMsgText.value == '' ? '' : 'msg-text');
  478. ui.h.innerText = ui.boxMsgText.value.replace(new RegExp('\n', 'gm'), '\n-') || '-';
  479. ui.footer.style.height = (ui.h.offsetHeight + footerPadding) + 'px';
  480. ui.content.style.paddingBottom = ui.footer.style.height;
  481. });
  482. ui.boxMsgText.addEventListener('tap', function(event) {
  483. ui.boxMsgText.focus();
  484. setTimeout(function() {
  485. ui.boxMsgText.focus();
  486. }, 0);
  487. }, false);
  488. });
  489. // }(mui, document));
  490. })