MediaWiki:Common.js: Difference between revisions

No edit summary
No edit summary
 
(10 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);