diff --git a/package-lock.json b/package-lock.json index 1f0ab8a..e441e1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@mui/x-data-grid-premium": "^8.10.0", "@mui/x-date-pickers": "^8.10.0", "@rkheftan/harmony-ui": "^0.1.8", + "@rollup/rollup-win32-x64-msvc": "^4.46.3", "axios": "^1.11.0", "date-fns": "^4.1.0", "date-fns-jalali": "^4.0.0-0", @@ -1863,6 +1864,34 @@ "dev": true, "license": "MIT" }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", + "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", + "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.44.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", @@ -1877,6 +1906,242 @@ "darwin" ] }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", + "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz", + "integrity": "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz", + "integrity": "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", + "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", + "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", + "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", + "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz", + "integrity": "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", + "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", + "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz", + "integrity": "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", + "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", + "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", + "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", + "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", + "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.46.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.3.tgz", + "integrity": "sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "os": [ + "win32" + ] + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -5321,6 +5586,20 @@ "fsevents": "~2.3.2" } }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.44.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", + "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", diff --git a/package.json b/package.json index c803456..32132f3 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@mui/x-data-grid-premium": "^8.10.0", "@mui/x-date-pickers": "^8.10.0", "@rkheftan/harmony-ui": "^0.1.8", + "@rollup/rollup-win32-x64-msvc": "^4.46.3", "axios": "^1.11.0", "date-fns": "^4.1.0", "date-fns-jalali": "^4.0.0-0", diff --git a/public/locales/en/authentication.json b/public/locales/en/authentication.json index 9faa2fc..faead09 100644 --- a/public/locales/en/authentication.json +++ b/public/locales/en/authentication.json @@ -50,5 +50,15 @@ "ContainsASymbol": "Contains the symbol (!@#$%&*^)", "confirmPassword": "Confirm password", "passwordChangedSuccessfully": "Password changed successfully" + }, + "accountCreated": { + "yourHarmonyAccountHasBeenSuccessfullyCreated": "Your Harmony account has been successfully created.", + "yourAccountInformationCanBeChangedThrough": "Your account information can be changed through ", + "yourAccountInformationCanBeChangedThroughEnd": "", + "accountSettings": "account settings", + "harmonyClub": "Harmony club", + "encourageYourBusinessCustomersToMakeRepeatPurchasesBySendingThemDiscountCodesAndPoints": "Encourage your business customers to make repeat purchases by sending them discount codes and points.", + "redirectingTo": "Redirecting to", + "redirecting": "Redirecting..." } } diff --git a/public/locales/fa/authentication.json b/public/locales/fa/authentication.json index f688171..00081ca 100644 --- a/public/locales/fa/authentication.json +++ b/public/locales/fa/authentication.json @@ -52,5 +52,15 @@ "ContainsASymbol": "شامل علامت (!@#$%&*^)", "confirmPassword": "تکرار رمز عبور", "passwordChangedSuccessfully": "رمز عبور با موفقیت تغییر یافت" + }, + "accountCreated": { + "yourHarmonyAccountHasBeenSuccessfullyCreated": "حساب هارمونی شما با موفقیت ایجاد شد", + "yourAccountInformationCanBeChangedThrough": "اطلاعات حساب شما از طریق ", + "yourAccountInformationCanBeChangedThroughEnd": " قابل تغییر می باشد", + "accountSettings": "تنظیمات حساب", + "harmonyClub": "هارمونی کلاب", + "encourageYourBusinessCustomersToMakeRepeatPurchasesBySendingThemDiscountCodesAndPoints": "با ارسال کد تخفیف و امتیاز به مشتریان کسب و کارتان آنها را به خرید مجدد ترغیب کنید ", + "redirectingTo": "در حال انتقال به", + "redirecting": "درحال انتقال..." } } diff --git a/src/assets/account-created.svg b/src/assets/account-created.svg new file mode 100644 index 0000000..455d813 --- /dev/null +++ b/src/assets/account-created.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/features/authorization/components/AccountCreated/AccountCreated.tsx b/src/features/authorization/components/AccountCreated/AccountCreated.tsx new file mode 100644 index 0000000..ba49095 --- /dev/null +++ b/src/features/authorization/components/AccountCreated/AccountCreated.tsx @@ -0,0 +1,74 @@ +import React, { useMemo, useState } from 'react'; +import { AuthenticationCard } from '../AuthenticationCard'; +import { Box, CardHeader, Divider, Stack, Typography } from '@mui/material'; +import AccountCreatedIcon from '@/assets/account-created.svg'; +import { useTranslation } from 'react-i18next'; +import { Link as RouterLink, useSearchParams } from 'react-router-dom'; +import Link from '@mui/material/Link'; +import { AccountCreatedClubBanner } from './AccountCreatedClubBanner'; +import { AccountCreatedRedirectButton } from './AccountCreatedRedirectButton'; + +export type RequestedApplication = 'default' | 'unknown' | 'club'; + +export const AccountCreated = () => { + const { t } = useTranslation('authentication'); + const [params] = useSearchParams(); + + // Checking if there is a requested application and if its club or any other url + const requestedApplication = useMemo(() => { + const returnUrl = params.get('returnUrl'); + + if (!returnUrl) return 'default'; + + if (returnUrl.includes('club.business-harmony.com')) { + return 'club'; + } + + return 'unknown'; + }, [params]); + + const handleRedirectUser = () => { + const returnUrl = params.get('returnUrl'); + + if (returnUrl) { + location.href = returnUrl; + } + }; + + return ( + + + + + + {t('accountCreated.yourHarmonyAccountHasBeenSuccessfullyCreated')} + + + + {t('accountCreated.yourAccountInformationCanBeChangedThrough')} + + + {t('accountCreated.accountSettings')} + + + {t('accountCreated.yourAccountInformationCanBeChangedThroughEnd')} + + + + {requestedApplication !== 'default' && ( + + + + + {requestedApplication === 'club' && } + + + + + )} + + ); +}; diff --git a/src/features/authorization/components/AccountCreated/AccountCreatedClubBanner.tsx b/src/features/authorization/components/AccountCreated/AccountCreatedClubBanner.tsx new file mode 100644 index 0000000..213e17c --- /dev/null +++ b/src/features/authorization/components/AccountCreated/AccountCreatedClubBanner.tsx @@ -0,0 +1,25 @@ +import { Stack, Typography, useTheme } from '@mui/material'; +import { Icon } from '@rkheftan/harmony-ui'; +import { Box, Profile2User } from 'iconsax-react'; +import React from 'react'; +import { useTranslation } from 'react-i18next'; + +export const AccountCreatedClubBanner = () => { + const { t } = useTranslation('authentication'); + const theme = useTheme(); + + return ( + + + + + {t('accountCreated.harmonyClub')} + + {t( + 'accountCreated.encourageYourBusinessCustomersToMakeRepeatPurchasesBySendingThemDiscountCodesAndPoints', + )} + + + + ); +}; diff --git a/src/features/authorization/components/AccountCreated/AccountCreatedRedirectButton.tsx b/src/features/authorization/components/AccountCreated/AccountCreatedRedirectButton.tsx new file mode 100644 index 0000000..1cd78cb --- /dev/null +++ b/src/features/authorization/components/AccountCreated/AccountCreatedRedirectButton.tsx @@ -0,0 +1,51 @@ +import { useMemo } from 'react'; +import type { RequestedApplication } from './AccountCreated'; +import { Box, Button, useTheme } from '@mui/material'; +import { useTranslation } from 'react-i18next'; +import { CountDownTimer } from '@/components/CountDownTimer'; +import type { PalleteColor } from '@/theme/palette'; + +export interface AccountCreatedRedirectButtonProps { + requestedApplication: RequestedApplication; + onRedirectUser: () => void; +} + +export const AccountCreatedRedirectButton = ({ + requestedApplication, + onRedirectUser, +}: AccountCreatedRedirectButtonProps) => { + const { t } = useTranslation('authentication'); + + const buttonText = useMemo(() => { + switch (requestedApplication) { + case 'club': + return ( + t('accountCreated.redirectingTo') + + ' ' + + t('accountCreated.harmonyClub') + ); + + default: + return t('accountCreated.redirecting'); + } + }, [requestedApplication, t]); + + const buttonColor = useMemo(() => { + switch (requestedApplication) { + case 'club': + return 'club'; + + default: + return 'primary'; + } + }, [requestedApplication]); + + return ( + + + + ); +}; diff --git a/src/features/authorization/components/AuthenticationCard.tsx b/src/features/authorization/components/AuthenticationCard.tsx index 6c49575..6a9b136 100644 --- a/src/features/authorization/components/AuthenticationCard.tsx +++ b/src/features/authorization/components/AuthenticationCard.tsx @@ -1,8 +1,15 @@ import { Paper } from '@mui/material'; import { type PropsWithChildren } from 'react'; +export interface AuthenticationCardProps extends PropsWithChildren { + maxWidth?: string; +} + // Beacuse in the otp verify there is a element outside of the authentication card -export const AuthenticationCard = ({ children }: PropsWithChildren) => { +export const AuthenticationCard = ({ + children, + maxWidth, +}: AuthenticationCardProps) => { return ( { }, marginInline: 2, width: (t) => `calc(100% - ${t.spacing(2)})`, - maxWidth: '552px', + maxWidth: maxWidth ?? '552px', }} > {children} diff --git a/src/features/authorization/components/AuthenticationSteps/AuthenticationSteps.tsx b/src/features/authorization/components/AuthenticationSteps/AuthenticationSteps.tsx index ad240b8..344427b 100644 --- a/src/features/authorization/components/AuthenticationSteps/AuthenticationSteps.tsx +++ b/src/features/authorization/components/AuthenticationSteps/AuthenticationSteps.tsx @@ -49,27 +49,31 @@ export const AuthenticationSteps = (): JSX.Element => { } }; - const handleUserLoggedIn = (userId: GUID) => { - localStorage.setItem('userID', userId); - + const handleUserLoggedIn = () => { redirectToReturnUrl(); }; - const handleConfrimPhoneNumber = (userId: GUID) => { - localStorage.setItem('userID', userId); - + const handleConfrimPhoneNumber = () => { setCurrentStep('addPhoneNumber'); }; const handlePhoneNumberVerified = () => { - navigate('/signup'); + if (authReturnUrl) { + navigate(`/signup?returnUrl=${authReturnUrl}`); + } else { + navigate(`/signup`); + } }; const redirectToReturnUrl = () => { if (!authReturnUrl) { navigate(import.meta.env.VITE_DEFUALT_AUTH_RETURN_URL); } else { - location.href = authReturnUrl; + if (authMode === 'register') { + navigate(`/account-created?returnUrl=${authReturnUrl}`); + } else { + location.href = authReturnUrl; + } } }; diff --git a/src/features/authorization/routes/AccountCreatedPage.tsx b/src/features/authorization/routes/AccountCreatedPage.tsx new file mode 100644 index 0000000..29c9a4c --- /dev/null +++ b/src/features/authorization/routes/AccountCreatedPage.tsx @@ -0,0 +1,20 @@ +import { FlexBox } from '@/components/common/FlexBox'; +import Logo from '@/components/Logo'; +import { AccountCreated } from '../components/AccountCreated/AccountCreated'; + +export const AccountCreatedPage = () => { + return ( + + + + + ); +}; diff --git a/src/features/authorization/routes/UserCompletionPage.tsx b/src/features/authorization/routes/UserCompletionPage.tsx index 6286474..20ae7b0 100644 --- a/src/features/authorization/routes/UserCompletionPage.tsx +++ b/src/features/authorization/routes/UserCompletionPage.tsx @@ -21,10 +21,13 @@ import { least8Chars } from '@/utils/regexes/least8Chars'; import { containsNumber } from '@/utils/regexes/containsNumber'; import { hasUpperAndLowerLetter } from '@/utils/regexes/hasUpperAndLowerLetter'; import { isEmail } from '@/utils/regexes/isEmail'; +import { useNavigate, useSearchParams } from 'react-router-dom'; export function UserCompletionPage() { + const [params] = useSearchParams(); const { t } = useTranslation('completionForm'); const showToast = useToast(); + const navigate = useNavigate(); const [firstName, setFirstName] = useState(''); const [lastName, setLastName] = useState(''); @@ -128,13 +131,23 @@ export function UserCompletionPage() { ), severity: submitData.data.success ? 'success' : 'error', }); + + if (submitData.data.success) { + const returnUrl = params.get('returnUrl'); + + navigate( + returnUrl + ? `/account-created?returnUrl=${returnUrl}` + : '`/account-created', + ); + } } else if (submitError) { showToast({ message: getErrorMessage(submitError) || t('completion.problem'), severity: 'error', }); } - }, [submitData, submitError, showToast, t]); + }, [submitData, submitError, showToast, t, navigate, params]); useEffect(() => { setShowPasswordValidations(password ? !validPassword : false); diff --git a/src/providers/AuthProvider.tsx b/src/providers/AuthProvider.tsx index 5111903..7add190 100644 --- a/src/providers/AuthProvider.tsx +++ b/src/providers/AuthProvider.tsx @@ -114,31 +114,43 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => { } try { - const result = await axios.post( - import.meta.env.VITE_IDENTITY_URL, - new URLSearchParams({ - grant_type: 'refresh_token', - refresh_token: refreshToken, - client_id: import.meta.env.VITE_IDENTITY_CLIENT_ID, // from your token payload - }), - { - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', + const activeRefreshSession: string | null = + sessionStorage.getItem('active-refresh'); + + if ( + !activeRefreshSession || + (activeRefreshSession && JSON.parse(activeRefreshSession) === false) + ) { + sessionStorage.setItem('active-refresh', JSON.stringify(true)); + + const result = await axios.post( + import.meta.env.VITE_IDENTITY_URL, + new URLSearchParams({ + grant_type: 'refresh_token', + refresh_token: refreshToken, + client_id: import.meta.env.VITE_IDENTITY_CLIENT_ID, // from your token payload + }), + { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, }, - }, - ); + ); - if (result.data.access_token) { - inMemoryToken = result.data.access_token; - expiresAt = Date.now() + result.data.expires_in * 1000; + if (result.data.access_token) { + inMemoryToken = result.data.access_token; + expiresAt = Date.now() + result.data.expires_in * 1000; - sessionStorage.setItem(ACCESS_TOKEN_KEY, inMemoryToken as string); - sessionStorage.setItem(REFRESH_TOKEN_KEY, result.data.refresh_token); - sessionStorage.setItem(EXPIRES_IN_KEY, String(expiresAt)); + sessionStorage.setItem(ACCESS_TOKEN_KEY, inMemoryToken as string); + sessionStorage.setItem(REFRESH_TOKEN_KEY, result.data.refresh_token); + sessionStorage.setItem(EXPIRES_IN_KEY, String(expiresAt)); - setAccessToken(inMemoryToken); - } else { - logout(); + setAccessToken(inMemoryToken); + } else { + logout(); + } + + sessionStorage.setItem('active-refresh', JSON.stringify(false)); } } catch { logout(); diff --git a/src/routes/config.tsx b/src/routes/config.tsx index 6eef082..760815d 100644 --- a/src/routes/config.tsx +++ b/src/routes/config.tsx @@ -1,4 +1,5 @@ import { Layout } from '@/components'; +import { AccountCreatedPage } from '@/features/authorization/routes/AccountCreatedPage'; import { Calendar, Devices, @@ -72,6 +73,11 @@ export const appRoutes: RouteConfig[] = [ path: '/login', element: , }, + { + path: '/account-created', + element: , + authorize: true, + }, { path: '/signup', element: , authorize: true }, { path: '/forget-password', diff --git a/src/theme/color.type.ts b/src/theme/color.type.ts index 5e9151d..2cba15a 100644 --- a/src/theme/color.type.ts +++ b/src/theme/color.type.ts @@ -43,4 +43,8 @@ export interface Palette { dark: Partial; light: Partial; }; + club: { + dark: PaletteColorOptions; + light: PaletteColorOptions; + }; } diff --git a/src/theme/colors.ts b/src/theme/colors.ts index b9985a0..b61726c 100644 --- a/src/theme/colors.ts +++ b/src/theme/colors.ts @@ -16,6 +16,14 @@ export const PALETTE: Palette = { contrastText: '#FFFFFF', }, }, + club: { + light: { + main: '#FF5722', + }, + dark: { + main: '#FF5722', + }, + }, secondary: { light: { main: grey[900], diff --git a/src/theme/palette.ts b/src/theme/palette.ts index c37351e..a71a7de 100644 --- a/src/theme/palette.ts +++ b/src/theme/palette.ts @@ -1,6 +1,30 @@ import { type PaletteOptions } from '@mui/material/styles'; import { PALETTE } from './colors'; +declare module '@mui/material/styles' { + interface Palette { + club: Palette['primary']; // Extend Palette to include 'club' + } + interface PaletteOptions { + club?: PaletteOptions['primary']; // Extend PaletteOptions for optional 'club' + } +} + +declare module '@mui/material/Button' { + interface ButtonPropsColorOverrides { + club: true; + } +} + +export type PalleteColor = + | 'primary' + | 'secondary' + | 'error' + | 'success' + | 'warning' + | 'info' + | 'club'; + export const lightPalette: PaletteOptions = { mode: 'light', primary: PALETTE.primary.light, @@ -12,6 +36,7 @@ export const lightPalette: PaletteOptions = { info: PALETTE.info.light, background: PALETTE.background.light, text: PALETTE.text.light, + club: PALETTE.club.light, }; export const darkPalette: PaletteOptions = { @@ -25,4 +50,5 @@ export const darkPalette: PaletteOptions = { info: PALETTE.info.dark, background: PALETTE.background.dark, text: PALETTE.text.dark, + club: PALETTE.club.dark, };