From 9ab94f20c200f7e79297b9cbb7d654b8fba67115 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Tue, 2 Apr 2024 22:28:14 -0700 Subject: feat(badges): custom css --- src/lib/Database/userPreferences.ts | 17 +- src/routes/api/preferences/+server.ts | 31 +- src/routes/user/[user]/+page.svelte | 17 + src/routes/user/[user]/badges/+page.svelte | 495 +++++++++++++++-------------- src/styles/input.css | 6 +- 5 files changed, 319 insertions(+), 247 deletions(-) diff --git a/src/lib/Database/userPreferences.ts b/src/lib/Database/userPreferences.ts index aed74e16..b2cc82f2 100644 --- a/src/lib/Database/userPreferences.ts +++ b/src/lib/Database/userPreferences.ts @@ -7,12 +7,14 @@ export interface UserPreferences { pinned_hololive_streams: string[]; hide_missing_badges: boolean; biography: string | null; + badge_wall_css: string; } interface NewUserPreferences { updated_at?: string; pinned_hololive_streams?: string[]; hide_missing_badges?: boolean; + badge_wall_css?: string; } export const getUserPreferences = async (userId: number) => { @@ -35,7 +37,9 @@ export const setUserPreferences = async (userId: number, preferences: NewUserPre preferences.pinned_hololive_streams || (userPreferences ? userPreferences.pinned_hololive_streams : []), hide_missing_badges: preferences.hide_missing_badges || false, - biography: userPreferences ? userPreferences.biography : null + biography: userPreferences ? userPreferences.biography : null, + badge_wall_css: + preferences.badge_wall_css || (userPreferences ? userPreferences.badge_wall_css : '') }, { onConflict: 'user_id' } ) @@ -73,3 +77,14 @@ export const toggleHideMissingBadges = async (userId: number) => { hide_missing_badges: userPreferences ? !userPreferences.hide_missing_badges : false }); }; + +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 + }); +}; diff --git a/src/routes/api/preferences/+server.ts b/src/routes/api/preferences/+server.ts index c69b4096..2d51c87a 100644 --- a/src/routes/api/preferences/+server.ts +++ b/src/routes/api/preferences/+server.ts @@ -1,4 +1,7 @@ -import { getUserPreferences, toggleHideMissingBadges } from '$lib/Database/userPreferences'; +import { userIdentity } from '$lib/Data/AniList/identity'; +import { getUserPreferences, toggleHideMissingBadges, setCSS } from '$lib/Database/userPreferences'; + +const unauthorised = new Response('Unauthorised', { status: 401 }); export const GET = async ({ url }) => { const preferences = await getUserPreferences(Number(url.searchParams.get('id') || 0)); @@ -10,9 +13,31 @@ export const GET = async ({ url }) => { }); }; -export const PUT = async ({ url }) => { +export const PUT = async ({ url, cookies, request }) => { + const userCookie = cookies.get('user'); + + if (!userCookie) return unauthorised; + + const user = JSON.parse(userCookie); + const userId = ( + await userIdentity({ + tokenType: user['token_type'], + expiresIn: user['expires_in'], + accessToken: user['access_token'], + refreshToken: user['refresh_token'] + }) + ).id; + if (url.searchParams.get('toggleHideMissingBadges') !== null) { - return Response.json(await toggleHideMissingBadges(Number(url.searchParams.get('id') || 0)), { + return Response.json(await toggleHideMissingBadges(userId), { + headers: { + 'Access-Control-Allow-Origin': 'https://due.moe' + } + }); + } + + if (url.searchParams.get('badgeWallCSS') !== null) { + return Response.json(await setCSS(userId, await request.text()), { headers: { 'Access-Control-Allow-Origin': 'https://due.moe' } diff --git a/src/routes/user/[user]/+page.svelte b/src/routes/user/[user]/+page.svelte index d725ad78..28e5fa7d 100644 --- a/src/routes/user/[user]/+page.svelte +++ b/src/routes/user/[user]/+page.svelte @@ -58,6 +58,9 @@ .then((JSONpreferences) => (preferences = JSONpreferences)); } + const getBadgeWallCSS = () => + (document.getElementById('badgeWallCSS') as HTMLTextAreaElement).value; + // 8.5827814569536423841e0 @@ -198,6 +201,20 @@ /> {$locale().user.preferences.hideMissingBadges.title} {$locale().user.preferences.hideMissingBadges.hint} + +

+ + Badge Wall Custom CSS + +