diff options
| author | Fuwn <[email protected]> | 2023-12-17 22:15:49 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2023-12-17 22:15:49 -0800 |
| commit | 5d5c42ebc2e7a51f8eaa404a46b1beb6a4c99216 (patch) | |
| tree | efd050dc167530e5e7b521834361f135b1fda4fa /src | |
| parent | feat(settings): default to iqr median (diff) | |
| download | due.moe-5d5c42ebc2e7a51f8eaa404a46b1beb6a4c99216.tar.xz due.moe-5d5c42ebc2e7a51f8eaa404a46b1beb6a4c99216.zip | |
fix(activities): fill missing dates
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/AniList/activity.ts | 65 | ||||
| -rw-r--r-- | src/lib/Tools/ActivityHistory.svelte | 7 |
2 files changed, 45 insertions, 27 deletions
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 ( diff --git a/src/lib/Tools/ActivityHistory.svelte b/src/lib/Tools/ActivityHistory.svelte index c6f29028..17067ec4 100644 --- a/src/lib/Tools/ActivityHistory.svelte +++ b/src/lib/Tools/ActivityHistory.svelte @@ -87,10 +87,11 @@ {#if activities === undefined} Loading ... {:else} - {@const highestActivity = Math.max(...activities.map((activity) => activity.amount))} + {@const filledActivities = fillMissingDays(activities)} + {@const highestActivity = Math.max(...filledActivities.map((activity) => activity.amount))} <div class="grid"> - {#each activities as activity} + {#each filledActivities as activity} <div class="grid-item" style="background-color: {gradientColour(activity.amount, highestActivity, baseHue)}" @@ -123,7 +124,7 @@ </summary> <ul> - {#each fillMissingDays(activities) as activity} + {#each filledActivities as activity} {#if activity.amount === 0} <li> {new Date( |