aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Database/SB/User
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-03-28 06:06:14 +0000
committerFuwn <[email protected]>2026-03-28 06:09:19 +0000
commit4a1d48468b1097ad5d44efdd95556d3213da610e (patch)
tree65d8fc91e9ef37a5e04f2ece31f38d413e0b3fcd /src/lib/Database/SB/User
parentfix(auth): ignore malformed user cookies (diff)
downloaddue.moe-4a1d48468b1097ad5d44efdd95556d3213da610e.tar.xz
due.moe-4a1d48468b1097ad5d44efdd95556d3213da610e.zip
fix(preferences): preserve partial preference updates
Diffstat (limited to 'src/lib/Database/SB/User')
-rw-r--r--src/lib/Database/SB/User/preferences.ts70
1 files changed, 26 insertions, 44 deletions
diff --git a/src/lib/Database/SB/User/preferences.ts b/src/lib/Database/SB/User/preferences.ts
index fcffbff2..d1f03ee8 100644
--- a/src/lib/Database/SB/User/preferences.ts
+++ b/src/lib/Database/SB/User/preferences.ts
@@ -22,6 +22,15 @@ interface NewUserPreferences {
pinned_badge_wall_categories?: string[];
}
+const defaultPreferences = {
+ pinned_hololive_streams: [],
+ hide_missing_badges: false,
+ biography: null,
+ badge_wall_css: "",
+ hide_awc_badges: false,
+ pinned_badge_wall_categories: [],
+} satisfies Omit<UserPreferences, "created_at" | "updated_at" | "user_id">;
+
export const getUserPreferences = async (userId: number) => {
const { data, error } = await sb
.from("user_preferences")
@@ -38,26 +47,27 @@ export const setUserPreferences = async (
preferences: NewUserPreferences,
) => {
const userPreferences = await getUserPreferences(userId);
+ const currentPreferences = userPreferences ?? defaultPreferences;
const { data, error } = await sb
.from("user_preferences")
.upsert(
{
user_id: userId,
- updated_at: preferences.updated_at || new Date().toISOString(),
+ updated_at: preferences.updated_at ?? new Date().toISOString(),
pinned_hololive_streams:
- preferences.pinned_hololive_streams ||
- (userPreferences ? userPreferences.pinned_hololive_streams : []),
- hide_missing_badges: preferences.hide_missing_badges || false,
- biography:
- preferences.biography ||
- (userPreferences ? userPreferences.biography : null),
+ preferences.pinned_hololive_streams ??
+ currentPreferences.pinned_hololive_streams,
+ hide_missing_badges:
+ preferences.hide_missing_badges ??
+ currentPreferences.hide_missing_badges,
+ biography: preferences.biography ?? currentPreferences.biography,
badge_wall_css:
- preferences.badge_wall_css ||
- (userPreferences ? userPreferences.badge_wall_css : ""),
- hide_awc_badges: preferences.hide_awc_badges || false,
+ preferences.badge_wall_css ?? currentPreferences.badge_wall_css,
+ hide_awc_badges:
+ preferences.hide_awc_badges ?? currentPreferences.hide_awc_badges,
pinned_badge_wall_categories:
- preferences.pinned_badge_wall_categories ||
- (userPreferences ? userPreferences.pinned_badge_wall_categories : ""),
+ preferences.pinned_badge_wall_categories ??
+ currentPreferences.pinned_badge_wall_categories,
},
{ onConflict: "user_id" },
)
@@ -94,12 +104,9 @@ export const toggleHideMissingBadges = async (userId: number) => {
return await setUserPreferences(userId, {
updated_at: new Date().toISOString(),
- pinned_hololive_streams: userPreferences
- ? userPreferences.pinned_hololive_streams
- : [],
hide_missing_badges: userPreferences
? !userPreferences.hide_missing_badges
- : false,
+ : true,
});
};
@@ -108,40 +115,21 @@ export const toggleHideAWCBadges = async (userId: number) => {
return await setUserPreferences(userId, {
updated_at: new Date().toISOString(),
- hide_awc_badges: userPreferences ? !userPreferences.hide_awc_badges : false,
+ hide_awc_badges: userPreferences ? !userPreferences.hide_awc_badges : true,
});
};
export const setCSS = async (userId: number, css: string) => {
- const userPreferences = await getUserPreferences(userId);
-
return await setUserPreferences(userId, {
updated_at: new Date().toISOString(),
- pinned_hololive_streams: userPreferences
- ? userPreferences.pinned_hololive_streams
- : [],
- hide_missing_badges: userPreferences
- ? userPreferences.hide_missing_badges
- : false,
- badge_wall_css:
- css ||
- "/* Use classes and IDs such as .badges, #badges, .badge, or standard elements like body and details, or anything, as long as it's valid CSS! */",
+ badge_wall_css: css,
});
};
export const setBiography = async (userId: number, biography: string) => {
- const userPreferences = await getUserPreferences(userId);
-
return await setUserPreferences(userId, {
updated_at: new Date().toISOString(),
- pinned_hololive_streams: userPreferences
- ? userPreferences.pinned_hololive_streams
- : [],
- hide_missing_badges: userPreferences
- ? userPreferences.hide_missing_badges
- : false,
- badge_wall_css: userPreferences ? userPreferences.badge_wall_css : "",
- biography: biography || "\n",
+ biography,
});
};
@@ -161,9 +149,6 @@ export const togglePinnedBadgeWallCategory = async (
return await setUserPreferences(userId, {
updated_at: new Date().toISOString(),
- pinned_hololive_streams: userPreferences.pinned_hololive_streams,
- hide_missing_badges: userPreferences.hide_missing_badges,
- badge_wall_css: userPreferences.badge_wall_css,
pinned_badge_wall_categories: pinnedCategories,
});
};
@@ -178,9 +163,6 @@ export const setPinnedBadgeWallCategories = async (
return await setUserPreferences(userId, {
updated_at: new Date().toISOString(),
- pinned_hololive_streams: userPreferences.pinned_hololive_streams,
- hide_missing_badges: userPreferences.hide_missing_badges,
- badge_wall_css: userPreferences.badge_wall_css,
pinned_badge_wall_categories: categories,
});
};