2024-04-04 15:12:30 +02:00

127 lines
4.0 KiB
TypeScript

import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import classes from "./classes.module.scss";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import { useRouter } from "next/router";
import TextField from "@Front/Components/DesignSystem/Form/TextField";
import Button, { EButtonVariant } from "@Front/Components/DesignSystem/Button";
import Form from "@Front/Components/DesignSystem/Form";
import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions";
import { useCallback, useState } from "react";
import { TrashIcon } from "@heroicons/react/24/outline";
import PlusIcon from "@Assets/Icons/plus.svg";
export enum EForfeitType {
"standard",
"unlimited",
}
type EmailLine = {
element: JSX.Element;
id: number;
};
export default function SubscriptionInvite() {
const router = useRouter();
const nbOfCollaborators = parseInt(router.query["nbOfCollaborators"] as string);
const [incrementalId, setIncrementalId] = useState(isNaN(nbOfCollaborators) ? 0 : nbOfCollaborators);
const getInitialLines = () => {
const linesToGet = isNaN(nbOfCollaborators) ? 1 : nbOfCollaborators;
const lines: EmailLine[] = [];
for (let i = 0; i < linesToGet; i++) {
lines.push({
element: <TextField key={i} name={`email_${i}`} placeholder="Email" className={classes["input"]} required />,
id: i,
});
}
return lines;
};
const [lines, setLines] = useState<EmailLine[]>(getInitialLines());
const sendInvitations = async (e: React.FormEvent<HTMLFormElement> | null) => {
if (!e) return;
e.preventDefault();
const form = e.target as HTMLFormElement;
const emails: string[] = [];
Object.keys(form.elements).forEach((key) => {
if (isNaN(parseInt(key))) return;
const element = form.elements[key as any] as HTMLInputElement;
if (element.name.includes("email_")) {
emails.push(element.value);
}
});
try {
await Subscriptions.getInstance().post({
emails,
});
} catch (e) {
console.error(e);
}
};
const addLine = useCallback(() => {
const newLine: EmailLine = {
element: (
<TextField key={lines.length} name={`email_${lines.length}`} placeholder="Email" className={classes["input"]} required />
),
id: incrementalId + 1,
};
setIncrementalId(incrementalId + 1);
setLines((prev) => [...prev, newLine]);
}, [incrementalId, lines]);
const deleteLine = (e: React.MouseEvent<SVGSVGElement>) => {
const lineId = parseInt(e.currentTarget.getAttribute("data-line") as string);
setLines((prev) => prev.filter((line) => line.id !== lineId));
};
return (
<DefaultTemplate title="Nouvelle souscription" hasBackArrow>
<div className={classes["root"]}>
<div className={classes["container"]}>
<Typography typo={ITypo.H1} color={ITypoColor.BLACK}>
Inviter vos collaborateurs
</Typography>
{!isNaN(nbOfCollaborators) && (
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
{nbOfCollaborators} collaborateurs à inviter
</Typography>
)}
{isNaN(nbOfCollaborators) && (
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
Collaborateurs illimités
</Typography>
)}
<Form className={classes["emails-form"]} onSubmit={sendInvitations}>
{lines.map((line, index) => (
<div key={line.id} className={classes["input-container"]}>
{line.element}
{!nbOfCollaborators && (
<TrashIcon
width="20"
height="20"
data-line={line.id}
onClick={deleteLine}
visibility={index === 0 ? "hidden" : "visible"}
/>
)}
</div>
))}
{isNaN(nbOfCollaborators) && (
<div className={classes["add-line-container"]}>
<Button onClick={addLine} variant={EButtonVariant.LINE} icon={PlusIcon}>
Ajouter une adresse email
</Button>
</div>
)}
<div className={classes["button-container"]}>
<Button type="submit">Envoyer l'invitation</Button>
</div>
</Form>
</div>
</div>
</DefaultTemplate>
);
}