quick-fix-repairs / script.js
Hamid-Shah's picture
{
ac8bb9a verified
// Mobile menu toggle
document.addEventListener('DOMContentLoaded', function() {
const mobileMenuBtn = document.getElementById('mobile-menu-btn');
const mobileMenu = document.getElementById('mobile-menu');
mobileMenuBtn.addEventListener('click', function() {
mobileMenu.classList.toggle('hidden');
});
// Close mobile menu when clicking on a link
mobileMenu.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => {
mobileMenu.classList.add('hidden');
});
});
});
// FAQ Accordion
document.querySelectorAll('.faq-question').forEach(button => {
button.addEventListener('click', () => {
const answer = button.nextElementSibling;
const icon = button.querySelector('i');
// Close all other FAQs
document.querySelectorAll('.faq-answer').forEach(otherAnswer => {
if (otherAnswer !== answer) {
otherAnswer.classList.add('hidden');
otherAnswer.previousElementSibling.querySelector('i').style.transform = 'rotate(0deg)';
}
});
// Toggle current FAQ
answer.classList.toggle('hidden');
icon.style.transform = answer.classList.contains('hidden') ? 'rotate(0deg)' : 'rotate(180deg)';
});
});
// Contact Form Handler
document.getElementById('contact-form').addEventListener('submit', function(e) {
e.preventDefault();
// Get form data
const formData = new FormData(this);
const data = Object.fromEntries(formData);
// Show success message
showToast('Message sent successfully! We\'ll get back to you soon.');
// Reset form
this.reset();
});
// Toast notification function
function showToast(message) {
const toast = document.createElement('div');
toast.className = 'toast show';
toast.textContent = message;
document.body.appendChild(toast);
setTimeout(() => {
toast.classList.remove('show');
setTimeout(() => toast.remove(), 300);
}, 3000);
}
// Parts Catalog Data
const partsData = [
// iPhone Parts
{ id: 1, name: 'iPhone 15 Pro Max Screen OLED', brand: 'iphone', price: 75000, image: 'http://static.photos/technology/320x240/100', available: true },
{ id: 2, name: 'iPhone 14 Pro Screen OLED', brand: 'iphone', price: 65000, image: 'http://static.photos/technology/320x240/101', available: true },
{ id: 3, name: 'iPhone 13 Screen OLED', brand: 'iphone', price: 45000, image: 'http://static.photos/technology/320x240/102', available: true },
{ id: 4, name: 'iPhone 12 Screen OLED', brand: 'iphone', price: 35000, image: 'http://static.photos/technology/320x240/103', available: true },
{ id: 5, name: 'iPhone 11 Screen LCD', brand: 'iphone', price: 25000, image: 'http://static.photos/technology/320x240/104', available: true },
{ id: 6, name: 'iPhone X/XS Screen OLED', brand: 'iphone', price: 20000, image: 'http://static.photos/technology/320x240/105', available: true },
{ id: 7, name: 'iPhone 8 Plus Screen LCD', brand: 'iphone', price: 12000, image: 'http://static.photos/technology/320x240/106', available: true },
{ id: 8, name: 'iPhone 7 Screen LCD', brand: 'iphone', price: 10000, image: 'http://static.photos/technology/320x240/107', available: true },
{ id: 9, name: 'iPhone 6S Screen LCD', brand: 'iphone', price: 8000, image: 'http://static.photos/technology/320x240/108', available: true },
{ id: 10, name: 'iPhone 5S Screen LCD', brand: 'iphone', price: 5000, image: 'http://static.photos/technology/320x240/109', available: true },
{ id: 11, name: 'iPhone 14 Pro Camera Triple', brand: 'iphone', price: 35000, image: 'http://static.photos/technology/320x240/110', available: true },
{ id: 12, name: 'iPhone 13 Pro Camera Triple', brand: 'iphone', price: 30000, image: 'http://static.photos/technology/320x240/111', available: true },
{ id: 13, name: 'iPhone 12 Pro Camera Triple', brand: 'iphone', price: 25000, image: 'http://static.photos/technology/320x240/112', available: true },
{ id: 14, name: 'iPhone 11 Pro Camera Triple', brand: 'iphone', price: 20000, image: 'http://static.photos/technology/320x240/113', available: true },
{ id: 15, name: 'iPhone Battery Original All Models', brand: 'iphone', price: 8000, image: 'http://static.photos/technology/320x240/114', available: true },
// Samsung Parts
{ id: 16, name: 'Samsung S23 Ultra Screen AMOLED', brand: 'samsung', price: 55000, image: 'http://static.photos/technology/320x240/115', available: true },
{ id: 17, name: 'Samsung S22 Ultra Screen AMOLED', brand: 'samsung', price: 45000, image: 'http://static.photos/technology/320x240/116', available: true },
{ id: 18, name: 'Samsung S21 Ultra Screen AMOLED', brand: 'samsung', price: 35000, image: 'http://static.photos/technology/320x240/117', available: true },
{ id: 19, name: 'Samsung A54 Screen AMOLED', brand: 'samsung', price: 28000, image: 'http://static.photos/technology/320x240/118', available: true },
{ id: 20, name: 'Samsung A34 Screen AMOLED', brand: 'samsung', price: 22000, image: 'http://static.photos/technology/320x240/119', available: true },
{ id: 21, name: 'Samsung A24 Screen AMOLED', brand: 'samsung', price: 18000, image: 'http://static.photos/technology/320x240/120', available: true },
{ id: 22, name: 'Samsung S23 Ultra Camera Quad', brand: 'samsung', price: 40000, image: 'http://static.photos/technology/320x240/121', available: true },
{ id: 23, name: 'Samsung A54 Camera Triple', brand: 'samsung', price: 15000, image: 'http://static.photos/technology/320x240/122', available: true },
{ id: 24, name: 'Samsung Battery Original All Models', brand: 'samsung', price: 6000, image: 'http://static.photos/technology/320x240/123', available: true },
// Vivo Parts
{ id: 25, name: 'Vivo X90 Pro Screen AMOLED', brand: 'vivo', price: 32000, image: 'http://static.photos/technology/320x240/124', available: true },
{ id: 26, name: 'Vivo X80 Screen AMOLED', brand: 'vivo', price: 28000, image: 'http://static.photos/technology/320x240/125', available: true },
{ id: 27, name: 'Vivo Y78 Screen AMOLED', brand: 'vivo', price: 20000, image: 'http://static.photos/technology/320x240/126', available: true },
{ id: 28, name: 'Vivo Y55 Screen AMOLED', brand: 'vivo', price: 16000, image: 'http://static.photos/technology/320x240/127', available: true },
{ id: 29, name: 'Vivo Y35 Screen LCD', brand: 'vivo', price: 12000, image: 'http://static.photos/technology/320x240/128', available: true },
{ id: 30, name: 'Vivo Y27 Screen LCD', brand: 'vivo', price: 10000, image: 'http://static.photos/technology/320x240/129', available: true },
{ id: 31, name: 'Vivo X90 Camera Dual', brand: 'vivo', price: 18000, image: 'http://static.photos/technology/320x240/130', available: true },
{ id: 32, name: 'Vivo Battery Original All Models', brand: 'vivo', price: 4000, image: 'http://static.photos/technology/320x240/131', available: true },
// Oppo Parts
{ id: 33, name: 'Oppo Find X6 Pro Screen AMOLED', brand: 'oppo', price: 35000, image: 'http://static.photos/technology/320x240/132', available: true },
{ id: 34, name: 'Oppo Find X5 Pro Screen AMOLED', brand: 'oppo', price: 30000, image: 'http://static.photos/technology/320x240/133', available: true },
{ id: 35, name: 'Oppo Reno 8 Pro Screen AMOLED', brand: 'oppo', price: 25000, image: 'http://static.photos/technology/320x240/134', available: true },
{ id: 36, name: 'Oppo A78 Screen AMOLED', brand: 'oppo', price: 18000, image: 'http://static.photos/technology/320x240/135', available: true },
{ id: 37, name: 'Oppo A57 Screen LCD', brand: 'oppo', price: 12000, image: 'http://static.photos/technology/320x240/136', available: true },
{ id: 38, name: 'Oppo A54 Screen LCD', brand: 'oppo', price: 10000, image: 'http://static.photos/technology/320x240/137', available: true },
{ id: 39, name: 'Oppo Reno 8 Camera Triple', brand: 'oppo', price: 16000, image: 'http://static.photos/technology/320x240/138', available: true },
{ id: 40, name: 'Oppo Battery Original All Models', brand: 'oppo', price: 4500, image: 'http://static.photos/technology/320x240/139', available: true },
// Infinix Parts
{ id: 41, name: 'Infinix Zero 30 Screen AMOLED', brand: 'infinix', price: 18000, image: 'http://static.photos/technology/320x240/140', available: true },
{ id: 42, name: 'Infinix Note 30 Pro Screen AMOLED', brand: 'infinix', price: 16000, image: 'http://static.photos/technology/320x240/141', available: true },
{ id: 43, name: 'Infinix Hot 30 Screen LCD', brand: 'infinix', price: 8000, image: 'http://static.photos/technology/320x240/142', available: true },
{ id: 44, name: 'Infinix Smart 7 Screen LCD', brand: 'infinix', price: 6000, image: 'http://static.photos/technology/320x240/143', available: true },
{ id: 45, name: 'Infinix Zero 30 Camera Dual', brand: 'infinix', price: 12000, image: 'http://static.photos/technology/320x240/144', available: true },
{ id: 46, name: 'Infinix Battery Original All Models', brand: 'infinix', price: 3000, image: 'http://static.photos/technology/320x240/145', available: true },
// Tecno Parts
{ id: 47, name: 'Tecno Phantom V Fold Screen Foldable', brand: 'tecno', price: 45000, image: 'http://static.photos/technology/320x240/146', available: true },
{ id: 48, name: 'Tecno Phantom X2 Screen AMOLED', brand: 'tecno', price: 20000, image: 'http://static.photos/technology/320x240/147', available: true },
{ id: 49, name: 'Tecno Camon 20 Pro Screen AMOLED', brand: 'tecno', price: 18000, image: 'http://static.photos/technology/320x240/148', available: true },
{ id: 50, name: 'Tecno Spark 10 Pro Screen LCD', brand: 'tecno', price: 10000, image: 'http://static.photos/technology/320x240/149', available: true },
{ id: 51, name: 'Tecno Pova 3 Screen LCD', brand: 'tecno', price: 8000, image: 'http://static.photos/technology/320x240/150', available: true },
{ id: 52, name: 'Tecno Camon 20 Camera Triple', brand: 'tecno', price: 14000, image: 'http://static.photos/technology/320x240/151', available: true },
{ id: 53, name: 'Tecno Battery Original All Models', brand: 'tecno', price: 2500, image: 'http://static.photos/technology/320x240/152', available: true },
// Common Parts
{ id: 54, name: 'Phone Bodies Original All Brands', brand: 'all', price: 5000, image: 'http://static.photos/technology/320x240/153', available: true },
{ id: 55, name: 'Charging Port Flex Cable', brand: 'all', price: 2000, image: 'http://static.photos/technology/320x240/154', available: true },
{ id: 56, name: 'Speaker & Earpiece Set', brand: 'all', price: 1500, image: 'http://static.photos/technology/320x240/155', available: true },
{ id: 57, name: 'Power & Volume Buttons', brand: 'all', price: 1200, image: 'http://static.photos/technology/320x240/156', available: true },
{ id: 58, name: 'SIM Tray Original', brand: 'all', price: 800, image: 'http://static.photos/technology/320x240/157', available: true }
];
// Render parts
function renderParts(brand = 'all') {
const partsGrid = document.getElementById('parts-grid');
const filteredParts = brand === 'all' ? partsData : partsData.filter(part => part.brand === brand);
partsGrid.innerHTML = filteredParts.map(part => `
<div class="part-card bg-white rounded-lg shadow-lg overflow-hidden">
<img src="${part.image}" alt="${part.name}" class="w-full h-48 object-cover">
<div class="p-4">
<h3 class="font-bold text-lg mb-2">${part.name}</h3>
<div class="flex justify-between items-center mb-3">
<span class="text-2xl font-bold text-primary-red">Rs. ${part.price.toLocaleString()}</span>
<span class="badge ${part.available ? 'bg-green-500' : 'bg-red-500'}">
${part.available ? 'In Stock' : 'Out of Stock'}
</span>
</div>
<button class="w-full bg-primary-red text-white py-2 rounded-lg hover:bg-red-600 transition-colors ${!part.available ? 'opacity-50 cursor-not-allowed' : ''}"
${!part.available ? 'disabled' : ''}>
${part.available ? 'Order Now' : 'Unavailable'}
</button>
</div>
</div>
`).join('');
// Reinitialize feather icons
feather.replace();
}
// Brand filter functionality
document.querySelectorAll('.brand-filter').forEach(button => {
button.addEventListener('click', function() {
// Update button styles
document.querySelectorAll('.brand-filter').forEach(btn => {
btn.classList.remove('bg-primary-red', 'text-white');
btn.classList.add('bg-gray-200');
});
this.classList.remove('bg-gray-200');
this.classList.add('bg-primary-red', 'text-white');
// Filter parts
renderParts(this.dataset.brand);
});
});
// Initialize parts on page load
document.addEventListener('DOMContentLoaded', function() {
renderParts();
});
// Smooth scroll for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
// Intersection Observer for animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -100px 0px'
};
const observer = new IntersectionObserver(function(entries) {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, observerOptions);
// Observe service cards
document.querySelectorAll('.service-card').forEach(card => {
observer.observe(card);
});
// Add loading animation
window.addEventListener('load', function() {
document.body.classList.add('loaded');
});
// WhatsApp button hover effect
const whatsappBtn = document.querySelector('a[href*="wa.me"]');
if (whatsappBtn) {
whatsappBtn.addEventListener('mouseenter', function() {
this.querySelector('svg').style.animation = 'pulse 1s infinite';
});
whatsappBtn.addEventListener('mouseleave', function() {
this.querySelector('svg').style.animation = '';
});
}
// Add pulse animation
const style = document.createElement('style');
style.textContent = `
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.1); }
100% { transform: scale(1); }
}
`;
document.head.appendChild(style);
// Sticky header background on scroll
window.addEventListener('scroll', function() {
const nav = document.querySelector('nav');
if (window.scrollY > 50) {
nav.classList.add('shadow-xl');
} else {
nav.classList.remove('shadow-xl');
}
});
// Price formatter
function formatPrice(price) {
return new Intl.NumberFormat('en-PK', {
style: 'currency',
currency: 'PKR',
minimumFractionDigits: 0
}).format(price).replace('PKR', 'Rs.');
}
// Copy to clipboard functionality
function copyToClipboard(text) {
navigator.clipboard.writeText(text).then(() => {
showToast('Copied to clipboard!');
});
}
// Add copy functionality for phone numbers
document.querySelectorAll('a[href^="tel:"]').forEach(link => {
link.addEventListener('click', function(e) {
if (e.ctrlKey || e.metaKey) {
e.preventDefault();
copyToClipboard(this.textContent);
}
});
});