checkin.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <template>
  2. <div class="flex flex-col justify-center items-center mt-10 text-center">
  3. <div class="bg-primary rounded-full w-26 h-26 md:w-31 md:h-31 flex justify-center items-center">
  4. <NuxtImg src="/img/coffee.svg" class="w-13 md:w-16" />
  5. </div>
  6. <template v-if="!checkinSuccess">
  7. <h1 class="text-xl md:text-2xl mt-3">Registre sua participação</h1>
  8. <p class="text-xs md:text-sm text-[#505050] mt-4 px-4">Digite o Código do Evento/live que recebeu para registrar sua presença</p>
  9. <form class="flex flex-col justify-center items-center mt-5 gap-2 w-full max-w-[361px]" @submit.prevent="handleCheckin">
  10. <div class="flex flex-col justify-center items-center w-full">
  11. <label for="name" class="text-text-2 mb-1 font-medium text-xs md:text-sm">Nome Cadastrado na plataforma <span class="text-error">*</span></label>
  12. <input
  13. v-model="name"
  14. type="text"
  15. placeholder="João da Silva"
  16. :disabled="isLoading"
  17. required
  18. class="border-[1px] border-border rounded-lg text-center h-10 w-full text-sm"
  19. >
  20. </div>
  21. <div class="flex flex-col justify-center items-center w-full">
  22. <label for="email" class="text-text-2 mb-1 font-medium text-xs md:text-sm">Email <span class="text-error">*</span></label>
  23. <input
  24. v-model="email"
  25. type="email"
  26. placeholder="email@email.com"
  27. :disabled="isLoading"
  28. required
  29. class="border-[1px] border-border rounded-lg text-center h-10 w-full text-sm"
  30. >
  31. </div>
  32. <div class="flex flex-col justify-center items-center w-full">
  33. <label for="eventCode" class="text-text-2 mb-1 font-medium text-xs md:text-sm">Código do Evento/live <span class="text-error">*</span></label>
  34. <input
  35. v-model="eventCode"
  36. type="text"
  37. placeholder="Ex. Cafe123"
  38. :disabled="isLoading"
  39. required
  40. class="border-[1px] border-border rounded-lg text-center h-10 w-full text-xs md:text-sm"
  41. >
  42. </div>
  43. <button
  44. type="submit"
  45. :disabled="isLoading"
  46. class="bg-primary text-white rounded-lg uppercase text-xs md:text-sm w-full h-[50px] mt-5 cursor-pointer hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed"
  47. >
  48. {{ isLoading ? 'Registrando...' : 'Registrar Presença' }}
  49. </button>
  50. </form>
  51. <p v-if="statusMessage" class="text-red-500 mt-4">{{ statusMessage }}</p>
  52. </template>
  53. <div v-else class="mt-24 px-4">
  54. <h1 class="text-2xl max-w-[457px] text-text-2">Sua presença foi registrada em nosso evento, obrigada por participar!</h1>
  55. </div>
  56. </div>
  57. </template>
  58. <script setup>
  59. import { ref } from 'vue';
  60. useHead({
  61. title: `Check-in - Viver Café`
  62. })
  63. definePageMeta({
  64. layout: 'checkin',
  65. });
  66. const name = ref('');
  67. const email = ref('');
  68. const eventCode = ref('');
  69. const statusMessage = ref('');
  70. const isLoading = ref(false);
  71. const checkinSuccess = ref(false);
  72. async function handleCheckin() {
  73. if (!name.value || !email.value || !eventCode.value) {
  74. statusMessage.value = 'Por favor, preencha todos os campos.';
  75. return;
  76. }
  77. isLoading.value = true;
  78. statusMessage.value = '';
  79. try {
  80. await new Promise(resolve => setTimeout(resolve, 1000));
  81. if (eventCode.value.toLowerCase() === 'fail') {
  82. throw new Error('Simulação de erro na API.');
  83. }
  84. checkinSuccess.value = true;
  85. name.value = '';
  86. email.value = '';
  87. eventCode.value = '';
  88. } catch (err) {
  89. statusMessage.value = 'Erro ao realizar o check-in. Verifique os dados e tente novamente.';
  90. console.error(err);
  91. } finally {
  92. isLoading.value = false;
  93. }
  94. }
  95. </script>