StepThree.vue 2.4 KB

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