138 lines
4.9 KiB
Vue
138 lines
4.9 KiB
Vue
|
|
<template>
|
||
|
|
<div class="min-h-screen flex items-center justify-center bg-gradient-to-br from-indigo-50 to-blue-100 p-4">
|
||
|
|
<div class="w-full max-w-md">
|
||
|
|
<q-card class="rounded-2xl shadow-xl">
|
||
|
|
<q-card-section class="text-center py-10 px-8">
|
||
|
|
<!-- Loading State -->
|
||
|
|
<template v-if="loading">
|
||
|
|
<q-spinner color="primary" size="60px" class="mb-6" />
|
||
|
|
<h1 class="text-2xl font-bold text-gray-800 mb-2">กำลังยืนยันอีเมล...</h1>
|
||
|
|
<p class="text-gray-500">กรุณารอสักครู่</p>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<!-- Success State -->
|
||
|
|
<template v-else-if="verified">
|
||
|
|
<div class="w-20 h-20 rounded-full bg-green-100 flex items-center justify-center mx-auto mb-6">
|
||
|
|
<q-icon name="check_circle" size="60px" color="positive" />
|
||
|
|
</div>
|
||
|
|
<h1 class="text-2xl font-bold text-gray-800 mb-2">ยืนยันอีเมลสำเร็จ!</h1>
|
||
|
|
<p class="text-gray-500 mb-6">{{ message || 'อีเมลของคุณได้รับการยืนยันเรียบร้อยแล้ว' }}</p>
|
||
|
|
<q-btn
|
||
|
|
color="primary"
|
||
|
|
label="กลับสู่หน้าหลัก"
|
||
|
|
class="px-8"
|
||
|
|
@click="navigateTo('/instructor')"
|
||
|
|
/>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<!-- Error State -->
|
||
|
|
<template v-else-if="error">
|
||
|
|
<div class="w-20 h-20 rounded-full bg-red-100 flex items-center justify-center mx-auto mb-6">
|
||
|
|
<q-icon name="error" size="60px" color="negative" />
|
||
|
|
</div>
|
||
|
|
<h1 class="text-2xl font-bold text-gray-800 mb-2">ยืนยันอีเมลไม่สำเร็จ</h1>
|
||
|
|
<p class="text-gray-500 mb-6">{{ message || 'ลิงก์ยืนยันอีเมลไม่ถูกต้องหรือหมดอายุ' }}</p>
|
||
|
|
<div class="flex flex-col gap-3">
|
||
|
|
<q-btn
|
||
|
|
color="primary"
|
||
|
|
label="เข้าสู่ระบบ"
|
||
|
|
class="px-8"
|
||
|
|
@click="navigateTo('/login')"
|
||
|
|
/>
|
||
|
|
<q-btn
|
||
|
|
flat
|
||
|
|
color="grey-7"
|
||
|
|
label="ขอลิงก์ใหม่"
|
||
|
|
@click="resendVerification"
|
||
|
|
:loading="resending"
|
||
|
|
/>
|
||
|
|
</div>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<!-- No Token State -->
|
||
|
|
<template v-else>
|
||
|
|
<div class="w-20 h-20 rounded-full bg-orange-100 flex items-center justify-center mx-auto mb-6">
|
||
|
|
<q-icon name="warning" size="60px" color="warning" />
|
||
|
|
</div>
|
||
|
|
<h1 class="text-2xl font-bold text-gray-800 mb-2">ไม่พบ Token</h1>
|
||
|
|
<p class="text-gray-500 mb-6">ไม่พบ Token สำหรับยืนยันอีเมล กรุณาตรวจสอบลิงก์อีกครั้ง</p>
|
||
|
|
<q-btn
|
||
|
|
color="primary"
|
||
|
|
label="กลับสู่หน้าหลัก"
|
||
|
|
class="px-8"
|
||
|
|
@click="navigateTo('/')"
|
||
|
|
/>
|
||
|
|
</template>
|
||
|
|
</q-card-section>
|
||
|
|
</q-card>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</template>
|
||
|
|
|
||
|
|
<script setup lang="ts">
|
||
|
|
import { authService } from '~/services/auth.service';
|
||
|
|
|
||
|
|
definePageMeta({
|
||
|
|
layout: 'blank'
|
||
|
|
});
|
||
|
|
|
||
|
|
const route = useRoute();
|
||
|
|
|
||
|
|
const loading = ref(false);
|
||
|
|
const verified = ref(false);
|
||
|
|
const error = ref(false);
|
||
|
|
const message = ref('');
|
||
|
|
const resending = ref(false);
|
||
|
|
|
||
|
|
const verifyEmail = async (token: string) => {
|
||
|
|
loading.value = true;
|
||
|
|
error.value = false;
|
||
|
|
verified.value = false;
|
||
|
|
|
||
|
|
try {
|
||
|
|
const response = await authService.verifyEmail(token);
|
||
|
|
verified.value = true;
|
||
|
|
message.value = response.message || '';
|
||
|
|
} catch (err: any) {
|
||
|
|
error.value = true;
|
||
|
|
message.value = err.data?.message || err.data?.error?.message || 'ลิงก์ยืนยันอีเมลไม่ถูกต้องหรือหมดอายุ';
|
||
|
|
} finally {
|
||
|
|
loading.value = false;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
const resendVerification = async () => {
|
||
|
|
resending.value = true;
|
||
|
|
try {
|
||
|
|
await authService.sendVerifyEmail();
|
||
|
|
message.value = 'ส่งอีเมลยืนยันใหม่แล้ว กรุณาตรวจสอบอีเมลของคุณ';
|
||
|
|
error.value = false;
|
||
|
|
} catch (err: any) {
|
||
|
|
message.value = err.data?.message || 'กรุณาเข้าสู่ระบบก่อนขอลิงก์ยืนยันใหม่';
|
||
|
|
} finally {
|
||
|
|
resending.value = false;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
onMounted(() => {
|
||
|
|
const token = route.query.token as string;
|
||
|
|
if (token) {
|
||
|
|
verifyEmail(token);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<style scoped>
|
||
|
|
.bg-green-100 {
|
||
|
|
background-color: #dcfce7;
|
||
|
|
}
|
||
|
|
|
||
|
|
.bg-red-100 {
|
||
|
|
background-color: #fee2e2;
|
||
|
|
}
|
||
|
|
|
||
|
|
.bg-orange-100 {
|
||
|
|
background-color: #ffedd5;
|
||
|
|
}
|
||
|
|
</style>
|