|
|
| (6 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| /* ICE List – Donate notice controller
| |
| * - Shows a big top notice for anonymous users
| |
| * - Dismissible with X
| |
| * - Remembers dismissal for N days via localStorage
| |
| * - Replaces whatever is in #siteNotice (including plain Anonnotice text)
| |
| */
| |
|
| |
| (function () { | | (function () { |
| 'use strict'; | | 'use strict'; |
|
| |
|
| // === CONFIG ===
| | var KEY = 'icelist_anon_donate_dismiss_until'; |
| var KEY = 'icelist_donate_notice_until'; | |
| var DAYS = 14; | | var DAYS = 14; |
|
| |
|
| // Show only to anonymous users
| |
| if (!mw.user.isAnon()) return; | | if (!mw.user.isAnon()) return; |
|
| |
|
| // Respect dismissal window
| |
| var until = parseInt(localStorage.getItem(KEY) || '0', 10); | | var until = parseInt(localStorage.getItem(KEY) || '0', 10); |
| if (Date.now() < until) return; | | if (Date.now() < until) return; |
| Line 24: |
Line 14: |
| if (!siteNotice) return; | | if (!siteNotice) return; |
|
| |
|
| // If there is literally no notice area text/content, still allow injection. | | // If empty, do nothing |
| // (Some skins may render an empty wrapper; that’s fine.) | | var txt = (siteNotice.textContent || '').replace(/\s+/g, ' ').trim(); |
| | if (!txt) return; |
|
| |
|
| // Build the banner as real DOM/HTML (NOT escaped entities)
| | siteNotice.classList.add('icelist-anon-donate'); |
| siteNotice.innerHTML = | |
| '<div id="donate-top-notice">' +
| |
| '<div class="donate-notice-inner">' +
| |
| '<span class="donate-title">Support ICE List</span>' +
| |
| '<span class="donate-text">We document federal immigration enforcement, identify agents, and preserve evidence that would otherwise disappear. Donations keep this work public, independent, and alive.</span>' +
| |
| '<a class="donate-btn" href="' + mw.util.getUrl('ICE_List_Wiki:Donate') + '">Donate</a>' +
| |
| '<button id="donate-notice-close" aria-label="Close" type="button">×</button>' +
| |
| '</div>' +
| |
| '</div>';
| |
|
| |
|
| var closeBtn = document.getElementById('donate-notice-close'); | | // Add close button once |
| if (!closeBtn) return;
| | if (!siteNotice.querySelector('.icelist-notice-close')) { |
| | var btn = document.createElement('button'); |
| | btn.type = 'button'; |
| | btn.className = 'icelist-notice-close'; |
| | btn.setAttribute('aria-label', 'Close'); |
| | btn.textContent = '×'; |
| | siteNotice.insertBefore(btn, siteNotice.firstChild); |
|
| |
|
| closeBtn.addEventListener('click', function () {
| | btn.addEventListener('click', function (e) { |
| var wrap = document.getElementById('donate-top-notice');
| | e.preventDefault(); |
| if (wrap) wrap.style.display = 'none';
| | siteNotice.style.display = 'none'; |
| localStorage.setItem(KEY, String(Date.now() + DAYS * 24 * 60 * 60 * 1000));
| | localStorage.setItem(KEY, String(Date.now() + DAYS * 24 * 60 * 60 * 1000)); |
| });
| | }); |
| | } |
| } | | } |
|
| |
|
| // Ensure DOM is ready
| |
| if (document.readyState === 'loading') { | | if (document.readyState === 'loading') { |
| document.addEventListener('DOMContentLoaded', mount); | | document.addEventListener('DOMContentLoaded', mount); |
| Line 54: |
Line 42: |
| mount(); | | mount(); |
| } | | } |
| })();
| |
|
| |
| (function () {
| |
| const banner = document.getElementById('icelist-donate-banner');
| |
| if (!banner) return;
| |
|
| |
| if (localStorage.getItem('icelistDonateBannerDismissed') === 'true') {
| |
| banner.style.display = 'none';
| |
| return;
| |
| }
| |
|
| |
| const dismiss = document.getElementById('icelist-donate-dismiss');
| |
| if (dismiss) {
| |
| dismiss.addEventListener('click', function () {
| |
| banner.style.display = 'none';
| |
| localStorage.setItem('icelistDonateBannerDismissed', 'true');
| |
| });
| |
| }
| |
| })();
| |
| (function () {
| |
| var KEY = 'icelist_notice_closed';
| |
|
| |
| // anon users only
| |
| if (!mw.user.isAnon()) return;
| |
|
| |
| var notice = document.getElementById('siteNotice');
| |
| if (!notice) return;
| |
|
| |
| // already dismissed
| |
| if (localStorage.getItem(KEY) === '1') {
| |
| notice.style.display = 'none';
| |
| return;
| |
| }
| |
|
| |
| // create close button
| |
| var btn = document.createElement('button');
| |
| btn.textContent = '×';
| |
| btn.setAttribute('aria-label', 'Close');
| |
| btn.className = 'icelist-notice-close';
| |
|
| |
| notice.appendChild(btn);
| |
|
| |
| btn.addEventListener('click', function () {
| |
| notice.style.display = 'none';
| |
| localStorage.setItem(KEY, '1');
| |
| });
| |
| })(); | | })(); |