aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-05-20 23:53:10 -0700
committerFuwn <[email protected]>2024-05-20 23:53:10 -0700
commit15e98c91124866a342b3eb491a55c6054c8ddecb (patch)
tree8b8f104aee7c9552b18fb096c50483cfb4f9be15 /src
parentfeat(skeleton): animation delay (diff)
downloaddue.moe-15e98c91124866a342b3eb491a55c6054c8ddecb.tar.xz
due.moe-15e98c91124866a342b3eb491a55c6054c8ddecb.zip
feat(badges): individual badges shadow hiding
Diffstat (limited to 'src')
-rw-r--r--src/lib/Database/userBadges.ts133
-rw-r--r--src/routes/api/badges/+server.ts232
-rw-r--r--src/routes/user/[user]/badges/+page.svelte24
3 files changed, 213 insertions, 176 deletions
diff --git a/src/lib/Database/userBadges.ts b/src/lib/Database/userBadges.ts
index 0b2e2491..c29f06d5 100644
--- a/src/lib/Database/userBadges.ts
+++ b/src/lib/Database/userBadges.ts
@@ -2,94 +2,97 @@ import { databaseTimeToDate } from '$lib/Utility/time';
import supabase from './supabase';
export interface Badge {
- post?: string;
- image?: string;
- description?: string | null;
- id?: number;
- time?: string;
- category?: string | null;
- hidden?: boolean;
- source?: string | null;
- designer?: string | null;
- shadow_hidden?: boolean;
+ post?: string;
+ image?: string;
+ description?: string | null;
+ id?: number;
+ time?: string;
+ category?: string | null;
+ hidden?: boolean;
+ source?: string | null;
+ designer?: string | null;
+ shadow_hidden?: boolean;
}
export const getUserBadges = async (userId: number): Promise<Badge[]> => {
- const { data, error } = await supabase.from('user_badges').select('*').eq('user_id', userId);
+ const { data, error } = await supabase.from('user_badges').select('*').eq('user_id', userId);
- if (error) return [];
+ if (error) return [];
- return data.sort((a, b) =>
- databaseTimeToDate((a as Badge).time ?? '').getTime() >
- databaseTimeToDate((b as Badge).time ?? '').getTime()
- ? -1
- : 1
- ) as Badge[];
+ return data.sort((a, b) =>
+ databaseTimeToDate((a as Badge).time ?? '').getTime() >
+ databaseTimeToDate((b as Badge).time ?? '').getTime()
+ ? -1
+ : 1
+ ) as Badge[];
};
export const addUserBadge = async (userId: number, badge: Badge) => {
- const { post, image, description, time, category, hidden, source, designer } = badge;
+ const { post, image, description, time, category, hidden, source, designer } = badge;
- if (post === undefined || image === undefined) return;
+ if (post === undefined || image === undefined) return;
- if (time) {
- await supabase.from('user_badges').insert({
- user_id: userId,
- post,
- image,
- description,
- time,
- category,
- hidden,
- source,
- designer
- });
- } else {
- await supabase
- .from('user_badges')
- .insert({ user_id: userId, post, image, description, category, hidden, source, designer });
- }
+ if (time) {
+ await supabase.from('user_badges').insert({
+ user_id: userId,
+ post,
+ image,
+ description,
+ time,
+ category,
+ hidden,
+ source,
+ designer
+ });
+ } else {
+ await supabase
+ .from('user_badges')
+ .insert({ user_id: userId, post, image, description, category, hidden, source, designer });
+ }
};
export const removeUserBadge = async (userId: number, id: number) => {
- if (!isNaN(id)) await supabase.from('user_badges').delete().eq('id', id).eq('user_id', userId);
+ if (!isNaN(id)) await supabase.from('user_badges').delete().eq('id', id).eq('user_id', userId);
};
export const updateUserBadge = async (userId: number, id: number, badge: Badge) => {
- if (badge.post === undefined || badge.image === undefined) return;
+ if (badge.post === undefined || badge.image === undefined) return;
- await supabase
- .from('user_badges')
- .update({
- post: badge.post,
- image: badge.image,
- description: badge.description,
- category: badge.category,
- time: badge.time,
- hidden: badge.hidden,
- source: badge.source,
- designer: badge.designer
- })
- .eq('id', id)
- .eq('user_id', userId);
+ await supabase
+ .from('user_badges')
+ .update({
+ post: badge.post,
+ image: badge.image,
+ description: badge.description,
+ category: badge.category,
+ time: badge.time,
+ hidden: badge.hidden,
+ source: badge.source,
+ designer: badge.designer
+ })
+ .eq('id', id)
+ .eq('user_id', userId);
};
export const renameCategory = async (userId: number, oldName: string, newName: string) =>
- await supabase
- .from('user_badges')
- .update({ category: newName })
- .eq('category', oldName)
- .eq('user_id', userId);
+ await supabase
+ .from('user_badges')
+ .update({ category: newName })
+ .eq('category', oldName)
+ .eq('user_id', userId);
export const removeAllUserBadges = async (userId: number) =>
- await supabase.from('user_badges').delete().eq('user_id', userId);
+ await supabase.from('user_badges').delete().eq('user_id', userId);
export const migrateCategory = async (userId: number, oldName: string, newName: string) =>
- await supabase
- .from('user_badges')
- .update({ category: newName })
- .eq('category', oldName)
- .eq('user_id', userId);
+ await supabase
+ .from('user_badges')
+ .update({ category: newName })
+ .eq('category', oldName)
+ .eq('user_id', userId);
export const setShadowHidden = async (userId: number, shadowHide: boolean) =>
- await supabase.from('user_badges').update({ shadow_hidden: shadowHide }).eq('user_id', userId);
+ await supabase.from('user_badges').update({ shadow_hidden: shadowHide }).eq('user_id', userId);
+
+export const setShadowHiddenBadge = async (userId: number, id: number, shadowHide: boolean) =>
+ await supabase.from('user_badges').update({ shadow_hidden: shadowHide }).eq('id', id).eq('user_id', userId);
diff --git a/src/routes/api/badges/+server.ts b/src/routes/api/badges/+server.ts
index cbc27520..99ba588c 100644
--- a/src/routes/api/badges/+server.ts
+++ b/src/routes/api/badges/+server.ts
@@ -1,132 +1,142 @@
import { userIdentity } from '$lib/Data/AniList/identity';
import {
- removeAllUserBadges,
- removeUserBadge,
- updateUserBadge,
- getUserBadges,
- addUserBadge,
- type Badge,
- migrateCategory,
- setShadowHidden
+ removeAllUserBadges,
+ removeUserBadge,
+ updateUserBadge,
+ getUserBadges,
+ addUserBadge,
+ type Badge,
+ migrateCategory,
+ setShadowHidden,
+ setShadowHiddenBadge
} from '$lib/Database/userBadges';
import authorisedJson from '$lib/Data/Static/authorised.json';
const unauthorised = new Response('Unauthorised', { status: 401 });
const badges = async (id: number) =>
- Response.json(await getUserBadges(id), {
- headers: {
- 'Access-Control-Allow-Origin': 'https://due.moe'
- }
- });
+ Response.json(await getUserBadges(id), {
+ headers: {
+ 'Access-Control-Allow-Origin': 'https://due.moe'
+ }
+ });
export const GET = async ({ url }) => {
- return await badges(Number(url.searchParams.get('id') || 0));
+ return await badges(Number(url.searchParams.get('id') || 0));
};
export const DELETE = async ({ url, cookies }) => {
- const userCookie = cookies.get('user');
+ const userCookie = cookies.get('user');
- if (!userCookie) return unauthorised;
+ if (!userCookie) return unauthorised;
- const user = JSON.parse(userCookie);
- const identity = await userIdentity({
- tokenType: user['token_type'],
- expiresIn: user['expires_in'],
- accessToken: user['access_token'],
- refreshToken: user['refresh_token']
- });
+ const user = JSON.parse(userCookie);
+ const identity = await userIdentity({
+ tokenType: user['token_type'],
+ expiresIn: user['expires_in'],
+ accessToken: user['access_token'],
+ refreshToken: user['refresh_token']
+ });
- if ((url.searchParams.get('prune') || 0) === 'true') {
- await removeAllUserBadges(identity.id);
- } else {
- await removeUserBadge(identity.id, Number(url.searchParams.get('id')));
- }
+ if ((url.searchParams.get('prune') || 0) === 'true') {
+ await removeAllUserBadges(identity.id);
+ } else {
+ await removeUserBadge(identity.id, Number(url.searchParams.get('id')));
+ }
- return await badges(identity.id);
+ return await badges(identity.id);
};
export const PUT = async ({ cookies, url, request }) => {
- const userCookie = cookies.get('user');
-
- if (!userCookie) return unauthorised;
-
- const user = JSON.parse(userCookie);
- const identity = await userIdentity({
- tokenType: user['token_type'],
- expiresIn: user['expires_in'],
- accessToken: user['access_token'],
- refreshToken: user['refresh_token']
- });
-
- if (url.searchParams.get('shadowHide'))
- setShadowHidden(
- Number(url.searchParams.get('shadowHide')),
- authorisedJson.includes(identity.id)
- );
-
- if (url.searchParams.get('import') || undefined) {
- await Promise.all(
- (await request.json()).map(async (badge: Badge) => await addUserBadge(identity.id, badge))
- );
-
- return await badges(identity.id);
- } else if (url.searchParams.get('migrate') || undefined) {
- await migrateCategory(
- identity.id,
- url.searchParams.get('original') || '',
- url.searchParams.get('new') || ''
- );
-
- return await badges(identity.id);
- }
-
- if (url.searchParams.get('hide') || undefined) {
- const allBadges = await getUserBadges(identity.id);
-
- await Promise.all(
- allBadges
- .filter((badge) => badge.category === (url.searchParams.get('category') || ''))
- .map(async (badge) => {
- await updateUserBadge(identity.id, badge.id as number, {
- ...badge,
- hidden:
- allBadges
- .filter((badge) => badge.category === (url.searchParams.get('category') || ''))
- .filter((badge) => badge.hidden).length >
- allBadges.filter(
- (badge) => badge.category === (url.searchParams.get('category') || '')
- ).length /
- 2
- ? false
- : true
- });
- })
- );
-
- return await badges(identity.id);
- }
-
- const badge = {
- post: url.searchParams.get('post') || undefined,
- image: url.searchParams.get('image') || undefined,
- description: url.searchParams.get('description') || null,
- time: url.searchParams.get('time') || undefined,
- category: url.searchParams.get('category') || null,
- hidden: url.searchParams.get('hidden') || false,
- source: url.searchParams.get('source') || null,
- designer: url.searchParams.get('designer') || null
- };
-
- if (
- (await getUserBadges(identity.id)).find(
- (badge) => Number(badge.id) === Number(url.searchParams.get('update'))
- )
- ) {
- await updateUserBadge(identity.id, Number(url.searchParams.get('update')), badge as Badge);
- } else {
- await addUserBadge(identity.id, badge as Badge);
- }
-
- return await badges(identity.id);
+ const userCookie = cookies.get('user');
+
+ if (!userCookie) return unauthorised;
+
+ const user = JSON.parse(userCookie);
+ const identity = await userIdentity({
+ tokenType: user['token_type'],
+ expiresIn: user['expires_in'],
+ accessToken: user['access_token'],
+ refreshToken: user['refresh_token']
+ });
+ const authorised = authorisedJson.includes(identity.id);
+
+ if (url.searchParams.get('shadowHide'))
+ setShadowHidden(
+ Number(url.searchParams.get('shadowHide')),
+ authorised
+ );
+
+ if (url.searchParams.get('import') || undefined) {
+ await Promise.all(
+ (await request.json()).map(async (badge: Badge) => await addUserBadge(identity.id, badge))
+ );
+
+ return await badges(identity.id);
+ } else if (url.searchParams.get('migrate') || undefined) {
+ await migrateCategory(
+ identity.id,
+ url.searchParams.get('original') || '',
+ url.searchParams.get('new') || ''
+ );
+
+ return await badges(identity.id);
+ }
+
+ if (url.searchParams.get('hide') || undefined) {
+ const allBadges = await getUserBadges(identity.id);
+
+ await Promise.all(
+ allBadges
+ .filter((badge) => badge.category === (url.searchParams.get('category') || ''))
+ .map(async (badge) => {
+ await updateUserBadge(identity.id, badge.id as number, {
+ ...badge,
+ hidden:
+ allBadges
+ .filter((badge) => badge.category === (url.searchParams.get('category') || ''))
+ .filter((badge) => badge.hidden).length >
+ allBadges.filter(
+ (badge) => badge.category === (url.searchParams.get('category') || '')
+ ).length /
+ 2
+ ? false
+ : true
+ });
+ })
+ );
+
+ return await badges(identity.id);
+ }
+
+ if (url.searchParams.get("shadowHideBadge") || undefined) {
+ if (!authorised) return unauthorised;
+
+ await setShadowHiddenBadge(identity.id, Number(url.searchParams.get("shadowHideBadge")), url.searchParams.get("status") == "true" ? false : true);
+
+ return await badges(identity.id);
+ }
+
+ const badge = {
+ post: url.searchParams.get('post') || undefined,
+ image: url.searchParams.get('image') || undefined,
+ description: url.searchParams.get('description') || null,
+ time: url.searchParams.get('time') || undefined,
+ category: url.searchParams.get('category') || null,
+ hidden: url.searchParams.get('hidden') || false,
+ source: url.searchParams.get('source') || null,
+ designer: url.searchParams.get('designer') || null
+ };
+
+ if (
+ (await getUserBadges(identity.id)).find(
+ (badge) => Number(badge.id) === Number(url.searchParams.get('update'))
+ )
+ ) {
+ await updateUserBadge(identity.id, Number(url.searchParams.get('update')), badge as Badge);
+ } else {
+ await addUserBadge(identity.id, badge as Badge);
+ }
+
+ return await badges(identity.id);
};
diff --git a/src/routes/user/[user]/badges/+page.svelte b/src/routes/user/[user]/badges/+page.svelte
index d81cea28..6d34a204 100644
--- a/src/routes/user/[user]/badges/+page.svelte
+++ b/src/routes/user/[user]/badges/+page.svelte
@@ -451,6 +451,17 @@
const castAsStringArray = (array: any[]) => array as string[];
const castBadgesToIndexedBadges = (array: any[]) => array as IndexedBadge[];
+
+ const shadowHideBadge = () => {
+ if (!selectedBadge && !authorised) return;
+
+ badgesPromise = fetch(
+ `/api/badges?shadowHideBadge=${selectedBadge?.id}&status=${selectedBadge?.shadow_hidden}`,
+ {
+ method: 'PUT'
+ }
+ );
+ };
</script>
<HeadTitle route={`${data.username}'s Badge Wall`} path={`/user/${data.username}`} />
@@ -826,6 +837,19 @@
Next
</button>
{/if}
+
+ {#if authorised}
+ <br />
+ <br />
+
+ <button on:click={shadowHideBadge}>
+ {#if selectedBadge && selectedBadge.shadow_hidden}
+ Un-shadow
+ {:else}
+ Shadow
+ {/if} Hide Badge ({selectedBadge ? selectedBadge.id : 0})
+ </button>
+ {/if}
</Popup>
{/if}
{:catch}