Track changed signatures instead of unsaved models
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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}>
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user