mirror of
https://github.com/pocketbase/pocketbase.git
synced 2026-10-05 22:11:44 +02:00
83 lines
2.3 KiB
Svelte
83 lines
2.3 KiB
Svelte
<script>
|
|
import CommonHelper from "@/utils/CommonHelper";
|
|
import OverlayPanel from "@/components/base/OverlayPanel.svelte";
|
|
|
|
let panel;
|
|
let url = "";
|
|
let urlOrFactory;
|
|
|
|
$: queryParamsIndex = url.indexOf("?");
|
|
|
|
$: filename = url.substring(
|
|
url.lastIndexOf("/") + 1,
|
|
queryParamsIndex > 0 ? queryParamsIndex : undefined,
|
|
);
|
|
|
|
$: type = CommonHelper.getFileType(filename);
|
|
|
|
export async function show(urlOrFactoryArg) {
|
|
urlOrFactory = urlOrFactoryArg;
|
|
if (!urlOrFactory) {
|
|
return;
|
|
}
|
|
|
|
url = await resolveUrlOrFactory();
|
|
|
|
panel?.show();
|
|
}
|
|
|
|
export function hide() {
|
|
return panel?.hide();
|
|
}
|
|
|
|
async function resolveUrlOrFactory() {
|
|
if (typeof urlOrFactory == "function") {
|
|
return await urlOrFactory();
|
|
}
|
|
|
|
// string or Promise
|
|
return await urlOrFactory;
|
|
}
|
|
|
|
async function openInNewTab() {
|
|
try {
|
|
// resolve again because it may have expired
|
|
url = await resolveUrlOrFactory();
|
|
window.open(url, "_blank", "noreferrer,noopener");
|
|
} catch (err) {
|
|
console.warn("Open in new tab file token failure:", err);
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<OverlayPanel bind:this={panel} class="preview preview-{type}" btnClose={false} popup on:show on:hide>
|
|
<svelte:fragment slot="header">
|
|
<button type="button" class="overlay-close" on:click|preventDefault={hide}>
|
|
<i class="ri-close-line" />
|
|
</button>
|
|
</svelte:fragment>
|
|
|
|
{#if panel?.isActive()}
|
|
{#if type === "image"}
|
|
<img src={url} alt="Preview {filename}" />
|
|
{:else}
|
|
<object title={filename} data={url}>Cannot preview the file.</object>
|
|
{/if}
|
|
{/if}
|
|
|
|
<svelte:fragment slot="footer">
|
|
<button
|
|
type="button"
|
|
title={filename}
|
|
class="link-hint txt-ellipsis inline-flex"
|
|
on:auxclick={openInNewTab}
|
|
on:click={openInNewTab}
|
|
>
|
|
{filename}
|
|
<i class="ri-external-link-line" />
|
|
</button>
|
|
<div class="flex-fill" />
|
|
<button type="button" class="btn btn-transparent" on:click={hide}>Close</button>
|
|
</svelte:fragment>
|
|
</OverlayPanel>
|