File size: 9,957 Bytes
b1fb35d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TechMart - Créer un compte</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/scrollreveal"></script>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700&family=Inter:wght@300;400;500&display=swap" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<link rel="stylesheet" href="/static/css/styles.css">
</head>
<body class="bg-gray-900 text-white min-h-screen flex flex-col" style="background-image: url('/static/images/background.jpg');">
<!-- <header class="bg-gray-800 p-4">
<h1 class="text-3xl font-bold text-center"><i class="fas fa-user-plus mr-2"></i>Créer un compte</h1>
</header> -->
<main class="flex-grow container mx-auto p-6 flex flex-col lg:flex-row items-center justify-center space-y-8 lg:space-y-0 lg:space-x-12">
<!-- Camera Section -->
<div class="max-w-md w-full p-6 lg:p-0 lg:w-1/2 flex flex-col items-center video-reveal">
<div class="relative">
<video id="video-preview" autoplay muted class="w-full max-w-md max-h-md aspect-square bg-black rounded-full object-cover shadow-2xl ring-4 ring-gray-300 ring-opacity-50 hover:ring-blue-500 hover:ring-opacity-75 transition-all duration-300 ease-in-out transform hover:scale-105"></video>
<!-- Recording indicator -->
<div id="rec-indicator" class="hidden absolute top-2 right-2 w-4 h-4 bg-red-600 rounded-full animate-pulse"></div>
</div>
<!-- Start Recording Button -->
<div class="text-center mt-6">
<button type="button" id="start-recording" class="bg-red-600 hover:bg-red-700 text-white font-bold w-16 h-16 rounded-full flex items-center justify-center animate-pulse hover:scale-110 active:scale-95 transition-all duration-300 ease-in-out">
<i class="fas fa-video"></i>
</button>
</div>
</div>
<!-- Form Section -->
<div class="max-w-md w-full bg-gray-800/40 backdrop-blur-md rounded-xl shadow-lg p-6 lg:w-1/2 transform transition-all duration-300 hover:scale-102 hover:shadow-md form-reveal">
<form id="create-account-form" method="POST" action="/submitAccount" class="space-y-6" enctype="multipart/form-data">
<div>
<label for="email" class="block text-sm font-medium text-gray-300">Email Address</label>
<input type="email" id="email" name="email" required class="w-full px-4 py-3 mt-2 bg-gray-700 text-white rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50 transition duration-300 ease-in-out">
</div>
<button type="submit" class="w-full bg-green-600 hover:bg-green-700 text-white font-bold py-3 px-4 rounded-lg transition-all duration-300 ease-in-out transform hover:scale-102">
Create Account 🤗
</button>
</form>
<div id="error-message" class="mt-4 text-center text-red-500"></div>
</div>
</main>
<!-- <footer class="bg-gray-800 p-4 text-center">
<p>© 2023 TechMart. Tous droits réservés.</p>
</footer> -->
<script>
document.addEventListener('DOMContentLoaded', function() {
// Animation pour la section vidéo avec un zoom-in et glissement vers le haut
ScrollReveal().reveal('.video-reveal', {
duration: 1200, // Durée de l'animation
scale: 0.9, // Zoom initial (90%)
distance: '30px', // Glissement vers le haut
origin: 'bottom', // Animation qui part du bas
opacity: 0, // Apparition progressive
easing: 'ease-in-out', // Transition fluide
delay: 200 // Délai avant le début
});
// Animation pour la section formulaire avec un glissement depuis la droite
ScrollReveal().reveal('.form-reveal', {
duration: 1200, // Durée de l'animation
distance: '60px', // Distance de glissement depuis la droite
origin: 'right', // Animation qui part de la droite
opacity: 0, // Apparition progressive
easing: 'ease-in-out', // Transition fluide
delay: 400 // Délai un peu plus long pour que l'effet soit coordonné
});
// Appelle la fonction de caméra et remplissage de l'email après le chargement de la page
fillEmailFromUrl();
startCamera();
});
// Add this function at the beginning of the script
function fillEmailFromUrl() {
const urlParams = new URLSearchParams(window.location.search);
const email = urlParams.get('email');
if (email) {
document.getElementById('email').value = decodeURIComponent(email);
}
}
// Call this function when the page loads
window.onload = function () {
fillEmailFromUrl();
startCamera();
};
let mediaRecorder;
let recordedChunks = [];
let stream;
let isRecording = false;
const recIndicator = document.getElementById('rec-indicator');
// Function to start the camera
async function startCamera() {
const videoPreview = document.getElementById('video-preview');
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
try {
stream = await navigator.mediaDevices.getUserMedia({ video: true });
videoPreview.srcObject = stream;
} catch (error) {
console.error('Erreur lors de l\'accès à la caméra:', error);
document.getElementById('error-message').innerText = 'Erreur lors de l\'accès à la caméra. Veuillez vérifier vos permissions.';
}
} else {
document.getElementById('error-message').innerText = 'Votre navigateur ne supporte pas l\'accès à la caméra.';
}
}
document.getElementById('start-recording').addEventListener('click', function () {
if (stream) {
if (!isRecording) {
// Démarrer l'enregistrement
mediaRecorder = new MediaRecorder(stream);
recordedChunks = [];
mediaRecorder.ondataavailable = function (event) {
if (event.data.size > 0) {
recordedChunks.push(event.data);
}
};
mediaRecorder.start();
isRecording = true;
recIndicator.classList.remove('hidden');
// Ajouter une classe d'animation plus subtile pour indiquer que l'enregistrement est en cours
this.classList.remove('bg-red-600', 'hover:bg-red-700');
this.classList.add('bg-red-700', 'animate-pulse');
this.innerHTML = '<i class="fas fa-stop-circle"></i>';
// Arrêter automatiquement après 5 secondes
setTimeout(() => {
if (isRecording) {
stopRecording();
}
}, 5000);
} else {
// Arrêter l'enregistrement
stopRecording();
}
} else {
document.getElementById('error-message').innerText = 'Camera is not accessible. Please refresh the page.';
}
});
function stopRecording() {
mediaRecorder.stop();
isRecording = false;
recIndicator.classList.add('hidden');
// Remettre le bouton à son état initial (pulsation désactivée et retour au style initial)
const recordButton = document.getElementById('start-recording');
recordButton.classList.remove('bg-red-700', 'animate-pulse');
recordButton.classList.add('bg-red-600', 'hover:bg-red-700');
recordButton.innerHTML = '<i class="fas fa-video"></i>';
}
document.getElementById('create-account-form').addEventListener('submit', async function (event) {
event.preventDefault();
const email = document.getElementById('email').value;
// Créer un objet FormData pour envoyer la vidéo et l'email
const formData = new FormData();
formData.append('email', email);
// Créer un Blob de la vidéo enregistrée et l'ajouter au formData
const blob = new Blob(recordedChunks, { type: 'video/webm' });
formData.append('video', blob, 'video_user.webm');
try {
const response = await fetch('/submitAccount', {
method: 'POST',
body: formData
});
if (response.ok) {
window.location.href = '/index';
} else {
const errorData = await response.json();
document.getElementById('error-message').innerText = `Error occurred while creating the account: ${errorData.detail || 'Unknown error'}`;
}
} catch (error) {
document.getElementById('error-message').innerText = 'Une erreur est survenue. Veuillez réessayer.';
console.error('Error while submitting the form:', error);
}
});
</script>
</body>
</html> |