useMessage.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /** @format */
  2. import {
  3. createNewChatApi,
  4. getBrandConversationApi,
  5. getContactListApi,
  6. getContactMessagesApi,
  7. getNewMessageListApi,
  8. sendMessageApi,
  9. } from '@/api/model/message'
  10. const messageList = ref<any[]>([])
  11. const contacts = ref<any[]>([])
  12. const selectedContact = ref<any>({})
  13. const isScrollBottom = ref<boolean>(false)
  14. const currentPage = ref<number>(1)
  15. const loading = ref<boolean>(false)
  16. const noMore = ref<boolean>(false)
  17. const timer = ref<any>(null)
  18. export function useMessage() {
  19. /**
  20. * 创建客服
  21. */
  22. const createServer = async () => {
  23. try {
  24. await createNewChatApi({
  25. sessionType: '1',
  26. })
  27. }
  28. catch (error) {
  29. console.log(error)
  30. }
  31. }
  32. /**
  33. * 创建品牌对话
  34. */
  35. const createBrandConversation = async (brandId: any) => {
  36. try {
  37. const { id } = await createNewChatApi({
  38. brandId,
  39. sessionType: '2',
  40. })
  41. selectedContact.value.sessionId = id
  42. }
  43. catch (error) {
  44. console.log(error)
  45. }
  46. }
  47. /**
  48. * 获取和品牌的对话
  49. */
  50. const getBrandConversation = async (brandId: any) => {
  51. try {
  52. await getBrandConversationApi({
  53. brandId,
  54. sessionType: '2',
  55. })
  56. }
  57. catch (error) {
  58. console.log(error)
  59. }
  60. }
  61. /**
  62. * 获取联系列表
  63. */
  64. const getContactList = async () => {
  65. try {
  66. const res: any = await getContactListApi()
  67. contacts.value = res.records
  68. }
  69. catch (error) {
  70. console.log(error)
  71. }
  72. }
  73. /**
  74. * 获取最新消息列表
  75. */
  76. const getNewMessageList = async () => {
  77. try {
  78. const params = {
  79. messageId: messageList.value[messageList.value.length - 1].id,
  80. sessionId: selectedContact.value.sessionId,
  81. }
  82. const result: any = await getNewMessageListApi(params)
  83. messageList.value = [...messageList.value, ...result.reverse()]
  84. }
  85. catch (error) {
  86. console.log(error)
  87. }
  88. }
  89. /**
  90. * 获取当前联系人的聊天记录
  91. */
  92. const getContactMessages = async (pageNo = 1, pageSize = 10) => {
  93. try {
  94. const params = {
  95. sessionId: selectedContact.value.sessionId,
  96. pageNo,
  97. pageSize,
  98. }
  99. loading.value = true
  100. const { records }: any = await getContactMessagesApi(params)
  101. messageList.value = [...records.reverse(), ...messageList.value]
  102. loading.value = false
  103. if (records.length < pageSize)
  104. noMore.value = true
  105. }
  106. catch (error) {
  107. console.log(error)
  108. }
  109. }
  110. const onScrollTop = async () => {
  111. currentPage.value++
  112. await getContactMessages(currentPage.value)
  113. }
  114. /**
  115. * 选择联系人
  116. */
  117. const selectContact = async (contact: any) => {
  118. if (selectedContact.value.sessionId === contact.sessionId)
  119. return
  120. isScrollBottom.value = false
  121. selectedContact.value = contact
  122. messageList.value = []
  123. currentPage.value = 1
  124. noMore.value = false
  125. await getContactMessages(currentPage.value)
  126. isScrollBottom.value = true
  127. }
  128. // 循环调用新聊天内容接口
  129. const setRoundNewMessage = () => {
  130. timer.value = setInterval(() => {
  131. if (messageList.value.length > 0)
  132. getNewMessageList()
  133. else
  134. clearInterval(timer.value)
  135. }, 5000)
  136. }
  137. /**
  138. * 发送的消息
  139. */
  140. const sendMessage = async (message: any, type: string) => {
  141. try {
  142. isScrollBottom.value = false
  143. const params: any = {
  144. sessionId: selectedContact.value.sessionId,
  145. type,
  146. }
  147. if (type === '1')
  148. params.content = message
  149. else
  150. params.imageUrl = message
  151. await sendMessageApi(params)
  152. if (currentPage.value === 1 && messageList.value.length === 0) {
  153. await getContactMessages()
  154. // 轮询调用接口
  155. setRoundNewMessage()
  156. }
  157. else {
  158. await getNewMessageList()
  159. }
  160. isScrollBottom.value = true
  161. }
  162. catch (error) {
  163. console.log(error)
  164. }
  165. }
  166. const handleClick = (tab: any) => {
  167. console.log(tab, 'tab')
  168. }
  169. return {
  170. getContactList,
  171. handleClick,
  172. setRoundNewMessage,
  173. messageList,
  174. timer,
  175. contacts,
  176. onScrollTop,
  177. noMore,
  178. createServer,
  179. selectContact,
  180. selectedContact,
  181. getNewMessageList,
  182. getContactMessages,
  183. isScrollBottom,
  184. createBrandConversation,
  185. getBrandConversation,
  186. loading,
  187. sendMessage,
  188. }
  189. }