MessageWindow.vue 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <template>
  2. <base-dialog v-model="visible" unless :footer="false" class="message-dialog" destroy-on-close>
  3. <component
  4. :is="MessageWindowContent"
  5. :reply-user-id="replyUserId"
  6. @close="onClose"
  7. @change-type="onChangeType"
  8. @reply="onReply"
  9. ></component>
  10. </base-dialog>
  11. </template>
  12. <script setup lang="ts" name="MessageWindow">
  13. /** 发送/回复消息 */
  14. import { ref, computed, withDefaults } from 'vue'
  15. import useVModel from '@/hooks/useVModel'
  16. import BaseDialog from '@/components/element/BaseDialog.vue'
  17. import MessageHistory from '@/components/shared/message/MessageList.vue'
  18. import MessageSend from '@/components/shared/message/MessageSend.vue'
  19. type ModalType = 'view' | 'send'
  20. const props = withDefaults(
  21. defineProps<{
  22. modelValue: boolean
  23. type: ModalType
  24. }>(),
  25. { type: 'view' }
  26. )
  27. const visible = useVModel(props, 'modelValue')
  28. const modalType = useVModel(props, 'type')
  29. const replyUserId = ref<number>()
  30. const MessageWindowContent = computed(() => {
  31. return modalType.value === 'send' ? MessageSend : MessageHistory
  32. })
  33. const onClose = () => {
  34. visible.value = false
  35. replyUserId.value = void 0
  36. }
  37. const onChangeType = (type: ModalType) => {
  38. modalType.value = type
  39. }
  40. /** 回复 */
  41. const onReply = (userId: number) => {
  42. replyUserId.value = userId
  43. }
  44. </script>
  45. <style lang="scss">
  46. .message-dialog {
  47. background-color: transparent;
  48. box-shadow: none;
  49. .el-dialog__body {
  50. padding: 0 !important;
  51. }
  52. }
  53. </style>