feeds-fun 1.18.2 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feeds-fun",
3
- "version": "1.18.2",
3
+ "version": "1.19.0",
4
4
  "author": "Aliaksei Yaletski (Tiendil) <a.eletsky@gmail.com> (https://tiendil.org/)",
5
5
  "description": "Frontend for the Feeds Fun — web-based news reader",
6
6
  "keywords": [
@@ -33,6 +33,7 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@chenfengyuan/vue-countdown": "^2.1.2",
36
+ "@tabler/icons-vue": "^3.31.0",
36
37
  "@vueuse/core": "^11.2.0",
37
38
  "axios": "^1.7.7",
38
39
  "dompurify": "^3.1.7",
@@ -40,6 +41,7 @@
40
41
  "pinia": "^2.2.6",
41
42
  "set-interval-async": "^3.0.3",
42
43
  "supertokens-web-js": "^0.5.0",
44
+ "vanilla-cookieconsent": "^3.1.0",
43
45
  "vue": "^3.5.12",
44
46
  "vue-router": "^4.4.5"
45
47
  },
@@ -8,14 +8,18 @@
8
8
  href="#"
9
9
  @click.prevent="markUnread()"
10
10
  title="Mark as unread"
11
- class="text-green-700 ti ti-chevrons-left" />
11
+ class="text-green-700">
12
+ <icon icon="chevrons-left" />
13
+ </a>
12
14
 
13
15
  <a
14
16
  v-else
15
17
  href="#"
16
18
  @click.prevent="markRead()"
17
19
  title="Mark as read"
18
- class="text-orange-700 ti ti-chevrons-right" />
20
+ class="text-orange-700">
21
+ <icon icon="chevrons-right" />
22
+ </a>
19
23
  </div>
20
24
 
21
25
  <div
@@ -5,9 +5,10 @@
5
5
  <div class="ffun-body-list-icon-column">
6
6
  <a
7
7
  href="#"
8
- class="ti ti-x text-red-500 hover:text-red-600"
8
+ class="text-red-500 hover:text-red-600"
9
9
  title="Unsubscribe"
10
10
  @click.prevent="feedsStore.unsubscribe(feed.id)">
11
+ <icon icon="x" />
11
12
  </a>
12
13
  </div>
13
14
 
@@ -20,14 +21,16 @@
20
21
  :time="feed.linkedAt" />
21
22
 
22
23
  <div class="ffun-body-list-icon-column ml-3">
23
- <i
24
+ <icon
24
25
  v-if="feed.isOk"
25
26
  title="everything is ok"
26
- class="text-green-700 ti ti-mood-smile"></i>
27
- <i
27
+ icon="face-smile"
28
+ class="text-green-700" />
29
+ <icon
28
30
  v-else
29
31
  :title="feed.lastError || 'unknown error'"
30
- class="text-red-700 ti ti-mood-sad align-middle"></i>
32
+ icon="face-sad"
33
+ class="text-red-700" />
31
34
  </div>
32
35
 
33
36
  <body-list-favicon-column :url="feed.url" />
@@ -3,12 +3,13 @@
3
3
  <div
4
4
  v-if="rule !== null"
5
5
  class="flex mb-1">
6
- <div class="ffun-body-list-icon-column">
6
+ <div class="ffun-body-list-icon-column flex items-center">
7
7
  <a
8
8
  href="#"
9
- class="ti ti-x text-red-500 hover:text-red-600"
9
+ class="text-red-500 hover:text-red-600 flex items-center"
10
10
  title="Remove this rule"
11
11
  @click.prevent="deleteRule()">
12
+ <icon icon="x" />
12
13
  </a>
13
14
  </div>
14
15
 
@@ -1,22 +1,28 @@
1
1
  <template>
2
2
  <div class="flex text-lg">
3
- <div class="ffun-body-list-icon-column">
3
+ <div class="ffun-body-list-icon-column flex items-center justify-center">
4
4
  <a
5
5
  v-if="subscribed"
6
6
  href="#"
7
7
  @click.prevent="feedsStore.unsubscribe(feed.id)"
8
8
  title="Unsubscribe from this feed"
9
- class="text-red-500 hover:text-red-600 ti ti-x" />
9
+ class="text-red-500 hover:text-red-600 flex items-center justify-center">
10
+ <icon icon="x" />
11
+ </a>
10
12
 
11
13
  <a
12
14
  v-else
13
15
  href="#"
14
16
  @click.prevent="feedsStore.subscribe(feed.url)"
15
17
  title="Subscribe to this feed"
16
- class="text-green-600 hover:text-green-700 ti ti-plus" />
18
+ class="text-green-600 hover:text-green-700 flex items-center justify-center">
19
+ <icon icon="plus" />
20
+ </a>
17
21
  </div>
18
22
 
19
- <body-list-favicon-column :url="feed.url" />
23
+ <body-list-favicon-column
24
+ :url="feed.url"
25
+ class="flex items-center justify-center" />
20
26
 
21
27
  <div class="flex-grow">
22
28
  <external-url
@@ -1,15 +1,15 @@
1
1
  <template>
2
2
  <!-- PC -->
3
3
  <div class="hidden md:flex items-stretch rounded-xl overflow-hidden min-h-28 max-h-28 mx-2">
4
- <div class="w-12 bg-blue-200 flex items-center justify-center text-4xl font-bold">
5
- <i :class="['ti', icon]"></i>
4
+ <div class="w-12 bg-blue-200 flex items-center justify-center text-4xl font-medium">
5
+ {{ step }}
6
6
  </div>
7
7
 
8
8
  <div class="w-1/3 bg-blue-100 px-4 flex items-center text-xl font-medium">
9
9
  <slot name="caption" />
10
10
  </div>
11
11
 
12
- <div class="flex-1 bg-slate-100 p-6 text-gray-800 flex items-center">
12
+ <div class="flex-1 bg-slate-100 p-4 text-gray-800 flex items-center">
13
13
  <div class="w-full">
14
14
  <slot name="description" />
15
15
  </div>
@@ -19,8 +19,8 @@
19
19
  <!-- Mobile -->
20
20
  <div class="flex flex-col md:hidden flex items-stretch rounded-xl overflow-hidden min-h-28 max-h-28 mx-2">
21
21
  <div class="w-full flex">
22
- <div class="w-12 bg-blue-200 flex items-center justify-center text-lg font-bold">
23
- <i :class="['ti', icon]"></i>
22
+ <div class="w-12 bg-blue-200 flex items-center justify-center text-lg font-medium">
23
+ {{ step }}
24
24
  </div>
25
25
 
26
26
  <div class="flex-grow bg-blue-100 px-4 flex justify-center text-lg font-medium">
@@ -28,7 +28,7 @@
28
28
  </div>
29
29
  </div>
30
30
 
31
- <div class="flex-1 bg-slate-100 px-4 text-gray-800 flex items-center">
31
+ <div class="flex-1 bg-slate-100 px-2 text-gray-800 flex items-center">
32
32
  <div class="w-full">
33
33
  <slot name="description" />
34
34
  </div>
@@ -46,6 +46,6 @@
46
46
  import * as events from "@/logic/events";
47
47
 
48
48
  const properties = defineProps<{
49
- icon: string;
49
+ step: string;
50
50
  }>();
51
51
  </script>
@@ -21,7 +21,5 @@
21
21
  import * as asserts from "@/logic/asserts";
22
22
  import * as events from "@/logic/events";
23
23
 
24
- const properties = defineProps<{
25
- icon: string;
26
- }>();
24
+ const properties = defineProps<{}>();
27
25
  </script>
@@ -2,7 +2,7 @@
2
2
  <span class="block text-base md:text-lg">
3
3
  <span
4
4
  v-if="score"
5
- class="cursor-pointer text-purple-700 inline-block w-12"
5
+ class="cursor-default text-purple-700 inline-block w-12"
6
6
  >{{ score }}</span
7
7
  >
8
8
 
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <footer class="border-t border-gray-200">
3
+ <div class="mx-auto max-w-max px-4 py-2 grid grid-cols-2 sm:grid-cols-4 gap-8">
4
+ <div class="flex flex-col col-span-2 items-center sm:items-start">
5
+ <h3 class="text-lg font-semibold mb-4">Feeds Fun</h3>
6
+ <div class="flex flex-col space-y-2">
7
+ <div class="font-medium"> The project is in demo mode and free of charge </div>
8
+
9
+ <div>
10
+ © 2023‑{{ year }} Aliaksei Yaletski (<external-url
11
+ url="https://github.com/Tiendil"
12
+ text="Tiendil"
13
+ class="ffun-normal-link" />) and Feeds Fun contributors
14
+ </div>
15
+
16
+ <div>
17
+ Site uses
18
+ <external-url
19
+ url="https://github.com/tabler/tabler-icons"
20
+ text="Tabler Icons"
21
+ class="ffun-normal-link" />, licensed under the
22
+ <external-url
23
+ url="https://github.com/tabler/tabler-icons/blob/main/LICENSE"
24
+ text="MIT License"
25
+ class="ffun-normal-link" />
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+ <div class="flex flex-col items-center sm:items-start max-w-28">
31
+ <h3 class="text-lg font-semibold mb-4">Community</h3>
32
+ <div class="flex flex-col space-y-2">
33
+ <social-link
34
+ kind="blog"
35
+ mode="text"
36
+ class="hover:underline ffun-normal-link" />
37
+ <social-link
38
+ kind="reddit"
39
+ mode="text"
40
+ class="hover:underline ffun-normal-link" />
41
+ <social-link
42
+ kind="discord"
43
+ mode="text"
44
+ class="hover:underline ffun-normal-link" />
45
+ <social-link
46
+ kind="github"
47
+ mode="text"
48
+ class="hover:underline ffun-normal-link" />
49
+ </div>
50
+ </div>
51
+
52
+ <div class="flex flex-col items-center sm:items-start">
53
+ <h3 class="text-lg font-semibold mb-4">For Users</h3>
54
+
55
+ <div class="flex flex-col space-y-2">
56
+ <div>You can ask for help on Discord, Reddit, or GitHub</div>
57
+
58
+ <a
59
+ v-if="settings.crmTerms"
60
+ :href="router.resolve({name: 'terms'}).href"
61
+ class="ffun-normal-link"
62
+ @click.prevent="router.push({name: 'terms'})">
63
+ Terms of Service
64
+ </a>
65
+
66
+ <a
67
+ v-if="settings.crmPrivacy"
68
+ :href="router.resolve({name: 'privacy'}).href"
69
+ class="ffun-normal-link"
70
+ @click.prevent="router.push({name: 'privacy'})">
71
+ Privacy Policy
72
+ </a>
73
+
74
+ <a
75
+ v-if="!settings.isSingleUserMode"
76
+ href="#"
77
+ class="ffun-normal-link"
78
+ @click.prevent="cookieConsent.showCookieConsent()">
79
+ Cookie Settings
80
+ </a>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </footer>
85
+ </template>
86
+
87
+ <script lang="ts" setup>
88
+ import {inject, computed} from "vue";
89
+ import {useRouter} from "vue-router";
90
+
91
+ import * as events from "@/logic/events";
92
+ import * as settings from "@/logic/settings";
93
+ import * as asserts from "@/logic/asserts";
94
+ import * as cookieConsent from "@/plugins/CookieConsent";
95
+
96
+ const router = useRouter();
97
+
98
+ const eventsView = inject<events.EventsViewName>("eventsViewName");
99
+
100
+ asserts.defined(eventsView);
101
+
102
+ const year = computed(() => {
103
+ const date = new Date();
104
+ return date.getFullYear();
105
+ });
106
+ </script>
@@ -1,51 +1,29 @@
1
1
  <template>
2
- <a
2
+ <social-link
3
3
  v-if="showApi"
4
- href="/api/docs"
5
- target="_blank"
6
- class="ffun-page-header-link"
7
- @click="events.socialLinkClicked({linkType: 'api', view: eventsView})"
8
- >API</a
9
- >
10
-
11
- <a
12
- v-if="settings.blog"
13
- :href="settings.blog"
14
- target="_blank"
15
- class="ffun-page-header-link"
16
- @click="events.socialLinkClicked({linkType: 'blog', view: eventsView})"
17
- >Blog</a
18
- >
19
-
20
- <a
21
- v-if="settings.redditSubreddit"
22
- :href="settings.redditSubreddit"
23
- target="_blank"
24
- class="ffun-page-header-link text-xl align-middle"
25
- title="Reddit"
26
- @click="events.socialLinkClicked({linkType: 'reddit', view: eventsView})"
27
- ><i class="ti ti-brand-reddit"></i
28
- ></a>
29
-
30
- <a
31
- v-if="settings.discordInvite"
32
- :href="settings.discordInvite"
33
- target="_blank"
34
- class="ffun-page-header-link text-xl align-middle"
35
- title="Discord"
36
- @click="events.socialLinkClicked({linkType: 'discord', view: eventsView})"
37
- ><i class="ti ti-brand-discord"></i
38
- ></a>
39
-
40
- <a
41
- v-if="settings.githubRepo"
42
- :href="settings.githubRepo"
43
- target="_blank"
44
- class="ffun-page-header-link text-xl align-middle"
45
- title="GitHub"
46
- @click="events.socialLinkClicked({linkType: 'github', view: eventsView})">
47
- <i class="ti ti-brand-github"></i
48
- ></a>
4
+ kind="api"
5
+ mode="text"
6
+ class="ffun-page-header-link" />
7
+
8
+ <social-link
9
+ kind="blog"
10
+ mode="text"
11
+ class="ffun-page-header-link" />
12
+
13
+ <social-link
14
+ kind="reddit"
15
+ mode="icon"
16
+ class="ffun-page-header-link py-2 flex items-center justify-center" />
17
+
18
+ <social-link
19
+ kind="discord"
20
+ mode="icon"
21
+ class="ffun-page-header-link py-2 flex items-center justify-center" />
22
+
23
+ <social-link
24
+ kind="github"
25
+ mode="icon"
26
+ class="ffun-page-header-link py-2 flex items-center justify-center" />
49
27
  </template>
50
28
 
51
29
  <script lang="ts" setup>
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <a
3
+ :href="router.resolve({name: 'main'}).href"
4
+ class="ffun-page-header-link"
5
+ @click.prevent="router.push({name: 'main'})">
6
+ Home</a
7
+ >
8
+ </template>
9
+
10
+ <script lang="ts" setup>
11
+ import {useRouter} from "vue-router";
12
+
13
+ const router = useRouter();
14
+ </script>
@@ -1,15 +1,17 @@
1
1
  <template>
2
2
  <a
3
3
  href="#"
4
- class="ffun-page-header-link text-2xl align-middle flex-none pb-0 relative"
4
+ class="ffun-page-header-link py-2 flex items-center justify-center"
5
5
  :title="title"
6
6
  @click.prevent="onClick">
7
- <i
7
+ <icon
8
8
  v-if="globalSettings.showSidebar"
9
- class="ti ti-layout-sidebar-left-collapse"></i>
10
- <i
9
+ icon="sidebar-left-collapse"
10
+ size="large" />
11
+ <icon
11
12
  v-else
12
- class="ti ti-layout-sidebar-left-expand"></i>
13
+ icon="sidebar-left-expand"
14
+ size="large" />
13
15
 
14
16
  <span
15
17
  v-if="showPoint"
@@ -8,7 +8,9 @@
8
8
  target="_blank"
9
9
  @click.stop=""
10
10
  rel="noopener noreferrer">
11
- <i class="ti ti-external-link align-middle" />
11
+ <icon
12
+ icon="external-link"
13
+ size="small" />
12
14
  </a>
13
15
  </span>
14
16
  </template>
@@ -20,14 +20,18 @@
20
20
  }
21
21
 
22
22
  .ffun-page-header-link {
23
- @apply cursor-pointer no-underline ffun-x-header-text;
23
+ @apply cursor-pointer no-underline ffun-x-header-text whitespace-nowrap;
24
24
  @apply underline-offset-4 hover:bg-blue-100 rounded;
25
25
  }
26
26
 
27
- .ffun-page-header-link-disabled {
27
+ .ffun-page-header-link-active {
28
28
  @apply underline underline-offset-4 ffun-x-header-text;
29
29
  }
30
30
 
31
+ .ffun-page-header-link-disabled {
32
+ @apply ffun-x-header-text text-slate-400;
33
+ }
34
+
31
35
  .ffun-page-header-title {
32
36
  @apply font-semibold ffun-x-header-text;
33
37
  }
@@ -33,6 +33,6 @@
33
33
  }
34
34
 
35
35
  .ffun-body-list-icon-column {
36
- @apply flex-shrink-0 mr-2 text-center cursor-default text-2xl;
36
+ @apply flex-shrink-0 mr-2 cursor-default;
37
37
  }
38
38
  }
@@ -55,12 +55,7 @@
55
55
  <div class="ffun-page-header-left-block">
56
56
  <side-panel-collapse-button v-if="!globalSettings.showSidebar" />
57
57
 
58
- <a
59
- v-if="homeButton"
60
- :href="router.resolve({name: 'main', params: {}}).href"
61
- class="ffun-page-header-link"
62
- >Home</a
63
- >
58
+ <page-header-home-button v-if="homeButton" />
64
59
 
65
60
  <template v-if="globalState.isLoggedIn">
66
61
  <template
@@ -76,7 +71,7 @@
76
71
  </a>
77
72
 
78
73
  <span
79
- class="ffun-page-header-link-disabled"
74
+ class="ffun-page-header-link-active"
80
75
  v-else
81
76
  >{{ props.text }}</span
82
77
  >
@@ -89,12 +84,19 @@
89
84
 
90
85
  <div class="ffun-page-header-right-block">
91
86
  <a
92
- v-if="globalState.isLoggedIn"
87
+ v-if="globalState.isLoggedIn && !settings.isSingleUserMode"
93
88
  href="#"
94
89
  class="ffun-page-header-link"
95
90
  @click.prevent="logout()"
96
91
  >logout</a
97
92
  >
93
+
94
+ <span
95
+ v-if="settings.isSingleUserMode"
96
+ href="#"
97
+ class="ffun-page-header-link-disabled"
98
+ >single-user mode</span
99
+ >
98
100
  </div>
99
101
  </div>
100
102
 
@@ -109,11 +111,13 @@
109
111
  </footer>
110
112
  </div>
111
113
  </div>
114
+
115
+ <page-footer />
112
116
  </template>
113
117
 
114
118
  <script lang="ts" setup>
115
119
  import {ref, computed, useSlots, onMounted, watch, watchEffect} from "vue";
116
- import {useRouter, RouterLink, RouterView} from "vue-router";
120
+ import {useRouter} from "vue-router";
117
121
  import {useGlobalSettingsStore} from "@/stores/globalSettings";
118
122
  import {useGlobalState} from "@/stores/globalState";
119
123
  import {useSupertokens} from "@/stores/supertokens";
@@ -1,5 +1,7 @@
1
1
  <template>
2
2
  <slot></slot>
3
+
4
+ <page-footer />
3
5
  </template>
4
6
 
5
7
  <script lang="ts" setup></script>
package/src/logic/api.ts CHANGED
@@ -3,6 +3,7 @@ import axios, {AxiosError} from "axios";
3
3
  import * as t from "@/logic/types";
4
4
  import type * as e from "@/logic/enums";
5
5
  import * as settings from "@/logic/settings";
6
+ import * as cookieConsent from "@/plugins/CookieConsent";
6
7
 
7
8
  const ENTRY_POINT = "/api";
8
9
 
@@ -31,6 +32,7 @@ const API_SET_USER_SETTING = `${ENTRY_POINT}/set-user-setting`;
31
32
  const API_GET_RESOURCE_HISTORY = `${ENTRY_POINT}/get-resource-history`;
32
33
  const API_GET_INFO = `${ENTRY_POINT}/get-info`;
33
34
  const API_TRACK_EVENT = `${ENTRY_POINT}/track-event`;
35
+ const API_REMOVE_USER = `${ENTRY_POINT}/remove-user`;
34
36
 
35
37
  let _onSessionLost: () => void = () => {};
36
38
 
@@ -336,5 +338,13 @@ export async function trackEvent(data: {[key: string]: string | number | null})
336
338
  return;
337
339
  }
338
340
 
341
+ if (!cookieConsent.isAnalyticsAllowed()) {
342
+ return;
343
+ }
344
+
339
345
  await post({url: API_TRACK_EVENT, data: {event: data}});
340
346
  }
347
+
348
+ export async function removeUser() {
349
+ await post({url: API_REMOVE_USER, data: {}});
350
+ }
@@ -26,6 +26,9 @@ export const trackEvents = import.meta.env.VITE_FFUN_TRACK_EVENTS == "true" || f
26
26
 
27
27
  export const utmLifetime = import.meta.env.VITE_FFUN_UTM_LIFETIME || 7; // days
28
28
 
29
+ export const crmTerms = import.meta.env.VITE_FFUN_CRM_TERMS || null;
30
+ export const crmPrivacy = import.meta.env.VITE_FFUN_CRM_PRIVACY || null;
31
+
29
32
  console.log("settings.appName", appName);
30
33
  console.log("settings.appDomain", appDomain);
31
34
  console.log("settings.appPort", appPort);
@@ -48,3 +51,8 @@ console.log("settings.plausibleScript", plausibleScript);
48
51
  console.log("settings.trackEvents", trackEvents);
49
52
 
50
53
  console.log("settings.utmLifetime", utmLifetime);
54
+
55
+ console.log("settings.crmTerms", crmTerms ? "set" : "not set");
56
+ console.log("settings.crmPrivacy", crmPrivacy ? "set" : "not set");
57
+
58
+ export const isSingleUserMode = authMode === AuthMode.SingleUser;
package/src/main.ts CHANGED
@@ -6,6 +6,8 @@ import router from "./router";
6
6
 
7
7
  import "./style.css";
8
8
 
9
+ import * as CookieConsent from "./plugins/CookieConsent";
10
+
9
11
  import FeedsList from "./components/FeedsList.vue";
10
12
  import EntriesList from "./components/EntriesList.vue";
11
13
  import RulesList from "./components/RulesList.vue";
@@ -33,7 +35,9 @@ import TagsFilter from "./components/tags/TagsFilter.vue";
33
35
  import RuleTag from "./components/tags/RuleTag.vue";
34
36
  import FakeTag from "./components/tags/FakeTag.vue";
35
37
 
38
+ import PageHeaderHomeButton from "./components/page_header/HomeButton.vue";
36
39
  import PageHeaderExternalLinks from "./components/page_header/ExternalLinks.vue";
40
+ import PageFooter from "./components/page_footer/Footer.vue";
37
41
 
38
42
  import NotificationsApiKey from "./components/notifications/ApiKey.vue";
39
43
  import NotificationsCreateRuleHelp from "./components/notifications/CreateRuleHelp.vue";
@@ -56,6 +60,8 @@ import ExternalUrl from "./values/ExternalUrl.vue";
56
60
  import ValueFeedId from "./values/FeedId.vue";
57
61
  import ValueDateTime from "./values/DateTime.vue";
58
62
  import ValueScore from "./values/Score.vue";
63
+ import Icon from "./values/Icon.vue";
64
+ import SocialLink from "./values/SocialLink.vue";
59
65
 
60
66
  import BodyListReverseTimeColumn from "./components/body_list/ReverseTimeColumn.vue";
61
67
  import BodyListFaviconColumn from "./components/body_list/FaviconColumn.vue";
@@ -105,7 +111,9 @@ app.component("TagsFilter", TagsFilter);
105
111
  app.component("RuleTag", RuleTag);
106
112
  app.component("FakeTag", FakeTag);
107
113
 
114
+ app.component("PageHeaderHomeButton", PageHeaderHomeButton);
108
115
  app.component("PageHeaderExternalLinks", PageHeaderExternalLinks);
116
+ app.component("PageFooter", PageFooter);
109
117
 
110
118
  app.component("NotificationsApiKey", NotificationsApiKey);
111
119
  app.component("NotificationsCreateRuleHelp", NotificationsCreateRuleHelp);
@@ -128,6 +136,8 @@ app.component("ExternalUrl", ExternalUrl);
128
136
  app.component("ValueFeedId", ValueFeedId);
129
137
  app.component("ValueDateTime", ValueDateTime);
130
138
  app.component("ValueScore", ValueScore);
139
+ app.component("Icon", Icon);
140
+ app.component("SocialLink", SocialLink);
131
141
 
132
142
  app.component("BodyListReverseTimeColumn", BodyListReverseTimeColumn);
133
143
  app.component("BodyListFaviconColumn", BodyListFaviconColumn);
@@ -149,6 +159,10 @@ app.component("vue-countdown", VueCountdown);
149
159
  app.use(createPinia());
150
160
  app.use(router);
151
161
 
162
+ if (!settings.isSingleUserMode) {
163
+ app.use(CookieConsent.plugin, CookieConsent.defaultConfig);
164
+ }
165
+
152
166
  app.mount("#app");
153
167
 
154
168
  import * as api from "@/logic/api";
@@ -196,16 +210,3 @@ async function onSessionLost() {
196
210
  }
197
211
 
198
212
  api.init({onSessionLost: onSessionLost});
199
-
200
- /////////////////////
201
- // plausible
202
- /////////////////////
203
-
204
- if (settings.plausibleEnabled) {
205
- const script = document.createElement("script");
206
- script.src = settings.plausibleScript;
207
- script.async = true;
208
- script.defer = true;
209
- script.setAttribute("data-domain", settings.plausibleDomain);
210
- document.body.appendChild(script);
211
- }