ChatInput.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <!-- @format -->
  2. <script setup>
  3. import { ref } from 'vue'
  4. import { useMessage } from './useMessage'
  5. import { ossUploadApi } from '@/api/model/common'
  6. const { sendMessage } = useMessage()
  7. const messageValue = ref('')
  8. const input = ref(null)
  9. const sending = ref(false)
  10. async function onSendMessage() {
  11. if (messageValue.value.trim()) {
  12. sending.value = true
  13. await sendMessage(messageValue.value, '1')
  14. sending.value = false
  15. messageValue.value = ''
  16. }
  17. }
  18. function uploadImg() {
  19. input.value?.click()
  20. }
  21. function inputChange(e) {
  22. const file = e.target.files[0]
  23. if (sending.value)
  24. return ElMessage.error('Sending message, please wait')
  25. if (file.size > 1024 * 1024 * 10)
  26. return ElMessage.error('Image size cannot exceed 10M')
  27. sendImgMessage(file)
  28. }
  29. async function sendImgMessage(file) {
  30. try {
  31. sending.value = true
  32. const imgUrl = await ossUploadApi(file)
  33. await sendMessage(imgUrl, '2')
  34. sending.value = false
  35. }
  36. catch (error) {
  37. ElMessage.error('send failed')
  38. console.log(error)
  39. }
  40. finally {
  41. sending.value = false
  42. }
  43. }
  44. </script>
  45. <template>
  46. <div class=" bg-#fff b-rd-6px">
  47. <div class="px-15px py-12px">
  48. <img
  49. src="@/assets/images/addImage.png"
  50. class="w-24px h-24px cursor-pointer"
  51. @click="uploadImg"
  52. >
  53. <input
  54. ref="input"
  55. type="file"
  56. class="hidden"
  57. accept="image/*"
  58. @change="inputChange"
  59. >
  60. </div>
  61. <div class="p-10px pos-relative">
  62. <el-input
  63. v-model="messageValue"
  64. type="textarea"
  65. placeholder="Please enter your message here"
  66. class="!b-0 custom-textarea"
  67. :rows="6"
  68. @press-enter.prevent="onSendMessage"
  69. />
  70. <el-button
  71. :disabled="!messageValue"
  72. class="pos-absolute w-160px bottom-20px right-20px px-30px py-10px !h-40px !bg-#C58C64 !text-#fff" @click="onSendMessage"
  73. >
  74. Send
  75. </el-button>
  76. </div>
  77. </div>
  78. </template>
  79. <style lang="less" scoped>
  80. ::v-deep(.custom-textarea) {
  81. .el-textarea__inner{
  82. border: none !important;
  83. box-shadow: unset !important;
  84. }
  85. }
  86. </style>