diff --git a/client/package-lock.json b/client/package-lock.json index e55811f94..5454ff712 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -22,7 +22,7 @@ "@reduxjs/toolkit": "^2.8.2", "@sentry/cli": "^2.50.0", "@sentry/react": "^9.40.0", - "@sentry/vite-plugin": "^3.6.1", + "@sentry/vite-plugin": "^4.0.0", "@splitsoftware/splitio-react": "^2.3.1", "@tanem/react-nprogress": "^5.0.53", "antd": "^5.26.6", @@ -35,11 +35,11 @@ "dayjs": "^1.11.13", "dayjs-business-days2": "^1.3.0", "dinero.js": "^1.9.1", - "dotenv": "^16.4.7", + "dotenv": "^17.2.0", "env-cmd": "^10.1.0", "exifr": "^7.1.3", "graphql": "^16.11.0", - "i18next": "^24.2.3", + "i18next": "^25.3.2", "i18next-browser-languagedetector": "^8.2.0", "immutability-helper": "^3.1.1", "libphonenumber-js": "^1.12.10", @@ -96,7 +96,7 @@ "@emotion/react": "^11.14.0", "@eslint/js": "^9.31.0", "@playwright/test": "^1.54.1", - "@sentry/webpack-plugin": "^3.6.1", + "@sentry/webpack-plugin": "^4.0.0", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", @@ -115,7 +115,7 @@ "react-error-overlay": "^6.1.0", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", - "vite": "^6.3.5", + "vite": "^7.0.5", "vite-plugin-babel": "^1.3.2", "vite-plugin-eslint": "^1.8.1", "vite-plugin-node-polyfills": "^0.24.0", @@ -2608,6 +2608,19 @@ "url": "https://dotenvx.com" } }, + "node_modules/@dotenvx/dotenvx/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/@ecies/ciphers": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.3.tgz", @@ -4502,9 +4515,9 @@ } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-3.6.1.tgz", - "integrity": "sha512-zmvUa4RpzDG3LQJFpGCE8lniz8Rk1Wa6ZvvK+yEH+snZeaHHRbSnAQBMR607GOClP+euGHNO2YtaY4UAdNTYbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.0.0.tgz", + "integrity": "sha512-1sozj4esnQBhJ2QO4imiLMl1858StkLjUxFF1KxgX/X1uEL/QlW2MYL8CKzbLeACy1SkR9h4V8GXSZvCnci5Dw==", "license": "MIT", "engines": { "node": ">= 14" @@ -4527,13 +4540,13 @@ } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-3.6.1.tgz", - "integrity": "sha512-/ubWjPwgLep84sUPzHfKL2Ns9mK9aQrEX4aBFztru7ygiJidKJTxYGtvjh4dL2M1aZ0WRQYp+7PF6+VKwdZXcQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.0.0.tgz", + "integrity": "sha512-dTdbcctT5MJUwdbttZm2zomO+ui1F062ZIkogHeHqlA938Fwd1+9JIJ328+XL4XdcUG2yiFAZBWUPW3bYwoN9A==", "license": "MIT", "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "3.6.1", + "@sentry/babel-plugin-component-annotate": "4.0.0", "@sentry/cli": "^2.49.0", "dotenv": "^16.3.1", "find-up": "^5.0.0", @@ -4545,6 +4558,18 @@ "node": ">= 14" } }, + "node_modules/@sentry/bundler-plugin-core/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/@sentry/cli": { "version": "2.50.0", "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.50.0.tgz", @@ -4758,12 +4783,12 @@ } }, "node_modules/@sentry/vite-plugin": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-3.6.1.tgz", - "integrity": "sha512-x8WMdv2K2HcGS2ezEUIEZXpT/fNeWQ9rsEeF0K9DfKXK8Z9lzRmCr6TVA6I9+yW39Is+1/0cv1Rsu0LhO7lHzg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sentry/vite-plugin/-/vite-plugin-4.0.0.tgz", + "integrity": "sha512-JX5irzvyoOSKto0U0eXDqigsTXdXnPRQaAms/kcU6A6Bf+WaPfCTE5NrJWg6ZeLvi7GiPWch11OO+TB6ZN8RKA==", "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "3.6.1", + "@sentry/bundler-plugin-core": "4.0.0", "unplugin": "1.0.1" }, "engines": { @@ -4771,13 +4796,13 @@ } }, "node_modules/@sentry/webpack-plugin": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-3.6.1.tgz", - "integrity": "sha512-F2yqwbdxfCENMN5u4ih4WfOtGjW56/92DBC0bU6un7Ns/l2qd+wRONIvrF+58rl/VkCFfMlUtZTVoKGRyMRmHA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-4.0.0.tgz", + "integrity": "sha512-Uhfjqnuxv4eYIt0GbPAdlFPum3BtasNhQrO3OJuVQRYRq21En7ARKXISoOhZHMo4tRRiiv+3npKYmpzHTALbQg==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "3.6.1", + "@sentry/bundler-plugin-core": "4.0.0", "unplugin": "1.0.1", "uuid": "^9.0.0" }, @@ -8116,9 +8141,9 @@ } }, "node_modules/dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.0.tgz", + "integrity": "sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -9317,9 +9342,9 @@ } }, "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10129,9 +10154,9 @@ } }, "node_modules/i18next": { - "version": "24.2.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz", - "integrity": "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==", + "version": "25.3.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.3.2.tgz", + "integrity": "sha512-JSnbZDxRVbphc5jiptxr3o2zocy5dEqpVm9qCGdJwRNO+9saUJS0/u4LnM/13C23fUEWxAylPqKU/NpMV/IjqA==", "funding": [ { "type": "individual", @@ -10148,7 +10173,7 @@ ], "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.10" + "@babel/runtime": "^7.27.6" }, "peerDependencies": { "typescript": "^5" @@ -17334,24 +17359,24 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", + "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", + "fdir": "^6.4.6", "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -17360,14 +17385,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -17578,9 +17603,9 @@ } }, "node_modules/vite/node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -17598,7 +17623,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, diff --git a/client/package.json b/client/package.json index 8e075fce3..231212d89 100644 --- a/client/package.json +++ b/client/package.json @@ -21,7 +21,7 @@ "@reduxjs/toolkit": "^2.8.2", "@sentry/cli": "^2.50.0", "@sentry/react": "^9.40.0", - "@sentry/vite-plugin": "^3.6.1", + "@sentry/vite-plugin": "^4.0.0", "@splitsoftware/splitio-react": "^2.3.1", "@tanem/react-nprogress": "^5.0.53", "antd": "^5.26.6", @@ -34,11 +34,11 @@ "dayjs": "^1.11.13", "dayjs-business-days2": "^1.3.0", "dinero.js": "^1.9.1", - "dotenv": "^16.4.7", + "dotenv": "^17.2.0", "env-cmd": "^10.1.0", "exifr": "^7.1.3", "graphql": "^16.11.0", - "i18next": "^24.2.3", + "i18next": "^25.3.2", "i18next-browser-languagedetector": "^8.2.0", "immutability-helper": "^3.1.1", "libphonenumber-js": "^1.12.10", @@ -136,7 +136,7 @@ "@emotion/react": "^11.14.0", "@eslint/js": "^9.31.0", "@playwright/test": "^1.54.1", - "@sentry/webpack-plugin": "^3.6.1", + "@sentry/webpack-plugin": "^4.0.0", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", @@ -155,7 +155,7 @@ "react-error-overlay": "^6.1.0", "redux-logger": "^3.0.6", "source-map-explorer": "^2.5.3", - "vite": "^6.3.5", + "vite": "^7.0.5", "vite-plugin-babel": "^1.3.2", "vite-plugin-eslint": "^1.8.1", "vite-plugin-node-polyfills": "^0.24.0", diff --git a/client/src/components/sign-in-form/sign-in-form.component.jsx b/client/src/components/sign-in-form/sign-in-form.component.jsx index d39128af4..1aa888c22 100644 --- a/client/src/components/sign-in-form/sign-in-form.component.jsx +++ b/client/src/components/sign-in-form/sign-in-form.component.jsx @@ -1,7 +1,7 @@ import { LockOutlined, UserOutlined } from "@ant-design/icons"; import { Button, Form, Input, Typography } from "antd"; import queryString from "query-string"; -import React, { useEffect } from "react"; +import { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Link, useLocation, useNavigate } from "react-router-dom"; @@ -42,6 +42,42 @@ export function SignInComponent({ emailSignInStart, currentUser, signInError, se } }, [currentUser, redirect, navigate]); + // Add event listener for seamless login + useEffect(() => { + const handleSeamlessLogin = (event) => { + const { email, password, origin: requestOrigin } = event.detail || {}; + + // Validate input + if (!email || !password) { + window.parent.postMessage( + { type: "seamlessLoginResponse", status: "error", message: "Email and password are required" }, + requestOrigin || "*" // Use specific origin for security if known + ); + return; + } + + // Check if the user is already logged in + if (currentUser.authorized === true) { + console.log("User is already logged in, redirecting..."); + navigate(redirect || "/manage/"); + window.parent.postMessage({ type: "seamlessLoginResponse", status: "already_logged_in" }, requestOrigin || "*"); + return; + } + + // Proceed with sign-in if not logged in + emailSignInStart(email, password); + window.parent.postMessage({ type: "seamlessLoginResponse", status: "login_attempted" }, requestOrigin || "*"); + }; + + // Add event listener for custom seamless login event + window.addEventListener("seamlessLoginRequest", handleSeamlessLogin); + + // Cleanup to remove the event listener on unmount + return () => { + window.removeEventListener("seamlessLoginRequest", handleSeamlessLogin); + }; + }, [emailSignInStart, currentUser, navigate, redirect]); + return (
diff --git a/client/src/pages/manage/manage.page.component.jsx b/client/src/pages/manage/manage.page.component.jsx index fabc8bbf7..735f93161 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -18,7 +18,6 @@ import GlobalFooter from "../../components/global-footer/global-footer.component import HeaderContainer from "../../components/header/header.container"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import PartnerPingComponent from "../../components/partner-ping/partner-ping.component"; -import PrintCenterModalContainer from "../../components/print-center-modal/print-center-modal.container"; import ShopSubStatusComponent from "../../components/shop-sub-status/shop-sub-status.component"; import UpdateAlert from "../../components/update-alert/update-alert.component"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; @@ -27,6 +26,10 @@ import { selectAlerts } from "../../redux/application/application.selectors.js"; import { selectBodyshop, selectInstanceConflict } from "../../redux/user/user.selectors"; import InstanceRenderManager from "../../utils/instanceRenderMgr.js"; +const PrintCenterModalContainer = lazy( + () => import("../../components/print-center-modal/print-center-modal.container") +); + const JobsPage = lazy(() => import("../jobs/jobs.page")); const CardPaymentModalContainer = lazy( diff --git a/client/src/pages/simplified-parts/simplified-parts.page.component.jsx b/client/src/pages/simplified-parts/simplified-parts.page.component.jsx index 9603fd624..a3e18b299 100644 --- a/client/src/pages/simplified-parts/simplified-parts.page.component.jsx +++ b/client/src/pages/simplified-parts/simplified-parts.page.component.jsx @@ -10,7 +10,6 @@ import ConflictComponent from "../../components/conflict/conflict.component.jsx" import ErrorBoundary from "../../components/error-boundary/error-boundary.component.jsx"; import GlobalFooter from "../../components/global-footer/global-footer.component.jsx"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component.jsx"; -import PrintCenterModalContainer from "../../components/print-center-modal/print-center-modal.container.jsx"; import ShopSubStatusComponent from "../../components/shop-sub-status/shop-sub-status.component.jsx"; import UpdateAlert from "../../components/update-alert/update-alert.component.jsx"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; @@ -29,7 +28,9 @@ const EmailOverlayContainer = lazy(() => import("../../components/email-overlay/ const FeatureRequestPage = lazy(() => import("../feature-request/feature-request.page.jsx")); const ReportCenterModal = lazy(() => import("../../components/report-center-modal/report-center-modal.container.jsx")); const Help = lazy(() => import("../help/help.page.jsx")); - +const PrintCenterModalContainer = lazy( + () => import("../../components/print-center-modal/print-center-modal.container") +); const { Content } = Layout; const mapStateToProps = createStructuredSelector({ diff --git a/client/src/pages/tech/tech.page.component.jsx b/client/src/pages/tech/tech.page.component.jsx index 5f66bb970..43b971a38 100644 --- a/client/src/pages/tech/tech.page.component.jsx +++ b/client/src/pages/tech/tech.page.component.jsx @@ -1,5 +1,5 @@ import { Card, FloatButton, Layout } from "antd"; -import React, { lazy, Suspense, useEffect } from "react"; +import { lazy, Suspense, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; import { Route, Routes, useNavigate } from "react-router-dom"; @@ -40,7 +40,7 @@ const { Content } = Layout; const mapStateToProps = createStructuredSelector({ technician: selectTechnician }); -const mapDispatchToProps = (dispatch) => ({ +const mapDispatchToProps = () => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) });