StepThree.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <h3 class="ptc-title">Confirm appointment</h3>
  3. <div class="ptc-block">
  4. <div class="ptc-inner">
  5. <div class="shop-name">{{ state.shop.name }}</div>
  6. <div class="shop-address">
  7. {{ state.shop.centre_name }},{{ state.shop.address }}
  8. </div>
  9. <div v-if="!submitted" class="shop-action">
  10. <span class="modify" @click="state.step = 0">Modify ></span>
  11. </div>
  12. </div>
  13. </div>
  14. <div class="ptc-block">
  15. <div class="ptc-inner">
  16. <p class="t2">Appointed time</p>
  17. <div class="flex-ac space-between">
  18. <strong class="p1">{{ state.uiDate }}</strong>
  19. <strong class="p2">{{ state.uiPeriod }}</strong>
  20. <span :class="['modify', { hidden: submitted }]" @click="state.step--"
  21. >Modify ></span
  22. >
  23. </div>
  24. </div>
  25. </div>
  26. <div class="ptc-block">
  27. <div class="ptc-inner">
  28. <p class="t1">
  29. Please provide a mobile number so that the customer service can confirm
  30. the details with you。
  31. </p>
  32. <p class="t2">Phone number</p>
  33. <input
  34. v-model="state.phoneNumber"
  35. type="text"
  36. class="ptc-input"
  37. placeholder="Please enter"
  38. />
  39. </div>
  40. </div>
  41. <div class="ptc-wrapper">
  42. <div class="ptc-block">
  43. <div class="ptc-inner">
  44. <p class="t1">
  45. Is there anything to pay attention to, nothing to skip。
  46. </p>
  47. <textarea
  48. v-model="state.remark"
  49. placeholder="Please enter, up to 1000 characters"
  50. ></textarea>
  51. </div>
  52. </div>
  53. <div class="ptc-button-group">
  54. <div class="ptc-inner">
  55. <button class="ptc-button" :loading="loading" @click="onSubmit">
  56. SUBMIT
  57. </button>
  58. </div>
  59. </div>
  60. </div>
  61. </template>
  62. <script setup lang="ts">
  63. import { ref, onMounted } from 'vue'
  64. import { state } from '../store'
  65. import * as api from '@/service/repair'
  66. import Toast from '@/components/toast'
  67. import NProgress from 'nprogress'
  68. onMounted(async () => {
  69. if (state.repairId) {
  70. state.phoneNumber = (await api.getRepairPhone()).results
  71. }
  72. })
  73. const submitted = ref(false)
  74. const loading = ref(false)
  75. function onSubmit() {
  76. submit().then(next)
  77. }
  78. async function submit() {
  79. if (submitted.value) return
  80. if (!state.phoneNumber) {
  81. Toast('Please enter your phone number')
  82. return Promise.reject()
  83. }
  84. const commonParams = {
  85. igeektek_id: state.shop.igeektek_id,
  86. pickup_time: state.date + ' ' + state.period,
  87. phone_number: state.phoneNumber,
  88. remark: state.remark || '',
  89. }
  90. const request = state.repairId
  91. ? api.rescheduleRepair({ id: state.repairId, ...commonParams })
  92. : api.applyRepair({ right_id: state.rightId, ...commonParams })
  93. loading.value = true
  94. request.finally(() => (loading.value = false))
  95. const { results } = await request
  96. state.repairId = results
  97. submitted.value = true
  98. }
  99. async function next() {
  100. if (NProgress.status) return
  101. try {
  102. NProgress.start()
  103. state.detail = (await api.getRepairInfo(+state.repairId)).results
  104. state.step++
  105. NProgress.done()
  106. } catch {
  107. NProgress.status = null
  108. NProgress.remove()
  109. }
  110. }
  111. </script>