aboutsummaryrefslogtreecommitdiff
path: root/src/lib/User/BadgeWall/BadgePreview.svelte
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-10-09 00:41:20 -0700
committerFuwn <[email protected]>2024-10-09 00:41:43 -0700
commit998b63a35256ac985a5a2714dd1ca451af4dfd8a (patch)
tree50796121a9d5ab0330fdc5d7e098bda2860d9726 /src/lib/User/BadgeWall/BadgePreview.svelte
parentfeat(graphql): add badgeCount field (diff)
downloaddue.moe-998b63a35256ac985a5a2714dd1ca451af4dfd8a.tar.xz
due.moe-998b63a35256ac985a5a2714dd1ca451af4dfd8a.zip
chore(prettier): use spaces instead of tabs
Diffstat (limited to 'src/lib/User/BadgeWall/BadgePreview.svelte')
-rw-r--r--src/lib/User/BadgeWall/BadgePreview.svelte438
1 files changed, 219 insertions, 219 deletions
diff --git a/src/lib/User/BadgeWall/BadgePreview.svelte b/src/lib/User/BadgeWall/BadgePreview.svelte
index 107ed483..7a54cbc4 100644
--- a/src/lib/User/BadgeWall/BadgePreview.svelte
+++ b/src/lib/User/BadgeWall/BadgePreview.svelte
@@ -1,145 +1,145 @@
<script lang="ts">
- import { thumbnail } from '$lib/Utility/image';
- import type { Badge } from '$lib/Database/SB/User/badges';
- import { cdn } from '$lib/Utility/image';
- import { databaseTimeToDate } from '$lib/Utility/time';
- import locale from '$stores/locale';
- import { onMount } from 'svelte';
- import root from '$lib/Utility/root';
- import ParallaxImage from '$lib/Image/ParallaxImage.svelte';
-
- export let selectedBadge: Badge | undefined;
- export let onNext: () => void = () => {};
- export let onPrevious: () => void = () => {};
- export let hasNext: boolean;
- export let hasPrevious: boolean;
-
- let source = cdn(thumbnail(selectedBadge?.image || '')) || '';
- let badgeReference: HTMLImageElement;
-
- $: {
- if (selectedBadge && selectedBadge.image) {
- const image = new Image();
-
- image.src = cdn(selectedBadge.image) || '';
- image.onload = () => {
- source = image.src;
- };
- }
- }
-
- $: {
- if (selectedBadge)
- fetch(root(`/api/badges?incrementClickCount=${selectedBadge.id}`), {
- method: 'PUT'
- });
- }
-
- onMount(() => {
- badgeReference = document.querySelector('.badge-container-image') as HTMLImageElement;
-
- const handleClickOutside = (event: any) => {
- if (event.target.classList.contains('popup')) selectedBadge = undefined;
- };
-
- document.addEventListener('click', handleClickOutside);
-
- return () => {
- document.removeEventListener('click', handleClickOutside);
- };
- });
-
- const classifySource = (source: string) => {
- let name = source;
- const sourceLower = source.toLowerCase();
-
- if (sourceLower.includes('pixiv.net')) {
- name = 'Pixiv';
- } else if (sourceLower.includes('twitter.com') || sourceLower.includes('x.com')) {
- name = 'X (Twitter)';
- } else if (sourceLower.includes('zerochan.net')) {
- name = 'Zerochan';
- } else if (sourceLower.includes('imgur.com')) {
- name = 'Imgur';
- } else if (sourceLower.includes('lofter.com')) {
- name = 'Lofter';
- }
-
- return `<a href="${source}" target="_blank">${name}</a>`;
- };
-
- const classifyDesigner = (designer: string) => {
- let name = designer;
- let userLink = designer;
- const designerLower = designer.toLowerCase();
- const anilistUser = designer.match(/https?:\/\/anilist\.co\/user\/([^/]+)\/?/);
-
- if (anilistUser) {
- name = anilistUser[1];
- } else if (designerLower.startsWith('@')) {
- name = designer.replace('@', '');
- userLink = `https://anilist.co/user/${name}/`;
- } else if (!designerLower.startsWith('http')) {
- userLink = `https://anilist.co/user/${name}/`;
- }
-
- return `<a href="${userLink}" target="_blank">@${name}</a>`;
- };
-
- const onClick = (event: MouseEvent) => {
- event.preventDefault();
-
- if (
- event.clientX <
- badgeReference.getBoundingClientRect().left + badgeReference.getBoundingClientRect().width / 2
- ) {
- onPrevious();
- } else {
- onNext();
- }
- };
+ import { thumbnail } from '$lib/Utility/image';
+ import type { Badge } from '$lib/Database/SB/User/badges';
+ import { cdn } from '$lib/Utility/image';
+ import { databaseTimeToDate } from '$lib/Utility/time';
+ import locale from '$stores/locale';
+ import { onMount } from 'svelte';
+ import root from '$lib/Utility/root';
+ import ParallaxImage from '$lib/Image/ParallaxImage.svelte';
+
+ export let selectedBadge: Badge | undefined;
+ export let onNext: () => void = () => {};
+ export let onPrevious: () => void = () => {};
+ export let hasNext: boolean;
+ export let hasPrevious: boolean;
+
+ let source = cdn(thumbnail(selectedBadge?.image || '')) || '';
+ let badgeReference: HTMLImageElement;
+
+ $: {
+ if (selectedBadge && selectedBadge.image) {
+ const image = new Image();
+
+ image.src = cdn(selectedBadge.image) || '';
+ image.onload = () => {
+ source = image.src;
+ };
+ }
+ }
+
+ $: {
+ if (selectedBadge)
+ fetch(root(`/api/badges?incrementClickCount=${selectedBadge.id}`), {
+ method: 'PUT'
+ });
+ }
+
+ onMount(() => {
+ badgeReference = document.querySelector('.badge-container-image') as HTMLImageElement;
+
+ const handleClickOutside = (event: any) => {
+ if (event.target.classList.contains('popup')) selectedBadge = undefined;
+ };
+
+ document.addEventListener('click', handleClickOutside);
+
+ return () => {
+ document.removeEventListener('click', handleClickOutside);
+ };
+ });
+
+ const classifySource = (source: string) => {
+ let name = source;
+ const sourceLower = source.toLowerCase();
+
+ if (sourceLower.includes('pixiv.net')) {
+ name = 'Pixiv';
+ } else if (sourceLower.includes('twitter.com') || sourceLower.includes('x.com')) {
+ name = 'X (Twitter)';
+ } else if (sourceLower.includes('zerochan.net')) {
+ name = 'Zerochan';
+ } else if (sourceLower.includes('imgur.com')) {
+ name = 'Imgur';
+ } else if (sourceLower.includes('lofter.com')) {
+ name = 'Lofter';
+ }
+
+ return `<a href="${source}" target="_blank">${name}</a>`;
+ };
+
+ const classifyDesigner = (designer: string) => {
+ let name = designer;
+ let userLink = designer;
+ const designerLower = designer.toLowerCase();
+ const anilistUser = designer.match(/https?:\/\/anilist\.co\/user\/([^/]+)\/?/);
+
+ if (anilistUser) {
+ name = anilistUser[1];
+ } else if (designerLower.startsWith('@')) {
+ name = designer.replace('@', '');
+ userLink = `https://anilist.co/user/${name}/`;
+ } else if (!designerLower.startsWith('http')) {
+ userLink = `https://anilist.co/user/${name}/`;
+ }
+
+ return `<a href="${userLink}" target="_blank">@${name}</a>`;
+ };
+
+ const onClick = (event: MouseEvent) => {
+ event.preventDefault();
+
+ if (
+ event.clientX <
+ badgeReference.getBoundingClientRect().left + badgeReference.getBoundingClientRect().width / 2
+ ) {
+ onPrevious();
+ } else {
+ onNext();
+ }
+ };
</script>
{#if selectedBadge}
- <div class="badge-preview">
- <div class="badge-preview-badge">
- {#if selectedBadge.image}
- <div role="img" class="badge-container">
- <a href={'#'} on:click={onClick} class="badge-container-image">
- <ParallaxImage
- {source}
- alternativeText="selectedBadge.description"
- limit={100}
- duration={1500}
- />
- </a>
- </div>
-
- <p />
- {/if}
- </div>
-
- <div class="badge-preview-information">
- {#if selectedBadge.time}
- {$locale().dateFormatter(databaseTimeToDate(selectedBadge.time))}
-
- {#if (selectedBadge.designer || selectedBadge.source || selectedBadge.post) && !selectedBadge.description}
- <p />
- {:else if selectedBadge.description}
- <br />
- {/if}
- {/if}
-
- {#if selectedBadge.description}
- {selectedBadge.description}
-
- <p />
- {/if}
-
- {#if selectedBadge.designer}
- <b>Designer:</b>
-
- <!-- {#if selectedBadge.designer.startsWith('http')}
+ <div class="badge-preview">
+ <div class="badge-preview-badge">
+ {#if selectedBadge.image}
+ <div role="img" class="badge-container">
+ <a href={'#'} on:click={onClick} class="badge-container-image">
+ <ParallaxImage
+ {source}
+ alternativeText="selectedBadge.description"
+ limit={100}
+ duration={1500}
+ />
+ </a>
+ </div>
+
+ <p />
+ {/if}
+ </div>
+
+ <div class="badge-preview-information">
+ {#if selectedBadge.time}
+ {$locale().dateFormatter(databaseTimeToDate(selectedBadge.time))}
+
+ {#if (selectedBadge.designer || selectedBadge.source || selectedBadge.post) && !selectedBadge.description}
+ <p />
+ {:else if selectedBadge.description}
+ <br />
+ {/if}
+ {/if}
+
+ {#if selectedBadge.description}
+ {selectedBadge.description}
+
+ <p />
+ {/if}
+
+ {#if selectedBadge.designer}
+ <b>Designer:</b>
+
+ <!-- {#if selectedBadge.designer.startsWith('http')}
<a href={selectedBadge.designer} target="_blank">
{selectedBadge.designer}
</a>
@@ -150,96 +150,96 @@
{:else}
{selectedBadge.designer}
{/if} -->
- {@html classifyDesigner(selectedBadge.designer)}
+ {@html classifyDesigner(selectedBadge.designer)}
- <br />
- {/if}
+ <br />
+ {/if}
- {#if selectedBadge.post && selectedBadge.post !== '#'}
- <b>{selectedBadge.post.includes('forum') ? 'Forum' : 'Activity'}:</b>
+ {#if selectedBadge.post && selectedBadge.post !== '#'}
+ <b>{selectedBadge.post.includes('forum') ? 'Forum' : 'Activity'}:</b>
- <a href={selectedBadge.post} target="_blank">
- {selectedBadge.post}
- </a>
+ <a href={selectedBadge.post} target="_blank">
+ {selectedBadge.post}
+ </a>
- <br />
- {/if}
+ <br />
+ {/if}
- {#if selectedBadge.source}
- <b>Source:</b>
+ {#if selectedBadge.source}
+ <b>Source:</b>
- {#if selectedBadge.source.startsWith('http')}
- <!-- <a href={selectedBadge.source} target="_blank">
+ {#if selectedBadge.source.startsWith('http')}
+ <!-- <a href={selectedBadge.source} target="_blank">
{selectedBadge.source}
</a> -->
- {@html classifySource(selectedBadge.source)}
- {:else}
- {selectedBadge.source}
- {/if}
-
- <br />
- {/if}
-
- {#if selectedBadge.category}
- <b>Category:</b>
-
- <a
- href={`?category=${selectedBadge.category}`}
- on:click={() => (selectedBadge = undefined)}
- >
- {selectedBadge.category}
- </a>
-
- <br />
- {/if}
-
- <b>SauceNAO:</b>
- <a href={`https://saucenao.com/search.php?url=${selectedBadge.image}`} target="_blank">
- Search
- </a>
-
- <div class="badge-preview-seek">
- {#if hasPrevious}
- <button on:click={onPrevious}>Previous</button>
- {/if}
-
- {#if hasNext}
- <button on:click={onNext} style="float: right;">Next</button>
- {/if}
- </div>
- </div>
- </div>
+ {@html classifySource(selectedBadge.source)}
+ {:else}
+ {selectedBadge.source}
+ {/if}
+
+ <br />
+ {/if}
+
+ {#if selectedBadge.category}
+ <b>Category:</b>
+
+ <a
+ href={`?category=${selectedBadge.category}`}
+ on:click={() => (selectedBadge = undefined)}
+ >
+ {selectedBadge.category}
+ </a>
+
+ <br />
+ {/if}
+
+ <b>SauceNAO:</b>
+ <a href={`https://saucenao.com/search.php?url=${selectedBadge.image}`} target="_blank">
+ Search
+ </a>
+
+ <div class="badge-preview-seek">
+ {#if hasPrevious}
+ <button on:click={onPrevious}>Previous</button>
+ {/if}
+
+ {#if hasNext}
+ <button on:click={onNext} style="float: right;">Next</button>
+ {/if}
+ </div>
+ </div>
+ </div>
{/if}
<style>
- :global(.badge-preview img) {
- border-radius: 8px;
- max-height: 50vh;
- height: auto;
- width: 100%;
- }
-
- .badge-container {
- display: flex;
- justify-content: center;
- align-items: center;
- }
-
- .badge-preview {
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: center;
- gap: 1rem;
- }
-
- @media (max-width: 768px) {
- .badge-preview {
- flex-direction: column;
- }
- }
-
- .badge-preview-seek {
- padding-top: 2rem;
- }
+ :global(.badge-preview img) {
+ border-radius: 8px;
+ max-height: 50vh;
+ height: auto;
+ width: 100%;
+ }
+
+ .badge-container {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .badge-preview {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: center;
+ gap: 1rem;
+ }
+
+ @media (max-width: 768px) {
+ .badge-preview {
+ flex-direction: column;
+ }
+ }
+
+ .badge-preview-seek {
+ padding-top: 2rem;
+ }
</style>