improve AI and data privacy disclaim

This commit is contained in:
Yinyin Liu 2026-03-26 10:08:59 +01:00
parent 1683ab9b9a
commit c70cacf179
9 changed files with 222 additions and 38 deletions

View File

@ -42,8 +42,16 @@ function App() {
setAccessToSodistorePro
} = useContext(ProductIdContext);
const detectBrowserLanguage = (): string => {
const browserLang = navigator.language?.toLowerCase() || '';
if (browserLang.startsWith('de')) return 'de';
if (browserLang.startsWith('fr')) return 'fr';
if (browserLang.startsWith('it')) return 'it';
return 'en';
};
const [language, setLanguage] = useState<string>(
() => localStorage.getItem('language') || currentUser?.language || 'en'
() => localStorage.getItem('language') || currentUser?.language || detectBrowserLanguage()
);
const onSelectLanguage = (lang: string) => {

View File

@ -11,7 +11,7 @@ import {
} from '@mui/material';
import { FormattedMessage } from 'react-intl';
export const CURRENT_TERMS_VERSION = 1;
export const CURRENT_TERMS_VERSION = 2;
interface AcknowledgementDialogProps {
open: boolean;
@ -34,14 +34,14 @@ const AcknowledgementDialog: React.FC<AcknowledgementDialogProps> = ({
<Box mb={2}>
<Typography variant="subtitle1" fontWeight="bold" gutterBottom>
<FormattedMessage
id="terms_ai_heading"
defaultMessage="AI-Powered Features"
id="terms_data_heading"
defaultMessage="Your Data"
/>
</Typography>
<Typography variant="body2">
<FormattedMessage
id="terms_ai_body"
defaultMessage="This platform uses AI for diagnostics and automated analysis. AI-generated results are advisory and should be verified by qualified personnel."
id="terms_data_body"
defaultMessage="Your installation data is securely stored in Switzerland. We do not share your data with third parties."
/>
</Typography>
</Box>
@ -51,14 +51,14 @@ const AcknowledgementDialog: React.FC<AcknowledgementDialogProps> = ({
<Box my={2}>
<Typography variant="subtitle1" fontWeight="bold" gutterBottom>
<FormattedMessage
id="terms_cookies_heading"
defaultMessage="Cookies and Session Storage"
id="terms_ai_heading"
defaultMessage="AI-Powered Insights"
/>
</Typography>
<Typography variant="body2">
<FormattedMessage
id="terms_cookies_body"
defaultMessage="Browser storage is used for login sessions and user preferences. This is required for the platform to function correctly."
id="terms_ai_body"
defaultMessage="We use an AI service hosted in the EU to provide diagnostics and insights for your installations. AI-generated results are recommendations and should be verified by qualified personnel."
/>
</Typography>
</Box>
@ -68,14 +68,14 @@ const AcknowledgementDialog: React.FC<AcknowledgementDialogProps> = ({
<Box mt={2}>
<Typography variant="subtitle1" fontWeight="bold" gutterBottom>
<FormattedMessage
id="terms_usage_heading"
defaultMessage="Terms of Use"
id="terms_cookies_heading"
defaultMessage="Browser Storage"
/>
</Typography>
<Typography variant="body2">
<FormattedMessage
id="terms_usage_body"
defaultMessage="By using this platform, you acknowledge the general terms of use of inesco energy. For questions, please contact your system administrator."
id="terms_cookies_body"
defaultMessage="This platform stores login and preference settings in your browser to keep you signed in and remember your language choice."
/>
</Typography>
</Box>

View File

@ -0,0 +1,110 @@
import React from 'react';
import {
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Button,
Typography,
Divider,
Box
} from '@mui/material';
import { FormattedMessage } from 'react-intl';
interface DataPrivacyDialogProps {
open: boolean;
onClose: () => void;
}
const DataPrivacyDialog: React.FC<DataPrivacyDialogProps> = ({
open,
onClose
}) => {
return (
<Dialog open={open} onClose={onClose} maxWidth="sm" fullWidth>
<DialogTitle>
<FormattedMessage
id="privacy_dialog_title"
defaultMessage="Data & Privacy"
/>
</DialogTitle>
<DialogContent dividers>
<Box mb={2}>
<Typography variant="subtitle1" fontWeight="bold" gutterBottom>
<FormattedMessage
id="privacy_data_heading"
defaultMessage="Where is my data stored?"
/>
</Typography>
<Typography variant="body2">
<FormattedMessage
id="privacy_data_body"
defaultMessage="Your installation data is stored on servers in Switzerland. Only authorized inesco energy personnel can access your data for support purposes."
/>
</Typography>
</Box>
<Divider />
<Box my={2}>
<Typography variant="subtitle1" fontWeight="bold" gutterBottom>
<FormattedMessage
id="privacy_ai_heading"
defaultMessage="How is AI used?"
/>
</Typography>
<Typography variant="body2">
<FormattedMessage
id="privacy_ai_body"
defaultMessage="We use an AI service hosted in the European Union to analyze your installation data and provide diagnostic insights. The AI processes technical data such as battery readings and error codes. AI recommendations should always be verified by qualified personnel."
/>
</Typography>
</Box>
<Divider />
<Box my={2}>
<Typography variant="subtitle1" fontWeight="bold" gutterBottom>
<FormattedMessage
id="privacy_browser_heading"
defaultMessage="What does my browser store?"
/>
</Typography>
<Typography variant="body2">
<FormattedMessage
id="privacy_browser_body"
defaultMessage="Your browser stores your login session to keep you signed in, and your language and theme preferences. No tracking or advertising cookies are used."
/>
</Typography>
</Box>
<Divider />
<Box mt={2}>
<Typography variant="subtitle1" fontWeight="bold" gutterBottom>
<FormattedMessage
id="privacy_access_heading"
defaultMessage="Who has access to my data?"
/>
</Typography>
<Typography variant="body2">
<FormattedMessage
id="privacy_access_body"
defaultMessage="Your data is not shared with third parties. It is used solely to operate the platform and provide you with insights about your installations."
/>
</Typography>
</Box>
</DialogContent>
<DialogActions>
<Button variant="contained" onClick={onClose}>
<FormattedMessage
id="privacy_close_button"
defaultMessage="Close"
/>
</Button>
</DialogActions>
</Dialog>
);
};
export default DataPrivacyDialog;

View File

@ -34,6 +34,7 @@ interface OverviewProps {
s3Credentials: I_S3Credentials;
id: number;
device?: number;
product?: number;
connected?: boolean;
loading?: boolean;
}

View File

@ -645,13 +645,24 @@
"timelineEscalatedDesc": "Ticket eskaliert.",
"timelineResolutionAddedDesc": "Lösung hinzugefügt von {name}.",
"terms_dialog_title": "Willkommen bei inesco energy",
"terms_ai_heading": "KI-gestützte Funktionen",
"terms_ai_body": "Diese Plattform nutzt KI für Diagnosen und automatisierte Analysen. KI-generierte Ergebnisse sind beratend und sollten von qualifiziertem Personal überprüft werden.",
"terms_cookies_heading": "Cookies und Sitzungsspeicher",
"terms_cookies_body": "Browser-Speicher wird für Anmeldesitzungen und Benutzereinstellungen verwendet. Dies ist für die korrekte Funktion der Plattform erforderlich.",
"terms_usage_heading": "Nutzungsbedingungen",
"terms_usage_body": "Durch die Nutzung dieser Plattform erkennen Sie die allgemeinen Nutzungsbedingungen von inesco energy an. Bei Fragen wenden Sie sich bitte an Ihren Systemadministrator.",
"terms_data_heading": "Ihre Daten",
"terms_data_body": "Ihre Installationsdaten werden sicher in der Schweiz gespeichert. Wir geben Ihre Daten nicht an Dritte weiter.",
"terms_ai_heading": "KI-gestützte Einblicke",
"terms_ai_body": "Wir nutzen einen in der EU gehosteten KI-Dienst, um Diagnosen und Einblicke für Ihre Installationen bereitzustellen. KI-generierte Ergebnisse sind Empfehlungen und sollten von qualifiziertem Personal überprüft werden.",
"terms_cookies_heading": "Browser-Speicher",
"terms_cookies_body": "Diese Plattform speichert Anmelde- und Einstellungsdaten in Ihrem Browser, um Sie angemeldet zu halten und Ihre Sprachauswahl zu speichern.",
"terms_acknowledge_button": "Ich verstehe",
"privacy_menu_item": "Daten & Datenschutz",
"privacy_dialog_title": "Daten & Datenschutz",
"privacy_data_heading": "Wo werden meine Daten gespeichert?",
"privacy_data_body": "Ihre Installationsdaten werden auf Servern in der Schweiz gespeichert. Nur autorisiertes Personal von inesco energy kann zu Supportzwecken auf Ihre Daten zugreifen.",
"privacy_ai_heading": "Wie wird KI eingesetzt?",
"privacy_ai_body": "Wir nutzen einen in der Europäischen Union gehosteten KI-Dienst, um Ihre Installationsdaten zu analysieren und diagnostische Einblicke zu liefern. Die KI verarbeitet technische Daten wie Batteriemesswerte und Fehlercodes. KI-Empfehlungen sollten stets von qualifiziertem Personal überprüft werden.",
"privacy_browser_heading": "Was speichert mein Browser?",
"privacy_browser_body": "Ihr Browser speichert Ihre Anmeldesitzung, um Sie angemeldet zu halten, sowie Ihre Sprach- und Designeinstellungen. Es werden keine Tracking- oder Werbe-Cookies verwendet.",
"privacy_access_heading": "Wer hat Zugriff auf meine Daten?",
"privacy_access_body": "Ihre Daten werden nicht an Dritte weitergegeben. Sie werden ausschliesslich für den Betrieb der Plattform und zur Bereitstellung von Einblicken in Ihre Installationen verwendet.",
"privacy_close_button": "Schliessen",
"sodistorepro": "Sodistore Pro",
"numberOfInverters": "Anzahl der Wechselrichter"
}

View File

@ -393,13 +393,24 @@
"timelineEscalatedDesc": "Ticket escalated.",
"timelineResolutionAddedDesc": "Resolution added by {name}.",
"terms_dialog_title": "Welcome to inesco energy",
"terms_ai_heading": "AI-Powered Features",
"terms_ai_body": "This platform uses AI for diagnostics and automated analysis. AI-generated results are advisory and should be verified by qualified personnel.",
"terms_cookies_heading": "Cookies and Session Storage",
"terms_cookies_body": "Browser storage is used for login sessions and user preferences. This is required for the platform to function correctly.",
"terms_usage_heading": "Terms of Use",
"terms_usage_body": "By using this platform, you acknowledge the general terms of use of inesco energy. For questions, please contact your system administrator.",
"terms_data_heading": "Your Data",
"terms_data_body": "Your installation data is securely stored in Switzerland. We do not share your data with third parties.",
"terms_ai_heading": "AI-Powered Insights",
"terms_ai_body": "We use an AI service hosted in the EU to provide diagnostics and insights for your installations. AI-generated results are recommendations and should be verified by qualified personnel.",
"terms_cookies_heading": "Browser Storage",
"terms_cookies_body": "This platform stores login and preference settings in your browser to keep you signed in and remember your language choice.",
"terms_acknowledge_button": "I understand",
"privacy_menu_item": "Data & Privacy",
"privacy_dialog_title": "Data & Privacy",
"privacy_data_heading": "Where is my data stored?",
"privacy_data_body": "Your installation data is stored on servers in Switzerland. Only authorized inesco energy personnel can access your data for support purposes.",
"privacy_ai_heading": "How is AI used?",
"privacy_ai_body": "We use an AI service hosted in the European Union to analyze your installation data and provide diagnostic insights. The AI processes technical data such as battery readings and error codes. AI recommendations should always be verified by qualified personnel.",
"privacy_browser_heading": "What does my browser store?",
"privacy_browser_body": "Your browser stores your login session to keep you signed in, and your language and theme preferences. No tracking or advertising cookies are used.",
"privacy_access_heading": "Who has access to my data?",
"privacy_access_body": "Your data is not shared with third parties. It is used solely to operate the platform and provide you with insights about your installations.",
"privacy_close_button": "Close",
"sodistorepro": "Sodistore Pro",
"numberOfInverters": "Number of Inverters"
}

View File

@ -645,13 +645,24 @@
"timelineEscalatedDesc": "Ticket escaladé.",
"timelineResolutionAddedDesc": "Résolution ajoutée par {name}.",
"terms_dialog_title": "Bienvenue chez inesco energy",
"terms_ai_heading": "Fonctionnalités basées sur l'IA",
"terms_ai_body": "Cette plateforme utilise l'IA pour les diagnostics et l'analyse automatisée. Les résultats générés par l'IA sont consultatifs et doivent être vérifiés par du personnel qualifié.",
"terms_cookies_heading": "Cookies et stockage de session",
"terms_cookies_body": "Le stockage du navigateur est utilisé pour les sessions de connexion et les préférences utilisateur. Ceci est nécessaire au bon fonctionnement de la plateforme.",
"terms_usage_heading": "Conditions d'utilisation",
"terms_usage_body": "En utilisant cette plateforme, vous reconnaissez les conditions générales d'utilisation d'inesco energy. Pour toute question, veuillez contacter votre administrateur système.",
"terms_data_heading": "Vos données",
"terms_data_body": "Les données de votre installation sont stockées en toute sécurité en Suisse. Nous ne partageons pas vos données avec des tiers.",
"terms_ai_heading": "Analyses basées sur l'IA",
"terms_ai_body": "Nous utilisons un service d'IA hébergé dans l'UE pour fournir des diagnostics et des analyses pour vos installations. Les résultats générés par l'IA sont des recommandations et doivent être vérifiés par du personnel qualifié.",
"terms_cookies_heading": "Stockage du navigateur",
"terms_cookies_body": "Cette plateforme enregistre vos paramètres de connexion et de préférences dans votre navigateur pour maintenir votre session et mémoriser votre choix de langue.",
"terms_acknowledge_button": "Je comprends",
"privacy_menu_item": "Données et confidentialité",
"privacy_dialog_title": "Données et confidentialité",
"privacy_data_heading": "Où sont stockées mes données ?",
"privacy_data_body": "Les données de votre installation sont stockées sur des serveurs en Suisse. Seul le personnel autorisé d'inesco energy peut accéder à vos données à des fins d'assistance.",
"privacy_ai_heading": "Comment l'IA est-elle utilisée ?",
"privacy_ai_body": "Nous utilisons un service d'IA hébergé dans l'Union européenne pour analyser les données de votre installation et fournir des informations diagnostiques. L'IA traite des données techniques telles que les relevés de batterie et les codes d'erreur. Les recommandations de l'IA doivent toujours être vérifiées par du personnel qualifié.",
"privacy_browser_heading": "Que stocke mon navigateur ?",
"privacy_browser_body": "Votre navigateur stocke votre session de connexion pour vous maintenir connecté, ainsi que vos préférences de langue et de thème. Aucun cookie de suivi ou publicitaire n'est utilisé.",
"privacy_access_heading": "Qui a accès à mes données ?",
"privacy_access_body": "Vos données ne sont pas partagées avec des tiers. Elles sont utilisées uniquement pour le fonctionnement de la plateforme et pour vous fournir des informations sur vos installations.",
"privacy_close_button": "Fermer",
"sodistorepro": "Sodistore Pro",
"numberOfInverters": "Nombre d'onduleurs"
}

View File

@ -645,13 +645,24 @@
"timelineEscalatedDesc": "Ticket escalato.",
"timelineResolutionAddedDesc": "Risoluzione aggiunta da {name}.",
"terms_dialog_title": "Benvenuto su inesco energy",
"terms_ai_heading": "Funzionalità basate sull'IA",
"terms_ai_body": "Questa piattaforma utilizza l'IA per la diagnostica e l'analisi automatizzata. I risultati generati dall'IA sono a scopo consultivo e devono essere verificati da personale qualificato.",
"terms_cookies_heading": "Cookie e archiviazione sessione",
"terms_cookies_body": "L'archiviazione del browser viene utilizzata per le sessioni di accesso e le preferenze utente. Questo è necessario per il corretto funzionamento della piattaforma.",
"terms_usage_heading": "Condizioni d'uso",
"terms_usage_body": "Utilizzando questa piattaforma, si riconoscono le condizioni generali d'uso di inesco energy. Per domande, contattare l'amministratore di sistema.",
"terms_data_heading": "I tuoi dati",
"terms_data_body": "I dati della tua installazione sono archiviati in modo sicuro in Svizzera. Non condividiamo i tuoi dati con terze parti.",
"terms_ai_heading": "Analisi basate sull'IA",
"terms_ai_body": "Utilizziamo un servizio di IA ospitato nell'UE per fornire diagnostica e analisi per le tue installazioni. I risultati generati dall'IA sono raccomandazioni e devono essere verificati da personale qualificato.",
"terms_cookies_heading": "Archiviazione del browser",
"terms_cookies_body": "Questa piattaforma memorizza le impostazioni di accesso e le preferenze nel browser per mantenerti connesso e ricordare la tua scelta linguistica.",
"terms_acknowledge_button": "Ho capito",
"privacy_menu_item": "Dati e privacy",
"privacy_dialog_title": "Dati e privacy",
"privacy_data_heading": "Dove vengono archiviati i miei dati?",
"privacy_data_body": "I dati della tua installazione sono archiviati su server in Svizzera. Solo il personale autorizzato di inesco energy può accedere ai tuoi dati per scopi di assistenza.",
"privacy_ai_heading": "Come viene utilizzata l'IA?",
"privacy_ai_body": "Utilizziamo un servizio di IA ospitato nell'Unione Europea per analizzare i dati della tua installazione e fornire informazioni diagnostiche. L'IA elabora dati tecnici come le letture delle batterie e i codici di errore. Le raccomandazioni dell'IA devono sempre essere verificate da personale qualificato.",
"privacy_browser_heading": "Cosa memorizza il mio browser?",
"privacy_browser_body": "Il tuo browser memorizza la sessione di accesso per mantenerti connesso e le tue preferenze di lingua e tema. Non vengono utilizzati cookie di tracciamento o pubblicitari.",
"privacy_access_heading": "Chi ha accesso ai miei dati?",
"privacy_access_body": "I tuoi dati non vengono condivisi con terze parti. Vengono utilizzati esclusivamente per il funzionamento della piattaforma e per fornirti informazioni sulle tue installazioni.",
"privacy_close_button": "Chiudi",
"sodistorepro": "Sodistore Pro",
"numberOfInverters": "Numero di inverter"
}

View File

@ -9,9 +9,11 @@ import {
import React, { useContext, useRef, useState } from 'react';
import { styled } from '@mui/material/styles';
import ExpandMoreTwoToneIcon from '@mui/icons-material/ExpandMoreTwoTone';
import ShieldOutlinedIcon from '@mui/icons-material/ShieldOutlined';
import { ThemeContext } from '../../../../theme/ThemeProvider';
import { FormattedMessage } from 'react-intl';
import '../../../../App.css';
import DataPrivacyDialog from '../../../../components/DataPrivacyDialog';
interface HeaderButtonsProps {
language: string;
@ -79,6 +81,7 @@ function HeaderMenu(props: HeaderButtonsProps) {
const setThemeName = themeContext;
const [darkState, setDarkState] = useState(false);
const [privacyOpen, setPrivacyOpen] = useState(false);
const handleThemeChange = () => {
setDarkState(!darkState);
@ -132,6 +135,20 @@ function HeaderMenu(props: HeaderButtonsProps) {
}
/>
</ListItem>
<ListItem
classes={{ root: 'MuiListItem-indicators' }}
onClick={() => setPrivacyOpen(true)}
>
<ListItemText
primaryTypographyProps={{ noWrap: true }}
primary={
<Box display="flex" alignItems="center">
<ShieldOutlinedIcon fontSize="small" sx={{ mr: 0.5 }} />
<FormattedMessage id="privacy_menu_item" defaultMessage="Data & Privacy" />
</Box>
}
/>
</ListItem>
</List>
</ListWrapper>
<div
@ -152,6 +169,10 @@ function HeaderMenu(props: HeaderButtonsProps) {
</MenuItem>
</Menu>
</div>
<DataPrivacyDialog
open={privacyOpen}
onClose={() => setPrivacyOpen(false)}
/>
</div>
);
}