Track HiveGrid Cloud planning reference

This commit is contained in:
david committed 2026-06-26 20:48:01 +02:00
1 parent b3d5ea6764
commit e341c5938a
5784 files changed
+1104929 -3

No files matched your search

@@ -0,0 +1,34 @@
import { useLocation } from "react-router";
import { useRootData } from "~/utils/data/useRootData";
import { isAppOrAdminSurface } from "~/utils/app/HostAwareSurface";
// EU-Sterilisation (R-P1a): Google-Analytics-Einbindung (gtag.js) entfernt. Es bleiben nur die
// datenschutzfreundlichen EU-Tracker SimpleAnalytics + Plausible, die der Admin opt-in aktiviert.
export default function ScriptAnalytics() {
const rootData = useRootData();
const location = useLocation();
if (!rootData.appConfiguration?.analytics.enabled) {
return null;
}
if (isAppOrAdminSurface(rootData, location.pathname)) {
return null;
}
return (
<>
{rootData.appConfiguration?.analytics.simpleAnalytics && (
<>
<script async defer src="https://scripts.simpleanalyticscdn.com/latest.js"></script>
<noscript>
<img src="https://queue.simpleanalyticscdn.com/noscript.gif" alt="privacy-friendly-simpleanalytics" referrerPolicy="no-referrer-when-downgrade" />
</noscript>
</>
)}
{rootData.appConfiguration?.analytics.plausibleAnalytics && (
<>
<script defer data-domain={rootData.domainName} src="https://plausible.io/js/script.js"></script>
</>
)}
</>
);
}
@@ -0,0 +1,44 @@
import { useEffect } from "react";
import { useLocation } from "react-router";
import { useRootData } from "~/utils/data/useRootData";
import CookieHelper from "~/utils/helpers/CookieHelper";
import { CookieCategory } from "~/application/cookies/CookieCategory";
import { isAppOrAdminSurface } from "~/utils/app/HostAwareSurface";
const FORCE_IN_ROUTES = ["/crisp"];
export default function ScriptCrisp() {
const rootData = useRootData();
const location = useLocation();
useEffect(() => {
const isAppOrAdminArea = isAppOrAdminSurface(rootData, location.pathname);
let hasConsent = CookieHelper.hasConsent(rootData.userSession ?? null, CookieCategory.FUNCTIONAL) || isAppOrAdminArea || FORCE_IN_ROUTES.some((p) => location.pathname.startsWith(p));
if (rootData.chatWebsiteId && hasConsent && !window.$crisp) {
window.$crisp = [];
window.CRISP_WEBSITE_ID = rootData.chatWebsiteId;
const d = document;
const s = d.createElement("script");
s.src = "https://client.crisp.chat/l.js";
s.async = true;
d.getElementsByTagName("head")[0].appendChild(s);
}
if (window.$crisp && isAppOrAdminArea) {
try {
// @ts-ignore
window.$crisp.push(["do", "chat:hide"]);
} catch {
// ignore
}
}
}, [rootData, rootData.userSession?.cookies, rootData.chatWebsiteId, location.pathname]);
return null;
}
declare global {
interface Window {
$crisp: any;
CRISP_WEBSITE_ID: string;
}
}
@@ -0,0 +1,46 @@
import { useEffect } from "react";
interface ScriptInjectorProps {
scripts?: {
head: string | null;
body: string | null;
};
}
const ScriptInjector = ({ scripts }: ScriptInjectorProps) => {
useEffect(() => {
if (scripts?.head) {
const headDiv = document.createElement("div");
headDiv.innerHTML = scripts.head;
Array.from(headDiv.childNodes).forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE) {
const script = document.createElement("script");
Array.from((node as Element).attributes).forEach((attr) => {
script.setAttribute(attr.name, attr.value);
});
script.innerHTML = (node as Element).innerHTML;
document.head.appendChild(script);
}
});
}
if (scripts?.body) {
const bodyDiv = document.createElement("div");
bodyDiv.innerHTML = scripts.body;
Array.from(bodyDiv.childNodes).forEach((node) => {
if (node.nodeType === Node.ELEMENT_NODE) {
const script = document.createElement("script");
Array.from((node as Element).attributes).forEach((attr) => {
script.setAttribute(attr.name, attr.value);
});
script.innerHTML = (node as Element).innerHTML;
document.body.appendChild(script);
}
});
}
}, [scripts]);
return null;
};
export default ScriptInjector;