throw new Error("Failed to load user")
}
}
+
+export async function fetchUser(username: string): Promise<User> {
+ const response = await api.get(`/v1/users/${username}`);
+ return response.data as User;
+}
+
+export function makeAvatarUrl(user: User, size: number): string | undefined {
+ const url = URL.parse(user.avatar_url);
+ if (!url)
+ return undefined;
+
+ // Add the size argument
+ url.searchParams.set("size", `${size}`);
+
+ // Return the URL as string
+ return url.toString();
+}
+
+export function makeAvatarUrls(user: User, size: number): string | undefined {
+ const multipliers = [2, 3];
+ const sources = [];
+
+ for (const multiplier of multipliers) {
+ let source = makeAvatarUrl(user, size * multiplier);
+ if (!source)
+ continue;
+
+ sources.push(`${source} ${multiplier}x`);
+ }
+
+ return sources.join(", ");
+}
--- /dev/null
+<script setup lang="ts">
+ import { ref, onMounted } from "vue";
+
+ // Import types
+ import type { User } from "@/api/users";
+ import { makeAvatarUrl, makeAvatarUrls } from "@/api/users";
+
+ // Fetch the build UUID
+ const props = withDefaults(
+ defineProps<{
+ user: User,
+ size?: number,
+ isRounded?: boolean,
+ }>(),
+ {
+ size : 256,
+ isRounded : false,
+ },
+ );
+</script>
+
+<template>
+ <figure :class="`image is-${size}x${size}`">
+ <img :class="{ 'is-rounded' : isRounded }" :alt="user.name"
+ :src="makeAvatarUrl(user, size)" :srcset="makeAvatarUrls(user, size)" />
+ </figure>
+</template>
import Tag from "@/components/Tag.vue";
// Components
+import Avatar from "@/components/Avatar.vue";
import Modal from "@/components/Modal.vue";
// Icons
export default {
install(app: App) {
+ app.component("Avatar", Avatar)
app.component("Container", Container)
app.component("Block", Block)
app.component("Box", Box)