We are a PWA
This commit is contained in:
		| @@ -1,8 +1,11 @@ | ||||
| { | ||||
|   "author": "Kasper Rynning-Tønnesen og Kevin Midbøe", | ||||
|   "name": "Vinlotteri Knowit", | ||||
|   "description": "Knowits ukentlige vinlotteri-statistikk-side.", | ||||
|   "short_name": "Vinlottis", | ||||
|   "start_url": "/#/", | ||||
|   "start_url": "/", | ||||
|   "dir": "ltr", | ||||
|   "lang": "nb-NO", | ||||
|   "icons": [ | ||||
|     { | ||||
|       "src": "/public/assets/images/android-chrome-144x144.png", | ||||
|   | ||||
							
								
								
									
										52
									
								
								public/service-worker.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								public/service-worker.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| var version = "v1.0"; | ||||
| var cacheName = "::vinlottis"; | ||||
| var CACHE_NAME = version + cacheName; | ||||
| var STATIC_CACHE_URLS = ["/"]; | ||||
|  | ||||
| self.addEventListener("activate", event => { | ||||
|   event.waitUntil( | ||||
|     caches | ||||
|       .keys() | ||||
|       .then(keys => keys.filter(key => key !== CACHE_NAME)) | ||||
|       .then(keys => | ||||
|         Promise.all( | ||||
|           keys.map(key => { | ||||
|             console.log(`Deleting cache ${key}`); | ||||
|             return caches.delete(key); | ||||
|           }) | ||||
|         ) | ||||
|       ) | ||||
|   ); | ||||
| }); | ||||
|  | ||||
| self.addEventListener("install", event => { | ||||
|   console.log("Service Worker installing."); | ||||
|   event.waitUntil( | ||||
|     caches.open(CACHE_NAME).then(cache => cache.addAll(STATIC_CACHE_URLS)) | ||||
|   ); | ||||
| }); | ||||
|  | ||||
| self.addEventListener("fetch", event => { | ||||
|   event.respondWith( | ||||
|     fetch(event.request).catch(function() { | ||||
|       return caches.match(event.request); | ||||
|     }) | ||||
|   ); | ||||
|   event.waitUntil( | ||||
|     fetch(event.request) | ||||
|       .then(function(response) { | ||||
|         cache(event.request, response); | ||||
|       }) | ||||
|       .catch(error => {}) | ||||
|   ); | ||||
| }); | ||||
|  | ||||
| function cache(request, response) { | ||||
|   if (response.type === "error" || response.type === "opaque") { | ||||
|     return Promise.resolve(); // do not put in cache network errors | ||||
|   } | ||||
|  | ||||
|   return caches | ||||
|     .open(CACHE_NAME) | ||||
|     .then(cache => cache.put(request, response.clone())); | ||||
| } | ||||
| @@ -48,10 +48,15 @@ passport.use(new LocalStrategy(User.authenticate())); | ||||
| // use static serialize and deserialize of model for passport session support | ||||
| passport.serializeUser(User.serializeUser()); | ||||
| passport.deserializeUser(User.deserializeUser()); | ||||
|  | ||||
| app.use("/public", express.static(path.join(__dirname, "public"))); | ||||
| app.use("/dist", express.static(path.join(__dirname, "public/dist"))); | ||||
| app.use("/", loginApi); | ||||
| app.use("/api/", updateApi); | ||||
| app.use("/api/", retrieveApi); | ||||
|  | ||||
| app.use("/service-worker.js", function(req, res) { | ||||
|   res.sendFile(path.join(__dirname, "public/service-worker.js")); | ||||
| }); | ||||
|  | ||||
| app.listen(30030); | ||||
|   | ||||
| @@ -16,6 +16,18 @@ export default { | ||||
|   }, | ||||
|   mounted() { | ||||
|     console.log("SNEAKY PETE!"); | ||||
|     if ("serviceWorker" in navigator) { | ||||
|       navigator.serviceWorker | ||||
|         .register("/service-worker.js") | ||||
|         .then(serviceWorker => { | ||||
|           console.log( | ||||
|             "Arbeids arbeideren din er installert. Du kan nå gå offline frem til neste trekning." | ||||
|           ); | ||||
|         }) | ||||
|         .catch(error => { | ||||
|           console.error("Arbeids arbeideren klarer ikke arbeide.", error); | ||||
|         }); | ||||
|     } | ||||
|   }, | ||||
|   computed: {}, | ||||
|  | ||||
|   | ||||
| @@ -19,7 +19,8 @@ body { | ||||
|  | ||||
| .title { | ||||
|   text-align: center; | ||||
|   width: 100vw; | ||||
|   width: fit-content; | ||||
|   margin: 2rem auto; | ||||
|   text-align: center; | ||||
|   font-family: knowit; | ||||
|   margin-top: 3.8rem; | ||||
|   | ||||
| @@ -3,6 +3,10 @@ | ||||
|   <head> | ||||
|     <title>Vinlottis</title> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|     <meta | ||||
|       name="description" | ||||
|       content="Knowits ukentlige vinlotteri-statistikk-side." | ||||
|     /> | ||||
|     <link | ||||
|       rel="apple-touch-icon" | ||||
|       sizes="152x152" | ||||
| @@ -28,8 +32,11 @@ | ||||
|     /> | ||||
|     <meta name="msapplication-TileColor" content="#da532c" /> | ||||
|     <meta name="theme-color" content="#dbeede" /> | ||||
|     <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> | ||||
|     <meta name="apple-mobile-web-app-capable" content="yes"> | ||||
|     <meta | ||||
|       name="apple-mobile-web-app-status-bar-style" | ||||
|       content="black-translucent" | ||||
|     /> | ||||
|     <meta name="apple-mobile-web-app-capable" content="yes" /> | ||||
|   </head> | ||||
|   <body> | ||||
|     <div id="app"></div> | ||||
|   | ||||
| @@ -2,9 +2,7 @@ | ||||
|   <div class="highscores" v-if="highscore.length > 0"> | ||||
|     <h3>Highscore</h3> | ||||
|     <ol> | ||||
|       <li v-for="person in highscore"> | ||||
|         {{ person.name }} - {{ person.wins.length }} | ||||
|       </li> | ||||
|       <li v-for="person in highscore">{{ person.name }} - {{ person.wins.length }}</li> | ||||
|     </ol> | ||||
|   </div> | ||||
| </template> | ||||
|   | ||||
| @@ -8,20 +8,20 @@ | ||||
|         :key="color.name" | ||||
|       > | ||||
|         <div class="number-container"> | ||||
|           <span :class="color.name + ' bought-number-span'">{{ | ||||
|           <span :class="color.name + ' bought-number-span'"> | ||||
|             {{ | ||||
|             color.total | ||||
|           }}</span> | ||||
|           <span> kjøpte</span> | ||||
|             }} | ||||
|           </span> | ||||
|           <span>kjøpte</span> | ||||
|         </div> | ||||
|         <div class="inner-text-container"> | ||||
|           <div> | ||||
|             {{ color.win }} vinn - | ||||
|             <span class="small">{{ color.totalPercentage }}</span | ||||
|             >% | ||||
|             <span class="small">{{ color.totalPercentage }}</span>% | ||||
|           </div> | ||||
|           <div> | ||||
|             <span :class="color.name + ' small'">{{ color.percentage }}</span | ||||
|             >% vinn | ||||
|             <span :class="color.name + ' small'">{{ color.percentage }}</span>% vinn | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
| @@ -43,11 +43,14 @@ export default { | ||||
|       return this.amount * 1000; | ||||
|     }, | ||||
|     vippsUrlBasedOnUserAgent: function() { | ||||
|       if (navigator.userAgent.includes('iPhone')) { | ||||
|         return "https://qr.vipps.no/28/2/01/031/4797740427?v=1&m=Vinlotteri%20🍾&a=" + this.price | ||||
|       if (navigator.userAgent.includes("iPhone")) { | ||||
|         return ( | ||||
|           "https://qr.vipps.no/28/2/01/031/4797740427?v=1&m=Vinlotteri%20🍾&a=" + | ||||
|           this.price | ||||
|         ); | ||||
|       } | ||||
|  | ||||
|       return vippsUrl = "https://qr.vipps.no/28/2/01/031/4797740427?v=1&m=Vinlotteri%20🍾" | ||||
|       return "https://qr.vipps.no/28/2/01/031/4797740427?v=1&m=Vinlotteri%20🍾"; | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|   | ||||
| @@ -79,7 +79,7 @@ export default { | ||||
|         title: { | ||||
|           display: true, | ||||
|           text: "Antall vinn", | ||||
|           fontSize: 20, | ||||
|           fontSize: 20 | ||||
|         }, | ||||
|         legend: { | ||||
|           labels: { | ||||
|   | ||||
| @@ -13,7 +13,8 @@ | ||||
|           v-if="wine.vivinoLink != '' && wine.vivinoLink != null" | ||||
|           @click="wineClick(wine)" | ||||
|         > | ||||
|           <span class="truncate">{{ wine.name }}</span> - {{ wine.rating }} i | ||||
|           <span class="truncate">{{ wine.name }}</span> | ||||
|           - {{ wine.rating }} i | ||||
|           rating - {{ wine.occurences }} gang(er) | ||||
|         </a> | ||||
|       </li> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user