From ae074b7dfeb2265fcaf2ac69692362b133f4069e Mon Sep 17 00:00:00 2001
From: Fuwn <contact@fuwn.net>
Date: Tue, 28 Apr 2026 05:32:28 -0700
Subject: refactor(airing): unify countdown formatter into shared helper

---
 src/lib/Media/Anime/Airing/AiringTime.svelte | 61 ++--------------------------
 1 file changed, 4 insertions(+), 57 deletions(-)

(limited to 'src/lib/Media/Anime/Airing/AiringTime.svelte')

diff --git a/src/lib/Media/Anime/Airing/AiringTime.svelte b/src/lib/Media/Anime/Airing/AiringTime.svelte
index 02e80d1f..6553c769 100644
--- a/src/lib/Media/Anime/Airing/AiringTime.svelte
+++ b/src/lib/Media/Anime/Airing/AiringTime.svelte
@@ -5,6 +5,7 @@ import type { MediaPrequel } from "$lib/Data/AniList/prequels";
 import tooltip from "$lib/Tooltip/tooltip";
 import locale from "$stores/locale";
 import airingNow from "$stores/airingNow";
+import { formatCountdown } from "./format";
 
 export let originalAnime: Media;
 export let upcoming = false;
@@ -25,8 +26,6 @@ const setAiringTime = () => {
 	const untilAiring = airingAt
 		? Math.round((airingAt - $airingNow / 1000) * 100) / 100
 		: undefined;
-	let hours = null;
-	const shortenCountdown = $settings.displayShortCountdown;
 
 	time = new Date(airingAt ? airingAt * 1000 : 0).toLocaleTimeString([], {
 		hour12: !$settings.display24HourTime,
@@ -49,62 +48,10 @@ const setAiringTime = () => {
 		).toLocaleDateString()}</span>`;
 
 	if (untilAiring !== undefined) {
-		let minutes = Math.round(untilAiring / 60);
-
-		few = true;
-
-		if (minutes > 60) {
-			hours = minutes / 60;
-
-			if (hours > 24) {
-				const totalHours = Math.round(hours);
-				const days = Math.floor(totalHours / 24);
-				const residualHours = totalHours % 24;
-				const weeks = Math.floor(days / 7);
-				const residualDays = days % 7;
-
-				few = false;
-
-				if (weeks >= 1.5) {
-					timeFrame = `${weeks}${shortenCountdown ? "w" : " week"}${
-						weeks === 1 || shortenCountdown ? "" : "s"
-					}`;
-
-					if (residualDays > 0)
-						timeFrame += `${shortenCountdown ? "" : " "}${residualDays}${
-							shortenCountdown ? "d" : " day"
-						}${residualDays === 1 || shortenCountdown ? "" : "s"}`;
-				} else {
-					timeFrame += `${days}${shortenCountdown ? "d" : " day"}${
-						days === 1 || shortenCountdown ? "" : "s"
-					}`;
-				}
-
-				if (residualHours > 0)
-					timeFrame += `${shortenCountdown ? "" : " "}${residualHours}${
-						shortenCountdown ? "h" : " hour"
-					}${residualHours === 1 || shortenCountdown ? "" : "s"}`;
-			} else {
-				const displayHours = Math.floor(minutes / 60);
-				const residualMinutes = minutes % 60;
-
-				timeFrame += `${displayHours}${shortenCountdown ? "h" : " hour"}${
-					displayHours === 1 || shortenCountdown ? "" : "s"
-				}`;
-
-				if (residualMinutes > 0)
-					timeFrame += `${shortenCountdown ? "" : " "}${residualMinutes}${
-						shortenCountdown ? "m" : " minute"
-					}${residualMinutes === 1 || shortenCountdown ? "" : "s"}`;
-			}
-		} else {
-			minutes = Math.round(minutes);
-
-			timeFrame += `${minutes}${shortenCountdown ? "m" : "  minute"}${
-				minutes === 1 || shortenCountdown ? "" : "s"
-			}`;
-		}
+		const formatted = formatCountdown(untilAiring);
 
+		timeFrame = formatted.text;
+		few = formatted.few;
 		opacity = Math.max(50, 100 - (untilAiring / 60 / 60 / 24 / 7) * 50);
 		dateString = $locale().dateFormatter(
 			new Date(airingAt ? airingAt * 1000 : 0),
-- 
cgit v1.2.3

