Files

151 lines
4.7 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"
/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
<meta name="format-detection" content="telephone=no" />
<meta name="mobile-web-app-capable" content="yes" />
<!-- FORCE NO CACHE -->
<meta
http-equiv="Cache-Control"
content="no-cache, no-store, must-revalidate"
/>
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<!-- Cache Buster - Force reload on version change -->
<script src="%PUBLIC_URL%/cache-buster.js?v=2380"></script>
<!-- CryptoJS for password hashing -->
<script
src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"
integrity="sha512-a+SUDuwNzXDvz4XrIcXHuCf089/iJAoN4lmrXJg18XnduKK6YlDHNRalv4yd1N40OKI80tFidF+rqTFKGPoWFQ=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
></script>
<title>HOP Worship App - Song Lyrics</title>
<!-- Favicon -->
<link rel="icon" href="%PUBLIC_URL%/church-logo.png" type="image/png" />
<link rel="apple-touch-icon" href="%PUBLIC_URL%/church-logo.png" />
<!-- ABSOLUTE NUCLEAR OPTION: Kill ResizeObserver errors BEFORE React loads -->
<script>
// Override console.error IMMEDIATELY
const _originalError = console.error;
console.error = function (...args) {
if (
args[0] &&
typeof args[0] === "string" &&
(args[0].includes("ResizeObserver") ||
args[0].includes("loop completed"))
) {
return; // Silently ignore
}
_originalError.apply(console, args);
};
// Suppress Google Analytics blocked by ad blocker errors
const _originalWarn = console.warn;
console.warn = function (...args) {
if (
args[0] &&
typeof args[0] === "string" &&
(args[0].includes("google-analytics") ||
args[0].includes("ERR_BLOCKED_BY_CLIENT"))
) {
return; // Silently ignore
}
_originalWarn.apply(console, args);
};
// Catch all error events
window.addEventListener(
"error",
function (e) {
// Suppress Google Analytics blocked errors
if (
e.message &&
(e.message.includes("google-analytics") ||
e.message.includes("ERR_BLOCKED_BY_CLIENT") ||
e.message.includes("measurement_id"))
) {
e.stopImmediatePropagation();
e.stopPropagation();
e.preventDefault();
return false;
}
if (
e.message &&
(e.message.includes("ResizeObserver") || e.message.includes("loop"))
) {
e.stopImmediatePropagation();
e.stopPropagation();
e.preventDefault();
return false;
}
},
true
);
// Catch unhandled promise rejections (including fetch failures from ad blockers)
window.addEventListener("unhandledrejection", function (e) {
// Suppress Google Analytics fetch rejections
if (
e.reason &&
(e.reason.message?.includes("google-analytics") ||
e.reason.message?.includes("ERR_BLOCKED_BY_CLIENT") ||
(e.reason instanceof TypeError &&
e.reason.message?.includes("Failed to fetch")))
) {
e.preventDefault();
return false;
}
if (
e.reason &&
e.reason.message &&
e.reason.message.includes("ResizeObserver")
) {
e.preventDefault();
return false;
}
});
// Override window.onerror
window.onerror = function (msg, url, lineNo, columnNo, error) {
// Suppress Google Analytics errors
if (
typeof msg === "string" &&
(msg.includes("google-analytics") ||
msg.includes("ERR_BLOCKED_BY_CLIENT") ||
msg.includes("measurement_id"))
) {
return true; // Prevent default error handling
}
if (
typeof msg === "string" &&
(msg.includes("ResizeObserver") || msg.includes("loop"))
) {
return true; // Prevent default error handling
}
return false;
};
</script>
</head>
<body>
<div id="root"></div>
</body>
</html>