shimmer 0.0.19 → 0.0.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.vscode/settings.json +1 -0
- data/lib/shimmer/version.rb +1 -1
- data/src/consent.ts +40 -4
- data/src/controllers/analytics.ts +42 -0
- data/src/controllers/consent.ts +3 -2
- data/src/index.ts +10 -5
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8819816445402b9ba5fc3a8ffcd9e273f85b34018cd29d0e0c99b5a338e6c37
|
4
|
+
data.tar.gz: 91786fdab270afb2c5cd89c3874284dd1701263eacbd309043ba35b87ae49ad5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f0abe61b9c8a001df68bfd019cee02d5de58c2c582ab58ed0f6899dcad78409f9136e62cd5892be9dc5167708f19b04df66afbdaccf0f925e5b986f1e9de97b
|
7
|
+
data.tar.gz: 2f8031509918cd09d64dd87158b9b119fc90f3e594c2fbdc068898bdffe29b5687cb7f6161af7d7d98061fe17ad72747388c8a01e2c381f082801d02ace39193
|
data/.vscode/settings.json
CHANGED
data/lib/shimmer/version.rb
CHANGED
data/src/consent.ts
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
import { getCookie, setCookie } from "./util";
|
2
2
|
|
3
|
+
const consentCategories = ["essential", "targeting", "statistic"] as const;
|
4
|
+
export type ConsentCategory = typeof consentCategories[number];
|
5
|
+
|
3
6
|
export class Consent {
|
4
|
-
|
5
|
-
|
7
|
+
#consentListeners: Record<ConsentCategory, Array<() => void>> = {
|
8
|
+
essential: [],
|
9
|
+
targeting: [],
|
10
|
+
statistic: [],
|
11
|
+
};
|
12
|
+
|
13
|
+
get permitted(): ConsentCategory[] {
|
14
|
+
return (getCookie("consent") ?? "").split(",") as ConsentCategory[];
|
6
15
|
}
|
7
16
|
|
8
|
-
set permitted(settings:
|
17
|
+
set permitted(settings: ConsentCategory[]) {
|
9
18
|
setCookie("consent", settings.join(","));
|
19
|
+
settings.forEach((category) => {
|
20
|
+
this.#consentListeners[category].forEach((e) => e());
|
21
|
+
});
|
10
22
|
}
|
11
23
|
|
12
24
|
get given(): boolean {
|
@@ -14,7 +26,7 @@ export class Consent {
|
|
14
26
|
}
|
15
27
|
|
16
28
|
permitAll(): void {
|
17
|
-
this.permitted =
|
29
|
+
this.permitted = consentCategories.slice();
|
18
30
|
}
|
19
31
|
|
20
32
|
denyAll(): void {
|
@@ -25,4 +37,28 @@ export class Consent {
|
|
25
37
|
const element = document.getElementById("personalization-settings");
|
26
38
|
if (element) element.hidden = false;
|
27
39
|
}
|
40
|
+
|
41
|
+
consentFor(category: ConsentCategory): Promise<void> {
|
42
|
+
return new Promise((res) => {
|
43
|
+
if (this.permitted.includes(category)) {
|
44
|
+
res();
|
45
|
+
} else {
|
46
|
+
this.#consentListeners[category].push(res);
|
47
|
+
}
|
48
|
+
});
|
49
|
+
}
|
50
|
+
|
51
|
+
async enableGoogleAnalytics(
|
52
|
+
id: string,
|
53
|
+
role: ConsentCategory = "statistic"
|
54
|
+
): Promise<void> {
|
55
|
+
await this.consentFor(role);
|
56
|
+
window.gtag("config", id);
|
57
|
+
const script = document.createElement("script");
|
58
|
+
script.setAttribute(
|
59
|
+
"src",
|
60
|
+
`https://www.googletagmanager.com/gtag/js?id=${id}`
|
61
|
+
);
|
62
|
+
document.head.appendChild(script);
|
63
|
+
}
|
28
64
|
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import { Controller } from "@hotwired/stimulus";
|
2
|
+
|
3
|
+
interface DataEvent {
|
4
|
+
event: string;
|
5
|
+
}
|
6
|
+
|
7
|
+
declare global {
|
8
|
+
interface Window {
|
9
|
+
dataLayer?: DataEvent[];
|
10
|
+
gtag(...arg): void;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
const dataLayer = (window.dataLayer = window.dataLayer ?? []);
|
15
|
+
|
16
|
+
window.gtag = (...arg) => {
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
18
|
+
dataLayer.push(arg as any);
|
19
|
+
};
|
20
|
+
window.gtag("js", new Date());
|
21
|
+
|
22
|
+
export default class extends Controller {
|
23
|
+
connect(): void {
|
24
|
+
this.recordPage();
|
25
|
+
}
|
26
|
+
|
27
|
+
recordAction(event: MouseEvent): void {
|
28
|
+
const data = JSON.parse(
|
29
|
+
(event.target as HTMLElement).dataset.analytics ?? "{}"
|
30
|
+
);
|
31
|
+
dataLayer.push(data);
|
32
|
+
}
|
33
|
+
|
34
|
+
recordPage(): void {
|
35
|
+
const event = {
|
36
|
+
event: "Pageview",
|
37
|
+
path: location.pathname + location.search,
|
38
|
+
host: location.host,
|
39
|
+
};
|
40
|
+
dataLayer.push(event);
|
41
|
+
}
|
42
|
+
}
|
data/src/controllers/consent.ts
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import { Controller } from "@hotwired/stimulus";
|
2
|
+
import { ConsentCategory } from "../consent";
|
2
3
|
|
3
4
|
export default class extends Controller {
|
4
5
|
static targets = ["check"];
|
@@ -7,7 +8,7 @@ export default class extends Controller {
|
|
7
8
|
connect(): void {
|
8
9
|
this.checkTargets.forEach((input) => {
|
9
10
|
input.checked =
|
10
|
-
window.ui?.consent.permitted.includes(input.name) ||
|
11
|
+
window.ui?.consent.permitted.includes(input.name as ConsentCategory) ||
|
11
12
|
input.name === "essential";
|
12
13
|
});
|
13
14
|
}
|
@@ -29,7 +30,7 @@ export default class extends Controller {
|
|
29
30
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
30
31
|
window.ui!.consent.permitted = this.checkTargets
|
31
32
|
.filter((e) => e.checked)
|
32
|
-
.map((e) => e.name);
|
33
|
+
.map((e) => e.name) as ConsentCategory[];
|
33
34
|
this.closeAll();
|
34
35
|
}
|
35
36
|
|
data/src/index.ts
CHANGED
@@ -4,6 +4,7 @@ import { PopoverPresenter } from "./popover";
|
|
4
4
|
import { Consent } from "./consent";
|
5
5
|
import RemoteNavigationController from "./controllers/remote-navigation";
|
6
6
|
import ConsentController from "./controllers/consent";
|
7
|
+
import AnalyticsController from "./controllers/analytics";
|
7
8
|
import "./touch";
|
8
9
|
|
9
10
|
export { registerServiceWorker } from "./serviceworker";
|
@@ -19,6 +20,12 @@ declare global {
|
|
19
20
|
}
|
20
21
|
}
|
21
22
|
|
23
|
+
window.ui = {
|
24
|
+
modal: new ModalPresenter(),
|
25
|
+
popover: new PopoverPresenter(),
|
26
|
+
consent: new Consent(),
|
27
|
+
};
|
28
|
+
|
22
29
|
function createRemoteDestination(): void {
|
23
30
|
if (document.getElementById("shimmer")) {
|
24
31
|
return;
|
@@ -37,9 +44,7 @@ export async function start({
|
|
37
44
|
createRemoteDestination();
|
38
45
|
application.register("remote-navigation", RemoteNavigationController);
|
39
46
|
application.register("consent", ConsentController);
|
40
|
-
|
41
|
-
modal: new ModalPresenter(),
|
42
|
-
popover: new PopoverPresenter(),
|
43
|
-
consent: new Consent(),
|
44
|
-
};
|
47
|
+
application.register("analytics", AnalyticsController);
|
45
48
|
}
|
49
|
+
|
50
|
+
export const ui = window.ui;
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shimmer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jens Ravens
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-07-
|
11
|
+
date: 2022-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -165,6 +165,7 @@ files:
|
|
165
165
|
- package.json
|
166
166
|
- rollup.config.js
|
167
167
|
- src/consent.ts
|
168
|
+
- src/controllers/analytics.ts
|
168
169
|
- src/controllers/consent.ts
|
169
170
|
- src/controllers/remote-navigation.ts
|
170
171
|
- src/index.ts
|