forked from cadence/breezewiki
		
	Add countdown timer for gacha enthusiasts
This commit is contained in:
		
							parent
							
								
									ef12faf72d
								
							
						
					
					
						commit
						bf6efde979
					
				
					 2 changed files with 54 additions and 0 deletions
				
			
		| 
						 | 
					@ -136,6 +136,7 @@
 | 
				
			||||||
      ,(if (config-true? 'feature_search_suggestions)
 | 
					      ,(if (config-true? 'feature_search_suggestions)
 | 
				
			||||||
           `(script (@ (type "module") (src ,(get-static-url "search-suggestions.js"))))
 | 
					           `(script (@ (type "module") (src ,(get-static-url "search-suggestions.js"))))
 | 
				
			||||||
           "")
 | 
					           "")
 | 
				
			||||||
 | 
					      (script (@ (type "module") (src ,(get-static-url "countdown.js"))))
 | 
				
			||||||
      (link (@ (rel "icon") (href ,(u (λ (v) (config-true? 'strict_proxy))
 | 
					      (link (@ (rel "icon") (href ,(u (λ (v) (config-true? 'strict_proxy))
 | 
				
			||||||
                                      (λ (v) (u-proxy-url v))
 | 
					                                      (λ (v) (u-proxy-url v))
 | 
				
			||||||
                                      (head-data^-icon-url head-data))))))
 | 
					                                      (head-data^-icon-url head-data))))))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										53
									
								
								static/countdown.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								static/countdown.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					// countdown timer for gacha enthusiasts
 | 
				
			||||||
 | 
					// sample: bandori/wiki/BanG_Dream!_Wikia
 | 
				
			||||||
 | 
					// sample: ensemble-stars/wiki/The_English_Ensemble_Stars_Wiki
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {h, htm, render, useState, useEffect, createContext, useContext, signal, computed, effect} from "./preact.js"
 | 
				
			||||||
 | 
					const html = htm.bind(h)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const now = signal(Date.now())
 | 
				
			||||||
 | 
					setInterval(() => now.value = Date.now(), 1000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const units = [
 | 
				
			||||||
 | 
						["w", 7*24*60*60*1000],
 | 
				
			||||||
 | 
						["d", 24*60*60*1000],
 | 
				
			||||||
 | 
						["h", 60*60*1000],
 | 
				
			||||||
 | 
						["m", 60*1000],
 | 
				
			||||||
 | 
						["s", 1000]
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getDisplayTime(datetime, now, or) {
 | 
				
			||||||
 | 
						let difference = datetime - now
 | 
				
			||||||
 | 
						let foundSignificantField = false
 | 
				
			||||||
 | 
						if (difference > 0) {
 | 
				
			||||||
 | 
							return units.map(([letter, duration], index) => {
 | 
				
			||||||
 | 
								const multiplier = Math.floor(difference / duration)
 | 
				
			||||||
 | 
								difference -= multiplier * duration
 | 
				
			||||||
 | 
								if (multiplier > 0 || foundSignificantField) {
 | 
				
			||||||
 | 
									foundSignificantField = true
 | 
				
			||||||
 | 
									return multiplier + letter
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}).filter(s => s).join(" ")
 | 
				
			||||||
 | 
						} else if (or) {
 | 
				
			||||||
 | 
							return or
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return `[timer ended on ${new Date(datetime).toLocaleString()}]`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Countdown(props) {
 | 
				
			||||||
 | 
						return html`<span>${props.display}</span>`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					document.querySelectorAll(".countdown").forEach(eCountdown => {
 | 
				
			||||||
 | 
						// grab information and make variables
 | 
				
			||||||
 | 
						const eDate = eCountdown.querySelector(".countdowndate")
 | 
				
			||||||
 | 
						const eOr = eCountdown.nextElementSibling
 | 
				
			||||||
 | 
						const or = eOr?.textContent
 | 
				
			||||||
 | 
						const datetime = new Date(eDate.textContent).getTime()
 | 
				
			||||||
 | 
						// the mapped signal
 | 
				
			||||||
 | 
						const display = computed(() => getDisplayTime(datetime, now.value, or))
 | 
				
			||||||
 | 
						// clear content and render
 | 
				
			||||||
 | 
						while (eDate.childNodes[0] !== undefined) eDate.childNodes[0].remove()
 | 
				
			||||||
 | 
						render(html`<${Countdown} display=${display} />`, eDate);
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue