Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | 156x 156x 156x 156x 156x 26x 122x 26x 156x 1x 1x | import { useState, useEffect, SetStateAction } from "react";
import {
  UseFormRegister,
  UseFormSetValue,
  UseFormWatch,
  FieldValues,
} from "react-hook-form";
import { nanoid } from "nanoid";
import { Row, Col } from "@canonical/react-components";
 
import LicenseSearch from "./LicenseSearch";
 
type Props = {
  listingData: {
    license: string;
    license_type: string;
    licenses: Array<{ key: string; name: string }>;
  };
  register: UseFormRegister<FieldValues>;
  setValue: UseFormSetValue<FieldValues>;
  watch: UseFormWatch<FieldValues>;
};
 
function LicenseInputs({ listingData, register, setValue, watch }: Props) {
  const [licenseType, setLicenseType] = useState(listingData?.license_type);
  const [license, setLicense] = useState(listingData?.license);
 
  const simpleLicenseId = nanoid();
  const customLicenseId = nanoid();
 
  useEffect(() => {
    const subscription = watch(
      (value: { [index: string]: SetStateAction<string> }) => {
        setLicense(value?.license);
      },
    );
    return () => subscription.unsubscribe();
  }, [watch]);
 
  return (
    <>
      <Row>
        <Col size={2}>
          <p>License:</p>
        </Col>
        <Col size={8} style={{ minHeight: "160px" }}>
          <ul className="p-inline-list u-no-margin--bottom">
            <li className="p-inline-list__item">
              <label className="p-radio" style={{ display: "inline-block" }}>
                <input
                  type="radio"
                  className="p-radio__input"
                  name="license-type"
                  aria-labelledby={simpleLicenseId}
                  value="simple"
                  checked={licenseType === "simple"}
                  onChange={() => {
                    setLicenseType("simple");
                  }}
                />
                <span className="p-radio__label" id={simpleLicenseId}>
                  Simple
                </span>
              </label>
            </li>
            <li className="p-inline-list__item">
              <label className="p-radio" style={{ display: "inline-block" }}>
                <input
                  type="radio"
                  className="p-radio__input"
                  name="license-type"
                  aria-labelledby={customLicenseId}
                  value="custom"
                  checked={licenseType === "custom"}
                  onChange={() => {
                    setLicenseType("custom");
                    setValue("license", license);
                  }}
                />
                <span className="p-radio__label" id={customLicenseId}>
                  Custom SPDX expression
                </span>
              </label>
            </li>
          </ul>
 
          {licenseType === "simple" && (
            <>
              <div className="p-autocomplete">
                <LicenseSearch
                  licenses={listingData?.licenses}
                  license={license}
                  register={register}
                  setValue={setValue}
                  setLicense={setLicense}
                  originalLicense={listingData?.license}
                />
                <p className="p-form-help-text" style={{ marginTop: "1rem" }}>
                  The license(s) under which you will release your snap.
                  Multiple licenses can be selected to indicate alternative
                  choices.
                </p>
              </div>
            </>
          )}
 
          {licenseType === "custom" && (
            <>
              <textarea {...register("license")} />
 
              <small className="u-text-muted">
                Visit{" "}
                <a href="https://spdx.github.io/spdx-spec/v2.3/">
                  SPDX Specification 2.3
                </a>{" "}
                for more information.
              </small>
            </>
          )}
        </Col>
      </Row>
    </>
  );
}
 
export default LicenseInputs;
  |