From 2bbc649903b876af4bc5a99600c234fdd865000a Mon Sep 17 00:00:00 2001 From: Ben Busby Date: Sun, 27 Dec 2020 17:58:09 -0500 Subject: [PATCH] Add support for UPS/USPS/FedEx tracking queries Introduces a new javascript "utils" file, which includes a check for matching the query against a set of tracking number regexes on page load. If a match is found, the script prepends a link to the (presumably) appropriate tracking page. Referenced in #98 --- app/static/css/header.css | 9 +++++- app/static/js/utils.js | 60 ++++++++++++++++++++++++++++++++++++++ app/templates/display.html | 1 + 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 app/static/js/utils.js diff --git a/app/static/css/header.css b/app/static/css/header.css index c3eebf8..3b24fdc 100644 --- a/app/static/css/header.css +++ b/app/static/css/header.css @@ -52,4 +52,11 @@ header { width: 100%; -webkit-tap-highlight-color: rgba(0,0,0,0); overflow: hidden; -} \ No newline at end of file +} + +.tracking-link { + font-size: large; + text-align: center; + margin: 15px; + display: block; +} diff --git a/app/static/js/utils.js b/app/static/js/utils.js new file mode 100644 index 0000000..775e072 --- /dev/null +++ b/app/static/js/utils.js @@ -0,0 +1,60 @@ +const checkForTracking = () => { + const mainDiv = document.getElementById("main"); + const query = document.getElementById("search-bar").value.replace(/\s+/g, ''); + + // Note: regex functions for checking for tracking queries were derived + // from here -- https://stackoverflow.com/questions/619977 + const matchTracking = { + "ups": { + "link": `https://www.ups.com/track?tracknum=${query}`, + "expr": [ + /\b(1Z ?[0-9A-Z]{3} ?[0-9A-Z]{3} ?[0-9A-Z]{2} ?[0-9A-Z]{4} ?[0-9A-Z]{3} ?[0-9A-Z]|[\dT]\d\d\d ?\d\d\d\d ?\d\d\d)\b/ + ] + }, + "usps": { + "link": `https://tools.usps.com/go/TrackConfirmAction?tLabels=${query}`, + "expr": [ + /(\b\d{30}\b)|(\b91\d+\b)|(\b\d{20}\b)/, + /^E\D{1}\d{9}\D{2}$|^9\d{15,21}$/, + /^91[0-9]+$/, + /^[A-Za-z]{2}[0-9]+US$/ + ] + }, + "fedex": { + "link": `https://www.fedex.com/apps/fedextrack/?tracknumbers=${query}`, + "expr": [ + /(\b96\d{20}\b)|(\b\d{15}\b)|(\b\d{12}\b)/, + /\b((98\d\d\d\d\d?\d\d\d\d|98\d\d) ?\d\d\d\d ?\d\d\d\d( ?\d\d\d)?)\b/, + /^[0-9]{15}$/ + ] + } + } + + // Creates a link to a UPS/USPS/FedEx tracking page + const createTrackingLink = href => { + let link = document.createElement("a"); + link.className = "tracking-link"; + link.innerHTML = "View Tracking Info"; + link.href = href; + mainDiv.prepend(link); + } + + // Compares the query against a set of regex patterns + // for tracking numbers + const compareQuery = provider => { + provider.expr.some(regex => { + if (query.match(regex)) { + createTrackingLink(provider.link); + return true; + } + }); + } + + for (const key of Object.keys(matchTracking)) { + compareQuery(matchTracking[key]); + } +} + +document.addEventListener("DOMContentLoaded", function() { + checkForTracking(); +}); diff --git a/app/templates/display.html b/app/templates/display.html index 1c490ef..f1dc572 100644 --- a/app/templates/display.html +++ b/app/templates/display.html @@ -6,6 +6,7 @@ + {% if dark_mode %}