Pages success and error done

This commit is contained in:
Maxime Lalo 2024-03-28 16:05:58 +01:00
parent 8814a8c5ea
commit 138954a2f8
17 changed files with 365 additions and 2 deletions

9
package-lock.json generated
View File

@ -10,6 +10,7 @@
"dependencies": { "dependencies": {
"@emotion/react": "^11.10.6", "@emotion/react": "^11.10.6",
"@emotion/styled": "^11.10.6", "@emotion/styled": "^11.10.6",
"@heroicons/react": "^2.1.3",
"@mui/material": "^5.11.13", "@mui/material": "^5.11.13",
"@types/node": "18.15.1", "@types/node": "18.15.1",
"@types/react": "18.0.28", "@types/react": "18.0.28",
@ -466,6 +467,14 @@
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
"integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
}, },
"node_modules/@heroicons/react": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.3.tgz",
"integrity": "sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==",
"peerDependencies": {
"react": ">= 16"
}
},
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.14", "version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",

View File

@ -3,7 +3,7 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev -p 5005",
"build": "next build", "build": "next build",
"start": "next start", "start": "next start",
"lint": "next lint", "lint": "next lint",
@ -12,6 +12,7 @@
"dependencies": { "dependencies": {
"@emotion/react": "^11.10.6", "@emotion/react": "^11.10.6",
"@emotion/styled": "^11.10.6", "@emotion/styled": "^11.10.6",
"@heroicons/react": "^2.1.3",
"@mui/material": "^5.11.13", "@mui/material": "^5.11.13",
"@types/node": "18.15.1", "@types/node": "18.15.1",
"@types/react": "18.0.28", "@types/react": "18.0.28",

View File

@ -96,6 +96,10 @@
flex: 1; flex: 1;
} }
&[fullwidthattr="false"] {
width: fit-content;
}
&[touppercase="false"] { &[touppercase="false"] {
text-transform: inherit; text-transform: inherit;
} }

View File

@ -115,6 +115,14 @@
letter-spacing: 0.5px; letter-spacing: 0.5px;
} }
&.Caption_14-semibold {
font-style: normal;
font-weight: 600;
font-size: 14px;
line-height: 22px;
letter-spacing: 0.5px;
}
&.re-hover { &.re-hover {
color: $re-hover; color: $re-hover;
} }

View File

@ -29,6 +29,7 @@ export enum ITypo {
P_ERR_16 = "Paragraphe-16-error", P_ERR_16 = "Paragraphe-16-error",
CAPTION_14 = "Caption_14", CAPTION_14 = "Caption_14",
CAPTION_14_SB = "Caption_14-semibold",
} }
export enum ITypoColor { export enum ITypoColor {

View File

@ -0,0 +1,30 @@
.root {
display: flex;
gap: 24px;
padding: 16px;
svg {
width: 20px;
height: 20px;
min-width: 20px;
min-height: 20px;
}
&.info {
background-color: var(--Opium-200);
}
&.warning {
background-color: var(--Warning-100);
}
&.success {
border: 1px solid var(--green-flash);
background: #12bf4d0d;
}
&.error {
border: 1px solid var(--red-soft);
background: #f087711a;
}
}

View File

@ -0,0 +1,39 @@
import classes from "./classes.module.scss";
import classNames from "classnames";
import { InformationCircleIcon, ExclamationTriangleIcon } from "@heroicons/react/24/outline";
import Typography, { ITypo } from "@Front/Components/DesignSystem/Typography";
export type IProps = {
type: "info" | "warning" | "success" | "error";
children?: React.ReactNode;
className?: string;
};
export default function MessageBox(props: IProps) {
const { className, type, children } = props;
return (
<div className={classNames(className, classes["root"], classes[type])}>
{getIcon(type)}
<div className={classes["content"]}>
<Typography className={classes["text"]} typo={ITypo.CAPTION_14}>
{children}
</Typography>
{children}
</div>
</div>
);
function getIcon(type: IProps["type"]) {
switch (type) {
case "info":
return <InformationCircleIcon />;
case "warning":
return <ExclamationTriangleIcon />;
case "success":
return <InformationCircleIcon />;
case "error":
return <InformationCircleIcon />;
}
}
}

View File

@ -0,0 +1,5 @@
.root {
display: flex;
flex-direction: column;
gap: 32px;
}

View File

@ -0,0 +1,26 @@
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import classes from "./classes.module.scss";
export default function SubscriptionClientInfos() {
return (
<div className={classes["root"]}>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
Informations client
</Typography>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
john.doe@contact.fr
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
Adresse de facturation
</Typography>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
John Doe <br />
23 rue taitbout,
<br />
75009 Paris
<br />
France
</Typography>
</div>
);
}

View File

@ -0,0 +1,17 @@
.root {
display: flex;
gap: 104px;
justify-content: center;
.left {
display: flex;
flex-direction: column;
gap: 32px;
width: 548px;
}
.separator {
width: 100%;
height: 2px;
background: var(--grey-medium);
}
}

View File

@ -0,0 +1,41 @@
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import classes from "./classes.module.scss";
import SubscriptionTicket from "../SubscriptionTicket";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import MessageBox from "@Front/Components/Elements/MessageBox";
import SubscriptionClientInfos from "../SubscriptionClientInfos";
import Button from "@Front/Components/DesignSystem/Button";
export default function SubscriptionError() {
return (
<DefaultTemplate title="Title" hasHeaderLinks={false}>
<div className={classes["root"]}>
<div className={classes["left"]}>
<div className={classes["title"]}>
<Typography typo={ITypo.H1} color={ITypoColor.BLACK}>
Paiement échoué
</Typography>
</div>
<div className={classes["alert"]}>
<MessageBox type={"error"}>
Votre transaction n'a pas pu être complétée.
<br />
<br />
Malheureusement, nous n'avons pas pu traiter votre paiement et votre abonnement n'a pas é activé. Veuillez
vérifier vos informations de paiement et essayer à nouveau.
</MessageBox>
</div>
<div className={classes["separator"]} />
<div className={classes["client-infos"]}>
<SubscriptionClientInfos />
</div>
<div className={classes["separator"]} />
<Button>Réessayer le paiement</Button>
</div>
<div className={classes["right"]}>
<SubscriptionTicket />
</div>
</div>
</DefaultTemplate>
);
}

View File

@ -0,0 +1,17 @@
.root {
display: flex;
gap: 104px;
justify-content: center;
.left {
display: flex;
flex-direction: column;
gap: 32px;
width: 548px;
}
.separator {
width: 100%;
height: 2px;
background: var(--grey-medium);
}
}

View File

@ -0,0 +1,40 @@
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import classes from "./classes.module.scss";
import SubscriptionTicket from "../SubscriptionTicket";
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import MessageBox from "@Front/Components/Elements/MessageBox";
import SubscriptionClientInfos from "../SubscriptionClientInfos";
import Button from "@Front/Components/DesignSystem/Button";
export default function SubscriptionSuccess() {
return (
<DefaultTemplate title="Title" hasHeaderLinks={false}>
<div className={classes["root"]}>
<div className={classes["left"]}>
<div className={classes["title"]}>
<Typography typo={ITypo.H1} color={ITypoColor.BLACK}>
Abonnement réussi !
</Typography>
</div>
<div className={classes["alert"]}>
<MessageBox type={"success"}>
Votre transaction a é effectuée avec succès !
<br />
<br />
Votre abonnement a é pris en compte et est désormais actif.
</MessageBox>
</div>
<div className={classes["separator"]} />
<div className={classes["client-infos"]}>
<SubscriptionClientInfos />
</div>
<div className={classes["separator"]} />
<Button>Inviter vos collaborateurs</Button>
</div>
<div className={classes["right"]}>
<SubscriptionTicket />
</div>
</div>
</DefaultTemplate>
);
}

View File

@ -0,0 +1,31 @@
.root {
width: 372px;
display: flex;
flex-direction: column;
gap: 40px;
box-shadow: 0px 8px 10px 0px #00000012;
padding: 24px;
border-radius: 16px;
.top-category {
display: flex;
justify-content: center;
align-items: center;
}
.category {
display: flex;
flex-direction: column;
gap: 8px;
.line {
display: flex;
justify-content: space-between;
}
}
.separator {
width: 100%;
height: 2px;
background: var(--grey-medium);
}
}

View File

@ -0,0 +1,84 @@
import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Typography";
import classes from "./classes.module.scss";
type IProps = {};
export default function SubscriptionTicket(props: IProps) {
return (
<div className={classes["root"]}>
<div className={classes["top-category"]}>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
Récapitulatif
</Typography>
</div>
<div className={classes["separator"]} />
<div className={classes["top-category"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Forfait standard
</Typography>
</div>
<div className={classes["separator"]} />
<div className={classes["category"]}>
<div className={classes["line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Plan individuel
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
99&nbsp;
</Typography>
</div>
<div className={classes["line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
2 collaborateurs
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
13,98&nbsp;
</Typography>
</div>
<div className={classes["sub-line"]}>
<Typography typo={ITypo.CAPTION_14_SB} color={ITypoColor.BLACK}>
6,99&nbsp; x 2
</Typography>
</div>
</div>
<div className={classes["separator"]} />
<div className={classes["category"]}>
<div className={classes["line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Sous-total
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
112,98&nbsp;
</Typography>
</div>
<div className={classes["line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
FR TVA
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
14&nbsp;
</Typography>
</div>
<div className={classes["line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Taxes
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
14&nbsp;
</Typography>
</div>
</div>
<div className={classes["separator"]} />
<div className={classes["category"]}>
<div className={classes["line"]}>
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
Total
</Typography>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
112,98&nbsp;
</Typography>
</div>
</div>
</div>
);
}

View File

@ -0,0 +1,5 @@
import SubscriptionError from "@Front/Components/Layouts/Subscription/SubscriptionError";
export default function Route() {
return <SubscriptionError />;
}

View File

@ -0,0 +1,5 @@
import SubscriptionSuccess from "@Front/Components/Layouts/Subscription/SubscriptionSuccess";
export default function Route() {
return <SubscriptionSuccess />;
}