@kitconcept/volto-dsgvo-banner
Version:
373 lines (350 loc) • 12.6 kB
JSX
import React, { useState, useEffect } from 'react';
import { includes, isObject } from 'lodash';
import { Button, Modal, Checkbox, Form } from 'semantic-ui-react';
import { useCookies } from 'react-cookie';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux';
import config from '@plone/volto/registry';
import { useIntl, defineMessages, FormattedMessage } from 'react-intl';
import Google from './Google';
import Matomo from './Matomo';
import BodyClass from '@plone/volto/helpers/BodyClass/BodyClass';
import { useClient } from '@plone/volto/hooks/client/useClient';
import { hideDSGVOBanner } from '../../actions';
const messages = defineMessages({
technically_required: {
id: 'Technically required',
defaultMessage: 'Technically required',
},
tracking: {
id: 'Tracking',
defaultMessage: 'Tracking',
},
});
const Banner = (props) => {
const isClient = useClient();
let privacy_url = config.settings.DSGVOBanner.privacy_url;
const modules = config.settings.DSGVOBanner.modules;
const [cookies, setCookie, removeCookie] = useCookies();
const [configureCookies, setConfigureCookies] = useState(false);
const showTechnicallyRequired =
config.settings.DSGVOBanner.showTechnicallyRequired;
const bannerRejectButton =
config.settings.DSGVOBanner.cssClasses.bannerRejectButton;
const bannerAgreeButton =
config.settings.DSGVOBanner.cssClasses.bannerAgreeButton;
const bannerAdjustButton =
config.settings.DSGVOBanner.cssClasses.bannerAdjustButton;
const showConfirmModal =
isClient && config.settings.DSGVOBanner.showBanner
? !Number(cookies.confirm_cookies) || props.show
: props.show;
const intl = useIntl();
if (isObject(privacy_url)) {
privacy_url = privacy_url[intl.locale];
}
const [confirmTracking, setConfirmTracking] = useState(
!!Number(cookies.confirm_tracking),
);
const [confirmYoutube, setConfirmYoutube] = useState(
!!Number(cookies.confirm_youtube),
);
const [confirmFacebook, setConfirmFacebook] = useState(
!!Number(cookies.confirm_facebook),
);
const [confirmGoogle, setConfirmGoogle] = useState(
!!Number(cookies.confirm_google),
);
const [confirmVimeo, setConfirmVimeo] = useState(
!!Number(cookies.confirm_vimeo),
);
const [confirmTwitter, setConfirmTwitter] = useState(
!!Number(cookies.confirm_twitter),
);
const expiryDate = new Date();
expiryDate.setMonth(expiryDate.getMonth() + 1);
const options = { path: '/', expires: expiryDate };
const confirmSelection = () => {
let expiryDate = new Date();
expiryDate.setMonth(expiryDate.getMonth() + 1);
if (confirmTracking) {
setCookie('confirm_tracking', 1, options);
} else {
removeCookie('confirm_tracking', options);
}
if (confirmFacebook) {
setCookie('confirm_facebook', 1, options);
} else {
removeCookie('confirm_facebook', options);
}
if (confirmYoutube) {
setCookie('confirm_youtube', 1, options);
} else {
removeCookie('confirm_youtube', options);
}
if (confirmGoogle) {
setCookie('confirm_google', 1, options);
} else {
removeCookie('confirm_google', options);
}
if (confirmVimeo) {
setCookie('confirm_vimeo', 1, options);
} else {
removeCookie('confirm_vimeo', 1, options);
}
if (confirmTwitter) {
setCookie('confirm_twitter', 1, options);
} else {
removeCookie('confirm_twitter', 1, options);
}
setCookie('confirm_cookies', 1, options);
props.hideDSGVOBanner();
};
const confirmAll = () => {
setCookie('confirm_tracking', 1, options);
setCookie('confirm_facebook', 1, options);
setCookie('confirm_youtube', 1, options);
setCookie('confirm_google', 1, options);
setCookie('confirm_twitter', 1, options);
setCookie('confirm_vimeo', 1, options);
setCookie('confirm_cookies', 1, options);
props.hideDSGVOBanner();
};
const rejectAll = () => {
setCookie('confirm_tracking', 0, options);
setCookie('confirm_facebook', 0, options);
setCookie('confirm_youtube', 0, options);
setCookie('confirm_google', 0, options);
setCookie('confirm_twitter', 0, options);
setCookie('confirm_vimeo', 0, options);
setCookie('confirm_cookies', 1, options);
props.hideDSGVOBanner();
};
useEffect(() => {
if (document && showConfirmModal) {
document.getElementById('question-landing').focus();
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return (
<>
{config.settings.DSGVOBanner.tracker.type === 'google' && <Google />}
{config.settings.DSGVOBanner.tracker.type === 'matomo' && <Matomo />}
<BodyClass className={showConfirmModal ? 'openCookieBanner' : ''} />
<Modal
id="question-landing"
open={showConfirmModal}
dimmer="inverted"
closeOnDimmerClick={false}
className="dsgvo-banner"
>
{!configureCookies ? (
<>
<Modal.Content>
<h2>
<FormattedMessage
id="Privacy Notice Change"
defaultMessage="Privacy Notice Change"
/>
</h2>
<p className="cookie-text">
<FormattedMessage
id="To give you the best possible user experience, we use cookies on our website. Cookies required for the operation of the site are set automatically. You can also allow other cookies. You can {agree_all_cookies} or {adjust_privacy_settings}."
defaultMessage="To give you the best possible user experience, we use cookies on our website. Cookies required for the operation of the site are set automatically. You can also allow other cookies. You can {agree_all_cookies} or {adjust_privacy_settings}."
values={{
agree_all_cookies: (
<b>
<FormattedMessage
id="agree to all cookies"
defaultMessage="agree to all cookies"
/>
</b>
),
adjust_privacy_settings: (
<b>
<FormattedMessage
id="adjust the privacy settings"
defaultMessage="adjust the privacy settings"
/>
</b>
),
}}
/>
</p>
<p>
<FormattedMessage
id="You can find more information on the used cookies and how you can subsequently revoke your consent in our"
defaultMessage="You can find more information on the used cookies and how you can subsequently revoke your consent in our"
/>{' '}
<b>
<Link to={privacy_url} onClick={confirmSelection}>
<FormattedMessage
id="Privacy Policy"
defaultMessage="Privacy Policy"
/>
</Link>
</b>
.
</p>
</Modal.Content>
<Modal.Actions>
<Button
className={bannerAgreeButton}
onClick={() => confirmAll()}
>
<FormattedMessage
id="Agree to all cookies"
defaultMessage="Agree to all cookies"
/>
</Button>
<Button
className={bannerRejectButton}
onClick={() => rejectAll()}
>
<FormattedMessage
id="Reject all cookies"
defaultMessage="Reject all cookies"
/>
</Button>
{modules.length > 0 && (
<Button
className={bannerAdjustButton + ' inverted'}
onClick={() => setConfigureCookies(true)}
>
<FormattedMessage
id="Adjust privacy settings"
defaultMessage="Adjust privacy settings"
/>
</Button>
)}
</Modal.Actions>
</>
) : (
<>
<Modal.Content>
<h2>
<FormattedMessage
id="Privacy Notice"
defaultMessage="Privacy Notice"
/>
</h2>
<Form>
{showTechnicallyRequired && (
<Form.Field>
<Checkbox
toggle
label={intl.formatMessage(messages.technically_required)}
checked
disabled
/>
</Form.Field>
)}
{includes(modules, 'tracking') && (
<Form.Field>
<Checkbox
toggle
label={intl.formatMessage(messages.tracking)}
onChange={() => setConfirmTracking(!confirmTracking)}
checked={confirmTracking}
/>
</Form.Field>
)}
{includes(modules, 'youtube') && (
<Form.Field>
<Checkbox
toggle
label="Youtube"
onChange={() => setConfirmYoutube(!confirmYoutube)}
checked={confirmYoutube}
/>
</Form.Field>
)}
{includes(modules, 'facebook') && (
<Form.Field>
<Checkbox
toggle
label="Facebook"
onChange={() => setConfirmFacebook(!confirmFacebook)}
checked={confirmFacebook}
/>
</Form.Field>
)}
{includes(modules, 'google') && (
<Form.Field>
<Checkbox
toggle
label="Google"
onChange={() => setConfirmGoogle(!confirmGoogle)}
checked={confirmGoogle}
/>
</Form.Field>
)}
{includes(modules, 'vimeo') && (
<Form.Field>
<Checkbox
toggle
label="Vimeo"
onChange={() => setConfirmVimeo(!confirmVimeo)}
checked={confirmVimeo}
/>
</Form.Field>
)}
{includes(modules, 'twitter') && (
<Form.Field>
<Checkbox
toggle
label="Twitter"
onChange={() => setConfirmTwitter(!confirmTwitter)}
checked={confirmTwitter}
/>
</Form.Field>
)}
</Form>
</Modal.Content>
<Modal.Actions>
<Button
className="back"
onClick={() => setConfigureCookies(false)}
>
{'< '}
<FormattedMessage id="Back" defaultMessage="Back" />
</Button>
<Button
className={bannerRejectButton}
onClick={() => rejectAll()}
>
<FormattedMessage
id="Reject all cookies"
defaultMessage="Reject all cookies"
/>
</Button>
<Button
className={bannerAgreeButton}
onClick={() => confirmAll()}
>
<FormattedMessage
id="Agree to all cookies"
defaultMessage="Agree to all cookies"
/>
</Button>
<Button
className={bannerAdjustButton}
onClick={() => confirmSelection()}
>
<FormattedMessage id="Save" defaultMessage="Save" />
</Button>
</Modal.Actions>
</>
)}
</Modal>
</>
);
};
export default connect(
(state, props) => ({
show: state.DSGVOBanner.show,
}),
{
hideDSGVOBanner,
},
)(Banner);