vorteil/direktiv

View on GitHub
ui/src/pages/namespace/Explorer/Endpoint/EndpointEditor/Form/plugins/Inbound/HeaderManipulationForm/HeaderArrayForm.tsx

Summary

Maintainability
C
7 hrs
Test Coverage
import { ArrayForm } from "~/components/Form/Array";
import { ControllerRenderProps } from "react-hook-form";
import { HeaderManipulationFormSchemaType } from "../../../../schema/plugins/inbound/headerManipulation";
import Input from "~/design/Input";
import { useTranslation } from "react-i18next";

type HeaderArrayFormProps = {
  field:
    | ControllerRenderProps<
        HeaderManipulationFormSchemaType,
        "configuration.headers_to_add"
      >
    | ControllerRenderProps<
        HeaderManipulationFormSchemaType,
        "configuration.headers_to_modify"
      >
    | ControllerRenderProps<
        HeaderManipulationFormSchemaType,
        "configuration.headers_to_remove"
      >;
};

export const HeaderArrayForm = ({ field }: HeaderArrayFormProps) => {
  const { t } = useTranslation();
  const isHeadersToRemove = field.name === "configuration.headers_to_remove";
  const emptyItem = isHeadersToRemove ? { name: "" } : { name: "", value: "" };
  return (
    <div className="grid gap-5">
      <ArrayForm
        defaultValue={field.value || []}
        onChange={field.onChange}
        emptyItem={emptyItem}
        itemIsValid={(item) =>
          !!item && Object.values(item).every((v) => v !== "")
        }
        renderItem={({ value: objectValue, setValue, handleKeyDown }) => (
          <>
            {Object.entries(objectValue).map(([key, value]) => {
              const typedKey = key as keyof typeof objectValue;
              return (
                <Input
                  key={key}
                  data-testid={`env-${typedKey}`}
                  placeholder={t(
                    `pages.explorer.endpoint.editor.form.plugins.inbound.headerManipulation.${typedKey}Placeholder`
                  )}
                  value={value}
                  onKeyDown={handleKeyDown}
                  onChange={(e) => {
                    const newObject = {
                      ...objectValue,
                      [key]: e.target.value,
                    };
                    setValue(newObject);
                  }}
                />
              );
            })}
          </>
        )}
      />
    </div>
  );
};