2022-06-03 11:04:30 -05:00
|
|
|
<script lang="ts">
|
|
|
|
import { createEventDispatcher } from 'svelte';
|
|
|
|
|
2023-04-26 04:30:19 +02:00
|
|
|
import { clickOutside } from '$lib/utils/click-outside';
|
2022-06-03 11:04:30 -05:00
|
|
|
import ArrowLeft from 'svelte-material-icons/ArrowLeft.svelte';
|
|
|
|
import CloudDownloadOutline from 'svelte-material-icons/CloudDownloadOutline.svelte';
|
|
|
|
import InformationOutline from 'svelte-material-icons/InformationOutline.svelte';
|
2022-11-04 10:32:09 -04:00
|
|
|
import DotsVertical from 'svelte-material-icons/DotsVertical.svelte';
|
2022-10-30 17:08:22 +01:00
|
|
|
import DeleteOutline from 'svelte-material-icons/DeleteOutline.svelte';
|
2023-04-07 18:45:00 +02:00
|
|
|
import CircleIconButton from '../elements/buttons/circle-icon-button.svelte';
|
2022-11-04 10:32:09 -04:00
|
|
|
import ContextMenu from '../shared-components/context-menu/context-menu.svelte';
|
|
|
|
import MenuOption from '../shared-components/context-menu/menu-option.svelte';
|
2023-05-08 21:01:39 +02:00
|
|
|
import Heart from 'svelte-material-icons/Heart.svelte';
|
|
|
|
import HeartOutline from 'svelte-material-icons/HeartOutline.svelte';
|
2022-11-16 22:04:37 +01:00
|
|
|
import ContentCopy from 'svelte-material-icons/ContentCopy.svelte';
|
2022-11-18 23:12:54 -06:00
|
|
|
import MotionPlayOutline from 'svelte-material-icons/MotionPlayOutline.svelte';
|
|
|
|
import MotionPauseOutline from 'svelte-material-icons/MotionPauseOutline.svelte';
|
2023-04-20 09:09:27 -05:00
|
|
|
import ArchiveArrowDownOutline from 'svelte-material-icons/ArchiveArrowDownOutline.svelte';
|
|
|
|
import ArchiveArrowUpOutline from 'svelte-material-icons/ArchiveArrowUpOutline.svelte';
|
2022-11-16 22:04:37 +01:00
|
|
|
|
2022-11-08 11:20:36 -05:00
|
|
|
import { page } from '$app/stores';
|
|
|
|
import { AssetResponseDto } from '../../../api';
|
|
|
|
|
|
|
|
export let asset: AssetResponseDto;
|
2022-11-16 22:04:37 +01:00
|
|
|
export let showCopyButton: boolean;
|
2022-11-18 23:12:54 -06:00
|
|
|
export let showMotionPlayButton: boolean;
|
|
|
|
export let isMotionPhotoPlaying = false;
|
2023-01-21 22:15:16 -06:00
|
|
|
export let showDownloadButton: boolean;
|
2022-11-08 11:20:36 -05:00
|
|
|
|
2023-01-09 14:16:08 -06:00
|
|
|
const isOwner = asset.ownerId === $page.data.user?.id;
|
2022-11-04 10:32:09 -04:00
|
|
|
|
2022-06-03 11:04:30 -05:00
|
|
|
const dispatch = createEventDispatcher();
|
2022-11-04 10:32:09 -04:00
|
|
|
|
|
|
|
let contextMenuPosition = { x: 0, y: 0 };
|
|
|
|
let isShowAssetOptions = false;
|
|
|
|
|
2023-02-10 23:17:39 +01:00
|
|
|
const showOptionsMenu = ({ x, y }: MouseEvent) => {
|
|
|
|
contextMenuPosition = { x, y };
|
2022-11-04 10:32:09 -04:00
|
|
|
isShowAssetOptions = !isShowAssetOptions;
|
|
|
|
};
|
|
|
|
|
|
|
|
const onMenuClick = (eventName: string) => {
|
|
|
|
isShowAssetOptions = false;
|
|
|
|
dispatch(eventName);
|
|
|
|
};
|
2022-06-03 11:04:30 -05:00
|
|
|
</script>
|
|
|
|
|
2022-07-16 23:52:00 -05:00
|
|
|
<div
|
2023-05-09 17:10:13 +02:00
|
|
|
class="h-16 flex justify-between place-items-center px-3 transition-transform duration-200 z-[1001] bg-gradient-to-b from-black/40"
|
2022-07-16 23:52:00 -05:00
|
|
|
>
|
2023-05-09 17:10:13 +02:00
|
|
|
<div class="text-white">
|
|
|
|
<CircleIconButton isOpacity={true} logo={ArrowLeft} on:click={() => dispatch('goBack')} />
|
2022-06-03 11:04:30 -05:00
|
|
|
</div>
|
2023-04-26 04:30:19 +02:00
|
|
|
<div class="text-white flex gap-2 justify-end w-[calc(100%-3rem)] overflow-hidden">
|
2023-04-20 09:09:27 -05:00
|
|
|
{#if isOwner}
|
|
|
|
<CircleIconButton
|
2023-05-09 17:10:13 +02:00
|
|
|
isOpacity={true}
|
2023-04-20 09:09:27 -05:00
|
|
|
logo={asset.isArchived ? ArchiveArrowUpOutline : ArchiveArrowDownOutline}
|
|
|
|
title={asset.isArchived ? 'Unarchive' : 'Archive'}
|
|
|
|
on:click={() => dispatch('toggleArchive')}
|
|
|
|
/>
|
|
|
|
{/if}
|
|
|
|
|
2022-11-18 23:12:54 -06:00
|
|
|
{#if showMotionPlayButton}
|
|
|
|
{#if isMotionPhotoPlaying}
|
|
|
|
<CircleIconButton
|
2023-05-09 17:10:13 +02:00
|
|
|
isOpacity={true}
|
2022-11-18 23:12:54 -06:00
|
|
|
logo={MotionPauseOutline}
|
|
|
|
title="Stop Motion Photo"
|
|
|
|
on:click={() => dispatch('stopMotionPhoto')}
|
|
|
|
/>
|
|
|
|
{:else}
|
|
|
|
<CircleIconButton
|
2023-05-09 17:10:13 +02:00
|
|
|
isOpacity={true}
|
2022-11-18 23:12:54 -06:00
|
|
|
logo={MotionPlayOutline}
|
|
|
|
title="Play Motion Photo"
|
|
|
|
on:click={() => dispatch('playMotionPhoto')}
|
|
|
|
/>
|
|
|
|
{/if}
|
|
|
|
{/if}
|
2022-11-16 22:04:37 +01:00
|
|
|
{#if showCopyButton}
|
|
|
|
<CircleIconButton
|
2023-05-09 17:10:13 +02:00
|
|
|
isOpacity={true}
|
2022-11-16 22:04:37 +01:00
|
|
|
logo={ContentCopy}
|
2022-11-18 23:12:54 -06:00
|
|
|
title="Copy Image"
|
2022-11-16 22:04:37 +01:00
|
|
|
on:click={() => {
|
|
|
|
const copyEvent = new CustomEvent('copyImage');
|
|
|
|
window.dispatchEvent(copyEvent);
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
{/if}
|
2023-01-21 22:15:16 -06:00
|
|
|
|
|
|
|
{#if showDownloadButton}
|
|
|
|
<CircleIconButton
|
2023-05-09 17:10:13 +02:00
|
|
|
isOpacity={true}
|
2023-01-21 22:15:16 -06:00
|
|
|
logo={CloudDownloadOutline}
|
|
|
|
on:click={() => dispatch('download')}
|
|
|
|
title="Download"
|
|
|
|
/>
|
|
|
|
{/if}
|
2022-11-18 23:12:54 -06:00
|
|
|
<CircleIconButton
|
2023-05-09 17:10:13 +02:00
|
|
|
isOpacity={true}
|
2022-11-18 23:12:54 -06:00
|
|
|
logo={InformationOutline}
|
|
|
|
on:click={() => dispatch('showDetail')}
|
|
|
|
title="Info"
|
|
|
|
/>
|
2022-11-08 11:20:36 -05:00
|
|
|
{#if isOwner}
|
|
|
|
<CircleIconButton
|
2023-05-09 17:10:13 +02:00
|
|
|
isOpacity={true}
|
2023-05-08 21:01:39 +02:00
|
|
|
logo={asset.isFavorite ? Heart : HeartOutline}
|
2022-11-08 11:20:36 -05:00
|
|
|
on:click={() => dispatch('favorite')}
|
|
|
|
title="Favorite"
|
|
|
|
/>
|
|
|
|
{/if}
|
2023-01-09 14:16:08 -06:00
|
|
|
|
|
|
|
{#if isOwner}
|
2023-05-09 17:10:13 +02:00
|
|
|
<CircleIconButton
|
|
|
|
isOpacity={true}
|
|
|
|
logo={DeleteOutline}
|
|
|
|
on:click={() => dispatch('delete')}
|
|
|
|
title="Delete"
|
|
|
|
/>
|
2023-04-26 04:30:19 +02:00
|
|
|
<div use:clickOutside on:outclick={() => (isShowAssetOptions = false)}>
|
2023-05-09 17:10:13 +02:00
|
|
|
<CircleIconButton
|
|
|
|
isOpacity={true}
|
|
|
|
logo={DotsVertical}
|
|
|
|
on:click={showOptionsMenu}
|
|
|
|
title="More"
|
|
|
|
>
|
2023-04-26 04:30:19 +02:00
|
|
|
{#if isShowAssetOptions}
|
|
|
|
<ContextMenu {...contextMenuPosition}>
|
2023-05-09 17:10:13 +02:00
|
|
|
<div class="flex flex-col rounded-lg text-black bg-immich-bg">
|
2023-04-26 04:30:19 +02:00
|
|
|
<MenuOption on:click={() => onMenuClick('addToAlbum')} text="Add to Album" />
|
|
|
|
<MenuOption
|
|
|
|
on:click={() => onMenuClick('addToSharedAlbum')}
|
|
|
|
text="Add to Shared Album"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</ContextMenu>
|
|
|
|
{/if}
|
|
|
|
</CircleIconButton>
|
|
|
|
</div>
|
2023-01-09 14:16:08 -06:00
|
|
|
{/if}
|
2022-06-03 11:04:30 -05:00
|
|
|
</div>
|
|
|
|
</div>
|