checkin.vue 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <template>
  2. <div class="bg-white p-8 rounded-lg shadow-md text-center w-full max-w-md mx-4">
  3. <h2 class="text-2xl font-bold text-gray-800">Check-in do Evento</h2>
  4. <p class="text-gray-600 mt-2">Preencha seus dados para confirmar a presença.</p>
  5. <form @submit.prevent="handleCheckin" class="flex flex-col gap-4 mt-6">
  6. <input
  7. v-model="name"
  8. type="text"
  9. placeholder="Nome Completo"
  10. :disabled="isLoading"
  11. required
  12. class="px-4 py-3 border border-gray-300 rounded-md w-full focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100"
  13. />
  14. <input
  15. v-model="email"
  16. type="email"
  17. placeholder="Seu melhor e-mail"
  18. :disabled="isLoading"
  19. required
  20. class="px-4 py-3 border border-gray-300 rounded-md w-full focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100"
  21. />
  22. <input
  23. v-model="eventCode"
  24. type="text"
  25. placeholder="Código do Evento"
  26. :disabled="isLoading"
  27. required
  28. class="px-4 py-3 border border-gray-300 rounded-md w-full focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:bg-gray-100"
  29. />
  30. <button
  31. type="submit"
  32. :disabled="isLoading"
  33. class="px-4 py-3 bg-blue-600 text-white font-semibold rounded-md cursor-pointer hover:bg-blue-700 transition-colors duration-200 disabled:bg-gray-400 disabled:cursor-not-allowed"
  34. >
  35. {{ isLoading ? 'Confirmando...' : 'Confirmar Presença' }}
  36. </button>
  37. </form>
  38. <p v-if="statusMessage" class="mt-4 font-semibold text-gray-700">{{ statusMessage }}</p>
  39. </div>
  40. </template>
  41. <script setup>
  42. import { ref } from 'vue';
  43. definePageMeta({
  44. layout: 'checkin',
  45. });
  46. const name = ref('');
  47. const email = ref('');
  48. const eventCode = ref('');
  49. const statusMessage = ref('');
  50. const isLoading = ref(false);
  51. async function handleCheckin() {
  52. if (!name.value || !email.value || !eventCode.value) {
  53. statusMessage.value = 'Por favor, preencha todos os campos.';
  54. return;
  55. }
  56. isLoading.value = true;
  57. statusMessage.value = '';
  58. try {
  59. const { data, error } = await useFetch('/api/perform-checkin', {
  60. method: 'POST',
  61. body: {
  62. name: name.value,
  63. email: email.value,
  64. eventCode: eventCode.value
  65. },
  66. });
  67. if (error.value) {
  68. throw error.value;
  69. }
  70. statusMessage.value = `Check-in realizado com sucesso, ${data.value.name}!`;
  71. name.value = '';
  72. email.value = '';
  73. eventCode.value = '';
  74. } catch (err) {
  75. statusMessage.value = 'Erro ao realizar o check-in. Verifique os dados e tente novamente.';
  76. console.error(err);
  77. } finally {
  78. isLoading.value = false;
  79. }
  80. }
  81. </script>