StepTwo.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <h3 class="ptc-title">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 pr">
  7. {{ state.shop.centre_name }},{{ state.shop.address }}
  8. </div>
  9. <div class="shop-action">
  10. <span class="modify" @click="state.step--">Modify ></span>
  11. </div>
  12. </div>
  13. </div>
  14. <div class="ptc-block">
  15. <div class="ptc-inner">
  16. <div class="ptc-cell">
  17. <p class="ptc-label">Select date</p>
  18. <div class="ptc-value">
  19. <PtcRadioGroup
  20. v-model="state.date"
  21. class="date-list"
  22. @change="onDateChange"
  23. >
  24. <PtcRadio
  25. v-for="(item, index) of nex7Days"
  26. :key="index"
  27. class="date"
  28. :value="item.fullDate"
  29. :disabled="!state.shop.can_appointment"
  30. ><span>{{ item.day }},{{ item.date }}</span></PtcRadio
  31. >
  32. </PtcRadioGroup>
  33. </div>
  34. </div>
  35. </div>
  36. </div>
  37. <div v-if="state.date" class="ptc-wrapper">
  38. <div class="ptc-block">
  39. <div class="ptc-inner">
  40. <div class="ptc-cell">
  41. <p class="ptc-label">Selection period</p>
  42. <div class="ptc-value">
  43. <PtcRadioGroup
  44. v-model="state.period"
  45. class="date-list"
  46. @change="onPeriodChange"
  47. >
  48. <PtcRadio
  49. v-for="(item, index) of state.periods"
  50. :key="index"
  51. class="date"
  52. :disabled="item.is_resreve != 1"
  53. :value="item.interface_time"
  54. ><span>{{ item.time }}</span></PtcRadio
  55. >
  56. </PtcRadioGroup>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. <div class="ptc-button-group">
  62. <div class="ptc-inner">
  63. <button
  64. class="ptc-button"
  65. :class="{ disabled: !state.period }"
  66. @click="state.step++"
  67. >
  68. NEXT
  69. </button>
  70. </div>
  71. </div>
  72. </div>
  73. </template>
  74. <script setup lang="ts">
  75. import { watch } from 'vue'
  76. import dayjs from 'dayjs'
  77. import { PtcRadioGroup, PtcRadio } from '@/components/radio'
  78. import { state } from '../store'
  79. import { getShopPeriods } from '@/service/repair'
  80. const nex7Days = (function getNext7Days() {
  81. const days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat']
  82. const _ = dayjs()
  83. const day = _.day()
  84. return days
  85. .slice(day)
  86. .concat(days.slice(0, day))
  87. .map((day, index) => {
  88. const today = _.add(index, 'd')
  89. return {
  90. day,
  91. date: String(today.date()).padStart(2, '0'),
  92. fullDate: today.format('YYYY-MM-DD'),
  93. }
  94. })
  95. })()
  96. async function onDateChange(date: string) {
  97. state.period = ''
  98. state.periods = (
  99. await getShopPeriods({
  100. date,
  101. area_code: '1',
  102. igeektek_id: state.shop.igeektek_id,
  103. })
  104. ).results
  105. const _ = nex7Days.find(item => item.fullDate === date)!
  106. state.uiDate = `${_.day},${_.date}`
  107. }
  108. function onPeriodChange(val: string) {
  109. state.uiPeriod = state.periods.find(item => item.interface_time === val)!.time
  110. // state.date && setTimeout(() => state.step++, 200)
  111. }
  112. </script>