Skip to content

Commit 5a73c54

Browse files
Dismiss persistent toast (forever) upon clicking "Dismiss" (#2832)
1 parent 3777c06 commit 5a73c54

3 files changed

Lines changed: 79 additions & 2 deletions

File tree

app/assets/javascripts/application.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
//= require fastclick
2121
//= require readmore
2222
//= require extended_description
23+
//= require persistent-toast
2324

2425
$(function() {
2526
hljs.initHighlightingOnLoad();
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
Upcase.PersistentToast = class {
2+
static dismissedIdsLocalStorageKey = "persistent_toasts-dismissed_ids";
3+
4+
static get all() {
5+
return [...document.getElementsByClassName("persistent-toast")]
6+
.map(element => new this(element));
7+
}
8+
9+
static get dismissedIds() {
10+
return new Set(
11+
JSON.parse(
12+
localStorage.getItem(this.dismissedIdsLocalStorageKey)
13+
)
14+
);
15+
}
16+
17+
static set dismissedIds(value) {
18+
localStorage.setItem(
19+
this.dismissedIdsLocalStorageKey,
20+
JSON.stringify(
21+
Array.from(value)
22+
)
23+
);
24+
}
25+
26+
static addDismissedId(value) {
27+
if (!this.dismissedIds.has(value)) {
28+
this.dismissedIds = this.dismissedIds.add(value);
29+
}
30+
}
31+
32+
static initializeAll() {
33+
this.all.forEach((persistentToast) => {
34+
persistentToast.initialize();
35+
});
36+
}
37+
38+
constructor(element) {
39+
this.element = element;
40+
this.id = element.id;
41+
}
42+
43+
get dismissButtonElements() {
44+
return this.element.getElementsByClassName("toast-button-dismiss");
45+
}
46+
47+
initialize() {
48+
if (this.isDismissed()) {
49+
this.remove();
50+
return;
51+
}
52+
53+
[...this.dismissButtonElements].forEach((dismissButtonElement) => {
54+
dismissButtonElement.addEventListener("click", () => {
55+
this.dismiss();
56+
});
57+
})
58+
}
59+
60+
isDismissed() {
61+
return this.constructor.dismissedIds.has(this.id);
62+
}
63+
64+
dismiss() {
65+
this.remove();
66+
this.constructor.addDismissedId(this.id);
67+
}
68+
69+
remove() {
70+
this.element.remove();
71+
}
72+
};
73+
74+
window.addEventListener("DOMContentLoaded", () => {
75+
Upcase.PersistentToast.initializeAll();
76+
});

app/views/shared/_persistent_toast.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<% if ActiveModel::Type::Boolean.new.serialize(ENV["ENABLE_MARKETING_REDESIGN"]) %>
2-
<div class="persistent-toast">
2+
<div class="persistent-toast" id="persistent-toast-upcase_for_teams">
33
<div class="icon-container">
44
<%= inline_svg_tag "icons/info.svg" %>
55
</div>
@@ -11,7 +11,7 @@
1111
<%= t(".cta_go")%>
1212
<%= inline_svg_tag "icons/arrow-right.svg" %>
1313
<% end %>
14-
<button class="toast-button">
14+
<button class="toast-button toast-button-dismiss">
1515
<%= t(".cta_dismiss")%>
1616
</button>
1717
</div>

0 commit comments

Comments
 (0)