diff --git a/packages/apps/human-app/frontend/package.json b/packages/apps/human-app/frontend/package.json index 2c41645461..0d76ca8e37 100644 --- a/packages/apps/human-app/frontend/package.json +++ b/packages/apps/human-app/frontend/package.json @@ -30,7 +30,6 @@ "@mui/x-date-pickers": "^9.9.0", "@reown/appkit": "^1.8.20", "@reown/appkit-adapter-wagmi": "^1.8.20", - "@synaps-io/verify-sdk": "^4.0.45", "@tanstack/react-query": "^5.91.3", "@wagmi/core": "^3.4.0", "date-fns": "^4.1.0", @@ -40,13 +39,11 @@ "lodash": "^4.18.1", "material-react-table": "3.0.1", "notistack": "^3.0.1", - "prop-types": "^15.8.1", "query-string": "^9.0.0", "react": "^19.2.6", "react-dom": "^19.2.6", "react-hook-form": "^7.71.1", "react-i18next": "^15.1.0", - "react-imask": "^7.4.0", "react-number-format": "^5.4.5", "react-router-dom": "^7.18.1", "serve": "^14.2.6", @@ -58,23 +55,17 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", - "@tanstack/eslint-plugin-query": "^5.60.1", - "@tanstack/react-query-devtools": "^5.59.16", "@types/lodash": "^4.17.24", "@types/node": "^22.10.5", - "@types/prop-types": "^15", "@types/react": "^19.2.15", "@types/react-dom": "^19.2.3", - "@vercel/style-guide": "^6.0.0", "@vitejs/plugin-react": "^4.2.1", "eslint": "^10.1.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.5.2", "globals": "^17.7.0", - "husky": "^9.1.6", "jsdom": "^29.1.1", "prettier": "^3.8.1", "typescript": "^6.0.2", diff --git a/packages/apps/human-app/frontend/src/api/auth-service.ts b/packages/apps/human-app/frontend/src/api/auth-service.ts index 177a98c600..a1f3ccf932 100644 --- a/packages/apps/human-app/frontend/src/api/auth-service.ts +++ b/packages/apps/human-app/frontend/src/api/auth-service.ts @@ -31,7 +31,7 @@ export class AuthService implements AuthProvider { constructor(private readonly httpClient: HttpApiClient) {} - async signIn(data: SignInDto): Promise { + async signIn(data: SignInDto): Promise { const res = await this.httpClient.post( apiPaths.worker.signIn.path, { @@ -40,7 +40,7 @@ export class AuthService implements AuthProvider { } ); - this.browserAuthProvider.signIn(res, 'web2'); + return res; } async getAccessToken(): Promise { diff --git a/packages/apps/human-app/frontend/src/api/hooks/use-access-token-refresh.ts b/packages/apps/human-app/frontend/src/api/hooks/use-access-token-refresh.ts index 2f74d18fd5..d33f8e2ba8 100644 --- a/packages/apps/human-app/frontend/src/api/hooks/use-access-token-refresh.ts +++ b/packages/apps/human-app/frontend/src/api/hooks/use-access-token-refresh.ts @@ -47,5 +47,6 @@ export function useAccessTokenRefresh() { return { refreshAccessToken: mutation.mutate, refreshAccessTokenAsync: mutation.mutateAsync, + isRefreshingAccessToken: mutation.isPending, }; } diff --git a/packages/apps/human-app/frontend/src/assets/background-images/signin-background-mobile.png b/packages/apps/human-app/frontend/src/assets/background-images/signin-background-mobile.png new file mode 100644 index 0000000000..6fff015e74 Binary files /dev/null and b/packages/apps/human-app/frontend/src/assets/background-images/signin-background-mobile.png differ diff --git a/packages/apps/human-app/frontend/src/assets/background-images/signin-background.png b/packages/apps/human-app/frontend/src/assets/background-images/signin-background.png new file mode 100644 index 0000000000..cb6c066c97 Binary files /dev/null and b/packages/apps/human-app/frontend/src/assets/background-images/signin-background.png differ diff --git a/packages/apps/human-app/frontend/src/assets/background-images/signup-background-mobile.png b/packages/apps/human-app/frontend/src/assets/background-images/signup-background-mobile.png new file mode 100644 index 0000000000..3400ddfe29 Binary files /dev/null and b/packages/apps/human-app/frontend/src/assets/background-images/signup-background-mobile.png differ diff --git a/packages/apps/human-app/frontend/src/assets/background-images/signup-background.png b/packages/apps/human-app/frontend/src/assets/background-images/signup-background.png new file mode 100644 index 0000000000..1fbdb516f6 Binary files /dev/null and b/packages/apps/human-app/frontend/src/assets/background-images/signup-background.png differ diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/hourglass.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/hourglass.svg new file mode 100644 index 0000000000..2095217f1c --- /dev/null +++ b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/hourglass.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/logo.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/logo.svg deleted file mode 100644 index ccc4a10943..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/logo.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/mobile-home-icons.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/mobile-home-icons.svg deleted file mode 100644 index 2f5037a36a..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/mobile-home-icons.svg +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/user.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/user.svg deleted file mode 100644 index b6821ac1a8..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/user.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/work.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/work.svg deleted file mode 100644 index 4417a07e48..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-homepage/work.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-navbar/human-logo-navbar.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-navbar/human-logo-navbar.svg index c5a20523ef..a10f3b0311 100644 --- a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-navbar/human-logo-navbar.svg +++ b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/icons-navbar/human-logo-navbar.svg @@ -1,16 +1,21 @@ - - - - - - - - + + + + + + + + + + - - + + - - - + + + + + + diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/moon.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/moon.svg index 83c14b28d0..df30df2f33 100644 --- a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/moon.svg +++ b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/moon.svg @@ -1,3 +1,3 @@ - - + + diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/sun.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/sun.svg index 676faefe43..4145780958 100644 --- a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/sun.svg +++ b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/sun.svg @@ -1,3 +1,4 @@ - - + + + diff --git a/packages/apps/human-app/frontend/src/assets/icons-dark-mode/veriff.svg b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/veriff.svg new file mode 100644 index 0000000000..38f0fac332 --- /dev/null +++ b/packages/apps/human-app/frontend/src/assets/icons-dark-mode/veriff.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/apps/human-app/frontend/src/assets/icons/chat.svg b/packages/apps/human-app/frontend/src/assets/icons/chat.svg deleted file mode 100644 index f75eab9760..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons/chat.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons/hourglass.svg b/packages/apps/human-app/frontend/src/assets/icons/hourglass.svg new file mode 100644 index 0000000000..ef4ba7468a --- /dev/null +++ b/packages/apps/human-app/frontend/src/assets/icons/hourglass.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/discord.svg b/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/discord.svg deleted file mode 100644 index ee9689095f..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/discord.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/logo.svg b/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/logo.svg deleted file mode 100644 index b9e1bec29c..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/logo.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/mobile-header.svg b/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/mobile-header.svg deleted file mode 100644 index 9e2dd04b78..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/mobile-header.svg +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/mobile-home-icons.svg b/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/mobile-home-icons.svg deleted file mode 100644 index 560edc356f..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/mobile-home-icons.svg +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/user.svg b/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/user.svg deleted file mode 100644 index dc361e58fe..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/user.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/work.svg b/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/work.svg deleted file mode 100644 index c8008e3c77..0000000000 --- a/packages/apps/human-app/frontend/src/assets/icons/icons-homepage/work.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/apps/human-app/frontend/src/assets/icons/icons-navbar/human-logo-navbar.svg b/packages/apps/human-app/frontend/src/assets/icons/icons-navbar/human-logo-navbar.svg index 473b53e255..ce92d62218 100644 --- a/packages/apps/human-app/frontend/src/assets/icons/icons-navbar/human-logo-navbar.svg +++ b/packages/apps/human-app/frontend/src/assets/icons/icons-navbar/human-logo-navbar.svg @@ -1,23 +1,21 @@ - - - - - - - - - - - - + + + - - - + + + + + + + + + + - - + + diff --git a/packages/apps/human-app/frontend/src/assets/icons/moon.svg b/packages/apps/human-app/frontend/src/assets/icons/moon.svg index fb53b8f96b..a0d8dd7557 100644 --- a/packages/apps/human-app/frontend/src/assets/icons/moon.svg +++ b/packages/apps/human-app/frontend/src/assets/icons/moon.svg @@ -1,3 +1,3 @@ - - + + diff --git a/packages/apps/human-app/frontend/src/assets/icons/sun.svg b/packages/apps/human-app/frontend/src/assets/icons/sun.svg index 6ff0c48480..4145780958 100644 --- a/packages/apps/human-app/frontend/src/assets/icons/sun.svg +++ b/packages/apps/human-app/frontend/src/assets/icons/sun.svg @@ -1,3 +1,4 @@ - - + + + diff --git a/packages/apps/human-app/frontend/src/assets/icons/veriff.svg b/packages/apps/human-app/frontend/src/assets/icons/veriff.svg new file mode 100644 index 0000000000..835e6d7829 --- /dev/null +++ b/packages/apps/human-app/frontend/src/assets/icons/veriff.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/apps/human-app/frontend/src/main.tsx b/packages/apps/human-app/frontend/src/main.tsx index b50351ca33..13e1ba2fa4 100644 --- a/packages/apps/human-app/frontend/src/main.tsx +++ b/packages/apps/human-app/frontend/src/main.tsx @@ -1,7 +1,6 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; import '@/shared/i18n/i18n'; import CssBaseline from '@mui/material/CssBaseline'; import { BrowserRouter } from 'react-router-dom'; @@ -17,7 +16,6 @@ import { WalletConnectProvider } from '@/shared/contexts/wallet-connect'; import { Web3AuthProvider } from '@/modules/auth-web3/context/web3-auth-context'; import { JWTExpirationCheck } from '@/shared/contexts/jwt-expiration-check'; import { ColorModeProvider } from '@/shared/contexts/color-mode'; -import { HomePageStateProvider } from '@/shared/contexts/homepage-state'; import { NotificationProvider } from '@/shared/providers/notifications-provider'; import { ModalProvider } from './shared/contexts/modal-context'; import { GlobalModal } from './shared/components/ui/modal/global-modal'; @@ -40,19 +38,16 @@ createRoot(root).render( - - - - - - - - - - - - - + + + + + + + + + + diff --git a/packages/apps/human-app/frontend/src/modules/auth/hooks/index.ts b/packages/apps/human-app/frontend/src/modules/auth/hooks/index.ts deleted file mode 100644 index 07e811485a..0000000000 --- a/packages/apps/human-app/frontend/src/modules/auth/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './use-auth'; -export * from './use-authenticated-user'; diff --git a/packages/apps/human-app/frontend/src/modules/governance-banner/components/governance-banner.tsx b/packages/apps/human-app/frontend/src/modules/governance-banner/components/governance-banner.tsx index a72404c85f..6128ff6366 100644 --- a/packages/apps/human-app/frontend/src/modules/governance-banner/components/governance-banner.tsx +++ b/packages/apps/human-app/frontend/src/modules/governance-banner/components/governance-banner.tsx @@ -4,7 +4,6 @@ import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { env } from '@/shared/env'; import { useColorMode } from '@/shared/contexts/color-mode'; -import { useWorkerIdentityVerificationStatus } from '@/modules/worker/profile/hooks'; import { useProposalQuery } from '../hooks/use-proposal-query'; import { formatCountdown } from '../../../shared/utils/time'; import { type ProposalResponse } from '../services/governance.service'; @@ -21,7 +20,6 @@ function getProposalStatus(proposal: ProposalResponse): ProposalStatus { export function GovernanceBanner() { const { t } = useTranslation(); const { data: proposal, isLoading, isError } = useProposalQuery(); - const { isVerificationCompleted } = useWorkerIdentityVerificationStatus(); const { colorPalette } = useColorMode(); const { text, background } = colorPalette.banner; const [timeRemaining, setTimeRemaining] = useState('00:00:00'); @@ -42,7 +40,7 @@ export function GovernanceBanner() { }; }, [proposal]); - if (!isVerificationCompleted || isLoading || isError || !proposal) { + if (isLoading || isError || !proposal) { return null; } diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/choose-sign-up-account-type.tsx b/packages/apps/human-app/frontend/src/modules/homepage/components/choose-sign-up-account-type.tsx deleted file mode 100644 index bb7ebfe479..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/choose-sign-up-account-type.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Grid, Typography } from '@mui/material'; -import { useTranslation } from 'react-i18next'; -import { PageCard } from '@/shared/components/ui/page-card'; -import type { HomePageStageType } from '@/modules/homepage/views/home.page'; -import { useHomePageState } from '@/shared/contexts/homepage-state'; -import { WorkerSignUp } from './worker-sign-up'; -import { OperatorSignUp } from './operator-sign-up'; - -interface ChooseSignUpAccountType { - setStage: (step: HomePageStageType) => void; -} - -export function ChooseSignUpAccountType() { - const { setPageView } = useHomePageState(); - const { t } = useTranslation(); - - const backToWelcomeStage = () => { - setPageView('welcome'); - }; - - return ( - {t('homepage.welcome')} 👋} - > - - - {t('homepage.howWillUse')} - - - - - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/home-container.tsx b/packages/apps/human-app/frontend/src/modules/homepage/components/home-container.tsx deleted file mode 100644 index 8450f2b27a..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/home-container.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Container } from '@mui/material'; -import { useEffect } from 'react'; -import { useBackgroundContext } from '@/shared/contexts/background'; -import { useHomePageState } from '@/shared/contexts/homepage-state'; -import { Welcome } from './welcome'; -import { ChooseSignUpAccountType } from './choose-sign-up-account-type'; - -export function HomeContainer() { - const { pageView } = useHomePageState(); - const { setWhiteBackground, setGrayBackground } = useBackgroundContext(); - - useEffect(() => { - if (pageView === 'chooseSignUpAccountType') { - setGrayBackground(); - } else { - setWhiteBackground(); - } - }, [setGrayBackground, setWhiteBackground, pageView]); - - return ( - - {pageView === 'welcome' && } - {pageView === 'chooseSignUpAccountType' && } - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/index.ts b/packages/apps/human-app/frontend/src/modules/homepage/components/index.ts deleted file mode 100644 index 8a804abdf7..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './home-container'; diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/logo-section.tsx b/packages/apps/human-app/frontend/src/modules/homepage/components/logo-section.tsx index d8666f3fac..0c7089ebba 100644 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/logo-section.tsx +++ b/packages/apps/human-app/frontend/src/modules/homepage/components/logo-section.tsx @@ -1,18 +1,10 @@ import { Grid, Stack, Typography } from '@mui/material'; import { useTranslation } from 'react-i18next'; -import { - MobileHomeIcons, - HomepageWorkIcon, - HomepageUserIcon, - HomepageLogoIcon, -} from '@/shared/components/ui/icons'; -import { useIsMobile } from '@/shared/hooks/use-is-mobile'; export function LogoSection() { const { t } = useTranslation(); const logoText: string = t('homepage.humanApp'); const logoTextSplit: string[] = logoText.split(' '); - const isMobile = useIsMobile('lg'); return ( - {isMobile ? ( - - - - ) : ( - - - - - - - - - - - - )} { - if (isConnected && modalWasOpened.current) { - signInMutation(); - } - }, [address, isConnected, signInMutation]); - - const getSnackBar = () => { - return ( - - ); - }; - - if (user) { - return ( - <> - - {getSnackBar()} - - ); - } - - if (!isConnected) { - return ( - <> - - {getSnackBar()} - - ); - } - - return ( - <> - - {getSnackBar()} - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/operator-sign-up.tsx b/packages/apps/human-app/frontend/src/modules/homepage/components/operator-sign-up.tsx deleted file mode 100644 index 488b5d88d5..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/operator-sign-up.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import { - Grid, - Typography, - List, - ListItemText, - Button, - Stack, -} from '@mui/material'; -import { useTranslation } from 'react-i18next'; -import { Link } from 'react-router-dom'; -import { routerPaths } from '@/router/router-paths'; -import { useColorMode } from '@/shared/contexts/color-mode'; -import { onlyDarkModeColor } from '@/shared/styles/dark-color-palette'; - -export function OperatorSignUp() { - const { colorPalette, isDarkMode } = useColorMode(); - const { t } = useTranslation(); - - return ( - - - - {t('homepage.joinAsOperator')} - - - - - - - - - - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/sign-in-section.tsx b/packages/apps/human-app/frontend/src/modules/homepage/components/sign-in-section.tsx index 0c33122c08..caff258a8f 100644 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/sign-in-section.tsx +++ b/packages/apps/human-app/frontend/src/modules/homepage/components/sign-in-section.tsx @@ -1,42 +1,45 @@ -import { Paper, Button, Divider } from '@mui/material'; +import { Paper, Button } from '@mui/material'; +import { Link } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useColorMode } from '@/shared/contexts/color-mode'; -import { useHomePageState } from '@/shared/contexts/homepage-state'; -import { useIsMobile } from '@/shared/hooks/use-is-mobile'; -import { OperatorSignIn } from './operator-sign-in'; -import { WorkerSignIn } from './worker-sign-in'; +import { routerPaths } from '@/router/router-paths'; export function SignInSection() { - const isMobile = useIsMobile('lg'); const { colorPalette } = useColorMode(); - const { setPageView } = useHomePageState(); const { t } = useTranslation(); return ( - - - + ); } diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/welcome.tsx b/packages/apps/human-app/frontend/src/modules/homepage/components/welcome.tsx deleted file mode 100644 index c6ba4099bb..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/welcome.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Grid } from '@mui/material'; -import { useEffect } from 'react'; -import { useColorMode } from '@/shared/contexts/color-mode'; -import { useBackgroundContext } from '@/shared/contexts/background'; -import { SignInSection } from './sign-in-section'; -import { LogoSection } from './logo-section'; - -export function Welcome() { - const { isDarkMode } = useColorMode(); - const { setWhiteBackground } = useBackgroundContext(); - - useEffect(() => { - if (!isDarkMode) { - setWhiteBackground(); - } - }, [isDarkMode, setWhiteBackground]); - - return ( - - - - - - - - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/worker-sign-in.tsx b/packages/apps/human-app/frontend/src/modules/homepage/components/worker-sign-in.tsx deleted file mode 100644 index 780c25cb38..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/worker-sign-in.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { t } from 'i18next'; -import { Link } from 'react-router-dom'; -import { Button } from '@/shared/components/ui/button'; -import { routerPaths } from '@/router/router-paths'; - -export function WorkerSignIn() { - return ( - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/homepage/components/worker-sign-up.tsx b/packages/apps/human-app/frontend/src/modules/homepage/components/worker-sign-up.tsx deleted file mode 100644 index 7fe567bce4..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/components/worker-sign-up.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import { - Grid, - Typography, - List, - ListItemText, - Button, - Stack, -} from '@mui/material'; -import { useTranslation } from 'react-i18next'; -import { Link } from 'react-router-dom'; -import { routerPaths } from '@/router/router-paths'; -import { useColorMode } from '@/shared/contexts/color-mode'; -import { onlyDarkModeColor } from '@/shared/styles/dark-color-palette'; - -export function WorkerSignUp() { - const { colorPalette, isDarkMode } = useColorMode(); - const { t } = useTranslation(); - - return ( - - - - - {t('homepage.iWantToEarn')} - - - - - - - - - - - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/homepage/hooks/index.ts b/packages/apps/human-app/frontend/src/modules/homepage/hooks/index.ts deleted file mode 100644 index f8ca47e636..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/hooks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './use-web3-signin'; diff --git a/packages/apps/human-app/frontend/src/modules/homepage/hooks/use-web3-signin.ts b/packages/apps/human-app/frontend/src/modules/homepage/hooks/use-web3-signin.ts deleted file mode 100644 index b5cfa38ab2..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/hooks/use-web3-signin.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { useMutation } from '@tanstack/react-query'; -import { z } from 'zod'; -import { useNavigate } from 'react-router-dom'; -import { useWeb3Auth } from '@/modules/auth-web3/hooks/use-web3-auth'; -import { routerPaths } from '@/router/router-paths'; -import { useWalletConnect } from '@/shared/contexts/wallet-connect'; -import { usePrepareSignature } from '@/shared/hooks'; -import { PrepareSignatureType } from '@/shared/services/signature.service'; -import * as homepageService from '../services/homepage.service'; - -export const web3SignInSuccessResponseSchema = z.object({ - access_token: z.string(), - refresh_token: z.string(), -}); - -export type Web3SignInSuccessResponse = z.infer< - typeof web3SignInSuccessResponseSchema ->; - -export function useWeb3SignIn() { - const { address, chainId, signMessage } = useWalletConnect(); - const { signIn } = useWeb3Auth(); - const navigate = useNavigate(); - const { prepareSignature } = usePrepareSignature( - PrepareSignatureType.SIGN_IN - ); - - return useMutation({ - mutationFn: async () => { - const data = await prepareSignature(); - - const signature = await signMessage(JSON.stringify(data)); - - if (!signature || !address) { - throw new Error('Failed to sign message: missing arguments.'); - } - - return homepageService.web3SignIn({ - address, - signature, - }); - }, - onSuccess: (successResponse) => { - signIn(successResponse); - navigate(routerPaths.operator.profile); - }, - - mutationKey: ['web3SignIn', address, chainId], - }); -} diff --git a/packages/apps/human-app/frontend/src/modules/homepage/services/homepage.service.ts b/packages/apps/human-app/frontend/src/modules/homepage/services/homepage.service.ts deleted file mode 100644 index 98c44f091a..0000000000 --- a/packages/apps/human-app/frontend/src/modules/homepage/services/homepage.service.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { ApiClientError, humanAppApiClient } from '@/api'; -import { type Web3SignInSuccessResponse } from '../hooks'; - -const apiPaths = { - web3Auth: { - signIn: '/auth/web3/signin', - }, -}; - -async function web3SignIn(data: { signature: string; address: string }) { - try { - const result = await humanAppApiClient.post( - apiPaths.web3Auth.signIn, - { - body: data, - } - ); - return result; - } catch (error) { - if (error instanceof ApiClientError) { - throw error; - } - - throw new Error('Failed to log in using web3.'); - } -} - -export { web3SignIn }; diff --git a/packages/apps/human-app/frontend/src/modules/homepage/views/home.page.tsx b/packages/apps/human-app/frontend/src/modules/homepage/views/home.page.tsx index 35ba3e9221..85111fbc80 100644 --- a/packages/apps/human-app/frontend/src/modules/homepage/views/home.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/homepage/views/home.page.tsx @@ -1,53 +1,48 @@ -import Box from '@mui/material/Box'; -import { Paper } from '@mui/material'; +import { Box, Container, Grid, Paper } from '@mui/material'; import { Navigate } from 'react-router-dom'; -import { useIsMobile } from '@/shared/hooks/use-is-mobile'; -import { useWeb3Auth } from '@/modules/auth-web3/hooks/use-web3-auth'; import { useAuth } from '@/modules/auth/hooks/use-auth'; import { routerPaths } from '@/router/router-paths'; import { useColorMode } from '@/shared/contexts/color-mode'; -import { HomeContainer } from '@/modules/homepage/components'; -import { useHomePageState } from '@/shared/contexts/homepage-state'; - -export type HomePageStageType = 'welcome' | 'chooseSignUpAccountType'; +import { KycStatus } from '@/modules/worker/profile/types/profile-types'; +import { LogoSection } from '../components/logo-section'; +import { SignInSection } from '../components/sign-in-section'; export function HomePage() { - const { colorPalette, isDarkMode } = useColorMode(); - const { pageView } = useHomePageState(); - const isMobile = useIsMobile(); + const { colorPalette } = useColorMode(); const { user: worker } = useAuth(); - const { user: operator } = useWeb3Auth(); - if (worker) { + if ( + worker && + worker.kyc_status === KycStatus.APPROVED && + worker.wallet_address + ) { return ; } - if (operator) { - return ; - } - - const paperBackgroundColor = (() => { - if (isDarkMode) { - return colorPalette.paper.main; - } - - return colorPalette.backgroundColor; - })(); return ( - + + + + + + + + + + ); diff --git a/packages/apps/human-app/frontend/src/modules/signin/worker/sign-in-form.tsx b/packages/apps/human-app/frontend/src/modules/signin/worker/sign-in-form.tsx index f08174d2cd..0393e7db73 100644 --- a/packages/apps/human-app/frontend/src/modules/signin/worker/sign-in-form.tsx +++ b/packages/apps/human-app/frontend/src/modules/signin/worker/sign-in-form.tsx @@ -1,14 +1,18 @@ +import { type SubmitEvent } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; -import { Box, Grid, Link as MuiLink, Typography } from '@mui/material'; +import { Box, Divider, Grid, Link as MuiLink, Typography } from '@mui/material'; import { zodResolver } from '@hookform/resolvers/zod'; import { useTranslation } from 'react-i18next'; import { Link } from 'react-router-dom'; + import { Input } from '@/shared/components/data-entry/input'; import { Button } from '@/shared/components/ui/button'; -import { Password } from '@/shared/components/data-entry/password/password'; -import { routerPaths } from '@/router/router-paths'; +import { Password } from '@/shared/components/data-entry/password'; +import { useColorMode } from '@/shared/contexts/color-mode/use-color-mode'; import { useResetMutationErrors } from '@/shared/hooks/use-reset-mutation-errors'; import { HCaptchaForm } from '@/shared/components/hcaptcha'; +import { routerPaths } from '@/router/router-paths'; + import { type SignInDto, signInDtoSchema } from './schemas'; interface SignInFormProps { @@ -23,8 +27,9 @@ export function SignInForm({ error, isLoading, resetMutation, -}: Readonly) { +}: SignInFormProps) { const { t } = useTranslation(); + const { colorPalette } = useColorMode(); const methods = useForm({ defaultValues: { @@ -37,7 +42,7 @@ export function SignInForm({ useResetMutationErrors(methods.watch, resetMutation); - const handleSubmit = (event: React.FormEvent) => { + const handleSubmit = (event: SubmitEvent) => { void methods.handleSubmit(onSubmit)(event); }; @@ -56,29 +61,87 @@ export function SignInForm({ name="password" /> - - - {t('worker.signInForm.forgotPassword')} - - + + {t('worker.signInForm.forgotPassword')} + + + + + {t('worker.signInForm.or')} + + + *': { + display: 'inline-flex', + }, + }} + > + + {t('worker.signInForm.dontHaveAccount')} + {' '} + + {t('worker.signInForm.signUp')} + + diff --git a/packages/apps/human-app/frontend/src/modules/signin/worker/sign-in.page.tsx b/packages/apps/human-app/frontend/src/modules/signin/worker/sign-in.page.tsx index f7f216dc4d..7f2e9028f8 100644 --- a/packages/apps/human-app/frontend/src/modules/signin/worker/sign-in.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/signin/worker/sign-in.page.tsx @@ -1,11 +1,24 @@ +import { useEffect, useState } from 'react'; import { t } from 'i18next'; -import { PageCard } from '@/shared/components/ui/page-card'; -import { Alert } from '@/shared/components/ui/alert'; +import { useNavigate } from 'react-router-dom'; +import { Box, Grid, Paper, Typography } from '@mui/material'; import { getErrorMessageForError } from '@/shared/errors'; import { ApiClientError } from '@/api'; import { useSignIn } from './use-sign-in'; import { SignInForm } from './sign-in-form'; +import signInImage from '@/assets/background-images/signin-background.png'; +import { + TopNotificationType, + useNotification, +} from '@/shared/hooks/use-notification'; +import { BackButton } from '@/shared/components/ui/page-card/back-button'; +import { useColorMode } from '@/shared/contexts/color-mode'; +import { VerificationFlow } from './verification-flow'; +import { useAuth } from '@/modules/auth/hooks/use-auth'; +import { KycStatus } from '@/modules/worker/profile/types'; +import { routerPaths } from '@/router/router-paths'; + function formattedSignInErrorMessage( unknownError: unknown ): string | undefined { @@ -15,25 +28,138 @@ function formattedSignInErrorMessage( } export function SignInWorkerPage() { - const { signIn, error, isError, isLoading, reset } = useSignIn(); + const [isVerificationRequired, setIsVerificationRequired] = useState(false); + const { signIn, error, isSuccess, isError, isLoading, reset } = useSignIn(); + const { showNotification } = useNotification(); + const navigate = useNavigate(); + const { user } = useAuth(); + const { colorPalette } = useColorMode(); + + useEffect(() => { + if (isError) { + const message = getErrorMessageForError( + error, + formattedSignInErrorMessage + ); + showNotification({ + message, + type: TopNotificationType.ERROR, + }); + } + }, [isError, error, showNotification]); + + useEffect(() => { + if (!isSuccess || !user) { + return; + } + + if (user.kyc_status === KycStatus.APPROVED && user.wallet_address) { + navigate(routerPaths.worker.profile); + return; + } + + setIsVerificationRequired(true); + }, [isSuccess, user, navigate]); + + const handleBackButton = () => { + navigate(-1); + }; return ( - - {getErrorMessageForError(error, formattedSignInErrorMessage)} - - ) : undefined - } + - - + {isVerificationRequired ? ( + + ) : ( + + + + + + + + + {t('worker.signInForm.title')} + + + + + + )} + ); } diff --git a/packages/apps/human-app/frontend/src/modules/signin/worker/use-sign-in-mutation.ts b/packages/apps/human-app/frontend/src/modules/signin/worker/use-sign-in-mutation.ts index 80c11c8e6e..cf75008640 100644 --- a/packages/apps/human-app/frontend/src/modules/signin/worker/use-sign-in-mutation.ts +++ b/packages/apps/human-app/frontend/src/modules/signin/worker/use-sign-in-mutation.ts @@ -1,8 +1,7 @@ import { useMutation } from '@tanstack/react-query'; -import { useNavigate } from 'react-router-dom'; -import { routerPaths } from '@/router/router-paths'; import { env } from '@/shared/env'; import { AuthService, HttpApiClient } from '@/api'; +import { useAuth } from '@/modules/auth/hooks/use-auth'; import { type SignInDto } from './schemas'; function signInMutationFn(data: SignInDto) { @@ -13,13 +12,12 @@ function signInMutationFn(data: SignInDto) { } export function useSignInMutation() { - const navigate = useNavigate(); + const { signIn } = useAuth(); return useMutation({ mutationFn: signInMutationFn, - onSuccess: () => { - navigate(routerPaths.worker.profile); - window.location.reload(); + onSuccess: (successResponse) => { + signIn(successResponse); }, }); } diff --git a/packages/apps/human-app/frontend/src/modules/signin/worker/use-sign-in.tsx b/packages/apps/human-app/frontend/src/modules/signin/worker/use-sign-in.tsx index 9368785558..477abd65c1 100644 --- a/packages/apps/human-app/frontend/src/modules/signin/worker/use-sign-in.tsx +++ b/packages/apps/human-app/frontend/src/modules/signin/worker/use-sign-in.tsx @@ -7,6 +7,7 @@ export function useSignIn() { const { mutate: signInWorkerMutate, error: signInWorkerError, + isSuccess: isSignInWorkerSuccess, isError: isSignInWorkerError, isPending: isSignInWorkerPending, reset: signInWorkerMutationReset, @@ -23,6 +24,7 @@ export function useSignIn() { return { signIn: handleWorkerSignIn, error: signInWorkerError, + isSuccess: isSignInWorkerSuccess, isError: isSignInWorkerError, isLoading: isSignInWorkerPending, reset: signInWorkerMutationReset, diff --git a/packages/apps/human-app/frontend/src/modules/signin/worker/verification-flow.tsx b/packages/apps/human-app/frontend/src/modules/signin/worker/verification-flow.tsx new file mode 100644 index 0000000000..bf257b6964 --- /dev/null +++ b/packages/apps/human-app/frontend/src/modules/signin/worker/verification-flow.tsx @@ -0,0 +1,124 @@ +import { useCallback, useState } from 'react'; +import { Box, Stack, Typography } from '@mui/material'; +import { t } from 'i18next'; + +import { Chip } from '@/shared/components/ui/chip'; +import { useColorMode } from '@/shared/contexts/color-mode/use-color-mode'; +import { + IdentityVerificationControl, + WalletConnectionControl, +} from '@/modules/worker/profile/components'; +import { useWorkerIdentityVerificationStatus } from '@/modules/worker/profile/hooks'; +import { KycStatus } from '@/modules/worker/profile/types/profile-types'; +import { useIsMobile } from '@/shared/hooks'; + +type VerificationStep = 'kyc' | 'wallet'; + +const getChipColor = (status: KycStatus) => { + if (status === KycStatus.APPROVED) { + return 'success.main'; + } else if ( + [KycStatus.RESUBMISSION_REQUESTED, KycStatus.REVIEW].includes(status) + ) { + return 'warning.main'; + } + return 'error.main'; +}; + +export function VerificationFlow({ + isKycApproved, +}: { + isKycApproved: boolean; +}) { + const [step, setStep] = useState( + isKycApproved ? 'wallet' : 'kyc' + ); + + const { colorPalette } = useColorMode(); + const { status } = useWorkerIdentityVerificationStatus(); + const isMobile = useIsMobile(); + + const label = t(`worker.profile.idvStatusValues.${status}`); + const isKycDeclined = status === KycStatus.DECLINED; + const isKycStarted = status !== KycStatus.NONE; + + const handleKycApproved = useCallback(() => { + setStep('wallet'); + }, []); + + return ( + + + {t('worker.profile.beforeWeGetStarted')} + + + + + + {step === 'kyc' && ( + <> + + {t('worker.profile.identityVerification')} + {isKycStarted && ( + + )} + + + + )} + {step === 'wallet' && ( + <> + + {t('worker.profile.connectYourWallet')} + + + + )} + + ); +} diff --git a/packages/apps/human-app/frontend/src/modules/signup/operator/views/edit-existing-keys-success.page.tsx b/packages/apps/human-app/frontend/src/modules/signup/operator/views/edit-existing-keys-success.page.tsx index 96fc9a322e..9e2c42510d 100644 --- a/packages/apps/human-app/frontend/src/modules/signup/operator/views/edit-existing-keys-success.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/signup/operator/views/edit-existing-keys-success.page.tsx @@ -60,7 +60,6 @@ export function EditExistingKeysSuccessPage() { ) : undefined } showBackButton={false} - showCancelButton={false} title={t('operator.editExistingKeysSuccess.title')} > diff --git a/packages/apps/human-app/frontend/src/modules/signup/worker/views/sign-up-worker.page.tsx b/packages/apps/human-app/frontend/src/modules/signup/worker/views/sign-up-worker.page.tsx index 94a1bc65d2..344302478e 100644 --- a/packages/apps/human-app/frontend/src/modules/signup/worker/views/sign-up-worker.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/signup/worker/views/sign-up-worker.page.tsx @@ -1,24 +1,40 @@ +import { useEffect } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; +import { Link as RouterLink, useNavigate } from 'react-router-dom'; import { zodResolver } from '@hookform/resolvers/zod'; -import Grid from '@mui/material/Grid'; -import Typography from '@mui/material/Typography'; -import Link from '@mui/material/Link'; -import { useTranslation, Trans } from 'react-i18next'; +import { Box, Divider, Grid, Link, Paper, Typography } from '@mui/material'; +import { Trans } from 'react-i18next'; +import { t } from 'i18next'; import { Button } from '@/shared/components/ui/button'; import { Input } from '@/shared/components/data-entry/input'; -import { Password } from '@/shared/components/data-entry/password/password'; -import { PageCard } from '@/shared/components/ui/page-card'; +import { Password } from '@/shared/components/data-entry/password'; import { env } from '@/shared/env'; import { getErrorMessageForError } from '@/shared/errors'; -import { Alert } from '@/shared/components/ui/alert'; import { HCaptchaForm } from '@/shared/components/hcaptcha'; import { useResetMutationErrors } from '@/shared/hooks/use-reset-mutation-errors'; import { useSignUpWorker } from '@/modules/signup/worker/hooks/use-sign-up-worker'; import { ApiClientError } from '@/api'; import { signUpDtoSchema } from '../schema'; +import signUpImage from '@/assets/background-images/signup-background.png'; +import { BackButton } from '@/shared/components/ui/page-card/back-button'; + +import { routerPaths } from '@/router/router-paths'; +import { + TopNotificationType, + useNotification, +} from '@/shared/hooks/use-notification'; +import { useColorMode } from '@/shared/contexts/color-mode'; + +function handleSignupError(unknownError: unknown) { + if (unknownError instanceof ApiClientError && unknownError.status === 409) { + return t('worker.signUpForm.errors.emailTaken'); + } +} export function SignUpWorkerPage() { - const { t } = useTranslation(); + const { showNotification } = useNotification(); + const navigate = useNavigate(); + const { colorPalette } = useColorMode(); const { signUp, error, isError, isLoading, reset } = useSignUpWorker(); const methods = useForm({ defaultValues: { @@ -30,12 +46,20 @@ export function SignUpWorkerPage() { resolver: zodResolver(signUpDtoSchema), }); + useEffect(() => { + if (isError) { + const errorMessage = getErrorMessageForError(error, handleSignupError); + showNotification({ + message: errorMessage, + type: TopNotificationType.ERROR, + }); + } + }, [isError, error, showNotification]); + useResetMutationErrors(methods.watch, reset); - const handleSignupError = (unknownError: unknown) => { - if (unknownError instanceof ApiClientError && unknownError.status === 409) { - return t('worker.signUpForm.errors.emailTaken'); - } + const handleBackButton = () => { + navigate(-1); }; const handleSubmit = (event: React.FormEvent) => { @@ -43,63 +67,193 @@ export function SignUpWorkerPage() { }; return ( - - {getErrorMessageForError(error, handleSignupError)} - - ) : undefined - } - title={t('worker.signUpForm.title')} + - -
- - - - - - - - ), - 2: ( - - ), - }} - i18nKey="worker.signUpForm.termsOfServiceAndPrivacyPolicy" - /> - - - - - -
-
-
+ {t('worker.signUpForm.title')} + + + +
+ + + + + + + ), + 2: ( + + ), + }} + i18nKey="worker.signUpForm.termsOfServiceAndPrivacyPolicy" + /> + + + + + + + {t('worker.signUpForm.or')} + + + *': { + display: 'inline-flex', + }, + }} + > + + {t('worker.signUpForm.alreadyHaveAccount')} + {' '} + + {t('worker.signUpForm.signIn')} + + + +
+
+
+ + + + + ); } diff --git a/packages/apps/human-app/frontend/src/modules/smart-contracts/EthKVStore/eth-kv-store-get-kyc-data.ts b/packages/apps/human-app/frontend/src/modules/smart-contracts/EthKVStore/eth-kv-store-get-kyc-data.ts deleted file mode 100644 index b1c1534671..0000000000 --- a/packages/apps/human-app/frontend/src/modules/smart-contracts/EthKVStore/eth-kv-store-get-kyc-data.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Contract, ethers } from 'ethers'; -import EthKVStore from '@/modules/smart-contracts/abi/EthKVStore.json'; -import type { ContractCallArguments } from '@/modules/smart-contracts/types'; -import type { KYCKey } from '@/modules/smart-contracts/EthKVStore/config'; -import { JsonRpcError } from '@/modules/smart-contracts/json-rpc-error'; -import { env } from '@/shared/env'; -import type { ChainWithAddresses } from '@/modules/smart-contracts/chains'; -import { MainnetChains, TestnetChains } from '@/modules/smart-contracts/chains'; - -export async function ethKVStoreGetKycData({ - kycKey, - accountAddress, - contractAddress, -}: { kycKey: KYCKey; accountAddress: string } & Omit< - ContractCallArguments, - 'chainId' | 'signer' ->) { - try { - let chain: ChainWithAddresses | undefined; - - if (env.VITE_NETWORK === 'mainnet') { - chain = MainnetChains[0]; - } else { - chain = TestnetChains[0]; - } - - const provider = new ethers.JsonRpcProvider(chain.rpcUrl); - - const ethKVStoreContract = new Contract( - contractAddress, - EthKVStore.abi, - provider - ); - - const result = (await ethKVStoreContract.get(accountAddress, kycKey)) as - | string - | null; - - return result; - } catch (error) { - throw new JsonRpcError(error); - } -} diff --git a/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-form-container.tsx b/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-form-container.tsx index 96a31a9294..7780b70244 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-form-container.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-form-container.tsx @@ -1,31 +1,37 @@ -import { useNavigate } from 'react-router-dom'; import { useEffect } from 'react'; -import { useTranslation } from 'react-i18next'; -import { PageCard, PageCardLoader } from '@/shared/components/ui/page-card'; +import { Trans, useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; +import { FormProvider } from 'react-hook-form'; +import { Box, Grid, Paper, Typography } from '@mui/material'; + +import { PageCardLoader } from '@/shared/components/ui/page-card'; import { getErrorMessageForError } from '@/shared/errors'; -import { useAuth } from '@/modules/auth/hooks/use-auth'; -import { routerPaths } from '@/router/router-paths'; import { TopNotificationType, useNotification, } from '@/shared/hooks/use-notification'; import { useResendEmailRouterParams, useResendEmail } from '../hooks'; -import { ResendVerificationEmailForm } from './resend-verification-email-form'; +import { useColorMode } from '@/shared/contexts/color-mode'; +import { useAuth } from '@/modules/auth/hooks/use-auth'; +import { routerPaths } from '@/router/router-paths'; +import { InboxIcon } from '@/shared/components/ui/icons'; +import { Button } from '@/shared/components/ui/button'; +import { HCaptchaForm } from '@/shared/components/hcaptcha/h-captcha-form'; export function EmailVerificationFormContainer() { - const { user, signOut } = useAuth(); - const navigate = useNavigate(); - const routerState = useResendEmailRouterParams(); + const { email } = useResendEmailRouterParams() ?? {}; const { methods, handleResend, isError, error, isSuccess } = useResendEmail(); const { showNotification } = useNotification(); const { t } = useTranslation(); - const isAuthenticated = Boolean(user); + const { colorPalette } = useColorMode(); + const { user, signOut } = useAuth(); + const navigate = useNavigate(); useEffect(() => { if (isError) { showNotification({ message: getErrorMessageForError(error), - type: TopNotificationType.WARNING, + type: TopNotificationType.ERROR, }); } }, [isError, error, showNotification]); @@ -44,18 +50,120 @@ export function EmailVerificationFormContainer() { navigate(routerPaths.homePage); }; - if (!routerState?.email) { + if (!email) { return ; } return ( - - - + + +
{ + void methods.handleSubmit(handleResend)(event); + }} + > + + + + {t('worker.verifyEmail.checkYourInbox')} + + + + ), + }} + i18nKey="worker.verifyEmail.paragraph1" + values={{ email }} + /> + + + {t('worker.verifyEmail.paragraph2')} + + + + + {!!user && ( + <> + + + + )} + +
+
+
); } diff --git a/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-process.tsx b/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-process.tsx index 3aa579253e..2c77e27772 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-process.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-process.tsx @@ -7,13 +7,7 @@ import { getErrorMessageForError } from '@/shared/errors'; import { useVerifyEmailMutation } from '../hooks'; import { EmailVerificationSuccessMessage } from './email-verification-success-message'; -interface EmailVerificationProcessProps { - token: string; -} - -export function EmailVerificationProcess({ - token, -}: Readonly) { +export function EmailVerificationProcess({ token }: { token: string }) { const { error, isError, diff --git a/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-success-message.tsx b/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-success-message.tsx index 8d3107bd1f..b3cb732dcf 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-success-message.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/email-verification-success-message.tsx @@ -1,33 +1,58 @@ import { t } from 'i18next'; -import Grid from '@mui/material/Grid'; -import Typography from '@mui/material/Typography'; import { Link } from 'react-router-dom'; +import { Paper, Stack, Typography } from '@mui/material'; + import { Button } from '@/shared/components/ui/button'; -import { PageCard } from '@/shared/components/ui/page-card'; -import { SuccessLabel } from '@/shared/components/ui/success-label'; +import { SuccessIcon } from '@/shared/components/ui/icons'; +import { useColorMode } from '@/shared/contexts/color-mode'; import { routerPaths } from '@/router/router-paths'; export function EmailVerificationSuccessMessage() { + const { colorPalette } = useColorMode(); return ( - {t('worker.emailVerification.title')}} + - - - {t('worker.emailVerification.description')} + + + + {t('worker.emailVerification.title')} - - + + ); } diff --git a/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/resend-verification-email-form.tsx b/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/resend-verification-email-form.tsx deleted file mode 100644 index bb001a2317..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/email-verification/components/resend-verification-email-form.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import { FormProvider } from 'react-hook-form'; -import { type z } from 'zod'; -import Grid from '@mui/material/Grid'; -import Typography from '@mui/material/Typography'; -import { Trans, useTranslation } from 'react-i18next'; -import type { UseFormReturn } from 'react-hook-form'; -import { Button } from '@/shared/components/ui/button'; -import { HCaptchaForm } from '@/shared/components/hcaptcha/h-captcha-form'; -import { MailTo } from '@/shared/components/ui/mail-to'; -import { env } from '@/shared/env'; -import { - type resendEmailVerificationHcaptchaSchema, - type ResendEmailVerificationDto, -} from '../schemas'; - -interface ResendVerificationEmailFormProps { - methods: UseFormReturn< - z.input, - unknown, - ResendEmailVerificationDto - >; - handleResend: (data: ResendEmailVerificationDto) => void; - email: string; - isAuthenticated: boolean; -} - -export function ResendVerificationEmailForm({ - methods, - handleResend, - email, - isAuthenticated, -}: Readonly) { - const { t } = useTranslation(); - - return ( - -
{ - void methods.handleSubmit(handleResend)(event); - }} - > - - - , - }} - i18nKey="worker.verifyEmail.paragraph1" - values={{ email }} - /> - - - {t('worker.verifyEmail.paragraph2')} - - - , - }} - i18nKey="worker.verifyEmail.paragraph3" - /> - - - - ), - 2: , - }} - i18nKey="worker.verifyEmail.paragraph4" - /> - - {isAuthenticated && ( - <> - - - - )} - -
-
- ); -} diff --git a/packages/apps/human-app/frontend/src/modules/worker/email-verification/pages/index.ts b/packages/apps/human-app/frontend/src/modules/worker/email-verification/pages/index.ts deleted file mode 100644 index 27efb8dd15..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/email-verification/pages/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './worker-email-verification-process.page'; -export * from './worker-verify-email.page'; diff --git a/packages/apps/human-app/frontend/src/modules/worker/hcaptcha-labeling/components/index.ts b/packages/apps/human-app/frontend/src/modules/worker/hcaptcha-labeling/components/index.ts deleted file mode 100644 index 7a439e76d9..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/hcaptcha-labeling/components/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './user-stats-accordion'; -export * from './user-stats-details'; -export * from './user-stats-drawer'; -export * from './user-stats-loading-overlay'; diff --git a/packages/apps/human-app/frontend/src/modules/worker/hcaptcha-labeling/hcaptcha-labeling.page.tsx b/packages/apps/human-app/frontend/src/modules/worker/hcaptcha-labeling/hcaptcha-labeling.page.tsx index 232f127f4d..8ff36d9b51 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/hcaptcha-labeling/hcaptcha-labeling.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/hcaptcha-labeling/hcaptcha-labeling.page.tsx @@ -1,8 +1,7 @@ import HCaptcha from '@hcaptcha/react-hcaptcha'; -import Grid from '@mui/material/Grid'; -import { Paper, Typography } from '@mui/material'; +import { Grid, Paper, Typography } from '@mui/material'; import { t } from 'i18next'; -import { Navigate, useNavigate } from 'react-router-dom'; +import { useNavigate } from 'react-router-dom'; import { useRef } from 'react'; import { env } from '@/shared/env'; import { breakpoints } from '@/shared/styles/breakpoints'; @@ -10,11 +9,9 @@ import { Counter } from '@/shared/components/ui/counter'; import { getErrorMessageForError } from '@/shared/errors'; import { getTomorrowDate } from '@/shared/helpers/date'; import { useAuthenticatedUser } from '@/modules/auth/hooks/use-authenticated-user'; -import { useWorkerIdentityVerificationStatus } from '@/modules/worker/profile/hooks'; import { useHCaptchaLabelingNotifications } from '@/modules/worker/hooks/use-hcaptcha-labeling-notifications'; import { useColorMode } from '@/shared/contexts/color-mode'; import { onlyDarkModeColor } from '@/shared/styles/dark-color-palette'; -import { routerPaths } from '@/router/router-paths'; import { PageCardLoader, PageCardError, @@ -29,7 +26,6 @@ export function HcaptchaLabelingPage() { const { colorPalette, isDarkMode } = useColorMode(); const captchaRef = useRef(null); const { user } = useAuthenticatedUser(); - const { isVerificationCompleted } = useWorkerIdentityVerificationStatus(); const { onSuccess, onError } = useHCaptchaLabelingNotifications(); const statsColor = isDarkMode ? onlyDarkModeColor.additionalTextColor @@ -79,10 +75,6 @@ export function HcaptchaLabelingPage() { solveHCaptchaMutation({ token }); }; - if (!isVerificationCompleted) { - return ; - } - if (isHcaptchaUserStatsPending || isDailyHmtSpentPending) { return ; } diff --git a/packages/apps/human-app/frontend/src/modules/worker/hooks/use-register-address.ts b/packages/apps/human-app/frontend/src/modules/worker/hooks/use-register-address.ts index 428b2d592e..5de48d8858 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/hooks/use-register-address.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/hooks/use-register-address.ts @@ -1,12 +1,12 @@ import { useMutation } from '@tanstack/react-query'; import { t } from 'i18next'; -import { useAuthenticatedUser } from '@/modules/auth/hooks/use-authenticated-user'; import { useAccessTokenRefresh } from '@/api/hooks/use-access-token-refresh'; import type { ResponseError } from '@/shared/types/global.type'; import { useWalletConnect } from '@/shared/contexts/wallet-connect'; import { usePrepareSignature } from '@/shared/hooks'; import { PrepareSignatureType } from '@/shared/services/signature.service'; import * as profileService from '../profile/services/profile.service'; +import { useAuth } from '@/modules/auth/hooks/use-auth'; interface RegisterAddressCallbacks { onSuccess: () => void | Promise; @@ -14,7 +14,7 @@ interface RegisterAddressCallbacks { } function useRegisterAddressMutation(callbacks: RegisterAddressCallbacks) { - const { user, updateUserData } = useAuthenticatedUser(); + const { user, updateUserData } = useAuth(); const { refreshAccessTokenAsync } = useAccessTokenRefresh(); const { address, chainId, signMessage } = useWalletConnect(); const { prepareSignature } = usePrepareSignature( @@ -51,7 +51,7 @@ function useRegisterAddressMutation(callbacks: RegisterAddressCallbacks) { onError: async (error: ResponseError) => { await callbacks.onError(error); }, - mutationKey: [user.wallet_address], + mutationKey: [user?.wallet_address], }); } diff --git a/packages/apps/human-app/frontend/src/modules/worker/jobs-discovery/hooks/index.ts b/packages/apps/human-app/frontend/src/modules/worker/jobs-discovery/hooks/index.ts deleted file mode 100644 index e3515417de..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/jobs-discovery/hooks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './use-oracles-table-columns'; diff --git a/packages/apps/human-app/frontend/src/modules/worker/jobs-discovery/jobs-discovery.page.tsx b/packages/apps/human-app/frontend/src/modules/worker/jobs-discovery/jobs-discovery.page.tsx index 64cf16fe06..6fcb56287a 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/jobs-discovery/jobs-discovery.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/jobs-discovery/jobs-discovery.page.tsx @@ -1,17 +1,9 @@ import { Paper, Stack } from '@mui/material'; -import { Navigate } from 'react-router-dom'; import { useIsMobile } from '@/shared/hooks/use-is-mobile'; -import { useWorkerIdentityVerificationStatus } from '@/modules/worker/profile/hooks'; -import { routerPaths } from '@/router/router-paths'; import { OraclesTableJobTypesSelect, OraclesTable } from './components'; export function JobsDiscoveryPage() { const isMobile = useIsMobile(); - const { isVerificationCompleted } = useWorkerIdentityVerificationStatus(); - - if (!isVerificationCompleted) { - return ; - } return ( diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/index.ts b/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/index.ts deleted file mode 100644 index bc7560332f..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './start-idv-btn'; -export * from './register-address-btn'; diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/register-address-btn.tsx b/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/register-address-btn.tsx index b610f0c2bc..21973a3fd7 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/register-address-btn.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/register-address-btn.tsx @@ -12,10 +12,11 @@ export function RegisterAddressBtn() { return ( diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/start-idv-btn.tsx b/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/start-idv-btn.tsx deleted file mode 100644 index 68f5ad06e9..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/components/buttons/start-idv-btn.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { t } from 'i18next'; -import { Button } from '@/shared/components/ui/button'; -import { useStartIdv } from '../../hooks'; - -export function StartIdvBtn() { - const { isIdvAlreadyInProgress, idvStartIsPending, startIdv } = useStartIdv(); - - if (isIdvAlreadyInProgress) { - return ( - - ); - } - - return ( - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/components/custom-text-field.tsx b/packages/apps/human-app/frontend/src/modules/worker/profile/components/custom-text-field.tsx deleted file mode 100644 index de9183c226..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/components/custom-text-field.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { colorPalette } from '@/shared/styles/color-palette'; -import { - darkColorPalette, - onlyDarkModeColor, -} from '@/shared/styles/dark-color-palette'; -import { styled, TextField } from '@mui/material'; - -const CustomTextField = styled(TextField)(() => ({ - '& .Mui-disabled': { - height: '48px', - maxWidth: '376px', - color: colorPalette.text.disabledSecondary, - WebkitTextFillColor: `${colorPalette.text.disabledSecondary} !important`, - }, - '& .MuiOutlinedInput-root': { - '& fieldset': { - border: '1px dashed', - borderColor: `${colorPalette.text.primary} !important`, - color: colorPalette.text.disabledSecondary, - WebkitTextFillColor: colorPalette.text.disabledSecondary, - }, - }, -})); - -const CustomTextFieldDark = styled(TextField)(() => ({ - '& .Mui-disabled': { - height: '48px', - maxWidth: '376px', - color: darkColorPalette.text.disabledSecondary, - WebkitTextFillColor: `${darkColorPalette.text.disabledSecondary} !important`, - }, - '& .MuiOutlinedInput-root': { - '& fieldset': { - border: '1px dashed', - borderColor: `${onlyDarkModeColor.mainColorWithOpacity} !important`, - color: darkColorPalette.text.disabledSecondary, - WebkitTextFillColor: darkColorPalette.text.disabledSecondary, - }, - }, -})); - -export { CustomTextField, CustomTextFieldDark }; diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/components/identity-verification-control.tsx b/packages/apps/human-app/frontend/src/modules/worker/profile/components/identity-verification-control.tsx index cd0463b88e..e60ad93829 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/components/identity-verification-control.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/profile/components/identity-verification-control.tsx @@ -1,37 +1,228 @@ -import { useTranslation } from 'react-i18next'; -import { Stack, Typography } from '@mui/material'; -import { Chip } from '@/shared/components/ui/chip'; -import { useWorkerIdentityVerificationStatus } from '../hooks'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useTranslation, Trans } from 'react-i18next'; +import { Box, keyframes, Link, Stack, Typography } from '@mui/material'; +import { jwtDecode } from 'jwt-decode'; + +import { useStartIdv } from '../hooks'; import { KycStatus } from '../types'; -import { StartIdvBtn } from './buttons'; +import { useColorMode } from '@/shared/contexts/color-mode'; +import { env } from '@/shared/env'; +import { HourglassIcon, VeriffIcon } from '@/shared/components/ui/icons'; +import { Button } from '@/shared/components/ui/button'; +import { useAccessTokenRefresh } from '@/api/hooks/use-access-token-refresh'; +import { browserAuthProvider } from '@/shared/contexts/browser-auth-provider'; +import { UserData } from '@/modules/auth/context/auth-context'; +import { useAuth } from '@/modules/auth/hooks/use-auth'; -const getChipColor = (status: KycStatus) => { - if (status === KycStatus.APPROVED) { - return 'success.main'; - } else if ( - [KycStatus.RESUBMISSION_REQUESTED, KycStatus.REVIEW].includes(status) - ) { - return 'warning.main'; +const hourglassSpin = keyframes` + 0% { + transform: rotate(0deg); + } + 45% { + transform: rotate(180deg); + } + 55% { + transform: rotate(180deg); + } + 100% { + transform: rotate(360deg); } - return 'error.main'; -}; +`; + +const CHECK_STATUS_COOLDOWN_TIME = 10000; + +export function IdentityVerificationControl({ + kycStatus, + onKycApproved, +}: { + kycStatus: KycStatus; + onKycApproved: () => void; +}) { + const [isCheckStatusCoolingDown, setIsCheckStatusCoolingDown] = + useState(false); + + const cooldownTimerRef = useRef(null); -export function IdentityVerificationControl() { const { t } = useTranslation(); - const { status } = useWorkerIdentityVerificationStatus(); + const { isIdvAlreadyInProgress, idvStarted, idvStartIsPending, startIdv } = + useStartIdv(); + const { refreshAccessTokenAsync, isRefreshingAccessToken } = + useAccessTokenRefresh(); + const { updateUserData } = useAuth(); + const { colorPalette } = useColorMode(); + + const handleCheckVerificationStatus = useCallback(async () => { + if (isRefreshingAccessToken || isCheckStatusCoolingDown) { + return; + } + + setIsCheckStatusCoolingDown(true); + cooldownTimerRef.current = setTimeout(() => { + setIsCheckStatusCoolingDown(false); + cooldownTimerRef.current = null; + }, CHECK_STATUS_COOLDOWN_TIME); - const label = t(`worker.profile.idvStatusValues.${status}`); + try { + await refreshAccessTokenAsync({ authType: 'web2' }); + const accessToken = browserAuthProvider.getAccessToken(); - if (status === KycStatus.NONE) { - return ; + if (!accessToken) { + return; + } + + const userData = jwtDecode(accessToken); + + if (!!userData.kyc_status && kycStatus !== userData.kyc_status) { + updateUserData(userData); + } + + if (userData.kyc_status === KycStatus.APPROVED) { + onKycApproved(); + } + } catch (error) { + console.error(error); + } + }, [ + onKycApproved, + refreshAccessTokenAsync, + updateUserData, + kycStatus, + isRefreshingAccessToken, + isCheckStatusCoolingDown, + ]); + + useEffect(() => { + return () => { + if (cooldownTimerRef.current) { + clearTimeout(cooldownTimerRef.current); + cooldownTimerRef.current = null; + } + }; + }, []); + + if (kycStatus === KycStatus.DECLINED) { + return ( + + , + }} + i18nKey="worker.profile.verificationDeclined" + /> + + ); + } + + if ( + (isIdvAlreadyInProgress || idvStarted) && + kycStatus !== KycStatus.RESUBMISSION_REQUESTED + ) { + return ( + <> + + + {t('worker.profile.verificationOpenedInNewTab')} + + + {t('worker.profile.completeYourVerification')} + + + + + + + {t('worker.profile.waitingForVerification')} + + + + + + + + ); } return ( - - - {t('worker.profile.identityVerificationStatus')} + + + {t('worker.profile.veriffCopy')} - + + + {t('worker.profile.poweredBy')} + + + + ); } diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/components/index.ts b/packages/apps/human-app/frontend/src/modules/worker/profile/components/index.ts index 7b2eadb361..48f2077003 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/components/index.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/profile/components/index.ts @@ -1,4 +1,3 @@ -export * from './wallet-connect-done'; export * from './profile-data'; export * from './identity-verification-control'; export * from './wallet-connection-control'; diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/components/wallet-connect-done.tsx b/packages/apps/human-app/frontend/src/modules/worker/profile/components/wallet-connect-done.tsx deleted file mode 100644 index f46d8592e1..0000000000 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/components/wallet-connect-done.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { IconButton, Stack, Tooltip, Typography } from '@mui/material'; -import { t } from 'i18next'; -import { useAuthenticatedUser } from '@/modules/auth/hooks/use-authenticated-user'; -import { useColorMode } from '@/shared/contexts/color-mode'; -import { useWalletConnect } from '@/shared/contexts/wallet-connect'; -import { Chip } from '@/shared/components/ui/chip'; -import { CopyIcon } from '@/shared/components/ui/icons'; -import { MouseEvent, useRef, useState } from 'react'; -import { shortenEscrowAddress } from '@/shared/helpers/evm'; -import { CustomTextField, CustomTextFieldDark } from './custom-text-field'; - -export function WalletConnectDone() { - const [isCopied, setIsCopied] = useState(false); - const timeoutRef = useRef(null); - const { isDarkMode } = useColorMode(); - const { address } = useWalletConnect(); - const { - user: { wallet_address }, - } = useAuthenticatedUser(); - - if (!wallet_address) { - return null; - } - - const shortAddress = shortenEscrowAddress(wallet_address, 6, 6); - - const handleCopyClick = (e: MouseEvent) => { - if (isCopied) return; - - e.stopPropagation(); - navigator.clipboard.writeText(wallet_address); - setIsCopied(true); - - if (timeoutRef.current) { - clearTimeout(timeoutRef.current); - } - - timeoutRef.current = setTimeout(() => { - setIsCopied(false); - }, 1500); - }; - - const textFiled = isDarkMode ? ( - - - - - - ), - }, - }} - /> - ) : ( - - - - - - ), - }, - }} - /> - ); - - return ( - - - - {t('worker.profile.wallet')} - - - - {address && !wallet_address ? null : textFiled} - - ); -} diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/components/wallet-connection-control.tsx b/packages/apps/human-app/frontend/src/modules/worker/profile/components/wallet-connection-control.tsx index 8188f76887..5f8cabf303 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/components/wallet-connection-control.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/profile/components/wallet-connection-control.tsx @@ -1,40 +1,36 @@ import { useTranslation } from 'react-i18next'; -import { Grid } from '@mui/material'; +import { Stack, Typography } from '@mui/material'; import { Button } from '@/shared/components/ui/button'; -import { useAuthenticatedUser } from '@/modules/auth/hooks/use-authenticated-user'; import { useWalletConnect } from '@/shared/contexts/wallet-connect'; -import { useWorkerIdentityVerificationStatus } from '../hooks'; -import { WalletConnectDone } from './wallet-connect-done'; -import { RegisterAddressBtn } from './buttons'; +import { RegisterAddressBtn } from './buttons/register-address-btn'; +import { useAuth } from '@/modules/auth/hooks/use-auth'; +import { useColorMode } from '@/shared/contexts/color-mode'; export function WalletConnectionControl() { const { t } = useTranslation(); - const { user } = useAuthenticatedUser(); - const { isVerificationCompleted } = useWorkerIdentityVerificationStatus(); + const { user } = useAuth(); const { isConnected, openModal } = useWalletConnect(); + const { colorPalette } = useColorMode(); - const { wallet_address: walletAddress } = user; - const hasWalletAddress = Boolean(walletAddress); + const hasWalletAddress = !!user?.wallet_address; - if (hasWalletAddress) { - return ; - } - - if (isVerificationCompleted && isConnected) { + if (isConnected && !hasWalletAddress) { return ( - + - {t('worker.profile.walletAddressMessage')} - + + {t('worker.profile.walletAddressMessage')} + + ); } return ( diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-start-idv-mutation.ts b/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-start-idv-mutation.ts index 55a9fed223..c64cb15770 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-start-idv-mutation.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-start-idv-mutation.ts @@ -1,12 +1,12 @@ import { useMutation } from '@tanstack/react-query'; -import { useAuthenticatedUser } from '@/modules/auth/hooks/use-authenticated-user'; import * as profileService from '../services/profile.service'; +import { useAuth } from '@/modules/auth/hooks/use-auth'; export function useIdvStartMutation() { - const { user } = useAuthenticatedUser(); + const { user } = useAuth(); return useMutation({ mutationFn: async () => profileService.startIdv(), - mutationKey: ['idvStart', user.email], + mutationKey: ['idvStart', user?.email], }); } diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-start-idv.ts b/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-start-idv.ts index ca9bc21805..ebb47a41d8 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-start-idv.ts +++ b/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-start-idv.ts @@ -38,7 +38,7 @@ export function useStartIdv() { } if (idvStarted && idvStartData.url) { - window.location.href = idvStartData.url; + window.open(idvStartData.url, '_blank', 'noopener,noreferrer'); } }, [ idvStartData?.url, @@ -50,6 +50,7 @@ export function useStartIdv() { return { isIdvAlreadyInProgress, + idvStarted, idvStartIsPending, startIdv, }; diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-worker-profile-status.tsx b/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-worker-profile-status.tsx index 8e355d2bed..332dfbe5a3 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-worker-profile-status.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/profile/hooks/use-worker-profile-status.tsx @@ -1,11 +1,11 @@ -import { useAuthenticatedUser } from '@/modules/auth/hooks/use-authenticated-user'; import { KycStatus, type WorkerItentityVerificationStatus } from '../types'; +import { useAuth } from '@/modules/auth/hooks/use-auth'; export function useWorkerIdentityVerificationStatus(): WorkerItentityVerificationStatus { - const { user } = useAuthenticatedUser(); + const { user } = useAuth(); return { - isVerificationCompleted: user.kyc_status === KycStatus.APPROVED, - status: user.kyc_status ?? KycStatus.NONE, + isVerificationCompleted: user?.kyc_status === KycStatus.APPROVED, + status: user?.kyc_status ?? KycStatus.NONE, }; } diff --git a/packages/apps/human-app/frontend/src/modules/worker/profile/views/profile.page.tsx b/packages/apps/human-app/frontend/src/modules/worker/profile/views/profile.page.tsx index 017aad13fa..8e3b0fcb21 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/profile/views/profile.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/profile/views/profile.page.tsx @@ -8,11 +8,7 @@ import { TopNotificationType, useNotification, } from '@/shared/hooks/use-notification'; -import { - ProfileData, - IdentityVerificationControl, - WalletConnectionControl, -} from '../components'; +import { ProfileData } from '../components'; export function WorkerProfilePage() { const { user } = useAuthenticatedUser(); @@ -61,8 +57,6 @@ export function WorkerProfilePage() { > - - ); diff --git a/packages/apps/human-app/frontend/src/modules/worker/reset-password/reset-password-success.page.tsx b/packages/apps/human-app/frontend/src/modules/worker/reset-password/reset-password-success.page.tsx index 77cca00e4b..4920cfc5dc 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/reset-password/reset-password-success.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/reset-password/reset-password-success.page.tsx @@ -19,7 +19,6 @@ export function ResetPasswordWorkerSuccessPage() { }, [signOut]); return ( ) : undefined } - cancelNavigation={routerPaths.worker.profile} - showBackButton={false} + backNavigation={routerPaths.worker.profile} title={t('worker.resetPassword.title')} > diff --git a/packages/apps/human-app/frontend/src/modules/worker/send-reset-link/send-reset-link.page.tsx b/packages/apps/human-app/frontend/src/modules/worker/send-reset-link/send-reset-link.page.tsx index c5a904db07..be9dab12e1 100644 --- a/packages/apps/human-app/frontend/src/modules/worker/send-reset-link/send-reset-link.page.tsx +++ b/packages/apps/human-app/frontend/src/modules/worker/send-reset-link/send-reset-link.page.tsx @@ -49,7 +49,7 @@ export function SendResetLinkWorkerPage() { ) : undefined } - cancelNavigation={routerPaths.worker.profile} + backNavigation={routerPaths.worker.profile} title={t('worker.sendResetLinkForm.title')} > diff --git a/packages/apps/human-app/frontend/src/router/components/drawer-menu-items/drawer-menu-items-operator.tsx b/packages/apps/human-app/frontend/src/router/components/drawer-menu-items/drawer-menu-items-operator.tsx index 0b12d28763..4f15723864 100644 --- a/packages/apps/human-app/frontend/src/router/components/drawer-menu-items/drawer-menu-items-operator.tsx +++ b/packages/apps/human-app/frontend/src/router/components/drawer-menu-items/drawer-menu-items-operator.tsx @@ -1,7 +1,7 @@ import { t } from 'i18next'; import { HelpIcon, UserOutlinedIcon } from '@/shared/components/ui/icons'; import { routerPaths } from '@/router/router-paths'; -import { DarkModeSwitch } from '@/shared/components/ui/dark-mode-switch'; +import { ColorModeSwitch } from '@/shared/components/ui/dark-mode-switch'; import { type MenuItem } from '../layout/protected'; export const operatorDrawerBottomMenuItems: MenuItem[] = [ @@ -21,5 +21,5 @@ export const operatorDrawerBottomMenuItems: MenuItem[] = [ } }, }, - , + , ]; diff --git a/packages/apps/human-app/frontend/src/router/components/drawer-menu-items/drawer-menu-items-worker.tsx b/packages/apps/human-app/frontend/src/router/components/drawer-menu-items/drawer-menu-items-worker.tsx index 427bba124b..5278ddb584 100644 --- a/packages/apps/human-app/frontend/src/router/components/drawer-menu-items/drawer-menu-items-worker.tsx +++ b/packages/apps/human-app/frontend/src/router/components/drawer-menu-items/drawer-menu-items-worker.tsx @@ -4,7 +4,7 @@ import { UserOutlinedIcon, WorkIcon, } from '@/shared/components/ui/icons'; -import { DarkModeSwitch } from '@/shared/components/ui/dark-mode-switch'; +import { ColorModeSwitch } from '@/shared/components/ui/dark-mode-switch'; import type { UserData } from '@/modules/auth/context/auth-context'; import { routerPaths } from '@/router/router-paths'; import { KycStatus } from '@/modules/worker/profile/types'; @@ -38,5 +38,5 @@ export const workerDrawerBottomMenuItems: MenuItem[] = [ } }, }, - , + , ]; diff --git a/packages/apps/human-app/frontend/src/router/components/footer.tsx b/packages/apps/human-app/frontend/src/router/components/footer.tsx index 116c060564..ce259c11c1 100644 --- a/packages/apps/human-app/frontend/src/router/components/footer.tsx +++ b/packages/apps/human-app/frontend/src/router/components/footer.tsx @@ -1,9 +1,7 @@ import { Grid, Link, Stack, Typography } from '@mui/material'; import { useTranslation } from 'react-i18next'; -import { useIsMobile } from '@/shared/hooks/use-is-mobile'; import { env } from '@/shared/env'; import { Chat } from '@/modules/homepage/components/chat'; -import { breakpoints } from '@/shared/styles/breakpoints'; import { useColorMode } from '@/shared/contexts/color-mode'; interface FooterProps { @@ -12,9 +10,10 @@ interface FooterProps { } export function Footer({ isProtected, displayChatIcon = true }: FooterProps) { - const { colorPalette } = useColorMode(); + const { colorPalette, isDarkMode } = useColorMode(); const { t } = useTranslation(); - const isMobile = useIsMobile('md'); + + const footerTextColor = isDarkMode ? 'rgba(255, 255, 255, 0.70)' : '#676767'; return ( - - {t('components.footer.privacyPolicy')} - + {t('components.footer.privacyPolicy')} - - {t('components.footer.termsOfService')} - + {t('components.footer.termsOfService')} - - {t('components.footer.humanProtocol')} - + {t('components.footer.humanProtocol')} - {isMobile ? ( - - {t('components.footer.copyrightNote')} - - ) : null} - {!isMobile ? ( - - {t('components.footer.copyrightNote')} - - ) : null} - - - + + {t('components.footer.copyrightNote')} + + ); } diff --git a/packages/apps/human-app/frontend/src/router/components/layout/protected/drawer-navigation.tsx b/packages/apps/human-app/frontend/src/router/components/layout/protected/drawer-navigation.tsx index 8dd0730b46..c199cc2d5a 100644 --- a/packages/apps/human-app/frontend/src/router/components/layout/protected/drawer-navigation.tsx +++ b/packages/apps/human-app/frontend/src/router/components/layout/protected/drawer-navigation.tsx @@ -38,7 +38,7 @@ export function DrawerNavigation({ topMenuItems, bottomMenuItems, signOut, -}: Readonly) { +}: DrawerNavigationProps) { const navigate = useNavigate(); const isMobile = useIsMobile(); const handleMainNavIconClick = useHandleMainNavIconClick(); @@ -87,9 +87,7 @@ export function DrawerNavigation({ {!isMobile && ( { - handleMainNavIconClick(); - }} + onClick={handleMainNavIconClick} > diff --git a/packages/apps/human-app/frontend/src/router/components/layout/protected/layout.tsx b/packages/apps/human-app/frontend/src/router/components/layout/protected/layout.tsx index 2659f5304b..2f3de9ad7c 100644 --- a/packages/apps/human-app/frontend/src/router/components/layout/protected/layout.tsx +++ b/packages/apps/human-app/frontend/src/router/components/layout/protected/layout.tsx @@ -3,13 +3,13 @@ import type { Dispatch, ReactElement, SetStateAction } from 'react'; import { useEffect, useRef, useState } from 'react'; import { Outlet } from 'react-router-dom'; import { useIsMobile } from '@/shared/hooks/use-is-mobile'; -import { useBackgroundContext } from '@/shared/contexts/background'; import { breakpoints } from '@/shared/styles/breakpoints'; import { useIsHCaptchaLabelingPage } from '@/shared/hooks/use-is-hcaptcha-labeling-page'; import { GovernanceBanner } from '@/modules/governance-banner/components/governance-banner'; import { Footer } from '../../footer'; import { Navbar } from './navbar'; import { type PageHeaderProps, PageHeader } from './page-header'; +import { useColorMode } from '@/shared/contexts/color-mode/use-color-mode'; const Main = styled('main', { shouldForwardProp: (prop) => prop !== 'open' && prop !== 'isMobile', @@ -52,7 +52,7 @@ export function ProtectedLayout({ const isMobile = useIsMobile(); const [drawerOpen, setDrawerOpen] = useState(!isMobile); const [hcaptchaDrawerOpen, setHcaptchaDrawerOpen] = useState(false); - const { backgroundColor, setGrayBackground } = useBackgroundContext(); + const { colorPalette } = useColorMode(); const toggleUserStatsDrawer = isHCaptchaLabelingPage ? () => { setHcaptchaDrawerOpen((state) => !state); @@ -69,14 +69,9 @@ export function ProtectedLayout({ } }, [isMobile]); - useEffect(() => { - setGrayBackground(); - }, [setGrayBackground]); - return ( ) { +}: NavbarProps) { const handleMainNavIconClick = useHandleMainNavIconClick(); const { colorPalette } = useColorMode(); const isMobile = useIsMobile(); @@ -67,32 +67,35 @@ export function Navbar({ component="header" direction="row" sx={{ + display: { xs: 'flex', md: 'none' }, alignItems: 'center', justifyContent: 'space-between', backgroundColor: colorPalette.backgroundColor, - display: { xs: 'flex', md: 'none' }, width: '100%', - px: isMobile ? 4 : 0, - py: isMobile ? 3 : 0, + px: 2, + py: 3, zIndex: '130', position: open ? 'sticky' : 'relative', top: open ? '0' : 'unset', }} > - { if (isMobile) { setOpen(false); } handleMainNavIconClick(); }} - role="button" - tabIndex={0} - aria-hidden="true" > - - + + ) { +export function UnprotectedLayout() { const { colorPalette, isDarkMode } = useColorMode(); - const { isMainPage } = useHomePageState(); + const isMainPage = useIsMainPage(); - const isMobile = useIsMobile(); const layoutBackgroundColor = (() => { - if (isDarkMode || isMobile || isMainPage) { + if (isDarkMode || isMainPage) { return colorPalette.backgroundColor; } @@ -31,27 +22,26 @@ export function UnprotectedLayout({ sx={{ alignItems: 'center', flexWrap: 'nowrap', - height: '100%', - minHeight: '100vh', + height: { xs: '100%', md: '100dvh' }, + minHeight: { xs: '100vh', md: 0 }, width: '100%', pt: 0, - px: isMobile ? 0 : '120px', + px: { xs: 0, md: 15 }, backgroundColor: layoutBackgroundColor, }} > - + diff --git a/packages/apps/human-app/frontend/src/router/components/layout/unprotected/navbar.tsx b/packages/apps/human-app/frontend/src/router/components/layout/unprotected/navbar.tsx index 3f1f16376c..ccf77005c9 100644 --- a/packages/apps/human-app/frontend/src/router/components/layout/unprotected/navbar.tsx +++ b/packages/apps/human-app/frontend/src/router/components/layout/unprotected/navbar.tsx @@ -1,153 +1,82 @@ -import { useState } from 'react'; -import { Box, Drawer, Grid, IconButton } from '@mui/material'; +import { Box, Container } from '@mui/material'; import { useTranslation } from 'react-i18next'; -import MenuIcon from '@mui/icons-material/Menu'; import { Link } from 'react-router-dom'; -import { - HumanLogoIcon, - HumanLogoNavbarIcon, -} from '@/shared/components/ui/icons'; -import { useIsMobile } from '@/shared/hooks/use-is-mobile'; +import { HumanLogoNavbarIcon } from '@/shared/components/ui/icons'; import { Button } from '@/shared/components/ui/button'; -import { breakpoints } from '@/shared/styles/breakpoints'; import { env } from '@/shared/env'; -import { DarkModeSwitch } from '@/shared/components/ui/dark-mode-switch'; +import { ColorModeSwitch } from '@/shared/components/ui/dark-mode-switch'; import { useHandleMainNavIconClick } from '@/shared/hooks/use-handle-main-nav-icon-click'; -import { useHomePageState } from '@/shared/contexts/homepage-state'; +import { useIsMainPage } from '@/router/hooks/use-is-main-page'; -interface NavbarProps { - withNavigation: boolean; -} - -export function Navbar({ withNavigation }: Readonly) { - const { isMainPage } = useHomePageState(); +export function Navbar() { const { t } = useTranslation(); - const [isDrawerOpen, setIsDrawerOpen] = useState(false); - const isMobile = useIsMobile(); const handleMainNavIconClick = useHandleMainNavIconClick(); + const isMainPage = useIsMainPage(); return ( - - { - handleMainNavIconClick(); + + - {withNavigation ? ( - + {t('components.navbar.humanProtocol')} + +
- -
-
- -
- - - ) : null} - - - { - setIsDrawerOpen(!isDrawerOpen); - }} - > - - - { - setIsDrawerOpen(false); - }} - open={isDrawerOpen} - > - - - - - - - + {t('components.navbar.howItWorks')} + - ) : null} - + + + ); } diff --git a/packages/apps/human-app/frontend/src/router/components/layout/unprotected/use-mobile-layout-background.ts b/packages/apps/human-app/frontend/src/router/components/layout/unprotected/use-mobile-layout-background.ts new file mode 100644 index 0000000000..6ef12dfc65 --- /dev/null +++ b/packages/apps/human-app/frontend/src/router/components/layout/unprotected/use-mobile-layout-background.ts @@ -0,0 +1,32 @@ +import { useLocation } from 'react-router-dom'; +import signupBackground from '@/assets/background-images/signup-background-mobile.png'; +import signinBackground from '@/assets/background-images/signin-background-mobile.png'; +import { routerPaths } from '@/router/router-paths'; + +const signupRoutes = [ + routerPaths.worker.signUp, + routerPaths.worker.emailVerification, + routerPaths.worker.verifyEmail, +] as string[]; + +const signinRoutes = [ + routerPaths.worker.signIn, + routerPaths.worker.sendResetLink, + routerPaths.worker.resetPassword, + routerPaths.worker.sendResetLinkSuccess, + routerPaths.worker.resetPasswordSuccess, +] as string[]; + +export function useMobileLayoutBackground() { + const { pathname } = useLocation(); + + if (signupRoutes.includes(pathname)) { + return signupBackground; + } + + if (signinRoutes.includes(pathname)) { + return signinBackground; + } + + return undefined; +} diff --git a/packages/apps/human-app/frontend/src/router/hooks/use-is-main-page.ts b/packages/apps/human-app/frontend/src/router/hooks/use-is-main-page.ts new file mode 100644 index 0000000000..4f3d188fa4 --- /dev/null +++ b/packages/apps/human-app/frontend/src/router/hooks/use-is-main-page.ts @@ -0,0 +1,8 @@ +import { useLocation } from 'react-router-dom'; +import { routerPaths } from '../router-paths'; + +export function useIsMainPage() { + const location = useLocation(); + + return location.pathname === routerPaths.homePage; +} diff --git a/packages/apps/human-app/frontend/src/shared/components/data-entry/input.tsx b/packages/apps/human-app/frontend/src/shared/components/data-entry/input.tsx index 0cab598fd8..3ae76177f2 100644 --- a/packages/apps/human-app/frontend/src/shared/components/data-entry/input.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/data-entry/input.tsx @@ -32,7 +32,7 @@ export function Input({ {...field} variant="outlined" autoComplete={autoComplete ?? name} - error={Boolean(fieldState.error)} + error={!!fieldState.error} fullWidth helperText={ { setShowPassword((show) => !show); }; @@ -34,9 +34,9 @@ export function Password(props: PasswordProps) { onMouseDown={handleMouseDownPassword} > {showPassword ? ( - + ) : ( - + )} diff --git a/packages/apps/human-app/frontend/src/shared/components/data-entry/slider.tsx b/packages/apps/human-app/frontend/src/shared/components/data-entry/slider.tsx deleted file mode 100644 index 85214b362f..0000000000 --- a/packages/apps/human-app/frontend/src/shared/components/data-entry/slider.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { Controller } from 'react-hook-form'; -import type { SliderProps } from '@mui/material/Slider'; -import SliderMui from '@mui/material/Slider'; -import type { ReactNode } from 'react'; - -interface InputProps extends Omit { - max: number; - min: number; - step?: number; - name: string; - customMarks?: ReactNode; -} - -export function Slider({ - name, - max, - min, - step, - customMarks, - ...rest -}: InputProps) { - return ( - ( - <> - - {customMarks ? customMarks : null} - - )} - /> - ); -} diff --git a/packages/apps/human-app/frontend/src/shared/components/hcaptcha/h-captcha.tsx b/packages/apps/human-app/frontend/src/shared/components/hcaptcha/h-captcha.tsx index 1bcd5e3b4c..f548c4c862 100644 --- a/packages/apps/human-app/frontend/src/shared/components/hcaptcha/h-captcha.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/hcaptcha/h-captcha.tsx @@ -1,7 +1,6 @@ import { forwardRef, useImperativeHandle, useRef } from 'react'; import HCaptcha from '@hcaptcha/react-hcaptcha'; import { env } from '@/shared/env'; -import { useColorMode } from '@/shared/contexts/color-mode'; export interface CustomHCaptchaRef { reset: () => void; @@ -15,7 +14,6 @@ function InternalHCaptcha( { onVerify }: CustomHCaptchaProps, ref: React.Ref ) { - const { isDarkMode } = useColorMode(); const captchaRef = useRef(null); useImperativeHandle(ref, () => ({ @@ -33,7 +31,7 @@ function InternalHCaptcha( }} ref={captchaRef} sitekey={env.VITE_H_CAPTCHA_SITE_KEY} - theme={isDarkMode ? 'dark' : 'light'} + theme="contrast" /> ); } diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/alert.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/alert.tsx index 12d26491a1..452c468e7b 100644 --- a/packages/apps/human-app/frontend/src/shared/components/ui/alert.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/ui/alert.tsx @@ -1,9 +1,11 @@ import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import WarningIcon from '@mui/icons-material/Warning'; import ErrorIcon from '@mui/icons-material/Error'; -import MuiAlert from '@mui/material/Alert'; -import type { AlertProps as MuiAlertProps } from '@mui/material/Alert'; -import { Typography } from '@mui/material'; +import { + Alert as MuiAlert, + type AlertProps as MuiAlertProps, + Typography, +} from '@mui/material'; import { useColorMode } from '@/shared/contexts/color-mode'; import { darkColorPalette } from '@/shared/styles/dark-color-palette'; diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/chip.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/chip.tsx index 9289815451..876c5f4f97 100644 --- a/packages/apps/human-app/frontend/src/shared/components/ui/chip.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/ui/chip.tsx @@ -19,6 +19,7 @@ export function Chip({ label, backgroundColor }: Readonly) { py: '2px', borderRadius: '16px', display: 'flex', + flexShrink: 0, wordBreak: 'break-word', }} > diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/dark-mode-switch.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/dark-mode-switch.tsx index 6e41830d90..ad81c04d3f 100644 --- a/packages/apps/human-app/frontend/src/shared/components/ui/dark-mode-switch.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/ui/dark-mode-switch.tsx @@ -1,27 +1,53 @@ -import { Grid, Switch } from '@mui/material'; +import { Box, IconButton } from '@mui/material'; import { MoonIcon, SunIcon } from '@/shared/components/ui/icons'; import { useColorMode } from '@/shared/contexts/color-mode'; -export function DarkModeSwitch() { - const { switchMode, isDarkMode } = useColorMode(); +export function ColorModeSwitch() { + const { switchMode, colorPalette, isDarkMode } = useColorMode(); + return ( - - - { - switchMode(); + { + if (isDarkMode) switchMode(); + }} + > + + + { + if (!isDarkMode) switchMode(); }} - /> - - + > + + + ); } diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/icons.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/icons.tsx index f58d0b3cba..19802a6512 100644 --- a/packages/apps/human-app/frontend/src/shared/components/ui/icons.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/ui/icons.tsx @@ -1,12 +1,7 @@ -import HomepageLogoIconLight from '@/assets/icons/icons-homepage/logo.svg'; -import HomepageLogoIconDark from '@/assets/icons-dark-mode/icons-homepage/logo.svg'; -import HomepageUserIconLight from '@/assets/icons/icons-homepage/user.svg'; -import HomepageUserIconDark from '@/assets/icons-dark-mode/icons-homepage/user.svg'; -import HomepageWorkIconLight from '@/assets/icons/icons-homepage/work.svg'; -import HomepageWorkIconDark from '@/assets/icons-dark-mode/icons-homepage/work.svg'; +import { SvgIcon, SvgIconProps } from '@mui/material'; + import HumanLogoIconLight from '@/assets/icons/icons-human-logo/human-logo.svg'; import HumanLogoIconDark from '@/assets/icons-dark-mode/icons-human-logo/human-logo.svg'; -import ChatIcon from '@/assets/icons/chat.svg'; import HandIconLight from '@/assets/icons/hand.svg'; import HandIconDark from '@/assets/icons-dark-mode/hand.svg'; import RefreshIconLight from '@/assets/icons/refresh.svg'; @@ -30,8 +25,6 @@ import SortArrowLight from '@/assets/icons/sort-arrow.svg'; import SortArrowDark from '@/assets/icons-dark-mode/sort-arrow.svg'; import FiltersIconLight from '@/assets/icons/filters-icon.svg'; import FiltersIconDark from '@/assets/icons-dark-mode/filters-icon.svg'; -import MobileHomeIconsLight from '@/assets/icons/icons-homepage/mobile-home-icons.svg'; -import MobileHomeIconsDark from '@/assets/icons-dark-mode/icons-homepage/mobile-home-icons.svg'; import SunIconDark from '@/assets/icons-dark-mode/sun.svg'; import SunIconLight from '@/assets/icons/sun.svg'; import MoonIconDark from '@/assets/icons-dark-mode/moon.svg'; @@ -45,23 +38,11 @@ import EditIconLight from '@/assets/icons/edit-icon.svg'; import EditIconDark from '@/assets/icons-dark-mode/edit-icon.svg'; import DeleteIconLight from '@/assets/icons/delete-icon.svg'; import DeleteIconDark from '@/assets/icons-dark-mode/delete-icon.svg'; +import VeriffIconLight from '@/assets/icons/veriff.svg'; +import VeriffIconDark from '@/assets/icons-dark-mode/veriff.svg'; +import HourglassIconLight from '@/assets/icons/hourglass.svg'; +import HourglassIconDark from '@/assets/icons-dark-mode/hourglass.svg'; -function HomepageLogoIcon() { - const { isDarkMode } = useColorMode(); - return isDarkMode ? : ; -} -function HomepageUserIcon() { - const { isDarkMode } = useColorMode(); - return isDarkMode ? : ; -} -function HomepageWorkIcon() { - const { isDarkMode } = useColorMode(); - return isDarkMode ? : ; -} -function MobileHomeIcons() { - const { isDarkMode } = useColorMode(); - return isDarkMode ? : ; -} function HumanLogoIcon() { const { isDarkMode } = useColorMode(); return isDarkMode ? : ; @@ -142,15 +123,71 @@ function DeleteIcon() { const { isDarkMode } = useColorMode(); return isDarkMode ? : ; } +function InboxIcon(props: SvgIconProps) { + return ( + + + + + + + ); +} + +function SuccessIcon(props: SvgIconProps) { + return ( + + + + + + ); +} + +function VeriffIcon() { + const { isDarkMode } = useColorMode(); + return isDarkMode ? : ; +} + +function HourglassIcon() { + const { isDarkMode } = useColorMode(); + return isDarkMode ? : ; +} export { - HomepageLogoIcon, - HomepageUserIcon, - HomepageWorkIcon, - MobileHomeIcons, HumanLogoIcon, HumanLogoNavbarIcon, - ChatIcon, HandIcon, RefreshIcon, InverseRefreshIcon, @@ -169,4 +206,8 @@ export { CopyIcon, EditIcon, DeleteIcon, + InboxIcon, + SuccessIcon, + VeriffIcon, + HourglassIcon, }; diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/loader.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/loader.tsx index 1c32b0f261..2c8b220c56 100644 --- a/packages/apps/human-app/frontend/src/shared/components/ui/loader.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/ui/loader.tsx @@ -10,7 +10,7 @@ export function Loader({ ...props }: CircularProgressProps) { {...props} sx={{ '.MuiCircularProgress-circle': { - color: colorPalette.primary.main, + color: colorPalette.accent.main, }, }} /> diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/page-card/back-button.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/page-card/back-button.tsx new file mode 100644 index 0000000000..b62edd931e --- /dev/null +++ b/packages/apps/human-app/frontend/src/shared/components/ui/page-card/back-button.tsx @@ -0,0 +1,30 @@ +import { IconButton } from '@mui/material'; +import ArrowBackIcon from '@mui/icons-material/ArrowBack'; +import { useColorMode } from '@/shared/contexts/color-mode'; + +export function BackButton({ onClick }: { onClick: () => void }) { + const { isDarkMode, colorPalette } = useColorMode(); + + return ( + + + + ); +} diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card-error.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card-error.tsx index c86e5e6d71..0c38cc4720 100644 --- a/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card-error.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card-error.tsx @@ -1,4 +1,4 @@ -import { Grid } from '@mui/material'; +import { Grid, Stack } from '@mui/material'; import { useNavigate } from 'react-router-dom'; import { t } from 'i18next'; import { Button } from '@/shared/components/ui/button'; @@ -11,7 +11,7 @@ import { type ErrorMessageProps } from './types'; export function PageCardError({ errorMessage, cardMaxWidth = '100%', -}: Readonly) { +}: ErrorMessageProps) { const { isDarkMode } = useColorMode(); const navigate = useNavigate(); @@ -24,26 +24,31 @@ export function PageCardError({ : commonStyleForTheme; return ( - + {errorMessage} - - + + + + ); } diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card-loader.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card-loader.tsx index fc13e4a9f0..578fa382bc 100644 --- a/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card-loader.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card-loader.tsx @@ -1,11 +1,15 @@ import { Grid } from '@mui/material'; + import { Loader } from '@/shared/components/ui/loader'; import { useColorMode } from '@/shared/contexts/color-mode'; +import { useIsMobile } from '@/shared/hooks'; + import { commonDarkPageCardStyles, commonPageCardStyles } from './styles'; import { type CommonProps } from './types'; export function PageCardLoader({ cardMaxWidth = '100%' }: CommonProps) { const { isDarkMode } = useColorMode(); + const isMobile = useIsMobile(); const commonStyleForTheme = isDarkMode ? commonDarkPageCardStyles @@ -20,7 +24,7 @@ export function PageCardLoader({ cardMaxWidth = '100%' }: CommonProps) { return ( - + ); } diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card.tsx index a1abcd6eaf..8d6bd44b34 100644 --- a/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card.tsx +++ b/packages/apps/human-app/frontend/src/shared/components/ui/page-card/page-card.tsx @@ -1,28 +1,8 @@ -import { Grid, Typography, styled } from '@mui/material'; -import ArrowBackIcon from '@mui/icons-material/ArrowBack'; +import { Grid, Typography } from '@mui/material'; import { useNavigate } from 'react-router-dom'; -import { t } from 'i18next'; -import { Button } from '@/shared/components/ui/button'; -import { breakpoints } from '@/shared/styles/breakpoints'; -import { routerPaths } from '@/router/router-paths'; -import { onlyDarkModeColor } from '@/shared/styles/dark-color-palette'; import { useColorMode } from '@/shared/contexts/color-mode'; -import { useIsMobile } from '@/shared/hooks/use-is-mobile'; import { commonDarkPageCardStyles, commonPageCardStyles } from './styles'; - -const IconWrapper = styled('div')(() => ({ - width: '40px', - height: '40px', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - borderRadius: '50%', - cursor: 'pointer', - ':hover': { - cursor: 'pointer', - }, - fontSize: '26px', -})); +import { BackButton } from './back-button'; type NavigationTarget = string | (() => void); @@ -33,8 +13,6 @@ interface PageCardProps { title?: React.JSX.Element | string; alert?: React.JSX.Element; backNavigation?: NavigationTarget; - cancelNavigation?: NavigationTarget; - showCancelButton?: boolean; showBackButton?: boolean; loader?: boolean; } @@ -46,20 +24,14 @@ export function PageCard({ backNavigation, maxContentWidth = '376px', childrenMaxWidth = '486px', - cancelNavigation = routerPaths.homePage, - showCancelButton = true, showBackButton = true, }: PageCardProps) { - const { isDarkMode, colorPalette } = useColorMode(); + const { isDarkMode } = useColorMode(); const navigate = useNavigate(); - const isMobile = useIsMobile('md'); const contentStyles = { - maxWidth: maxContentWidth, + maxWidth: { xs: 'unset', md: maxContentWidth }, width: '100%', - [breakpoints.mobile]: { - maxWidth: 'unset', - }, }; const goBack = (navigationTarget: NavigationTarget | undefined) => { @@ -78,48 +50,23 @@ export function PageCard({ goBack(backNavigation); }; - const handleCancelButton = () => { - goBack(cancelNavigation); - }; - return ( - {showCancelButton && ( - - - - )} - {showBackButton && ( - - - - )} - {showCancelButton && ( - - )} + {showBackButton && } {alert && <>{alert}} @@ -181,28 +101,13 @@ export function PageCard({ - {showBackButton && ( - - - - )} + {showBackButton && } diff --git a/packages/apps/human-app/frontend/src/shared/components/ui/success-label.tsx b/packages/apps/human-app/frontend/src/shared/components/ui/success-label.tsx deleted file mode 100644 index a7646b7de5..0000000000 --- a/packages/apps/human-app/frontend/src/shared/components/ui/success-label.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import Grid from '@mui/material/Grid'; -import CheckCircleIcon from '@mui/icons-material/CheckCircle'; -import { useColorMode } from '@/shared/contexts/color-mode'; - -export function SuccessLabel({ children }: { children: string }) { - const { colorPalette } = useColorMode(); - - return ( - - {children} - - - ); -} diff --git a/packages/apps/human-app/frontend/src/shared/contexts/background/background.tsx b/packages/apps/human-app/frontend/src/shared/contexts/background/background.tsx deleted file mode 100644 index 321fa666f6..0000000000 --- a/packages/apps/human-app/frontend/src/shared/contexts/background/background.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import type { ReactNode } from 'react'; -import { - createContext, - useCallback, - useEffect, - useMemo, - useState, -} from 'react'; -import type { ColorPalette } from '@/shared/styles/color-palette'; - -export interface BackgroundContextProps { - backgroundColor: string; - setWhiteBackground: () => void; - setGrayBackground: () => void; -} - -export const BackgroundContext = createContext< - BackgroundContextProps | undefined ->(undefined); - -interface BackgroundProviderProps { - children: ReactNode; - colorPalette: ColorPalette; - isDarkMode: boolean; -} - -export function BackgroundProvider({ - children, - colorPalette, - isDarkMode, -}: Readonly) { - const [backgroundColor, setBackgroundColor] = useState( - colorPalette.white - ); - - const isGrayBackground = (() => { - if (isDarkMode) { - return backgroundColor === colorPalette.backgroundColor; - } - - return backgroundColor === colorPalette.paper.main; - })(); - - const setWhiteBackground = useCallback(() => { - setBackgroundColor(colorPalette.white); - }, [colorPalette.white]); - - const setGrayBackground = useCallback(() => { - if (isDarkMode) { - setBackgroundColor(colorPalette.backgroundColor); - } else { - setBackgroundColor(colorPalette.paper.main); - } - }, [isDarkMode, colorPalette.backgroundColor, colorPalette.paper.main]); - - const setGrayBackgroundInternal = useCallback( - (_isDarkMode: boolean) => { - if (isDarkMode) { - setBackgroundColor(colorPalette.backgroundColor); - } else { - setBackgroundColor(colorPalette.paper.main); - } - }, - [colorPalette.backgroundColor, colorPalette.paper.main, isDarkMode] - ); - - useEffect(() => { - if (isGrayBackground) { - setGrayBackgroundInternal(isDarkMode); - } - }, [ - isGrayBackground, - setWhiteBackground, - isDarkMode, - setGrayBackgroundInternal, - ]); - - const contextValue = useMemo( - () => ({ backgroundColor, setWhiteBackground, setGrayBackground }), - [backgroundColor, setWhiteBackground, setGrayBackground] - ); - - return ( - - {children} - - ); -} diff --git a/packages/apps/human-app/frontend/src/shared/contexts/background/index.ts b/packages/apps/human-app/frontend/src/shared/contexts/background/index.ts deleted file mode 100644 index 3c17b2c9ef..0000000000 --- a/packages/apps/human-app/frontend/src/shared/contexts/background/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './background'; -export * from './use-background-context'; diff --git a/packages/apps/human-app/frontend/src/shared/contexts/background/use-background-context.tsx b/packages/apps/human-app/frontend/src/shared/contexts/background/use-background-context.tsx deleted file mode 100644 index 1fb0d4db2e..0000000000 --- a/packages/apps/human-app/frontend/src/shared/contexts/background/use-background-context.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useContext } from 'react'; -import { BackgroundContext, type BackgroundContextProps } from './background'; - -export const useBackgroundContext = (): BackgroundContextProps => { - const context = useContext(BackgroundContext); - if (!context) { - throw new Error( - 'useBackgroundContext must be used within a BackgroundProvider' - ); - } - return context; -}; diff --git a/packages/apps/human-app/frontend/src/shared/contexts/color-mode/color-mode-settings.ts b/packages/apps/human-app/frontend/src/shared/contexts/color-mode/color-mode-settings.ts index 2e8b2c9134..aab57fbd6a 100644 --- a/packages/apps/human-app/frontend/src/shared/contexts/color-mode/color-mode-settings.ts +++ b/packages/apps/human-app/frontend/src/shared/contexts/color-mode/color-mode-settings.ts @@ -11,10 +11,7 @@ export const saveColorMode = (mode: ColorMode) => { export const isDarkColorMode = () => { const mode = localStorage.getItem(MODE_LOCAL_STORAGE_KEY); - if (mode === ColorMode.DARK) { - return true; - } - return false; + return mode === ColorMode.DARK; }; export const hasColorMode = () => { diff --git a/packages/apps/human-app/frontend/src/shared/contexts/color-mode/color-mode.tsx b/packages/apps/human-app/frontend/src/shared/contexts/color-mode/color-mode.tsx index faeb22e8f1..3e8bba7636 100644 --- a/packages/apps/human-app/frontend/src/shared/contexts/color-mode/color-mode.tsx +++ b/packages/apps/human-app/frontend/src/shared/contexts/color-mode/color-mode.tsx @@ -7,7 +7,6 @@ import { useCallback, } from 'react'; import { ThemeProvider, createTheme } from '@mui/material'; -import { BackgroundProvider } from '@/shared/contexts/background'; import { theme } from '@/shared/styles/theme'; import { colorPalette as defaultColorPalette } from '@/shared/styles/color-palette'; import { darkTheme } from '@/shared/styles/dark-theme'; @@ -34,9 +33,7 @@ interface ColorModeProviderProps { children: ReactNode; } -export function ColorModeProvider({ - children, -}: Readonly) { +export function ColorModeProvider({ children }: ColorModeProviderProps) { const [isDarkMode, setIsDarkMode] = useState(isDarkColorMode()); const handleColorSchemePrefsChange = (prefersDarkScheme: boolean) => { @@ -85,9 +82,7 @@ export function ColorModeProvider({ return ( - - {children} - + {children} ); diff --git a/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/homepage-state.tsx b/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/homepage-state.tsx deleted file mode 100644 index 7b5f0cabba..0000000000 --- a/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/homepage-state.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React, { createContext, useMemo, useState } from 'react'; -import { useLocation } from 'react-router-dom'; -import { routerPaths } from '@/router/router-paths'; - -type HomePageStateType = 'welcome' | 'chooseSignUpAccountType'; - -interface HomePageStageContextProps { - pageView: HomePageStateType; - setPageView: (step: HomePageStateType) => void; - isMainPage: boolean; -} - -export const HomePageStateContext = - createContext(null); - -export function HomePageStateProvider({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - const [pageView, setPageView] = useState('welcome'); - - const location = useLocation(); - const isMainPage = - location.pathname === routerPaths.homePage && pageView === 'welcome'; - - const contextValue = useMemo( - () => ({ pageView, setPageView, isMainPage }), - [pageView, setPageView, isMainPage] - ); - - return ( - - {children} - - ); -} diff --git a/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/index.ts b/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/index.ts deleted file mode 100644 index 781cb6bd33..0000000000 --- a/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './homepage-state'; -export * from './use-homepage-state'; diff --git a/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/use-homepage-state.tsx b/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/use-homepage-state.tsx deleted file mode 100644 index c228db521f..0000000000 --- a/packages/apps/human-app/frontend/src/shared/contexts/homepage-state/use-homepage-state.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useContext } from 'react'; -import { HomePageStateContext } from './homepage-state'; - -export const useHomePageState = () => { - const context = useContext(HomePageStateContext); - if (!context) { - throw new Error( - 'useHomePageState must be used within a HomePageStageProvider' - ); - } - return context; -}; diff --git a/packages/apps/human-app/frontend/src/shared/hooks/use-handle-main-nav-icon-click.tsx b/packages/apps/human-app/frontend/src/shared/hooks/use-handle-main-nav-icon-click.tsx index d3577d378d..27dfb3b2cc 100644 --- a/packages/apps/human-app/frontend/src/shared/hooks/use-handle-main-nav-icon-click.tsx +++ b/packages/apps/human-app/frontend/src/shared/hooks/use-handle-main-nav-icon-click.tsx @@ -1,11 +1,9 @@ import { useNavigate } from 'react-router-dom'; import { routerPaths } from '@/router/router-paths'; -import { useHomePageState } from '../contexts/homepage-state/use-homepage-state'; import { browserAuthProvider } from '../contexts/browser-auth-provider'; export const useHandleMainNavIconClick = () => { const navigate = useNavigate(); - const { setPageView } = useHomePageState(); const handleIconClick = () => { const type = browserAuthProvider.getAuthType(); @@ -21,7 +19,6 @@ export const useHandleMainNavIconClick = () => { return; } - setPageView('welcome'); navigate(routerPaths.homePage); }; diff --git a/packages/apps/human-app/frontend/src/shared/hooks/use-notification.tsx b/packages/apps/human-app/frontend/src/shared/hooks/use-notification.tsx index a3e465c621..af58faf423 100644 --- a/packages/apps/human-app/frontend/src/shared/hooks/use-notification.tsx +++ b/packages/apps/human-app/frontend/src/shared/hooks/use-notification.tsx @@ -1,11 +1,13 @@ import { useCallback } from 'react'; import { type SnackbarKey, useSnackbar } from 'notistack'; import CloseIcon from '@mui/icons-material/Close'; -import { useColorMode } from '@/shared/contexts/color-mode'; -import { colorPalette as lightColorPalette } from '@/shared/styles/color-palette'; + +import { ColorPalette } from '@/shared/styles/color-palette'; +import { useColorMode } from '../contexts/color-mode'; export enum TopNotificationType { SUCCESS = 'success', + ERROR = 'error', WARNING = 'warning', } @@ -16,11 +18,26 @@ export interface ShowNotifProps { } const AUTO_HIDE_NOTIFICATION_MS = 6000; -const FONT_COLOR = lightColorPalette.white; + +const mapTopNotificationTypeToColor = ( + type: TopNotificationType, + colorPalette: ColorPalette +) => { + switch (type) { + case TopNotificationType.SUCCESS: + return colorPalette.success.main; + case TopNotificationType.WARNING: + return colorPalette.secondary.main; + case TopNotificationType.ERROR: + return '#FF6262'; + default: + return colorPalette.secondary.main; + } +}; export const useNotification = () => { - const { colorPalette } = useColorMode(); const { enqueueSnackbar, closeSnackbar } = useSnackbar(); + const { colorPalette } = useColorMode(); const action = useCallback( (snackbarId: SnackbarKey) => ( @@ -55,11 +72,8 @@ export const useNotification = () => { flexWrap: 'nowrap', width: '100%', maxWidth: '100%', - backgroundColor: - type === TopNotificationType.SUCCESS - ? colorPalette.success.main - : colorPalette.secondary.main, - color: FONT_COLOR, + backgroundColor: mapTopNotificationTypeToColor(type, colorPalette), + color: colorPalette.white, fontSize: 14, fontWeight: 600, letterSpacing: 0.1, @@ -67,7 +81,7 @@ export const useNotification = () => { action, }); }, - [enqueueSnackbar, colorPalette, action] + [enqueueSnackbar, action, colorPalette] ); return { showNotification }; diff --git a/packages/apps/human-app/frontend/src/shared/i18n/en.json b/packages/apps/human-app/frontend/src/shared/i18n/en.json index 127b9c1d4e..956dc6962b 100644 --- a/packages/apps/human-app/frontend/src/shared/i18n/en.json +++ b/packages/apps/human-app/frontend/src/shared/i18n/en.json @@ -5,7 +5,6 @@ "percentSuffix": "%", "plusPrefix": "+" }, - "dashboard": {}, "protectedPagesHeaders": { "profile": "Profile", "jobsDiscovery": "Tasks", @@ -55,7 +54,8 @@ }, "navbar": { "humanProtocol": "HUMAN Protocol", - "howItWorks": "How It Works" + "howItWorks": "How It Works", + "home": "Home" }, "DrawerNavigation": { "jobs": "Tasks", @@ -99,7 +99,7 @@ "logIn": "Log In", "signUp": "Sign Up", "signIn": "Sign In", - "workerSignIn": "Worker Sign In", + "workerSignIn": "Sign In", "operatorSignIn": "Operator Sign In", "welcome": "Welcome", "howWillUse": "How will you use HUMAN App?", @@ -129,7 +129,10 @@ "title": "Sign Up", "submitBtn": "Sign Up", "passwordDetailedValidation": "Password must contain at least:", - "termsOfServiceAndPrivacyPolicy": "By clicking Sign Up, you agree to our <1>Terms of Service and that you have read our <2>Privacy Policy" + "termsOfServiceAndPrivacyPolicy": "By clicking Sign Up, you agree to our <1>Terms of Service and that you have read our <2>Privacy Policy", + "or": "Or", + "alreadyHaveAccount": "Already have an account?", + "signIn": "Sign In" }, "signInForm": { "fields": { @@ -141,22 +144,24 @@ }, "title": "Sign In", "submitBtn": "Sign In", - "forgotPassword": "Forgot Password?" + "forgotPassword": "Forgot Password?", + "or": "Or", + "dontHaveAccount": "Don't have an account?", + "signUp": "Sign Up" }, "verifyEmail": { "title": "Verify Email", - "btn": "Resend Verification Email", - "paragraph1": "We've sent an email to <1>{{email}}, please check your inbox and verify your email.", - "paragraph2": "The verification link is valid for 24 hours.", - "paragraph3": "<1>Can't find our email? If you can't find the email in your inbox please check the spam folder.", - "paragraph4": "<1>Having trouble? Please <2>Contact Support", + "checkYourInbox": "Check your inbox", + "backToSignUp": "Back to Sign Up", + "btn": "Resend Email", + "paragraph1": "We sent a verification link to <1>{{email}}", + "paragraph2": "Click the link in the email to verify your account. The link expires in 24 hours.", "successResent": "Verification email has been successfully resent.", "authError": "Log in before you resend email verification", "emailError": "No email provided." }, "emailVerification": { - "title": "Email Verified", - "description": "You are ready to go. Your email has been successfully verified!", + "title": "Verified", "btn": "Sign In", "errors": { "noToken": "No token provided." @@ -202,11 +207,19 @@ "password": "Password", "wallet": "Wallet", "resetPassword": "Reset Password", + "beforeWeGetStarted": "Before we get started", + "identityVerification": "Identity verification", + "veriffCopy": "We use Veriff to verify your identity. You'll need: keep your phone & Government ID handy.", + "poweredBy": "Powered by", "completeIdentityVerification": "Complete Identity Verification", - "identityVerificationInProgress": "Identity verification in progress", + "verificationOpenedInNewTab": "Verification opened in a new tab", + "completeYourVerification": "Complete your verification there, then return here to continue", + "waitingForVerification": "Waiting for verification...", + "checkVerificationStatus": "Check Verification Status", + "verificationDeclined": "We were unable to verify your identity with the information provided. Please <1>contact support", "confirmEmail": "Confirm email", - "identityVerificationStatus": "Identity verification", "walletAddressMessage": "This address is the wallet address where you will receive payments for completing tasks.", + "connectYourWallet": "Connect your wallet", "connectWallet": "Connect Wallet", "walletConnected": "Connected", "addKYCInfoOnChain": "Add KYC Info On-chain", @@ -214,7 +227,6 @@ "kycInfoOnChainAdded": "KYC Info On-Chain Added", "registerAddress": "Register Address", "emailNotifications": "Email Notifications", - "notificationsConsent": "I would like to be notified about News and Offers", "topNotifications": { "completeSteps": "Please set up your profile by completing the steps below." }, diff --git a/packages/apps/human-app/frontend/src/shared/providers/notifications-provider.tsx b/packages/apps/human-app/frontend/src/shared/providers/notifications-provider.tsx index 17aabba253..cefcc9f884 100644 --- a/packages/apps/human-app/frontend/src/shared/providers/notifications-provider.tsx +++ b/packages/apps/human-app/frontend/src/shared/providers/notifications-provider.tsx @@ -2,6 +2,7 @@ import { type ReactNode } from 'react'; import { SnackbarProvider } from 'notistack'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import ErrorIcon from '@mui/icons-material/Error'; +import WarningIcon from '@mui/icons-material/Warning'; import { TopNotificationType } from '@/shared/hooks/use-notification'; import { colorPalette as lightColorPalette } from '@/shared/styles/color-palette'; import { handleUnreachableCase } from '@/shared/helpers/handle-unreachable-case'; @@ -21,8 +22,9 @@ const getNotificationIconByType = ( switch (type) { case TopNotificationType.SUCCESS: return ; - case TopNotificationType.WARNING: + return ; + case TopNotificationType.ERROR: return ; default: { @@ -34,7 +36,7 @@ const getNotificationIconByType = ( export function NotificationProvider({ children, maxSnacks = MAX_NOTIFICATIONS_VISIBLE, -}: Readonly) { +}: NotificationProviderProps) { const isMobile = useIsMobile(); return ( diff --git a/packages/apps/human-app/frontend/src/shared/styles/color-palette.ts b/packages/apps/human-app/frontend/src/shared/styles/color-palette.ts index 350f9a6933..308a84dcdd 100644 --- a/packages/apps/human-app/frontend/src/shared/styles/color-palette.ts +++ b/packages/apps/human-app/frontend/src/shared/styles/color-palette.ts @@ -7,6 +7,8 @@ export const colorPalette = { secondary: '#B2AFC1', disabled: '#CBCFE6', disabledSecondary: '#8494C3', + auxiliary100: '#000000', + auxiliary200: '#676767', }, primary: { main: '#320A8D', @@ -21,6 +23,19 @@ export const colorPalette = { light: '#8409FF', contrastText: '#FFFFFF', }, + background: { + default: '#f6f7fe', + paper: '#ffffff', + subtle: '#fcfcfc', + }, + accent: { + main: '#fa2a75', + dark: '#af1d51', + contrastText: '#ffffff', + }, + border: { + main: '#d9d9d9', + }, error: { main: '#FA2A75', dark: '#F20D5F', diff --git a/packages/apps/human-app/frontend/src/shared/styles/dark-color-palette.ts b/packages/apps/human-app/frontend/src/shared/styles/dark-color-palette.ts index dfad3f0edd..75eb536586 100644 --- a/packages/apps/human-app/frontend/src/shared/styles/dark-color-palette.ts +++ b/packages/apps/human-app/frontend/src/shared/styles/dark-color-palette.ts @@ -3,12 +3,14 @@ import type { colorPalette } from '@/shared/styles/color-palette'; export const darkColorPalette = { white: '#FFFFFF', black: '#000000', - backgroundColor: 'rgba(16, 7, 53, 1)', + backgroundColor: '#100735', text: { primary: '#D4CFFF', secondary: '#6C6978', disabled: 'rgba(212, 207, 255, 0.5)', disabledSecondary: 'rgba(147, 135, 255, 1)', + auxiliary100: '#ffffff', + auxiliary200: '#a0a0a0', }, primary: { main: '#CDC7FF', @@ -23,6 +25,19 @@ export const darkColorPalette = { light: '#BB94FF', contrastText: 'rgba(255, 255, 255, 0.87)', }, + background: { + default: '#100735', + paper: '#251d47', + subtle: '#2d284e', + }, + accent: { + main: '#fa2a75', + dark: '#af1d51', + contrastText: '#ffffff', + }, + border: { + main: 'rgba(255, 255, 255, 0.07)', + }, error: { main: '#F65A93', dark: '#F3206E', diff --git a/packages/apps/human-app/frontend/src/shared/styles/dark-theme.ts b/packages/apps/human-app/frontend/src/shared/styles/dark-theme.ts index 56a635b86c..2d8780982b 100644 --- a/packages/apps/human-app/frontend/src/shared/styles/dark-theme.ts +++ b/packages/apps/human-app/frontend/src/shared/styles/dark-theme.ts @@ -23,7 +23,6 @@ export const darkTheme: ThemeOptions = { variantMapping: { subtitle1: 'p', subtitle2: 'p', - textField: 'p', }, }, }, diff --git a/packages/apps/human-app/frontend/src/shared/styles/theme.ts b/packages/apps/human-app/frontend/src/shared/styles/theme.ts index b655c57dc4..d8a130d7c5 100644 --- a/packages/apps/human-app/frontend/src/shared/styles/theme.ts +++ b/packages/apps/human-app/frontend/src/shared/styles/theme.ts @@ -2,6 +2,12 @@ import type { ThemeOptions } from '@mui/material'; import { colorPalette } from '@/shared/styles/color-palette'; import { typography } from '@/shared/styles/typography'; +declare module '@mui/material/Button' { + interface ButtonPropsColorOverrides { + accent: true; + } +} + export const theme: ThemeOptions = { typography, components: { @@ -12,7 +18,6 @@ export const theme: ThemeOptions = { variantMapping: { subtitle1: 'p', subtitle2: 'p', - textField: 'p', }, }, }, @@ -24,6 +29,10 @@ export const theme: ThemeOptions = { fontSize: '14px', fontWeight: 600, textTransform: 'none', + boxShadow: 'none', + '&:hover': { + boxShadow: 'none', + }, '&.Mui-disabled': { backgroundColor: colorPalette.button.disabled, color: colorPalette.text.secondary, @@ -83,8 +92,28 @@ export const theme: ThemeOptions = { }, MuiOutlinedInput: { styleOverrides: { + root: { + color: '#000000', + '&:hover fieldset': { + borderColor: '#000000 !important', + }, + '&.Mui-focused .MuiOutlinedInput-notchedOutline': { + borderColor: '#000000', + }, + }, notchedOutline: { - borderColor: colorPalette.primary.main, + //borderColor: colorPalette.primary.main, + borderColor: '#676767', + }, + }, + }, + MuiInputLabel: { + styleOverrides: { + root: { + color: '#676767', + '&.Mui-focused': { + color: '#000000', + }, }, }, }, diff --git a/packages/apps/human-app/frontend/src/shared/styles/typography.ts b/packages/apps/human-app/frontend/src/shared/styles/typography.ts index 6d53f178e9..07ee29a9d8 100644 --- a/packages/apps/human-app/frontend/src/shared/styles/typography.ts +++ b/packages/apps/human-app/frontend/src/shared/styles/typography.ts @@ -4,22 +4,13 @@ import { breakpoints } from '@/shared/styles/breakpoints'; declare module '@mui/material/Typography' { interface TypographyPropsVariantOverrides { - textField: true; - body3: true; body4: true; body5: true; - body6: true; body7: true; body8: true; buttonLarge: true; buttonMedium: true; - buttonSmall: true; - inputLabel: true; helperText: true; - avatarLetter: true; - inputText: true; - tooltip: true; - inputUnderline: true; chip: true; mobileHeaderLarge: true; mobileHeaderMid: true; @@ -29,21 +20,13 @@ declare module '@mui/material/Typography' { declare module '@mui/material/styles' { interface TypographyVariants { textField: CSSProperties; - body3: CSSProperties; body4: CSSProperties; body5: CSSProperties; - body6: CSSProperties; body7: CSSProperties; body8: CSSProperties; buttonLarge: CSSProperties; buttonMedium: CSSProperties; - buttonSmall: CSSProperties; - inputLabel: CSSProperties; helperText: CSSProperties; - avatarLetter: CSSProperties; - inputText: CSSProperties; - tooltip: CSSProperties; - inputUnderline: CSSProperties; chip: CSSProperties; mobileHeaderLarge: CSSProperties; mobileHeaderMid: CSSProperties; @@ -51,21 +34,13 @@ declare module '@mui/material/styles' { interface TypographyVariantsOptions { textField?: CSSProperties; - body3?: CSSProperties; body4?: CSSProperties; body5?: CSSProperties; - body6?: CSSProperties; body7?: CSSProperties; body8?: CSSProperties; buttonLarge?: CSSProperties; buttonMedium?: CSSProperties; - buttonSmall?: CSSProperties; - inputLabel?: CSSProperties; helperText?: CSSProperties; - avatarLetter?: CSSProperties; - inputText?: CSSProperties; - tooltip?: CSSProperties; - inputUnderline?: CSSProperties; chip?: CSSProperties; mobileHeaderLarge?: CSSProperties; mobileHeaderMid?: CSSProperties; @@ -156,9 +131,6 @@ export const typography: ThemeOptions['typography'] = { fontSize: 16, fontWeight: 400, letterSpacing: 0.15, - [breakpoints.mobile]: { - fontSize: 16, - }, }, body2: { fontSize: 14, @@ -168,11 +140,6 @@ export const typography: ThemeOptions['typography'] = { fontSize: 14, }, }, - body3: { - fontSize: 16, - fontWeight: 500, - letterSpacing: 0.15, - }, body4: { fontSize: 24, fontWeight: 600, @@ -183,11 +150,6 @@ export const typography: ThemeOptions['typography'] = { fontWeight: 500, letterSpacing: 0.15, }, - body6: { - fontSize: 24, - fontWeight: 600, - letterSpacing: 0.15, - }, body7: { fontSize: 18, fontWeight: 500, @@ -210,53 +172,16 @@ export const typography: ThemeOptions['typography'] = { fontWeight: 600, letterSpacing: 0.1, }, - buttonSmall: { - fontSize: 13, - fontWeight: 600, - letterSpacing: 0.1, - }, caption: { fontSize: 12, fontWeight: 400, letterSpacing: 0.4, }, - overline: { - fontSize: 12, - fontWeight: 400, - letterSpacing: 0.4, - textTransform: 'uppercase', - }, - avatarLetter: { - fontSize: 20, - fontWeight: 400, - letterSpacing: 0.14, - }, - inputLabel: { - fontSize: 12, - fontWeight: 400, - letterSpacing: 0.15, - }, helperText: { fontSize: 12, fontWeight: 400, letterSpacing: 0.4, }, - inputText: { - fontSize: 16, - fontWeight: 400, - letterSpacing: 0.15, - }, - tooltip: { - fontSize: 10, - fontWeight: 500, - letterSpacing: 0, - }, - inputUnderline: { - fontSize: 12, - fontWeight: 600, - letterSpacing: 0.15, - textDecoration: 'underline', - }, chip: { fontSize: 13, fontWeight: 400, diff --git a/yarn.lock b/yarn.lock index 79f52d1a19..1ff079b8de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -430,16 +430,11 @@ __metadata: "@mui/x-date-pickers": "npm:^9.9.0" "@reown/appkit": "npm:^1.8.20" "@reown/appkit-adapter-wagmi": "npm:^1.8.20" - "@synaps-io/verify-sdk": "npm:^4.0.45" - "@tanstack/eslint-plugin-query": "npm:^5.60.1" "@tanstack/react-query": "npm:^5.91.3" - "@tanstack/react-query-devtools": "npm:^5.59.16" "@types/lodash": "npm:^4.17.24" "@types/node": "npm:^22.10.5" - "@types/prop-types": "npm:^15" "@types/react": "npm:^19.2.15" "@types/react-dom": "npm:^19.2.3" - "@vercel/style-guide": "npm:^6.0.0" "@vitejs/plugin-react": "npm:^4.2.1" "@wagmi/core": "npm:^3.4.0" date-fns: "npm:^4.1.0" @@ -448,10 +443,8 @@ __metadata: eslint-plugin-jsx-a11y: "npm:^6.10.2" eslint-plugin-prettier: "npm:^5.5.6" eslint-plugin-react-hooks: "npm:^5.2.0" - eslint-plugin-react-refresh: "npm:^0.5.2" ethers: "npm:^6.17.0" globals: "npm:^17.7.0" - husky: "npm:^9.1.6" i18next: "npm:^25.8.0" jsdom: "npm:^29.1.1" jwt-decode: "npm:^4.0.0" @@ -459,13 +452,11 @@ __metadata: material-react-table: "npm:3.0.1" notistack: "npm:^3.0.1" prettier: "npm:^3.8.1" - prop-types: "npm:^15.8.1" query-string: "npm:^9.0.0" react: "npm:^19.2.6" react-dom: "npm:^19.2.6" react-hook-form: "npm:^7.71.1" react-i18next: "npm:^15.1.0" - react-imask: "npm:^7.4.0" react-number-format: "npm:^5.4.5" react-router-dom: "npm:^7.18.1" serve: "npm:^14.2.6" @@ -1428,7 +1419,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.16.0, @babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.0, @babel/core@npm:^7.28.0": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.16.0, @babel/core@npm:^7.21.3, @babel/core@npm:^7.23.9, @babel/core@npm:^7.28.0": version: 7.28.5 resolution: "@babel/core@npm:7.28.5" dependencies: @@ -1474,7 +1465,7 @@ __metadata: languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.16.3, @babel/eslint-parser@npm:^7.23.10": +"@babel/eslint-parser@npm:^7.16.3": version: 7.28.5 resolution: "@babel/eslint-parser@npm:7.28.5" dependencies: @@ -1723,7 +1714,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": +"@babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-validator-identifier@npm:7.28.5" checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 @@ -3028,15 +3019,6 @@ __metadata: languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.24.4": - version: 7.28.4 - resolution: "@babel/runtime-corejs3@npm:7.28.4" - dependencies: - core-js-pure: "npm:^3.43.0" - checksum: 10c0/0a7fe2d4e36d345acf090dd685b5c6ed55af3ead69a84e2cfca56631815dd757f3a362031b376cc746f63f0fd856e7a5280807833f7fa9a5b7f1febd97f8c0da - languageName: node - linkType: hard - "@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.9, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.27.6, @babel/runtime@npm:^7.28.4, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": version: 7.28.4 resolution: "@babel/runtime@npm:7.28.4" @@ -4163,7 +4145,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0": +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.8.0": version: 4.9.0 resolution: "@eslint-community/eslint-utils@npm:4.9.0" dependencies: @@ -4185,7 +4167,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.2, @eslint-community/regexpp@npm:^4.4.0": +"@eslint-community/regexpp@npm:^4.12.2, @eslint-community/regexpp@npm:^4.4.0": version: 4.12.2 resolution: "@eslint-community/regexpp@npm:4.12.2" checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d @@ -4221,23 +4203,6 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" - dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 - languageName: node - linkType: hard - "@eslint/js@npm:^10.0.1": version: 10.0.1 resolution: "@eslint/js@npm:10.0.1" @@ -7003,25 +6968,6 @@ __metadata: languageName: node linkType: hard -"@microsoft/tsdoc-config@npm:0.16.2": - version: 0.16.2 - resolution: "@microsoft/tsdoc-config@npm:0.16.2" - dependencies: - "@microsoft/tsdoc": "npm:0.14.2" - ajv: "npm:~6.12.6" - jju: "npm:~1.4.0" - resolve: "npm:~1.19.0" - checksum: 10c0/9e8c176b68f01c8bb38e6365d5b543e471bba59fced6070d9bd35b32461fbd650c2e1a6f686e8dca0cf22bc5e7d796e4213e66bce4426c8cb9864c1f6ca6836c - languageName: node - linkType: hard - -"@microsoft/tsdoc@npm:0.14.2": - version: 0.14.2 - resolution: "@microsoft/tsdoc@npm:0.14.2" - checksum: 10c0/c018857ad439144559ce34a397a29ace7cf5b24b999b8e3c1b88d878338088b3a453eaac4435beaf2c7eae13c4c0aac81e42f96f0f1d48e8d4eeb438eb3bb82f - languageName: node - linkType: hard - "@microsoft/tsdoc@npm:0.16.0": version: 0.16.0 resolution: "@microsoft/tsdoc@npm:0.16.0" @@ -8482,13 +8428,6 @@ __metadata: languageName: node linkType: hard -"@nolyfill/is-core-module@npm:1.0.39": - version: 1.0.39 - resolution: "@nolyfill/is-core-module@npm:1.0.39" - checksum: 10c0/34ab85fdc2e0250879518841f74a30c276bca4f6c3e13526d2d1fe515e1adf6d46c25fcd5989d22ea056d76f7c39210945180b4859fc83b050e2da411aa86289 - languageName: node - linkType: hard - "@nomicfoundation/edr-darwin-arm64@npm:0.11.3": version: 0.11.3 resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.11.3" @@ -9227,13 +9166,6 @@ __metadata: languageName: node linkType: hard -"@pkgr/core@npm:^0.2.9": - version: 0.2.9 - resolution: "@pkgr/core@npm:0.2.9" - checksum: 10c0/ac8e4e8138b1a7a4ac6282873aef7389c352f1f8b577b4850778f5182e4a39a5241facbe48361fec817f56d02b51691b383010843fb08b34a8e8ea3614688fd5 - languageName: node - linkType: hard - "@pkgr/core@npm:^0.3.6": version: 0.3.6 resolution: "@pkgr/core@npm:0.3.6" @@ -9925,7 +9857,7 @@ __metadata: languageName: node linkType: hard -"@rushstack/eslint-patch@npm:^1.1.0, @rushstack/eslint-patch@npm:^1.7.2": +"@rushstack/eslint-patch@npm:^1.1.0": version: 1.14.1 resolution: "@rushstack/eslint-patch@npm:1.14.1" checksum: 10c0/ec5014494e4fa2dcdc555b62d5db3ebcd146562863a7e75cdacbac96dd1699e93f47dfc3f2185462a21c06987728d73258e32088e93315392e4f79234250b276 @@ -11743,24 +11675,6 @@ __metadata: languageName: node linkType: hard -"@synaps-io/verify-sdk@npm:^4.0.45": - version: 4.0.48 - resolution: "@synaps-io/verify-sdk@npm:4.0.48" - checksum: 10c0/a1a520dd951ba2824bbac891ddae60c049eb9164e373f18cc68cfdb5a5eb2f09009b0c763fc11f39503ca6246a4d65895106180e0d39f6f52889b66a791ec42e - languageName: node - linkType: hard - -"@tanstack/eslint-plugin-query@npm:^5.60.1": - version: 5.91.2 - resolution: "@tanstack/eslint-plugin-query@npm:5.91.2" - dependencies: - "@typescript-eslint/utils": "npm:^8.44.1" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/d839f37ae99ea776a2d1c03514d0e57a73890f449046e53b9497e919365bb14a13277f152cdb532f6714d60399b280daeedcaf55559d23b90b6beaa352fe15c8 - languageName: node - linkType: hard - "@tanstack/match-sorter-utils@npm:8.19.4": version: 8.19.4 resolution: "@tanstack/match-sorter-utils@npm:8.19.4" @@ -11791,13 +11705,6 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-devtools@npm:5.90.1": - version: 5.90.1 - resolution: "@tanstack/query-devtools@npm:5.90.1" - checksum: 10c0/3b69e5441438acf0e753adbf187abf54b5b2e19d7c6d1e465d97278cb8c248bb86d3be193092d50414e4093cbf014093103517cb523daae003e53c867f3c11c2 - languageName: node - linkType: hard - "@tanstack/query-persist-client-core@npm:5.101.2": version: 5.101.2 resolution: "@tanstack/query-persist-client-core@npm:5.101.2" @@ -11826,18 +11733,6 @@ __metadata: languageName: node linkType: hard -"@tanstack/react-query-devtools@npm:^5.59.16": - version: 5.90.2 - resolution: "@tanstack/react-query-devtools@npm:5.90.2" - dependencies: - "@tanstack/query-devtools": "npm:5.90.1" - peerDependencies: - "@tanstack/react-query": ^5.90.2 - react: ^18 || ^19 - checksum: 10c0/526d529bf995426ace7511f51a425ce92dfc1b6dd74c9956a3cd7d68950119e97291bced2ff17173bcdb329eae36c68abc211a4dec32d6e92ab537b41c0533c2 - languageName: node - linkType: hard - "@tanstack/react-query-persist-client@npm:^5.80.7": version: 5.90.8 resolution: "@tanstack/react-query-persist-client@npm:5.90.8" @@ -12612,13 +12507,6 @@ __metadata: languageName: node linkType: hard -"@types/normalize-package-data@npm:^2.4.0": - version: 2.4.4 - resolution: "@types/normalize-package-data@npm:2.4.4" - checksum: 10c0/aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 - languageName: node - linkType: hard - "@types/parse-json@npm:^4.0.0": version: 4.0.2 resolution: "@types/parse-json@npm:4.0.2" @@ -12682,7 +12570,7 @@ __metadata: languageName: node linkType: hard -"@types/prop-types@npm:^15, @types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.15": +"@types/prop-types@npm:^15.7.12, @types/prop-types@npm:^15.7.15": version: 15.7.15 resolution: "@types/prop-types@npm:15.7.15" checksum: 10c0/b59aad1ad19bf1733cf524fd4e618196c6c7690f48ee70a327eb450a42aab8e8a063fbe59ca0a5701aebe2d92d582292c0fb845ea57474f6a15f6994b0e260b2 @@ -13013,29 +12901,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^7.1.1": - version: 7.18.0 - resolution: "@typescript-eslint/eslint-plugin@npm:7.18.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/type-utils": "npm:7.18.0" - "@typescript-eslint/utils": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.3.1" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^1.3.0" - peerDependencies: - "@typescript-eslint/parser": ^7.0.0 - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/2b37948fa1b0dab77138909dabef242a4d49ab93e4019d4ef930626f0a7d96b03e696cd027fa0087881c20e73be7be77c942606b4a76fa599e6b37f6985304c3 - languageName: node - linkType: hard - "@typescript-eslint/experimental-utils@npm:^5.0.0": version: 5.62.0 resolution: "@typescript-eslint/experimental-utils@npm:5.62.0" @@ -13080,37 +12945,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.1.1": - version: 7.18.0 - resolution: "@typescript-eslint/parser@npm:7.18.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - debug: "npm:^4.3.4" - peerDependencies: - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/370e73fca4278091bc1b657f85e7d74cd52b24257ea20c927a8e17546107ce04fbf313fec99aed0cc2a145ddbae1d3b12e9cc2c1320117636dc1281bcfd08059 - languageName: node - linkType: hard - -"@typescript-eslint/project-service@npm:8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/project-service@npm:8.46.2" - dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.46.2" - "@typescript-eslint/types": "npm:^8.46.2" - debug: "npm:^4.3.4" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/03e87bcbca6af3f95bf54d4047a8b4d12434126c27d7312e804499a9459e1c847fe045f83fe8e3b22c3dc3925baad0aa2a1a5476d0d51f73a493dc5909a53dbf - languageName: node - linkType: hard - "@typescript-eslint/project-service@npm:8.57.1": version: 8.57.1 resolution: "@typescript-eslint/project-service@npm:8.57.1" @@ -13134,26 +12968,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/scope-manager@npm:7.18.0" - dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - checksum: 10c0/038cd58c2271de146b3a594afe2c99290034033326d57ff1f902976022c8b0138ffd3cb893ae439ae41003b5e4bcc00cabf6b244ce40e8668f9412cc96d97b8e - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/scope-manager@npm:8.46.2" - dependencies: - "@typescript-eslint/types": "npm:8.46.2" - "@typescript-eslint/visitor-keys": "npm:8.46.2" - checksum: 10c0/42f52ee621a3a0ef2233e7d3384d9dbd76218f5c906a9cce3152a1f55c060a3d3614c7b8fff5270bdf48e8fcc003e732d3f003f283ea6fb204d64a2f6bb3ea9c - languageName: node - linkType: hard - "@typescript-eslint/scope-manager@npm:8.57.1": version: 8.57.1 resolution: "@typescript-eslint/scope-manager@npm:8.57.1" @@ -13164,15 +12978,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.46.2, @typescript-eslint/tsconfig-utils@npm:^8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.46.2" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/23e34ad296347417e42234945138022fb045d180fde69941483884a38e85fa55d5449420d2a660c0ebf1794a445add2f13e171c8dd64e4e83f594e2c4e35bf4d - languageName: node - linkType: hard - "@typescript-eslint/tsconfig-utils@npm:8.57.1, @typescript-eslint/tsconfig-utils@npm:^8.57.1": version: 8.57.1 resolution: "@typescript-eslint/tsconfig-utils@npm:8.57.1" @@ -13199,23 +13004,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/type-utils@npm:7.18.0" - dependencies: - "@typescript-eslint/typescript-estree": "npm:7.18.0" - "@typescript-eslint/utils": "npm:7.18.0" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.3.0" - peerDependencies: - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/ad92a38007be620f3f7036f10e234abdc2fdc518787b5a7227e55fd12896dacf56e8b34578723fbf9bea8128df2510ba8eb6739439a3879eda9519476d5783fd - languageName: node - linkType: hard - "@typescript-eslint/type-utils@npm:8.57.1": version: 8.57.1 resolution: "@typescript-eslint/type-utils@npm:8.57.1" @@ -13239,20 +13027,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/types@npm:7.18.0" - checksum: 10c0/eb7371ac55ca77db8e59ba0310b41a74523f17e06f485a0ef819491bc3dd8909bb930120ff7d30aaf54e888167e0005aa1337011f3663dc90fb19203ce478054 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.46.2, @typescript-eslint/types@npm:^8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/types@npm:8.46.2" - checksum: 10c0/611716bae2369a1b8001c7f6cc03c5ecadfb956643cbbe27269defd28a61d43fe52eda008d7a09568b0be50c502e8292bf767b246366004283476e9a971b6fbc - languageName: node - linkType: hard - "@typescript-eslint/types@npm:8.57.1, @typescript-eslint/types@npm:^8.56.0, @typescript-eslint/types@npm:^8.57.1": version: 8.57.1 resolution: "@typescript-eslint/types@npm:8.57.1" @@ -13278,45 +13052,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.18.0" - dependencies: - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/visitor-keys": "npm:7.18.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10c0/0c7f109a2e460ec8a1524339479cf78ff17814d23c83aa5112c77fb345e87b3642616291908dcddea1e671da63686403dfb712e4a4435104f92abdfddf9aba81 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/typescript-estree@npm:8.46.2" - dependencies: - "@typescript-eslint/project-service": "npm:8.46.2" - "@typescript-eslint/tsconfig-utils": "npm:8.46.2" - "@typescript-eslint/types": "npm:8.46.2" - "@typescript-eslint/visitor-keys": "npm:8.46.2" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.1.0" - peerDependencies: - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/ad7dbf352982bc6e16473ef19fc7d209fffeb147a732db8a2464e0ec33e7fbbc24ce3f23d01bdf99d503626c582a476debf4c90c527d755eeb99b863476d9f5f - languageName: node - linkType: hard - "@typescript-eslint/typescript-estree@npm:8.57.1": version: 8.57.1 resolution: "@typescript-eslint/typescript-estree@npm:8.57.1" @@ -13336,7 +13071,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.10.0, @typescript-eslint/utils@npm:^5.58.0, @typescript-eslint/utils@npm:^5.62.0": +"@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.58.0": version: 5.62.0 resolution: "@typescript-eslint/utils@npm:5.62.0" dependencies: @@ -13354,20 +13089,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:7.18.0, @typescript-eslint/utils@npm:^7.1.1": - version: 7.18.0 - resolution: "@typescript-eslint/utils@npm:7.18.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:7.18.0" - "@typescript-eslint/types": "npm:7.18.0" - "@typescript-eslint/typescript-estree": "npm:7.18.0" - peerDependencies: - eslint: ^8.56.0 - checksum: 10c0/a25a6d50eb45c514469a01ff01f215115a4725fb18401055a847ddf20d1b681409c4027f349033a95c4ff7138d28c3b0a70253dfe8262eb732df4b87c547bd1e - languageName: node - linkType: hard - "@typescript-eslint/utils@npm:8.57.1, @typescript-eslint/utils@npm:^8.0.0": version: 8.57.1 resolution: "@typescript-eslint/utils@npm:8.57.1" @@ -13383,21 +13104,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:^8.44.1": - version: 8.46.2 - resolution: "@typescript-eslint/utils@npm:8.46.2" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.46.2" - "@typescript-eslint/types": "npm:8.46.2" - "@typescript-eslint/typescript-estree": "npm:8.46.2" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/600b70730077ed85a6e278e06771f3933cdafce242f979e4af1c1b41290bf1efb14d20823c25c38a3a792def69b18eb9410af28bb228fe86027ad7859753c62d - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" @@ -13408,26 +13114,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.18.0": - version: 7.18.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.18.0" - dependencies: - "@typescript-eslint/types": "npm:7.18.0" - eslint-visitor-keys: "npm:^3.4.3" - checksum: 10c0/538b645f8ff1d9debf264865c69a317074eaff0255e63d7407046176b0f6a6beba34a6c51d511f12444bae12a98c69891eb6f403c9f54c6c2e2849d1c1cb73c0 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.46.2": - version: 8.46.2 - resolution: "@typescript-eslint/visitor-keys@npm:8.46.2" - dependencies: - "@typescript-eslint/types": "npm:8.46.2" - eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/2067cd9a3c90b3817242cc49b5fa77428e1b92b28e16a12f45c2b399acbba7bd17e503553e5e68924e40078477a5c247dfa12e7709c24fe11c0b17a0c8486c33 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:8.57.1": version: 8.57.1 resolution: "@typescript-eslint/visitor-keys@npm:8.57.1" @@ -13573,48 +13259,6 @@ __metadata: languageName: node linkType: hard -"@vercel/style-guide@npm:^6.0.0": - version: 6.0.0 - resolution: "@vercel/style-guide@npm:6.0.0" - dependencies: - "@babel/core": "npm:^7.24.0" - "@babel/eslint-parser": "npm:^7.23.10" - "@rushstack/eslint-patch": "npm:^1.7.2" - "@typescript-eslint/eslint-plugin": "npm:^7.1.1" - "@typescript-eslint/parser": "npm:^7.1.1" - eslint-config-prettier: "npm:^9.1.0" - eslint-import-resolver-alias: "npm:^1.1.2" - eslint-import-resolver-typescript: "npm:^3.6.1" - eslint-plugin-eslint-comments: "npm:^3.2.0" - eslint-plugin-import: "npm:^2.29.1" - eslint-plugin-jest: "npm:^27.9.0" - eslint-plugin-jsx-a11y: "npm:^6.8.0" - eslint-plugin-playwright: "npm:^1.5.2" - eslint-plugin-react: "npm:^7.34.0" - eslint-plugin-react-hooks: "npm:^4.6.0" - eslint-plugin-testing-library: "npm:^6.2.0" - eslint-plugin-tsdoc: "npm:^0.2.17" - eslint-plugin-unicorn: "npm:^51.0.1" - eslint-plugin-vitest: "npm:^0.3.22" - prettier-plugin-packagejson: "npm:^2.4.12" - peerDependencies: - "@next/eslint-plugin-next": ">=12.3.0 <15.0.0-0" - eslint: ">=8.48.0 <9" - prettier: ">=3.0.0 <4" - typescript: ">=4.8.0 <6" - peerDependenciesMeta: - "@next/eslint-plugin-next": - optional: true - eslint: - optional: true - prettier: - optional: true - typescript: - optional: true - checksum: 10c0/92729f1c057a46cdb28f603c8f52f33791e5f9628b4b25c1705cea18ec552553db4638ce1b0a0da0b3febc7d85680c2de5e41344368adc6724ec0b63659147ba - languageName: node - linkType: hard - "@vitejs/plugin-react@npm:^4.2.1, @vitejs/plugin-react@npm:^4.3.1, @vitejs/plugin-react@npm:^4.3.4": version: 4.7.0 resolution: "@vitejs/plugin-react@npm:4.7.0" @@ -14759,7 +14403,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": +"acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -14905,7 +14549,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:~6.12.6": +"ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -16267,13 +15911,6 @@ __metadata: languageName: node linkType: hard -"builtin-modules@npm:^3.3.0": - version: 3.3.0 - resolution: "builtin-modules@npm:3.3.0" - checksum: 10c0/2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a - languageName: node - linkType: hard - "builtin-status-codes@npm:^3.0.0": version: 3.0.0 resolution: "builtin-status-codes@npm:3.0.0" @@ -16684,7 +16321,7 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^4.0.0, ci-info@npm:^4.2.0": +"ci-info@npm:^4.2.0": version: 4.3.1 resolution: "ci-info@npm:4.3.1" checksum: 10c0/7dd82000f514d76ddfe7775e4cb0d66e5c638f5fa0e2a3be29557e898da0d32ac04f231217d414d07fb968b1fbc6d980ee17ddde0d2c516f23da9cfff608f6c1 @@ -16738,15 +16375,6 @@ __metadata: languageName: node linkType: hard -"clean-regexp@npm:^1.0.0": - version: 1.0.0 - resolution: "clean-regexp@npm:1.0.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - checksum: 10c0/fd9c7446551b8fc536f95e8a286d431017cd4ba1ec2e53997ec9159385e9c317672f6dfc4d49fdb97449fdb53b0bacd0a8bab9343b8fdd2e46c7ddf6173d0db7 - languageName: node - linkType: hard - "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" @@ -17269,7 +16897,7 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.34.0, core-js-compat@npm:^3.43.0": +"core-js-compat@npm:^3.43.0": version: 3.46.0 resolution: "core-js-compat@npm:3.46.0" dependencies: @@ -17278,13 +16906,6 @@ __metadata: languageName: node linkType: hard -"core-js-pure@npm:^3.43.0": - version: 3.46.0 - resolution: "core-js-pure@npm:3.46.0" - checksum: 10c0/8cf5016f92af5d23c6440649f46fc793ba0201e1687e696cee0341af8e8c6a2e9958b078f23af3a7440edf1ced63ce23a511f7b1357e4793c1101b907bf6ff87 - languageName: node - linkType: hard - "core-util-is@npm:^1.0.3, core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" @@ -18107,13 +17728,6 @@ __metadata: languageName: node linkType: hard -"detect-indent@npm:^7.0.1": - version: 7.0.2 - resolution: "detect-indent@npm:7.0.2" - checksum: 10c0/adb1334ca3fe516dc6817aff0a777540b88643ab92fe13a72d0f5d12721ca796ffdd0e5fedb7b45e6e82657156c6ad44f5d5758157f0439532ae7d07b595146b - languageName: node - linkType: hard - "detect-libc@npm:^1.0.3": version: 1.0.3 resolution: "detect-libc@npm:1.0.3" @@ -18130,13 +17744,6 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^4.0.1": - version: 4.0.1 - resolution: "detect-newline@npm:4.0.1" - checksum: 10c0/1cc1082e88ad477f30703ae9f23bd3e33816ea2db6a35333057e087d72d466f5a777809b71f560118ecff935d2c712f5b59e1008a8b56a900909d8fd4621c603 - languageName: node - linkType: hard - "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -19055,15 +18662,6 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-alias@npm:^1.1.2": - version: 1.1.2 - resolution: "eslint-import-resolver-alias@npm:1.1.2" - peerDependencies: - eslint-plugin-import: ">=1.4.0" - checksum: 10c0/71f156e131242db509fe1cfdb410cca665cc9c6e4201e20609689016414e3c6c0b9df27a74b83367694b8ccc5f41687abde26b6cd2c96f961ba16152aca40e43 - languageName: node - linkType: hard - "eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" @@ -19075,30 +18673,6 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-typescript@npm:^3.6.1": - version: 3.10.1 - resolution: "eslint-import-resolver-typescript@npm:3.10.1" - dependencies: - "@nolyfill/is-core-module": "npm:1.0.39" - debug: "npm:^4.4.0" - get-tsconfig: "npm:^4.10.0" - is-bun-module: "npm:^2.0.0" - stable-hash: "npm:^0.0.5" - tinyglobby: "npm:^0.2.13" - unrs-resolver: "npm:^1.6.2" - peerDependencies: - eslint: "*" - eslint-plugin-import: "*" - eslint-plugin-import-x: "*" - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - checksum: 10c0/02ba72cf757753ab9250806c066d09082e00807b7b6525d7687e1c0710bc3f6947e39120227fe1f93dabea3510776d86fb3fd769466ba3c46ce67e9f874cb702 - languageName: node - linkType: hard - "eslint-import-resolver-typescript@npm:^4.4.4": version: 4.4.4 resolution: "eslint-import-resolver-typescript@npm:4.4.4" @@ -19135,18 +18709,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-eslint-comments@npm:^3.2.0": - version: 3.2.0 - resolution: "eslint-plugin-eslint-comments@npm:3.2.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - ignore: "npm:^5.0.5" - peerDependencies: - eslint: ">=4.19.1" - checksum: 10c0/c71db824592dc8ea498021572a0bd33d763ef26126bdb3b84a027ca75a1adbe0894ec95024f7de39ef12308560e62cbf8af0d06ffe472be5ba8bd9169c928e96 - languageName: node - linkType: hard - "eslint-plugin-flowtype@npm:^8.0.3": version: 8.0.3 resolution: "eslint-plugin-flowtype@npm:8.0.3" @@ -19188,7 +18750,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.25.3, eslint-plugin-import@npm:^2.29.1": +"eslint-plugin-import@npm:^2.25.3": version: 2.32.0 resolution: "eslint-plugin-import@npm:2.32.0" dependencies: @@ -19234,24 +18796,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jest@npm:^27.9.0": - version: 27.9.0 - resolution: "eslint-plugin-jest@npm:27.9.0" - dependencies: - "@typescript-eslint/utils": "npm:^5.10.0" - peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 || ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 - jest: "*" - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - jest: - optional: true - checksum: 10c0/b8b09f7d8ba3d84a8779a6e95702a6e4dce45ab034e4edf5ddb631e77cd38dcdf791dfd9228e0a0d1d80d1eb2d278deb62ad2ec39f10fb8fd43cec07304e0c38 - languageName: node - linkType: hard - "eslint-plugin-jest@npm:^29.15.2": version: 29.15.2 resolution: "eslint-plugin-jest@npm:29.15.2" @@ -19273,7 +18817,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsx-a11y@npm:^6.10.2, eslint-plugin-jsx-a11y@npm:^6.5.1, eslint-plugin-jsx-a11y@npm:^6.8.0": +"eslint-plugin-jsx-a11y@npm:^6.10.2, eslint-plugin-jsx-a11y@npm:^6.5.1": version: 6.10.2 resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" dependencies: @@ -19298,21 +18842,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-playwright@npm:^1.5.2": - version: 1.8.3 - resolution: "eslint-plugin-playwright@npm:1.8.3" - dependencies: - globals: "npm:^13.23.0" - peerDependencies: - eslint: ">=8.40.0" - eslint-plugin-jest: ">=25" - peerDependenciesMeta: - eslint-plugin-jest: - optional: true - checksum: 10c0/41c90ad82d7bfd336b11d88a7dd4aee3832878f3abc5df0c7e988124ac3d4e0ffc7de760f4e986a275bf088da2a360d177e8a48d6b3193dcb5f60b17138cf0fe - languageName: node - linkType: hard - "eslint-plugin-prettier@npm:^5.5.6": version: 5.5.6 resolution: "eslint-plugin-prettier@npm:5.5.6" @@ -19333,7 +18862,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^4.3.0, eslint-plugin-react-hooks@npm:^4.6.0": +"eslint-plugin-react-hooks@npm:^4.3.0": version: 4.6.2 resolution: "eslint-plugin-react-hooks@npm:4.6.2" peerDependencies: @@ -19360,7 +18889,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react@npm:^7.27.1, eslint-plugin-react@npm:^7.34.0, eslint-plugin-react@npm:^7.34.3, eslint-plugin-react@npm:^7.37.5": +"eslint-plugin-react@npm:^7.27.1, eslint-plugin-react@npm:^7.34.3, eslint-plugin-react@npm:^7.37.5": version: 7.37.5 resolution: "eslint-plugin-react@npm:7.37.5" dependencies: @@ -19399,70 +18928,6 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-testing-library@npm:^6.2.0": - version: 6.5.0 - resolution: "eslint-plugin-testing-library@npm:6.5.0" - dependencies: - "@typescript-eslint/utils": "npm:^5.62.0" - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/d5d6f3e11c7a7fe90f19879fb8ff456889aed66668722b8fcb5e13f4a2f1ff2ce8cda3d4c2f5ff5072280378cf262096bdde226d7934ea47500c8fc042a0308a - languageName: node - linkType: hard - -"eslint-plugin-tsdoc@npm:^0.2.17": - version: 0.2.17 - resolution: "eslint-plugin-tsdoc@npm:0.2.17" - dependencies: - "@microsoft/tsdoc": "npm:0.14.2" - "@microsoft/tsdoc-config": "npm:0.16.2" - checksum: 10c0/26cad40b22f3dc0adfb06b1ea12f7d3c9cb257ac8bb56ad6a023e3b3bdfc6144d95a8b01323563e75283cca90baaf4d68816f5cea6994c6cd660a642e820847a - languageName: node - linkType: hard - -"eslint-plugin-unicorn@npm:^51.0.1": - version: 51.0.1 - resolution: "eslint-plugin-unicorn@npm:51.0.1" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.22.20" - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@eslint/eslintrc": "npm:^2.1.4" - ci-info: "npm:^4.0.0" - clean-regexp: "npm:^1.0.0" - core-js-compat: "npm:^3.34.0" - esquery: "npm:^1.5.0" - indent-string: "npm:^4.0.0" - is-builtin-module: "npm:^3.2.1" - jsesc: "npm:^3.0.2" - pluralize: "npm:^8.0.0" - read-pkg-up: "npm:^7.0.1" - regexp-tree: "npm:^0.1.27" - regjsparser: "npm:^0.10.0" - semver: "npm:^7.5.4" - strip-indent: "npm:^3.0.0" - peerDependencies: - eslint: ">=8.56.0" - checksum: 10c0/e3b019e55d60511c18aec081ff512366f917d0162db3ee122e1f881657b9a1c89e0d505bb7aec968d612ff3c757c055d5b734aaf0b3078a283315bb7db56ca04 - languageName: node - linkType: hard - -"eslint-plugin-vitest@npm:^0.3.22": - version: 0.3.26 - resolution: "eslint-plugin-vitest@npm:0.3.26" - dependencies: - "@typescript-eslint/utils": "npm:^7.1.1" - peerDependencies: - eslint: ">=8.0.0" - vitest: "*" - peerDependenciesMeta: - "@typescript-eslint/eslint-plugin": - optional: true - vitest: - optional: true - checksum: 10c0/8f83c65243b0c0f143194eb9585b18f7316ebb6aa9ada0e1ef9cf69bc1ebff84de08df4c0064c151ebfe5e2a14b8f47a6808276a5af4549869652db5667156c9 - languageName: node - linkType: hard - "eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1": version: 5.1.1 resolution: "eslint-scope@npm:5.1.1" @@ -19492,20 +18957,13 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-visitor-keys@npm:4.2.1" - checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43 - languageName: node - linkType: hard - "eslint-visitor-keys@npm:^5.0.0, eslint-visitor-keys@npm:^5.0.1": version: 5.0.1 resolution: "eslint-visitor-keys@npm:5.0.1" @@ -19569,17 +19027,6 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.6.0": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: "npm:^8.9.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 - languageName: node - linkType: hard - "esprima@npm:2.7.x, esprima@npm:^2.7.1": version: 2.7.3 resolution: "esprima@npm:2.7.3" @@ -19600,15 +19047,6 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.5.0": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: "npm:^5.1.0" - checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 - languageName: node - linkType: hard - "esquery@npm:^1.7.0": version: 1.7.0 resolution: "esquery@npm:1.7.0" @@ -20136,7 +19574,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2, fast-glob@npm:^3.3.3": +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.3": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" dependencies: @@ -20834,7 +20272,7 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.10.1": +"get-tsconfig@npm:^4.10.1": version: 4.13.0 resolution: "get-tsconfig@npm:4.13.0" dependencies: @@ -20855,13 +20293,6 @@ __metadata: languageName: node linkType: hard -"git-hooks-list@npm:^4.0.0": - version: 4.1.1 - resolution: "git-hooks-list@npm:4.1.1" - checksum: 10c0/74d87b1ed457214599566032e3bb79d75ec1605729e83fa6182b889900dd94fc14aafe7b8c66b40562ab9fdeea0e0d8035c23a64d8eb9d3917d1f1d6c06c8e4d - languageName: node - linkType: hard - "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -21020,15 +20451,6 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0, globals@npm:^13.23.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10c0/d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd - languageName: node - linkType: hard - "globals@npm:^17.7.0": version: 17.7.0 resolution: "globals@npm:17.7.0" @@ -21709,13 +21131,6 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 - languageName: node - linkType: hard - "hosted-git-info@npm:^7.0.0": version: 7.0.2 resolution: "hosted-git-info@npm:7.0.2" @@ -21968,7 +21383,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.0.5, ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.3.1": +"ignore@npm:^5.1.1, ignore@npm:^5.2.0": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 @@ -21982,15 +21397,6 @@ __metadata: languageName: node linkType: hard -"imask@npm:^7.6.1": - version: 7.6.1 - resolution: "imask@npm:7.6.1" - dependencies: - "@babel/runtime-corejs3": "npm:^7.24.4" - checksum: 10c0/cda75bb5036bf65b1028a39ee5fe7bb1a654838213e8f85288c5899a9e5eb84ce7d2b37ae2d9d600f553b7b0e9fd2f4ba2cbdb03a2c46cf0fa60075bc0c21f0c - languageName: node - linkType: hard - "immer@npm:10.0.2": version: 10.0.2 resolution: "immer@npm:10.0.2" @@ -22265,15 +21671,6 @@ __metadata: languageName: node linkType: hard -"is-builtin-module@npm:^3.2.1": - version: 3.2.1 - resolution: "is-builtin-module@npm:3.2.1" - dependencies: - builtin-modules: "npm:^3.3.0" - checksum: 10c0/5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 - languageName: node - linkType: hard - "is-bun-module@npm:^2.0.0": version: 2.0.0 resolution: "is-bun-module@npm:2.0.0" @@ -22290,7 +21687,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1": version: 2.16.1 resolution: "is-core-module@npm:2.16.1" dependencies: @@ -22493,13 +21890,6 @@ __metadata: languageName: node linkType: hard -"is-plain-obj@npm:^4.1.0": - version: 4.1.0 - resolution: "is-plain-obj@npm:4.1.0" - checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e - languageName: node - linkType: hard - "is-port-reachable@npm:4.0.0": version: 4.0.0 resolution: "is-port-reachable@npm:4.0.0" @@ -23513,13 +22903,6 @@ __metadata: languageName: node linkType: hard -"jju@npm:~1.4.0": - version: 1.4.0 - resolution: "jju@npm:1.4.0" - checksum: 10c0/f3f444557e4364cfc06b1abf8331bf3778b26c0c8552ca54429bc0092652172fdea26cbffe33e1017b303d5aa506f7ede8571857400efe459cb7439180e2acad - languageName: node - linkType: hard - "joi@npm:^17.13.3": version: 17.13.3 resolution: "joi@npm:17.13.3" @@ -23645,15 +23028,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/f93792440ae1d80f091b65f8ceddf8e55c4bb7f1a09dee5dcbdb0db5612c55c0f6045625aa6b7e8edb2e0a4feabd80ee48616dbe2d37055573a84db3d24f96d9 - languageName: node - linkType: hard - "json-bigint@npm:^1.0.0": version: 1.0.0 resolution: "json-bigint@npm:1.0.0" @@ -24920,13 +24294,6 @@ __metadata: languageName: node linkType: hard -"min-indent@npm:^1.0.0": - version: 1.0.1 - resolution: "min-indent@npm:1.0.1" - checksum: 10c0/7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c - languageName: node - linkType: hard - "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" @@ -25667,18 +25034,6 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^2.5.0": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 - languageName: node - linkType: hard - "normalize-path@npm:^2.1.1": version: 2.1.1 resolution: "normalize-path@npm:2.1.1" @@ -27102,21 +26457,6 @@ __metadata: languageName: node linkType: hard -"prettier-plugin-packagejson@npm:^2.4.12": - version: 2.5.19 - resolution: "prettier-plugin-packagejson@npm:2.5.19" - dependencies: - sort-package-json: "npm:3.4.0" - synckit: "npm:0.11.11" - peerDependencies: - prettier: ">= 1.16.0" - peerDependenciesMeta: - prettier: - optional: true - checksum: 10c0/288b8658fae8c620d3a7175f64026af8f450f053b8357b86b7d4c697287eae7e706c825d6819959bae1b539103a586f72d8b829574970392d0082f6ec5520d3f - languageName: node - linkType: hard - "prettier-plugin-solidity@npm:^1.3.1": version: 1.4.3 resolution: "prettier-plugin-solidity@npm:1.4.3" @@ -27679,18 +27019,6 @@ __metadata: languageName: node linkType: hard -"react-imask@npm:^7.4.0": - version: 7.6.1 - resolution: "react-imask@npm:7.6.1" - dependencies: - imask: "npm:^7.6.1" - prop-types: "npm:^15.8.1" - peerDependencies: - react: ">=0.14.0" - checksum: 10c0/48b8c234fb77e4d8b8446712695c63f2b0351a896b17623510a648408dd1b7ab506496124453a821528781b05fe2f5b04514f902e260f8b7f4486c972061da88 - languageName: node - linkType: hard - "react-is@npm:^16.13.1, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -27851,29 +27179,6 @@ __metadata: languageName: node linkType: hard -"read-pkg-up@npm:^7.0.1": - version: 7.0.1 - resolution: "read-pkg-up@npm:7.0.1" - dependencies: - find-up: "npm:^4.1.0" - read-pkg: "npm:^5.2.0" - type-fest: "npm:^0.8.1" - checksum: 10c0/82b3ac9fd7c6ca1bdc1d7253eb1091a98ff3d195ee0a45386582ce3e69f90266163c34121e6a0a02f1630073a6c0585f7880b3865efcae9c452fa667f02ca385 - languageName: node - linkType: hard - -"read-pkg@npm:^5.2.0": - version: 5.2.0 - resolution: "read-pkg@npm:5.2.0" - dependencies: - "@types/normalize-package-data": "npm:^2.4.0" - normalize-package-data: "npm:^2.5.0" - parse-json: "npm:^5.0.0" - type-fest: "npm:^0.6.0" - checksum: 10c0/b51a17d4b51418e777029e3a7694c9bd6c578a5ab99db544764a0b0f2c7c0f58f8a6bc101f86a6fceb8ba6d237d67c89acf6170f6b98695d0420ddc86cf109fb - languageName: node - linkType: hard - "read-yaml-file@npm:^1.1.0": version: 1.1.0 resolution: "read-yaml-file@npm:1.1.0" @@ -28070,15 +27375,6 @@ __metadata: languageName: node linkType: hard -"regexp-tree@npm:^0.1.27": - version: 0.1.27 - resolution: "regexp-tree@npm:0.1.27" - bin: - regexp-tree: bin/regexp-tree - checksum: 10c0/f636f44b4a0d93d7d6926585ecd81f63e4ce2ac895bc417b2ead0874cd36b337dcc3d0fedc63f69bf5aaeaa4340f36ca7e750c9687cceaf8087374e5284e843c - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -28142,17 +27438,6 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.10.0": - version: 0.10.0 - resolution: "regjsparser@npm:0.10.0" - dependencies: - jsesc: "npm:~0.5.0" - bin: - regjsparser: bin/parser - checksum: 10c0/0f0508c142eddbceae55dab9715e714305c19e1e130db53168e8fa5f9f7ff9a4901f674cf6f71e04a0973b2f883882ba05808c80778b2d52b053d925050010f4 - languageName: node - linkType: hard - "regjsparser@npm:^0.13.0": version: 0.13.0 resolution: "regjsparser@npm:0.13.0" @@ -28280,7 +27565,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.10, resolve@npm:^1.22.4": +"resolve@npm:^1.1.6, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.20.0, resolve@npm:^1.22.10, resolve@npm:^1.22.4": version: 1.22.11 resolution: "resolve@npm:1.22.11" dependencies: @@ -28306,16 +27591,6 @@ __metadata: languageName: node linkType: hard -"resolve@npm:~1.19.0": - version: 1.19.0 - resolution: "resolve@npm:1.19.0" - dependencies: - is-core-module: "npm:^2.1.0" - path-parse: "npm:^1.0.6" - checksum: 10c0/1c8afdfb88c9adab0a19b6f16756d47f5917f64047bf5a38c17aa543aae5ccca2a0631671b19ce8460a7a3e65ead98ee70e046d3056ec173d3377a27487848a8 - languageName: node - linkType: hard - "resolve@patch:resolve@npm%3A1.1.x#optional!builtin": version: 1.1.7 resolution: "resolve@patch:resolve@npm%3A1.1.7#optional!builtin::version=1.1.7&hash=3bafbf" @@ -28332,7 +27607,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.11 resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" dependencies: @@ -28358,16 +27633,6 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A~1.19.0#optional!builtin": - version: 1.19.0 - resolution: "resolve@patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.1.0" - path-parse: "npm:^1.0.6" - checksum: 10c0/254980f60dd9fdb28b34a511e70df6e3027d9627efce86a40757eea9b87252d172829c84517554560c4541ebfe207868270c19a0f086997b41209367aa8ef74f - languageName: node - linkType: hard - "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -28796,15 +28061,6 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.5.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 - languageName: node - linkType: hard - "semver@npm:7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" @@ -28814,6 +28070,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^5.5.0": + version: 5.7.2 + resolution: "semver@npm:5.7.2" + bin: + semver: bin/semver + checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 + languageName: node + linkType: hard + "semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -28823,7 +28088,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.3": +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.3": version: 7.7.3 resolution: "semver@npm:7.7.3" bin: @@ -29315,30 +28580,6 @@ __metadata: languageName: node linkType: hard -"sort-object-keys@npm:^1.1.3": - version: 1.1.3 - resolution: "sort-object-keys@npm:1.1.3" - checksum: 10c0/3bf62398658d3ff4bbca0db4ed8f42f98abc41433859f63d02fb0ab953fbe5526be240ec7e5d85aa50fcab6c937f3fa7015abf1ecdeb3045a2281c53953886bf - languageName: node - linkType: hard - -"sort-package-json@npm:3.4.0": - version: 3.4.0 - resolution: "sort-package-json@npm:3.4.0" - dependencies: - detect-indent: "npm:^7.0.1" - detect-newline: "npm:^4.0.1" - git-hooks-list: "npm:^4.0.0" - is-plain-obj: "npm:^4.1.0" - semver: "npm:^7.7.1" - sort-object-keys: "npm:^1.1.3" - tinyglobby: "npm:^0.2.12" - bin: - sort-package-json: cli.js - checksum: 10c0/1adb7860eee770fa51ac1c810c2fa2483ab47bf150d1fc2437ef28314ee928142a51245ba22aac8a8c662f431609fc633d404bcdd93acbf54d5a056253741218 - languageName: node - linkType: hard - "source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" @@ -29406,40 +28647,6 @@ __metadata: languageName: node linkType: hard -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.5.0 - resolution: "spdx-exceptions@npm:2.5.0" - checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.22 - resolution: "spdx-license-ids@npm:3.0.22" - checksum: 10c0/4a85e44c2ccfc06eebe63239193f526508ebec1abc7cf7bca8ee43923755636234395447c2c87f40fb672cf580a9c8e684513a676bfb2da3d38a4983684bbb38 - languageName: node - linkType: hard - "split-on-first@npm:^1.0.0": version: 1.1.0 resolution: "split-on-first@npm:1.1.0" @@ -29509,13 +28716,6 @@ __metadata: languageName: node linkType: hard -"stable-hash@npm:^0.0.5": - version: 0.0.5 - resolution: "stable-hash@npm:0.0.5" - checksum: 10c0/ca670cb6d172f1c834950e4ec661e2055885df32fee3ebf3647c5df94993b7c2666a5dbc1c9a62ee11fc5c24928579ec5e81bb5ad31971d355d5a341aab493b3 - languageName: node - linkType: hard - "stack-utils@npm:^2.0.3, stack-utils@npm:^2.0.6": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -29892,15 +29092,6 @@ __metadata: languageName: node linkType: hard -"strip-indent@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-indent@npm:3.0.0" - dependencies: - min-indent: "npm:^1.0.0" - checksum: 10c0/ae0deaf41c8d1001c5d4fbe16cb553865c1863da4fae036683b474fa926af9fc121e155cb3fc57a68262b2ae7d5b8420aa752c97a6428c315d00efe2a3875679 - languageName: node - linkType: hard - "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -30131,15 +29322,6 @@ __metadata: languageName: node linkType: hard -"synckit@npm:0.11.11": - version: 0.11.11 - resolution: "synckit@npm:0.11.11" - dependencies: - "@pkgr/core": "npm:^0.2.9" - checksum: 10c0/f0761495953d12d94a86edf6326b3a565496c72f9b94c02549b6961fb4d999f4ca316ce6b3eb8ed2e4bfc5056a8de65cda0bd03a233333a35221cd2fdc0e196b - languageName: node - linkType: hard - "synckit@npm:^0.11.13": version: 0.11.13 resolution: "synckit@npm:0.11.13" @@ -30552,24 +29734,6 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.3.0": - version: 1.4.3 - resolution: "ts-api-utils@npm:1.4.3" - peerDependencies: - typescript: ">=4.2.0" - checksum: 10c0/e65dc6e7e8141140c23e1dc94984bf995d4f6801919c71d6dc27cf0cd51b100a91ffcfe5217626193e5bea9d46831e8586febdc7e172df3f1091a7384299e23a - languageName: node - linkType: hard - -"ts-api-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "ts-api-utils@npm:2.1.0" - peerDependencies: - typescript: ">=4.8.4" - checksum: 10c0/9806a38adea2db0f6aa217ccc6bc9c391ddba338a9fe3080676d0d50ed806d305bb90e8cef0276e793d28c8a929f400abb184ddd7ff83a416959c0f4d2ce754f - languageName: node - linkType: hard - "ts-api-utils@npm:^2.4.0": version: 2.4.0 resolution: "ts-api-utils@npm:2.4.0" @@ -30830,13 +29994,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.6.0": - version: 0.6.0 - resolution: "type-fest@npm:0.6.0" - checksum: 10c0/0c585c26416fce9ecb5691873a1301b5aff54673c7999b6f925691ed01f5b9232db408cdbb0bd003d19f5ae284322523f44092d1f81ca0a48f11f7cf0be8cd38 - languageName: node - linkType: hard - "type-fest@npm:^0.7.1": version: 0.7.1 resolution: "type-fest@npm:0.7.1" @@ -30844,13 +30001,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.8.1": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: 10c0/dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 - languageName: node - linkType: hard - "type-fest@npm:^2.13.0, type-fest@npm:^2.19.0": version: 2.19.0 resolution: "type-fest@npm:2.19.0" @@ -31415,7 +30565,7 @@ __metadata: languageName: node linkType: hard -"unrs-resolver@npm:^1.6.2, unrs-resolver@npm:^1.7.11, unrs-resolver@npm:^1.9.2": +"unrs-resolver@npm:^1.7.11, unrs-resolver@npm:^1.9.2": version: 1.11.1 resolution: "unrs-resolver@npm:1.11.1" dependencies: @@ -31746,16 +30896,6 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - "validate-npm-package-name@npm:^5.0.0": version: 5.0.1 resolution: "validate-npm-package-name@npm:5.0.1"