From 4f07a27df74775e35775d34e800abfd683c5fa86 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 17 Feb 2024 21:50:17 -0800 Subject: feat(badges): optionally hide missing badges --- src/lib/Database/userPreferences.ts | 12 + src/lib/FallbackBadge.svelte | 69 ++++ src/lib/FallbackImage.svelte | 3 +- src/routes/api/preferences/+server.ts | 18 +- src/routes/api/preferences/badges/+server.ts | 31 ++ src/routes/user/[user]/+page.svelte | 24 ++ src/routes/user/[user]/badges/+page.svelte | 454 ++++++++++++++------------- 7 files changed, 387 insertions(+), 224 deletions(-) create mode 100644 src/lib/FallbackBadge.svelte create mode 100644 src/routes/api/preferences/badges/+server.ts diff --git a/src/lib/Database/userPreferences.ts b/src/lib/Database/userPreferences.ts index ca872ea5..988ca0c0 100644 --- a/src/lib/Database/userPreferences.ts +++ b/src/lib/Database/userPreferences.ts @@ -61,3 +61,15 @@ export const toggleHololiveStreamPinning = async (userId: number, streamId: stri hide_missing_badges: userPreferences.hide_missing_badges }); }; + +export const toggleHideMissingBadges = async (userId: number) => { + const userPreferences = await getUserPreferences(userId); + + if (!userPreferences) return null; + + return await setUserPreferences(userId, { + updated_at: new Date().toISOString(), + pinned_hololive_streams: userPreferences.pinned_hololive_streams, + hide_missing_badges: !userPreferences.hide_missing_badges + }); +}; diff --git a/src/lib/FallbackBadge.svelte b/src/lib/FallbackBadge.svelte new file mode 100644 index 00000000..faa021d4 --- /dev/null +++ b/src/lib/FallbackBadge.svelte @@ -0,0 +1,69 @@ + + +{#if replaceCount < maxReplaceCount} + + {alternative} delayedReplace(e, fallback)} + /> + +{:else if !hideOnError} + Not found +{/if} + + diff --git a/src/lib/FallbackImage.svelte b/src/lib/FallbackImage.svelte index 4a53698d..0ea49c6c 100644 --- a/src/lib/FallbackImage.svelte +++ b/src/lib/FallbackImage.svelte @@ -5,6 +5,7 @@ export let maxReplaceCount = 1; export let replaceDelay = 1000; export let error = 'https://i2.kym-cdn.com/photos/images/newsfeed/000/290/992/0aa.jpg'; + export let hideOnError = false; let replaceCount = 0; @@ -27,7 +28,7 @@ class="badge" on:error={(e) => delayedReplace(e, fallback)} /> -{:else} +{:else if !hideOnError} Not found {/if} diff --git a/src/routes/api/preferences/+server.ts b/src/routes/api/preferences/+server.ts index a36bd236..0aaaa52e 100644 --- a/src/routes/api/preferences/+server.ts +++ b/src/routes/api/preferences/+server.ts @@ -1,4 +1,4 @@ -import { getUserPreferences } from '$lib/Database/userPreferences'; +import { getUserPreferences, toggleHideMissingBadges } from '$lib/Database/userPreferences'; export const GET = async ({ url }) => Response.json(await getUserPreferences(Number(url.searchParams.get('id') || 0)), { @@ -6,3 +6,19 @@ export const GET = async ({ url }) => 'Access-Control-Allow-Origin': 'https://due.moe' } }); + +export const PUT = async ({ url }) => { + if (url.searchParams.get('toggleHideMissingBadges') !== null) { + return Response.json(await toggleHideMissingBadges(Number(url.searchParams.get('id') || 0)), { + headers: { + 'Access-Control-Allow-Origin': 'https://due.moe' + } + }); + } + + return Response.json(await getUserPreferences(Number(url.searchParams.get('id') || 0)), { + headers: { + 'Access-Control-Allow-Origin': 'https://due.moe' + } + }); +}; diff --git a/src/routes/api/preferences/badges/+server.ts b/src/routes/api/preferences/badges/+server.ts new file mode 100644 index 00000000..24d4924b --- /dev/null +++ b/src/routes/api/preferences/badges/+server.ts @@ -0,0 +1,31 @@ +import { userIdentity } from '$lib/Data/AniList/identity'; +import { toggleHideMissingBadges } from '$lib/Database/userPreferences'; + +const unauthorised = new Response('Unauthorised', { status: 401 }); + +export const PUT = async ({ cookies }) => { + const userCookie = cookies.get('user'); + + if (!userCookie) return unauthorised; + + const user = JSON.parse(userCookie); + + return Response.json( + await toggleHideMissingBadges( + ( + await userIdentity({ + tokenType: user['token_type'], + expiresIn: user['expires_in'], + accessToken: user['access_token'], + refreshToken: user['refresh_token'] + }) + ).id + ), + { + headers: { + method: 'PUT', + 'Access-Control-Allow-Origin': 'https://due.moe' + } + } + ); +}; diff --git a/src/routes/user/[user]/+page.svelte b/src/routes/user/[user]/+page.svelte index 4103b7de..c93647f4 100644 --- a/src/routes/user/[user]/+page.svelte +++ b/src/routes/user/[user]/+page.svelte @@ -10,6 +10,7 @@ import authorisedUsers from '$lib/Data/Static/authorised.json'; import tooltip from '$lib/Tooltip/tooltip.js'; import AnimeRateLimited from '$lib/Error/AnimeRateLimited.svelte'; + import identity from '$stores/identity'; export let data; @@ -120,6 +121,29 @@ {/if} + + {#if userData && userData.id === $identity.id} + {#await fetch(root(`/api/preferences?id=${userData.id}`)) then rawPreferences} + {#await rawPreferences.json() then preferences} +

+ +

+ User Preferences + + { + if (userData) + fetch(root(`/api/preferences?id=${userData.id}&toggleHideMissingBadges`), { + method: 'PUT' + }); + }} + checked={preferences.hide_missing_badges} + /> Hide missing badges from Badge Wall +
+ {/await} + {/await} + {/if} {/if}