1
0
mirror of https://github.com/immich-app/immich.git synced 2025-06-17 03:47:45 +02:00

feat(web): allow uploading more file types (#1570)

* feat(web): allow uploading more file types

* fix(web): make filename extension lowercase
This commit is contained in:
Michel Heusschen
2023-02-09 17:08:19 +01:00
committed by GitHub
parent 8c20d8cb3d
commit adb265794c
4 changed files with 123 additions and 89 deletions

View File

@ -4,55 +4,20 @@
import { uploadAssetsStore } from '$lib/stores/upload';
import CloudUploadOutline from 'svelte-material-icons/CloudUploadOutline.svelte';
import WindowMinimize from 'svelte-material-icons/WindowMinimize.svelte';
import type { UploadAsset } from '$lib/models/upload-asset';
import { notificationController, NotificationType } from './notification/notification';
import { asByteUnitString } from '$lib/utils/byte-units';
import UploadAssetPreview from './upload-asset-preview.svelte';
let showDetail = true;
let uploadLength = 0;
let isUploading = false;
const showUploadImageThumbnail = async (a: UploadAsset) => {
const extension = a.fileExtension.toLowerCase();
if (extension == 'jpeg' || extension == 'jpg' || extension == 'png') {
try {
const imgData = await a.file.arrayBuffer();
const arrayBufferView = new Uint8Array(imgData);
const blob = new Blob([arrayBufferView], { type: 'image/jpeg' });
const urlCreator = window.URL || window.webkitURL;
const imageUrl = urlCreator.createObjectURL(blob);
// TODO: There is probably a cleaner way of doing this
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const img: any = document.getElementById(`${a.id}`);
img.src = imageUrl;
} catch {
// Do nothing?
}
}
};
// Reactive action to get thumbnail image of upload asset whenever there is a new one added to the list
// Reactive action to update asset uploadLength whenever there is a new one added to the list
$: {
if ($uploadAssetsStore.length != uploadLength) {
$uploadAssetsStore.map((asset) => {
showUploadImageThumbnail(asset);
});
uploadLength = $uploadAssetsStore.length;
}
}
$: {
if (showDetail) {
$uploadAssetsStore.map((asset) => {
showUploadImageThumbnail(asset);
});
}
}
let isUploading = false;
uploadAssetsStore.isUploading.subscribe((value) => {
isUploading = value;
});
@ -88,48 +53,7 @@
<div class="max-h-[400px] overflow-y-auto pr-2 rounded-lg immich-scrollbar">
{#each $uploadAssetsStore as uploadAsset}
{#key uploadAsset.id}
<div
in:fade={{ duration: 250 }}
out:fade={{ duration: 100 }}
class="text-xs mt-3 rounded-lg bg-immich-bg grid grid-cols-[70px_auto] gap-2 h-[70px]"
>
<div class="relative">
<img
in:fade={{ duration: 250 }}
id={`${uploadAsset.id}`}
src="/immich-logo.svg"
alt=""
class="h-[70px] w-[70px] object-cover rounded-tl-lg rounded-bl-lg "
draggable="false"
/>
<div class="bottom-0 left-0 absolute w-full h-[25px] bg-immich-primary/30">
<p
class="absolute bottom-1 right-1 object-right-bottom text-gray-50/95 font-semibold stroke-immich-primary uppercase"
>
.{uploadAsset.fileExtension}
</p>
</div>
</div>
<div class="p-2 pr-4 flex flex-col justify-between">
<input
disabled
class="bg-gray-100 border w-full p-1 rounded-md text-[10px] px-2"
value={`[${asByteUnitString(uploadAsset.file.size)}] ${uploadAsset.file.name}`}
/>
<div class="w-full bg-gray-300 h-[15px] rounded-md mt-[5px] text-white relative">
<div
class="bg-immich-primary h-[15px] rounded-md transition-all"
style={`width: ${uploadAsset.progress}%`}
/>
<p class="absolute h-full w-full text-center top-0 text-[10px] ">
{uploadAsset.progress}/100
</p>
</div>
</div>
</div>
<UploadAssetPreview {uploadAsset} />
{/key}
{/each}
</div>