index.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <route lang="json">
  2. {
  3. "layout": "tabbar",
  4. "style": {
  5. "navigationBarTitleText": "消息",
  6. "navigationBarBackgroundColor": "#fff"
  7. }
  8. }
  9. </route>
  10. <script setup lang="ts">
  11. import PageHelper from '@/components/page-helper.vue'
  12. import {
  13. deleteMessage,
  14. getMessages,
  15. getPointsCoupons,
  16. orderPointsCancel,
  17. orderPointsSubmit,
  18. updateMessage,
  19. } from '../../core/libs/requests'
  20. import { MessageType } from '../../core/libs/enums'
  21. import { ComponentExposed } from 'vue-component-type-helpers'
  22. import { Coupon, Message } from '../../core/libs/models'
  23. import { requestToast } from '../../core/utils/common'
  24. import { useUserStore } from '../../store'
  25. import { storeToRefs } from 'pinia'
  26. import MessageCard from './components/message-card.vue'
  27. import { useMessage } from 'wot-design-uni'
  28. import CouponsSelector from '../common/components/coupons-selector.vue'
  29. import { handleClickInstruction } from '../../core/libs/actions'
  30. import PageHelperEvo from '@/components/page-helper-evo.vue'
  31. const pageHelperRef = ref<ComponentExposed<typeof PageHelper>>()
  32. const userStore = useUserStore()
  33. const { userInfo } = storeToRefs(userStore)
  34. const show = ref(false)
  35. const tab = ref(0)
  36. const tabs = ref([
  37. { label: '积分消息', value: MessageType.Integral },
  38. { label: '系统消息', value: MessageType.System },
  39. { label: '互动消息', value: MessageType.Interact },
  40. ])
  41. const selectedCoupons = ref<Coupon[]>([])
  42. const coupons = ref<Coupon[]>([])
  43. const cancelReason = ref('')
  44. const currentMessage = ref<Message>()
  45. const { alert } = useMessage()
  46. const { confirm } = useMessage('wd-message-box-slot')
  47. const query = computed(() => ({ messageType: tabs.value[tab.value]?.value }))
  48. const handleCancel = async (message: Message) => {
  49. await confirm({
  50. title: '驳回',
  51. beforeConfirm: async ({ resolve }) => {
  52. if (!cancelReason.value) {
  53. resolve(false)
  54. uni.showToast({ title: '请输入驳回原因', icon: 'none' })
  55. return
  56. }
  57. await requestToast(
  58. () =>
  59. orderPointsCancel({
  60. id: message.businessId.toString(),
  61. cancelReason: cancelReason.value,
  62. }),
  63. { success: true, successTitle: '积分确认已驳回' },
  64. )
  65. resolve(true)
  66. },
  67. })
  68. // await deleteMessage(message.id.toString())
  69. await updateMessage({ id: message.id, isRead: '1' })
  70. await pageHelperRef.value?.refresh()
  71. }
  72. const handleSubmit = async (message: Message) => {
  73. await requestToast(
  74. () =>
  75. orderPointsSubmit({
  76. id: message.businessId,
  77. userId: message.designerId,
  78. couponUserId: selectedCoupons.value[0]?.id,
  79. }),
  80. {
  81. success: true,
  82. successTitle: '积分已确认',
  83. },
  84. )
  85. // await deleteMessage(message.id.toString())
  86. await updateMessage({ id: message.id, isRead: '1' })
  87. await pageHelperRef.value?.refresh()
  88. selectedCoupons.value = []
  89. }
  90. const handleQ = async (msg, res) => {
  91. currentMessage.value = msg
  92. coupons.value = res
  93. show.value = true
  94. }
  95. onShow(async () => {
  96. await nextTick(() => {
  97. pageHelperRef.value?.reload()
  98. })
  99. })
  100. </script>
  101. <template>
  102. <view class="flex-grow flex flex-col bg">
  103. <PageHelperEvo
  104. ref="pageHelperRef"
  105. class="flex-grow flex"
  106. :request="getMessages"
  107. :query="query"
  108. :automatic="false"
  109. >
  110. <template #top>
  111. <wd-tabs v-model="tab">
  112. <block v-for="({ label }, i) in tabs" :key="i">
  113. <wd-tab :title="`${label}`"></wd-tab>
  114. </block>
  115. </wd-tabs>
  116. </template>
  117. <template #default="{ source }">
  118. <div class="flex-grow p-3.5 gap-3.5 flex flex-col">
  119. <template v-for="(it, i) in source.list" :key="i">
  120. <MessageCard
  121. :options="it"
  122. @submit="handleSubmit"
  123. @cancel="handleCancel"
  124. @select-coupon="handleQ"
  125. ></MessageCard>
  126. </template>
  127. </div>
  128. </template>
  129. </PageHelperEvo>
  130. <wd-message-box selector="wd-message-box-slot">
  131. <!-- <wd-rate custom-class="custom-rate-class" v-model="rate" /> -->
  132. <wd-config-provider :themeVars="{ textareaBg: 'transparent', textareaCellHeight: '100rpx' }">
  133. <wd-textarea
  134. custom-class="bg-[#f6f6f6]! rounded-lg border border-solid border-[#9f9f9f]/20"
  135. v-model="cancelReason"
  136. line="2"
  137. height="100rpx"
  138. placeholder="请输入驳回原因"
  139. />
  140. </wd-config-provider>
  141. </wd-message-box>
  142. <CouponsSelector
  143. v-model="selectedCoupons"
  144. type="points"
  145. :show="show"
  146. :business-id="currentMessage?.businessId"
  147. @close="show = false"
  148. @click-instruction="(e) => handleClickInstruction(alert, e)"
  149. ></CouponsSelector>
  150. </view>
  151. </template>
  152. <style scoped lang="scss"></style>