NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name WhatsApp Talk to Unsaved Contacts
// @description You don't have to leave the WhatsWeb interface to talk to unsaved contacts anymore!
// @version 1.1.1
// @author icetbr
// @icon https://www.google.com/s2/favicons?sz=64&domain=whatsapp.com
// @license MIT
// @namespace https://github.com/icetbr/userscripts
// @updateURL https://openuserjs.org/meta/icetbr/WhatsAppTalkToUnsavedContacts.meta.js
// @downloadURL https://openuserjs.org/src/scripts/icetbr/WhatsAppTalkToUnsavedContacts.user.js
// @match https://web.whatsapp.com/*
// @grant none
// ==/UserScript==
const $ = (selector, parent = document) => parent.querySelector(selector),
el2 = str => {
const element = new DOMParser().parseFromString(str, 'text/html');
const child = element.documentElement.querySelector('body').firstChild;
return child;
},
waitForEl = selector => new Promise(resolve => {
if ($(selector)) return resolve($(selector));
const observer = new MutationObserver(() => {
if (!$(selector)) return;
resolve($(selector));
observer.disconnect();
});
observer.observe(document.body, { childList: true, subtree: true });
return observer;
});
window.icetbr = {
hidden: true,
redirect: e => {
if (e.key !== 'Enter') return;
window.location.href=`https://web.whatsapp.com/send/?phone=${e.currentTarget.value}&text&type=phone_number&app_absent=0`;
},
togglePhoneNumber: () => {
$('#unsavedContactPhoneNumber').style.display = window.icetbr.hidden ? 'block' : 'none';
window.icetbr.hidden = !window.icetbr.hidden;
},
};
var init = () => {
const style = 'outline: none; border:none; background-image:none; background-color:transparent; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; display: none; font-size: 14px; top: -2px;';
const $input = el2(`<input id="unsavedContactPhoneNumber" placeholder="Phone number" title: "Ex: 5547999783456" class="Er7QU" style="${style}" onkeyup="icetbr.redirect(event)">`);
const $searchBox = $('._3RN1i._3jaYl');
$searchBox.appendChild($input);
const iconSvg = `
<svg viewBox="0 0 28 21" height="24" width="17" preserveAspectRatio="xMidYMid meet" class="" fill="none">
<path fill="currentColor" d="M7.043 9.306c-3.85 2.223 2.024 13.234 6.237 10.802l3.906 6.765c-1.777 1.026-3.282 1.673-5.342.495C6.122 24.098-.176 13.194.004 6.69.066 4.431 1.397 3.546 3.138 2.541l3.906 6.765zm1.615-.184c-.416.24-.951.097-1.191-.319L3.784 2.425c-.24-.416-.097-.951.319-1.191L6.039.116c.416-.24.951-.097 1.192.319l3.682 6.378c.24.416.097.951-.319 1.191L8.658 9.122zm10.059 17.423c-.416.24-.951.097-1.191-.319l-3.682-6.378c-.24-.416-.097-.951.319-1.191l1.935-1.117c.416-.24.951-.097 1.192.319l3.682 6.378c.24.416.097.951-.319 1.191l-1.935 1.117z"/>
</svg>
`;
const $button = el2(`
<div class="_3OtEr rOo0o" style="left: 15px; top: -1px;"><div class="_3ndVb" role="button" title="Send message to unsaved contact" onclick="icetbr.togglePhoneNumber()"><span>
${iconSvg}
</span></div><span></span></div>
`);
const $buttonsBar = $('._1sPvB._2XdMx span');
$buttonsBar.prepend($button);
};
waitForEl('[data-testid="menu-bar-community-tab"]').then(init);