Spaces:
Running
Running
je veux une site fullstack mern stack que fait apprende les concepte de mern stack avec des exercice et des test et donner une certificat , name=Arbib_Stack , coleur : rouge et noirVOICI LA CLE API DE GEMINI :AIzaSyCa55JfNKq14N25apSmcWdgQFdKgfz_S9Y // mongodb+srv://arbibm55_db_user:nMVUbj7TDwaPKP3Y@cluster0.pqpfbz4.mongodb.net/
efeb37f verified | // Main JavaScript for ArbibStack Academy | |
| // Initialize the application | |
| document.addEventListener('DOMContentLoaded', function() { | |
| initializeApp(); | |
| setupEventListeners(); | |
| loadUserProgress(); | |
| }); | |
| // Application initialization | |
| function initializeApp() { | |
| console.log('🚀 ArbibStack Academy Initialized'); | |
| // Check if user is logged in | |
| const token = localStorage.getItem('arbibstack_token'); | |
| if (token) { | |
| updateUIForLoggedInUser(); | |
| } | |
| // Initialize tooltips if any | |
| initializeTooltips(); | |
| } | |
| // Setup event listeners | |
| function setupEventListeners() { | |
| // Mobile menu toggle | |
| const mobileMenuBtn = document.getElementById('mobile-menu-btn'); | |
| const mobileMenu = document.getElementById('mobile-menu'); | |
| if (mobileMenuBtn && mobileMenu) { | |
| mobileMenuBtn.addEventListener('click', function() { | |
| mobileMenu.classList.toggle('hidden'); | |
| }); | |
| } | |
| // Search functionality | |
| const searchInput = document.getElementById('search-input'); | |
| if (searchInput) { | |
| searchInput.addEventListener('input', debounce(handleSearch, 300)); | |
| } | |
| // Course enrollment | |
| const enrollButtons = document.querySelectorAll('.enroll-btn'); | |
| enrollButtons.forEach(button => { | |
| button.addEventListener('click', handleEnrollment); | |
| }); | |
| } | |
| // Handle course enrollment | |
| function handleEnrollment(event) { | |
| const courseId = event.target.dataset.courseId; | |
| const token = localStorage.getItem('arbibstack_token'); | |
| if (!token) { | |
| window.location.href = '/login.html'; | |
| return; | |
| } | |
| // Show loading state | |
| event.target.innerHTML = '<span class="loading-dots">Enrollment</span>'; | |
| event.target.disabled = true; | |
| // Simulate API call | |
| setTimeout(() => { | |
| enrollInCourse(courseId, token); | |
| }, 1500); | |
| } | |
| // Simulate course enrollment API call | |
| function enrollInCourse(courseId, token) { | |
| // In a real app, this would be an API call | |
| console.log(`Enrolling in course: ${courseId}`); | |
| // Update UI | |
| const button = document.querySelector(`[data-course-id="${courseId}"]`); | |
| button.innerHTML = 'Enrolled ✓'; | |
| button.classList.remove('bg-primary', 'hover:bg-red-700'); | |
| button.classList.add('bg-green-600'); | |
| // Show success message | |
| showNotification('Successfully enrolled in course!', 'success'); | |
| } | |
| // Search functionality | |
| function handleSearch(event) { | |
| const query = event.target.value.toLowerCase(); | |
| if (query.length < 2) { | |
| clearSearchResults(); | |
| return; | |
| } | |
| // Simulate search API call | |
| const results = simulateSearch(query); | |
| displaySearchResults(results); | |
| } | |
| // Simulate search results | |
| function simulateSearch(query) { | |
| const courses = [ | |
| { id: 1, title: 'MongoDB Basics', type: 'course' }, | |
| { id: 2, title: 'Express.js REST API', type: 'course' }, | |
| { id: 3, title: 'React Hooks Guide', type: 'course' }, | |
| { id: 4, title: 'Node.js Fundamentals', type: 'course' }, | |
| { id: 5, title: 'MERN Stack Project', type: 'project' } | |
| ]; | |
| return courses.filter(course => | |
| course.title.toLowerCase().includes(query) | |
| ); | |
| } | |
| // Display search results | |
| function displaySearchResults(results) { | |
| const searchResults = document.getElementById('search-results'); | |
| if (!searchResults) return; | |
| searchResults.innerHTML = ''; | |
| if (results.length === 0) { | |
| searchResults.innerHTML = '<div class="p-4 text-gray-500">No results found</div>'; | |
| searchResults.classList.remove('hidden'); | |
| return; | |
| } | |
| results.forEach(result => { | |
| const resultElement = document.createElement('a'); | |
| resultElement.href = `/${result.type === 'course' ? 'course' : 'project'}.html?id=${result.id}`; | |
| resultElement.className = 'block p-4 hover:bg-gray-100 border-b border-gray-200'; | |
| resultElement.innerHTML = ` | |
| <div class="flex items-center"> | |
| <i data-feather="${result.type === 'course' ? 'book' : 'folder'}" class="mr-3"></i> | |
| <span>${result.title}</span> | |
| </div> | |
| `; | |
| searchResults.appendChild(resultElement); | |
| }); | |
| searchResults.classList.remove('hidden'); | |
| } | |
| // Clear search results | |
| function clearSearchResults() { | |
| const searchResults = document.getElementById('search-results'); | |
| if (searchResults) { | |
| searchResults.classList.add('hidden'); | |
| } | |
| } | |
| // Load user progress from localStorage | |
| function loadUserProgress() { | |
| const progress = localStorage.getItem('arbibstack_progress'); | |
| if (progress) { | |
| updateProgressBars(JSON.parse(progress)); | |
| } | |
| } | |
| // Update progress bars | |
| function updateProgressBars(progress) { | |
| Object.keys(progress).forEach(course => { | |
| const progressBar = document.getElementById(`progress-${course}`); | |
| if (progressBar) { | |
| progressBar.style.width = `${progress[course]}%`; | |
| progressBar.textContent = `${progress[course]}%`; | |
| } | |
| }); | |
| } | |
| // Show notification | |
| function showNotification(message, type = 'info') { | |
| const notification = document.createElement('div'); | |
| notification.className = `fixed top-4 right-4 p-4 rounded-lg shadow-lg z-50 ${ | |
| type === 'success' ? 'bg-green-500 text-white' : | |
| type === 'error' ? 'bg-red-500 text-white' : | |
| 'bg-blue-500 text-white' | |
| }`; | |
| notification.innerHTML = ` | |
| <div class="flex items-center"> | |
| <i data-feather="${ | |
| type === 'success' ? 'check-circle' : | |
| type === 'error' ? 'alert-circle' : | |
| 'info' | |
| }" class="mr-2"></i> | |
| <span>${message}</span> | |
| </div> | |
| `; | |
| document.body.appendChild(notification); | |
| // Animate in | |
| setTimeout(() => { | |
| notification.style.transform = 'translateX(100%)'; | |
| notification.style.opacity = '0'; | |
| setTimeout(() => { | |
| document.body.removeChild(notification); | |
| }, 300); | |
| }, 3000); | |
| feather.replace(); | |
| } | |
| // Update UI for logged in user | |
| function updateUIForLoggedInUser() { | |
| const userMenu = document.getElementById('user-menu'); | |
| const authButtons = document.getElementById('auth-buttons'); | |
| if (userMenu && authButtons) { | |
| userMenu.classList.remove('hidden'); | |
| authButtons.classList.add('hidden'); | |
| } | |
| } | |
| // Initialize tooltips | |
| function initializeTooltips() { | |
| // Tooltip initialization would go here | |
| // Using a library like Tippy.js in a real implementation | |
| } | |
| // Utility function: Debounce | |
| function debounce(func, wait) { | |
| let timeout; | |
| return function executedFunction(...args) { | |
| const later = () => { | |
| clearTimeout(timeout); | |
| func(...args); | |
| }; | |
| clearTimeout(timeout); | |
| timeout = setTimeout(later, wait); | |
| }; | |
| } | |
| // Export functions for use in other modules | |
| window.ArbibStack = { | |
| initializeApp, | |
| handleEnrollment, | |
| showNotification, | |
| updateProgressBars | |
| }; |