/* global React */
// ============================================
// A_LIZ HAIRDRESSER — Layout components
// ============================================
const { useState, useEffect, useRef, useCallback } = React;
const { LANGS, pick } = window.AL_DATA;
const WHATSAPP_NUMBER = "905388745166";
const WA_LINK = `https://wa.me/${WHATSAPP_NUMBER}`;
const WA_LINK_INNER = `https://wa.me/${WHATSAPP_NUMBER}`;
// ========== LANGUAGE CONTEXT ==========
const LangContext = React.createContext({ lang: "tr", setLang: () => {} });
function LangProvider({ children }) {
const [lang, setLangState] = useState(() => {
return localStorage.getItem("aliz_lang") || "tr";
});
const setLang = useCallback((l) => {
setLangState(l);
localStorage.setItem("aliz_lang", l);
const langDef = LANGS.find((x) => x.code === l);
document.documentElement.lang = l;
document.documentElement.dir = langDef && langDef.rtl ? "rtl" : "ltr";
}, []);
useEffect(() => {
const langDef = LANGS.find((x) => x.code === lang);
document.documentElement.lang = lang;
document.documentElement.dir = langDef && langDef.rtl ? "rtl" : "ltr";
}, [lang]);
return {children} ;
}
const useLang = () => React.useContext(LangContext);
const useT = () => {
const { lang } = useLang();
return useCallback((key) => pick(key, lang), [lang]);
};
// ========== BRAND LOCKUP (crisp typographic logo) ==========
function BrandLock({ variant = "dark" }) {
return (
AL
A_ Liz
Hairdresser · İstanbul
);
}
// Flag swatch (renders the SVG flag from LANGS)
function Flag({ lang: code, size = 18 }) {
const def = LANGS.find((l) => l.code === code);
if (!def || !def.flag) return null;
return (
);
}
// ========== ROUTER (History API — clean URLs) ==========
const VALID_ROUTES = ['home','services','gallery','about','contact','appointment','privacy','terms','cookies'];
const RouteContext = React.createContext({ route: "home", go: () => {} });
function RouteProvider({ children }) {
const getRoute = () => {
const path = window.location.pathname.replace(/^\//, '').replace(/\/$/, '');
const r = path || 'home';
return VALID_ROUTES.includes(r) ? r : 'home';
};
const [route, setRoute] = useState(getRoute);
useEffect(() => {
const handle = () => {
setRoute(getRoute());
window.scrollTo({ top: 0, behavior: "instant" });
};
window.addEventListener("popstate", handle);
return () => window.removeEventListener("popstate", handle);
}, []);
const go = useCallback((r) => {
const path = r === 'home' ? '/' : '/' + r;
window.history.pushState({}, '', path);
setRoute(r);
window.scrollTo({ top: 0, behavior: "instant" });
}, []);
window.AL_NAV = go;
return {children} ;
}
const useRoute = () => React.useContext(RouteContext);
// ========== REVEAL HOOK ==========
function useReveal() {
const ref = useRef(null);
useEffect(() => {
if (!ref.current) return;
const el = ref.current;
const io = new IntersectionObserver(
(entries) => {
entries.forEach((e) => {
if (e.isIntersecting) {
e.target.classList.add("in");
io.unobserve(e.target);
}
});
},
{ threshold: 0.12, rootMargin: "0px 0px -40px 0px" }
);
el.querySelectorAll(".reveal, .reveal-watch").forEach((n) => io.observe(n));
return () => io.disconnect();
}, []);
return ref;
}
// ========== 3D TILT HOOK ==========
function useTilt(opts = {}) {
const { max = 8, scale = 1.02, perspective = 1000 } = opts;
const ref = useRef(null);
// Skip tilt on touch/mobile for performance
const isTouch = typeof window !== 'undefined' && ('ontouchstart' in window || window.matchMedia('(hover: none)').matches);
if (isTouch) return ref;
useEffect(() => {
const el = ref.current;
if (!el) return;
let rect;
const onEnter = () => { rect = el.getBoundingClientRect(); };
const onMove = (e) => {
if (!rect) rect = el.getBoundingClientRect();
const x = (e.clientX - rect.left) / rect.width - 0.5;
const y = (e.clientY - rect.top) / rect.height - 0.5;
el.style.transform = `perspective(${perspective}px) rotateX(${-y * max}deg) rotateY(${x * max}deg) scale(${scale})`;
el.style.setProperty("--mx", `${(x + 0.5) * 100}%`);
el.style.setProperty("--my", `${(y + 0.5) * 100}%`);
};
const onLeave = () => {
el.style.transform = `perspective(${perspective}px) rotateX(0) rotateY(0) scale(1)`;
};
el.addEventListener("mouseenter", onEnter);
el.addEventListener("mousemove", onMove);
el.addEventListener("mouseleave", onLeave);
return () => {
el.removeEventListener("mouseenter", onEnter);
el.removeEventListener("mousemove", onMove);
el.removeEventListener("mouseleave", onLeave);
};
}, [max, scale, perspective]);
return ref;
}
// ========== COUNT-UP HOOK ==========
function useCountUp(target, duration = 1600) {
const [val, setVal] = useState(0);
const ref = useRef(null);
useEffect(() => {
const el = ref.current;
if (!el) return;
const io = new IntersectionObserver((entries) => {
entries.forEach((e) => {
if (!e.isIntersecting) return;
io.unobserve(el);
const start = performance.now();
const tick = (now) => {
const p = Math.min(1, (now - start) / duration);
const eased = 1 - Math.pow(1 - p, 3);
setVal(target * eased);
if (p < 1) requestAnimationFrame(tick);
else setVal(target);
};
requestAnimationFrame(tick);
});
}, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' });
io.observe(el);
return () => io.disconnect();
}, [target, duration]);
return [val, ref];
}
// ========== ICONS ==========
const Icon = {
Arrow: () => (
),
Wa: () => (
),
Phone: () => (
),
Globe: () => (
),
Star: () => (
),
Instagram: () => (
),
TikTok: () => (
),
Facebook: () => (
),
YouTube: () => (
),
Mail: () => (
),
Pin: () => (
),
Clock: () => (
),
};
// ========== ANNOUNCEMENT BAR ==========
function Announcement() {
const { lang } = useLang();
const [visible, setVisible] = useState(true);
const trackRef = useRef(null);
const animRef = useRef(null);
useEffect(() => {
document.body.classList.toggle("has-announce", visible);
return () => document.body.classList.remove("has-announce");
}, [visible]);
// rAF loop — CSS cascade'i tamamen atlar, inline style kullanır
useEffect(() => {
if (!visible || !trackRef.current) return;
const el = trackRef.current;
// Tüm mevcut animasyonları iptal et
if (el.getAnimations) el.getAnimations().forEach(a => a.cancel());
el.style.transform = '';
let offset = 0;
let lastTs = null;
let paused = false;
let raf;
const step = (ts) => {
if (lastTs !== null && !paused) {
const dt = Math.min(ts - lastTs, 50); // max 50ms adım
const total = el.scrollWidth / 2;
if (total > 0) {
offset -= (total / 30000) * dt;
if (offset < -total) offset += total;
el.style.cssText = `transform: translateX(${offset}px) !important;`;
}
}
lastTs = ts;
raf = requestAnimationFrame(step);
};
raf = requestAnimationFrame(step);
const pause = () => { paused = true; };
const play = () => { paused = false; lastTs = null; };
el.addEventListener('mouseenter', pause);
el.addEventListener('mouseleave', play);
return () => {
cancelAnimationFrame(raf);
el.removeEventListener('mouseenter', pause);
el.removeEventListener('mouseleave', play);
el.style.transform = '';
};
}, [visible]);
if (!visible) return null;
const items = {
tr: [
{ pre: "✦ Özel Teklif", msg: "Ayak Masajı", tag: "sadece", price: "10 €" },
{ pre: "◆ Yaz Sezonu", msg: "Kampanya fiyatları için bizimle iletişime geçin", tag: "", price: "" },
],
en: [
{ pre: "✦ Special Offer", msg: "Foot Massage", tag: "only", price: "10 €" },
{ pre: "◆ Summer Season", msg: "Contact us for campaign prices", tag: "", price: "" },
],
de: [
{ pre: "✦ Sonderangebot", msg: "Fußmassage", tag: "nur", price: "10 €" },
{ pre: "◆ Sommersaison", msg: "Kontaktieren Sie uns für Aktionspreise", tag: "", price: "" },
],
fr: [
{ pre: "✦ Offre Spéciale", msg: "Massage des Pieds", tag: "seulement", price: "10 €" },
{ pre: "◆ Saison Estivale", msg: "Contactez-nous pour les tarifs promotionnels", tag: "", price: "" },
],
ar: [
{ pre: "✦ عرض خاص", msg: "مساج القدم", tag: "فقط", price: "10 €" },
{ pre: "◆ موسم الصيف", msg: "تواصل معنا للأسعار الترويجية", tag: "", price: "" },
],
ru: [
{ pre: "✦ Спецпредложение", msg: "Массаж ног", tag: "всего", price: "10 €" },
{ pre: "◆ Летний сезон", msg: "Свяжитесь с нами для уточнения акционных цен", tag: "", price: "" },
],
it: [
{ pre: "✦ Offerta Speciale", msg: "Massaggio ai Piedi", tag: "solo", price: "10 €" },
{ pre: "◆ Stagione Estiva", msg: "Contattateci per i prezzi promozionali", tag: "", price: "" },
],
es: [
{ pre: "✦ Oferta Especial", msg: "Masaje de Pies", tag: "solo", price: "10 €" },
{ pre: "◆ Temporada Verano", msg: "Contáctenos para precios de campaña", tag: "", price: "" },
],
};
const list = items[lang] || items.tr;
// Build one segment — repeated 4x for seamless loop
const Segment = () => (
{list.map((c, i) => (
{c.pre}
·
{c.msg}
{c.price && (
{c.tag && {c.tag} }
{c.price}
)}
✦
))}
);
return (
setVisible(false)} aria-label="Kapat">✕
);
}
// ========== NAV ==========
function Nav() {
const { route, go } = useRoute();
const { lang, setLang } = useLang();
const t = useT();
const [scrolled, setScrolled] = useState(false);
const [open, setOpen] = useState(false);
const [langOpen, setLangOpen] = useState(false);
const langRef = useRef(null);
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 30);
onScroll();
window.addEventListener("scroll", onScroll, { passive: true });
return () => window.removeEventListener("scroll", onScroll);
}, []);
useEffect(() => {
const onClick = (e) => {
if (langRef.current && !langRef.current.contains(e.target)) setLangOpen(false);
};
document.addEventListener("click", onClick);
return () => document.removeEventListener("click", onClick);
}, []);
const links = [
["home", "nav_home"],
["services", "nav_services"],
["gallery", "nav_gallery"],
["about", "nav_about"],
["appointment", "nav_appointment"],
["contact", "nav_contact"],
];
const onNav = (key) => { setOpen(false); go(key); };
const currentLang = LANGS.find((l) => l.code === lang) || LANGS[0];
return (
{/* LEFT: Logo only */}
onNav("home")}>
{/* CENTER: Desktop nav links */}
{/* RIGHT: search + lang + tel (desktop) | lang + search + hamburger (mobile) */}
{/* Tel — left of lang */}
{/* Lang — far right */}
{ e.stopPropagation(); setLangOpen(!langOpen); }}>
{currentLang.short}
{LANGS.map((l) => (
{ setLang(l.code); setLangOpen(false); }}>
{l.label}
{l.short}
))}
{/* Hamburger (mobile only) */}
setOpen(!open)}>
{/* Mobile drawer */}
);
}
// ========== WHATSAPP FAB ==========
function WhatsAppFab() {
const t = useT();
return (
{t("cta_book")} · WhatsApp
);
}
// ========== FOOTER ==========
function Footer() {
const t = useT();
const { go } = useRoute();
const year = new Date().getFullYear();
return (
© {year} A_LizHairdresser — {t("ft_rights")}
);
}
// ========== CTA STRIP ==========
function CtaStrip() {
const t = useT();
const { go } = useRoute();
return (
);
}
// ========== SEO HOOK ==========
const SEO_DATA = {
home: { en: { title: 'A_Liz Hairdresser — Luxury Hair Salon in Sultanahmet, Istanbul', desc: 'Premium hair salon in the heart of Sultanahmet, Istanbul. Expert cuts, colour, balayage, keratin & bridal hair. Walk-in & WhatsApp booking. Open daily 10:00–24:00.' },
tr: { title: 'A_Liz Hairdresser — Sultanahmet\'in Lüks Kuaförü, İstanbul', desc: 'Sultanahmet\'in kalbinde premium kuaför salonu. Saç kesimi, renklendirme, balayage, keratin & gelin saçı. WhatsApp ile anında randevu. Her gün 10:00–24:00.' } },
services: { en: { title: 'Hair & Beauty Services | A_Liz Hairdresser Istanbul', desc: 'Explore 14 premium hair and beauty services at A_Liz Hairdresser Sultanahmet: cuts, colour, balayage, keratin, makeup, nail care, foot massage and more.' },
tr: { title: 'Hizmetlerimiz | A_Liz Hairdresser İstanbul', desc: 'A_Liz Hairdresser\'da 14 premium saç ve güzellik hizmeti: kesim, renklendirme, balayage, keratin, makyaj, tırnak bakımı, ayak masajı ve daha fazlası.' } },
gallery: { en: { title: 'Gallery | A_Liz Hairdresser Istanbul', desc: 'Browse our gallery of hair transformations at A_Liz Hairdresser, Sultanahmet, Istanbul. Before & after shots from our expert stylists.' },
tr: { title: 'Galeri | A_Liz Hairdresser İstanbul', desc: 'A_Liz Hairdresser\'ın saç dönüşüm galerisine göz atın. Uzman stilistlerimizden öncesi & sonrası çekimler.' } },
about: { en: { title: 'About Us | A_Liz Hairdresser Istanbul', desc: 'Learn about A_Liz Hairdresser — a luxury hair and beauty salon in Sultanahmet, Istanbul, serving guests in 8 languages with world-class brands.' },
tr: { title: 'Hakkımızda | A_Liz Hairdresser İstanbul', desc: 'A_Liz Hairdresser hakkında — Sultanahmet\'te 8 dilde hizmet veren, dünya markaları kullanan lüks kuaför ve güzellik salonu.' } },
contact: { en: { title: 'Contact & Location | A_Liz Hairdresser Istanbul', desc: 'Find A_Liz Hairdresser at Divanyolu Cad. No.50, Sultanahmet, Istanbul. Contact us via WhatsApp, phone or visit us. Open daily 10:00–24:00.' },
tr: { title: 'İletişim & Konum | A_Liz Hairdresser İstanbul', desc: 'A_Liz Hairdresser\'ı Divanyolu Cad. No.50, Sultanahmet, İstanbul\'da bulun. WhatsApp, telefon veya ziyaret ile iletişime geçin. Her gün 10:00–24:00.' } },
appointment: { en: { title: 'Book an Appointment | A_Liz Hairdresser Istanbul', desc: 'Book your appointment at A_Liz Hairdresser Sultanahmet easily online. Choose your date, time and services. Confirmation via WhatsApp.' },
tr: { title: 'Randevu Al | A_Liz Hairdresser İstanbul', desc: 'A_Liz Hairdresser\'da randevunuzu kolayca alın. Tarih, saat ve hizmet seçin. WhatsApp ile onay.' } },
};
function usePageSEO(route) {
const { lang } = useLang();
useEffect(() => {
const seo = SEO_DATA[route] || SEO_DATA.home;
const d = seo[lang] || seo.en;
document.title = d.title;
const metaDesc = document.querySelector('meta[name="description"]');
if (metaDesc) metaDesc.setAttribute('content', d.desc);
const ogTitle = document.querySelector('meta[property="og:title"]');
if (ogTitle) ogTitle.setAttribute('content', d.title);
const ogDesc = document.querySelector('meta[property="og:description"]');
if (ogDesc) ogDesc.setAttribute('content', d.desc);
const ogUrl = document.querySelector('meta[property="og:url"]');
if (ogUrl) ogUrl.setAttribute('content', 'https://www.alizhairdresser.com' + (route === 'home' ? '/' : '/' + route));
const canonical = document.querySelector('link[rel="canonical"]');
if (canonical) canonical.setAttribute('href', 'https://www.alizhairdresser.com' + (route === 'home' ? '/' : '/' + route));
return () => {
document.title = 'A_Liz Hairdresser — Sultanahmet · Istanbul';
};
}, [route, lang]);
}
Object.assign(window, { LangProvider, RouteProvider, useLang, useT, useRoute, useReveal, useTilt, useCountUp, Icon, Nav, WhatsAppFab, Footer, CtaStrip, WA_LINK, Announcement, usePageSEO });
// ========== LOADING CURTAIN ==========
function LoadingCurtain() {
const [stage, setStage] = useState(0); // 0=initial, 1=logo-in, 2=lift, 3=gone
useEffect(() => {
if (sessionStorage.getItem("aliz_curtain_shown") === "1") {
setStage(3);
return;
}
const t1 = setTimeout(() => setStage(1), 80);
const t2 = setTimeout(() => setStage(2), 1400);
const t3 = setTimeout(() => {
setStage(3);
sessionStorage.setItem("aliz_curtain_shown", "1");
}, 2200);
return () => { clearTimeout(t1); clearTimeout(t2); clearTimeout(t3); };
}, []);
if (stage === 3) return null;
const curtainCls = stage === 0 ? 'curtain' : stage === 1 ? 'curtain logo-in' : 'curtain logo-in lift';
return (
DİVANYOLU · ISTANBUL
);
}
// ========== CUSTOM CURSOR ==========
function CustomCursor() {
const dotRef = useRef(null);
const ringRef = useRef(null);
useEffect(() => {
if (window.matchMedia("(pointer: coarse)").matches) return; // skip on touch
const dot = dotRef.current;
const ring = ringRef.current;
let mx = 0, my = 0, rx = 0, ry = 0;
const move = (e) => {
mx = e.clientX; my = e.clientY;
dot.style.transform = `translate(${mx}px, ${my}px)`;
};
let raf;
const loop = () => {
rx += (mx - rx) * 0.18;
ry += (my - ry) * 0.18;
ring.style.transform = `translate(${rx}px, ${ry}px)`;
raf = requestAnimationFrame(loop);
};
raf = requestAnimationFrame(loop);
const onOver = (e) => {
const t = e.target;
const link = t.closest("a, button, .service-card, .ig-tile, .ba-slider, .gal-item, .faq-trigger, [role=button]");
if (link) {
ring.classList.add("hover");
if (link.closest(".btn-primary")) ring.classList.add("rose");
} else {
ring.classList.remove("hover");
ring.classList.remove("rose");
}
};
window.addEventListener("mousemove", move);
window.addEventListener("mouseover", onOver);
return () => {
cancelAnimationFrame(raf);
window.removeEventListener("mousemove", move);
window.removeEventListener("mouseover", onOver);
};
}, []);
return (
<>
>
);
}
// ========== MAGNETIC BUTTON ==========
function useMagnetic(strength = 0.3) {
const ref = useRef(null);
useEffect(() => {
const el = ref.current;
if (!el) return;
const onMove = (e) => {
const rect = el.getBoundingClientRect();
const x = e.clientX - (rect.left + rect.width / 2);
const y = e.clientY - (rect.top + rect.height / 2);
el.style.transform = `translate(${x * strength}px, ${y * strength}px)`;
};
const onLeave = () => { el.style.transform = "translate(0,0)"; };
el.addEventListener("mousemove", onMove);
el.addEventListener("mouseleave", onLeave);
return () => {
el.removeEventListener("mousemove", onMove);
el.removeEventListener("mouseleave", onLeave);
};
}, [strength]);
return ref;
}
// ========== SPLIT-TEXT HEADING ==========
function SplitHeading({ text, className = "" }) {
const ref = useRef(null);
useEffect(() => {
if (!ref.current) return;
const io = new IntersectionObserver((entries) => {
entries.forEach((e) => {
if (e.isIntersecting) {
e.target.classList.add("in");
io.unobserve(e.target);
}
});
}, { threshold: 0.2 });
io.observe(ref.current);
return () => io.disconnect();
}, []);
const words = String(text).split(" ");
return (
{words.map((w, i) => (
{w}{i < words.length - 1 ? "\u00A0" : ""}
))}
);
}
// ========== BRAND WORDMARK LOGOS ==========
// Typographic recreations — each evokes the brand's distinct DNA in monochrome
function BrandLogo({ name }) {
switch (name) {
case "schwarzkopf":
return (
Schwarzkopf
);
case "loreal":
return (
L'ORÉAL
PROFESSIONNEL · PARIS
);
case "olaplex":
return OLAPLEX® ;
case "kerastase":
return (
KÉRASTASE
PARIS
);
case "wella":
return (
WELLA
PROFESSIONALS
);
case "rallis":
return (
Rallis
Professional
);
// Press
case "vogue": return VOGUE ;
case "elle": return ELLE ;
case "marie":
return (
MARIE CLAIRE
);
case "cosmo":
return Cosmopolitan TÜRKİYE ;
case "timeout":
return (
Time Out
ISTANBUL
);
case "harpers":
return (
HARPER'S BAZAAR
ARABIA
);
default:
return {name} ;
}
}
// ========== OFFER POPUP (circular badge) ==========
function OfferPopup() {
const t = useT();
const { lang } = useLang();
const [shown, setShown] = useState(false);
const [collapsed, setCollapsed] = useState(false);
const [closed, setClosed] = useState(() => sessionStorage.getItem("aliz_offer_closed") === "1");
const messages = {
tr: "Merhaba, sezon önerisi ayak masajı (€10) için randevu almak istiyorum.",
en: "Hello, I'd like to book the seasonal foot massage (€10).",
ar: "مرحباً، أود حجز جلسة تدليك القدمين الموسمية (€10).",
ru: "Здравствуйте, хочу записаться на сезонный массаж стоп (€10).",
it: "Ciao, vorrei prenotare il massaggio plantare stagionale (€10).",
de: "Hallo, ich möchte die Saison-Fußmassage (€10) buchen.",
fr: "Bonjour, je souhaite réserver le massage des pieds (€10).",
es: "Hola, quisiera reservar el masaje de pies (€10).",
};
const titles = {
tr: "Ayak Masajı", en: "Foot Massage", ar: "تدليك القدمين",
ru: "Массаж стоп", it: "Massaggio Plantare", de: "Fußmassage",
fr: "Massage des Pieds", es: "Masaje de Pies",
};
const offerLink = "https://wa.me/905388745166";
// Show with delay + auto-collapse after 5s
useEffect(() => {
if (closed) return;
const t1 = setTimeout(() => setShown(true), 3800);
const t2 = setTimeout(() => setCollapsed(true), 9500); // 9.5s total = 5.7s after appearing
return () => { clearTimeout(t1); clearTimeout(t2); };
}, [closed]);
const close = (e) => {
if (e) {
e.preventDefault();
e.stopPropagation();
}
setShown(false);
sessionStorage.setItem("aliz_offer_closed", "1");
setTimeout(() => setClosed(true), 600);
};
const expand = (e) => {
if (collapsed) {
e.preventDefault();
e.stopPropagation();
setCollapsed(false);
// re-collapse after 5s of full view
setTimeout(() => setCollapsed(true), 5500);
}
};
if (closed) return null;
return (
);
}
// ========== SCROLL PROGRESS ==========
function ScrollProgress() {
const [pct, setPct] = useState(0);
useEffect(() => {
const onScroll = () => {
const d = document.documentElement;
const scrolled = d.scrollTop || document.body.scrollTop;
const total = d.scrollHeight - d.clientHeight;
setPct(total > 0 ? (scrolled / total) * 100 : 0);
};
window.addEventListener('scroll', onScroll, { passive: true });
return () => window.removeEventListener('scroll', onScroll);
}, []);
return
;
}
Object.assign(window, { LoadingCurtain, CustomCursor, useMagnetic, SplitHeading, BrandLogo, OfferPopup, CookieConsent, ScrollProgress });
// ========== COOKIE CONSENT (KVKK) ==========
function CookieConsent() {
const { lang } = useLang();
const t = useT();
const [status, setStatus] = useState(() => {
return localStorage.getItem('cookie_consent') || null;
});
const [showSettings, setShowSettings] = useState(false);
const [analytics, setAnalytics] = useState(true);
const [marketing, setMarketing] = useState(false);
// Add body class while banner visible so page bottom isn't covered
useEffect(() => {
document.body.classList.toggle('has-cookie-banner', !status);
return () => document.body.classList.remove('has-cookie-banner');
}, [status]);
// Re-render when lang changes — state updates automatically via useT
const accept = () => {
localStorage.setItem('cookie_consent', 'all');
localStorage.setItem('cookie_consent_date', new Date().toISOString());
setStatus('all');
setShowSettings(false);
};
const necessary = () => {
localStorage.setItem('cookie_consent', 'necessary');
localStorage.setItem('cookie_consent_date', new Date().toISOString());
setStatus('necessary');
setShowSettings(false);
};
const saveSettings = () => {
const val = analytics || marketing ? (analytics && marketing ? 'all' : 'partial') : 'necessary';
localStorage.setItem('cookie_consent', val);
localStorage.setItem('cookie_consent_date', new Date().toISOString());
setStatus(val);
setShowSettings(false);
};
if (status) return null;
return (
{/* Main bar */}
{!showSettings && (
{t("cookie_title")}
{t("cookie_desc")}
{t("cookie_necessary")}
{t("cookie_accept")}
setShowSettings(true)}>
{t("cookie_settings")}
)}
{/* Settings panel */}
{showSettings && (
{t("cookie_settings")}
setShowSettings(false)}>✕
{t("cookie_category_necessary")}
{lang === "tr" ? "Sitenin temel işlevleri için zorunludur. Devre dışı bırakılamaz." :
lang === "de" ? "Für die grundlegenden Funktionen der Website erforderlich. Nicht deaktivierbar." :
lang === "fr" ? "Nécessaires au bon fonctionnement du site. Non désactivables." :
lang === "ar" ? "ضرورية للوظائف الأساسية للموقع. لا يمكن تعطيلها." :
lang === "ru" ? "Необходимы для базовых функций сайта. Нельзя отключить." :
"Required for basic site functionality. Cannot be disabled."}
{t("cookie_always_on")}
{ window.AL_NAV && window.AL_NAV('privacy'); setStatus('navigated'); }}>
{t("cookie_kvkk")} →
{t("cookie_necessary")}
{t("cookie_accept")}
)}
);
}