/* Sections part 2: Testimoni, Edukasi, Sosmed, Kontak, Footer */ const { useState: uS2 } = React; /* ---------------- TESTIMONI (video scroller per age group) ---------------- */ const { useRef: uR2 } = React; const Testimoni = () => { const ages = Object.keys(SITE.testimoni); const icons = { Remaja: "users", Dewasa: "shield", Lansia: "leaf" }; const [age, setAge] = uS2(ages[0]); const [playing, setPlaying] = uS2(null); const trackRef = uR2(null); const scrollBy = (dir) => { const el = trackRef.current; if (!el) return; el.scrollBy({ left: dir * Math.min(el.clientWidth * 0.8, 640), behavior: "smooth" }); }; const list = SITE.testimoni[age]; return (
Testimoni

Cerita nyata dari setiap generasi

Dengar langsung pengalaman mereka yang sudah bergabung bersama Perwatusi Riau — dari remaja hingga lansia.

{ages.map((a) => ( ))}
{list.map((t, i) => (
{t.video && playing === i ? ( ) : ( )}
{t.name.split(" ").map((w) => w[0]).slice(0, 2).join("")}
{t.name}{t.meta}
))}

Geser untuk melihat lebih banyak testimoni →

); }; /* ---------------- EDUKASI ---------------- */ const Edukasi = () => { const v = SITE.videoFeature; const [selectedCategory, setSelectedCategory] = useState("Semua"); const categories = ["Semua", ...new Set(SITE.articles.map(a => a.cat || "Umum"))]; const filteredArticles = selectedCategory === "Semua" ? SITE.articles : SITE.articles.filter(a => (a.cat || "Umum") === selectedCategory); const pg = usePaged(filteredArticles, 6, [selectedCategory]); const changePage = (n) => { pg.setPage(n); document.getElementById("edukasi")?.scrollIntoView({ behavior: "smooth" }); }; const initials = (name) => name.replace(/^(dr\.?|hj\.?|h\.?)\s*/i, "").split(" ").map((w) => w[0]).filter(Boolean).slice(0, 2).join("").toUpperCase(); return (
Edukasi

Materi Kesehatan Tulang

Artikel, video, dan panduan praktis kesehatan tulang yang mudah dipahami dan bisa langsung diterapkan.

{v.youtube ? : <>
}
{v.label}

{v.title}

{v.desc}

Artikel Edukasi

{pg.total} artikel tersedia
{categories.map((cat) => ( ))}
{pg.pageItems.map((a, i) => ( { e.preventDefault(); navigate("artikel/" + slugify(a.title)); }}>
{a.cat}
{a.rt}

{a.title}

{a.excerpt}

{initials(a.by)}
{a.by}
))}

Menampilkan {pg.from}–{pg.to} dari {pg.total} artikel

); }; /* ---------------- SOSMED ---------------- */ const Sosmed = () => { const { tiktok, ig } = SITE.social; return (
Sosial Media

Ikuti perjalanan kami setiap hari

Tips harian, dokumentasi kegiatan, dan edukasi singkat — ada di TikTok dan Instagram Perwatusi Riau.

TikTok{tiktok.handle}
{tiktok.followers}Pengikut
{tiktok.likes}Suka
{[0,1,2,3,4,5].map((i) =>
)}
Ikuti di TikTok
Instagram{ig.handle}
{ig.followers}Pengikut
{ig.posts}Postingan
{[0,1,2,3,4,5].map((i) =>
)}
Ikuti di Instagram
); }; /* ---------------- KONTAK ---------------- */ const Kontak = () => { const [vals, setVals] = uS2({ nama: "", email: "", subjek: "Informasi Umum", pesan: "" }); const [errs, setErrs] = uS2({}); const [sent, setSent] = uS2(false); const [loading, setLoading] = uS2(false); const set = (k) => (e) => { setVals((v) => ({ ...v, [k]: e.target.value })); setErrs((x) => ({ ...x, [k]: false })); }; const submit = async (e) => { e.preventDefault(); const er = {}; if (!vals.nama.trim()) er.nama = true; if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(vals.email)) er.email = true; if (vals.pesan.trim().length < 8) er.pesan = true; setErrs(er); if (Object.keys(er).length > 0) return; setLoading(true); try { const res = await fetch("/api/contact", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(vals), }); const data = await res.json(); if (data.ok) { setSent(true); setVals({ nama: "", email: "", subjek: "Informasi Umum", pesan: "" }); } else { alert(data.message || "Gagal mengirim pesan. Coba lagi."); } } catch { alert("Gagal menghubungi server. Periksa koneksi Anda."); } finally { setLoading(false); } }; return (
Kontak

Mari terhubung & bergabung

Punya pertanyaan, ingin mengundang kami, atau bergabung sebagai relawan? Hubungi sekretariat DPD Perwatusi Riau.

{SITE.kontak.rows.map((r) => (
{r.title}

{r.text}

))}
{sent &&
Terima kasih! Pesan Anda telah terkirim. Tim kami akan segera menghubungi.
}
Mohon isi nama Anda.
Masukkan email yang valid.
Pesan minimal 8 karakter.
); }; /* ---------------- FOOTER ---------------- */ const Footer = () => { const go = (e, id) => { e.preventDefault(); document.getElementById(id)?.scrollIntoView({ behavior: "smooth" }); }; return ( ); }; Object.assign(window, { Testimoni, Edukasi, Sosmed, Kontak, Footer });