diff --git a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte index 867b40ade4..94710a01cf 100644 --- a/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte +++ b/frontend/src/lib/components/apps/components/helpers/RunnableComponent.svelte @@ -33,7 +33,8 @@ isEditor, jobs, noBackend, - errorByComponent + errorByComponent, + mode } = getContext('AppEditorContext') onMount(() => { @@ -48,7 +49,6 @@ let args: Record = {} let testIsLoading = false let runnableInputValues: Record = {} - let executeTimeout: NodeJS.Timeout | undefined = undefined function setDebouncedExecute() { @@ -256,7 +256,12 @@ let lastStartedAt: number = Date.now() function recordError(error: string) { - $errorByComponent[id] = error + if (testJob) { + $errorByComponent[testJob.id] = { + error: error, + componentId: id + } + } } $: result?.error && recordError(result.error) @@ -283,8 +288,12 @@ outputs.result?.set(testJob?.result) result = testJob.result - if ($errorByComponent[id] && !result?.error) { - delete $errorByComponent[id] + const previousJobId = Object.keys($errorByComponent).find( + (key) => $errorByComponent[key].componentId === id + ) + + if (previousJobId && !result?.error) { + delete $errorByComponent[previousJobId] $errorByComponent = $errorByComponent } } @@ -318,6 +327,19 @@ Please select a runnable + {:else if result?.error && $mode === 'preview'} +
+ +
+ An error occured, please contact the app author. + Job id: {testJob?.id} +
{JSON.stringify(result.error, null, 4)}
+				
+
+
+ +
{:else}
diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index c920d3c51b..7e06028e91 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -54,7 +54,7 @@ }) const runnableComponents = writable Promise>>({}) - const errorByComponent = writable>({}) + const errorByComponent = writable>({}) setContext('AppEditorContext', { worldStore, @@ -74,7 +74,8 @@ jobs: writable([]), staticExporter: writable({}), noBackend: false, - errorByComponent + errorByComponent, + openDebugRun: writable(undefined) }) let timeout: NodeJS.Timeout | undefined = undefined diff --git a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte index a6f1da4f6d..8fedafd7cf 100644 --- a/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditorHeader.svelte @@ -57,13 +57,34 @@ export let policy: Policy - const { app, summary, mode, breakpoint, appPath, jobs, staticExporter, errorByComponent } = - getContext('AppEditorContext') + const { + app, + summary, + mode, + breakpoint, + appPath, + jobs, + staticExporter, + errorByComponent, + openDebugRun + } = getContext('AppEditorContext') + const loading = { publish: false, save: false } + $: if ($openDebugRun == undefined) { + $openDebugRun = (componentId: string) => { + jobsDrawerOpen = true + + const job = $jobs.find((job) => job.component === componentId) + if (job) { + selectedJobId = job.job + } + } + } + let newPath: string = '' let pathError: string | undefined = undefined @@ -219,10 +240,13 @@ {#each $jobs ?? [] as { job, component } (job)}
(selectedJobId = job)} > {job} diff --git a/frontend/src/lib/components/apps/editor/AppPreview.svelte b/frontend/src/lib/components/apps/editor/AppPreview.svelte index 93cd7d1bd5..d4c9980d6e 100644 --- a/frontend/src/lib/components/apps/editor/AppPreview.svelte +++ b/frontend/src/lib/components/apps/editor/AppPreview.svelte @@ -60,7 +60,8 @@ jobs: writable([]), staticExporter: writable({}), noBackend, - errorByComponent: writable({}) + errorByComponent: writable({}), + openDebugRun: writable(undefined) }) let mounted = false diff --git a/frontend/src/lib/components/apps/editor/ComponentHeader.svelte b/frontend/src/lib/components/apps/editor/ComponentHeader.svelte index 1933cfd477..d0fe181c5a 100644 --- a/frontend/src/lib/components/apps/editor/ComponentHeader.svelte +++ b/frontend/src/lib/components/apps/editor/ComponentHeader.svelte @@ -14,9 +14,15 @@ const dispatch = createEventDispatcher() - const { errorByComponent } = getContext('AppEditorContext') + const { errorByComponent, openDebugRun } = getContext('AppEditorContext') - $: error = $errorByComponent[component.id] + $: error = Object.values($errorByComponent).find((e) => e.componentId === component.id) + + function openDebugRuns() { + if ($openDebugRun) { + $openDebugRun(component.id) + } + }
- -
- See "Debug Runs" on the top right for more details + +
+
+
{json?.stack ?? ''}
+									
+
+
diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index 33ea63cf5f..b6cac0f0f0 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -172,7 +172,8 @@ export type AppEditorContext = { isEditor: boolean jobs: Writable<{ job: string; component: string }[]> noBackend: boolean - errorByComponent: Writable> + errorByComponent: Writable> + openDebugRun: Writable<((componentID: string) => void) | undefined> } export type EditorMode = 'dnd' | 'preview'