Convert InProgressMethods to an interface (#2970)

This commit is contained in:
Charis Kyriakou
2023-10-13 14:56:33 +01:00
committed by GitHub
parent f5f5b398fe
commit a5139b7fbf
8 changed files with 47 additions and 46 deletions

View File

@@ -1,34 +1,28 @@
/** /**
* A class that keeps track of which methods are in progress for each package. * An interface to help keep track of which methods are in progress for each package.
*
* This class is immutable and therefore is safe to be used in a React useState hook.
*/ */
export class InProgressMethods { export type InProgressMethods = Record<string, string[]>;
// A map of in-progress method signatures for each package.
private readonly methodMap: ReadonlyMap<string, Set<string>>;
constructor(methodMap?: ReadonlyMap<string, Set<string>>) { export function setPackageInProgressMethods(
this.methodMap = methodMap ?? new Map<string, Set<string>>(); inProgressMethods: InProgressMethods,
} packageName: string,
methods: string[],
/** ): InProgressMethods {
* Sets the in-progress methods for the given package. return {
* Returns a new InProgressMethods instance. ...inProgressMethods,
*/ [packageName]: methods,
public setPackageMethods( };
packageName: string, }
methods: Set<string>,
): InProgressMethods { export function hasInProgressMethod(
const newMethodMap = new Map<string, Set<string>>(this.methodMap); inProgressMethods: InProgressMethods,
newMethodMap.set(packageName, methods); packageName: string,
return new InProgressMethods(newMethodMap); method: string,
} ): boolean {
const methods = inProgressMethods[packageName];
public hasMethod(packageName: string, method: string): boolean { if (methods) {
const methods = this.methodMap.get(packageName); return methods.includes(method);
if (methods) { }
return methods.has(method);
} return false;
return false;
}
} }

View File

@@ -5,7 +5,6 @@ import { Meta, StoryFn } from "@storybook/react";
import { Mode } from "../../model-editor/shared/mode"; import { Mode } from "../../model-editor/shared/mode";
import { LibraryRow as LibraryRowComponent } from "../../view/model-editor/LibraryRow"; import { LibraryRow as LibraryRowComponent } from "../../view/model-editor/LibraryRow";
import { CallClassification } from "../../model-editor/method"; import { CallClassification } from "../../model-editor/method";
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
import { createMockExtensionPack } from "../../../test/factories/model-editor/extension-pack"; import { createMockExtensionPack } from "../../../test/factories/model-editor/extension-pack";
export default { export default {
@@ -219,7 +218,7 @@ LibraryRow.args = {
], ],
}, },
modifiedSignatures: new Set(["org.sql2o.Sql2o#Sql2o(String)"]), modifiedSignatures: new Set(["org.sql2o.Sql2o#Sql2o(String)"]),
inProgressMethods: new InProgressMethods(), inProgressMethods: {},
viewState: { viewState: {
extensionPack: createMockExtensionPack(), extensionPack: createMockExtensionPack(),
showFlowGeneration: true, showFlowGeneration: true,

View File

@@ -14,7 +14,10 @@ import {
VSCodeTag, VSCodeTag,
} from "@vscode/webview-ui-toolkit/react"; } from "@vscode/webview-ui-toolkit/react";
import { ModelEditorViewState } from "../../model-editor/shared/view-state"; import { ModelEditorViewState } from "../../model-editor/shared/view-state";
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods"; import {
InProgressMethods,
hasInProgressMethod,
} from "../../model-editor/shared/in-progress-methods";
const LibraryContainer = styled.div` const LibraryContainer = styled.div`
background-color: var(--vscode-peekViewResult-background); background-color: var(--vscode-peekViewResult-background);
@@ -177,7 +180,7 @@ export const LibraryRow = ({
const canStopAutoModeling = useMemo(() => { const canStopAutoModeling = useMemo(() => {
return methods.some((method) => return methods.some((method) =>
inProgressMethods.hasMethod(title, method.signature), hasInProgressMethod(inProgressMethods, title, method.signature),
); );
}, [methods, title, inProgressMethods]); }, [methods, title, inProgressMethods]);

View File

@@ -17,7 +17,10 @@ import { ModelEditorViewState } from "../../model-editor/shared/view-state";
import { ModeledMethodsList } from "./ModeledMethodsList"; import { ModeledMethodsList } from "./ModeledMethodsList";
import { percentFormatter } from "./formatters"; import { percentFormatter } from "./formatters";
import { Mode } from "../../model-editor/shared/mode"; import { Mode } from "../../model-editor/shared/mode";
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods"; import {
InProgressMethods,
setPackageInProgressMethods,
} from "../../model-editor/shared/in-progress-methods";
import { getLanguageDisplayName } from "../../common/query-language"; import { getLanguageDisplayName } from "../../common/query-language";
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../../model-editor/shared/hide-modeled-methods"; import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../../model-editor/shared/hide-modeled-methods";
@@ -94,7 +97,7 @@ export function ModelEditor({
); );
const [inProgressMethods, setInProgressMethods] = useState<InProgressMethods>( const [inProgressMethods, setInProgressMethods] = useState<InProgressMethods>(
new InProgressMethods(), {},
); );
const [hideModeledMethods, setHideModeledMethods] = useState( const [hideModeledMethods, setHideModeledMethods] = useState(
@@ -135,9 +138,10 @@ export function ModelEditor({
break; break;
case "setInProgressMethods": case "setInProgressMethods":
setInProgressMethods((oldInProgressMethods) => setInProgressMethods((oldInProgressMethods) =>
oldInProgressMethods.setPackageMethods( setPackageInProgressMethods(
oldInProgressMethods,
msg.packageName, msg.packageName,
new Set(msg.inProgressMethods), msg.inProgressMethods,
), ),
); );
break; break;

View File

@@ -9,7 +9,10 @@ import { Method, canMethodBeModeled } from "../../model-editor/method";
import { ModeledMethod } from "../../model-editor/modeled-method"; import { ModeledMethod } from "../../model-editor/modeled-method";
import { useMemo } from "react"; import { useMemo } from "react";
import { sortMethods } from "../../model-editor/shared/sorting"; import { sortMethods } from "../../model-editor/shared/sorting";
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods"; import {
InProgressMethods,
hasInProgressMethod,
} from "../../model-editor/shared/in-progress-methods";
import { HiddenMethodsRow } from "./HiddenMethodsRow"; import { HiddenMethodsRow } from "./HiddenMethodsRow";
import { ModelEditorViewState } from "../../model-editor/shared/view-state"; import { ModelEditorViewState } from "../../model-editor/shared/view-state";
import { ScreenReaderOnly } from "../common/ScreenReaderOnly"; import { ScreenReaderOnly } from "../common/ScreenReaderOnly";
@@ -107,7 +110,8 @@ export const ModeledMethodDataGrid = ({
methodCanBeModeled={methodCanBeModeled} methodCanBeModeled={methodCanBeModeled}
modeledMethods={modeledMethods} modeledMethods={modeledMethods}
methodIsUnsaved={modifiedSignatures.has(method.signature)} methodIsUnsaved={modifiedSignatures.has(method.signature)}
modelingInProgress={inProgressMethods.hasMethod( modelingInProgress={hasInProgressMethod(
inProgressMethods,
packageName, packageName,
method.signature, method.signature,
)} )}

View File

@@ -2,7 +2,6 @@ import * as React from "react";
import { render as reactRender, screen } from "@testing-library/react"; import { render as reactRender, screen } from "@testing-library/react";
import { createMethod } from "../../../../test/factories/model-editor/method-factories"; import { createMethod } from "../../../../test/factories/model-editor/method-factories";
import { LibraryRow, LibraryRowProps } from "../LibraryRow"; import { LibraryRow, LibraryRowProps } from "../LibraryRow";
import { InProgressMethods } from "../../../model-editor/shared/in-progress-methods";
import { createMockExtensionPack } from "../../../../test/factories/model-editor/extension-pack"; import { createMockExtensionPack } from "../../../../test/factories/model-editor/extension-pack";
import { Mode } from "../../../model-editor/shared/mode"; import { Mode } from "../../../model-editor/shared/mode";
import { ModelEditorViewState } from "../../../model-editor/shared/view-state"; import { ModelEditorViewState } from "../../../model-editor/shared/view-state";
@@ -44,7 +43,7 @@ describe(LibraryRow.name, () => {
], ],
}} }}
modifiedSignatures={new Set([method.signature])} modifiedSignatures={new Set([method.signature])}
inProgressMethods={new InProgressMethods()} inProgressMethods={{}}
viewState={viewState} viewState={viewState}
hideModeledMethods={false} hideModeledMethods={false}
revealedMethodSignature={null} revealedMethodSignature={null}

View File

@@ -1,7 +1,6 @@
import * as React from "react"; import * as React from "react";
import { render as reactRender, screen } from "@testing-library/react"; import { render as reactRender, screen } from "@testing-library/react";
import { createMethod } from "../../../../test/factories/model-editor/method-factories"; import { createMethod } from "../../../../test/factories/model-editor/method-factories";
import { InProgressMethods } from "../../../model-editor/shared/in-progress-methods";
import { Mode } from "../../../model-editor/shared/mode"; import { Mode } from "../../../model-editor/shared/mode";
import { import {
ModeledMethodDataGrid, ModeledMethodDataGrid,
@@ -70,7 +69,7 @@ describe(ModeledMethodDataGrid.name, () => {
], ],
}} }}
modifiedSignatures={new Set([method1.signature])} modifiedSignatures={new Set([method1.signature])}
inProgressMethods={new InProgressMethods()} inProgressMethods={{}}
viewState={viewState} viewState={viewState}
hideModeledMethods={false} hideModeledMethods={false}
revealedMethodSignature={null} revealedMethodSignature={null}

View File

@@ -1,7 +1,6 @@
import * as React from "react"; import * as React from "react";
import { render as reactRender, screen } from "@testing-library/react"; import { render as reactRender, screen } from "@testing-library/react";
import { createMethod } from "../../../../test/factories/model-editor/method-factories"; import { createMethod } from "../../../../test/factories/model-editor/method-factories";
import { InProgressMethods } from "../../../model-editor/shared/in-progress-methods";
import { createMockExtensionPack } from "../../../../test/factories/model-editor/extension-pack"; import { createMockExtensionPack } from "../../../../test/factories/model-editor/extension-pack";
import { Mode } from "../../../model-editor/shared/mode"; import { Mode } from "../../../model-editor/shared/mode";
import { ModelEditorViewState } from "../../../model-editor/shared/view-state"; import { ModelEditorViewState } from "../../../model-editor/shared/view-state";
@@ -70,7 +69,7 @@ describe(ModeledMethodsList.name, () => {
], ],
}} }}
modifiedSignatures={new Set([method1.signature])} modifiedSignatures={new Set([method1.signature])}
inProgressMethods={new InProgressMethods()} inProgressMethods={{}}
viewState={viewState} viewState={viewState}
hideModeledMethods={false} hideModeledMethods={false}
revealedMethodSignature={null} revealedMethodSignature={null}