diff --git a/src/utils/handlers/metadataUpdateHandler.ts b/src/utils/handlers/metadataUpdateHandler.ts index e9335209f..a4b7f977c 100644 --- a/src/utils/handlers/metadataUpdateHandler.ts +++ b/src/utils/handlers/metadataUpdateHandler.ts @@ -14,6 +14,7 @@ import { UpdatePrivateMetadataVariables } from "../metadata/types/UpdatePrivateMetadata"; import { filterMetadataArray } from "./filterMetadataArray"; +import { areMetadataArraysEqual } from "./metadataUpdateHelpers"; interface ObjectWithMetadata { id: string; @@ -36,12 +37,21 @@ function createMetadataUpdateHandler( ): Promise> => { const errors = await update(data); + const hasMetadataChanged = !areMetadataArraysEqual( + initial.metadata, + data.metadata + ); + const hasPrivateMetadataChanged = !areMetadataArraysEqual( + initial.privateMetadata, + data.privateMetadata + ); + if (errors.length > 0) { return errors; } if (errors.length === 0) { - if (data.metadata) { + if (data.metadata && hasMetadataChanged) { const initialKeys = initial.metadata.map(m => m.key); const modifiedKeys = data.metadata.map(m => m.key); @@ -63,7 +73,7 @@ function createMetadataUpdateHandler( } } - if (data.privateMetadata) { + if (data.privateMetadata && hasPrivateMetadataChanged) { const initialKeys = initial.privateMetadata.map(m => m.key); const modifiedKeys = data.privateMetadata.map(m => m.key); diff --git a/src/utils/handlers/metadataUpdateHelpers.ts b/src/utils/handlers/metadataUpdateHelpers.ts new file mode 100644 index 000000000..eea17d66a --- /dev/null +++ b/src/utils/handlers/metadataUpdateHelpers.ts @@ -0,0 +1,16 @@ +import { MetadataInput } from "@saleor/sdk/dist/apollo/types"; +import isEqual from "lodash/isEqual"; +import sortBy from "lodash/sortBy"; + +export interface GenericMetadataInput extends MetadataInput { + __typename?: string; +} + +const removeTypename = ({ __typename, ...input }: GenericMetadataInput) => ({ + ...input +}); + +export const areMetadataArraysEqual = ( + before: GenericMetadataInput[], + after: MetadataInput[] +) => isEqual(sortBy(before.map(removeTypename)), sortBy(after)); diff --git a/src/utils/metadata/types/UpdateMetadata.ts b/src/utils/metadata/types/UpdateMetadata.ts index a6b95eefa..bc047717a 100644 --- a/src/utils/metadata/types/UpdateMetadata.ts +++ b/src/utils/metadata/types/UpdateMetadata.ts @@ -15,29 +15,9 @@ export interface UpdateMetadata_updateMetadata_errors { field: string | null; } -export interface UpdateMetadata_updateMetadata_item_metadata { - __typename: "MetadataItem"; - key: string; - value: string; -} - -export interface UpdateMetadata_updateMetadata_item_privateMetadata { - __typename: "MetadataItem"; - key: string; - value: string; -} - -export interface UpdateMetadata_updateMetadata_item { - __typename: "App" | "Attribute" | "Category" | "Checkout" | "Collection" | "DigitalContent" | "Fulfillment" | "GiftCard" | "Invoice" | "Menu" | "MenuItem" | "Order" | "Page" | "PageType" | "Payment" | "Product" | "ProductType" | "ProductVariant" | "Sale" | "ShippingMethod" | "ShippingMethodType" | "ShippingZone" | "User" | "Voucher" | "Warehouse"; - metadata: (UpdateMetadata_updateMetadata_item_metadata | null)[]; - privateMetadata: (UpdateMetadata_updateMetadata_item_privateMetadata | null)[]; - id: string; -} - export interface UpdateMetadata_updateMetadata { __typename: "UpdateMetadata"; errors: UpdateMetadata_updateMetadata_errors[]; - item: UpdateMetadata_updateMetadata_item | null; } export interface UpdateMetadata_deleteMetadata_errors { diff --git a/src/utils/metadata/types/UpdatePrivateMetadata.ts b/src/utils/metadata/types/UpdatePrivateMetadata.ts index e846523d2..6c9436f51 100644 --- a/src/utils/metadata/types/UpdatePrivateMetadata.ts +++ b/src/utils/metadata/types/UpdatePrivateMetadata.ts @@ -15,29 +15,9 @@ export interface UpdatePrivateMetadata_updatePrivateMetadata_errors { field: string | null; } -export interface UpdatePrivateMetadata_updatePrivateMetadata_item_metadata { - __typename: "MetadataItem"; - key: string; - value: string; -} - -export interface UpdatePrivateMetadata_updatePrivateMetadata_item_privateMetadata { - __typename: "MetadataItem"; - key: string; - value: string; -} - -export interface UpdatePrivateMetadata_updatePrivateMetadata_item { - __typename: "App" | "Attribute" | "Category" | "Checkout" | "Collection" | "DigitalContent" | "Fulfillment" | "GiftCard" | "Invoice" | "Menu" | "MenuItem" | "Order" | "Page" | "PageType" | "Payment" | "Product" | "ProductType" | "ProductVariant" | "Sale" | "ShippingMethod" | "ShippingMethodType" | "ShippingZone" | "User" | "Voucher" | "Warehouse"; - metadata: (UpdatePrivateMetadata_updatePrivateMetadata_item_metadata | null)[]; - privateMetadata: (UpdatePrivateMetadata_updatePrivateMetadata_item_privateMetadata | null)[]; - id: string; -} - export interface UpdatePrivateMetadata_updatePrivateMetadata { __typename: "UpdatePrivateMetadata"; errors: UpdatePrivateMetadata_updatePrivateMetadata_errors[]; - item: UpdatePrivateMetadata_updatePrivateMetadata_item | null; } export interface UpdatePrivateMetadata_deletePrivateMetadata_errors { diff --git a/src/utils/metadata/updateMetadata.ts b/src/utils/metadata/updateMetadata.ts index 1a0375834..4d19f3ed5 100644 --- a/src/utils/metadata/updateMetadata.ts +++ b/src/utils/metadata/updateMetadata.ts @@ -24,12 +24,6 @@ const updateMetadata = gql` errors { ...MetadataErrorFragment } - item { - ...MetadataFragment - ... on Node { - id - } - } } deleteMetadata(id: $id, keys: $keysToDelete) { errors { @@ -61,12 +55,6 @@ const updatePrivateMetadata = gql` errors { ...MetadataErrorFragment } - item { - ...MetadataFragment - ... on Node { - id - } - } } deletePrivateMetadata(id: $id, keys: $keysToDelete) { errors {