sparkletown/sparkle

View on GitHub
src/components/organisms/EntranceButtonsBuilder/EntranceButtonsBuilder.tsx

Summary

Maintainability
A
2 hrs
Test Coverage
import React from "react";
import { FieldErrors, FieldValues } from "react-hook-form";

import { EntranceStepButtonConfig } from "types/EntranceStep";

import {
  UseArrayAdd,
  UseArrayClear,
  UseArrayRemove,
  UseArrayUpdate,
} from "hooks/useArray";

import { AdminSidebarSectionSubTitle } from "components/organisms/AdminVenueView/components/AdminSidebarSectionSubTitle";

import { EntranceButtonsInputFieldSet } from "components/molecules/EntranceButtonsInputFieldSet";

import { ButtonNG } from "components/atoms/ButtonNG";

import "./EntranceButtonsBuilder.scss";

export interface EntranceButtonsBuilderProps {
  name: string;
  items?: EntranceStepButtonConfig[];
  register: (Ref: unknown, RegisterOptions?: unknown) => void;
  title?: string;
  errors?: FieldErrors<FieldValues>;
  onAdd: UseArrayAdd<EntranceStepButtonConfig>;
  onClear: UseArrayClear<EntranceStepButtonConfig>;
  onUpdate: UseArrayUpdate<EntranceStepButtonConfig>;
  onRemove: UseArrayRemove<EntranceStepButtonConfig>;
}

export const EntranceButtonsBuilder: React.FC<EntranceButtonsBuilderProps> = ({
  items,
  name,
  register,
  title,
  errors,
  onAdd,
  onClear,
  onUpdate,
  onRemove,
}) => {
  const count = items?.length ?? 0;
  return (
    <div className="EntranceButtonsBuilder">
      {title && (
        <AdminSidebarSectionSubTitle>{title}</AdminSidebarSectionSubTitle>
      )}

      {Array.from({ length: count }).map((_, index) => {
        return (
          <EntranceButtonsInputFieldSet
            errors={errors}
            index={index}
            key={`${name}-${index}`}
            name={name}
            onRemove={onRemove}
            onUpdate={onUpdate}
            register={register}
          />
        );
      })}

      <div className="EntranceButtonsBuilder__buttons">
        <ButtonNG variant="primary" onClick={onAdd}>
          Add button
        </ButtonNG>
        {count > 0 && (
          <ButtonNG variant="danger" onClick={onClear}>
            Remove all buttons
          </ButtonNG>
        )}
      </div>
    </div>
  );
};