@performing/cookie-popup-gdpr
Version:
Simple and easy to use cookie popup for GDPR compliance
62 lines (53 loc) • 1.71 kB
text/typescript
import { onMounted, reactive, toRefs } from "vue";
function getCookie(cname: string): string {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(';');
for(let i = 0; i <ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return '{ "isOpen": true, "isCustomize": false, "preferences": {} }';
}
export default function (settings: CookieSettings, onSaveCallback: (preferences: CookiePreferences) => void) {
const state = reactive<CookiePopupState>(JSON.parse(getCookie('cookie-settings')));
onMounted(() => {
Object.keys(settings).forEach(key => {
if (!state.preferences[key]) {
state.preferences[key] = settings[key].default
}
})
if (!state.isOpen) {
onSaveCallback({...state.preferences});
}
})
function rejectAll() {
Object.keys(settings).forEach(key => {
if (settings[key].optional) {
state.preferences[key] = false;
}
});
savePreferences();
}
function acceptAll() {
Object.keys(settings).forEach(key => {
if (settings[key].optional) {
state.preferences[key] = true;
}
});
savePreferences();
}
function savePreferences() {
state.isOpen = false;
state.isCustomize = false;
let cookie = `cookie-settings=${JSON.stringify(state)}; expires=${new Date(new Date().setHours(24)).toUTCString()}; path=/;`;
document.cookie = cookie;
onSaveCallback({...state.preferences});
}
return {...toRefs(state), settings, rejectAll, acceptAll, savePreferences };
}