2025-08-08 22:51:14 +02:00
|
|
|
<template>
|
2025-08-09 18:44:33 +02:00
|
|
|
<div :class="containerClasses">
|
2025-08-08 22:51:14 +02:00
|
|
|
<v-container class="fill-height" fluid>
|
|
|
|
|
<v-row align="center" justify="center">
|
|
|
|
|
<v-col cols="12" sm="8" md="6" lg="4">
|
|
|
|
|
<v-card class="elevation-12 rounded-lg">
|
|
|
|
|
<v-card-text class="text-center pa-8">
|
|
|
|
|
<div class="mb-6">
|
|
|
|
|
<v-icon
|
|
|
|
|
color="success"
|
|
|
|
|
size="80"
|
|
|
|
|
class="mb-4"
|
|
|
|
|
>
|
|
|
|
|
mdi-check-circle
|
|
|
|
|
</v-icon>
|
|
|
|
|
|
|
|
|
|
<h1 class="text-h4 font-weight-bold text-success mb-3">
|
|
|
|
|
Email Verified Successfully!
|
|
|
|
|
</h1>
|
|
|
|
|
|
|
|
|
|
<p class="text-body-1 text-medium-emphasis mb-2" v-if="email">
|
|
|
|
|
Your email address <strong>{{ email }}</strong> has been verified.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p class="text-body-1 text-medium-emphasis mb-6">
|
|
|
|
|
Your MonacoUSA Portal account is now active and ready to use.
|
|
|
|
|
You can now log in to access your dashboard and member features.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<!-- Warning message for partial verification -->
|
|
|
|
|
<v-alert
|
|
|
|
|
v-if="partialWarning"
|
|
|
|
|
type="warning"
|
|
|
|
|
variant="tonal"
|
|
|
|
|
class="mb-4 text-start"
|
|
|
|
|
icon="mdi-information"
|
|
|
|
|
>
|
|
|
|
|
<div class="text-body-2">
|
|
|
|
|
<strong>Note:</strong> Your email has been verified, but there may have been
|
|
|
|
|
a minor issue updating your account status. If you experience any login
|
|
|
|
|
problems, please contact support.
|
|
|
|
|
</div>
|
|
|
|
|
</v-alert>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="d-flex flex-column gap-3">
|
|
|
|
|
<v-btn
|
|
|
|
|
color="primary"
|
|
|
|
|
size="large"
|
|
|
|
|
variant="elevated"
|
|
|
|
|
block
|
2025-08-09 18:10:33 +02:00
|
|
|
:href="setupPasswordUrl"
|
|
|
|
|
target="_blank"
|
2025-08-08 22:51:14 +02:00
|
|
|
class="text-none"
|
|
|
|
|
>
|
2025-08-09 18:10:33 +02:00
|
|
|
<v-icon start>mdi-lock</v-icon>
|
|
|
|
|
Set Your Password
|
2025-08-08 22:51:14 +02:00
|
|
|
</v-btn>
|
|
|
|
|
|
|
|
|
|
<v-btn
|
|
|
|
|
color="secondary"
|
|
|
|
|
size="large"
|
|
|
|
|
variant="outlined"
|
|
|
|
|
block
|
2025-08-09 18:10:33 +02:00
|
|
|
:to="{ path: '/login', query: { verified: 'true' } }"
|
|
|
|
|
class="text-none"
|
|
|
|
|
>
|
|
|
|
|
<v-icon start>mdi-login</v-icon>
|
|
|
|
|
Log In to Portal
|
|
|
|
|
</v-btn>
|
|
|
|
|
|
|
|
|
|
<v-btn
|
|
|
|
|
color="outline"
|
|
|
|
|
size="small"
|
|
|
|
|
variant="text"
|
|
|
|
|
block
|
2025-08-08 22:51:14 +02:00
|
|
|
to="/"
|
|
|
|
|
class="text-none"
|
|
|
|
|
>
|
|
|
|
|
<v-icon start>mdi-home</v-icon>
|
|
|
|
|
Return to Home
|
|
|
|
|
</v-btn>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Additional help -->
|
|
|
|
|
<div class="mt-6 pt-4 border-t">
|
|
|
|
|
<p class="text-caption text-medium-emphasis mb-2">
|
|
|
|
|
Need help? Contact support at:
|
|
|
|
|
</p>
|
|
|
|
|
<v-chip
|
|
|
|
|
size="small"
|
|
|
|
|
variant="outlined"
|
|
|
|
|
prepend-icon="mdi-email"
|
|
|
|
|
>
|
|
|
|
|
support@monacousa.org
|
|
|
|
|
</v-chip>
|
|
|
|
|
</div>
|
|
|
|
|
</v-card-text>
|
|
|
|
|
</v-card>
|
|
|
|
|
</v-col>
|
|
|
|
|
</v-row>
|
|
|
|
|
</v-container>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
2025-08-09 18:44:33 +02:00
|
|
|
import {
|
|
|
|
|
getOptimizedClasses,
|
|
|
|
|
applyMobileSafariFixes
|
|
|
|
|
} from '~/utils/mobile-safari-utils';
|
|
|
|
|
|
2025-08-08 22:51:14 +02:00
|
|
|
definePageMeta({
|
|
|
|
|
layout: false,
|
|
|
|
|
middleware: 'guest'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Get query parameters
|
|
|
|
|
const route = useRoute();
|
|
|
|
|
const email = computed(() => route.query.email as string || '');
|
|
|
|
|
const partialWarning = computed(() => route.query.warning === 'partial');
|
|
|
|
|
|
2025-08-09 18:44:33 +02:00
|
|
|
// Mobile Safari optimization classes
|
|
|
|
|
const containerClasses = computed(() => [
|
|
|
|
|
'verification-success',
|
|
|
|
|
...getOptimizedClasses()
|
|
|
|
|
].join(' '));
|
|
|
|
|
|
|
|
|
|
// Setup password URL for Keycloak - Fixed URL structure
|
2025-08-09 18:10:33 +02:00
|
|
|
const setupPasswordUrl = computed(() => {
|
|
|
|
|
const runtimeConfig = useRuntimeConfig();
|
2025-08-09 18:44:33 +02:00
|
|
|
const keycloakIssuer = runtimeConfig.public.keycloakIssuer || 'https://auth.monacousa.org/realms/monacousa';
|
|
|
|
|
|
|
|
|
|
// Use the correct Keycloak account management URL
|
|
|
|
|
// Remove the hash fragment that was causing 404 errors
|
|
|
|
|
return `${keycloakIssuer}/account/`;
|
2025-08-09 18:10:33 +02:00
|
|
|
});
|
|
|
|
|
|
2025-08-09 18:44:33 +02:00
|
|
|
// Set page title with mobile viewport optimization
|
2025-08-08 22:51:14 +02:00
|
|
|
useHead({
|
|
|
|
|
title: 'Email Verified - MonacoUSA Portal',
|
|
|
|
|
meta: [
|
|
|
|
|
{
|
|
|
|
|
name: 'description',
|
|
|
|
|
content: 'Your email has been successfully verified. You can now log in to the MonacoUSA Portal.'
|
2025-08-09 18:44:33 +02:00
|
|
|
},
|
|
|
|
|
{ name: 'viewport', content: 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no' }
|
2025-08-08 22:51:14 +02:00
|
|
|
]
|
|
|
|
|
});
|
|
|
|
|
|
2025-08-09 18:44:33 +02:00
|
|
|
// Apply mobile Safari fixes and track verification
|
2025-08-08 22:51:14 +02:00
|
|
|
onMounted(() => {
|
2025-08-09 18:44:33 +02:00
|
|
|
// Apply mobile Safari fixes
|
|
|
|
|
if (typeof window !== 'undefined') {
|
|
|
|
|
applyMobileSafariFixes();
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-08 22:51:14 +02:00
|
|
|
console.log('[verify-success] Email verification completed', {
|
|
|
|
|
email: email.value,
|
2025-08-09 18:44:33 +02:00
|
|
|
partialWarning: partialWarning.value,
|
|
|
|
|
setupPasswordUrl: setupPasswordUrl.value
|
2025-08-08 22:51:14 +02:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
.verification-success {
|
|
|
|
|
min-height: 100vh;
|
2025-08-09 18:44:33 +02:00
|
|
|
min-height: calc(var(--vh, 1vh) * 100); /* Mobile Safari fallback */
|
2025-08-08 22:51:14 +02:00
|
|
|
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
|
2025-08-09 18:44:33 +02:00
|
|
|
overflow-x: hidden; /* Prevent horizontal scroll on mobile */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Mobile Safari optimizations */
|
|
|
|
|
.verification-success.is-mobile-safari {
|
|
|
|
|
min-height: 100vh;
|
|
|
|
|
min-height: -webkit-fill-available;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.verification-success.performance-mode {
|
|
|
|
|
will-change: auto;
|
|
|
|
|
transform: translateZ(0); /* Lighter hardware acceleration */
|
2025-08-08 22:51:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.fill-height {
|
|
|
|
|
min-height: 100vh;
|
2025-08-09 18:44:33 +02:00
|
|
|
min-height: calc(var(--vh, 1vh) * 100); /* Mobile Safari fallback */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Mobile Safari fill-height optimization */
|
|
|
|
|
.is-mobile-safari .fill-height {
|
|
|
|
|
min-height: -webkit-fill-available;
|
2025-08-08 22:51:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.border-t {
|
|
|
|
|
border-top: 1px solid rgba(var(--v-border-color), var(--v-border-opacity));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.gap-3 {
|
|
|
|
|
gap: 12px;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-09 18:44:33 +02:00
|
|
|
/* Animation for the success icon - reduced for performance mode */
|
2025-08-08 22:51:14 +02:00
|
|
|
.v-icon {
|
|
|
|
|
animation: bounce 0.6s ease-in-out;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-09 18:44:33 +02:00
|
|
|
.performance-mode .v-icon {
|
|
|
|
|
animation: none; /* Disable animations on performance mode */
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-08 22:51:14 +02:00
|
|
|
@keyframes bounce {
|
|
|
|
|
0%, 20%, 53%, 80%, 100% {
|
|
|
|
|
transform: translate3d(0, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
40%, 43% {
|
|
|
|
|
transform: translate3d(0, -8px, 0);
|
|
|
|
|
}
|
|
|
|
|
70% {
|
|
|
|
|
transform: translate3d(0, -4px, 0);
|
|
|
|
|
}
|
|
|
|
|
90% {
|
|
|
|
|
transform: translate3d(0, -2px, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-08-09 18:44:33 +02:00
|
|
|
|
|
|
|
|
/* Custom scrollbar for mobile */
|
|
|
|
|
::-webkit-scrollbar {
|
|
|
|
|
width: 4px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
::-webkit-scrollbar-track {
|
|
|
|
|
background: rgba(255, 255, 255, 0.1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
::-webkit-scrollbar-thumb {
|
|
|
|
|
background: rgba(163, 21, 21, 0.5);
|
|
|
|
|
border-radius: 2px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Responsive adjustments */
|
|
|
|
|
@media (max-width: 600px) {
|
|
|
|
|
.verification-success {
|
|
|
|
|
padding: 16px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.v-card {
|
|
|
|
|
margin: 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Optimize button spacing on mobile */
|
|
|
|
|
.gap-3 {
|
|
|
|
|
gap: 8px;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Improve touch targets on mobile */
|
|
|
|
|
@media (hover: none) and (pointer: coarse) {
|
|
|
|
|
.v-btn {
|
|
|
|
|
min-height: 48px; /* Ensure touch-friendly button size */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Performance mode optimizations */
|
|
|
|
|
.performance-mode .v-card {
|
|
|
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1) !important; /* Lighter shadow */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.performance-mode .v-btn {
|
|
|
|
|
transition: none; /* Remove button transitions for better performance */
|
|
|
|
|
}
|
2025-08-08 22:51:14 +02:00
|
|
|
</style>
|