Merge branch 'dev' into staging

This commit is contained in:
Maxime Lalo 2024-04-24 17:44:12 +02:00
commit 70ed41a30d
8 changed files with 58 additions and 41 deletions

51
package-lock.json generated
View File

@ -23,7 +23,7 @@
"eslint-config-next": "13.2.4", "eslint-config-next": "13.2.4",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"jwt-decode": "^3.1.2", "jwt-decode": "^3.1.2",
"le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.132", "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.134",
"next": "13.2.4", "next": "13.2.4",
"prettier": "^2.8.7", "prettier": "^2.8.7",
"react": "18.2.0", "react": "18.2.0",
@ -1401,20 +1401,20 @@
"optional": true "optional": true
}, },
"node_modules/bare-fs": { "node_modules/bare-fs": {
"version": "2.2.3", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.3.tgz", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.0.tgz",
"integrity": "sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==", "integrity": "sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"bare-events": "^2.0.0", "bare-events": "^2.0.0",
"bare-path": "^2.0.0", "bare-path": "^2.0.0",
"streamx": "^2.13.0" "bare-stream": "^1.0.0"
} }
}, },
"node_modules/bare-os": { "node_modules/bare-os": {
"version": "2.2.1", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.1.tgz", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz",
"integrity": "sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==", "integrity": "sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==",
"optional": true "optional": true
}, },
"node_modules/bare-path": { "node_modules/bare-path": {
@ -1426,6 +1426,15 @@
"bare-os": "^2.1.0" "bare-os": "^2.1.0"
} }
}, },
"node_modules/bare-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-1.0.0.tgz",
"integrity": "sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==",
"optional": true,
"dependencies": {
"streamx": "^2.16.1"
}
},
"node_modules/base64-js": { "node_modules/base64-js": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@ -1536,9 +1545,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001611", "version": "1.0.30001612",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001611.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz",
"integrity": "sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==", "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -1634,9 +1643,9 @@
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
}, },
"node_modules/clsx": { "node_modules/clsx": {
"version": "2.1.0", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
"integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"engines": { "engines": {
"node": ">=6" "node": ">=6"
} }
@ -3514,7 +3523,7 @@
} }
}, },
"node_modules/le-coffre-resources": { "node_modules/le-coffre-resources": {
"resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#888194736ec642c64a7f6e878f5ded4fc480d4a0", "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#fb09b1ebbdfbc80d43f8ae2e4b64e15575d0b69d",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
@ -3535,9 +3544,9 @@
} }
}, },
"node_modules/libphonenumber-js": { "node_modules/libphonenumber-js": {
"version": "1.10.60", "version": "1.10.61",
"resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.60.tgz", "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.61.tgz",
"integrity": "sha512-Ctgq2lXUpEJo5j1762NOzl2xo7z7pqmVWYai0p07LvAkQ32tbPv3wb+tcUeHEiXhKU5buM4H9MXsXo6OlM6C2g==" "integrity": "sha512-TsQsyzDttDvvzWNkbp/i0fVbzTGJIG0mUu/uNalIaRQEYeJxVQ/FPg+EJgSqfSXezREjM0V3RZ8cLVsKYhhw0Q=="
}, },
"node_modules/lines-and-columns": { "node_modules/lines-and-columns": {
"version": "1.2.4", "version": "1.2.4",
@ -3752,9 +3761,9 @@
} }
}, },
"node_modules/node-abi": { "node_modules/node-abi": {
"version": "3.59.0", "version": "3.62.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.59.0.tgz", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz",
"integrity": "sha512-HyyfzvTLCE8b1SX2nWimlra8cibEsypcSu/Az4SXMhWhtuctkwAX7qsEYNjUOIoYtPV884oN3wtYTN+iZKBtvw==", "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==",
"dependencies": { "dependencies": {
"semver": "^7.3.5" "semver": "^7.3.5"
}, },

View File

@ -25,7 +25,7 @@
"eslint-config-next": "13.2.4", "eslint-config-next": "13.2.4",
"form-data": "^4.0.0", "form-data": "^4.0.0",
"jwt-decode": "^3.1.2", "jwt-decode": "^3.1.2",
"le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.132", "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.134",
"next": "13.2.4", "next": "13.2.4",
"prettier": "^2.8.7", "prettier": "^2.8.7",
"react": "18.2.0", "react": "18.2.0",

View File

@ -5,7 +5,7 @@ import { useEffect, useState } from "react";
import RadioBox from "@Front/Components/DesignSystem/RadioBox"; import RadioBox from "@Front/Components/DesignSystem/RadioBox";
import Button from "@Front/Components/DesignSystem/Button"; import Button from "@Front/Components/DesignSystem/Button";
import classnames from "classnames"; import classnames from "classnames";
import { EType } from "le-coffre-resources/dist/Admin/Subscription"; import { EPaymentFrequency, EType } from "le-coffre-resources/dist/Admin/Subscription";
import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe"; import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
@ -13,11 +13,11 @@ type IProps = {
forfeitType: EForfeitType; forfeitType: EForfeitType;
numberOfCollaborators: number; numberOfCollaborators: number;
hasNavTab?: boolean; hasNavTab?: boolean;
defaultFrequency?: EPaymentFrequency; defaultFrequency?: EPaymentFrequencyFront;
disableInputs?: boolean; disableInputs?: boolean;
}; };
export enum EPaymentFrequency { export enum EPaymentFrequencyFront {
monthly, monthly,
yearly, yearly,
} }
@ -25,17 +25,19 @@ export enum EPaymentFrequency {
export default function SubscribeCheckoutTicket(props: IProps) { export default function SubscribeCheckoutTicket(props: IProps) {
const router = useRouter(); const router = useRouter();
const { forfeitType, numberOfCollaborators, hasNavTab = true } = props; const { forfeitType, numberOfCollaborators, hasNavTab = true } = props;
const [paymentFrequency, setPaymentFrequency] = useState<EPaymentFrequency>(props.defaultFrequency ?? EPaymentFrequency.monthly); const [paymentFrequency, setPaymentFrequency] = useState<EPaymentFrequencyFront>(
props.defaultFrequency ?? EPaymentFrequencyFront.monthly,
);
const [multiplier, setMultiplier] = useState<number>(1); const [multiplier, setMultiplier] = useState<number>(1);
const [totalPlan, setTotalPlan] = useState<number>(0); const [totalPlan, setTotalPlan] = useState<number>(0);
const [totalCollaborator, setTotalCollaborator] = useState<number>(0); const [totalCollaborator, setTotalCollaborator] = useState<number>(0);
useEffect(() => { useEffect(() => {
setMultiplier(paymentFrequency === EPaymentFrequency.monthly ? 1 : 12); setMultiplier(paymentFrequency === EPaymentFrequencyFront.monthly ? 1 : 12);
}, [paymentFrequency]); }, [paymentFrequency]);
useEffect(() => { useEffect(() => {
let multiplierToUse = paymentFrequency === EPaymentFrequency.yearly ? multiplier - 1 : multiplier; let multiplierToUse = paymentFrequency === EPaymentFrequencyFront.yearly ? multiplier - 1 : multiplier;
if (forfeitType === EForfeitType.unlimited) { if (forfeitType === EForfeitType.unlimited) {
setTotalPlan(forfeitsPrices[EForfeitType.unlimited] * multiplierToUse); setTotalPlan(forfeitsPrices[EForfeitType.unlimited] * multiplierToUse);
setTotalCollaborator(0); setTotalCollaborator(0);
@ -46,7 +48,7 @@ export default function SubscribeCheckoutTicket(props: IProps) {
}, [multiplier, forfeitType, numberOfCollaborators, paymentFrequency]); }, [multiplier, forfeitType, numberOfCollaborators, paymentFrequency]);
const handleFrequencyChange = (e: React.ChangeEvent<HTMLInputElement>) => { const handleFrequencyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setPaymentFrequency(parseInt(e.target.value) as EPaymentFrequency); setPaymentFrequency(parseInt(e.target.value) as EPaymentFrequencyFront);
}; };
const formatFloat = (value: number) => { const formatFloat = (value: number) => {
@ -57,6 +59,7 @@ export default function SubscribeCheckoutTicket(props: IProps) {
const stripeCheckout = { const stripeCheckout = {
type: forfeitType === EForfeitType.standard ? EType.Standard : EType.Unlimited, type: forfeitType === EForfeitType.standard ? EType.Standard : EType.Unlimited,
nb_seats: forfeitType === EForfeitType.standard ? numberOfCollaborators : 0, nb_seats: forfeitType === EForfeitType.standard ? numberOfCollaborators : 0,
frequency: paymentFrequency === EPaymentFrequencyFront.monthly ? EPaymentFrequency.Monthly : EPaymentFrequency.Yearly,
}; };
try { try {
@ -77,17 +80,17 @@ export default function SubscribeCheckoutTicket(props: IProps) {
<div className={classes["container-frequency"]}> <div className={classes["container-frequency"]}>
<RadioBox <RadioBox
name="paymentFrequency" name="paymentFrequency"
value={EPaymentFrequency.yearly.toString()} value={EPaymentFrequencyFront.yearly.toString()}
onChange={handleFrequencyChange} onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.yearly} defaultChecked={paymentFrequency === EPaymentFrequencyFront.yearly}
disabled={props.disableInputs}> disabled={props.disableInputs}>
<Typography typo={ITypo.P_ERR_18}>Annuel</Typography> <Typography typo={ITypo.P_ERR_18}>Annuel</Typography>
</RadioBox> </RadioBox>
<RadioBox <RadioBox
name="paymentFrequency" name="paymentFrequency"
value={EPaymentFrequency.monthly.toString()} value={EPaymentFrequencyFront.monthly.toString()}
onChange={handleFrequencyChange} onChange={handleFrequencyChange}
defaultChecked={paymentFrequency === EPaymentFrequency.monthly} defaultChecked={paymentFrequency === EPaymentFrequencyFront.monthly}
disabled={props.disableInputs}> disabled={props.disableInputs}>
<Typography typo={ITypo.P_ERR_18}>Mensuel</Typography> <Typography typo={ITypo.P_ERR_18}>Mensuel</Typography>
</RadioBox> </RadioBox>
@ -99,7 +102,7 @@ export default function SubscribeCheckoutTicket(props: IProps) {
<Typography typo={ITypo.P_18} color={ITypoColor.BLACK}> <Typography typo={ITypo.P_18} color={ITypoColor.BLACK}>
{forfeitType === EForfeitType.standard ? "Plan individuel" : "Plan illimité"} {forfeitType === EForfeitType.standard ? "Plan individuel" : "Plan illimité"}
</Typography> </Typography>
{paymentFrequency === EPaymentFrequency.yearly && ( {paymentFrequency === EPaymentFrequencyFront.yearly && (
<Typography typo={ITypo.CAPTION_14_SB} color={ITypoColor.BLACK}> <Typography typo={ITypo.CAPTION_14_SB} color={ITypoColor.BLACK}>
{formatFloat( {formatFloat(
forfeitType === EForfeitType.standard forfeitType === EForfeitType.standard
@ -115,7 +118,7 @@ export default function SubscribeCheckoutTicket(props: IProps) {
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}> <Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>
{totalPlan}&nbsp; {totalPlan}&nbsp;
</Typography> </Typography>
{paymentFrequency === EPaymentFrequency.yearly && ( {paymentFrequency === EPaymentFrequencyFront.yearly && (
<Typography typo={ITypo.P_16} color={ITypoColor.BLACK} className={classes["stroked-price"]}> <Typography typo={ITypo.P_16} color={ITypoColor.BLACK} className={classes["stroked-price"]}>
{formatFloat( {formatFloat(
forfeitType === EForfeitType.standard forfeitType === EForfeitType.standard
@ -135,7 +138,7 @@ export default function SubscribeCheckoutTicket(props: IProps) {
</Typography> </Typography>
<Typography typo={ITypo.CAPTION_14_SB} color={ITypoColor.BLACK}> <Typography typo={ITypo.CAPTION_14_SB} color={ITypoColor.BLACK}>
{formatFloat(collaboratorPrice)}&nbsp; x {numberOfCollaborators}{" "} {formatFloat(collaboratorPrice)}&nbsp; x {numberOfCollaborators}{" "}
{paymentFrequency === EPaymentFrequency.yearly && "x 12"} {paymentFrequency === EPaymentFrequencyFront.yearly && "x 12"}
</Typography> </Typography>
</div> </div>
<Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}> <Typography typo={ITypo.P_SB_18} color={ITypoColor.BLACK}>

View File

@ -2,7 +2,7 @@ import Typography, { ITypo, ITypoColor } from "@Front/Components/DesignSystem/Ty
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import NavTab from "@Front/Components/Elements/NavTab"; import NavTab from "@Front/Components/Elements/NavTab";
import SubscribeCheckoutTicket, { EPaymentFrequency } from "../SubscribeCheckoutTicket"; import SubscribeCheckoutTicket, { EPaymentFrequencyFront as EPaymentFrequency } from "../SubscribeCheckoutTicket";
import { EForfeitType, forfeitsPrices } from "../../SubscriptionFacturation"; import { EForfeitType, forfeitsPrices } from "../../SubscriptionFacturation";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import Check from "@Front/Components/Elements/Icons/Check"; import Check from "@Front/Components/Elements/Icons/Check";

View File

@ -3,7 +3,7 @@ import classes from "./classes.module.scss";
import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate"; import DefaultTemplate from "@Front/Components/LayoutTemplates/DefaultTemplate";
import NavTab from "@Front/Components/Elements/NavTab"; import NavTab from "@Front/Components/Elements/NavTab";
import NumberPicker from "@Front/Components/Elements/NumberPicker"; import NumberPicker from "@Front/Components/Elements/NumberPicker";
import SubscribeCheckoutTicket, { EPaymentFrequency } from "../SubscribeCheckoutTicket"; import SubscribeCheckoutTicket, { EPaymentFrequencyFront as EPaymentFrequency } from "../SubscribeCheckoutTicket";
import { EForfeitType, collaboratorPrice, forfeitsPrices } from "../../SubscriptionFacturation"; import { EForfeitType, collaboratorPrice, forfeitsPrices } from "../../SubscriptionFacturation";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import Check from "@Front/Components/Elements/Icons/Check"; import Check from "@Front/Components/Elements/Icons/Check";

View File

@ -10,6 +10,7 @@ import JwtService from "@Front/Services/JwtService/JwtService";
import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions";
import Users from "@Front/Api/LeCoffreApi/Admin/Users/Users"; import Users from "@Front/Api/LeCoffreApi/Admin/Users/Users";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import CookieService from "@Front/Services/CookieService/CookieService";
export default function SubscriptionManageCollaborators() { export default function SubscriptionManageCollaborators() {
const router = useRouter(); const router = useRouter();
@ -62,7 +63,11 @@ export default function SubscriptionManageCollaborators() {
const subcriptionToUpdate = { const subcriptionToUpdate = {
seats: selectedCollaborators.map((collaborator) => ({ user: { uid: collaborator } })), seats: selectedCollaborators.map((collaborator) => ({ user: { uid: collaborator } })),
}; };
await Subscriptions.getInstance().put(subscription?.uid!, subcriptionToUpdate); await Subscriptions.getInstance().put(subscription?.uid!, subcriptionToUpdate);
const refreshToken = CookieService.getInstance().getCookie("leCoffreRefreshToken");
if (!refreshToken) return;
await JwtService.getInstance().forceRefreshToken(refreshToken);
router.push("/subscription/manage"); router.push("/subscription/manage");
if (!e) return; if (!e) return;
e.preventDefault(); e.preventDefault();
@ -71,7 +76,7 @@ export default function SubscriptionManageCollaborators() {
useEffect(() => { useEffect(() => {
loadSubscription(); loadSubscription();
loadCollaborators(); loadCollaborators();
}, [loadSubscription]); }, [loadCollaborators, loadSubscription]);
return ( return (
<DefaultTemplate title="Nouvelle souscription" hasBackArrow> <DefaultTemplate title="Nouvelle souscription" hasBackArrow>

View File

@ -8,7 +8,7 @@ import { useCallback, useEffect, useState } from "react";
import { Subscription } from "le-coffre-resources/dist/Admin"; import { Subscription } from "le-coffre-resources/dist/Admin";
import JwtService from "@Front/Services/JwtService/JwtService"; import JwtService from "@Front/Services/JwtService/JwtService";
import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions";
import SubscribeCheckoutTicket, { EPaymentFrequency } from "../Components/SubscribeCheckoutTicket"; import SubscribeCheckoutTicket, { EPaymentFrequencyFront as EPaymentFrequency } from "../Components/SubscribeCheckoutTicket";
import { EForfeitType } from "../SubscriptionFacturation"; import { EForfeitType } from "../SubscriptionFacturation";
import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe"; import Stripe from "@Front/Api/LeCoffreApi/Admin/Stripe/Stripe";

View File

@ -7,7 +7,7 @@ import Button from "@Front/Components/DesignSystem/Button";
import Link from "next/link"; import Link from "next/link";
import Module from "@Front/Config/Module"; import Module from "@Front/Config/Module";
import { EForfeitType } from "../SubscriptionFacturation"; import { EForfeitType } from "../SubscriptionFacturation";
import SubscribeCheckoutTicket, { EPaymentFrequency } from "../Components/SubscribeCheckoutTicket"; import SubscribeCheckoutTicket, { EPaymentFrequencyFront as EPaymentFrequency } from "../Components/SubscribeCheckoutTicket";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions"; import Subscriptions from "@Front/Api/LeCoffreApi/Admin/Subscriptions/Subscriptions";
import JwtService from "@Front/Services/JwtService/JwtService"; import JwtService from "@Front/Services/JwtService/JwtService";