) | null = null;
export let zoomToggle: (() => void) | null = null;
@@ -67,6 +67,10 @@
};
const getAssetUrl = (id: string, useOriginal: boolean, checksum: string) => {
+ if (sharedLink && (!sharedLink.allowDownload || !sharedLink.showMetadata)) {
+ return getAssetThumbnailUrl({ id, size: AssetMediaSize.Preview, checksum });
+ }
+
return useOriginal
? getAssetOriginalUrl({ id, checksum })
: getAssetThumbnailUrl({ id, size: AssetMediaSize.Preview, checksum });
diff --git a/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte b/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte
index a87774c9e..3df849e18 100644
--- a/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte
+++ b/web/src/lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte
@@ -51,7 +51,11 @@
};
$: shareType = albumId ? SharedLinkType.Album : SharedLinkType.Individual;
-
+ $: {
+ if (!showMetadata) {
+ allowDownload = false;
+ }
+ }
if (editingLink) {
if (editingLink.description) {
description = editingLink.description;
@@ -227,7 +231,11 @@
-
+
diff --git a/web/src/lib/utils/asset-utils.ts b/web/src/lib/utils/asset-utils.ts
index 9fa851aa3..648b66e36 100644
--- a/web/src/lib/utils/asset-utils.ts
+++ b/web/src/lib/utils/asset-utils.ts
@@ -270,6 +270,10 @@ const supportedImageMimeTypes = new Set([
* Returns true if the asset is an image supported by web browsers, false otherwise
*/
export function isWebCompatibleImage(asset: AssetResponseDto): boolean {
+ if (!asset.originalMimeType) {
+ return false;
+ }
+
return supportedImageMimeTypes.has(asset.originalMimeType);
}
diff --git a/web/src/test-data/factories/shared-link-factory.ts b/web/src/test-data/factories/shared-link-factory.ts
new file mode 100644
index 000000000..a057bc936
--- /dev/null
+++ b/web/src/test-data/factories/shared-link-factory.ts
@@ -0,0 +1,19 @@
+import { faker } from '@faker-js/faker';
+import { SharedLinkType, type SharedLinkResponseDto } from '@immich/sdk';
+import { Sync } from 'factory.ts';
+
+export const sharedLinkFactory = Sync.makeFactory({
+ id: Sync.each(() => faker.string.uuid()),
+ description: Sync.each(() => faker.word.sample()),
+ password: Sync.each(() => faker.word.sample()),
+ token: Sync.each(() => faker.word.sample()),
+ userId: Sync.each(() => faker.string.uuid()),
+ key: Sync.each(() => faker.word.sample()),
+ type: Sync.each(() => faker.helpers.enumValue(SharedLinkType)),
+ createdAt: Sync.each(() => faker.date.past().toISOString()),
+ expiresAt: Sync.each(() => faker.date.past().toISOString()),
+ assets: [],
+ allowUpload: Sync.each(() => faker.datatype.boolean()),
+ allowDownload: Sync.each(() => faker.datatype.boolean()),
+ showMetadata: Sync.each(() => faker.datatype.boolean()),
+});