feat: hashes in avatar file names (closes #19)

This commit is contained in:
Sam 2023-03-13 02:04:09 +01:00
parent e36bd247f5
commit 163e7c3fd6
Signed by: sam
GPG key ID: B4EF20DDE721CAA1
17 changed files with 133 additions and 77 deletions

View file

@ -1,9 +1,11 @@
import { PUBLIC_BASE_URL } from "$env/static/public";
export interface User {
id: string;
name: string;
display_name: string | null;
bio: string | null;
avatar_urls: string[];
avatar: string | null;
links: string[];
names: FieldEntry[];
@ -47,7 +49,7 @@ export interface PartialMember {
name: string;
display_name: string | null;
bio: string | null;
avatar_urls: string[];
avatar: string | null;
links: string[];
names: FieldEntry[];
pronouns: Pronoun[];
@ -63,7 +65,7 @@ export interface MemberPartialUser {
id: string;
name: string;
display_name: string | null;
avatar_urls: string[];
avatar: string | null;
}
export interface APIError {
@ -98,3 +100,21 @@ export enum ErrorCode {
RequestTooBig = 4001,
}
export const userAvatars = (user: User | MeUser | MemberPartialUser) => {
if (!user.avatar) return [];
return [
`${PUBLIC_BASE_URL}/media/users/${user.id}/${user.avatar}.webp`,
`${PUBLIC_BASE_URL}/media/users/${user.id}/${user.avatar}.webp`,
];
};
export const memberAvatars = (member: Member | PartialMember) => {
if (!member.avatar) return [];
return [
`${PUBLIC_BASE_URL}/media/members/${member.id}/${member.avatar}.webp`,
`${PUBLIC_BASE_URL}/media/members/${member.id}/${member.avatar}.webp`,
];
};

View file

@ -1,5 +1,5 @@
<script lang="ts">
import { WordStatus, type PartialMember, type User } from "$lib/api/entities";
import { memberAvatars, WordStatus, type PartialMember, type User } from "$lib/api/entities";
import FallbackImage from "./FallbackImage.svelte";
export let user: User;
@ -31,7 +31,7 @@
</script>
<div>
<FallbackImage urls={member.avatar_urls} width={200} alt="Avatar for {member.name}" />
<FallbackImage urls={memberAvatars(member)} width={200} alt="Avatar for {member.name}" />
<p class="m-2">
<a class="text-reset fs-5" href="/@{user.name}/{member.name}">
{member.display_name ?? member.name}

View file

@ -11,6 +11,7 @@
import PartialMemberCard from "$lib/components/PartialMemberCard.svelte";
import FallbackImage from "$lib/components/FallbackImage.svelte";
import { userStore } from "$lib/store";
import { userAvatars } from "$lib/api/entities";
export let data: PageData;
@ -32,7 +33,7 @@
<div class="grid row-gap-3">
<div class="row">
<div class="col-md text-center">
<FallbackImage width={200} urls={data.avatar_urls} alt="Avatar for @{data.name}" />
<FallbackImage width={200} urls={userAvatars(data)} alt="Avatar for @{data.name}" />
</div>
<div class="col-md">
{#if data.display_name}

View file

@ -9,6 +9,7 @@
import PronounLink from "$lib/components/PronounLink.svelte";
import FallbackImage from "$lib/components/FallbackImage.svelte";
import { Button, Icon } from "sveltestrap";
import { memberAvatars } from "$lib/api/entities";
export let data: PageData;
@ -29,7 +30,7 @@
<div class="grid">
<div class="row">
<div class="col-md text-center">
<FallbackImage width={200} urls={data.avatar_urls} alt="Avatar for @{data.name}" />
<FallbackImage width={200} urls={memberAvatars(data)} alt="Avatar for @{data.name}" />
</div>
<div class="col-md">
<h2>{data.display_name ?? data.name}</h2>

View file

@ -1,6 +1,7 @@
<script lang="ts">
import { goto } from "$app/navigation";
import {
userAvatars,
WordStatus,
type APIError,
type Field,
@ -195,7 +196,7 @@
{#if avatar}
<img width={200} src={avatar} alt="New avatar" class="rounded-circle img-fluid" />
{:else}
<FallbackImage alt="Current avatar" urls={$userStore.avatar_urls} width={200} />
<FallbackImage alt="Current avatar" urls={userAvatars($userStore)} width={200} />
{/if}
</div>
<div class="col-md">