import { on } from "@storyteller/framework"; import * as studio from "@storyteller/studio"; import { type EntitySelectEvent, type SceneSavedEvent, type SceneStateEvent, SceneState, StudioMode, SceneElement, } from "@storyteller/studio"; import { SceneHierarchyElement, type SceneObject, StudioURLParams, } from "@storyteller/studio-web"; import { CanvasProvider } from "@storyteller/studio-web/canvas-provider"; import { match } from "@storyteller/utility"; import { LitElement, html, nothing } from "lit"; import { customElement, state } from "lit/decorators.js"; import { classMap } from "lit-html/directives/class-map.js"; import { Ref, createRef, ref } from "lit-html/directives/ref.js"; import { v4 as uuid } from "uuid"; import "@storyteller/studio-ui/button"; import "@storyteller/studio-ui/icon"; import "@storyteller/studio-ui/toolbar"; import "@storyteller/studio-ui/tree"; import "@storyteller/studio-web/canvas-provider"; import "@storyteller/studio-web/scene-hierarchy"; import "@storyteller/studio-web/studio"; import "@storyteller/studio-web/transform-toolbar"; import "./anim-editor.element"; import "./help.element"; import "./app.element.scss"; @customElement("app-root") export class AppElement extends LitElement { @state() showHelp = false; @state() loading = true; @state() selection?: SceneObject; #hierarchy = createRef(); #params = new StudioURLParams(); #canvasProvider: Ref = createRef(); protected override createRenderRoot(): Element | ShadowRoot { return this; } @on("scene-saved") async onSceneSaved({ detail: scene }: SceneSavedEvent): Promise { const file = new File([scene], "scene.scn.ron", { type: "text/ron" }); const formData = new FormData(); formData.append("uuid_idempotency_token", uuid()); formData.append("file", file); try { const response = await fetch("https://api.fakeyou.com/v1/engine/create_scene", { method: "POST", credentials: "include", headers: { "Accept": "text/plain" }, body: formData, }); console.log(response); } catch (err) { console.error(err); } } @on("scene-state") onSceneStateChange({ detail: state }: SceneStateEvent): void { console.log("scene state change:", SceneState[state]); this.loading = match (state, { [SceneState.Active]: () => false, _: () => true, }); } @on("entity-select") onEntitySelected({ detail: id }: EntitySelectEvent): void { if (!id) { this.selection = undefined; } else { this.selection = this.#hierarchy.value?.entityMap.get(id); } } attachIkRig(): void { if (this.selection) studio.attachIkRig(this.selection.id); } toggleHelp(): void { this.showHelp = !this.showHelp; } protected override render = () => html` ${this.#params.mode === StudioMode.Editor ? html` studio.saveScene()} > Save Attach IK Rig ` : nothing} Help ${this.#params.mode === StudioMode.Editor ? html` ` : nothing} ${this.showHelp ? html` ` : nothing} ${this.loading ? html`

Loading

` : nothing}
`; }