schreiben/src/views/Page.svelte

71 lines
2 KiB
Svelte
Raw Permalink Normal View History

2023-03-05 17:10:29 +00:00
<script lang="ts">
import type { XmlFragment } from "yjs";
import { inject } from "regexparam";
2023-09-07 15:19:53 +00:00
import ArrowBackIcon from "eva-icons/fill/svg/arrow-back.svg";
2023-03-05 17:10:29 +00:00
import Editor from "../editor/Editor.svelte";
2023-09-07 15:19:53 +00:00
import Breadcrumbs from "./Page/Breadcrumbs.svelte";
2023-03-05 17:10:29 +00:00
import { getWorldPage, getWorldY, type WorldY } from "../lib/doc";
import { routes } from "../lib/routes";
import { loadWorlds } from "../lib/worldStorage";
export let worldId: string;
export let pageId: string;
async function loadDoc(
worldId: string,
2023-08-29 23:50:09 +00:00
pageId: string,
2023-03-05 17:10:29 +00:00
): Promise<{ worldY: WorldY; doc: XmlFragment }> {
const worlds = await loadWorlds();
const worldIdentifier = worlds.find((w) => w.room === worldId);
if (!worldIdentifier) {
throw new Error("No conozco ese mundo.");
}
const worldY = getWorldY(worldIdentifier);
2023-03-25 23:28:56 +00:00
2023-03-05 17:10:29 +00:00
return { worldY, doc: getWorldPage(worldY.ydoc, pageId) };
}
2023-03-25 23:28:56 +00:00
let state: "loading" | { worldY: WorldY; doc: XmlFragment } | { error: any };
$: {
state = "loading";
loadDoc(worldId, pageId)
.then((doc) => {
state = doc;
})
.catch((error) => (state = { error }));
}
2023-09-07 15:19:53 +00:00
function pop() {
history.back();
}
2023-03-05 17:10:29 +00:00
</script>
2023-09-07 15:19:53 +00:00
<div class="px-4">
<details>
<summary>Opciones</summary>
<ul>
<li><a href={routes.ChooseWorld}>🠔 Elegir otro mundo</a></li>
<li>
<a href={inject(routes.ShareWorld, { worldId })}
>📱 Agregar mundo a otro dispositivo</a
>
</li>
</ul>
</details>
2023-09-07 15:19:53 +00:00
</div>
<nav
class="sticky top-0 z-10 flex h-10 items-stretch gap-4 bg-white text-neutral-700 shadow dark:bg-neutral-800 dark:text-neutral-200"
>
<button title="Ir a la página anterior" on:click={pop}>
<ArrowBackIcon class="w-10 shrink-0 fill-current pl-2" />
</button>
2023-08-31 12:45:18 +00:00
<Breadcrumbs {pageId} {worldId} />
</nav>
2023-03-25 23:28:56 +00:00
{#if state === "loading"}Cargando...{:else if "doc" in state}
<Editor doc={state.doc} worldY={state.worldY} />
{:else if "error" in state}
{state.error}
2023-03-05 17:10:29 +00:00
<a href={routes.ChooseWorld}>Volver al inicio</a>
2023-03-25 23:28:56 +00:00
{/if}