upload-asset-preview.svelte 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <script lang="ts">
  2. import { fade } from 'svelte/transition';
  3. import { asByteUnitString } from '$lib/utils/byte-units';
  4. import { UploadAsset } from '$lib/models/upload-asset';
  5. export let uploadAsset: UploadAsset;
  6. let showFallbackImage = false;
  7. const previewURL = URL.createObjectURL(uploadAsset.file);
  8. </script>
  9. <div
  10. in:fade={{ duration: 250 }}
  11. out:fade={{ duration: 100 }}
  12. class="text-xs mt-3 rounded-lg bg-immich-bg grid grid-cols-[70px_auto] gap-2 h-[70px]"
  13. >
  14. <div class="relative">
  15. {#if showFallbackImage}
  16. <img
  17. in:fade={{ duration: 250 }}
  18. src="immich-logo.svg"
  19. alt="Immich Logo"
  20. class="h-[70px] w-[70px] object-cover rounded-tl-lg rounded-bl-lg"
  21. draggable="false"
  22. />
  23. {:else}
  24. <img
  25. in:fade={{ duration: 250 }}
  26. on:load={() => {
  27. URL.revokeObjectURL(previewURL);
  28. }}
  29. on:error={() => {
  30. URL.revokeObjectURL(previewURL);
  31. showFallbackImage = true;
  32. }}
  33. src={previewURL}
  34. alt="Preview of asset"
  35. class="h-[70px] w-[70px] object-cover rounded-tl-lg rounded-bl-lg"
  36. draggable="false"
  37. />
  38. {/if}
  39. <div class="bottom-0 left-0 absolute w-full h-[25px] bg-immich-primary/30">
  40. <p
  41. class="absolute bottom-1 right-1 object-right-bottom text-gray-50/95 font-semibold stroke-immich-primary uppercase"
  42. >
  43. .{uploadAsset.fileExtension}
  44. </p>
  45. </div>
  46. </div>
  47. <div class="p-2 pr-4 flex flex-col justify-between">
  48. <input
  49. disabled
  50. class="bg-gray-100 border w-full p-1 rounded-md text-[10px] px-2"
  51. value={`[${asByteUnitString(uploadAsset.file.size)}] ${uploadAsset.file.name}`}
  52. />
  53. <div class="w-full bg-gray-300 h-[15px] rounded-md mt-[5px] text-white relative">
  54. <div
  55. class="bg-immich-primary h-[15px] rounded-md transition-all"
  56. style={`width: ${uploadAsset.progress}%`}
  57. />
  58. <p class="absolute h-full w-full text-center top-0 text-[10px] ">
  59. {uploadAsset.progress}/100
  60. </p>
  61. </div>
  62. </div>
  63. </div>