- {#if !asset.isTrashed && $user && !isLocked}
-
- {/if}
+
{#if asset.isOffline}
void;
+ onClose: () => void;
albumId?: string;
assetIds?: string[];
}
- let { onClose, albumId = $bindable(), assetIds = $bindable([]) }: Props = $props();
+ let { onClose, albumId, assetIds }: Props = $props();
let description = $state('');
let allowDownload = $state(true);
@@ -44,7 +44,7 @@
slug,
});
if (success) {
- onClose(true);
+ onClose();
}
};
diff --git a/web/src/lib/services/asset.service.ts b/web/src/lib/services/asset.service.ts
index 245b4888ca..a64da2a6d6 100644
--- a/web/src/lib/services/asset.service.ts
+++ b/web/src/lib/services/asset.service.ts
@@ -1,6 +1,23 @@
import { eventManager } from '$lib/managers/event-manager.svelte';
+import SharedLinkCreateModal from '$lib/modals/SharedLinkCreateModal.svelte';
+import { user as authUser } from '$lib/stores/user.store';
import { openFileUploadDialog } from '$lib/utils/file-uploader';
-import { copyAsset, deleteAssets } from '@immich/sdk';
+import { AssetVisibility, copyAsset, deleteAssets, type AssetResponseDto } from '@immich/sdk';
+import { modalManager, type ActionItem } from '@immich/ui';
+import { mdiShareVariantOutline } from '@mdi/js';
+import type { MessageFormatter } from 'svelte-i18n';
+import { get } from 'svelte/store';
+
+export const getAssetActions = ($t: MessageFormatter, asset: AssetResponseDto) => {
+ const Share: ActionItem = {
+ title: $t('share'),
+ icon: mdiShareVariantOutline,
+ $if: () => !!(get(authUser) && !asset.isTrashed && asset.visibility !== AssetVisibility.Locked),
+ onAction: () => modalManager.show(SharedLinkCreateModal, { assetIds: [asset.id] }),
+ };
+
+ return { Share };
+};
export const handleReplaceAsset = async (oldAssetId: string) => {
const [newAssetId] = await openFileUploadDialog({ multiple: false });
diff --git a/web/src/lib/services/shared-link.service.ts b/web/src/lib/services/shared-link.service.ts
index 9f70024193..50069dc6d8 100644
--- a/web/src/lib/services/shared-link.service.ts
+++ b/web/src/lib/services/shared-link.service.ts
@@ -9,6 +9,7 @@ import { handleError } from '$lib/utils/handle-error';
import { getFormatter } from '$lib/utils/i18n';
import {
createSharedLink,
+ getSharedLinkById,
removeSharedLink,
removeSharedLinkAssets,
updateSharedLink,
@@ -58,7 +59,11 @@ export const handleCreateSharedLink = async (dto: SharedLinkCreateDto) => {
const $t = await getFormatter();
try {
- const sharedLink = await createSharedLink({ sharedLinkCreateDto: dto });
+ let sharedLink = await createSharedLink({ sharedLinkCreateDto: dto });
+ if (dto.albumId) {
+ // fetch album details, for event
+ sharedLink = await getSharedLinkById({ id: sharedLink.id });
+ }
eventManager.emit('SharedLinkCreate', sharedLink);