162 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div>
 | |
|     <div class="clock" v-if="enabled">
 | |
|       <h2 cv-if="distance > 0">
 | |
|         <span v-if="days > 0">{{ pad(days) }}:</span>
 | |
|         <span>{{ pad(hours) }}</span
 | |
|         >: <span>{{ pad(minutes) }}</span
 | |
|         >:
 | |
|         <span>{{ pad(seconds) }}</span>
 | |
|       </h2>
 | |
|       <div class="cross" @click="stopClock">X</div>
 | |
|       <h2 v-if="distance <= 0">Lotteriet har begynt!</h2>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| export default {
 | |
|   props: {
 | |
|     hardEnable: {
 | |
|       type: Boolean,
 | |
|       required: false
 | |
|     }
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       nextLottery: null,
 | |
|       days: 0,
 | |
|       hours: 0,
 | |
|       minutes: 0,
 | |
|       seconds: 0,
 | |
|       distance: 0,
 | |
|       enabled: false,
 | |
|       code: "38384040373937396665",
 | |
|       codeDone: "",
 | |
|       interval: null
 | |
|     };
 | |
|   },
 | |
|   watch: {
 | |
|     hardEnable: function(hardEnable) {
 | |
|       if (hardEnable) {
 | |
|         this.enabled = true;
 | |
|         this.initialize();
 | |
|         this.countdown();
 | |
|       }
 | |
|     }
 | |
|   },
 | |
|   mounted() {
 | |
|     window.addEventListener("keydown", this.listenerFunction);
 | |
|   },
 | |
|   methods: {
 | |
|     pad: function(num) {
 | |
|       if (num < 10) {
 | |
|         return `0${num}`;
 | |
|       }
 | |
|       return num;
 | |
|     },
 | |
|     listenerFunction: function(event) {
 | |
|       this.codeDone += event.keyCode;
 | |
|       if (this.code.substring(0, this.codeDone.length) == this.codeDone) {
 | |
|         if (this.code == this.codeDone && !this.enabled) {
 | |
|           this.enabled = true;
 | |
|           this.initialize();
 | |
|           this.countdown();
 | |
|           this.codeDone = "";
 | |
|         }
 | |
|       } else {
 | |
|         this.codeDone = "";
 | |
|       }
 | |
|     },
 | |
|     initialize: function() {
 | |
|       let d = new Date();
 | |
|       let dayOfLottery = __DATE__;
 | |
|       let dayDifference = (dayOfLottery + 7 - d.getDay()) % 7;
 | |
|       if (dayDifference == 0) {
 | |
|         dayDifference = 7;
 | |
|       }
 | |
|       let nextDayOfLottery = new Date(d.setDate(d.getDate() + dayDifference));
 | |
|       nextDayOfLottery = new Date(nextDayOfLottery.setHours(__HOURS__));
 | |
|       nextDayOfLottery = new Date(nextDayOfLottery.setMinutes(0));
 | |
|       nextDayOfLottery = new Date(nextDayOfLottery.setSeconds(0));
 | |
|       this.nextLottery = nextDayOfLottery;
 | |
|       window.scrollTo(0, 0);
 | |
|       document.querySelector("body").style.overflow = "hidden";
 | |
|       document.querySelector("body").style.height = "100vh";
 | |
|       let now = new Date().getTime();
 | |
|       this.distance = new Date(this.nextLottery).getTime() - now;
 | |
|     },
 | |
|     stopClock: function() {
 | |
|       clearInterval(this.interval);
 | |
|       this.enabled = false;
 | |
|       document.querySelector("body").style.overflow = "auto";
 | |
|       document.querySelector("body").style.height = "initial";
 | |
|       this.$emit("countdown", false);
 | |
|     },
 | |
|     countdown: function() {
 | |
|       // Get today's date and time
 | |
|       let now = new Date().getTime();
 | |
| 
 | |
|       // Find the distance between now and the count down date
 | |
|       this.distance = new Date(this.nextLottery).getTime() - now;
 | |
| 
 | |
|       // Time calculations for days, hours, minutes and seconds
 | |
|       this.days = Math.floor(this.distance / (1000 * 60 * 60 * 24));
 | |
|       this.hours = Math.floor(
 | |
|         (this.distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
 | |
|       );
 | |
|       this.minutes = Math.floor(
 | |
|         (this.distance % (1000 * 60 * 60)) / (1000 * 60)
 | |
|       );
 | |
|       this.seconds = Math.floor((this.distance % (1000 * 60)) / 1000);
 | |
|       if (this.days == 7) {
 | |
|         this.days = 0;
 | |
|       }
 | |
|       if (this.distance < 0) {
 | |
|         clearTimeout(this.interval);
 | |
|         return;
 | |
|       }
 | |
|       this.interval = setTimeout(this.countdown, 500);
 | |
|     }
 | |
|   }
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| @import "../styles/media-queries.scss";
 | |
| .clock {
 | |
|   width: 100vw;
 | |
|   height: 100vh;
 | |
|   position: absolute;
 | |
|   background: white;
 | |
|   top: 0;
 | |
|   left: 0;
 | |
| 
 | |
|   @include mobile {
 | |
|     width: 105vw;
 | |
|     height: 110vh;
 | |
|   }
 | |
| }
 | |
| .cross {
 | |
|   top: 15px;
 | |
|   right: 23px;
 | |
|   font-size: 2rem;
 | |
|   position: absolute;
 | |
|   cursor: pointer;
 | |
| 
 | |
|   @include mobile {
 | |
|     right: 45px;
 | |
|   }
 | |
| }
 | |
| 
 | |
| h2 {
 | |
|   margin: auto;
 | |
|   height: 100vh;
 | |
|   width: 100vw;
 | |
|   display: flex;
 | |
|   justify-content: center;
 | |
|   align-items: center;
 | |
|   font-size: 4rem;
 | |
| }
 | |
| </style>
 |