Initial commit - Church Music Database
This commit is contained in:
150
legacy-site/frontend/public/index.html
Normal file
150
legacy-site/frontend/public/index.html
Normal file
@@ -0,0 +1,150 @@
|
||||
<!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>
|
||||
Reference in New Issue
Block a user