From d67328f866fa469b67e2525556388d4bcc283737 Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Thu, 31 Mar 2022 18:04:43 +0200
Subject: chore: add a Select component

---
 src/components/atoms/forms/select.tsx | 77 +++++++++++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)
 create mode 100644 src/components/atoms/forms/select.tsx

(limited to 'src/components/atoms/forms/select.tsx')

diff --git a/src/components/atoms/forms/select.tsx b/src/components/atoms/forms/select.tsx
new file mode 100644
index 0000000..6e46660
--- /dev/null
+++ b/src/components/atoms/forms/select.tsx
@@ -0,0 +1,77 @@
+import { ChangeEvent, FC, SetStateAction } from 'react';
+import styles from './forms.module.scss';
+
+type SelectOptions = {
+  id: string;
+  name: string;
+  value: string;
+};
+
+type SelectProps = {
+  /**
+   * Field state. Either enabled (false) or disabled (true).
+   */
+  disabled?: boolean;
+  /**
+   * Field id attribute.
+   */
+  id?: string;
+  /**
+   * Field name attribute.
+   */
+  name?: string;
+  /**
+   * True if the field is required. Default: false.
+   */
+  options: SelectOptions[];
+  /**
+   * True if the field is required. Default: false.
+   */
+  required?: boolean;
+  /**
+   * Callback function to set field value.
+   */
+  setValue: (value: SetStateAction<string>) => void;
+  /**
+   * Field value.
+   */
+  value: string;
+};
+
+/**
+ * Select component
+ *
+ * Render a HTML select element.
+ */
+const Select: FC<SelectProps> = ({ options, setValue, ...props }) => {
+  /**
+   * Update select value when an option is selected.
+   * @param e - The option change event.
+   */
+  const updateValue = (e: ChangeEvent<HTMLSelectElement>) => {
+    setValue(e.target.value);
+  };
+
+  /**
+   * Get the option elements.
+   * @returns {JSX.Element[]} An array of HTML option elements.
+   */
+  const getOptions = (): JSX.Element[] =>
+    options.map((option) => (
+      <option key={option.id} value={option.value}>
+        {option.name}
+      </option>
+    ));
+
+  return (
+    <select
+      className={`${styles.field} ${styles['field--select']}`}
+      onChange={updateValue}
+      {...props}
+    >
+      {getOptions()}
+    </select>
+  );
+};
+
+export default Select;
-- 
cgit v1.2.3

