diff --git a/apps/eo_web/src/components/ThankYou.tsx b/apps/eo_web/src/components/ThankYou.tsx
index 51ec6430..9fdbd2f2 100644
--- a/apps/eo_web/src/components/ThankYou.tsx
+++ b/apps/eo_web/src/components/ThankYou.tsx
@@ -1,16 +1,14 @@
import { useState, type HTMLAttributes } from "react";
import { useMutation } from "@tanstack/react-query";
-import axios from "axios";
-import { toast } from "react-toastify";
import { Typography } from "@eo/ui";
import { Loading } from "~/components/Loading";
import { useMount } from "~/hooks/useMount";
-import { type Channel } from "~/stores/useProfilingStore";
+import { useProfilingStore, type Channel } from "~/stores/useProfilingStore";
+import { useSurveyStore } from "~/stores/useSurveyStore";
import { AllDonePanel } from "./AllDonePanel";
-
type ThankYouProps = HTMLAttributes
& {
mutationsParams: {
email: string;
@@ -19,7 +17,7 @@ type ThankYouProps = HTMLAttributes & {
channel: Channel;
};
mutationKey: string[];
- mutationFunction: (data: object) => Promise;
+ mutationFunction: (data: object) => Promise;
isProfiling?: boolean;
mutateOnMount?: boolean;
};
@@ -31,6 +29,10 @@ export const ThankYou = ({
mutationsParams,
mutateOnMount = true,
}: ThankYouProps) => {
+ const resetSurveyStore = useSurveyStore((store) => store.reset);
+ const resetProfilingStore = useProfilingStore(
+ (store) => store.resetProfilingStore,
+ );
const [isLoading, setIsLoading] = useState(mutateOnMount);
const { mutate } = useMutation({
@@ -38,15 +40,12 @@ export const ThankYou = ({
mutationKey: mutationKey,
onSuccess: () => {
setIsLoading(false);
+ resetSurveyStore();
},
- onError: (result) => {
- if (axios.isAxiosError(result)) {
- if (result.response?.status !== 200) {
- toast.error("Something went wrong");
- }
- } else {
- toast.error("Something went wrong");
- }
+ onError: () => {
+ setIsLoading(false);
+ resetSurveyStore();
+ resetProfilingStore();
},
});
diff --git a/apps/eo_web/src/env.ts b/apps/eo_web/src/env.ts
index d34992c7..34b52e4b 100644
--- a/apps/eo_web/src/env.ts
+++ b/apps/eo_web/src/env.ts
@@ -1,11 +1,12 @@
import { omit } from "lodash/fp";
-import { ZodError, z } from "zod";
+import { z, ZodError } from "zod"; // We've defined here the validations & schema for making sure the env vars ARE correct.
// We've defined here the validations & schema for making sure the env vars ARE correct.
const defaultValidation = z.string().min(1, "Env Var is not defined");
const envSchema = z.object({
VITE_APP_ENV: defaultValidation,
VITE_APP_URL: defaultValidation,
+ VITE_SENTRY_DSN_PUBLIC: z.string().nullish(),
});
type EnvValues = z.infer;
diff --git a/apps/eo_web/src/helpers/sentry.ts b/apps/eo_web/src/helpers/sentry.ts
new file mode 100644
index 00000000..b3eb7858
--- /dev/null
+++ b/apps/eo_web/src/helpers/sentry.ts
@@ -0,0 +1,47 @@
+import React from "react";
+import * as Sentry from "@sentry/react";
+import {
+ createRoutesFromChildren,
+ matchRoutes,
+ useLocation,
+ useNavigationType,
+} from "react-router-dom";
+
+import { env } from "~/env";
+
+const sentryDns =
+ window.data.getEnv("VITE_SENTRY_DNS_PUBLIC") ?? env.VITE_SENTRY_DSN_PUBLIC;
+
+if (sentryDns) {
+ Sentry.init({
+ environment: window.data.getEnv("VITE_APP_ENV") ?? env.VITE_APP_ENV,
+ dsn: sentryDns,
+ integrations: [
+ Sentry.reactRouterV6BrowserTracingIntegration({
+ useEffect: React.useEffect,
+ useLocation,
+ useNavigationType,
+ createRoutesFromChildren,
+ matchRoutes,
+ }),
+ Sentry.replayIntegration({
+ // Additional SDK configuration goes in here, for example:
+ maskAllText: true,
+ blockAllMedia: true,
+ }),
+ ],
+ // Performance Monitoring
+ tracesSampleRate: 1.0, // Capture 100% of the transactions
+ // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled
+ tracePropagationTargets: [
+ "localhost",
+ "www.eo.care",
+ "partner.eo.care",
+ "eo-marketing-06cbaf66a5b1fbfeecb0ca9525.webflow.io",
+ "eo-marketing.webflow.io",
+ ],
+ // Session Replay
+ replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production.
+ replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur.
+ });
+}
diff --git a/apps/eo_web/src/main.tsx b/apps/eo_web/src/main.tsx
index 89d5037a..08cd072f 100644
--- a/apps/eo_web/src/main.tsx
+++ b/apps/eo_web/src/main.tsx
@@ -1,9 +1,12 @@
+import "./helpers/sentry";
import "vite/modulepreload-polyfill";
+
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import App from "./App";
+
import "./index.css";
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
diff --git a/apps/eo_web/src/router/Router.tsx b/apps/eo_web/src/router/Router.tsx
index 69115486..97fa5175 100644
--- a/apps/eo_web/src/router/Router.tsx
+++ b/apps/eo_web/src/router/Router.tsx
@@ -16,12 +16,16 @@ import { Home } from "~/screens/Home";
import { Login } from "~/screens/Login";
import { PrePlan } from "~/screens/PrePlan";
import { PrePlanV2 } from "~/screens/PrePlanV2";
+import { ProfilingOne } from "~/screens/profiling/ProfilingOne";
+import { ProfilingOneRedirect } from "~/screens/profiling/ProfilingOneRedirect";
+import { ProfilingTwo } from "~/screens/profiling/ProfilingTwo";
+import { ProfilingTwoRedirect } from "~/screens/profiling/ProfilingTwoRedirect";
import { ProfilingIntroQuestions } from "~/screens/ProfilingIntroQuestions";
import { ProfilingThankYou } from "~/screens/ProfilingThankYou";
-import { ROICalculator } from "~/screens/ROICalculator";
import { RecoveryPassword } from "~/screens/RecoveryPassword";
import { Register } from "~/screens/Register";
import { RegisterComplete } from "~/screens/RegisterComplete";
+import { ROICalculator } from "~/screens/ROICalculator";
import { RoiCalculatorThankYou } from "~/screens/RoiCalculatorThankYou";
import { Profiling as SeniorProfiling } from "~/screens/Senior/Profiling";
import { SeniorSurveyForm } from "~/screens/Senior/SeniorSurveyForm";
@@ -30,10 +34,6 @@ import { StartPlan } from "~/screens/StartPlan";
import { UnavailableZipCode } from "~/screens/UnavailableZipCode";
import { UserRolSelector } from "~/screens/UserRolSelector";
import { ZipCodeValidation } from "~/screens/ZipCodeValidation";
-import { ProfilingOne } from "~/screens/profiling/ProfilingOne";
-import { ProfilingOneRedirect } from "~/screens/profiling/ProfilingOneRedirect";
-import { ProfilingTwo } from "~/screens/profiling/ProfilingTwo";
-import { ProfilingTwoRedirect } from "~/screens/profiling/ProfilingTwoRedirect";
import { ProtectedRoute } from "./ProtectedRoute";
diff --git a/apps/eo_web/src/screens/AccountCreation.tsx b/apps/eo_web/src/screens/AccountCreation.tsx
index 73a508b4..e33ecf75 100644
--- a/apps/eo_web/src/screens/AccountCreation.tsx
+++ b/apps/eo_web/src/screens/AccountCreation.tsx
@@ -9,13 +9,16 @@ import { tw } from "@eo/shared/src";
import { Button, icons, Input, Typography } from "@eo/ui";
import { CheckBox } from "@eo/ui/src/form/CheckBox";
-import { useApi } from "~/api/useApi";
import { usePreProfile } from "~/api/usePreProfile";
+import { useProfile } from "~/api/useProfile";
import { useMount } from "~/hooks/useMount";
import { LayoutDefault } from "~/layouts";
import { ROUTES } from "~/router";
-import { useProfilingStore } from "~/stores/useProfilingStore";
-
+import {
+ Flows,
+ useProfilingStore,
+ type FlowType,
+} from "~/stores/useProfilingStore";
export const signUpSchema = z.object({
// Profiling
@@ -71,8 +74,8 @@ export const AccountCreation = () => {
channel,
setState,
setExperience,
+ flow,
} = useProfilingStore((state) => state);
- const { eligibleEmail } = useApi();
const [validatingForm, setValidatingForm] = useState(false);
const { mutate: createPreProfile } = usePreProfile().preProfileMutation;
@@ -81,22 +84,22 @@ export const AccountCreation = () => {
handleSubmit,
register,
setError,
+ getValues,
} = useForm({
resolver: zodResolver(signUpSchema),
defaultValues: account,
});
- const errorMessage =
- Object.keys(errors).length === 0 ? "" : Object.values(errors)[0];
-
- const onFormSubmission = async (data: SignUpFormSchema) => {
- setValidatingForm(true);
- const result = await eligibleEmail(data.email);
- if (!result.data.success) {
+ useProfile().useEligibleEmailQuery(getValues("email"), {
+ enabled: validatingForm,
+ retry: 1,
+ retryOnMount: false,
+ onSettled: () => setValidatingForm(false),
+ onError: () => {
setError("email", { message: "Email was already taken" });
- setValidatingForm(false);
- return;
- } else {
+ },
+ onSuccess: () => {
+ const data = getValues();
setAccountData({
...data,
phoneNumber: data.phoneNumber.replace(/\D/g, ""),
@@ -106,6 +109,7 @@ export const AccountCreation = () => {
last_name: data.lastName,
email: data.email,
phone_number: data.phoneNumber.replace(/\D/g, ""),
+ origin: getIndex(flow),
});
switch (channel) {
case "cancer":
@@ -117,9 +121,47 @@ export const AccountCreation = () => {
default:
navigate("/");
}
+ },
+ });
+
+ const errorMessage =
+ Object.keys(errors).length === 0 ? "" : Object.values(errors)[0];
+
+ const getIndex = (input: FlowType): string => {
+ switch (input) {
+ case Flows.cancer_pilot:
+ return "1";
+ case Flows.twist_out_cancer:
+ return "2";
+ case Flows.cancer_support_community:
+ return "3";
+ case Flows.resource_center_1:
+ return "4";
+ case Flows.resource_center_2:
+ return "5";
+ case Flows.employer_center:
+ return "6";
+ case Flows.inova:
+ return "7";
+ case Flows.uva:
+ return "8";
+ case Flows.imerman:
+ return "9";
+ case Flows.unite_for_her:
+ return "10";
+ case Flows.mass_retirees:
+ return "11";
+ case Flows.stupid_cancer:
+ return "12";
+ case Flows.marketing_site:
+ return "13";
+ case Flows.c_org:
+ return "14";
}
};
+ const onFormSubmission = () => setValidatingForm(true);
+
useMount(() => {
const submissionId = useParams.get("submission_id");
const state = useParams.get("state");
diff --git a/apps/eo_web/src/screens/Cancer/CancerSurveyThankYou.tsx b/apps/eo_web/src/screens/Cancer/CancerSurveyThankYou.tsx
index 316fda31..41550014 100644
--- a/apps/eo_web/src/screens/Cancer/CancerSurveyThankYou.tsx
+++ b/apps/eo_web/src/screens/Cancer/CancerSurveyThankYou.tsx
@@ -7,10 +7,9 @@ import { HowEOWorks } from "~/components/HowEOWorks";
import { LayoutDefault } from "~/layouts";
import { Footer } from "~/layouts/Footer";
import { FooterFull } from "~/layouts/FooterFull";
-import { Flows, type FlowType } from "~/stores/useProfilingStore";
+import { type Channel, Flows, type FlowType } from "~/stores/useProfilingStore";
import { useSurveyStore } from "~/stores/useSurveyStore";
-
const flowsWithSmallFooter: FlowType[] = [
Flows.c_org,
Flows.cancer_pilot,
@@ -31,7 +30,7 @@ export const CancerSurveyThankYou = () => {
const { postCancerSurveyFormSubmission } = useApi();
- if (!submission_id || !channel) {
+ if (!submission_id) {
return ;
}
@@ -39,8 +38,13 @@ export const CancerSurveyThankYou = () => {
diff --git a/apps/eo_web/src/screens/Checkout.tsx b/apps/eo_web/src/screens/Checkout.tsx
index f0e099ab..4b55fcb7 100644
--- a/apps/eo_web/src/screens/Checkout.tsx
+++ b/apps/eo_web/src/screens/Checkout.tsx
@@ -1,4 +1,5 @@
import { useState } from "react";
+import * as Sentry from "@sentry/react";
import { useMutation } from "@tanstack/react-query";
import axios from "axios";
import { Navigate, useNavigate, useSearchParams } from "react-router-dom";
@@ -13,7 +14,6 @@ import { LayoutDefault } from "~/layouts";
import { ROUTES } from "~/router";
import { useProfilingStore } from "~/stores/useProfilingStore";
-
export const Checkout = () => {
const { usePayment } = useProfilingStore();
const [searchParams] = useSearchParams();
@@ -49,10 +49,19 @@ export const Checkout = () => {
},
onError: (result) => {
if (axios.isAxiosError(result)) {
- if (result.response?.status !== 200) {
- toast.error("Something went wrong");
- }
- } else {
+ Sentry.captureException(
+ new Error(
+ JSON.stringify({
+ ...{
+ profiling_submission_id: submissionId,
+ intro_submission_id: introQuestionSubmissionId,
+ flow,
+ channel,
+ },
+ ...result.response?.data,
+ }),
+ ),
+ );
toast.error("Something went wrong");
}
},
diff --git a/apps/eo_web/src/screens/ProfilingThankYou.tsx b/apps/eo_web/src/screens/ProfilingThankYou.tsx
index 2e961111..08b5b2a3 100644
--- a/apps/eo_web/src/screens/ProfilingThankYou.tsx
+++ b/apps/eo_web/src/screens/ProfilingThankYou.tsx
@@ -1,5 +1,5 @@
-import React from "react";
-import { Navigate, useSearchParams } from "react-router-dom";
+import React, { useEffect } from "react";
+import { useNavigate, useSearchParams } from "react-router-dom";
import { useApi } from "~/api/useApi";
import { ThankYou } from "~/components";
@@ -14,10 +14,10 @@ import { ROUTES } from "~/router";
import {
Flows,
useProfilingStore,
+ type Channel,
type FlowType,
} from "~/stores/useProfilingStore";
-
const flowsWithSmallFooter: FlowType[] = [
Flows.c_org,
Flows.cancer_pilot,
@@ -36,12 +36,15 @@ export const ProfilingThankYou = () => {
const { flow, account, usePayment, channel } = useProfilingStore();
const [searchParams] = useSearchParams();
const submission_id = searchParams.get("submission_id") ?? "";
+ const navigate = useNavigate();
const { checkoutComplete } = useApi();
- if (!submission_id && usePayment) {
- return ;
- }
+ useEffect(() => {
+ if (!submission_id && usePayment) {
+ navigate(ROUTES.userRolSelector);
+ }
+ }, [navigate, submission_id, usePayment]);
const goToWebApp = () => {
window.location.href = WEB_APP_URL;
@@ -51,13 +54,13 @@ export const ProfilingThankYou = () => {
You’ll be able to review your initial, personalized, clinician-approved
diff --git a/apps/eo_web/src/screens/Senior/SeniorSurveyThankYou.tsx b/apps/eo_web/src/screens/Senior/SeniorSurveyThankYou.tsx
index 1ac53601..ee6db8e6 100644
--- a/apps/eo_web/src/screens/Senior/SeniorSurveyThankYou.tsx
+++ b/apps/eo_web/src/screens/Senior/SeniorSurveyThankYou.tsx
@@ -6,9 +6,9 @@ import { FAQs } from "~/components/FAQs";
import { HowEOWorks } from "~/components/HowEOWorks";
import { LayoutDefault } from "~/layouts";
import { FooterFull } from "~/layouts/FooterFull";
+import { type Channel } from "~/stores/useProfilingStore";
import { useSurveyStore } from "~/stores/useSurveyStore";
-
export const SeniorSurveyThankYou = () => {
const { email, phase, channel } = useSurveyStore();
const [searchParams] = useSearchParams();
@@ -16,7 +16,7 @@ export const SeniorSurveyThankYou = () => {
const { postSeniorSurveyFormSubmission } = useApi();
- if (!submission_id || !channel) {
+ if (!submission_id) {
return ;
}
@@ -24,8 +24,13 @@ export const SeniorSurveyThankYou = () => {
diff --git a/apps/eo_web/src/stores/useSurveyStore.tsx b/apps/eo_web/src/stores/useSurveyStore.tsx
index b20078e6..90a7295d 100644
--- a/apps/eo_web/src/stores/useSurveyStore.tsx
+++ b/apps/eo_web/src/stores/useSurveyStore.tsx
@@ -1,8 +1,7 @@
import { create } from "zustand";
import { persist } from "zustand/middleware";
-import { type Channel, Flows, type FlowType } from "~/stores/useProfilingStore";
-
+import { Flows, type Channel, type FlowType } from "~/stores/useProfilingStore";
export interface SurveyStorageState {
phase: string;
@@ -17,19 +16,27 @@ export interface SurveyStorageState {
setEmail(email: string): void;
setFlow(flows: FlowType): void;
+
+ reset: () => void;
}
+const initialState = {
+ phase: "",
+ email: "",
+ flow: Flows.marketing_site,
+ channel: undefined,
+} as const;
export const useSurveyStore = create()(
persist(
(set, _get) => ({
- phase: "",
- email: "",
- flow: Flows.marketing_site,
- channel: undefined,
+ ...initialState,
setChannel: (channel: Channel) => set({ channel }),
setEmail: (email: string) => set({ email }),
setPhase: (phase: string) => set({ phase }),
setFlow: (flow: FlowType) => set({ flow }),
+ reset: () => {
+ set({ ...initialState, flow: _get().flow });
+ },
}),
{
name: "useSurveyStore",
diff --git a/packages/shared/package.json b/packages/shared/package.json
index 89af5e41..0ed30fb2 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -11,7 +11,7 @@
"type-check": "tsc --noEmit"
},
"dependencies": {
- "clsx": "^1.2.1",
+ "clsx": "^2.1.1",
"grapheme-splitter": "^1.0.4",
"tailwind-merge": "^1.6.2",
"zod": "^3.21.4"
diff --git a/packages/shared/src/tw.tsx b/packages/shared/src/tw.tsx
index 0c94fa9c..a0c51569 100644
--- a/packages/shared/src/tw.tsx
+++ b/packages/shared/src/tw.tsx
@@ -1,4 +1,5 @@
import clsx from "clsx";
import { twMerge } from "tailwind-merge";
-export const tw: typeof clsx = (...params) => twMerge(clsx(...params));
+export const tw: (...inputs: clsx.ClassValue[]) => string = (...params) =>
+ twMerge(clsx(params));
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 1ef188d4..bf4c5083 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -19,12 +19,12 @@
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-dropzone": "^14.2.3",
- "react-hook-form": "^7.43.9",
+ "react-hook-form": "^7.52.1",
"zod": "^3.21.4"
},
"devDependencies": {
"@eo/eslint-config": "*",
- "@tailwindcss/forms": "^0.5.3",
+ "@tailwindcss/forms": "^0.5.7",
"@tailwindcss/typography": "^0.5.9",
"@types/lodash": "^4.17.5",
"@types/node": "^18.15.11",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 459fb64a..3eb581e4 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -51,10 +51,13 @@ importers:
version: 1.7.13(react-dom@18.2.0)(react@18.2.0)
'@hookform/resolvers':
specifier: ^3.6.0
- version: 3.6.0(react-hook-form@7.43.9)
+ version: 3.6.0(react-hook-form@7.52.1)
'@react-oauth/google':
specifier: ^0.9.0
version: 0.9.1(react-dom@18.2.0)(react@18.2.0)
+ '@sentry/react':
+ specifier: ^8.13.0
+ version: 8.13.0(react@18.2.0)
'@tanstack/react-query':
specifier: ^4.29.3
version: 4.29.5(react-dom@18.2.0)(react@18.2.0)
@@ -83,11 +86,11 @@ importers:
specifier: ^6.10.0
version: 6.10.0(react-dom@18.2.0)(react@18.2.0)
react-toastify:
- specifier: ^9.1.1
- version: 9.1.2(react-dom@18.2.0)(react@18.2.0)
+ specifier: ^10.0.5
+ version: 10.0.5(react-dom@18.2.0)(react@18.2.0)
swiper:
- specifier: ^11.0.5
- version: 11.0.5
+ specifier: ^11.1.4
+ version: 11.1.4
uuid:
specifier: ^9.0.0
version: 9.0.0
@@ -216,8 +219,8 @@ importers:
packages/shared:
dependencies:
clsx:
- specifier: ^1.2.1
- version: 1.2.1
+ specifier: ^2.1.1
+ version: 2.1.1
grapheme-splitter:
specifier: ^1.0.4
version: 1.0.4
@@ -271,8 +274,8 @@ importers:
specifier: ^14.2.3
version: 14.2.3(react@18.2.0)
react-hook-form:
- specifier: ^7.43.9
- version: 7.43.9(react@18.2.0)
+ specifier: ^7.52.1
+ version: 7.52.1(react@18.2.0)
zod:
specifier: ^3.21.4
version: 3.21.4
@@ -281,8 +284,8 @@ importers:
specifier: '*'
version: link:../config/eslint
'@tailwindcss/forms':
- specifier: ^0.5.3
- version: 0.5.3(tailwindcss@3.3.1)
+ specifier: ^0.5.7
+ version: 0.5.7(tailwindcss@3.3.1)
'@tailwindcss/typography':
specifier: ^0.5.9
version: 0.5.9(tailwindcss@3.3.1)
@@ -1060,12 +1063,12 @@ packages:
react: 18.2.0
dev: false
- /@hookform/resolvers@3.6.0(react-hook-form@7.43.9):
+ /@hookform/resolvers@3.6.0(react-hook-form@7.52.1):
resolution: {integrity: sha512-UBcpyOX3+RR+dNnqBd0lchXpoL8p4xC21XP8H6Meb8uve5Br1GCnmg0PcBoKKqPKgGu9GHQ/oygcmPrQhetwqw==}
peerDependencies:
react-hook-form: ^7.0.0
dependencies:
- react-hook-form: 7.43.9(react@18.2.0)
+ react-hook-form: 7.52.1(react@18.2.0)
dev: false
/@humanwhocodes/config-array@0.11.8:
@@ -1240,6 +1243,91 @@ packages:
resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
dev: false
+ /@sentry-internal/browser-utils@8.13.0:
+ resolution: {integrity: sha512-lqq8BYbbs9KTlDuyB5NjdZB6P/llqQs32KUgaCQ/k5DFB4Zf56+BFHXObnMHxwx375X1uixtnEphagWZa+nsLQ==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ '@sentry/core': 8.13.0
+ '@sentry/types': 8.13.0
+ '@sentry/utils': 8.13.0
+ dev: false
+
+ /@sentry-internal/feedback@8.13.0:
+ resolution: {integrity: sha512-YyJ6SzpTonixvguAg0H9vkEp7Jq8ZeVY8M4n47ClR0+TtaAUp04ZhcJpHKF7PwBIAzc7DRr2XP112tmWgiVEcg==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ '@sentry/core': 8.13.0
+ '@sentry/types': 8.13.0
+ '@sentry/utils': 8.13.0
+ dev: false
+
+ /@sentry-internal/replay-canvas@8.13.0:
+ resolution: {integrity: sha512-lPlfWVIHX+gW4S8a/UOVutuqMyQhlkNUAay0W21MVhZJT5Mtj0p21D/Cz7nrOQRDIiLNq90KAGK2tLxx5NkiWA==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ '@sentry-internal/replay': 8.13.0
+ '@sentry/core': 8.13.0
+ '@sentry/types': 8.13.0
+ '@sentry/utils': 8.13.0
+ dev: false
+
+ /@sentry-internal/replay@8.13.0:
+ resolution: {integrity: sha512-DJ1jF/Pab0FH4SeCvSGCnGAu/s0wJvhBWM5VjQp7Jjmcfunp+R3vJibqU8gAVZU1nYRLaqprLdIXrSyP2Km8nQ==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ '@sentry-internal/browser-utils': 8.13.0
+ '@sentry/core': 8.13.0
+ '@sentry/types': 8.13.0
+ '@sentry/utils': 8.13.0
+ dev: false
+
+ /@sentry/browser@8.13.0:
+ resolution: {integrity: sha512-/tp7HZ5qjwDLtwooPMoexdAi2PG7gMNY0bHeMlwy20hs8mclC8RW8ZiJA6czXHfgnbmvxfrHaY53IJyz//JnlA==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ '@sentry-internal/browser-utils': 8.13.0
+ '@sentry-internal/feedback': 8.13.0
+ '@sentry-internal/replay': 8.13.0
+ '@sentry-internal/replay-canvas': 8.13.0
+ '@sentry/core': 8.13.0
+ '@sentry/types': 8.13.0
+ '@sentry/utils': 8.13.0
+ dev: false
+
+ /@sentry/core@8.13.0:
+ resolution: {integrity: sha512-N9Qg4ZGxZWp8eb2eUUHVVKgjBLtFIjS805nG92s6yJmkvOpKm6mLtcUaT/iDf3Hta6nG+xRkhbE3r+Z4cbXG8w==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ '@sentry/types': 8.13.0
+ '@sentry/utils': 8.13.0
+ dev: false
+
+ /@sentry/react@8.13.0(react@18.2.0):
+ resolution: {integrity: sha512-gz+aHZMcl6uvHkmLBGzMGjJJ+Vpl+W0VXJsKB9fdjZDDF5vJpgXTR9mwMEXJ9lKi+cY6tDe0+af+DA8BGJgw0Q==}
+ engines: {node: '>=14.18'}
+ peerDependencies:
+ react: ^16.14.0 || 17.x || 18.x || 19.x
+ dependencies:
+ '@sentry/browser': 8.13.0
+ '@sentry/core': 8.13.0
+ '@sentry/types': 8.13.0
+ '@sentry/utils': 8.13.0
+ hoist-non-react-statics: 3.3.2
+ react: 18.2.0
+ dev: false
+
+ /@sentry/types@8.13.0:
+ resolution: {integrity: sha512-r63s/H5gvQnQM9tTGBXz2xErUbxZALh4e2Lg/1aHj4zIvGLBjA2z5qWsh6TEZYbpmgAyGShLDr6+rWeUVf9yBQ==}
+ engines: {node: '>=14.18'}
+ dev: false
+
+ /@sentry/utils@8.13.0:
+ resolution: {integrity: sha512-PxV0v9VbGWH9zP37P5w2msLUFDr287nYjoY2XVF+RSolyiTs1CQNI5ZMUO3o4MsSac/dpXxjyrZXQd72t/jRYA==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ '@sentry/types': 8.13.0
+ dev: false
+
/@sindresorhus/is@0.14.0:
resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
engines: {node: '>=6'}
@@ -1252,8 +1340,8 @@ packages:
defer-to-connect: 1.1.3
dev: false
- /@tailwindcss/forms@0.5.3(tailwindcss@3.3.1):
- resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==}
+ /@tailwindcss/forms@0.5.7(tailwindcss@3.3.1):
+ resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==}
peerDependencies:
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1'
dependencies:
@@ -1885,6 +1973,11 @@ packages:
engines: {node: '>=6'}
dev: false
+ /clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+ dev: false
+
/color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
dependencies:
@@ -3065,6 +3158,12 @@ packages:
dependencies:
function-bind: 1.1.1
+ /hoist-non-react-statics@3.3.2:
+ resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+ dependencies:
+ react-is: 16.13.1
+ dev: false
+
/http-cache-semantics@4.1.1:
resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
dev: false
@@ -3999,11 +4098,11 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
- /react-hook-form@7.43.9(react@18.2.0):
- resolution: {integrity: sha512-AUDN3Pz2NSeoxQ7Hs6OhQhDr6gtF9YRuutGDwPQqhSUAHJSgGl2VeY3qN19MG0SucpjgDiuMJ4iC5T5uB+eaNQ==}
+ /react-hook-form@7.52.1(react@18.2.0):
+ resolution: {integrity: sha512-uNKIhaoICJ5KQALYZ4TOaOLElyM+xipord+Ha3crEFhTntdLvWZqVY49Wqd/0GiVCA/f9NjemLeiNPjG7Hpurg==}
engines: {node: '>=12.22.0'}
peerDependencies:
- react: ^16.8.0 || ^17 || ^18
+ react: ^16.8.0 || ^17 || ^18 || ^19
dependencies:
react: 18.2.0
dev: false
@@ -4052,13 +4151,13 @@ packages:
react: 18.2.0
dev: false
- /react-toastify@9.1.2(react-dom@18.2.0)(react@18.2.0):
- resolution: {integrity: sha512-PBfzXO5jMGEtdYR5jxrORlNZZe/EuOkwvwKijMatsZZm8IZwLj01YvobeJYNjFcA6uy6CVrx2fzL9GWbhWPTDA==}
+ /react-toastify@10.0.5(react-dom@18.2.0)(react@18.2.0):
+ resolution: {integrity: sha512-mNKt2jBXJg4O7pSdbNUfDdTsK9FIdikfsIE/yUCxbAEXl4HMyJaivrVFcn3Elvt5xvCQYhUZm+hqTIu1UXM3Pw==}
peerDependencies:
- react: '>=16'
- react-dom: '>=16'
+ react: '>=18'
+ react-dom: '>=18'
dependencies:
- clsx: 1.2.1
+ clsx: 2.1.1
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
@@ -4381,8 +4480,8 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- /swiper@11.0.5:
- resolution: {integrity: sha512-rhCwupqSyRnWrtNzWzemnBLMoyYuoDgGgspAm/8iBD3jCvAWycPLH4Z3TB0O5520DHLzMx94yUMH/B9Efpa48w==}
+ /swiper@11.1.4:
+ resolution: {integrity: sha512-1n7kbYJB2dFEpUHRFszq7gys/ofIBrMNibwTiMvPHwneKND/t9kImnHt6CfGPScMHgI+dWMbGTycCKGMoOO1KA==}
engines: {node: '>= 4.7.0'}
dev: false