From 47e12259d512e476326e83929efebf036b57f7c1 Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Wed, 6 Apr 2022 18:40:17 +0200
Subject: chore: add a Modal component

---
 src/components/molecules/layout/modal.tsx | 48 +++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100644 src/components/molecules/layout/modal.tsx

(limited to 'src/components/molecules/layout/modal.tsx')

diff --git a/src/components/molecules/layout/modal.tsx b/src/components/molecules/layout/modal.tsx
new file mode 100644
index 0000000..4dc3b0a
--- /dev/null
+++ b/src/components/molecules/layout/modal.tsx
@@ -0,0 +1,48 @@
+import Heading from '@components/atoms/headings/heading';
+import dynamic from 'next/dynamic';
+import { FC, ReactNode } from 'react';
+import styles from './modal.module.scss';
+
+export type Icons = 'cogs' | 'search';
+
+export type ModalProps = {
+  icon?: Icons;
+  title?: string;
+};
+
+const CogIcon = dynamic<ReactNode>(() => import('@components/atoms/icons/cog'));
+const SearchIcon = dynamic<ReactNode>(
+  () => import('@components/atoms/icons/magnifying-glass')
+);
+
+/**
+ * Modal component
+ *
+ * Render a modal component with an optional title and icon.
+ */
+const Modal: FC<ModalProps> = ({ children, icon, title }) => {
+  const getIcon = (id: Icons) => {
+    switch (id) {
+      case 'cogs':
+        return <CogIcon />;
+      case 'search':
+        return <SearchIcon />;
+      default:
+        return <></>;
+    }
+  };
+
+  return (
+    <div className={styles.wrapper}>
+      {title && (
+        <Heading isFake={true} level={3}>
+          {icon && <span className={styles.icon}>{getIcon(icon)}</span>}
+          {title}
+        </Heading>
+      )}
+      {children}
+    </div>
+  );
+};
+
+export default Modal;
-- 
cgit v1.2.3

