151 lines
4.7 KiB
HTML
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>
|