Enforce that viewState is defined and show a loading screen otherwise

This commit is contained in:
Robert
2023-07-11 16:47:44 +01:00
parent 6cf2f32705
commit 5e84b5f055
3 changed files with 26 additions and 19 deletions

View File

@@ -18,6 +18,13 @@ import { ModeledMethodsList } from "./ModeledMethodsList";
import { percentFormatter } from "./formatters"; import { percentFormatter } from "./formatters";
import { Mode } from "../../data-extensions-editor/shared/mode"; import { Mode } from "../../data-extensions-editor/shared/mode";
const LoadingContainer = styled.div`
text-align: center;
padding: 1em;
font-size: x-large;
font-weight: 600;
`;
const DataExtensionsEditorContainer = styled.div` const DataExtensionsEditorContainer = styled.div`
margin-top: 1rem; margin-top: 1rem;
`; `;
@@ -223,6 +230,10 @@ export function DataExtensionsEditor({
}); });
}, [viewState?.mode]); }, [viewState?.mode]);
if (viewState === undefined) {
return <LoadingContainer>Loading...</LoadingContainer>;
}
return ( return (
<DataExtensionsEditorContainer> <DataExtensionsEditorContainer>
{progress.maxStep > 0 && ( {progress.maxStep > 0 && (
@@ -236,25 +247,21 @@ export function DataExtensionsEditor({
<> <>
<ViewTitle>Data extensions editor</ViewTitle> <ViewTitle>Data extensions editor</ViewTitle>
<DetailsContainer> <DetailsContainer>
{viewState?.extensionPack && ( <LinkIconButton onClick={onOpenExtensionPackClick}>
<> <span slot="start" className="codicon codicon-package"></span>
<LinkIconButton onClick={onOpenExtensionPackClick}> {viewState.extensionPack.name}
<span slot="start" className="codicon codicon-package"></span> </LinkIconButton>
{viewState.extensionPack.name}
</LinkIconButton>
</>
)}
<div> <div>
{percentFormatter.format(modeledPercentage / 100)} modeled {percentFormatter.format(modeledPercentage / 100)} modeled
</div> </div>
<div> <div>
{percentFormatter.format(unModeledPercentage / 100)} unmodeled {percentFormatter.format(unModeledPercentage / 100)} unmodeled
</div> </div>
{viewState?.enableFrameworkMode && ( {viewState.enableFrameworkMode && (
<> <>
<div> <div>
Mode:{" "} Mode:{" "}
{viewState?.mode === Mode.Framework {viewState.mode === Mode.Framework
? "Framework" ? "Framework"
: "Application"} : "Application"}
</div> </div>
@@ -274,17 +281,17 @@ export function DataExtensionsEditor({
<EditorContainer> <EditorContainer>
<ButtonsContainer> <ButtonsContainer>
<VSCodeButton onClick={onSaveAllClick}>Apply</VSCodeButton> <VSCodeButton onClick={onSaveAllClick}>Apply</VSCodeButton>
{viewState?.enableFrameworkMode && ( {viewState.enableFrameworkMode && (
<VSCodeButton appearance="secondary" onClick={onRefreshClick}> <VSCodeButton appearance="secondary" onClick={onRefreshClick}>
Refresh Refresh
</VSCodeButton> </VSCodeButton>
)} )}
<VSCodeButton onClick={onGenerateFromSourceClick}> <VSCodeButton onClick={onGenerateFromSourceClick}>
{viewState?.mode === Mode.Framework {viewState.mode === Mode.Framework
? "Generate" ? "Generate"
: "Download and generate"} : "Download and generate"}
</VSCodeButton> </VSCodeButton>
{viewState?.showLlmButton && ( {viewState.showLlmButton && (
<> <>
<VSCodeButton onClick={onGenerateAllFromLlmClick}> <VSCodeButton onClick={onGenerateAllFromLlmClick}>
Generate using LLM Generate using LLM
@@ -297,7 +304,7 @@ export function DataExtensionsEditor({
unsavedModels={unsavedModels} unsavedModels={unsavedModels}
modeledMethods={modeledMethods} modeledMethods={modeledMethods}
viewState={viewState} viewState={viewState}
mode={viewState?.mode ?? Mode.Application} mode={viewState.mode}
onChange={onChange} onChange={onChange}
onSaveModelClick={onSaveModelClick} onSaveModelClick={onSaveModelClick}
onGenerateFromLlmClick={onGenerateFromLlmClick} onGenerateFromLlmClick={onGenerateFromLlmClick}

View File

@@ -70,7 +70,7 @@ type Props = {
title: string; title: string;
externalApiUsages: ExternalApiUsage[]; externalApiUsages: ExternalApiUsage[];
modeledMethods: Record<string, ModeledMethod>; modeledMethods: Record<string, ModeledMethod>;
viewState: DataExtensionEditorViewState | undefined; viewState: DataExtensionEditorViewState;
mode: Mode; mode: Mode;
hasUnsavedChanges: boolean; hasUnsavedChanges: boolean;
onChange: ( onChange: (
@@ -166,7 +166,7 @@ export const LibraryRow = ({
</ModeledPercentage> </ModeledPercentage>
{hasUnsavedChanges ? <VSCodeTag>UNSAVED</VSCodeTag> : null} {hasUnsavedChanges ? <VSCodeTag>UNSAVED</VSCodeTag> : null}
</NameContainer> </NameContainer>
{viewState?.showLlmButton && ( {viewState.showLlmButton && (
<VSCodeButton appearance="icon" onClick={handleModelWithAI}> <VSCodeButton appearance="icon" onClick={handleModelWithAI}>
<Codicon name="lightbulb-autofix" label="Model with AI" /> <Codicon name="lightbulb-autofix" label="Model with AI" />
&nbsp;Model with AI &nbsp;Model with AI
@@ -176,8 +176,8 @@ export const LibraryRow = ({
<Codicon name="code" label="Model from source" /> <Codicon name="code" label="Model from source" />
&nbsp;Model from source &nbsp;Model from source
</VSCodeButton> </VSCodeButton>
{viewState?.enableFrameworkMode && {viewState.enableFrameworkMode &&
viewState?.mode === Mode.Application && ( viewState.mode === Mode.Application && (
<VSCodeButton appearance="icon" onClick={handleModelDependency}> <VSCodeButton appearance="icon" onClick={handleModelDependency}>
<Codicon name="references" label="Model dependency" /> <Codicon name="references" label="Model dependency" />
&nbsp;Model dependency &nbsp;Model dependency

View File

@@ -14,7 +14,7 @@ type Props = {
externalApiUsages: ExternalApiUsage[]; externalApiUsages: ExternalApiUsage[];
unsavedModels: Set<string>; unsavedModels: Set<string>;
modeledMethods: Record<string, ModeledMethod>; modeledMethods: Record<string, ModeledMethod>;
viewState: DataExtensionEditorViewState | undefined; viewState: DataExtensionEditorViewState;
mode: Mode; mode: Mode;
onChange: ( onChange: (
modelName: string, modelName: string,