aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFuwn <[email protected]>2023-12-17 22:15:49 -0800
committerFuwn <[email protected]>2023-12-17 22:15:49 -0800
commit5d5c42ebc2e7a51f8eaa404a46b1beb6a4c99216 (patch)
treeefd050dc167530e5e7b521834361f135b1fda4fa /src
parentfeat(settings): default to iqr median (diff)
downloaddue.moe-5d5c42ebc2e7a51f8eaa404a46b1beb6a4c99216.tar.xz
due.moe-5d5c42ebc2e7a51f8eaa404a46b1beb6a4c99216.zip
fix(activities): fill missing dates
Diffstat (limited to 'src')
-rw-r--r--src/lib/AniList/activity.ts65
-rw-r--r--src/lib/Tools/ActivityHistory.svelte7
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(