'use client'; import { useEffect } from 'react'; import { useIsDesktopClient } from '@/lib/desktop-client'; /** * DesktopExternalLinks (quick-261001-cxo) — Links mit `target="_blank"` * (Favoriten, „In neuem Tab öffnen“ bei XFrame/eigenen Modulen, Quellen im * Ausschreibungs-Radar) taten im Desktop-Client unter Windows beim Klick * nichts, `window.open` (Such-Widget) dagegen landet ueber `on_new_window` * im System-Browser (VM 8233, 01.10.2026: Favorit ohne Wirkung, Suche oeffnet * Edge). Im Client leitet dieser Helfer solche Klicks deshalb auf * `window.open` um. * * Lauscht auf `window` in der Bubble-Phase, also NACH Reacts Handlern am * Dokument: ein Klick, den die Seite selbst verhindert (Favoriten im * Bearbeiten-Modus), bleibt verhindert. Nur http/https -- alles andere * verwirft der Client ohnehin. */ function externalTarget(event: MouseEvent): HTMLAnchorElement | null { if (event.defaultPrevented) return null; // Linksklick und Mittelklick oeffnen beide ein neues Fenster. if (event.button !== 0 && event.button !== 1) return null; const target = event.target; if (!(target instanceof Element)) return null; const anchor = target.closest('a[href]'); if (!(anchor instanceof HTMLAnchorElement)) return null; if (anchor.target !== '_blank') return null; if (anchor.protocol !== 'http:' && anchor.protocol !== 'https:') return null; return anchor; } export function DesktopExternalLinks() { const isDesktop = useIsDesktopClient(); useEffect(() => { if (!isDesktop) return; const handler = (event: MouseEvent) => { if (event.type === 'auxclick' && event.button !== 1) return; if (event.type === 'click' && event.button !== 0) return; const anchor = externalTarget(event); if (!anchor) return; event.preventDefault(); window.open(anchor.href, '_blank', 'noopener,noreferrer'); }; window.addEventListener('click', handler); window.addEventListener('auxclick', handler); return () => { window.removeEventListener('click', handler); window.removeEventListener('auxclick', handler); }; }, [isDesktop]); return null; }