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)} - open(item.message_id)}> - {#if preview(item)?.state === "ready"} - {@const ready = preview(item) as Extract} - {#if visualKind(item.kind) === "video"} - - - {:else} - - {/if} - {:else} - + {#snippet children({ props })} + open(index)} > - {/if} - + {#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)} - open(item.message_id)}> - - - {mediaKindLabel(item.kind)} - - {formatListDate(item.created_at)} - {#if item.file_size} - · {formatBytes(item.file_size)} - {/if} - - - + + {#snippet children({ props })} + open(index)} + > + + + {mediaKindLabel(item.kind)} + + {formatListDate(item.created_at)} + {#if item.file_size} + · {formatBytes(item.file_size)} + {/if} + + + + {/snippet} + {#snippet menu()} + open(index)} + >Открыть + jump(item.message_id)} + >Перейти к сообщению + {/snippet} + {/each} @@ -184,6 +250,13 @@ {/if} + +