feat: implement generic <Avatar> component

This commit is contained in:
Twig 2025-07-14 21:39:00 +02:00
parent f4ddcf9d8d
commit f98e8c6110
No known key found for this signature in database
5 changed files with 82 additions and 6 deletions

37
components/Avatar.vue Normal file
View file

@ -0,0 +1,37 @@
<template>
<Icon v-if="canvasBlocked"
name="lucide:user" />
<NuxtImg v-else
:src="displayAvatar"
:alt="displayName" />
</template>
<script lang="ts" setup>
import { NuxtImg } from '#components';
import type { GuildMemberResponse, UserResponse } from '~/types/interfaces';
const props = defineProps<{
user?: UserResponse,
member?: GuildMemberResponse,
}>();
let displayName: string
let displayAvatar: string
let canvasBlocked = false
const user = props.user || props.member?.user
if (user) {
displayName = props.member?.nickname
|| user.display_name
|| user.username
if (user.avatar) {
displayAvatar = user.avatar
} else {
displayAvatar = generateDefaultIcon(displayName, user.uuid)
}
}
</script>

View file

@ -1,8 +1,8 @@
<template>
<NuxtLink class="user-item" :href="`/me/${user.uuid}`" tabindex="0">
<img v-if="props.user.avatar" class="user-avatar" :src="props.user.avatar" :alt="props.user.display_name ?? props.user.username" />
<Icon v-else class="user-avatar" name="lucide:user" />
<span class="user-display-name">{{ props.user.display_name || props.user.username }}</span>
<Avatar :user="props.user" class="user-avatar"/>
<span class="user-display-name">{{ displayName }}</span>
</NuxtLink>
</template>
@ -12,6 +12,8 @@ import type { UserResponse } from '~/types/interfaces';
const props = defineProps<{
user: UserResponse
}>();
const displayName = props.user.display_name || props.user.username
</script>
<style>

View file

@ -1,7 +1,6 @@
<template>
<div id="profile-popup">
<img v-if="props.user.avatar" id="avatar" :src="props.user.avatar" alt="profile avatar">
<Icon v-else id="avatar" name="lucide:user" />
<Avatar :user="props.user" id="avatar"/>
<div id="cover-color"></div>
<div id="main-body">