index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <div v-if="state.userInfo" class="p-dashboard ptc-block">
  3. <div
  4. class="user-panel ptc-inner-md"
  5. :class="{ 'is-member': state.userInfo.orders.length }"
  6. >
  7. <div class="info">
  8. <div class="p1">
  9. <p class="name">Hi, {{ state.userInfo.name }}</p>
  10. <p class="intro">
  11. {{ state.userInfo.orders.length ? 'Pro' : 'Ordinary' }} member
  12. </p>
  13. </div>
  14. <div v-if="!state.userInfo.orders.length" class="p2">
  15. <p class="txt">
  16. You have not purchased a member{{
  17. state.userInfo.num_order_expired > 0
  18. ? `, $${state.rebuyDiscount} off for additional services`
  19. : ''
  20. }}
  21. </p>
  22. <button class="btn" @click="$router.push('/fill-order')">BUY</button>
  23. </div>
  24. <div v-else class="p3">
  25. <div class="txt">
  26. ${{ state.rebuyDiscount }} off for additional services |
  27. <strong class="primary pointer" @click="$router.push('/fill-order')"
  28. >Buy now ></strong
  29. >
  30. </div>
  31. <div class="swiper">
  32. <div
  33. class="swiper-wrapper"
  34. :class="{ 'one-child': state.userInfo.orders.length === 1 }"
  35. >
  36. <div
  37. v-for="(item, index) of state.userInfo.orders"
  38. :key="index"
  39. class="swiper-slide"
  40. @click="$router.push(`/order/${item.id}`)"
  41. >
  42. <div class="service">
  43. <div class="service-title">
  44. <i class="service-icon icon-lite fls0"></i>
  45. <div class="service-type ellipsis">
  46. {{ item.product_name }}
  47. </div>
  48. <div class="service-period fls0">
  49. {{ $util.formatDate(item.start_time) }} to
  50. {{ $util.formatDate(item.end_time) }}
  51. </div>
  52. </div>
  53. <div class="service-model tac ellipsis">
  54. {{ item.phone_info }}
  55. </div>
  56. <div class="service-code tac">
  57. <router-link
  58. v-if="!item.phone_imei"
  59. class="primary bold"
  60. :to="`/imei/bind?id=${item.id}`"
  61. @click.stop
  62. >BIND IMEI ></router-link
  63. >
  64. <template v-else>{{ item.phone_imei }}</template>
  65. </div>
  66. </div>
  67. </div>
  68. </div>
  69. </div>
  70. </div>
  71. </div>
  72. <ul class="dropdown-list">
  73. <template v-if="state.userInfo.num_order > 0">
  74. <li class="dropdown-item i1">
  75. <router-link to="/repair/history">MY REPAIR REQUEST</router-link>
  76. </li>
  77. <li class="dropdown-item i2">
  78. <router-link to="/order">MY ORDER</router-link>
  79. </li>
  80. </template>
  81. <li class="dropdown-item i3">
  82. <router-link to="/gift-card">MY DISCOUNT COUPON</router-link>
  83. </li>
  84. <li class="dropdown-item i4">
  85. <router-link to="/invite"
  86. >INVITE FRIENDS
  87. <span v-if="state.coupon.coupon_amount" class="ptc-tag"
  88. >Get ${{
  89. state.coupon.coupon_amount * state.coupon.coupon_num
  90. }}
  91. coupon</span
  92. ></router-link
  93. >
  94. </li>
  95. <li class="dropdown-item i5">
  96. <router-link to="/account">ACCOUNT INFORMATION</router-link>
  97. </li>
  98. <li class="dropdown-item i6" @click="signOut">SIGN OUT</li>
  99. </ul>
  100. </div>
  101. </div>
  102. </template>
  103. <script setup lang="ts">
  104. import { useRouter } from 'vue-router'
  105. import { state, logout } from '@/store'
  106. import Dialog from '@/components/dialog'
  107. const router = useRouter()
  108. async function signOut() {
  109. await Dialog.confirm('TIPS', 'Are you sure you want to sign out?', {
  110. confirmText: 'YES',
  111. })
  112. await logout()
  113. router.push('/')
  114. }
  115. </script>
  116. <style lang="scss">
  117. .p-dashboard {
  118. @include media-breakpoint-down(md) {
  119. padding: 0 !important;
  120. .user-panel {
  121. .swiper-wrapper {
  122. display: flex;
  123. overflow-x: auto;
  124. padding-bottom: 34px;
  125. }
  126. .swiper-slide {
  127. flex-shrink: 0;
  128. width: 526px;
  129. + .swiper-slide {
  130. margin-left: 28px;
  131. }
  132. }
  133. }
  134. }
  135. @include media-breakpoint-up(lg) {
  136. margin-top: 64px;
  137. }
  138. @include media-breakpoint-up(md) {
  139. .swiper-wrapper {
  140. display: flex;
  141. overflow-x: auto;
  142. padding-bottom: 34px;
  143. &.one-child {
  144. justify-content: center;
  145. }
  146. }
  147. .swiper-slide {
  148. flex-shrink: 0;
  149. width: 526px;
  150. cursor: pointer;
  151. + .swiper-slide {
  152. margin-left: 28px;
  153. }
  154. }
  155. .dropdown-list {
  156. padding-left: 16px;
  157. }
  158. }
  159. }
  160. </style>