Responsive e sicurezza
Breakpoints
resources/scss/agentWidget.scss
$breakpoints: (
"xs": 370px,
"sm": 480px,
"md": 768px,
"lg": 1024px,
"xl": 1200px,
);
@mixin respond-to($breakpoint) {
@if map-has-key($breakpoints, $breakpoint) {
@media (min-width: map-get($breakpoints, $breakpoint)) {
@content;
}
}
}
.chat-container {
width: 350px;
height: 500px;
@include respond-to(sm) {
width: 400px;
height: 600px;
}
@include respond-to(md) {
width: 450px;
height: 700px;
}
}
🔒 Sicurezza
Nota sicurezza JWT: I token (
tidiko_jwt,tidiko_jwt_refresh) sono persistiti inlocalStorageper sopravvivere ai reload della pagina. Sono leggibili da qualsiasi script sulla stessa origin — mitigare XSS sul sito host. Non sono secret di lunga durata: scadono conexpdel JWT.
JWT Authentication
resources/js/shadowDomWidgetPreact.jsx
// Authentication setup effect
useEffect(() => {
const ls = window.localStorage;
if (jwt) ls.setItem("tidiko_jwt", jwt);
else if (jwt === null) ls.removeItem("tidiko_jwt");
if (jwtRefresh) ls.setItem("tidiko_jwt_refresh", jwtRefresh);
else if (jwtRefresh === null) ls.removeItem("tidiko_jwt_refresh");
}, [jwt, jwtRefresh]);
Privacy e GDPR
resources/js/shadowDomWidgetPreact.jsx
const PrivacyBanner = memo(({ options, onAccept, language }) => {
const message = __("privacy_message", language);
const policyLink = __("privacy_policy", language);
const acceptButton = __("privacy_accept", language);
return (
<div
className="message system-message privacy-message"
role="dialog"
aria-labelledby="privacy-title"
>
<p id="privacy-title">
{message}{" "}
<a
href="https://tidiko.ai/privacy-policy-app-tidiko/"
target="_blank"
rel="noopener noreferrer"
>
{policyLink}
</a>
.
</p>
<button className="privacy-button" onClick={onAccept}>
{acceptButton}
</button>
</div>
);
});
// handlePrivacyAccept imposta il cookie tidiko_widget_privacy_accepted=1 (1 anno)