| <script lang="ts"> | |
| import { Gradio, formatter } from "./gradio_helper"; | |
| import { onMount, createEventDispatcher, setContext } from "svelte"; | |
| import type { ComponentMeta, ThemeMode } from "./types"; | |
| import type { Client } from "@gradio/client"; | |
| import RenderComponent from "./RenderComponent.svelte"; | |
| import { load_component } from "virtual:component-loader"; | |
| export let root: string; | |
| export let node: ComponentMeta; | |
| export let parent: string | null = null; | |
| export let target: HTMLElement; | |
| export let theme_mode: ThemeMode; | |
| export let version: string; | |
| export let autoscroll: boolean; | |
| export let max_file_size: number | null; | |
| export let client: Client; | |
| const dispatch = createEventDispatcher<{ mount: number; destroy: number }>(); | |
| let filtered_children: ComponentMeta[] = []; | |
| onMount(() => { | |
| dispatch("mount", node.id); | |
| for (const child of filtered_children) { | |
| dispatch("mount", child.id); | |
| } | |
| return () => { | |
| dispatch("destroy", node.id); | |
| for (const child of filtered_children) { | |
| dispatch("mount", child.id); | |
| } | |
| }; | |
| }); | |
| $: { | |
| if (node) { | |
| node.children = | |
| node.children && | |
| node.children.filter((v) => { | |
| const valid_node = node.type !== "statustracker"; | |
| if (!valid_node) { | |
| filtered_children.push(v); | |
| } | |
| return valid_node; | |
| }); | |
| } | |
| } | |
| setContext("BLOCK_KEY", parent); | |
| $: { | |
| if (node && node.type === "form") { | |
| if (node.children?.every((c) => !c.props.visible)) { | |
| node.props.visible = false; | |
| } else { | |
| node.props.visible = true; | |
| } | |
| } | |
| } | |
| $: node.props.gradio = new Gradio<Record<string, any>>( | |
| node.id, | |
| target, | |
| theme_mode, | |
| version, | |
| root, | |
| autoscroll, | |
| max_file_size, | |
| formatter, | |
| client, | |
| load_component | |
| ); | |
| </script> | |
| <RenderComponent | |
| _id={node?.id} | |
| component={node.component} | |
| bind:instance={node.instance} | |
| bind:value={node.props.value} | |
| elem_id={("elem_id" in node.props && node.props.elem_id) || | |
| `component-${node.id}`} | |
| elem_classes={("elem_classes" in node.props && node.props.elem_classes) || []} | |
| {target} | |
| {...node.props} | |
| {theme_mode} | |
| {root} | |
| > | |
| {#if node.children && node.children.length} | |
| {#each node.children as _node (_node.id)} | |
| <svelte:self | |
| node={_node} | |
| component={_node.component} | |
| {target} | |
| id={_node.id} | |
| {root} | |
| {theme_mode} | |
| on:destroy | |
| on:mount | |
| {max_file_size} | |
| {client} | |
| /> | |
| {/each} | |
| {/if} | |
| </RenderComponent> | |