From 844f5e9255d4322f12365a4e753d4b6c591a7ca1 Mon Sep 17 00:00:00 2001 From: Sam <sam@sam.wf> Date: Wed, 15 Mar 2023 00:32:07 +0100 Subject: [PATCH] feat(frontend): better content type detection, add explanation about avatar file types --- .../src/routes/edit/member/[id]/+page.svelte | 32 ++++++++---------- frontend/src/routes/edit/profile/+page.svelte | 33 +++++++++---------- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/frontend/src/routes/edit/member/[id]/+page.svelte b/frontend/src/routes/edit/member/[id]/+page.svelte index e9c4297..d84e785 100644 --- a/frontend/src/routes/edit/member/[id]/+page.svelte +++ b/frontend/src/routes/edit/member/[id]/+page.svelte @@ -125,25 +125,11 @@ const buffer = await list[0].arrayBuffer(); const base64 = encode(buffer); - const uri = `data:${dataTypeFromFilename(list[0].name)};base64,${base64}`; + const uri = `data:${list[0].type};base64,${base64}`; return uri; }; - const dataTypeFromFilename = (filename: string) => { - if (filename.endsWith(".webp")) { - return "image/webp"; - } else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg")) { - return "image/jpeg"; - } else if (filename.endsWith(".png")) { - return "image/png"; - } else if (filename.endsWith(".gif")) { - return "image/gif"; - } else { - return "application/octet-stream"; - } - }; - const moveName = (index: number, up: boolean) => { if (up && index == 0) return; if (!up && index == names.length - 1) return; @@ -317,15 +303,25 @@ <div class="col-md"> <h4>Avatar</h4> <div class="row"> - <div class="col-md"> + <div class="col-md text-center"> {#if avatar} <img width={200} src={avatar} alt="New avatar" class="rounded-circle img-fluid" /> {:else} <FallbackImage alt="Current avatar" urls={memberAvatars(data.member)} width={200} /> {/if} </div> - <div class="col-md"> - <input class="form-control" id="avatar" type="file" bind:files={avatar_files} /> + <div class="col-md mt-2"> + <input + class="form-control" + id="avatar" + type="file" + bind:files={avatar_files} + accept="image/png, image/jpeg, image/gif, image/webp" + /> + <p class="text-muted mt-3"> + <Icon name="info-circle-fill" /> Only PNG, JPEG, GIF, and WebP can be used as avatars. + Avatars cannot be larger than 1 MB, and animated avatars will be made static. + </p> </div> </div> </div> diff --git a/frontend/src/routes/edit/profile/+page.svelte b/frontend/src/routes/edit/profile/+page.svelte index 7a61a6a..1f4a738 100644 --- a/frontend/src/routes/edit/profile/+page.svelte +++ b/frontend/src/routes/edit/profile/+page.svelte @@ -128,25 +128,12 @@ const buffer = await list[0].arrayBuffer(); const base64 = encode(buffer); - const uri = `data:${dataTypeFromFilename(list[0].name)};base64,${base64}`; + const uri = `data:${list[0].type};base64,${base64}`; + console.log(uri.slice(0, 128)); return uri; }; - const dataTypeFromFilename = (filename: string) => { - if (filename.endsWith(".webp")) { - return "image/webp"; - } else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg")) { - return "image/jpeg"; - } else if (filename.endsWith(".png")) { - return "image/png"; - } else if (filename.endsWith(".gif")) { - return "image/gif"; - } else { - return "application/octet-stream"; - } - }; - const moveName = (index: number, up: boolean) => { if (up && index == 0) return; if (!up && index == names.length - 1) return; @@ -273,15 +260,25 @@ <div class="col-md"> <h4>Avatar</h4> <div class="row"> - <div class="col-md"> + <div class="col-md text-center"> {#if avatar} <img width={200} src={avatar} alt="New avatar" class="rounded-circle img-fluid" /> {:else} <FallbackImage alt="Current avatar" urls={userAvatars($userStore)} width={200} /> {/if} </div> - <div class="col-md"> - <input class="form-control" id="avatar" type="file" bind:files={avatar_files} /> + <div class="col-md mt-2"> + <input + class="form-control" + id="avatar" + type="file" + bind:files={avatar_files} + accept="image/png, image/jpeg, image/gif, image/webp" + /> + <p class="text-muted mt-3"> + <Icon name="info-circle-fill" /> Only PNG, JPEG, GIF, and WebP images can be used as avatars. + Avatars cannot be larger than 1 MB, and animated avatars will be made static. + </p> </div> </div> </div>