From 5d5c42ebc2e7a51f8eaa404a46b1beb6a4c99216 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 17 Dec 2023 22:15:49 -0800 Subject: fix(activities): fill missing dates --- src/lib/AniList/activity.ts | 65 ++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 24 deletions(-) (limited to 'src/lib/AniList/activity.ts') diff --git a/src/lib/AniList/activity.ts b/src/lib/AniList/activity.ts index eebd81cf..1f99faca 100644 --- a/src/lib/AniList/activity.ts +++ b/src/lib/AniList/activity.ts @@ -9,37 +9,54 @@ export const fillMissingDays = ( inputActivities: ActivityHistoryEntry[], startOfYear = false ): ActivityHistoryEntry[] => { - const timezoneOffset = new Date().getTimezoneOffset() * 60 * 1000; - const activities = inputActivities; - const firstDate = startOfYear - ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0) - : new Date(activities[0].date * 1000 + timezoneOffset); - const lastDate = new Date(activities[activities.length - 1].date * 1000 + timezoneOffset); - const currentDate = firstDate; + if (inputActivities.length === 0) + return startOfYear + ? fillDateRange( + new Date(new Date().getUTCFullYear(), 0, 1), + new Date(new Date().getUTCFullYear() + 1, 0, 1) + ) + : []; - while (currentDate <= lastDate) { - const currentUnixTimestamp = currentDate.getTime(); - let found = false; + const sortedActivities = [...inputActivities].sort((a, b) => a.date - b.date); + const endDate = new Date(sortedActivities[sortedActivities.length - 1].date * 1000); - for (let i = 0; i < activities.length; i++) - if (activities[i].date * 1000 + timezoneOffset === currentUnixTimestamp) { - found = true; + endDate.setUTCDate(endDate.getUTCDate() + 1); - break; - } + return fillDateRange( + startOfYear + ? new Date(new Date().getUTCFullYear(), 0, 1) + : new Date(sortedActivities[0].date * 1000), + endDate, + sortedActivities + ); +}; + +const fillDateRange = ( + startDate: Date, + endDate: Date, + existingActivities: ActivityHistoryEntry[] = [] +): ActivityHistoryEntry[] => { + const outputActivities: ActivityHistoryEntry[] = []; - if (!found) - activities.push({ - date: currentUnixTimestamp / 1000, - amount: 0 - }); + for (let dt = new Date(startDate); dt < endDate; dt.setUTCDate(dt.getUTCDate() + 1)) { + const dateString = dt.toDateString(); - currentDate.setDate(currentDate.getDate() + 1); - } + if ( + !new Set( + existingActivities.map((activity) => new Date(activity.date * 1000).toDateString()) + ).has(dateString) + ) { + outputActivities.push({ date: Math.floor(dt.getTime() / 1000), amount: 0 }); + } else { + const activity = existingActivities.find( + (activity) => new Date(activity.date * 1000).toDateString() === dateString + ); - // activities.sort((a: { date: number }, b: { date: number }) => a.date - b.date); + if (activity) outputActivities.push(activity); + } + } - return activities; + return outputActivities; }; export const activityHistory = async ( -- cgit v1.2.3