index.vue 4.0 KB

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