From 004fd56f2ccf2484f77bff13262602ff85b695e0 Mon Sep 17 00:00:00 2001 From: h Date: Thu, 6 Aug 2026 15:17:25 +0200 Subject: [PATCH] feat(frontend): open sidebar media on click, unbreak long-press menus --- .../src/lib/components/MessageMedia.svelte | 2 +- .../lib/components/profile/SharedMedia.svelte | 145 +++++++++++++----- .../src/lib/components/ui/ContextMenu.svelte | 33 +++- frontend/src/lib/styles/global.scss | 8 + frontend/src/lib/viewport.ts | 7 + 5 files changed, 156 insertions(+), 39 deletions(-) create mode 100644 frontend/src/lib/viewport.ts diff --git a/frontend/src/lib/components/MessageMedia.svelte b/frontend/src/lib/components/MessageMedia.svelte index 6657359..8e48cda 100644 --- a/frontend/src/lib/components/MessageMedia.svelte +++ b/frontend/src/lib/components/MessageMedia.svelte @@ -179,7 +179,7 @@ {/snippet} {#snippet menu()} ОткрытьОткрыть на весь экран ([]); let loading = $state(false); let done = $state(false); + let viewerOpen = $state(false); + let viewerIndex = $state(0); const previews = $state>({}); let token = 0; + const viewerItems = $derived( + items.map((item) => ({ + messageId: item.message_id, + mediaId: item.id, + kind: item.kind, + downloaded: item.downloaded, + })) + ); + async function loadMore() { if (loading || done) { return; @@ -110,9 +130,17 @@ }; }); - function open(messageId: number) { + function open(index: number) { + viewerIndex = index; + viewerOpen = true; + } + + function jump(messageId: number) { ui.requestJump(chatId, messageId); goto(`/app/${chatId}`); + if (isMobile()) { + ui.closePanel(); + } } function preview(item: MediaView): InlineMedia | undefined { @@ -128,46 +156,84 @@ {/if} {:else if layout === "grid"}
- {#each items as item (item.id)} - + {#if preview(item)?.state === "ready"} + {@const ready = preview(item) as Extract< + InlineMedia, + { state: "ready" } + >} + {#if visualKind(item.kind) === "video"} + + + {:else} + + {/if} + {:else} + + {/if} + + {/snippet} + {#snippet menu()} + open(index)} + >Открыть на весь экран + jump(item.message_id)} + >Перейти к сообщению + {/snippet} + {/each}
{:else}
    - {#each items as item (item.id)} + {#each items as item, index (item.id)}
  • - + + {#snippet children({ props })} + + {/snippet} + {#snippet menu()} + open(index)} + >Открыть + jump(item.message_id)} + >Перейти к сообщению + {/snippet} +
  • {/each}
@@ -184,6 +250,13 @@ {/if} + +