saleor-dashboard/src/components/Metadata/Metadata.tsx
Dominik Żegleń 7770ae34df
Add metadata (#670)
* Add metadata editor component

* Add tests

* Fix plurals

* Use pascal case in selectors

* Update product metadata

* Add metadata handler decorator

* Update snapshots

* wip

* Remove operation provider component

* Add metadata to collections

* Add metadata editor to variant

* Add metadata editor to categories

* Add metadata to product types

* Simplify code

* Add metadata to attributes

* Drop maybe

* Rename Metadata to MetadataFragment

* Update changelog and snapshots
2020-08-28 14:45:11 +02:00

73 lines
2.1 KiB
TypeScript

import { ChangeEvent } from "@saleor/hooks/useForm";
import { MetadataInput } from "@saleor/types/globalTypes";
import { removeAtIndex, updateAtIndex } from "@saleor/utils/lists";
import React from "react";
import CardSpacer from "../CardSpacer";
import MetadataCard, { MetadataCardProps } from "./MetadataCard";
import { EventDataAction, EventDataField } from "./types";
import { getDataKey, parseEventData } from "./utils";
export interface MetadataProps
extends Omit<MetadataCardProps, "data" | "isPrivate"> {
data: Record<"metadata" | "privateMetadata", MetadataInput[]>;
}
const Metadata: React.FC<MetadataProps> = ({ data, onChange }) => {
const change = (event: ChangeEvent, isPrivate: boolean) => {
const { action, field, fieldIndex, value } = parseEventData(event);
const key = getDataKey(isPrivate);
const dataToUpdate = data[key];
onChange({
target: {
name: key,
value:
action === EventDataAction.update
? updateAtIndex(
{
...dataToUpdate[fieldIndex],
key:
field === EventDataField.name
? value
: dataToUpdate[fieldIndex].key,
value:
field === EventDataField.value
? value
: dataToUpdate[fieldIndex].value
},
dataToUpdate,
fieldIndex
)
: action === EventDataAction.add
? [
...dataToUpdate,
{
key: "",
value: ""
}
]
: removeAtIndex(dataToUpdate, fieldIndex)
}
});
};
return (
<>
<MetadataCard
data={data?.metadata}
isPrivate={false}
onChange={event => change(event, false)}
/>
<CardSpacer />
<MetadataCard
data={data?.privateMetadata}
isPrivate={true}
onChange={event => change(event, true)}
/>
</>
);
};
Metadata.displayName = "Metadata";
export default Metadata;