Sends notifications when the order status gets updated
// ==UserScript== // @name Alfies — Status Update Notifier // @name:de Alfies — Status Update Benachrichtigungen // @description Sends notifications when the order status gets updated // @description:de Sendet Benachrichtigungen, wenn der Bestellungsstatus aktualisiert wird // @version 1.4 // @grant GM_notification // @match https://*.alfies.at/account/* // @icon https://external-content.duckduckgo.com/ip3/www.alfies.at.ico // @require https://cdn.jsdelivr.net/npm/@violentmonkey/dom@2 // @license GPL v3 // @author incognico // @namespace https://greasyfork.org/users/931787 // ==/UserScript== // various selectors const orderStatusWrapper = '[class^=AccountOrderPage_accountorderwrapper__]'; const orderStatusClass = 'OrderStatus_orderstatus'; const subTreeItem = `[class^=${orderStatusClass}__statustreeitem__]`; // call .dataset.active on these to check const headerList = '[class^=Header_profilenav__] > ul'; const orderStatusTitle = `[class^=${orderStatusClass}__] > p`; // IDs to only create these once const alfiesNotifierId = 'alfies-notifier'; const slideInAnimationId = 'alfies-notifier-slidein'; // need to remember last values to watch for changes let lastStatusTitle = undefined; let lastActiveStatus = undefined; const disconnect = VM.observe(document.body, () => { // Is on order status page? const orderStatus = document.querySelector(orderStatusWrapper); if (orderStatus) { defineSlideInAnimation(); createNotifierIfNotExists(); watchTitleChanges(); watchStatusTreeChanges(); } else { destroyNotifier(); } }); const defineSlideInAnimation = () => { const slideInAnimation = document.getElementById(slideInAnimationId); if (!slideInAnimation) { const style = document.createElement('style'); style.id = slideInAnimationId; style.textContent = ` @keyframes slidein { from { transform: translateY(-100%); } to { transform: translateY(0); } } `; document.head.appendChild(style); } }; const createNotifierIfNotExists = () => { const notifierExists = document.getElementById(alfiesNotifierId); if (!notifierExists) { const notifier = document.createElement('div'); notifier.id = alfiesNotifierId; notifier.textContent = 'Alfies Status Update Notifier is active!'; // assign style to the notifier const style = { color: '#72ff72', marginBottom: '10px', textAlign: 'center', fontSize: '1.5em', fontWeight: 'bold', border: '2px solid #00d900', padding: '10px', borderRadius: '10px', marginTop: '10px', backgroundColor: 'rgba(0, 255, 0, 0.1)', boxShadow: '0 0 10px 0 rgba(0, 255, 0, 0.5)', // slide in animation animation: 'slidein 1s', animationFillMode: 'forwards', }; Object.assign(notifier.style, style); // append notifier to the header list const header = document.querySelector(headerList); if (header) { header.appendChild(notifier); } } }; const destroyNotifier = () => { const notifier = document.getElementById(alfiesNotifierId); if (notifier) { notifier.remove(); } }; const timeout = 10000; const image = 'https://external-content.duckduckgo.com/ip3/www.alfies.at.ico'; const watchTitleChanges = () => { const statusTitle = document.querySelector(orderStatusTitle)?.textContent; if (statusTitle && statusTitle !== lastStatusTitle) { GM_notification({ title: 'Alfies Status Change', text: statusTitle, timeout, image, }); } lastStatusTitle = statusTitle; }; const watchStatusTreeChanges = () => { const statusTreeItems = Array.from(document.querySelectorAll(subTreeItem)); const activeStatus = statusTreeItems.filter(item => item.dataset.active === 'true'); if (activeStatus.length && lastActiveStatus !== undefined && activeStatus.length !== lastActiveStatus.length) { const activeStatusNames = activeStatus.map(item => item.textContent); GM_notification({ title: 'Alfies Status Checklist Update', text: activeStatusNames[activeStatusNames.length - 1], timeout, image, }); } lastActiveStatus = activeStatus; };