Files
habitica/website/client/src/components/header/banners/privacy.vue
T
2025-08-29 15:46:28 -05:00

127 lines
2.7 KiB
Vue

<template>
<div
class="banner d-flex align-items-center justify-content-between py-3 px-4"
id="privacy-banner"
v-if="!hidden"
>
<p
class="mr-3 mb-0"
v-html="$t('privacyOverview') + ' ' + $t('learnMorePrivacy')"
>
</p>
<div
class="navigation d-flex flex-column justify-content-around text-center ml-2"
:class="{ static: isStaticPage }"
>
<button
class="btn btn-primary mb-2"
@click="consent(true)"
>
{{ $t('acceptAllCookies') }}
</button>
<button
class="btn btn-secondary mb-2"
@click="consent(false)"
>
{{ $t('denyNonEssentialCookies') }}
</button>
<a
v-if="isStaticPage"
@click="showPrivacyModal"
>
{{ $t('managePrivacyPreferences') }}
</a>
<router-link
v-else
to="/user/settings/siteData"
>
{{ $t('managePrivacyPreferences') }}
</router-link>
</div>
</div>
</template>
<style lang="scss" scoped>
button {
width: 558px;
}
a, p {
line-height: 1.714;
}
@media only screen and (max-width: 1300px) {
.banner {
flex-direction: column !important;
button {
width: 100%;
}
.navigation {
width: 100%;
margin-left: 0px !important;
}
p {
margin-bottom: 16px !important;
}
}
}
</style>
<script>
import { nextTick } from 'vue';
import { GenericUserPreferencesMixin } from '@/pages/settings/components/genericUserPreferencesMixin';
import { EVENTS } from '@/libs/events';
import { mapState } from '@/libs/store';
export default {
mixins: [GenericUserPreferencesMixin],
computed: {
isStaticPage () {
return this.$route.meta.requiresLogin === false;
},
...mapState({
user: 'user.data',
}),
},
data () {
return {
hidden: false,
};
},
mounted () {
if (localStorage.getItem('analyticsConsent') !== null
|| this.user?.preferences?.analyticsConsent !== undefined
|| navigator.globalPrivacyControl
) {
this.hidden = true;
}
this.$root.$on('privacy-complete', () => {
this.close();
});
},
methods: {
close () {
this.hidden = true;
nextTick(() => {
this.$root.$emit(EVENTS.BANNER_HEIGHT_UPDATED);
});
},
consent (decision) {
if (this.user) {
this.user.preferences.analyticsConsent = decision;
this.setUserPreference('analyticsConsent');
} else {
localStorage.setItem('analyticsConsent', decision);
}
this.close();
},
showPrivacyModal () {
this.$root.$emit('bv::show::modal', 'privacy-preferences');
},
},
};
</script>