Geen omschrijving

SignupPage.vue 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <ion-page>
  3. <ion-header>
  4. <ion-toolbar>
  5. <ion-buttons slot="start">
  6. <ion-back-button></ion-back-button>
  7. </ion-buttons>
  8. <ion-title>
  9. Signup
  10. </ion-title>
  11. </ion-toolbar>
  12. </ion-header>
  13. <ion-content class='ion-padding'>
  14. <ion-input label="Username" ref="username" label-placement="floating" fill="outline" placeholder="Example, john"
  15. ></ion-input>
  16. <ion-input label="Email" label-placement="floating" ref='email' fill="outline" type="email" placeholder="Example, hello@gmail.com"></ion-input>
  17. <ion-input label="Password" label-placement='floating' fill='outline' ref="password" type="password" placeholder="Password"></ion-input>
  18. <ion-input label="Password Confirmation" label-placement='floating' fill='outline' ref="password2" type="password" placeholder="Password Confirmation"></ion-input>
  19. <ion-text color="danger" v-if="formError">{{ formError }}</ion-text>
  20. <ion-button @click="signup" class=' ion-margin-top'>Signup</ion-button>
  21. </ion-content>
  22. </ion-page>
  23. </template>
  24. <script setup lang="ts">
  25. import { IonPage, IonHeader, IonToolbar, IonTitle, IonContent, IonButton, onIonViewWillEnter, IonList, IonSearchbar, IonLabel,
  26. IonItem, IonBackButton, IonProgressBar, IonButtons, IonInfiniteScroll,
  27. IonInfiniteScrollContent, InfiniteScrollCustomEvent, IonInput, toastController, useIonRouter } from '@ionic/vue';
  28. import { defineComponent, onMounted } from 'vue';
  29. import { GoogleAuth } from '@codetrix-studio/capacitor-google-auth';
  30. import { searchMat, callUrl,restSignup } from '@/composable/settings';
  31. import { ref } from 'vue';
  32. import SearchItem from '@/components/SearchItem.vue';
  33. const results = ref();
  34. const is_empty = ref(false);
  35. const processing = ref(false)
  36. let next_url = null
  37. const username = ref(null)
  38. const password = ref(null)
  39. const password2 = ref(null)
  40. const email = ref(null)
  41. const input = ref(null)
  42. const ionRouter = useIonRouter();
  43. const formError = ref(null)
  44. const signup = async () => {
  45. clearError(username)
  46. clearError(email)
  47. clearError(password)
  48. clearError(password2)
  49. formError.value = null
  50. try {
  51. console.log("username = ", username.value.$el.value)
  52. const data = await restSignup(username.value.$el.value, email.value.$el.value, password.value.$el.value, password2.value.$el.value)
  53. console.log(data)
  54. await presentToast("Sign up successful", "top")
  55. ionRouter.navigate('/tabs/tab4', 'forward', 'replace');
  56. }catch( err ) {
  57. console.log("-- error --")
  58. console.log(err)
  59. for(const [k,v] of Object.entries(err.response.data)) {
  60. if( k == "username" ){
  61. showError(username, v[0])
  62. }
  63. if( k == "email" ){
  64. showError(email, v[0])
  65. }
  66. if( k == "password1" ){
  67. showError(password, v[0])
  68. }
  69. if( k == "password2" ){
  70. showError(password2, v[0])
  71. }
  72. if( k == "non_field_errors" ) {
  73. formError.value = v[0]
  74. }
  75. }
  76. }
  77. }
  78. const showError = (obj, error) => {
  79. obj.value.$el.errorText = error
  80. obj.value.$el.classList.add('ion-invalid')
  81. obj.value.$el.classList.add('ion-touched');
  82. }
  83. const clearError = (obj) => {
  84. obj.value.$el.classList.remove("ion-valid")
  85. obj.value.$el.classList.remove("ion-invalid")
  86. }
  87. const validateEmail = (email) => {
  88. return email.match(
  89. /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
  90. );
  91. }
  92. const validate = (ev) => {
  93. const value = ev.target.value;
  94. input.value.$el.classList.remove('ion-valid');
  95. input.value.$el.classList.remove('ion-invalid');
  96. if (value === '') return;
  97. validateEmail(value)
  98. ? input.value.$el.classList.add('ion-valid')
  99. : input.value.$el.classList.add('ion-invalid');
  100. }
  101. const markTouched = () => {
  102. input.value.$el.classList.add('ion-touched');
  103. }
  104. const markTouched2 = () => {
  105. username.value.$el.classList.add('ion-touched');
  106. }
  107. const presentToast = async (msg, position: 'top' | 'middle' | 'bottom') => {
  108. console.log("present toast")
  109. const toast = await toastController.create({
  110. message: msg,
  111. duration: 3000,
  112. position: position,
  113. positionAnchor: "header",
  114. color: "success"
  115. });
  116. await toast.present();
  117. }
  118. </script>