Track changed signatures instead of unsaved models

This commit is contained in:
Robert
2023-07-14 16:08:25 +01:00
parent ccda490ab4
commit e73421dabb
3 changed files with 32 additions and 41 deletions

View File

@@ -17,7 +17,6 @@ import { DataExtensionEditorViewState } from "../../data-extensions-editor/share
import { ModeledMethodsList } from "./ModeledMethodsList";
import { percentFormatter } from "./formatters";
import { Mode } from "../../data-extensions-editor/shared/mode";
import { groupMethods } from "../../data-extensions-editor/shared/sorting";
const LoadingContainer = styled.div`
text-align: center;
@@ -75,7 +74,9 @@ export function DataExtensionsEditor({
const [externalApiUsages, setExternalApiUsages] = useState<
ExternalApiUsage[]
>(initialExternalApiUsages);
const [unsavedModels, setUnsavedModels] = useState<Set<string>>(new Set());
const [modifiedSignatures, setModifiedSignatures] = useState<Set<string>>(
new Set(),
);
const [modeledMethods, setModeledMethods] = useState<
Record<string, ModeledMethod>
@@ -119,15 +120,11 @@ export function DataExtensionsEditor({
),
};
});
setUnsavedModels(
(oldUnsavedModels) =>
setModifiedSignatures(
(oldModifiedSignatures) =>
new Set([
...oldUnsavedModels,
...modelsAffectedByNewModeledMethods(
msg.modeledMethods,
externalApiUsages,
viewState?.mode ?? Mode.Application,
),
...oldModifiedSignatures,
...Object.keys(msg.modeledMethods),
]),
);
break;
@@ -145,7 +142,7 @@ export function DataExtensionsEditor({
return () => {
window.removeEventListener("message", listener);
};
}, [externalApiUsages, viewState?.mode]);
}, []);
const modeledPercentage = useMemo(
() => calculateModeledPercentage(externalApiUsages),
@@ -160,8 +157,9 @@ export function DataExtensionsEditor({
...oldModeledMethods,
[method.signature]: model,
}));
setUnsavedModels(
(oldUnsavedModels) => new Set([...oldUnsavedModels, modelName]),
setModifiedSignatures(
(oldModifiedSignatures) =>
new Set([...oldModifiedSignatures, method.signature]),
);
},
[],
@@ -179,12 +177,11 @@ export function DataExtensionsEditor({
externalApiUsages,
modeledMethods,
});
setUnsavedModels(new Set());
setModifiedSignatures(new Set());
}, [externalApiUsages, modeledMethods]);
const onSaveModelClick = useCallback(
(
modelName: string,
externalApiUsages: ExternalApiUsage[],
modeledMethods: Record<string, ModeledMethod>,
) => {
@@ -193,10 +190,12 @@ export function DataExtensionsEditor({
externalApiUsages,
modeledMethods,
});
setUnsavedModels((oldUnsavedModels) => {
const newUnsavedModels = new Set(oldUnsavedModels);
newUnsavedModels.delete(modelName);
return newUnsavedModels;
setModifiedSignatures((oldModifiedSignatures) => {
const newModifiedSignatures = new Set([...oldModifiedSignatures]);
for (const externalApiUsage of externalApiUsages) {
newModifiedSignatures.delete(externalApiUsage.signature);
}
return newModifiedSignatures;
});
},
[],
@@ -317,8 +316,8 @@ export function DataExtensionsEditor({
</ButtonsContainer>
<ModeledMethodsList
externalApiUsages={externalApiUsages}
unsavedModels={unsavedModels}
modeledMethods={modeledMethods}
modifiedSignatures={modifiedSignatures}
viewState={viewState}
onChange={onChange}
onSaveModelClick={onSaveModelClick}
@@ -331,15 +330,3 @@ export function DataExtensionsEditor({
</DataExtensionsEditorContainer>
);
}
function modelsAffectedByNewModeledMethods(
modeledMethods: Record<string, ModeledMethod>,
externalApiUsages: ExternalApiUsage[],
mode: Mode,
): string[] {
const signatures = new Set(Object.keys(modeledMethods));
const affectedExternalApiUsages = externalApiUsages.filter(
(externalApiUsage) => signatures.has(externalApiUsage.signature),
);
return Object.keys(groupMethods(affectedExternalApiUsages, mode));
}

View File

@@ -71,15 +71,14 @@ type Props = {
libraryVersion?: string;
externalApiUsages: ExternalApiUsage[];
modeledMethods: Record<string, ModeledMethod>;
modifiedSignatures: Set<string>;
viewState: DataExtensionEditorViewState;
hasUnsavedChanges: boolean;
onChange: (
modelName: string,
externalApiUsage: ExternalApiUsage,
modeledMethod: ModeledMethod,
) => void;
onSaveModelClick: (
modelName: string,
externalApiUsages: ExternalApiUsage[],
modeledMethods: Record<string, ModeledMethod>,
) => void;
@@ -95,8 +94,8 @@ export const LibraryRow = ({
libraryVersion,
externalApiUsages,
modeledMethods,
modifiedSignatures,
viewState,
hasUnsavedChanges,
onChange,
onSaveModelClick,
onGenerateFromLlmClick,
@@ -137,11 +136,11 @@ export const LibraryRow = ({
const handleSave = useCallback(
async (e: React.MouseEvent) => {
onSaveModelClick(title, externalApiUsages, modeledMethods);
onSaveModelClick(externalApiUsages, modeledMethods);
e.stopPropagation();
e.preventDefault();
},
[title, externalApiUsages, modeledMethods, onSaveModelClick],
[externalApiUsages, modeledMethods, onSaveModelClick],
);
const onChangeWithModelName = useCallback(
@@ -151,6 +150,12 @@ export const LibraryRow = ({
[onChange, title],
);
const hasUnsavedChanges = useMemo(() => {
return externalApiUsages.some((externalApiUsage) =>
modifiedSignatures.has(externalApiUsage.signature),
);
}, [externalApiUsages, modifiedSignatures]);
return (
<LibraryContainer>
<TitleContainer onClick={toggleExpanded} aria-expanded={isExpanded}>

View File

@@ -12,8 +12,8 @@ import { DataExtensionEditorViewState } from "../../data-extensions-editor/share
type Props = {
externalApiUsages: ExternalApiUsage[];
unsavedModels: Set<string>;
modeledMethods: Record<string, ModeledMethod>;
modifiedSignatures: Set<string>;
viewState: DataExtensionEditorViewState;
onChange: (
modelName: string,
@@ -21,7 +21,6 @@ type Props = {
modeledMethod: ModeledMethod,
) => void;
onSaveModelClick: (
modelName: string,
externalApiUsages: ExternalApiUsage[],
modeledMethods: Record<string, ModeledMethod>,
) => void;
@@ -38,8 +37,8 @@ const libraryNameOverrides: Record<string, string> = {
export const ModeledMethodsList = ({
externalApiUsages,
unsavedModels,
modeledMethods,
modifiedSignatures,
viewState,
onChange,
onSaveModelClick,
@@ -79,8 +78,8 @@ export const ModeledMethodsList = ({
title={libraryNameOverrides[libraryName] ?? libraryName}
libraryVersion={libraryVersions[libraryName]}
externalApiUsages={grouped[libraryName]}
hasUnsavedChanges={unsavedModels.has(libraryName)}
modeledMethods={modeledMethods}
modifiedSignatures={modifiedSignatures}
viewState={viewState}
onChange={onChange}
onSaveModelClick={onSaveModelClick}