Handgreep
loader
Bezig met laden...
Handgreep
Handgrepen zijn relatief kleine onderdelen in de badkamer, maar hebben een grote impact op de afwerking en uitstraling van de ruimte. Zo zijn er handgrepen voor badkamermeubels, baden en douches. Een badgreep is bijvoorbeeld erg handig bij het in- en uitstappen van het bad. De handgrepen zijn er in verschillende materialen en designs. Bekijk nu in ons brede assortiment welke handgreep het beste bij jouw badkamerstijl past.
check-circle
7 dagen per week bereikbaar
check-circle
6e jaar op rij beste webwinkel
check-circle
Binnen 30 dagen retourneren
Niet gevonden wat je zocht?
window.runChatLogic = function() {
if (!window.marketingToolsLoaded || window.cmChatCombinedIntegration) return;
window.cmChatCombinedIntegration = true;
const WEBCONVERSATIONS_ID = '2059de50-3b41-4c7c-9eb9-62b6f21cdf58'; //variabel per domain
const SCRIPT_ID = 'cmwc-webchat-script';
let lastProcessedContext = '';
const getVisitorId = () => {
const match = document.cookie.match(/_ga=GA1\.\d+\.(\d+\.\d+)/);
return match ? String(match[1]) : (sessionStorage.getItem('vertex_fallback_id') || 'anon-' + Math.random().toString(36).substring(2, 15));
};
const getSessionId = () => {
try {
const gaCookie = document.cookie.split('; ').find(row => row.startsWith('_ga_'));
if (gaCookie) return String(gaCookie.split('=')[1].split('.')[2]);
} catch (e) { }
return null;
};
const findInDataLayer = (key, value) => {
if (!window.dataLayer) return null;
return [...window.dataLayer].reverse().find(e => e && e[key] === value);
};
const getProductAndCartContext = () => {
const payload = {};
const viewItemEvent = findInDataLayer('event', 'view_item');
if (viewItemEvent?.ecommerce?.items?.length) {
const product = viewItemEvent.ecommerce.items[0];
payload.last_product = product.item_name ? product.item_name.toString() : '';
payload.last_product_id = product.item_id ? product.item_id.toString() : '';
}
const cartEvent = findInDataLayer('event', 'cartPage');
if (cartEvent && cartEvent.cart) {
const cart = cartEvent.cart;
payload.cart_items_json = JSON.stringify(cart.items);
payload.cart_content_summary = cart.items.map(item => `${item.quantity}x ${item.name}`).join(', ');
payload.cart_total = cart.total ? cart.total.toString() : '0';
payload.cart_qty = cart.cartQty ? cart.cartQty.toString() : '0';
payload.cart_has_items = cart.hasItems ? cart.hasItems.toString() : 'false';
}
return payload;
};
const getContextPayload = () => {
const host = window.location.hostname;
const payload = {
ga_visitor_id: getVisitorId(),
ga_session_id: getSessionId(),
domain: host.includes('saniweb.de') ? 'saniweb.de' : (host.includes('saniweb.be') ? 'saniweb.be' : 'saniweb.nl'),
store_id: host.includes('saniweb.be') ? '1' : (host.includes('saniweb.de') ? '2' : '0')
};
// Cart ID toevoegen indien aanwezig
try {
const mageCache = JSON.parse(localStorage.getItem('mage-cache-storage') || '{}');
if (mageCache.cart?.cartId) payload.cart_id = String(mageCache.cart.cartId);
} catch (e) {}
Object.assign(payload, getProductAndCartContext());
return payload;
};
const sendContextUpdate = () => {
try {
const chatInstance = window.cmwc && window.cmwc.get(WEBCONVERSATIONS_ID);
if (!chatInstance) return;
const currentPayload = getContextPayload();
const signature = JSON.stringify(currentPayload);
if (signature !== lastProcessedContext) {
lastProcessedContext = signature;
chatInstance.addContext(currentPayload);
console.log("[Chat-Safe] Context updated");
}
} catch (e) {
console.error("[Chat-Safe] Error sending context:", e);
}
};
const loadChatWidget = () => {
if (document.getElementById(SCRIPT_ID)) return;
const chatLanguage = window.location.hostname.includes('saniweb.de') ? 'de' : 'nl';
const script = document.createElement('script');
script.id = SCRIPT_ID;
script.type = 'module';
script.crossOrigin = 'anonymous';
script.src = 'https://webchat.digitalcx.com/webchat.js';
script.onload = () => {
try {
const instance = cmwc.add(WEBCONVERSATIONS_ID);
instance.install({ language: chatLanguage });
// Wacht heel even tot de installatie echt klaar is voor de eerste context
setTimeout(sendContextUpdate, 1000);
} catch (e) {
console.error("[Chat-Safe] Install error:", e);
}
};
document.body.appendChild(script);
};
// Start de boel
loadChatWidget();
// In plaats van een snelle poller: check elke 10 seconden OF bij een pagina-event
setInterval(sendContextUpdate, 10000);
window.addEventListener('focus', sendContextUpdate); // Update als gebruiker terugkomt op tabblad
document.addEventListener('turbo:load', () => setTimeout(sendContextUpdate, 300));
};
function syncCartToFrontend(cartId) {
localStorage.setItem('cartId', cartId);
if (window.hyva && window.hyva.setCookie) {
window.hyva.setCookie('mage-cache-sessid', '', -1, true);
} else {
document.cookie = 'mage-cache-sessid=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT';
}
window.dispatchEvent(new CustomEvent('reload-customer-section-data'));
}
// --- TRIGGERS ---
if (window.marketingToolsLoaded) {
window.runChatLogic();
}
window.addEventListener('CookiebotOnAccept', function() {
window.marketingToolsLoaded = true; // Zorg dat de flag omgaat
window.runChatLogic();
});
// Turbo Load support
document.addEventListener('turbo:load', () => {
window.cmChatCombinedIntegration = false;
if (window.marketingToolsLoaded) window.runChatLogic();
});