Skip to content

Commit 2cecdc5

Browse files
Dynamically fetch user avatars.
1 parent 2b56457 commit 2cecdc5

File tree

4 files changed

+34
-6
lines changed

4 files changed

+34
-6
lines changed

components/members/MemberCard.vue

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div :class="`w-2/3 md:w-1/3 lg:w-1/4 2xl:w-1/5 p-4 flex unity-button rounded-2xl border-[1px] m-0.5 ${isLive ? 'saturate-100' : 'saturate-80 dark:saturate-70'} ${isLive ? 'brightness-100' : 'brightness-90 dark:brightness-70'} transition-all hover:saturate-100 hover:brightness-[110%]`" :style="borderStyle" :title="member.id">
3-
<img class="rounded-lg h-12" :src="`/img/creators/${member.id}.webp`" :alt="member.name">
3+
<img class="rounded-lg h-12" :src="status == 'error' ? `/img/creators/${member.id}.webp` : avatar" :alt="member.name">
44
<div class="px-4">
55
<span :style="`color: ${faction.color}`" class="font-medium text-shadow-sm not-dark:brightness-80">{{ member.name }}</span>
66
&nbsp;
@@ -22,12 +22,12 @@
2222
2323
import type { Member } from "~/types/Member";
2424
import type { Factions } from "~/types/Factions";
25+
import type { SocialsString } from "~/types/Socials";
2526
2627
import SocialGlyph from "~/components/members/SocialGlyph.vue";
2728
2829
import members from '~/assets/members.json';
2930
import factions from '~/assets/factions.json';
30-
import type {SocialsString} from "~/types/Socials";
3131
3232
const props = defineProps({
3333
id: String,
@@ -37,6 +37,11 @@
3737
const member = ref((members as Array<Member>).find(member => member.id == props.id)!);
3838
const faction = ref((factions as Factions)[member.value.faction])
3939
40+
const { status, data: fetch_avatar } = await useLazyFetch(`/api/fetch_avatar?id=${props.id}`);
41+
const avatar = ref(fetch_avatar)
42+
43+
watch(fetch_avatar, newAvatar => avatar.value = newAvatar)
44+
4045
//borderStyle: !!this.live ? `background: linear-gradient(var(--text-buttons), var(--text-buttons)) padding-box, linear-gradient(to right, var(--bg-live) 0%, ${faction.color} 70%) border-box; border-width: 1px; border-style: solid; border-color: transparent;` : `border-color: ${faction.color}`
4146
const borderStyle = ref(`border-color: ${faction.value.color};`)
4247
</script>

pages/index.vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,7 @@ const members = ref(membersData.filter(a => !a.faction.startsWith('unity_team'))
4848
const { status, data: check_live } = await useLazyFetch('/api/check_live')
4949
const live = ref(check_live)
5050
51-
watch(check_live, (newLive) => {
52-
live.value = newLive
53-
})
51+
watch(check_live, newLive => live.value = newLive)
5452
5553
function sortGroup(group, member) {
5654
switch (member.faction) {

server/api/check_live.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import fs from 'fs';
21
import TwitchAuth from '../utils/TwitchAuth';
32
import TwitchRest from '../utils/TwitchRest';
43

server/api/fetch_avatar.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import TwitchAuth from "~/server/utils/TwitchAuth";
2+
import TwitchRest from "~/server/utils/TwitchRest";
3+
4+
const auth = new TwitchAuth()
5+
6+
export default defineEventHandler(async event => {
7+
const query = getQuery(event)
8+
9+
if (query['id'] == null) {
10+
event.node.res.statusCode = 400
11+
return "Invalid ID"
12+
}
13+
14+
const url = `https://api.twitch.tv/helix/users?login=${query.id}`
15+
const response = await TwitchRest.get(url);
16+
17+
if (!!response) {
18+
if (response.data.length == 0) {
19+
event.node.res.statusCode = 400
20+
return `Twitch did not return anything for "${query.id}"`
21+
}
22+
23+
event.node.res.statusCode = 200
24+
return response.data[0].profile_image_url
25+
}
26+
})

0 commit comments

Comments
 (0)