forked from izu/student-web-if-development-kit
140 lines
4.5 KiB
JavaScript
140 lines
4.5 KiB
JavaScript
// =====================================================
|
|
// carousel.js — Swiper.js Carousel Testimoni
|
|
// Touch-friendly, auto-play, responsive breakpoints
|
|
// + DUKUNGAN MULTI-BAHASA (ID/EN) Terintegrasi
|
|
// =====================================================
|
|
|
|
let testimoniSwiper = null;
|
|
let allTestimoniData = []; // Simpan data di memori agar tidak perlu loading ulang saat ganti bahasa
|
|
|
|
// 1. Variabel penampung bahasa yang terhubung otomatis dengan tombol ID/EN
|
|
let activeCarouselLang = localStorage.getItem('if_untan_lang') || document.documentElement.lang || 'id';
|
|
|
|
// 2. Tangkap event perubahan bahasa secara langsung dari localization.js
|
|
document.addEventListener('languageChanged', (e) => {
|
|
// Update bahasa
|
|
if (e.detail && e.detail.lang) {
|
|
activeCarouselLang = e.detail.lang;
|
|
} else if (typeof window.getLang === 'function') {
|
|
activeCarouselLang = window.getLang();
|
|
} else {
|
|
activeCarouselLang = document.documentElement.lang || 'id';
|
|
}
|
|
|
|
// Jika data sudah ada, langsung cetak ulang testimoninya
|
|
if (allTestimoniData && allTestimoniData.length > 0) {
|
|
renderTestimoniSlides(allTestimoniData);
|
|
initSwiper(allTestimoniData.length); // Swiper harus di-restart agar animasinya tidak rusak
|
|
}
|
|
});
|
|
|
|
/** Render slide testimoni ke dalam swiper-wrapper */
|
|
function renderTestimoniSlides(data) {
|
|
const wrapper = document.getElementById('testimonial-wrapper');
|
|
if (!wrapper) return;
|
|
|
|
const lang = activeCarouselLang; // Gunakan bahasa terbaru
|
|
|
|
wrapper.innerHTML = data.map(t => {
|
|
// Logika Pintar: Cek mode bahasa. Jika 'en' dan teks terjemahannya ada, pakai bahasa Inggris.
|
|
// Jika tidak, tetap tampilkan teks bahasa Indonesia (sebagai cadangan).
|
|
const beasiswaName = (lang === 'en' && t.nama_beasiswa_en) ? t.nama_beasiswa_en : t.nama_beasiswa;
|
|
const quote = (lang === 'en' && t.kutipan_en) ? t.kutipan_en : t.kutipan;
|
|
|
|
return `
|
|
<div class="swiper-slide" style="height:auto;">
|
|
<div class="testimonial-card">
|
|
<img
|
|
src="${t.foto}"
|
|
alt="Foto ${t.nama}"
|
|
class="testimonial-avatar"
|
|
loading="lazy"
|
|
onerror="
|
|
this.style.display='none';
|
|
this.nextElementSibling.style.display='flex';
|
|
"
|
|
>
|
|
<div
|
|
class="testimonial-avatar"
|
|
style="
|
|
display:none;
|
|
background:linear-gradient(135deg,#003150,#4a6bc5);
|
|
align-items:center;
|
|
justify-content:center;
|
|
color:white;
|
|
font-size:22px;
|
|
font-weight:700;
|
|
"
|
|
>
|
|
${t.nama.charAt(0).toUpperCase()}
|
|
</div>
|
|
|
|
<div class="testimonial-name">${t.nama}</div>
|
|
<div class="testimonial-beasiswa">${beasiswaName}</div>
|
|
<p class="testimonial-quote">"${quote}"</p>
|
|
</div>
|
|
</div>
|
|
`;
|
|
}).join('');
|
|
}
|
|
|
|
/** Inisialisasi Swiper setelah slide di-render */
|
|
function initSwiper(count) {
|
|
// Bersihkan swiper lama jika ada (penting agar tidak menumpuk saat ganti bahasa)
|
|
if (testimoniSwiper) {
|
|
testimoniSwiper.destroy(true, true);
|
|
testimoniSwiper = null;
|
|
}
|
|
|
|
testimoniSwiper = new Swiper('.testimonial-swiper', {
|
|
slidesPerView: 1,
|
|
spaceBetween: 24,
|
|
loop: count > 3,
|
|
centerInsufficientSlides: true,
|
|
autoplay: {
|
|
delay: 4500,
|
|
disableOnInteraction: false,
|
|
pauseOnMouseEnter: true,
|
|
},
|
|
pagination: {
|
|
el: '.testimonial-pagination',
|
|
clickable: true,
|
|
},
|
|
grabCursor: true,
|
|
breakpoints: {
|
|
640: { slidesPerView: 2 },
|
|
1024: { slidesPerView: 3 },
|
|
},
|
|
// Dukungan Aksesibilitas Dinamis (VoiceOver / Screen Reader)
|
|
a11y: {
|
|
prevSlideMessage: activeCarouselLang === 'en' ? 'Previous slide' : 'Slide sebelumnya',
|
|
nextSlideMessage: activeCarouselLang === 'en' ? 'Next slide' : 'Slide berikutnya',
|
|
},
|
|
});
|
|
}
|
|
|
|
/** Fetch data testimoni dan render */
|
|
async function initCarousel() {
|
|
const section = document.getElementById('testimonial');
|
|
|
|
try {
|
|
const res = await fetch('data/testimoni.json');
|
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
|
|
const data = await res.json();
|
|
allTestimoniData = data; // Simpan ke variabel global
|
|
|
|
if (!data || data.length === 0) {
|
|
section?.classList.add('hidden');
|
|
return;
|
|
}
|
|
|
|
renderTestimoniSlides(data);
|
|
requestAnimationFrame(() => initSwiper(data.length));
|
|
|
|
} catch {
|
|
section?.classList.add('hidden');
|
|
}
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', initCarousel); |