StepThree.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <div class="step-3">
  3. <div class="ptc-block">
  4. <div class="ptc-inner">
  5. <p class="ptc-label">Version & Price</p>
  6. <div class="detail">
  7. <strong class="s1 ellipsis" :title="getters.selectedProduct.name">{{
  8. getters.selectedProduct.name
  9. }}</strong>
  10. <span class="fls0" style="font-size: 0"
  11. ><strong class="s2">${{ getters.cost }}</strong
  12. ><span class="s3">{{
  13. state.form.subscribe_type === 'year' ? 'Annual' : 'Monthly'
  14. }}</span></span
  15. >
  16. <strong class="s4 fls0" @click="$emit('go', -2)">Modify ></strong>
  17. </div>
  18. </div>
  19. </div>
  20. <div class="ptc-wrapper">
  21. <div class="ptc-block">
  22. <div class="ptc-inner">
  23. <p class="ptc-label">Phone model</p>
  24. <div class="detail">
  25. <strong class="s1">{{ getters.modelName }}</strong>
  26. <strong class="s4" @click="$emit('go', -1)">Modify ></strong>
  27. </div>
  28. </div>
  29. </div>
  30. <div v-if="rootState.userInfo" class="ptc-button-group">
  31. <div class="ptc-inner">
  32. <button class="ptc-button" :loading="loading" @click="submit">
  33. SUBMIT
  34. </button>
  35. </div>
  36. </div>
  37. </div>
  38. <div v-if="!rootState.userInfo" class="ptc-wrapper">
  39. <div class="ptc-block">
  40. <div class="ptc-inner">
  41. <p class="text">
  42. Please enter a valid email address, we will send you the latest
  43. status of the order through this contact method.
  44. </p>
  45. <input
  46. v-model="state.form.email"
  47. class="ptc-input"
  48. placeholder="email address"
  49. />
  50. </div>
  51. </div>
  52. <div class="ptc-button-group">
  53. <div class="ptc-inner">
  54. <button class="ptc-button" :loading="loading" @click="submit">
  55. SUBMIT
  56. </button>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </template>
  62. <script setup lang="ts">
  63. import { ref } from 'vue'
  64. import { string } from 'yup'
  65. import { state, getters } from './store'
  66. import { state as rootState } from '@/store'
  67. import { checkoutOrder } from '@/service/order'
  68. import Toast from '@/components/toast'
  69. defineEmits<{
  70. (e: 'go', delta?: number): void
  71. }>()
  72. const loading = ref(false)
  73. async function submit() {
  74. loading.value = true
  75. try {
  76. let schema = string().email('Please enter a valid email address')
  77. if (!rootState.userInfo) schema = schema.required('Email is required')
  78. await schema.validate(state.form.email)
  79. const { results } = await checkoutOrder(state.form)
  80. location.href = results
  81. } catch (err) {
  82. Toast(err.message)
  83. }
  84. loading.value = false
  85. }
  86. </script>
  87. <style lang="scss" scoped>
  88. .ptc-wrapper + .ptc-wrapper {
  89. margin-top: 24px;
  90. }
  91. .text {
  92. margin-bottom: 48px;
  93. line-height: 44px;
  94. font-size: 32px;
  95. color: #333;
  96. }
  97. </style>