166 lines
No EOL
5.7 KiB
JavaScript
166 lines
No EOL
5.7 KiB
JavaScript
import React, { useState } from 'react';
|
|
import { Button, IconButton, Tooltip, Dialog, DialogTitle, DialogContent,
|
|
DialogActions, Typography, Box, Divider, RadioGroup, Radio, FormControlLabel,
|
|
FormControl, FormLabel } from '@mui/material';
|
|
import CookieIcon from '@mui/icons-material/Cookie';
|
|
import consentService, { CONSENT_LEVELS } from '../services/consentService';
|
|
|
|
/**
|
|
* Button to open cookie settings dialog
|
|
* Can be placed in the footer or other accessible areas of the app
|
|
*/
|
|
const CookieSettingsButton = ({ variant = 'text', icon = false, label = 'Cookie Settings' }) => {
|
|
const [open, setOpen] = useState(false);
|
|
const [consentLevel, setConsentLevel] = useState(() => {
|
|
const storedConsent = consentService.getStoredConsent();
|
|
return storedConsent?.level || CONSENT_LEVELS.NECESSARY;
|
|
});
|
|
|
|
const handleOpen = () => {
|
|
setOpen(true);
|
|
};
|
|
|
|
const handleClose = () => {
|
|
setOpen(false);
|
|
};
|
|
|
|
const handleConsentLevelChange = (event) => {
|
|
setConsentLevel(event.target.value);
|
|
};
|
|
|
|
const handleSave = () => {
|
|
consentService.saveConsent(consentLevel);
|
|
setOpen(false);
|
|
};
|
|
|
|
const handleAcceptAll = () => {
|
|
const allConsent = CONSENT_LEVELS.ALL;
|
|
setConsentLevel(allConsent);
|
|
consentService.saveConsent(allConsent);
|
|
setOpen(false);
|
|
};
|
|
|
|
const handleNecessaryOnly = () => {
|
|
const necessaryOnly = CONSENT_LEVELS.NECESSARY;
|
|
setConsentLevel(necessaryOnly);
|
|
consentService.saveConsent(necessaryOnly);
|
|
setOpen(false);
|
|
};
|
|
|
|
// Render as icon button or regular button
|
|
if (icon) {
|
|
return (
|
|
<>
|
|
<Tooltip title={label}>
|
|
<IconButton onClick={handleOpen} size="small" color="inherit">
|
|
<CookieIcon fontSize="small" />
|
|
</IconButton>
|
|
</Tooltip>
|
|
{renderDialog()}
|
|
</>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<Button variant={variant} size="small" onClick={handleOpen}>
|
|
{label}
|
|
</Button>
|
|
{renderDialog()}
|
|
</>
|
|
);
|
|
|
|
function renderDialog() {
|
|
return (
|
|
<Dialog open={open} onClose={handleClose} maxWidth="sm" fullWidth>
|
|
<DialogTitle>
|
|
<Box sx={{ display: 'flex', alignItems: 'center' }}>
|
|
<CookieIcon sx={{ mr: 1 }} />
|
|
Cookie Settings
|
|
</Box>
|
|
</DialogTitle>
|
|
<DialogContent>
|
|
<Typography variant="body2" paragraph>
|
|
We use cookies to enhance your browsing experience, provide personalized content,
|
|
and analyze our traffic. You can adjust your privacy settings below.
|
|
</Typography>
|
|
|
|
<Divider sx={{ my: 2 }} />
|
|
|
|
<FormControl component="fieldset" sx={{ width: '100%' }}>
|
|
<FormLabel component="legend">Privacy Settings</FormLabel>
|
|
<RadioGroup
|
|
value={consentLevel}
|
|
onChange={handleConsentLevelChange}
|
|
>
|
|
<FormControlLabel
|
|
value={CONSENT_LEVELS.NECESSARY}
|
|
control={<Radio />}
|
|
label={
|
|
<Box>
|
|
<Typography variant="body1">Necessary Cookies Only</Typography>
|
|
<Typography variant="body2" color="text.secondary">
|
|
Essential cookies required for basic website functionality. These cannot be disabled.
|
|
</Typography>
|
|
</Box>
|
|
}
|
|
/>
|
|
<FormControlLabel
|
|
value={CONSENT_LEVELS.FUNCTIONAL}
|
|
control={<Radio />}
|
|
label={
|
|
<Box>
|
|
<Typography variant="body1">Functional Cookies</Typography>
|
|
<Typography variant="body2" color="text.secondary">
|
|
Cookies that remember your preferences and enhance website functionality.
|
|
</Typography>
|
|
</Box>
|
|
}
|
|
/>
|
|
<FormControlLabel
|
|
value={CONSENT_LEVELS.ANALYTICS}
|
|
control={<Radio />}
|
|
label={
|
|
<Box>
|
|
<Typography variant="body1">Analytics Cookies</Typography>
|
|
<Typography variant="body2" color="text.secondary">
|
|
Cookies that help us understand how you use our website and improve your experience.
|
|
This includes Microsoft Clarity for analyzing site usage patterns.
|
|
</Typography>
|
|
</Box>
|
|
}
|
|
/>
|
|
<FormControlLabel
|
|
value={CONSENT_LEVELS.ALL}
|
|
control={<Radio />}
|
|
label={
|
|
<Box>
|
|
<Typography variant="body1">All Cookies</Typography>
|
|
<Typography variant="body2" color="text.secondary">
|
|
Accept all cookies including analytics, marketing, and third-party cookies.
|
|
</Typography>
|
|
</Box>
|
|
}
|
|
/>
|
|
</RadioGroup>
|
|
</FormControl>
|
|
|
|
<Divider sx={{ my: 2 }} />
|
|
|
|
<Typography variant="caption" color="text.secondary">
|
|
You can change these settings at any time by clicking on the Cookie Settings link in the footer.
|
|
</Typography>
|
|
</DialogContent>
|
|
<DialogActions>
|
|
<Button onClick={handleNecessaryOnly} color="inherit">Necessary Only</Button>
|
|
<Box sx={{ flexGrow: 1 }} />
|
|
<Button onClick={handleClose}>Cancel</Button>
|
|
<Button onClick={handleSave} variant="contained">Save Preferences</Button>
|
|
<Button onClick={handleAcceptAll} variant="outlined">Accept All</Button>
|
|
</DialogActions>
|
|
</Dialog>
|
|
);
|
|
}
|
|
};
|
|
|
|
export default CookieSettingsButton; |