etaylib / Hide Sponsored Ads in Facebook

// ==UserScript==
// @namespace     https://openuserjs.org/users/etaylib
// @name          Hide Sponsored Ads in Facebook
// @description   Finding those ads in your feed and hides them.
// @copyright     2019, etaylib (https://openuserjs.org/users/etaylib)
// @match        https://www.facebook.com/*
// @license       MIT
// @version       0.0.8
// @grant none
// ==/UserScript==

// ==OpenUserJS==
// @author etaylib
// ==/OpenUserJS==

//  todo: a bit more modular

let blockedAds, div;
const targetNode = document.getElementById('contentArea');
console.log(targetNode);
if (!targetNode) {
  return false;
}
const showCounter = false; //  EXPERIMENTAL! REMOVE THE NOTIFICATION DIV BELOW IF YOU DON'T WANT TO KNOW HOW MANY ADS WERE BLOCKED //
if (showCounter) {
  blockedAds = 0;
  div = document.createElement('div');
  div.style.cssText = 'position:fixed;top:20px;left:20px;border:1px solid #000; background-color:#fff; padding:5px;z-index:2147483647;';
  div.innerText = 'Blocked 0 Sponsored ads on this page';
  document.body.appendChild(div);
}

document.querySelectorAll('.userContentWrapper').forEach(wrapper => {
  Array.from(wrapper.querySelectorAll('span')).some(e => {
    if (e.innerText === 'Sponsored') {
      wrapper.style.display = 'none';
      if (showCounter) {
        blockedAds++;
        div.innerText = 'Blocked ' + blockedAds + ' Sponsored ads on this page';
      }
      return true;
    }
  });
});

const config = {
  childList: true,
  subtree: true,
  attributeFilter: ['div']
};
const callback = (mutationsList, observer) => {
  for (let mutation of mutationsList) {
    if (mutation.type === 'childList') {
      const target = mutation.target;
      if (target.className.includes('userContent')) {
        const wrapper = target.closest('.userContentWrapper');
        Array.from(wrapper.querySelectorAll('span')).some(e => {
          if (e.innerText === 'Sponsored') {
            wrapper.style.display = 'none';
            if (showCounter) {
              blockedAds++;
              div.innerText = 'Blocked ' + blockedAds + ' Sponsored ads on this page';
            }
            return true;
          }
        });
      }

    }
  };
};
const newPosts = new MutationObserver(callback);
newPosts.observe(targetNode, config);