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} + +