{"version":3,"sources":["App.js","serviceWorker.js","index.js"],"names":["HomePage","className","href","src","alt","to","style","paddingRight","ProductPage","props","React","useState","hasLoaded","setHasLoaded","product","setProduct","useEffect","fetch","then","res","json","result","foundProduct","filter","deal","match","params","brand","getHeader","replace","meta","title","toUpperCase","description","canonical","charset","name","keywords","logo","dangerouslySetInnerHTML","__html","url","AboutPage","color","PrivacyPage","App","id","path","exact","component","Boolean","window","location","hostname","ReactDOM","render","StrictMode","document","getElementById","navigator","serviceWorker","ready","registration","unregister","catch","error","console","message"],"mappings":"mTAqBMA,G,MAAW,WAChB,OACC,8BACC,4BACC,yBAAKC,UAAU,eACd,uBAAGC,KAAK,yFACP,yBAAKD,UAAU,QAAQE,IAAG,2BAA8BC,IAAG,4BAI9D,yBAAKH,UAAU,SACd,kBAAC,OAAD,CAAMI,GAAG,SAASC,MAAO,CAAEC,aAAc,IAAzC,SAGA,kBAAC,OAAD,CAAMF,GAAG,YAAT,eAMEG,EAAc,SAACC,GAAW,IAAD,IACIC,IAAMC,UAAS,GADnB,mBACvBC,EADuB,KACZC,EADY,OAIAH,IAAMC,SAAS,IAJf,mBAIvBG,EAJuB,KAIdC,EAJc,KAM9BL,IAAMM,WAAU,WACfC,MAJ4C,eAK1CC,MAAK,SAACC,GAAD,OAASA,EAAIC,UAClBF,MAAK,SAACG,GACN,IAAIC,EAAeD,EAAOE,QAAO,SAACC,GAAD,OAAUA,EAAKV,UAAYL,EAAMgB,MAAMC,OAAOC,SAC/EZ,EAAWO,EAAa,IACxBT,GAAa,QAEb,CAX0C,cAW5BJ,EAAMgB,MAAMC,OAAOC,QAEpC,IAMMC,EAAY,kBAAOnB,EAAMgB,MAAMC,OAAOC,MAAQlB,EAAMgB,MAAMC,OAAOC,MAAME,QAAQ,IAAK,KAAO,MAe3FC,EAAO,CACZC,MAAM,GAAD,OAAKH,IAAYI,cAAjB,0CACLC,YAAanB,EAAO,iBAAMA,QAAN,IAAMA,GAAN,UAAMA,EAASU,YAAf,aAAM,EAAeK,QAAQ,gBAAiB,KAA9C,iCAAgFpB,EAAMgB,MAAMC,OAAOC,MAAME,QAAQ,IAAK,MAC1IK,UAAU,+BAAD,OAAiCzB,EAAMgB,MAAMC,OAAOC,OAC7DG,KAAM,CACLK,QAAS,QACTC,KAAM,CACLC,SAAS,kBAAD,OAAoB5B,EAAMgB,MAAMC,OAAOC,MAAvC,6CAKX,OAAOf,EACN,kBAAC,IAAiBkB,EACjB,8BACC,yBAAK7B,UAAU,WAEf,yBAAKA,UAAU,eArCjBa,EACC,yBAAKb,UAAU,QAAQE,IAAG,yBAAaW,QAAb,IAAaA,OAAb,EAAaA,EAASwB,MAAQlC,IAAKwB,MAE7D,yBAAK3B,UAAU,QAAQE,IAAG,2BAA8BC,IAAG,yBAoCzD,4BAAKwB,KACL,uBAAG3B,UAAU,OAAOsC,wBAhChB,CACNC,OAAQ1B,EAAUA,EAAQU,KAAX,iCAA4Cf,EAAMgB,MAAMC,OAAOC,MAAME,QAAQ,IAAK,SAgC/F,yBAAK5B,UAAU,aACd,uBAAGA,UAAU,gBAAb,8CACA,uBAAGC,KAAK,sBACP,4BAAQD,UAAU,YAAlB,aAED,uBAAGC,KAjCPY,EACGA,EAAQ2B,IAAR,mEAA0EhC,EAAMgB,MAAMC,OAAOC,OADzF,iCAEsBlB,EAAMgB,MAAMC,OAAOC,MAAME,QACnD,IACA,KAJI,kGAKuFpB,EAAMgB,MAAMC,OAAOC,QA6B5G,4BAAQ1B,UAAU,WAAlB,cAIH,yBAAKA,UAAU,WACf,yBAAKA,UAAU,SACd,kBAAC,OAAD,CAAMI,GAAG,SAASC,MAAO,CAAEC,aAAc,IAAzC,SAGA,kBAAC,OAAD,CAAMF,GAAG,YAAT,cAKH,8BACC,4BACC,yBAAKJ,UAAU,eAAf,iBAMEyC,EAAY,WACjB,OACC,8BACC,4BACC,yBAAKzC,UAAU,eAAf,gBAED,uBAAGK,MAAO,CAAEqC,MAAO,UAAnB,qKAQGC,EAAc,WACnB,OACC,8BACC,4BACC,yBAAK3C,UAAU,eAAf,eAED,uBAAGK,MAAO,CAAEqC,MAAO,UAAnB,4EAEC,6BAFD,kKAKC,6BACA,6BAND,wLASC,6BACA,6BAVD,kCAYC,6BACA,6BAbD,+qBAkB4H,6BAlB5H,kEAoBC,6BACA,6BArBD,wOAwBC,6BACA,6BAzBD,+LA2BuD,6BACtD,6BA5BD,mJA+BC,6BACA,6BAhCD,oCAkCC,6BACA,6BAnCD,wwBA0CC,6BACA,6BA3CD,eA6CC,6BACA,6BA9CD,2IA+C0I,6BACzI,6BAhDD,cAkDC,6BACA,6BAnDD,qqBAyDC,6BACA,6BA1DD,iBA4DC,6BACA,6BA7DD,4JAgEC,6BACA,6BAjED,SAmEC,6BACA,6BApED,gEAsEC,6BACA,6BAvED,UAyEC,6BACA,6BA1ED,wKA6EC,6BACA,6BA9ED,mBAgFC,6BACA,6BAjFD,uKAoFC,6BACA,6BArFD,aAuFC,6BACA,6BAxFD,yNA2FC,6BACA,6BA5FD,gBA8FC,6BA9FD,gBAgGC,6BAhGD,qBAkGC,6BAlGD,UAoGC,6BApGD,UAsGC,gCAMWE,EAzPH,WACX,OACC,kBAAC,gBAAD,KACC,kBAAC,IAAD,CAAWC,GAAG,kBACb,kBAAC,IAAD,KACC,kBAAC,IAAD,CAAOC,KAAK,IAAIC,OAAK,EAACC,UAAWjD,IACjC,kBAAC,IAAD,CAAO+C,KAAK,SAASE,UAAWP,IAChC,kBAAC,IAAD,CAAOK,KAAK,WAAWE,UAAWL,IAClC,kBAAC,IAAD,CAAOG,KAAK,UAAUE,UAAWzC,QCFlB0C,QACW,cAA7BC,OAAOC,SAASC,UAEe,UAA7BF,OAAOC,SAASC,UAEhBF,OAAOC,SAASC,SAAS5B,MACvB,2DCZN6B,IAASC,OACP,kBAAC,IAAMC,WAAP,KACE,kBAAC,EAAD,OAEFC,SAASC,eAAe,SDyHpB,kBAAmBC,WACrBA,UAAUC,cAAcC,MACrB3C,MAAK,SAAA4C,GACJA,EAAaC,gBAEdC,OAAM,SAAAC,GACLC,QAAQD,MAAMA,EAAME,c","file":"static/js/main.c9e24d6b.chunk.js","sourcesContent":["import React from \"react\";\nimport { BrowserRouter as Router, Switch, Route, Link } from \"react-router-dom\";\nimport DocumentMeta from \"react-document-meta\";\nimport Analytics from \"react-router-ga\";\nimport \"./App.css\";\n\nconst App = () => {\n\treturn (\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t);\n};\n\nconst HomePage = () => {\n\treturn (\n\t\t
\n\t\t\t

\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t{`Top\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t

\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\tAbout\n\t\t\t\t\n\t\t\t\tPrivacy\n\t\t\t
\n\t\t
\n\t);\n};\n\nconst ProductPage = (props) => {\n\tconst [hasLoaded, setHasLoaded] = React.useState(false);\n\n\tconst detailsFile = process.env.PUBLIC_URL + \"/deals.json\";\n\tconst [product, setProduct] = React.useState({});\n\n\tReact.useEffect(() => {\n\t\tfetch(detailsFile)\n\t\t\t.then((res) => res.json())\n\t\t\t.then((result) => {\n\t\t\t\tlet foundProduct = result.filter((deal) => deal.product === props.match.params.brand);\n\t\t\t\tsetProduct(foundProduct[0]);\n\t\t\t\tsetHasLoaded(true);\n\t\t\t});\n\t}, [detailsFile, props.match.params.brand]);\n\n\tconst getImage = () =>\n\t\tproduct ? (\n\t\t\t{getHeader()}\n\t\t) : (\n\t\t\t{`Top\n\t\t);\n\tconst getHeader = () => (props.match.params.brand ? props.match.params.brand.replace(\"-\", \" \") : null);\n\n\tconst getDescription = () => {\n\t\treturn {\n\t\t\t__html: product ? product.deal : `Find the best deals on ${props.match.params.brand.replace(\"-\", \" \")}`,\n\t\t};\n\t};\n\tconst getLink = () =>\n\t\tproduct\n\t\t\t? product.url + `?utm_source=topjuice&utm_medium=passthrough&utm_campaign=${props.match.params.brand}`\n\t\t\t: `https://vaped4u.com/?s=${props.match.params.brand.replace(\n\t\t\t\t\t\"-\",\n\t\t\t\t\t\"+\",\n\t\t\t )}&post_type=product&dgwt_wcas=1&utm_source=topjuice&utm_medium=passthrough&utm_campaign=${props.match.params.brand}`;\n\n\tconst meta = {\n\t\ttitle: `${getHeader().toUpperCase()} | TopJuice Deals - Best deals online!`,\n\t\tdescription: product ? `${product?.deal?.replace(/(<([^>]+)>)/gi, \"\")}` : `Find the best deals on ${props.match.params.brand.replace(\"-\", \" \")}`,\n\t\tcanonical: `https://topjuicedeals.co.uk/${props.match.params.brand}`,\n\t\tmeta: {\n\t\t\tcharset: \"utf-8\",\n\t\t\tname: {\n\t\t\t\tkeywords: `liquid, deals, ${props.match.params.brand}, best price, online, order, ecommerce`,\n\t\t\t},\n\t\t},\n\t};\n\n\treturn hasLoaded ? (\n\t\t\n\t\t\t
\n\t\t\t\t
\n\n\t\t\t\t
\n\t\t\t\t\t{getImage()}\n\t\t\t\t\t

{getHeader()}

\n\t\t\t\t\t

\n\t\t\t\t\t
\n\t\t\t\t\t\t

Please confirm you are over 18 years old..

\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\tAbout\n\t\t\t\t\t\n\t\t\t\t\tPrivacy\n\t\t\t\t
\n\t\t\t
\n\t\t
\n\t) : (\n\t\t
\n\t\t\t

\n\t\t\t\t
Loading...
\n\t\t\t

\n\t\t
\n\t);\n};\n\nconst AboutPage = () => {\n\treturn (\n\t\t
\n\t\t\t

\n\t\t\t\t
About us...
\n\t\t\t

\n\t\t\t

\n\t\t\t\tTopJuiceDeals is committed to getting you the best deals on your juices. You wont find cheaper prices or a wider range of stock than what our\n\t\t\t\tpartners provide!\n\t\t\t

\n\t\t
\n\t);\n};\n\nconst PrivacyPage = () => {\n\treturn (\n\t\t
\n\t\t\t

\n\t\t\t\t
Privacy...
\n\t\t\t

\n\t\t\t

\n\t\t\t\tTopJuiceDeals complies with the General Data Protection Regulation (GDPR)\n\t\t\t\t
\n\t\t\t\tYour privacy is important to us. This policy to learn about the personal data that we collect from you and how we use it. Get in touch if you\n\t\t\t\thave any queries.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tThis Privacy Policy describes how your personal information is collected, used, and shared when you visit or make a purchase from\n\t\t\t\thttps://topjuicedeals.co.uk (the “Site”).\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tPersonal Information we collect\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tWhen you visit the Site, we automatically collect certain information about your device, including information about your web browser, IP\n\t\t\t\taddress, time zone, and some of the cookies that are installed on your device. Additionally, as you browse the Site, we collect information\n\t\t\t\tabout the individual web pages or products that you view, what websites or search terms referred you to the Site, and information about how you\n\t\t\t\tinteract with the Site. We refer to this automatically-collected information as “Device Information.” This informed is stored on\n\t\t\t\tsecure servers at all times with all data transactions between the server and clients conducted over secure web protocols.
\n\t\t\t\tWe collect Device Information using the following technologies:\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t“Cookies” are data files that are placed on your device or computer and often include an anonymous unique identifier. For more\n\t\t\t\tinformation about cookies, and how to disable cookies, visit http://www.allaboutcookies.org.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\t“Log files” track actions occurring on the Site, and collect data including your IP address, browser type, Internet service\n\t\t\t\tprovider, referring/exit pages, and date/time stamps.
\n\t\t\t\t
\n\t\t\t\t“Web beacons,” “tags,” and “pixels” are electronic files used to record information about how you browse the\n\t\t\t\tSite.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tSharing your personal information\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tWe share your Personal Information with third parties to help us use your Personal Information, as described above. These third parties are\n\t\t\t\tlisted below; We have partner companies which we may share information to as part of order processing. We also use Google Analytics to help us\n\t\t\t\tunderstand how our customers use the Site – you can read more about how Google uses your Personal Information here:\n\t\t\t\thttps://www.google.com/intl/en/policies/privacy/. You can also opt-out of Google Analytics here: https://tools.google.com/dlpage/gaoptout.\n\t\t\t\tFinally, we may also share your Personal Information to comply with applicable laws and regulations, to respond to a subpoena, search warrant or\n\t\t\t\tother lawful requests for information we receive, or to otherwise protect our rights.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tDo not track\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tPlease note that we do not alter our Site’s data collection and use practices when we see a Do Not Track signal from your browser.
\n\t\t\t\t
\n\t\t\t\tYour rights\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tIf you are a European resident, you have the right to access personal information we hold about you and to ask that your personal information be\n\t\t\t\tcorrected, updated, or deleted. If you would like to exercise this right, please contact us through the contact information below. Additionally,\n\t\t\t\tif you are a European resident we note that we are processing your information in order to fulfil contracts we might have with you (for example\n\t\t\t\tif you make an order through the Site), or otherwise to pursue our legitimate business interests listed above. Additionally, please note that\n\t\t\t\tyour information will be transferred outside of Europe, including to Canada and the United States.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tData retention\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tWhen you place an order through the Site, we will maintain your Order Information for our records unless and until you ask us to delete this\n\t\t\t\tinformation.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tMinors\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tThe Site is not intended for individuals under the age of 18.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tChanges\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tWe may update this privacy policy from time to time in order to reflect, for example, changes to our practices or for other operational, legal\n\t\t\t\tor regulatory reasons.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tTerms of Service\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tSpecific terms relating to accessing our website and the purchase of our products can be found in our Terms of Service policy. Please read\n\t\t\t\tbefore using our service.\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tContact Us\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tFor more information about our privacy practices, if you have questions, or if you would like to make a complaint, please contact us by email at\n\t\t\t\tinfo@topjuicedeals.co.uk or by mail using the details provided below:\n\t\t\t\t
\n\t\t\t\t
\n\t\t\t\tTopJuiceDeals\n\t\t\t\t
\n\t\t\t\tBasement Flat\n\t\t\t\t
\n\t\t\t\t198 Nithsdale Road\n\t\t\t\t
\n\t\t\t\tGlasgow\n\t\t\t\t
\n\t\t\t\tG41 5EU\n\t\t\t\t
\n\t\t\t

\n\t\t
\n\t);\n};\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}