checkin.vue 3.2 KB

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