index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <template>
  2. <div ref="root" class="p-login">
  3. <a class="nav-home" href="/care/">
  4. <i class="icon"></i><span class="text">HOME</span>
  5. </a>
  6. <div class="logo"></div>
  7. <div class="container">
  8. <div class="ptc-form">
  9. <div class="title">Sign in to PTC Care Plus</div>
  10. <div class="ptc-form-item">
  11. <input
  12. v-model="values.email"
  13. class="ptc-input"
  14. placeholder="email address"
  15. />
  16. </div>
  17. <div class="ptc-form-item">
  18. <input
  19. v-model="values.password"
  20. class="ptc-input"
  21. type="password"
  22. placeholder="password"
  23. @keydown="$event.keyCode === 13 && handleSubmit(handleLogin)"
  24. />
  25. </div>
  26. <div class="ptc-form-item" style="font-size: 0">
  27. <router-link class="tip primary" to="/password/reset"
  28. >Forgot password?</router-link
  29. >
  30. </div>
  31. <div class="ptc-form-item">
  32. <button class="ptc-button" @click="handleSubmit(handleLogin)">
  33. SIGN IN
  34. </button>
  35. </div>
  36. <div class="ptc-form-item">
  37. <p class="tip">
  38. Don’t have an account?
  39. <router-link class="primary" to="/register">Create one</router-link>
  40. </p>
  41. </div>
  42. </div>
  43. <div class="alternative">
  44. <div class="delimiter">Or sign in with</div>
  45. <ul class="list">
  46. <li
  47. class="item g_id_signin"
  48. name="google"
  49. data-type="icon"
  50. data-shape="circle"
  51. data-theme="filled_black"
  52. data-width="40"
  53. ></li>
  54. <li class="item" name="facebook" @click="FBLogin"></li>
  55. <li class="item" name="apple" @click="AppleLogin"></li>
  56. </ul>
  57. </div>
  58. <div class="policy">
  59. By clicking “Sign in” you agree to PTC’s
  60. <a class="primary" href="https://www.ptc.net.au/terms-and-conditions/"
  61. >terms of use</a
  62. >
  63. and confirm that you’ve read and acknowledged PTC’s
  64. <a class="primary" href="https://www.ptc.net.au/privacy-policy/"
  65. >privacy policy</a
  66. >
  67. </div>
  68. </div>
  69. <div
  70. id="g_id_onload"
  71. data-client_id="393349837160-3opoqoo9l0gk9uimu212gp9uvm72406m.apps.googleusercontent.com"
  72. data-login_uri="https://test.ptcrepair.com.au/api/user/google/callback"
  73. data-auto_prompt="false"
  74. ></div>
  75. </div>
  76. </template>
  77. <script setup lang="ts">
  78. import { ref, reactive, onMounted } from 'vue'
  79. import { useRouter, useRoute } from 'vue-router'
  80. import { login } from '@/service/user'
  81. import useForm from '@/hooks/useForm'
  82. import { string } from 'yup'
  83. import { getUserInfo } from '@/store'
  84. import Toast from '@/components/toast'
  85. import {
  86. FBLogin,
  87. AppleLogin,
  88. // renderGoogleLoginButton,
  89. } from '@/utils/third-login'
  90. const router = useRouter()
  91. const { from } = useRoute().query as any
  92. const { values, handleSubmit } = useForm<ApiUser.Login.Request>({
  93. schema: {
  94. email: string()
  95. .required()
  96. .email('Username or Password inserted are incorrect'),
  97. password: string().required(),
  98. },
  99. })
  100. const root = ref<HTMLElement>()
  101. // onMounted(() => renderGoogleLoginButton(gSignin.value!))
  102. onMounted(() => {
  103. const s = document.createElement('script')
  104. s.src = 'https://accounts.google.com/gsi/client'
  105. root.value!.appendChild(s)
  106. })
  107. async function handleLogin() {
  108. const { message } = await login(values as any)
  109. Toast(message)
  110. const { need_change } = await getUserInfo()
  111. ;+need_change
  112. ? router.push('/password/change')
  113. : router.replace(from || '/account')
  114. }
  115. </script>
  116. <style lang="scss">
  117. .surprise {
  118. .ptc-form {
  119. padding: 96px 80px 0;
  120. }
  121. .title {
  122. line-height: 56px;
  123. font-size: 40px;
  124. font-weight: 600;
  125. color: #333;
  126. }
  127. }
  128. </style>