From e17d80fc36b7c32bd6e8ba648013839596f51ad4 Mon Sep 17 00:00:00 2001 From: Ian Krieger <48930920+IanKrieger@users.noreply.github.com> Date: Mon, 17 Jul 2023 08:39:11 -0400 Subject: [PATCH 01/10] feat: allow for BAT payments via hosted checkout (#827) * wip: allow for BAT payments via hosted checkout * Allow for change of payment method in draft * fix: seperate payment method * fix: redirect to settings --- src/checkout/hooks/useCreatePaymentSession.ts | 3 ++ src/graphql/campaign.generated.tsx | 3 ++ src/graphql/campaign.graphql | 1 + src/graphql/types.ts | 1 + src/user/library/index.ts | 2 + src/user/views/adsManager/types/index.ts | 3 ++ .../components/campaign/BudgetSettings.tsx | 13 ++++++ .../campaign/fields/BudgetField.tsx | 34 ++++------------ .../campaign/fields/PaymentMethodField.tsx | 40 +++++++++++++++++++ .../completionForm/CompletionForm.tsx | 13 ++---- .../advanced/components/form/EditCampaign.tsx | 8 +--- .../components/form/components/BaseForm.tsx | 3 +- .../form/components/PaymentButton.tsx | 6 +-- 13 files changed, 83 insertions(+), 47 deletions(-) create mode 100644 src/user/views/adsManager/views/advanced/components/campaign/BudgetSettings.tsx create mode 100644 src/user/views/adsManager/views/advanced/components/campaign/fields/PaymentMethodField.tsx diff --git a/src/checkout/hooks/useCreatePaymentSession.ts b/src/checkout/hooks/useCreatePaymentSession.ts index a3368c1c..66f7c377 100644 --- a/src/checkout/hooks/useCreatePaymentSession.ts +++ b/src/checkout/hooks/useCreatePaymentSession.ts @@ -1,9 +1,11 @@ import { createPaymentSession } from "checkout/lib"; import { useCallback, useState } from "react"; import { useAdvertiser } from "auth/hooks/queries/useAdvertiser"; +import { useHistory } from "react-router-dom"; export function useCreatePaymentSession() { const [loading, setLoading] = useState(false); + const history = useHistory(); const { advertiser } = useAdvertiser(); const replaceSession = useCallback(async (campaignId: string) => { @@ -15,6 +17,7 @@ export function useCreatePaymentSession() { .catch((e) => { alert("Unable to create payment session. Please try again."); setLoading(false); + history.push(`/user/main/adsmanager/advanced/${campaignId}/settings`); }); }, []); diff --git a/src/graphql/campaign.generated.tsx b/src/graphql/campaign.generated.tsx index 69bf2fdc..0cf619a8 100644 --- a/src/graphql/campaign.generated.tsx +++ b/src/graphql/campaign.generated.tsx @@ -28,6 +28,7 @@ export type CampaignFragment = { paymentType: Types.PaymentType; dayProportion?: number | null; stripePaymentId?: string | null; + hasPaymentIntent?: boolean | null; geoTargets?: Array<{ __typename?: "Geocode"; code: string; @@ -196,6 +197,7 @@ export type LoadCampaignQuery = { paymentType: Types.PaymentType; dayProportion?: number | null; stripePaymentId?: string | null; + hasPaymentIntent?: boolean | null; geoTargets?: Array<{ __typename?: "Geocode"; code: string; @@ -369,6 +371,7 @@ export const CampaignFragmentDoc = gql` dayProportion stripePaymentId paymentType + hasPaymentIntent geoTargets { code name diff --git a/src/graphql/campaign.graphql b/src/graphql/campaign.graphql index 7a4bf608..1ca98e5d 100644 --- a/src/graphql/campaign.graphql +++ b/src/graphql/campaign.graphql @@ -22,6 +22,7 @@ fragment Campaign on Campaign { dayProportion stripePaymentId paymentType + hasPaymentIntent geoTargets { code name diff --git a/src/graphql/types.ts b/src/graphql/types.ts index e79df52a..bea17794 100644 --- a/src/graphql/types.ts +++ b/src/graphql/types.ts @@ -337,6 +337,7 @@ export type NotificationPayloadInput = { export enum PaymentType { ManualBat = "MANUAL_BAT", Netsuite = "NETSUITE", + Radom = "RADOM", Stripe = "STRIPE", } diff --git a/src/user/library/index.ts b/src/user/library/index.ts index f95cdde1..b8f146c8 100644 --- a/src/user/library/index.ts +++ b/src/user/library/index.ts @@ -160,6 +160,7 @@ export function editCampaignValues( }; }), advertiserId, + hasPaymentIntent: campaign.hasPaymentIntent ?? false, creatives: creativeList(ads).map((a) => a.id!), newCreative: initialCreative, isCreating: false, @@ -219,6 +220,7 @@ export function transformEditForm( startAt: form.startAt, state: form.state, type: form.type, + paymentType: form.paymentType, adSets: form.adSets.map((adSet) => ({ id: adSet.id, segments: adSet.segments.map((v) => ({ code: v.code, name: v.name })), diff --git a/src/user/views/adsManager/types/index.ts b/src/user/views/adsManager/types/index.ts index 2cc37ba9..c248e8a6 100644 --- a/src/user/views/adsManager/types/index.ts +++ b/src/user/views/adsManager/types/index.ts @@ -32,7 +32,9 @@ export type CampaignForm = { price: number; billingType: Billing; pacingStrategy: CampaignPacingStrategies; + hasPaymentIntent: boolean; stripePaymentId?: string | null; + radomPaymentId?: string | null; paymentType: PaymentType; }; @@ -109,6 +111,7 @@ export const initialCampaign = (advertiser: IAdvertiser): CampaignForm => { validateStart: true, isCreating: false, budget: MIN_PER_CAMPAIGN, + hasPaymentIntent: false, currency: "USD", dailyBudget: MIN_PER_CAMPAIGN, dailyCap: 1, diff --git a/src/user/views/adsManager/views/advanced/components/campaign/BudgetSettings.tsx b/src/user/views/adsManager/views/advanced/components/campaign/BudgetSettings.tsx new file mode 100644 index 00000000..b1036228 --- /dev/null +++ b/src/user/views/adsManager/views/advanced/components/campaign/BudgetSettings.tsx @@ -0,0 +1,13 @@ +import React from "react"; +import { BudgetField } from "user/views/adsManager/views/advanced/components/campaign/fields/BudgetField"; +import { PaymentMethodField } from "user/views/adsManager/views/advanced/components/campaign/fields/PaymentMethodField"; + +export function BudgetSettings(props: { isEdit: boolean }) { + return ( + <> + + + + + ); +} diff --git a/src/user/views/adsManager/views/advanced/components/campaign/fields/BudgetField.tsx b/src/user/views/adsManager/views/advanced/components/campaign/fields/BudgetField.tsx index 4387bf4a..e2818c5c 100644 --- a/src/user/views/adsManager/views/advanced/components/campaign/fields/BudgetField.tsx +++ b/src/user/views/adsManager/views/advanced/components/campaign/fields/BudgetField.tsx @@ -1,4 +1,4 @@ -import { Box, Divider, InputAdornment, Stack, Typography } from "@mui/material"; +import { InputAdornment, Stack, Typography } from "@mui/material"; import { FormikRadioControl, FormikTextField } from "form/FormikHelpers"; import React, { useEffect, useState } from "react"; import { useFormikContext } from "formik"; @@ -6,7 +6,6 @@ import { CampaignForm } from "../../../../../types"; import { differenceInHours } from "date-fns"; import { MIN_PER_CAMPAIGN, MIN_PER_DAY } from "validation/CampaignSchema"; import { useAdvertiser } from "auth/hooks/queries/useAdvertiser"; -import { PaymentType } from "graphql/types"; import _ from "lodash"; import { CardContainer } from "components/Card/CardContainer"; @@ -62,7 +61,11 @@ export function BudgetField({ isEdit }: Props) { : undefined } error={!!errors.budget || !!errors.dailyBudget} - disabled={isEdit && !advertiser.selfServiceSetPrice} + disabled={ + isEdit && + !advertiser.selfServiceSetPrice && + values.state !== "draft" + } /> {!advertiser.selfServiceSetPrice ? ( @@ -85,7 +88,7 @@ export function BudgetField({ isEdit }: Props) { $ ), }} - disabled={isEdit} + disabled={isEdit && values.state !== "draft"} /> )} - - - - Payment Method - - - Prepayment of the campaign budget is required before your campaign - can begin.{" "} - {values.paymentType !== PaymentType.Stripe - ? "We will contact you to arrange payment after you submit your campaign for approval." - : ""} - - - ); diff --git a/src/user/views/adsManager/views/advanced/components/campaign/fields/PaymentMethodField.tsx b/src/user/views/adsManager/views/advanced/components/campaign/fields/PaymentMethodField.tsx new file mode 100644 index 00000000..d3c8252d --- /dev/null +++ b/src/user/views/adsManager/views/advanced/components/campaign/fields/PaymentMethodField.tsx @@ -0,0 +1,40 @@ +import { Stack, Typography } from "@mui/material"; +import { FormikRadioControl } from "form/FormikHelpers"; +import { PaymentType } from "graphql/types"; +import React from "react"; +import { useFormikContext } from "formik"; +import { CampaignForm } from "user/views/adsManager/types"; +import { useAdvertiser } from "auth/hooks/queries/useAdvertiser"; +import { CardContainer } from "components/Card/CardContainer"; + +interface Props { + isEdit: boolean; +} + +export function PaymentMethodField({ isEdit }: Props) { + const { values } = useFormikContext(); + const { advertiser } = useAdvertiser(); + + if (advertiser.selfServiceSetPrice) { + return null; + } + + return ( + + + + Prepayment of the campaign budget is required before your campaign can + begin. + + + + + ); +} diff --git a/src/user/views/adsManager/views/advanced/components/completionForm/CompletionForm.tsx b/src/user/views/adsManager/views/advanced/components/completionForm/CompletionForm.tsx index 145c2e86..549d5cf8 100644 --- a/src/user/views/adsManager/views/advanced/components/completionForm/CompletionForm.tsx +++ b/src/user/views/adsManager/views/advanced/components/completionForm/CompletionForm.tsx @@ -1,8 +1,7 @@ import React, { useState } from "react"; import { useHistory, useParams } from "react-router-dom"; -import { Box, Card, Container, Stack, Typography } from "@mui/material"; -import present from "../../../../../../../../present.png"; +import { Card, Container, Stack, Typography } from "@mui/material"; import { LoadingButton } from "@mui/lab"; import { useValidatePaymentSession } from "checkout/hooks/useValidatePaymentSession"; @@ -25,21 +24,17 @@ export function CompletionForm() { }); return ( - + - - - - - Congratulations! + Congratulations! 🎉 {params.mode === "edit" && ( diff --git a/src/user/views/adsManager/views/advanced/components/form/EditCampaign.tsx b/src/user/views/adsManager/views/advanced/components/form/EditCampaign.tsx index 217cad1f..017e84db 100644 --- a/src/user/views/adsManager/views/advanced/components/form/EditCampaign.tsx +++ b/src/user/views/adsManager/views/advanced/components/form/EditCampaign.tsx @@ -12,7 +12,6 @@ import { useHistory, useParams } from "react-router-dom"; import { BaseForm } from "./components/BaseForm"; import { useAdvertiser } from "auth/hooks/queries/useAdvertiser"; import { useCreatePaymentSession } from "checkout/hooks/useCreatePaymentSession"; -import { PaymentType } from "graphql/types"; import { ErrorDetail } from "components/Error/ErrorDetail"; interface Params { @@ -36,11 +35,7 @@ export function EditCampaign() { const [mutation] = useUpdateCampaignMutation({ onCompleted(data) { - const campaign = initialData?.campaign; - if ( - campaign?.stripePaymentId || - campaign?.paymentType !== PaymentType.Stripe - ) { + if (initialData?.campaign?.hasPaymentIntent) { history.push( `/user/main/complete/edit?referenceId=${data.updateCampaign.id}`, ); @@ -67,7 +62,6 @@ export function EditCampaign() { } const initialValues = editCampaignValues(initialData.campaign, advertiser.id); - return ( , + component: , }, { label: "Ads", diff --git a/src/user/views/adsManager/views/advanced/components/form/components/PaymentButton.tsx b/src/user/views/adsManager/views/advanced/components/form/components/PaymentButton.tsx index 9df9272b..ae64a0fc 100644 --- a/src/user/views/adsManager/views/advanced/components/form/components/PaymentButton.tsx +++ b/src/user/views/adsManager/views/advanced/components/form/components/PaymentButton.tsx @@ -6,15 +6,13 @@ import { PaymentType } from "graphql/types"; export function PaymentButton(props: { isEdit: boolean }) { const { values } = useFormikContext(); - const hasPaymentIntent = - values.paymentType !== PaymentType.Stripe || values.stripePaymentId; const paymentText = "Make payment & submit for approval"; return ( Date: Wed, 19 Jul 2023 13:23:23 -0400 Subject: [PATCH 02/10] chore: optimize imports (#839) * chore: optimize imports * fix: ignore codegen --- src/auth/components/AdvertiserAgreed.tsx | 1 - src/auth/hooks/mutations/useGetLink.ts | 3 +-- src/auth/views/AuthVerify.tsx | 3 +-- src/auth/views/Login.tsx | 2 +- src/checkout/hooks/useValidatePaymentSession.ts | 1 - src/components/Box/BoxContainer.tsx | 2 +- src/components/Collapse/CollapseBox.tsx | 2 -- src/components/Country/CountryPicker.tsx | 2 +- src/components/EnhancedTable/renderers.tsx | 2 -- src/components/Error/ErrorDetail.tsx | 2 +- src/components/Steps/NextAndBack.tsx | 2 +- src/components/Steps/StepDrawer.tsx | 7 ++----- src/components/Steps/StepsButton.tsx | 10 +--------- src/components/Url/use-url-validation.ts | 2 +- src/form/FormikHelpers.tsx | 1 - src/graphql/types.ts | 11 ++--------- src/user/adSet/AdSetList.tsx | 1 - .../analyticsOverview/components/EngagementHeader.tsx | 3 +-- .../analyticsOverview/components/LiveFeed.tsx | 2 +- .../analyticsOverview/components/MetricFilter.tsx | 2 +- .../analyticsOverview/lib/overview.library.ts | 5 +---- .../reports/campaign/EngagementsOverview.tsx | 1 - .../analyticsOverview/reports/os/OsOverview.tsx | 8 +------- src/user/hooks/useAdvertiserCreatives.ts | 2 +- src/user/library/index.test.ts | 2 +- src/user/settings/Settings.tsx | 1 - .../advanced/components/adSet/fields/AdSetAds.tsx | 2 +- .../components/adSet/fields/ConversionField.tsx | 2 +- .../advanced/components/adSet/fields/PickerFields.tsx | 2 +- .../components/campaign/fields/LocationField.tsx | 2 +- .../advanced/components/form/components/BaseForm.tsx | 1 - .../components/form/components/PaymentButton.tsx | 1 - 32 files changed, 24 insertions(+), 66 deletions(-) diff --git a/src/auth/components/AdvertiserAgreed.tsx b/src/auth/components/AdvertiserAgreed.tsx index 45b7b4f0..1b6b448c 100644 --- a/src/auth/components/AdvertiserAgreed.tsx +++ b/src/auth/components/AdvertiserAgreed.tsx @@ -1,7 +1,6 @@ import React, { useState } from "react"; import Typography from "@mui/material/Typography"; import { - Box, Card, Checkbox, Container, diff --git a/src/auth/hooks/mutations/useGetLink.ts b/src/auth/hooks/mutations/useGetLink.ts index 396f29c8..46039b7f 100644 --- a/src/auth/hooks/mutations/useGetLink.ts +++ b/src/auth/hooks/mutations/useGetLink.ts @@ -1,6 +1,5 @@ import { useCallback, useState } from "react"; -import { useAuthContext } from "auth/context/auth.hook"; -import { getCredentials, getLink } from "auth/lib"; +import { getLink } from "auth/lib"; interface Options { onError?: (msg: string) => void; diff --git a/src/auth/views/AuthVerify.tsx b/src/auth/views/AuthVerify.tsx index e8d2f58f..49a5e97e 100644 --- a/src/auth/views/AuthVerify.tsx +++ b/src/auth/views/AuthVerify.tsx @@ -1,9 +1,8 @@ import { AuthContainer } from "auth/views/components/AuthContainer"; import { useAuthorize } from "auth/hooks/queries/useAuthorize"; import React from "react"; -import { useHistory } from "react-router-dom"; +import { Link as RouterLink, useHistory } from "react-router-dom"; import { CircularProgress, Link, Stack, Typography } from "@mui/material"; -import { Link as RouterLink } from "react-router-dom"; import VerifiedIcon from "@mui/icons-material/Verified"; import CancelOutlinedIcon from "@mui/icons-material/CancelOutlined"; diff --git a/src/auth/views/Login.tsx b/src/auth/views/Login.tsx index 3c9bb3c8..d452536c 100644 --- a/src/auth/views/Login.tsx +++ b/src/auth/views/Login.tsx @@ -1,7 +1,7 @@ import { Alert, Link, TextField, Typography } from "@mui/material"; import { LoadingButton } from "@mui/lab"; import React, { useState } from "react"; -import { useHistory, Link as RouterLink } from "react-router-dom"; +import { Link as RouterLink, useHistory } from "react-router-dom"; import { useSignIn } from "auth/hooks/mutations/useSignIn"; import { AuthContainer } from "auth/views/components/AuthContainer"; diff --git a/src/checkout/hooks/useValidatePaymentSession.ts b/src/checkout/hooks/useValidatePaymentSession.ts index e49e2cd9..c1b877d1 100644 --- a/src/checkout/hooks/useValidatePaymentSession.ts +++ b/src/checkout/hooks/useValidatePaymentSession.ts @@ -1,5 +1,4 @@ import { useEffect, useState } from "react"; -import { buildAdServerEndpoint } from "util/environment"; import { fetchPaymentSession } from "checkout/lib"; interface Props { diff --git a/src/components/Box/BoxContainer.tsx b/src/components/Box/BoxContainer.tsx index 1d97c38f..8983f85a 100644 --- a/src/components/Box/BoxContainer.tsx +++ b/src/components/Box/BoxContainer.tsx @@ -1,5 +1,5 @@ import React, { PropsWithChildren } from "react"; -import { Box, Container, Typography } from "@mui/material"; +import { Box, Typography } from "@mui/material"; export function BoxContainer( props: { header?: React.ReactNode } & PropsWithChildren, diff --git a/src/components/Collapse/CollapseBox.tsx b/src/components/Collapse/CollapseBox.tsx index 3fb06d8f..1fe90905 100644 --- a/src/components/Collapse/CollapseBox.tsx +++ b/src/components/Collapse/CollapseBox.tsx @@ -2,8 +2,6 @@ import { Accordion, AccordionDetails, AccordionSummary, - Alert, - AlertTitle, Box, Typography, } from "@mui/material"; diff --git a/src/components/Country/CountryPicker.tsx b/src/components/Country/CountryPicker.tsx index c6c1b90d..073073dd 100644 --- a/src/components/Country/CountryPicker.tsx +++ b/src/components/Country/CountryPicker.tsx @@ -1,4 +1,4 @@ -import { Alert, Autocomplete, TextField } from "@mui/material"; +import { Autocomplete, TextField } from "@mui/material"; import { useField } from "formik"; import React from "react"; import { useCountries } from "components/Country/useCountries"; diff --git a/src/components/EnhancedTable/renderers.tsx b/src/components/EnhancedTable/renderers.tsx index ca679f6e..35bb89f1 100644 --- a/src/components/EnhancedTable/renderers.tsx +++ b/src/components/EnhancedTable/renderers.tsx @@ -12,12 +12,10 @@ import { } from "graphql/campaign.generated"; import { AdvertiserCampaignsDocument } from "graphql/advertiser.generated"; import { - AdSetFragment, useUpdateAdMutation, useUpdateAdSetMutation, } from "graphql/ad-set.generated"; import { OnOff } from "../Switch/OnOff"; -import { CampaignSource } from "graphql/types"; import { AdDetails } from "user/ads/AdList"; import { displayFromCampaignState } from "util/displayState"; import { AdSetDetails } from "user/adSet/AdSetList"; diff --git a/src/components/Error/ErrorDetail.tsx b/src/components/Error/ErrorDetail.tsx index 88ee0f5e..b79cffd3 100644 --- a/src/components/Error/ErrorDetail.tsx +++ b/src/components/Error/ErrorDetail.tsx @@ -1,4 +1,4 @@ -import { ApolloError, ServerError, ServerParseError } from "@apollo/client"; +import { ApolloError } from "@apollo/client"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import { Accordion, diff --git a/src/components/Steps/NextAndBack.tsx b/src/components/Steps/NextAndBack.tsx index 3a16b8ba..69427d67 100644 --- a/src/components/Steps/NextAndBack.tsx +++ b/src/components/Steps/NextAndBack.tsx @@ -1,4 +1,4 @@ -import { Button, Stack, stepClasses } from "@mui/material"; +import { Button, Stack } from "@mui/material"; import React from "react"; interface Props { diff --git a/src/components/Steps/StepDrawer.tsx b/src/components/Steps/StepDrawer.tsx index c124564d..8c41f6a3 100644 --- a/src/components/Steps/StepDrawer.tsx +++ b/src/components/Steps/StepDrawer.tsx @@ -1,20 +1,17 @@ -import React, { PropsWithChildren, useRef, useState } from "react"; +import React, { PropsWithChildren, useRef } from "react"; import { Box, - Button, CssBaseline, Drawer, - ListItemButton, Stack, Step, StepButton, StepContent, Stepper, Toolbar, - Typography, } from "@mui/material"; import { NextAndBack } from "components/Steps/NextAndBack"; -import { Link as RouterLink, useHistory } from "react-router-dom"; +import { useHistory } from "react-router-dom"; import { ActionButtons } from "components/Steps/ActionButtons"; const drawerWidth = 250; diff --git a/src/components/Steps/StepsButton.tsx b/src/components/Steps/StepsButton.tsx index b7c3ef64..9c2dea86 100644 --- a/src/components/Steps/StepsButton.tsx +++ b/src/components/Steps/StepsButton.tsx @@ -1,12 +1,4 @@ -import { - Box, - Button, - Stack, - Step, - StepLabel, - Stepper, - Typography, -} from "@mui/material"; +import { Box, Step, StepLabel, Stepper } from "@mui/material"; import React, { useState } from "react"; import { NextAndBack } from "components/Steps/NextAndBack"; diff --git a/src/components/Url/use-url-validation.ts b/src/components/Url/use-url-validation.ts index badf14f1..2dca4d1a 100644 --- a/src/components/Url/use-url-validation.ts +++ b/src/components/Url/use-url-validation.ts @@ -1,6 +1,6 @@ import { - ValidateTargetUrlQuery, useValidateTargetUrlLazyQuery, + ValidateTargetUrlQuery, } from "graphql/url.generated"; import _ from "lodash"; import { useEffect, useMemo, useState } from "react"; diff --git a/src/form/FormikHelpers.tsx b/src/form/FormikHelpers.tsx index f2c04b7b..b9ef49cd 100644 --- a/src/form/FormikHelpers.tsx +++ b/src/form/FormikHelpers.tsx @@ -4,7 +4,6 @@ import React, { useEffect, } from "react"; import { - Button, FormControl, FormControlLabel, FormHelperText, diff --git a/src/graphql/types.ts b/src/graphql/types.ts index bea17794..7edde713 100644 --- a/src/graphql/types.ts +++ b/src/graphql/types.ts @@ -107,9 +107,8 @@ export type CreateAdInput = { creativeSetId?: InputMaybe; id?: InputMaybe; /** The price in the owning campaign's currency for each single confirmation of the priceType specified. Note therefore that the caller is responsible for dividing cost-per-mille by 1000. */ - price?: InputMaybe; - priceType?: InputMaybe; - prices?: InputMaybe>; + price: Scalars["Numeric"]; + priceType: ConfirmationType; state?: InputMaybe; webhooks?: InputMaybe>; }; @@ -376,7 +375,6 @@ export type UpdateAdInput = { creativeId?: InputMaybe; creativeSetId?: InputMaybe; id?: InputMaybe; - prices?: InputMaybe>; state?: InputMaybe; webhooks?: InputMaybe>; }; @@ -531,11 +529,6 @@ export type WallpaperInput = { imageUrl: Scalars["String"]; }; -export type CreatePriceInput = { - amount: Scalars["Float"]; - type: Scalars["String"]; -}; - export type CreateWebhookInput = { type: Scalars["String"]; url: Scalars["String"]; diff --git a/src/user/adSet/AdSetList.tsx b/src/user/adSet/AdSetList.tsx index 17a0074a..11da8a1e 100644 --- a/src/user/adSet/AdSetList.tsx +++ b/src/user/adSet/AdSetList.tsx @@ -3,7 +3,6 @@ import { ColumnDescriptor, StandardRenderers } from "components/EnhancedTable"; import { Chip } from "@mui/material"; import { Status } from "components/Campaigns/Status"; import _ from "lodash"; -import { isAfterEndDate } from "util/isAfterEndDate"; import { adSetOnOffState } from "components/EnhancedTable/renderers"; import { CampaignAdsFragment } from "graphql/campaign.generated"; import { CampaignSource } from "graphql/types"; diff --git a/src/user/analytics/analyticsOverview/components/EngagementHeader.tsx b/src/user/analytics/analyticsOverview/components/EngagementHeader.tsx index 15c31e98..cadf93c9 100644 --- a/src/user/analytics/analyticsOverview/components/EngagementHeader.tsx +++ b/src/user/analytics/analyticsOverview/components/EngagementHeader.tsx @@ -1,6 +1,5 @@ import React from "react"; -import { Box, Button, Stack, Tab, Tabs, Typography } from "@mui/material"; -import { EngagementChartType } from "../types"; +import { Box, Button, Stack, Typography } from "@mui/material"; import { Status } from "components/Campaigns/Status"; import { CampaignSummaryFragment } from "graphql/campaign.generated"; diff --git a/src/user/analytics/analyticsOverview/components/LiveFeed.tsx b/src/user/analytics/analyticsOverview/components/LiveFeed.tsx index a42b4ffc..63b99784 100644 --- a/src/user/analytics/analyticsOverview/components/LiveFeed.tsx +++ b/src/user/analytics/analyticsOverview/components/LiveFeed.tsx @@ -1,5 +1,5 @@ import React from "react"; -import { Box, Chip, Stack, Typography } from "@mui/material"; +import { Box, Chip, Typography } from "@mui/material"; import { OverviewDetail, StatsMetric } from "../types"; interface OverviewProps extends OverviewDetail { diff --git a/src/user/analytics/analyticsOverview/components/MetricFilter.tsx b/src/user/analytics/analyticsOverview/components/MetricFilter.tsx index 98d40aaf..eb4f0c61 100644 --- a/src/user/analytics/analyticsOverview/components/MetricFilter.tsx +++ b/src/user/analytics/analyticsOverview/components/MetricFilter.tsx @@ -1,5 +1,5 @@ import MetricSelect from "user/analytics/analyticsOverview/components/MetricSelect"; -import React, { useState } from "react"; +import React from "react"; import { Box, Stack, Switch, Tooltip, Typography } from "@mui/material"; import { decideValueAttribute } from "user/analytics/analyticsOverview/lib/overview.library"; import { Metrics, StatsMetric } from "user/analytics/analyticsOverview/types"; diff --git a/src/user/analytics/analyticsOverview/lib/overview.library.ts b/src/user/analytics/analyticsOverview/lib/overview.library.ts index a6dcbf5f..3290efba 100644 --- a/src/user/analytics/analyticsOverview/lib/overview.library.ts +++ b/src/user/analytics/analyticsOverview/lib/overview.library.ts @@ -7,10 +7,7 @@ import { StatsMetric, Tooltip, } from "user/analytics/analyticsOverview/types"; -import { - CampaignWithEngagementsFragment, - EngagementFragment, -} from "graphql/analytics-overview.generated"; +import { EngagementFragment } from "graphql/analytics-overview.generated"; type MetricDataSet = { metric1DataSet: number[][]; diff --git a/src/user/analytics/analyticsOverview/reports/campaign/EngagementsOverview.tsx b/src/user/analytics/analyticsOverview/reports/campaign/EngagementsOverview.tsx index cad296dd..6d7d41b7 100644 --- a/src/user/analytics/analyticsOverview/reports/campaign/EngagementsOverview.tsx +++ b/src/user/analytics/analyticsOverview/reports/campaign/EngagementsOverview.tsx @@ -17,7 +17,6 @@ import EngagementHeader from "../../components/EngagementHeader"; import LiveFeed from "../../components/LiveFeed"; import { CampaignFormat } from "graphql/types"; import { ErrorDetail } from "components/Error/ErrorDetail"; -import { DashboardButton } from "components/Button/DashboardButton"; import { ApolloError } from "@apollo/client"; import _ from "lodash"; diff --git a/src/user/analytics/analyticsOverview/reports/os/OsOverview.tsx b/src/user/analytics/analyticsOverview/reports/os/OsOverview.tsx index 6b525ec7..f2f17a81 100644 --- a/src/user/analytics/analyticsOverview/reports/os/OsOverview.tsx +++ b/src/user/analytics/analyticsOverview/reports/os/OsOverview.tsx @@ -1,15 +1,9 @@ import { Box, Stack } from "@mui/material"; import React from "react"; -import { - CampaignWithEngagementsFragment, - EngagementFragment, -} from "graphql/analytics-overview.generated"; +import { EngagementFragment } from "graphql/analytics-overview.generated"; import { mapOsStats, processOs } from "../../lib/os.library"; import { OsPieChart } from "./components/OsPieChart"; import { OsBarChart } from "./components/OsBarChart"; -import { CampaignFragment } from "graphql/campaign.generated"; -import { CampaignFormat } from "graphql/types"; -import { CardContainer } from "components/Card/CardContainer"; interface Props { engagements: EngagementFragment[]; diff --git a/src/user/hooks/useAdvertiserCreatives.ts b/src/user/hooks/useAdvertiserCreatives.ts index b1d08107..3117fe85 100644 --- a/src/user/hooks/useAdvertiserCreatives.ts +++ b/src/user/hooks/useAdvertiserCreatives.ts @@ -2,7 +2,7 @@ import { useAdvertiserCreativesQuery } from "graphql/creative.generated"; import { useAdvertiser } from "auth/hooks/queries/useAdvertiser"; import { useFormikContext } from "formik"; import { CampaignForm, Creative } from "user/views/adsManager/types"; -import _, { flatMap } from "lodash"; +import _ from "lodash"; export function useAdvertiserCreatives(): Creative[] { const { advertiser } = useAdvertiser(); diff --git a/src/user/library/index.test.ts b/src/user/library/index.test.ts index 2e7d432a..873cd2bb 100644 --- a/src/user/library/index.test.ts +++ b/src/user/library/index.test.ts @@ -1,5 +1,5 @@ import { CampaignFragment } from "graphql/campaign.generated"; -import { it, describe, expect } from "vitest"; +import { describe, expect, it } from "vitest"; import { editCampaignValues, transformCreative } from "."; import { CampaignFormat, diff --git a/src/user/settings/Settings.tsx b/src/user/settings/Settings.tsx index cdb88aa6..7ef3f851 100644 --- a/src/user/settings/Settings.tsx +++ b/src/user/settings/Settings.tsx @@ -6,7 +6,6 @@ import { Box, Button, Container, - Divider, FormControl, InputLabel, MenuItem, diff --git a/src/user/views/adsManager/views/advanced/components/adSet/fields/AdSetAds.tsx b/src/user/views/adsManager/views/advanced/components/adSet/fields/AdSetAds.tsx index c2539809..ff3a2329 100644 --- a/src/user/views/adsManager/views/advanced/components/adSet/fields/AdSetAds.tsx +++ b/src/user/views/adsManager/views/advanced/components/adSet/fields/AdSetAds.tsx @@ -1,6 +1,6 @@ import { CardContainer } from "components/Card/CardContainer"; import { Autocomplete, Checkbox, TextField } from "@mui/material"; -import React, { useEffect } from "react"; +import React from "react"; import { useRecentlyCreatedAdvertiserCreatives } from "user/hooks/useAdvertiserCreatives"; import CheckBoxOutlineBlankIcon from "@mui/icons-material/CheckBoxOutlineBlank"; import CheckBoxIcon from "@mui/icons-material/CheckBox"; diff --git a/src/user/views/adsManager/views/advanced/components/adSet/fields/ConversionField.tsx b/src/user/views/adsManager/views/advanced/components/adSet/fields/ConversionField.tsx index dd7a04c9..17f93b7e 100644 --- a/src/user/views/adsManager/views/advanced/components/adSet/fields/ConversionField.tsx +++ b/src/user/views/adsManager/views/advanced/components/adSet/fields/ConversionField.tsx @@ -1,4 +1,4 @@ -import { Divider, Link, Stack, Typography } from "@mui/material"; +import { Link, Stack, Typography } from "@mui/material"; import { ConversionFields } from "components/Conversion/ConversionFields"; import React from "react"; import { FieldArray, useField } from "formik"; diff --git a/src/user/views/adsManager/views/advanced/components/adSet/fields/PickerFields.tsx b/src/user/views/adsManager/views/advanced/components/adSet/fields/PickerFields.tsx index 1850174d..f8b0a267 100644 --- a/src/user/views/adsManager/views/advanced/components/adSet/fields/PickerFields.tsx +++ b/src/user/views/adsManager/views/advanced/components/adSet/fields/PickerFields.tsx @@ -1,4 +1,4 @@ -import { Divider, Typography } from "@mui/material"; +import { Typography } from "@mui/material"; import { SegmentPicker } from "components/Segment/SegmentPicker"; import { PlatformPicker } from "components/Platform/PlatformPicker"; import React from "react"; diff --git a/src/user/views/adsManager/views/advanced/components/campaign/fields/LocationField.tsx b/src/user/views/adsManager/views/advanced/components/campaign/fields/LocationField.tsx index c0c9d660..edc591e2 100644 --- a/src/user/views/adsManager/views/advanced/components/campaign/fields/LocationField.tsx +++ b/src/user/views/adsManager/views/advanced/components/campaign/fields/LocationField.tsx @@ -1,4 +1,4 @@ -import { Box, Divider, Typography } from "@mui/material"; +import { Typography } from "@mui/material"; import { LocationPicker } from "components/Location/LocationPicker"; import React from "react"; import { CardContainer } from "components/Card/CardContainer"; diff --git a/src/user/views/adsManager/views/advanced/components/form/components/BaseForm.tsx b/src/user/views/adsManager/views/advanced/components/form/components/BaseForm.tsx index 08c60e57..95ec59d5 100644 --- a/src/user/views/adsManager/views/advanced/components/form/components/BaseForm.tsx +++ b/src/user/views/adsManager/views/advanced/components/form/components/BaseForm.tsx @@ -2,7 +2,6 @@ import { Form } from "formik"; import { Review } from "../../review/Review"; import React from "react"; import { CampaignSettings } from "user/views/adsManager/views/advanced/components/campaign/CampaignSettings"; -import { BudgetField } from "user/views/adsManager/views/advanced/components/campaign/fields/BudgetField"; import { StepDrawer } from "components/Steps/StepDrawer"; import { PaymentButton } from "user/views/adsManager/views/advanced/components/form/components/PaymentButton"; import { NewAd } from "user/ads/NewAd"; diff --git a/src/user/views/adsManager/views/advanced/components/form/components/PaymentButton.tsx b/src/user/views/adsManager/views/advanced/components/form/components/PaymentButton.tsx index ae64a0fc..41fd62ec 100644 --- a/src/user/views/adsManager/views/advanced/components/form/components/PaymentButton.tsx +++ b/src/user/views/adsManager/views/advanced/components/form/components/PaymentButton.tsx @@ -2,7 +2,6 @@ import { FormikSubmitButton } from "form/FormikHelpers"; import React from "react"; import { useFormikContext } from "formik"; import { CampaignForm } from "user/views/adsManager/types"; -import { PaymentType } from "graphql/types"; export function PaymentButton(props: { isEdit: boolean }) { const { values } = useFormikContext(); From e37d7dfbe6f662da52d1cda493786af5cc6f5078 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Jul 2023 11:58:45 -0400 Subject: [PATCH 03/10] fix(deps): update all non-major dependencies (#811) * fix(deps): update all non-major dependencies * fix: handle implicit any --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Ian Krieger --- package-lock.json | 1012 ++++++++--------- package.json | 36 +- src/form/FormikHelpers.tsx | 4 +- .../advanced/components/adSet/NewAdSet.tsx | 8 +- .../adSet/fields/ConversionField.tsx | 8 +- 5 files changed, 471 insertions(+), 597 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7f6ebcb9..d031354c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,23 +8,23 @@ "name": "ads-ui", "version": "0.1.0", "dependencies": { - "@apollo/client": "3.7.15", + "@apollo/client": "3.7.17", "@date-io/moment": "2.16.1", - "@emotion/react": "11.11.0", + "@emotion/react": "11.11.1", "@emotion/styled": "11.11.0", - "@fontsource/mulish": "5.0.2", - "@fontsource/poppins": "5.0.2", - "@mui/icons-material": "5.11.16", - "@mui/lab": "5.0.0-alpha.132", - "@mui/material": "5.13.3", + "@fontsource/mulish": "5.0.5", + "@fontsource/poppins": "5.0.5", + "@mui/icons-material": "5.14.0", + "@mui/lab": "5.0.0-alpha.136", + "@mui/material": "5.14.0", "@mui/x-date-pickers": "5.0.20", "axios": "1.4.0", "base64url": "3.0.1", "bignumber.js": "9.1.1", "date-fns": "2.30.0", "date-fns-tz": "2.0.0", - "formik": "2.4.1", - "graphql": "16.6.0", + "formik": "2.4.2", + "graphql": "16.7.1", "highcharts": "11.1.0", "highcharts-react-official": "3.2.0", "immer": "10.0.2", @@ -50,21 +50,21 @@ "@graphql-codegen/visitor-plugin-common": "2.13.8", "@types/chart.js": "2.9.37", "@types/classnames": "2.3.0", - "@types/jest": "29.5.2", + "@types/jest": "29.5.3", "@types/jwt-decode": "2.2.1", "@types/lodash": "4.14.195", - "@types/react": "18.2.8", - "@types/react-dom": "18.2.4", + "@types/react": "18.2.15", + "@types/react-dom": "18.2.7", "@types/react-router-dom": "5.3.3", "@vitejs/plugin-basic-ssl": "1.0.1", - "@vitejs/plugin-react": "4.0.0", + "@vitejs/plugin-react": "4.0.3", "husky": "8.0.3", "prettier": "3.0.0", - "typescript": "5.1.3", - "vite": "4.3.9", - "vite-plugin-checker": "0.6.0", + "typescript": "5.1.6", + "vite": "4.4.4", + "vite-plugin-checker": "0.6.1", "vite-tsconfig-paths": "4.2.0", - "vitest": "0.31.4" + "vitest": "0.33.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -105,9 +105,9 @@ } }, "node_modules/@apollo/client": { - "version": "3.7.15", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.15.tgz", - "integrity": "sha512-pLScjo4GAQRWKWyEg2J3FlQr9fbUAuADT0EI2+JlLf2BjaU9I7WUaZVD9w+0qNPE8BZqs53MRQq0OCm1QCW+eg==", + "version": "3.7.17", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.7.17.tgz", + "integrity": "sha512-0EErSHEtKPNl5wgWikHJbKFAzJ/k11O0WO2QyqZSHpdxdAnw7UWHY4YiLbHCFG7lhrD+NTQ3Z/H9Jn4rcikoJA==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/context": "^0.7.0", @@ -336,46 +336,46 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -386,12 +386,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -413,16 +413,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -454,34 +454,34 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -500,33 +500,33 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { @@ -542,9 +542,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -568,12 +568,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -592,62 +592,62 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -712,9 +712,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1102,12 +1102,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.21.0.tgz", - "integrity": "sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1117,12 +1117,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz", - "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1178,9 +1178,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -1189,33 +1189,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1224,12 +1224,12 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1395,9 +1395,9 @@ "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", - "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", @@ -1480,9 +1480,9 @@ "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, "node_modules/@esbuild/android-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.15.tgz", - "integrity": "sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.15.tgz", + "integrity": "sha512-wlkQBWb79/jeEEoRmrxt/yhn5T1lU236OCNpnfRzaCJHZ/5gf82uYx1qmADTBWE0AR/v7FiozE1auk2riyQd3w==", "cpu": [ "arm" ], @@ -1496,9 +1496,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz", - "integrity": "sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.15.tgz", + "integrity": "sha512-NI/gnWcMl2kXt1HJKOn2H69SYn4YNheKo6NZt1hyfKWdMbaGadxjZIkcj4Gjk/WPxnbFXs9/3HjGHaknCqjrww==", "cpu": [ "arm64" ], @@ -1512,9 +1512,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.15.tgz", - "integrity": "sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.15.tgz", + "integrity": "sha512-FM9NQamSaEm/IZIhegF76aiLnng1kEsZl2eve/emxDeReVfRuRNmvT28l6hoFD9TsCxpK+i4v8LPpEj74T7yjA==", "cpu": [ "x64" ], @@ -1528,9 +1528,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz", - "integrity": "sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.15.tgz", + "integrity": "sha512-XmrFwEOYauKte9QjS6hz60FpOCnw4zaPAb7XV7O4lx1r39XjJhTN7ZpXqJh4sN6q60zbP6QwAVVA8N/wUyBH/w==", "cpu": [ "arm64" ], @@ -1544,9 +1544,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz", - "integrity": "sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.15.tgz", + "integrity": "sha512-bMqBmpw1e//7Fh5GLetSZaeo9zSC4/CMtrVFdj+bqKPGJuKyfNJ5Nf2m3LknKZTS+Q4oyPiON+v3eaJ59sLB5A==", "cpu": [ "x64" ], @@ -1560,9 +1560,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz", - "integrity": "sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.15.tgz", + "integrity": "sha512-LoTK5N3bOmNI9zVLCeTgnk5Rk0WdUTrr9dyDAQGVMrNTh9EAPuNwSTCgaKOKiDpverOa0htPcO9NwslSE5xuLA==", "cpu": [ "arm64" ], @@ -1576,9 +1576,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz", - "integrity": "sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.15.tgz", + "integrity": "sha512-62jX5n30VzgrjAjOk5orYeHFq6sqjvsIj1QesXvn5OZtdt5Gdj0vUNJy9NIpjfdNdqr76jjtzBJKf+h2uzYuTQ==", "cpu": [ "x64" ], @@ -1592,9 +1592,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz", - "integrity": "sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.15.tgz", + "integrity": "sha512-dT4URUv6ir45ZkBqhwZwyFV6cH61k8MttIwhThp2BGiVtagYvCToF+Bggyx2VI57RG4Fbt21f9TmXaYx0DeUJg==", "cpu": [ "arm" ], @@ -1608,9 +1608,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz", - "integrity": "sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.15.tgz", + "integrity": "sha512-BWncQeuWDgYv0jTNzJjaNgleduV4tMbQjmk/zpPh/lUdMcNEAxy+jvneDJ6RJkrqloG7tB9S9rCrtfk/kuplsQ==", "cpu": [ "arm64" ], @@ -1624,9 +1624,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz", - "integrity": "sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.15.tgz", + "integrity": "sha512-JPXORvgHRHITqfms1dWT/GbEY89u848dC08o0yK3fNskhp0t2TuNUnsrrSgOdH28ceb1hJuwyr8R/1RnyPwocw==", "cpu": [ "ia32" ], @@ -1640,9 +1640,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz", - "integrity": "sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.15.tgz", + "integrity": "sha512-kArPI0DopjJCEplsVj/H+2Qgzz7vdFSacHNsgoAKpPS6W/Ndh8Oe24HRDQ5QCu4jHgN6XOtfFfLpRx3TXv/mEg==", "cpu": [ "loong64" ], @@ -1656,9 +1656,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz", - "integrity": "sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.15.tgz", + "integrity": "sha512-b/tmngUfO02E00c1XnNTw/0DmloKjb6XQeqxaYuzGwHe0fHVgx5/D6CWi+XH1DvkszjBUkK9BX7n1ARTOst59w==", "cpu": [ "mips64el" ], @@ -1672,9 +1672,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz", - "integrity": "sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.15.tgz", + "integrity": "sha512-KXPY69MWw79QJkyvUYb2ex/OgnN/8N/Aw5UDPlgoRtoEfcBqfeLodPr42UojV3NdkoO4u10NXQdamWm1YEzSKw==", "cpu": [ "ppc64" ], @@ -1688,9 +1688,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz", - "integrity": "sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.15.tgz", + "integrity": "sha512-komK3NEAeeGRnvFEjX1SfVg6EmkfIi5aKzevdvJqMydYr9N+pRQK0PGJXk+bhoPZwOUgLO4l99FZmLGk/L1jWg==", "cpu": [ "riscv64" ], @@ -1704,9 +1704,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz", - "integrity": "sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.15.tgz", + "integrity": "sha512-632T5Ts6gQ2WiMLWRRyeflPAm44u2E/s/TJvn+BP6M5mnHSk93cieaypj3VSMYO2ePTCRqAFXtuYi1yv8uZJNA==", "cpu": [ "s390x" ], @@ -1720,9 +1720,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz", - "integrity": "sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.15.tgz", + "integrity": "sha512-MsHtX0NgvRHsoOtYkuxyk4Vkmvk3PLRWfA4okK7c+6dT0Fu4SUqXAr9y4Q3d8vUf1VWWb6YutpL4XNe400iQ1g==", "cpu": [ "x64" ], @@ -1736,9 +1736,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz", - "integrity": "sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.15.tgz", + "integrity": "sha512-djST6s+jQiwxMIVQ5rlt24JFIAr4uwUnzceuFL7BQT4CbrRtqBPueS4GjXSiIpmwVri1Icj/9pFRJ7/aScvT+A==", "cpu": [ "x64" ], @@ -1752,9 +1752,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz", - "integrity": "sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.15.tgz", + "integrity": "sha512-naeRhUIvhsgeounjkF5mvrNAVMGAm6EJWiabskeE5yOeBbLp7T89tAEw0j5Jm/CZAwyLe3c67zyCWH6fsBLCpw==", "cpu": [ "x64" ], @@ -1768,9 +1768,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz", - "integrity": "sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.15.tgz", + "integrity": "sha512-qkT2+WxyKbNIKV1AEhI8QiSIgTHMcRctzSaa/I3kVgMS5dl3fOeoqkb7pW76KwxHoriImhx7Mg3TwN/auMDsyQ==", "cpu": [ "x64" ], @@ -1784,9 +1784,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz", - "integrity": "sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.15.tgz", + "integrity": "sha512-HC4/feP+pB2Vb+cMPUjAnFyERs+HJN7E6KaeBlFdBv799MhD+aPJlfi/yk36SED58J9TPwI8MAcVpJgej4ud0A==", "cpu": [ "arm64" ], @@ -1800,9 +1800,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz", - "integrity": "sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.15.tgz", + "integrity": "sha512-ovjwoRXI+gf52EVF60u9sSDj7myPixPxqzD5CmkEUmvs+W9Xd0iqISVBQn8xcx4ciIaIVlWCuTbYDOXOnOL44Q==", "cpu": [ "ia32" ], @@ -1816,9 +1816,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz", - "integrity": "sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.15.tgz", + "integrity": "sha512-imUxH9a3WJARyAvrG7srLyiK73XdX83NXQkjKvQ+7vPh3ZxoLrzvPkQKKw2DwZ+RV2ZB6vBfNHP8XScAmQC3aA==", "cpu": [ "x64" ], @@ -1888,14 +1888,14 @@ } }, "node_modules/@fontsource/mulish": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@fontsource/mulish/-/mulish-5.0.2.tgz", - "integrity": "sha512-Q77c9NFy56+16GhZqkb0h9oSjA5PMgfyDgZof0PTkXh56CXJbVb/sR6Fp6Bse2WUJq03SV6QBPvTuPo9mvkDww==" + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@fontsource/mulish/-/mulish-5.0.5.tgz", + "integrity": "sha512-C2eHZ11poELitOhh/73s+NI7PyAAbLMm0FVgnnAesI51ntpDX6bnK4nU+2j/xrajGmSjeKtqFKWjbAVsKkfPzA==" }, "node_modules/@fontsource/poppins": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.2.tgz", - "integrity": "sha512-504RESq2qbyVxxpjP2TyVQODOWakuBHBD3AtYurtmNHosC4x+mjyOlRSdW2QjsILezlwFCnLkYuGUzYiV44sEg==" + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@fontsource/poppins/-/poppins-5.0.5.tgz", + "integrity": "sha512-Y/AGmD6iavfobRb7f2l49q0dQSyisvRrUfJ7F0AWOlTNFty8bbnPBbg+5Qsq5EN6xWaIAn++50aLfOCEe7zu3w==" }, "node_modules/@graphql-codegen/add": { "version": "3.2.3", @@ -2840,15 +2840,15 @@ "optional": true }, "node_modules/@mui/base": { - "version": "5.0.0-beta.3", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.3.tgz", - "integrity": "sha512-ErOMoGNpgf6BF5W+jgXDiRlXJnpSeg8XSRonuY5UCCMHIlOWtKDtt/LS3qDAbFFGb7tV/y6EBddbcMeexx+zHw==", + "version": "5.0.0-beta.7", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.7.tgz", + "integrity": "sha512-Pjbwm6gjiS96kOMF7E5fjEJsenc0tZBesrLQ4rrdi3eT/c/yhSWnPbCUkHSz8bnS0l3/VQ8bA+oERSGSV2PK6A==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.5", "@emotion/is-prop-valid": "^1.2.1", "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.1", - "@popperjs/core": "^2.11.7", + "@mui/utils": "^5.13.7", + "@popperjs/core": "^2.11.8", "clsx": "^1.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -2872,20 +2872,20 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.13.3", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.13.3.tgz", - "integrity": "sha512-w4//nRIi9fiMow/MmhkForOezd8nc229EpSZZ5DzwpJNOmAXwypFTapOUVAGTUQiTJyeZXUNbQqYuUIrIs2nbg==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.1.tgz", + "integrity": "sha512-mIa1WmDmNr1LoupV1Rbxt9bTFKMbIn10RHG1bnZ/FJCkAYpuU/D4n+R+ttiycgcZNngU++zyh/OQeJblzbQPzg==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui" } }, "node_modules/@mui/icons-material": { - "version": "5.11.16", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.16.tgz", - "integrity": "sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.0.tgz", + "integrity": "sha512-z7lYNteDi1GMkF9JP/m2RWuCYK1M/FlaeBSUK7/IhIYzIXNhAVjfD8jRq5vFBV31qkEi2aGBS2z5SfLXwH6U0A==", "dependencies": { - "@babel/runtime": "^7.21.0" + "@babel/runtime": "^7.22.5" }, "engines": { "node": ">=12.0.0" @@ -2906,15 +2906,15 @@ } }, "node_modules/@mui/lab": { - "version": "5.0.0-alpha.132", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.132.tgz", - "integrity": "sha512-MCkQlZZSsRumgCD1rDhtkyaJmCHg20zaneJhSB55X4Rr6dA9p4vK70HvCEQKQibK3RqvEuWuRUYNKWD5SlFVww==", + "version": "5.0.0-alpha.136", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.136.tgz", + "integrity": "sha512-ai6LspCkyKRD8rL2HEtaTPBbeYkARNNKvSbjOLVJtro9bIFpZ0noH21Pp7t50Y2eFemuYeC+D5Tto3OvGKrhnQ==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/base": "5.0.0-beta.3", - "@mui/system": "^5.13.2", + "@babel/runtime": "^7.22.5", + "@mui/base": "5.0.0-beta.7", + "@mui/system": "^5.14.0", "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.1", + "@mui/utils": "^5.13.7", "clsx": "^1.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -2947,16 +2947,16 @@ } }, "node_modules/@mui/material": { - "version": "5.13.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.13.3.tgz", - "integrity": "sha512-10pek+Bz+PZ4rjUf3KTKfXWjPMUqU1nSnRPf4DAXABhsjzelGGfGW/EICgrLRrttYplTJZhoponWALezAge8ug==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/base": "5.0.0-beta.3", - "@mui/core-downloads-tracker": "^5.13.3", - "@mui/system": "^5.13.2", + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.0.tgz", + "integrity": "sha512-HP7CP71NhMkui2HUIEKl2/JfuHMuoarSUWAKlNw6s17bl/Num9rN61EM6uUzc2A2zHjj/00A66GnvDnmixEJEw==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@mui/base": "5.0.0-beta.7", + "@mui/core-downloads-tracker": "^5.14.0", + "@mui/system": "^5.14.0", "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.1", + "@mui/utils": "^5.13.7", "@types/react-transition-group": "^4.4.6", "clsx": "^1.2.1", "csstype": "^3.1.2", @@ -2991,12 +2991,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.1.tgz", - "integrity": "sha512-HW4npLUD9BAkVppOUZHeO1FOKUJWAwbpy0VQoGe3McUYTlck1HezGHQCfBQ5S/Nszi7EViqiimECVl9xi+/WjQ==", + "version": "5.13.7", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.13.7.tgz", + "integrity": "sha512-qbSr+udcij5F9dKhGX7fEdx2drXchq7htLNr2Qg2Ma+WJ6q0ERlEqGSBiPiVDJkptcjeVL4DGmcf1wl5+vD4EA==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/utils": "^5.13.1", + "@babel/runtime": "^7.22.5", + "@mui/utils": "^5.13.7", "prop-types": "^15.8.1" }, "engines": { @@ -3048,15 +3048,15 @@ } }, "node_modules/@mui/system": { - "version": "5.13.2", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.13.2.tgz", - "integrity": "sha512-TPyWmRJPt0JPVxacZISI4o070xEJ7ftxpVtu6LWuYVOUOINlhoGOclam4iV8PDT3EMQEHuUrwU49po34UdWLlw==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.1.tgz", + "integrity": "sha512-u+xlsU34Jdkgx1CxmBnIC4Y08uPdVX5iEd3S/1dggDFtOGp+Lj8xmKRJAQ8PJOOJLOh8pDwaZx4AwXikL4l1QA==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/private-theming": "^5.13.1", + "@babel/runtime": "^7.22.6", + "@mui/private-theming": "^5.13.7", "@mui/styled-engine": "^5.13.2", "@mui/types": "^7.2.4", - "@mui/utils": "^5.13.1", + "@mui/utils": "^5.14.1", "clsx": "^1.2.1", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -3100,13 +3100,13 @@ } }, "node_modules/@mui/utils": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.1.tgz", - "integrity": "sha512-6lXdWwmlUbEU2jUI8blw38Kt+3ly7xkmV9ljzY4Q20WhsJMWiNry9CX8M+TaP/HbtuyR8XKsdMgQW7h7MM3n3A==", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.1.tgz", + "integrity": "sha512-39KHKK2JeqRmuUcLDLwM+c2XfVC136C5/yUyQXmO2PVbOb2Bol4KxtkssEqCbTwg87PSCG3f1Tb0keRsK7cVGw==", "dependencies": { - "@babel/runtime": "^7.21.0", + "@babel/runtime": "^7.22.6", "@types/prop-types": "^15.7.5", - "@types/react-is": "^18.2.0", + "@types/react-is": "^18.2.1", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -3380,9 +3380,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", - "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3439,9 +3439,9 @@ "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/react": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz", - "integrity": "sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==", + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz", + "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3449,18 +3449,18 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", - "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-1vz2yObaQkLL7YFe/pme2cpvDsCwI1WXIfL+5eLz0MI9gFG24Re16RzUsI8t9XZn9ZWvgLNDrJBmrqXJO7GNQQ==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", + "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", "dependencies": { "@types/react": "*" } @@ -3542,14 +3542,14 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz", - "integrity": "sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.3.tgz", + "integrity": "sha512-pwXDog5nwwvSIzwrvYYmA2Ljcd/ZNlcsSG2Q9CNDBwnsd55UGAyr2doXtB5j+2uymRCnCfExlznzzSFbBRcoCg==", "dev": true, "dependencies": { - "@babel/core": "^7.21.4", - "@babel/plugin-transform-react-jsx-self": "^7.21.0", - "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "@babel/core": "^7.22.5", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", "react-refresh": "^0.14.0" }, "engines": { @@ -3560,13 +3560,13 @@ } }, "node_modules/@vitest/expect": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.31.4.tgz", - "integrity": "sha512-tibyx8o7GUyGHZGyPgzwiaPaLDQ9MMuCOrc03BYT0nryUuhLbL7NV2r/q98iv5STlwMgaKuFJkgBW/8iPKwlSg==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", "dev": true, "dependencies": { - "@vitest/spy": "0.31.4", - "@vitest/utils": "0.31.4", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", "chai": "^4.3.7" }, "funding": { @@ -3574,15 +3574,14 @@ } }, "node_modules/@vitest/runner": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.31.4.tgz", - "integrity": "sha512-Wgm6UER+gwq6zkyrm5/wbpXGF+g+UBB78asJlFkIOwyse0pz8lZoiC6SW5i4gPnls/zUcPLWS7Zog0LVepXnpg==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", "dev": true, "dependencies": { - "@vitest/utils": "0.31.4", - "concordance": "^5.0.4", + "@vitest/utils": "0.33.0", "p-limit": "^4.0.0", - "pathe": "^1.1.0" + "pathe": "^1.1.1" }, "funding": { "url": "https://opencollective.com/vitest" @@ -3616,109 +3615,45 @@ } }, "node_modules/@vitest/snapshot": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.31.4.tgz", - "integrity": "sha512-LemvNumL3NdWSmfVAMpXILGyaXPkZbG5tyl6+RQSdcHnTj6hvA49UAI8jzez9oQyE/FWLKRSNqTGzsHuk89LRA==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", "dev": true, "dependencies": { - "magic-string": "^0.30.0", - "pathe": "^1.1.0", - "pretty-format": "^27.5.1" + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/snapshot/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@vitest/snapshot/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, "node_modules/@vitest/spy": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.31.4.tgz", - "integrity": "sha512-3ei5ZH1s3aqbEyftPAzSuunGICRuhE+IXOmpURFdkm5ybUADk+viyQfejNk6q8M5QGX8/EVKw+QWMEP3DTJDag==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", "dev": true, "dependencies": { - "tinyspy": "^2.1.0" + "tinyspy": "^2.1.1" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.31.4.tgz", - "integrity": "sha512-DobZbHacWznoGUfYU8XDPY78UubJxXfMNY1+SUdOp1NsI34eopSA6aZMeaGu10waSOeYwE8lxrd/pLfT0RMxjQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", "dev": true, "dependencies": { - "concordance": "^5.0.4", + "diff-sequences": "^29.4.3", "loupe": "^2.3.6", - "pretty-format": "^27.5.1" + "pretty-format": "^29.5.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/utils/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@vitest/utils/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, "node_modules/@whatwg-node/events": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/@whatwg-node/events/-/events-0.0.2.tgz", @@ -4157,12 +4092,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/blueimp-md5": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", - "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", - "dev": true - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4194,9 +4123,9 @@ "peer": true }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -4206,13 +4135,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -4316,9 +4249,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001450", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", - "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "dev": true, "funding": [ { @@ -4328,6 +4261,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -4636,25 +4573,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/concordance": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", - "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", - "dev": true, - "dependencies": { - "date-time": "^3.1.0", - "esutils": "^2.0.3", - "fast-diff": "^1.2.0", - "js-string-escape": "^1.0.1", - "lodash": "^4.17.15", - "md5-hex": "^3.0.1", - "semver": "^7.3.2", - "well-known-symbols": "^2.0.0" - }, - "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" - } - }, "node_modules/constant-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", @@ -4843,18 +4761,6 @@ "date-fns": ">=2.0.0" } }, - "node_modules/date-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", - "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", - "dev": true, - "dependencies": { - "time-zone": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -5092,9 +4998,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.467", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.467.tgz", + "integrity": "sha512-2qI70O+rR4poYeF2grcuS/bCps5KJh6y1jtZMDDEteyKJQrzLOEhFyXCLcHW6DTBjKjWkk26JhWoAi+Ux9A0fg==", "dev": true }, "node_modules/error-ex": { @@ -5106,9 +5012,9 @@ } }, "node_modules/esbuild": { - "version": "0.17.15", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.15.tgz", - "integrity": "sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.15.tgz", + "integrity": "sha512-3WOOLhrvuTGPRzQPU6waSDWrDTnQriia72McWcn6UCi43GhCHrXH4S59hKMeez+IITmdUuUyvbU9JIp+t3xlPQ==", "dev": true, "hasInstallScript": true, "bin": { @@ -5118,28 +5024,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.15", - "@esbuild/android-arm64": "0.17.15", - "@esbuild/android-x64": "0.17.15", - "@esbuild/darwin-arm64": "0.17.15", - "@esbuild/darwin-x64": "0.17.15", - "@esbuild/freebsd-arm64": "0.17.15", - "@esbuild/freebsd-x64": "0.17.15", - "@esbuild/linux-arm": "0.17.15", - "@esbuild/linux-arm64": "0.17.15", - "@esbuild/linux-ia32": "0.17.15", - "@esbuild/linux-loong64": "0.17.15", - "@esbuild/linux-mips64el": "0.17.15", - "@esbuild/linux-ppc64": "0.17.15", - "@esbuild/linux-riscv64": "0.17.15", - "@esbuild/linux-s390x": "0.17.15", - "@esbuild/linux-x64": "0.17.15", - "@esbuild/netbsd-x64": "0.17.15", - "@esbuild/openbsd-x64": "0.17.15", - "@esbuild/sunos-x64": "0.17.15", - "@esbuild/win32-arm64": "0.17.15", - "@esbuild/win32-ia32": "0.17.15", - "@esbuild/win32-x64": "0.17.15" + "@esbuild/android-arm": "0.18.15", + "@esbuild/android-arm64": "0.18.15", + "@esbuild/android-x64": "0.18.15", + "@esbuild/darwin-arm64": "0.18.15", + "@esbuild/darwin-x64": "0.18.15", + "@esbuild/freebsd-arm64": "0.18.15", + "@esbuild/freebsd-x64": "0.18.15", + "@esbuild/linux-arm": "0.18.15", + "@esbuild/linux-arm64": "0.18.15", + "@esbuild/linux-ia32": "0.18.15", + "@esbuild/linux-loong64": "0.18.15", + "@esbuild/linux-mips64el": "0.18.15", + "@esbuild/linux-ppc64": "0.18.15", + "@esbuild/linux-riscv64": "0.18.15", + "@esbuild/linux-s390x": "0.18.15", + "@esbuild/linux-x64": "0.18.15", + "@esbuild/netbsd-x64": "0.18.15", + "@esbuild/openbsd-x64": "0.18.15", + "@esbuild/sunos-x64": "0.18.15", + "@esbuild/win32-arm64": "0.18.15", + "@esbuild/win32-ia32": "0.18.15", + "@esbuild/win32-x64": "0.18.15" } }, "node_modules/escalade": { @@ -5438,6 +5344,8 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -5492,12 +5400,6 @@ "optional": true, "peer": true }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", @@ -5697,9 +5599,9 @@ } }, "node_modules/formik": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.1.tgz", - "integrity": "sha512-ajOB9EmFhXb4PACTlaooVEn7PLtLtBJEZ8fPs+wFZjL5KSGwgAoU+n9DHN8JcqNKcXkloEYYtn1lxrLav18ecQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.2.tgz", + "integrity": "sha512-C6nx0hifW2uENP3M6HpPmnAE6HFWCcd8/sqBZEOHZY6lpHJ5qehsfAy43ktpFLEmkBmhiZDei726utcUB9leqg==", "funding": [ { "type": "individual", @@ -5713,17 +5615,12 @@ "lodash-es": "^4.17.21", "react-fast-compare": "^2.0.1", "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" + "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, - "node_modules/formik/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/fs-extra": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", @@ -5872,9 +5769,9 @@ "peer": true }, "node_modules/graphql": { - "version": "16.6.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.6.0.tgz", - "integrity": "sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw==", + "version": "16.7.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.7.1.tgz", + "integrity": "sha512-DRYR9tf+UGU0KOsMcKAlXeFfX89UiiIZ0dRU3mR0yJfu6OjZqUcp68NnFLnqQU5RexygFoDy1EW+ccOYcPfmHg==", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -6581,15 +6478,6 @@ "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7114,17 +7002,23 @@ } }, "node_modules/magic-string": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", - "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { "node": ">=12" } }, + "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -7140,18 +7034,6 @@ "node": ">=0.10.0" } }, - "node_modules/md5-hex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", - "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", - "dev": true, - "dependencies": { - "blueimp-md5": "^2.10.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/merge-options": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", @@ -7243,13 +7125,13 @@ } }, "node_modules/mlly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.3.0.tgz", - "integrity": "sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", "dev": true, "dependencies": { - "acorn": "^8.8.2", - "pathe": "^1.1.0", + "acorn": "^8.9.0", + "pathe": "^1.1.1", "pkg-types": "^1.0.3", "ufo": "^1.1.2" } @@ -7336,9 +7218,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz", - "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/normalize-path": { @@ -7731,9 +7613,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", "dev": true, "funding": [ { @@ -8254,9 +8136,9 @@ } }, "node_modules/rollup": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.23.0.tgz", - "integrity": "sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==", + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -8364,9 +8246,9 @@ "dev": true }, "node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -8605,9 +8487,9 @@ "dev": true }, "node_modules/std-env": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", - "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", "dev": true }, "node_modules/streamsearch": { @@ -8785,15 +8667,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/tiny-case": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", @@ -8816,9 +8689,9 @@ "dev": true }, "node_modules/tinypool": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.5.0.tgz", - "integrity": "sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", "dev": true, "engines": { "node": ">=14.0.0" @@ -9064,9 +8937,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -9144,9 +9017,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -9156,6 +9029,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -9163,7 +9040,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -9245,14 +9122,14 @@ } }, "node_modules/vite": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", "dev": true, "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.18.10", + "postcss": "^8.4.25", + "rollup": "^3.25.2" }, "bin": { "vite": "bin/vite.js" @@ -9260,12 +9137,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -9278,6 +9159,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -9293,15 +9177,15 @@ } }, "node_modules/vite-node": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.31.4.tgz", - "integrity": "sha512-uzL377GjJtTbuc5KQxVbDu2xfU/x0wVjUtXQR2ihS21q/NK6ROr4oG0rsSkBBddZUVCwzfx22in76/0ZZHXgkQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", "dev": true, "dependencies": { "cac": "^6.7.14", "debug": "^4.3.4", - "mlly": "^1.2.0", - "pathe": "^1.1.0", + "mlly": "^1.4.0", + "pathe": "^1.1.1", "picocolors": "^1.0.0", "vite": "^3.0.0 || ^4.0.0" }, @@ -9316,9 +9200,9 @@ } }, "node_modules/vite-plugin-checker": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.0.tgz", - "integrity": "sha512-DWZ9Hv2TkpjviPxAelNUt4Q3IhSGrx7xrwdM64NI+Q4dt8PaMWJJh4qGNtSrfEuiuIzWWo00Ksvh5It4Y3L9xQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.1.tgz", + "integrity": "sha512-4fAiu3W/IwRJuJkkUZlWbLunSzsvijDf0eDN6g/MGh6BUK4SMclOTGbLJCPvdAcMOQvVmm8JyJeYLYd4//8CkA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -9400,35 +9284,34 @@ } }, "node_modules/vitest": { - "version": "0.31.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.31.4.tgz", - "integrity": "sha512-GoV0VQPmWrUFOZSg3RpQAPN+LPmHg2/gxlMNJlyxJihkz6qReHDV6b0pPDcqFLNEPya4tWJ1pgwUNP9MLmUfvQ==", + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", "dev": true, "dependencies": { "@types/chai": "^4.3.5", "@types/chai-subset": "^1.3.3", "@types/node": "*", - "@vitest/expect": "0.31.4", - "@vitest/runner": "0.31.4", - "@vitest/snapshot": "0.31.4", - "@vitest/spy": "0.31.4", - "@vitest/utils": "0.31.4", - "acorn": "^8.8.2", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", "acorn-walk": "^8.2.0", "cac": "^6.7.14", "chai": "^4.3.7", - "concordance": "^5.0.4", "debug": "^4.3.4", "local-pkg": "^0.4.3", - "magic-string": "^0.30.0", - "pathe": "^1.1.0", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", "picocolors": "^1.0.0", - "std-env": "^3.3.2", + "std-env": "^3.3.3", "strip-literal": "^1.0.1", "tinybench": "^2.5.0", - "tinypool": "^0.5.0", + "tinypool": "^0.6.0", "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.31.4", + "vite-node": "0.33.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -9617,15 +9500,6 @@ "node": ">=10.4" } }, - "node_modules/well-known-symbols": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", - "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", diff --git a/package.json b/package.json index a0d8d694..7482d317 100644 --- a/package.json +++ b/package.json @@ -3,23 +3,23 @@ "version": "0.1.0", "private": true, "dependencies": { - "@apollo/client": "3.7.15", + "@apollo/client": "3.7.17", "@date-io/moment": "2.16.1", - "@emotion/react": "11.11.0", + "@emotion/react": "11.11.1", "@emotion/styled": "11.11.0", - "@fontsource/mulish": "5.0.2", - "@fontsource/poppins": "5.0.2", - "@mui/icons-material": "5.11.16", - "@mui/lab": "5.0.0-alpha.132", - "@mui/material": "5.13.3", + "@fontsource/mulish": "5.0.5", + "@fontsource/poppins": "5.0.5", + "@mui/icons-material": "5.14.0", + "@mui/lab": "5.0.0-alpha.136", + "@mui/material": "5.14.0", "@mui/x-date-pickers": "5.0.20", "axios": "1.4.0", "base64url": "3.0.1", "bignumber.js": "9.1.1", "date-fns": "2.30.0", "date-fns-tz": "2.0.0", - "formik": "2.4.1", - "graphql": "16.6.0", + "formik": "2.4.2", + "graphql": "16.7.1", "highcharts": "11.1.0", "highcharts-react-official": "3.2.0", "immer": "10.0.2", @@ -59,24 +59,24 @@ "@graphql-codegen/visitor-plugin-common": "2.13.8", "@types/chart.js": "2.9.37", "@types/classnames": "2.3.0", - "@types/jest": "29.5.2", + "@types/jest": "29.5.3", "@types/jwt-decode": "2.2.1", "@types/lodash": "4.14.195", - "@types/react": "18.2.8", - "@types/react-dom": "18.2.4", + "@types/react": "18.2.15", + "@types/react-dom": "18.2.7", "@types/react-router-dom": "5.3.3", "@vitejs/plugin-basic-ssl": "1.0.1", - "@vitejs/plugin-react": "4.0.0", + "@vitejs/plugin-react": "4.0.3", "husky": "8.0.3", "prettier": "3.0.0", - "typescript": "5.1.3", - "vite": "4.3.9", - "vite-plugin-checker": "0.6.0", + "typescript": "5.1.6", + "vite": "4.4.4", + "vite-plugin-checker": "0.6.1", "vite-tsconfig-paths": "4.2.0", - "vitest": "0.31.4" + "vitest": "0.33.0" }, "overrides": { - "semver": "7.5.2", + "semver": "7.5.4", "optionator": "0.9.3" }, "browserslist": [ diff --git a/src/form/FormikHelpers.tsx b/src/form/FormikHelpers.tsx index b9ef49cd..78be82f3 100644 --- a/src/form/FormikHelpers.tsx +++ b/src/form/FormikHelpers.tsx @@ -70,7 +70,7 @@ export const FormikSwitch: React.FC = (props) => { <> } label={props.label} /> - {(msg) => {msg}} + {(msg: string) => {msg}} ); @@ -89,7 +89,7 @@ export const FormikRadioGroup: React.FC< <> - {(msg) => {msg}} + {(msg: string) => {msg}} ); diff --git a/src/user/views/adsManager/views/advanced/components/adSet/NewAdSet.tsx b/src/user/views/adsManager/views/advanced/components/adSet/NewAdSet.tsx index 9fbad6b5..f61eb401 100644 --- a/src/user/views/adsManager/views/advanced/components/adSet/NewAdSet.tsx +++ b/src/user/views/adsManager/views/advanced/components/adSet/NewAdSet.tsx @@ -1,4 +1,4 @@ -import { FieldArray, useFormikContext } from "formik"; +import { FieldArray, FieldArrayRenderProps, useFormikContext } from "formik"; import { Box, Button, @@ -23,7 +23,7 @@ export function NewAdSet(props: { isEdit: boolean }) { return ( <> - {({ remove, push }) => ( + {(helper: FieldArrayRenderProps) => ( {values.adSets.map((adSet, idx) => ( @@ -54,7 +54,7 @@ export function NewAdSet(props: { isEdit: boolean }) { const newIdx = idx - 1; selected.current = newIdx; history.replace(`?current=${newIdx}`); - remove(idx); + helper.remove(idx); }} > @@ -69,7 +69,7 @@ export function NewAdSet(props: { isEdit: boolean }) { pb={0} pt={0} component={Button} - onClick={() => push(initialAdSet)} + onClick={() => helper.push(initialAdSet)} border="1px solid #ededed" > diff --git a/src/user/views/adsManager/views/advanced/components/adSet/fields/ConversionField.tsx b/src/user/views/adsManager/views/advanced/components/adSet/fields/ConversionField.tsx index 17f93b7e..b67058c1 100644 --- a/src/user/views/adsManager/views/advanced/components/adSet/fields/ConversionField.tsx +++ b/src/user/views/adsManager/views/advanced/components/adSet/fields/ConversionField.tsx @@ -1,7 +1,7 @@ import { Link, Stack, Typography } from "@mui/material"; import { ConversionFields } from "components/Conversion/ConversionFields"; import React from "react"; -import { FieldArray, useField } from "formik"; +import { FieldArray, FieldArrayRenderProps, useField } from "formik"; import { Conversion, initialConversion } from "../../../../../types"; import { CardContainer } from "components/Card/CardContainer"; @@ -16,7 +16,7 @@ export function ConversionField({ index }: Props) { return ( - {({ remove, push }) => ( + {(helper: FieldArrayRenderProps) => ( <> @@ -26,7 +26,7 @@ export function ConversionField({ index }: Props) { push(initialConversion)} + onClick={() => helper.push(initialConversion)} sx={{ cursor: "pointer" }} > Add Conversion Tracking + @@ -36,7 +36,7 @@ export function ConversionField({ index }: Props) { remove(0)} + onClick={() => helper.remove(0)} sx={{ cursor: "pointer" }} > Remove Conversion Tracking - From c944aa48afe7731d490f095b3473462dae068991 Mon Sep 17 00:00:00 2001 From: Ian Krieger <48930920+IanKrieger@users.noreply.github.com> Date: Fri, 21 Jul 2023 13:05:40 -0400 Subject: [PATCH 04/10] feat: add conversions to key metrics, if they exist (#842) --- .../analytics/analyticsOverview/components/LiveFeed.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/user/analytics/analyticsOverview/components/LiveFeed.tsx b/src/user/analytics/analyticsOverview/components/LiveFeed.tsx index 63b99784..a882e5d8 100644 --- a/src/user/analytics/analyticsOverview/components/LiveFeed.tsx +++ b/src/user/analytics/analyticsOverview/components/LiveFeed.tsx @@ -50,6 +50,13 @@ export default function LiveFeed({ overview, processed }: LiveFeedProps) { }, ]; + if (processed.conversions > 0) { + feedValues.push({ + label: "Conversions", + value: `${processed.conversions}`, + }); + } + return ( Date: Mon, 31 Jul 2023 08:50:55 -0400 Subject: [PATCH 05/10] fix: allow campaign settings edit if draft (#841) --- .../advanced/components/campaign/CampaignSettings.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/user/views/adsManager/views/advanced/components/campaign/CampaignSettings.tsx b/src/user/views/adsManager/views/advanced/components/campaign/CampaignSettings.tsx index b66c0cc5..2d22ec45 100644 --- a/src/user/views/adsManager/views/advanced/components/campaign/CampaignSettings.tsx +++ b/src/user/views/adsManager/views/advanced/components/campaign/CampaignSettings.tsx @@ -4,8 +4,13 @@ import { CardContainer } from "components/Card/CardContainer"; import { CampaignDateRange } from "components/Campaigns/CampaignDateRange"; import { LocationField } from "user/views/adsManager/views/advanced/components/campaign/fields/LocationField"; import { Typography } from "@mui/material"; +import { useFormikContext } from "formik"; +import { CampaignForm } from "user/views/adsManager/types"; export function CampaignSettings(props: { isEdit: boolean }) { + const { values } = useFormikContext(); + const isEdit = props.isEdit && values.state !== "draft"; + return ( <> @@ -15,10 +20,10 @@ export function CampaignSettings(props: { isEdit: boolean }) { - + - {!props.isEdit && } + {!isEdit && } ); } From 25de77a5b3092fe65c9969e3afd17c9d98fe7275 Mon Sep 17 00:00:00 2001 From: Ian Krieger <48930920+IanKrieger@users.noreply.github.com> Date: Mon, 31 Jul 2023 11:22:12 -0400 Subject: [PATCH 06/10] fix: add cpa with conversions (#847) --- .../analyticsOverview/components/LiveFeed.tsx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/user/analytics/analyticsOverview/components/LiveFeed.tsx b/src/user/analytics/analyticsOverview/components/LiveFeed.tsx index a882e5d8..b83c5b77 100644 --- a/src/user/analytics/analyticsOverview/components/LiveFeed.tsx +++ b/src/user/analytics/analyticsOverview/components/LiveFeed.tsx @@ -51,10 +51,16 @@ export default function LiveFeed({ overview, processed }: LiveFeedProps) { ]; if (processed.conversions > 0) { - feedValues.push({ - label: "Conversions", - value: `${processed.conversions}`, - }); + feedValues.push( + { + label: "Conversions", + value: `${processed.conversions}`, + }, + { + label: "CPA", + value: `$${processed.cpa.toLocaleString()}`, + }, + ); } return ( From 2782b317296a4e0e77d1424b34eb282f8864b16a Mon Sep 17 00:00:00 2001 From: Ian Krieger <48930920+IanKrieger@users.noreply.github.com> Date: Tue, 1 Aug 2023 08:55:04 -0400 Subject: [PATCH 07/10] feat: add landing page, improve onboarding (#840) * feat: rework login page * feat: fix for form, match design a bit better * feat: new image copy * fix: redirect to user main * fix: image copy * fix: update illustrations * fix: bring user to dash if authenticated --- background.svg | 42 +++++ branding.svg | 12 ++ images.svg | 171 ++++++++++++++++++ package-lock.json | 17 -- package.json | 1 - present.png | Bin 52422 -> 0 bytes src/App.tsx | 9 +- src/auth/lib/index.ts | 2 +- src/auth/registration/AddressField.tsx | 57 +++--- src/auth/registration/AdvertiserField.tsx | 48 ----- .../registration/AdvertiserRegistered.tsx | 26 ++- src/auth/registration/NameField.tsx | 71 +++++--- src/auth/registration/Register.tsx | 87 +++++---- src/auth/registration/types.ts | 6 +- src/auth/views/AuthVerify.tsx | 2 +- src/auth/views/LandingPage.tsx | 59 ++++++ src/auth/views/Login.tsx | 8 +- src/auth/views/MagicLink.tsx | 11 +- src/auth/views/components/AuthContainer.tsx | 43 ++--- src/components/AppBar/LandingPageAppBar.tsx | 107 +++++++++++ src/components/Background/Background.tsx | 24 +++ src/components/Card/PaddedCardContainer.tsx | 24 +++ src/components/Country/CountryPicker.tsx | 20 +- src/components/Navigation/Navbar.tsx | 21 +-- src/components/Steps/NextAndBack.tsx | 56 +++--- src/components/Steps/StepsButton.tsx | 38 ---- src/form/FormikHelpers.tsx | 49 +++-- src/theme.tsx | 21 ++- src/validation/RegistrationSchema.tsx | 11 +- 29 files changed, 719 insertions(+), 324 deletions(-) create mode 100644 background.svg create mode 100644 branding.svg create mode 100644 images.svg delete mode 100644 present.png delete mode 100644 src/auth/registration/AdvertiserField.tsx create mode 100644 src/auth/views/LandingPage.tsx create mode 100644 src/components/AppBar/LandingPageAppBar.tsx create mode 100644 src/components/Background/Background.tsx create mode 100644 src/components/Card/PaddedCardContainer.tsx delete mode 100644 src/components/Steps/StepsButton.tsx diff --git a/background.svg b/background.svg new file mode 100644 index 00000000..b6d2a7e4 --- /dev/null +++ b/background.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/branding.svg b/branding.svg new file mode 100644 index 00000000..6299e205 --- /dev/null +++ b/branding.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/images.svg b/images.svg new file mode 100644 index 00000000..4f48d804 --- /dev/null +++ b/images.svg @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package-lock.json b/package-lock.json index d031354c..3957240e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,6 @@ "react-dom": "18.2.0", "react-router-dom": "5.3.4", "react-table": "7.8.0", - "react-topbar-progress-indicator": "4.1.1", "tweetnacl": "1.0.3", "yup": "1.2.0" }, @@ -7899,17 +7898,6 @@ "react": "^16.8.3 || ^17.0.0-0 || ^18.0.0" } }, - "node_modules/react-topbar-progress-indicator": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/react-topbar-progress-indicator/-/react-topbar-progress-indicator-4.1.1.tgz", - "integrity": "sha512-Oy3ENNKfymt16zoz5SYy/WOepMurB0oeZEyvuHm8JZ3jrTCe1oAUD7fG6HhYt5sg8Wcg5gdkzSWItaFF6c6VhA==", - "dependencies": { - "topbar": "^0.1.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -8747,11 +8735,6 @@ "node": ">=8.0" } }, - "node_modules/topbar": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/topbar/-/topbar-0.1.4.tgz", - "integrity": "sha512-P3n4WnN4GFd2mQXDo30rQmsAGe4V1bVkggtTreSbNyL50Fyc+eVkW5oatSLeGQmJoan2TLIgoXUZypN+6nw4MQ==" - }, "node_modules/toposort": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", diff --git a/package.json b/package.json index 7482d317..b5e03f82 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "react-dom": "18.2.0", "react-router-dom": "5.3.4", "react-table": "7.8.0", - "react-topbar-progress-indicator": "4.1.1", "tweetnacl": "1.0.3", "yup": "1.2.0" }, diff --git a/present.png b/present.png deleted file mode 100644 index 08e0aeeab2556a597eeef7e960bfd2f5deae6405..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52422 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 { - return ; + return ; }; export function App() { @@ -46,7 +47,11 @@ export function App() { - + + diff --git a/src/auth/lib/index.ts b/src/auth/lib/index.ts index da26e9b7..7de5d528 100644 --- a/src/auth/lib/index.ts +++ b/src/auth/lib/index.ts @@ -69,7 +69,7 @@ export async function submitRegistration(form: RegistrationForm) { ...form.address, }, user: { - fullName: `${form.firstName} ${form.lastName}`, + fullName: form.fullName, email: form.email, }, }), diff --git a/src/auth/registration/AddressField.tsx b/src/auth/registration/AddressField.tsx index cf018455..65e6b4e3 100644 --- a/src/auth/registration/AddressField.tsx +++ b/src/auth/registration/AddressField.tsx @@ -1,61 +1,62 @@ -import { Stack, Typography } from "@mui/material"; +import { Box, Divider, Stack, Typography } from "@mui/material"; import { FormikTextField } from "form/FormikHelpers"; import React from "react"; import { CountryPicker } from "components/Country/CountryPicker"; export function AddressField() { return ( - - - We are excited to have the opportunity to work with you! The last bit we - need is some address info for your organization. This will allow us to - set up the necessary financial arrangements. + + + Second (and last!) we'll need info on your business. Once you are + finished here, your account setup is complete. + + - - + - - + - + - + ); } diff --git a/src/auth/registration/AdvertiserField.tsx b/src/auth/registration/AdvertiserField.tsx deleted file mode 100644 index 6923b9d7..00000000 --- a/src/auth/registration/AdvertiserField.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { useFormikContext } from "formik"; -import { RegistrationForm } from "auth/registration/types"; -import { Typography } from "@mui/material"; -import React from "react"; -import { FormikTextField } from "form/FormikHelpers"; - -export function AdvertiserField() { - const { values } = useFormikContext(); - - return ( - - - Welcome to Brave Ads - {values.firstName && ( - <> - {", "} - {values.firstName} - - )} - {"! "} - Now we need to know about your organization. Include your organization's - name and be as descriptive as possible. This will help us expedite the - review and approval procedures. - - - - - - - - - ); -} diff --git a/src/auth/registration/AdvertiserRegistered.tsx b/src/auth/registration/AdvertiserRegistered.tsx index 04c019fa..5e3c6bd5 100644 --- a/src/auth/registration/AdvertiserRegistered.tsx +++ b/src/auth/registration/AdvertiserRegistered.tsx @@ -12,14 +12,17 @@ export function AdvertiserRegistered({ error }: Props) { {!!error ? ( - - We encountered a problem creating your account. Please reach out to + + We encountered a problem creating your account. + + + Please reach out to selfserve@brave.com {" "} or try again. - + - Success! Our team will now carefully review the provided - information. + Thanks for your interest in Brave Ads! Our team will now carefully + review the provided information. Once the review process is complete, we will send you an email to - notify you of the approval status and any further steps required. We - look forward to progressing our partnership with you and will be in - touch soon. + notify you of the approval status and any further steps required. + + + In the meantime, check out our{" "} + + advertiser resources + + . If you have any questions, please reach out to{" "} + selfserve@brave.com. - )} diff --git a/src/auth/registration/NameField.tsx b/src/auth/registration/NameField.tsx index c4aadd2b..cc9208e5 100644 --- a/src/auth/registration/NameField.tsx +++ b/src/auth/registration/NameField.tsx @@ -1,41 +1,64 @@ -import { Stack, Typography } from "@mui/material"; +import { Box, Divider, Stack, Typography } from "@mui/material"; import { FormikTextField } from "form/FormikHelpers"; import React from "react"; export function NameField() { return ( - - - Thank you for choosing Brave's Ads Platform! To complete your - registration, we need some information in order to provide you with a - great advertising experience. First, we'll start with the basics. + + + Thank you for choosing Brave's Ads Platform! Let's get you setup with + your account. First, we'll need your info. - - + - - + + + + + + + - + ); } diff --git a/src/auth/registration/Register.tsx b/src/auth/registration/Register.tsx index 3c405917..cd3f8f66 100644 --- a/src/auth/registration/Register.tsx +++ b/src/auth/registration/Register.tsx @@ -1,18 +1,21 @@ import { AuthContainer } from "auth/views/components/AuthContainer"; import { Form, Formik } from "formik"; -import React from "react"; +import React, { useState } from "react"; import { RegistrationSchema } from "validation/RegistrationSchema"; import { initialValues, RegistrationForm } from "auth/registration/types"; -import { Stack } from "@mui/material"; import { NameField } from "auth/registration/NameField"; -import { AdvertiserField } from "auth/registration/AdvertiserField"; import { AddressField } from "auth/registration/AddressField"; import { FormikSubmitButton } from "form/FormikHelpers"; import { useRegister } from "auth/hooks/mutations/useRegister"; import { AdvertiserRegistered } from "auth/registration/AdvertiserRegistered"; -import { StepsButton } from "components/Steps/StepsButton"; +import { NextAndBack } from "components/Steps/NextAndBack"; +import { Box, Toolbar, Typography } from "@mui/material"; +import { Background } from "components/Background/Background"; +import { LandingPageAppBar } from "components/AppBar/LandingPageAppBar"; +import { PaddedCardContainer } from "components/Card/PaddedCardContainer"; export function Register() { + const [activeStep, setActiveStep] = useState(0); const { register, hasRegistered, error } = useRegister(); if (hasRegistered || error) { @@ -23,38 +26,50 @@ export function Register() { ); } + const steps = [ + { label: "Your information", component: }, + { label: "Your business's information", component: }, + ]; + return ( - - { - setSubmitting(true); - register(v); - setSubmitting(false); - }} - validationSchema={RegistrationSchema} - > -

- - }, - { - label: "Organization details", - component: , - }, - { label: "Organization address", component: }, - ]} - finalComponent={ - - } - /> - - -
- + + + + + + + {steps[activeStep].label} + + { + setSubmitting(true); + register(v); + setSubmitting(false); + }} + validationSchema={RegistrationSchema} + > +
+ + {steps[activeStep].component} + + + setActiveStep(activeStep + 1)} + onBack={() => setActiveStep(activeStep - 1)} + final={ + + } + /> + +
+
+
+
); } diff --git a/src/auth/registration/types.ts b/src/auth/registration/types.ts index 136329c9..ec887b50 100644 --- a/src/auth/registration/types.ts +++ b/src/auth/registration/types.ts @@ -1,7 +1,6 @@ export type RegistrationForm = { email: string; - firstName: string; - lastName: string; + fullName: string; advertiser: { name: string; url: string; @@ -19,8 +18,7 @@ export type RegistrationForm = { export const initialValues: RegistrationForm = { email: "", - firstName: "", - lastName: "", + fullName: "", advertiser: { name: "", url: "", diff --git a/src/auth/views/AuthVerify.tsx b/src/auth/views/AuthVerify.tsx index 49a5e97e..0ee82933 100644 --- a/src/auth/views/AuthVerify.tsx +++ b/src/auth/views/AuthVerify.tsx @@ -41,7 +41,7 @@ export function AuthVerify() { variant="h5" component={RouterLink} sx={{ textAlign: "center" }} - to="/" + to="/user/main" replace > Not automatically redirected? Click this link to go to the diff --git a/src/auth/views/LandingPage.tsx b/src/auth/views/LandingPage.tsx new file mode 100644 index 00000000..f46a7311 --- /dev/null +++ b/src/auth/views/LandingPage.tsx @@ -0,0 +1,59 @@ +import { Background } from "components/Background/Background"; +import { LandingPageAppBar } from "components/AppBar/LandingPageAppBar"; +import React from "react"; +import { Box, Button, Stack, Typography } from "@mui/material"; +import goals from "../../../images.svg"; +import { useIsAuthenticated } from "auth/hooks/queries/useIsAuthenticated"; + +const GradientText = { + backgroundImage: + "linear-gradient(96.46deg, #FF2869 -4.13%, #930BFE 82.88%), linear-gradient(0deg, #111317, #111317);", + backgroundClip: "text", + color: "transparent", +}; + +export function LandingPage() { + const isAuthenticated = useIsAuthenticated(); + + return ( + + + + + + + Privacy-forward + {" "} + advertising made simple + + + + Reach and convert new customers through premium advertising on the + Brave browser and search engine. + + + + + + + + + + ); +} diff --git a/src/auth/views/Login.tsx b/src/auth/views/Login.tsx index d452536c..450892da 100644 --- a/src/auth/views/Login.tsx +++ b/src/auth/views/Login.tsx @@ -12,14 +12,14 @@ export function Login() { const { signIn, loading, error } = useSignIn({ onSuccess() { - history.replace("/"); + history.replace("/user/main"); }, }); return ( - - Sign into your Brave Ads account + + Log into your Brave Ads account - Sign In + Log in + + Enter your email address to get a secure login link. Use this link to + access your Brave Ads account. + + setEmail(e.target.value)} @@ -56,10 +61,6 @@ export function MagicLink() { error={!!error} helperText={error} /> - - Enter your email address to get a secure login link. Use this link to - access your Brave Ads account. - - + + + + {aboveCard} - - {children} + {belowCard} -
+ ); } diff --git a/src/components/AppBar/LandingPageAppBar.tsx b/src/components/AppBar/LandingPageAppBar.tsx new file mode 100644 index 00000000..b9446965 --- /dev/null +++ b/src/components/AppBar/LandingPageAppBar.tsx @@ -0,0 +1,107 @@ +import * as React from "react"; + +import { + AppBar, + Box, + Button, + CssBaseline, + Divider, + Link, + LinkProps, + Stack, + Toolbar, +} from "@mui/material"; +import ads from "../../../branding.svg"; +import { Link as RouterLink, useRouteMatch } from "react-router-dom"; +import { useIsAuthenticated } from "auth/hooks/queries/useIsAuthenticated"; +import { useSignOut } from "auth/hooks/mutations/useSignOut"; + +export function LandingPageAppBar() { + const match = useRouteMatch(); + const isAuthenticated = useIsAuthenticated(); + + const links = [ + { + component: isAuthenticated ? null : ( + + ), + }, + { + component: ( + + ), + }, + { + component: ( + + ), + }, + ]; + + return ( + + + + + + + Ads + + + {links.map((l) => l.component)} + +
+ {!match.url.includes("auth") && ( + + )} + + + + ); +} + +interface HelpProps { + label: string; + props: LinkProps; +} + +function HelpLink({ label, props }: HelpProps) { + return ( + + {label} + + ); +} + +function AuthedButton(props: { isAuthenticated?: boolean }) { + const { signOut } = useSignOut(); + + return ( + + ); +} diff --git a/src/components/Background/Background.tsx b/src/components/Background/Background.tsx new file mode 100644 index 00000000..795bb020 --- /dev/null +++ b/src/components/Background/Background.tsx @@ -0,0 +1,24 @@ +import { PropsWithChildren } from "react"; +import gradient from "../../../background.svg"; +import { Container } from "@mui/material"; + +export function Background({ children }: PropsWithChildren) { + return ( + + {children} + + ); +} diff --git a/src/components/Card/PaddedCardContainer.tsx b/src/components/Card/PaddedCardContainer.tsx new file mode 100644 index 00000000..b4db7e6e --- /dev/null +++ b/src/components/Card/PaddedCardContainer.tsx @@ -0,0 +1,24 @@ +import { Card, CardContent } from "@mui/material"; +import React, { PropsWithChildren } from "react"; + +export function PaddedCardContainer({ children }: PropsWithChildren) { + return ( + + + {children} + + + ); +} diff --git a/src/components/Country/CountryPicker.tsx b/src/components/Country/CountryPicker.tsx index 073073dd..d843b594 100644 --- a/src/components/Country/CountryPicker.tsx +++ b/src/components/Country/CountryPicker.tsx @@ -1,4 +1,4 @@ -import { Autocomplete, TextField } from "@mui/material"; +import { Autocomplete, Box, FormLabel, TextField } from "@mui/material"; import { useField } from "formik"; import React from "react"; import { useCountries } from "components/Country/useCountries"; @@ -23,14 +23,16 @@ export const CountryPicker: React.FC = ({ name }) => { options={data} getOptionLabel={(option) => option.name} renderInput={(params) => ( - + + Country + + )} isOptionEqualToValue={(option, value) => option.code === value.code} value={value} diff --git a/src/components/Navigation/Navbar.tsx b/src/components/Navigation/Navbar.tsx index 82365928..e2dc17c7 100644 --- a/src/components/Navigation/Navbar.tsx +++ b/src/components/Navigation/Navbar.tsx @@ -2,8 +2,6 @@ import * as React from "react"; import { useHistory, useRouteMatch } from "react-router-dom"; -import TopBarProgress from "react-topbar-progress-indicator"; - import { AppBar, Button, @@ -16,18 +14,9 @@ import { import { UserMenu } from "components/Navigation/UserMenu"; import { DraftMenu } from "components/Navigation/DraftMenu"; import moment from "moment"; -import ads from "../../../brave-ads-black.svg"; +import ads from "../../../branding.svg"; import { useAdvertiser } from "auth/hooks/queries/useAdvertiser"; -TopBarProgress.config({ - barColors: { - "0": "#FB7959", - }, - shadowBlur: 0, - shadowColor: undefined, - barThickness: 2, -}); - export function Navbar() { const { advertiser } = useAdvertiser(); const history = useHistory(); @@ -41,7 +30,13 @@ export function Navbar() { return ( theme.zIndex.drawer + 1, bgcolor: "#ffffff" }} + sx={{ + zIndex: (theme) => theme.zIndex.drawer + 1, + bgcolor: "#ffffff", + height: "72px", + justifyContent: "center", + boxShadow: "none", + }} > diff --git a/src/components/Steps/NextAndBack.tsx b/src/components/Steps/NextAndBack.tsx index 69427d67..e63c5d78 100644 --- a/src/components/Steps/NextAndBack.tsx +++ b/src/components/Steps/NextAndBack.tsx @@ -17,37 +17,31 @@ export function NextAndBack({ final, }: Props) { return ( - - - + + {activeStep !== 0 && ( + + )} + {activeStep < steps && ( + + )} {activeStep === steps && <>{final}} ); diff --git a/src/components/Steps/StepsButton.tsx b/src/components/Steps/StepsButton.tsx deleted file mode 100644 index 9c2dea86..00000000 --- a/src/components/Steps/StepsButton.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { Box, Step, StepLabel, Stepper } from "@mui/material"; -import React, { useState } from "react"; -import { NextAndBack } from "components/Steps/NextAndBack"; - -interface Props { - steps: { - label: string; - component: React.ReactNode; - }[]; - finalComponent: React.ReactNode; -} - -export function StepsButton({ steps, finalComponent }: Props) { - const [activeStep, setActiveStep] = useState(0); - - return ( - - {steps[activeStep].component} - - {steps.map((s) => { - const stepProps: { completed?: boolean } = {}; - return ( - - {s.label} - - ); - })} - - setActiveStep(activeStep + 1)} - onBack={() => setActiveStep(activeStep - 1)} - final={finalComponent} - /> - - ); -} diff --git a/src/form/FormikHelpers.tsx b/src/form/FormikHelpers.tsx index 78be82f3..0b92baca 100644 --- a/src/form/FormikHelpers.tsx +++ b/src/form/FormikHelpers.tsx @@ -4,6 +4,8 @@ import React, { useEffect, } from "react"; import { + Box, + Button, FormControl, FormControlLabel, FormHelperText, @@ -29,6 +31,7 @@ type FormikTextFieldProps = TextFieldProps & { small?: boolean; type?: HTMLInputTypeAttribute; disabled?: boolean; + useTopLabel?: boolean; }; export const FormikTextField: React.FC = (props) => { @@ -43,19 +46,36 @@ export const FormikTextField: React.FC = (props) => { helperText = `${len}/${props.maxLengthInstantFeedback} characters`; } + const extraOmit = props.useTopLabel ? ["label"] : []; return ( - + + {props.useTopLabel && ( + {props.label} + )} + + ); }; @@ -198,16 +218,15 @@ export const FormikSubmitButton: React.FC = ({ return (
- {formik.isSubmitting ? inProgressLabel : label} - +
); diff --git a/src/theme.tsx b/src/theme.tsx index 111a866f..1936af79 100644 --- a/src/theme.tsx +++ b/src/theme.tsx @@ -14,10 +14,10 @@ export const theme = createTheme({ }, palette: { primary: { - main: "#F8532BCC", + main: "#423eee", }, secondary: { - main: "#4C54D2", + main: "#fe5907", }, background: { default: "#F1F3F5", @@ -28,4 +28,21 @@ export const theme = createTheme({ secondary: "#A0A1B2", }, }, + components: { + MuiButton: { + styleOverrides: { + root: { + borderRadius: "1000px", + }, + }, + }, + MuiCard: { + styleOverrides: { + root: { + borderRadius: "12px", + boxShadow: "rgba(99, 105, 110, 0.18) 0px 1px 12px 0px", + }, + }, + }, + }, }); diff --git a/src/validation/RegistrationSchema.tsx b/src/validation/RegistrationSchema.tsx index 7fb88fa1..14c8176b 100644 --- a/src/validation/RegistrationSchema.tsx +++ b/src/validation/RegistrationSchema.tsx @@ -12,12 +12,11 @@ export const RegistrationSchema = object().shape({ .label("Email address") .required() .matches(EmailRegex, "Please enter a valid email address"), - firstName: string().label("First name").required(), - lastName: string().label("Last name").required(), + fullName: string().label("Full name").required(), advertiser: object().shape({ - name: string().label("Organization name").required(), + name: string().label("Business name").required(), url: string() - .label("Organization URL") + .label("Business URL") .required() .matches(NoSpacesRegex, `URL must not contain any whitespace`) .matches(HttpsRegex, `URL must start with https://`) @@ -26,11 +25,11 @@ export const RegistrationSchema = object().shape({ `Please enter a valid URL, for example https://brave.com`, ), phone: string() - .label("Organization phone number") + .label("Business phone number") .required() .matches( PhoneRegex, - "Please enter a valid phone number, including country code.", + "Please enter a valid phone number, that has no spaces, and includes country code.", ), }), address: object().shape({ From 77e3a938ae9268a9f8170f3d747a0100f9c82f83 Mon Sep 17 00:00:00 2001 From: Ian Krieger <48930920+IanKrieger@users.noreply.github.com> Date: Tue, 1 Aug 2023 11:03:21 -0400 Subject: [PATCH 08/10] fix: change link, adjust margin (#848) --- src/auth/registration/AdvertiserRegistered.tsx | 2 +- src/auth/registration/Register.tsx | 4 ++-- src/components/AppBar/LandingPageAppBar.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/auth/registration/AdvertiserRegistered.tsx b/src/auth/registration/AdvertiserRegistered.tsx index 5e3c6bd5..2f16b861 100644 --- a/src/auth/registration/AdvertiserRegistered.tsx +++ b/src/auth/registration/AdvertiserRegistered.tsx @@ -44,7 +44,7 @@ export function AdvertiserRegistered({ error }: Props) { In the meantime, check out our{" "} - + advertiser resources . If you have any questions, please reach out to{" "} diff --git a/src/auth/registration/Register.tsx b/src/auth/registration/Register.tsx index cd3f8f66..6dea71ee 100644 --- a/src/auth/registration/Register.tsx +++ b/src/auth/registration/Register.tsx @@ -33,9 +33,9 @@ export function Register() { return ( - + - + {steps[activeStep].label} diff --git a/src/components/AppBar/LandingPageAppBar.tsx b/src/components/AppBar/LandingPageAppBar.tsx index b9446965..820258c8 100644 --- a/src/components/AppBar/LandingPageAppBar.tsx +++ b/src/components/AppBar/LandingPageAppBar.tsx @@ -31,7 +31,7 @@ export function LandingPageAppBar() { From a1219c8a7779aaab4a44fce45518c5121c3c0a52 Mon Sep 17 00:00:00 2001 From: Ian Krieger <48930920+IanKrieger@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:00:25 -0400 Subject: [PATCH 09/10] fix: change image copy (#850) --- images.svg | 69 +++++++++++++++++------------------ src/auth/views/AuthVerify.tsx | 2 +- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/images.svg b/images.svg index 4f48d804..113f86b0 100644 --- a/images.svg +++ b/images.svg @@ -1,28 +1,26 @@ - + - + - + - + - + - + - - - - - + + + - - + + @@ -37,19 +35,19 @@ - - - - - + + + + + - - + + - + - + @@ -65,16 +63,15 @@ - - - - + + + - - + + - + @@ -84,17 +81,17 @@ - + - + - + @@ -119,7 +116,7 @@ - + @@ -150,10 +147,10 @@ - + - + @@ -162,7 +159,7 @@ - + diff --git a/src/auth/views/AuthVerify.tsx b/src/auth/views/AuthVerify.tsx index 0ee82933..29f1222a 100644 --- a/src/auth/views/AuthVerify.tsx +++ b/src/auth/views/AuthVerify.tsx @@ -16,7 +16,7 @@ export function AuthVerify() { id: params.get("id") ?? "", }, onCompleted() { - history.push("/"); + history.push("/user/main"); }, }); From 1e6819881025d089fe022369df2f43730991b6d9 Mon Sep 17 00:00:00 2001 From: Ian Krieger <48930920+IanKrieger@users.noreply.github.com> Date: Wed, 2 Aug 2023 11:26:47 -0400 Subject: [PATCH 10/10] feat: persist metric filter preference (#849) * feat: persist metric filter preference * fix: display even if 0 conversions --- src/graphql/analytics-overview.generated.tsx | 13 +++++ src/graphql/analytics-overview.graphql | 5 ++ src/graphql/types.ts | 5 ++ .../hooks/usePersistMetricFilter.ts | 50 +++++++++++++++++++ .../reports/campaign/EngagementsOverview.tsx | 35 ++++--------- 5 files changed, 83 insertions(+), 25 deletions(-) create mode 100644 src/user/analytics/analyticsOverview/hooks/usePersistMetricFilter.ts diff --git a/src/graphql/analytics-overview.generated.tsx b/src/graphql/analytics-overview.generated.tsx index d686482c..4fc01ff7 100644 --- a/src/graphql/analytics-overview.generated.tsx +++ b/src/graphql/analytics-overview.generated.tsx @@ -39,6 +39,10 @@ export type CampaignWithEngagementsFragment = { endAt: any; pacingIndex?: number | null; format: Types.CampaignFormat; + adSets: Array<{ + __typename?: "AdSet"; + conversions?: Array<{ __typename?: "Conversion"; type: string }> | null; + }>; engagements?: Array<{ __typename?: "Engagement"; creativeinstanceid: string; @@ -82,6 +86,10 @@ export type AnalyticOverviewQuery = { endAt: any; pacingIndex?: number | null; format: Types.CampaignFormat; + adSets: Array<{ + __typename?: "AdSet"; + conversions?: Array<{ __typename?: "Conversion"; type: string }> | null; + }>; engagements?: Array<{ __typename?: "Engagement"; creativeinstanceid: string; @@ -161,6 +169,11 @@ export const CampaignWithEngagementsFragmentDoc = gql` currency pacingIndex format + adSets { + conversions { + type + } + } engagements { ...Engagement } diff --git a/src/graphql/analytics-overview.graphql b/src/graphql/analytics-overview.graphql index ea8ac9ba..45df71b0 100644 --- a/src/graphql/analytics-overview.graphql +++ b/src/graphql/analytics-overview.graphql @@ -33,6 +33,11 @@ fragment CampaignWithEngagements on Campaign { currency pacingIndex format + adSets { + conversions { + type + } + } engagements { ...Engagement } diff --git a/src/graphql/types.ts b/src/graphql/types.ts index 7edde713..8ed21fc1 100644 --- a/src/graphql/types.ts +++ b/src/graphql/types.ts @@ -31,6 +31,11 @@ export type AdvertiserCampaignFilter = { includeCreativeSets?: InputMaybe; }; +export enum AdvertiserSource { + Managed = "MANAGED", + SelfServe = "SELF_SERVE", +} + export type ApproveCampaignInput = { campaignId: Scalars["String"]; }; diff --git a/src/user/analytics/analyticsOverview/hooks/usePersistMetricFilter.ts b/src/user/analytics/analyticsOverview/hooks/usePersistMetricFilter.ts new file mode 100644 index 00000000..65969a80 --- /dev/null +++ b/src/user/analytics/analyticsOverview/hooks/usePersistMetricFilter.ts @@ -0,0 +1,50 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { Metrics, StatsMetric } from "user/analytics/analyticsOverview/types"; +import _ from "lodash"; + +export function usePersistMetricFilter( + opts: { campaignId?: string; hasConversions?: boolean } = {}, +) { + const baseFilter: Metrics = { + metric1: { key: "views", active: true }, + metric2: { key: "clicks", active: false }, + metric3: { + key: opts.hasConversions ? "conversions" : "dismissals", + active: false, + }, + metric4: { key: "landings", active: false }, + }; + + const [metrics, setMetrics] = useState(); + + useEffect(() => { + const rawFilter = window.localStorage.getItem("metricFilter"); + if (rawFilter) { + setMetrics(JSON.parse(rawFilter)); + } else { + setMetrics(baseFilter); + } + }, [opts.hasConversions]); + + const setMetric = useCallback( + (metric: keyof Metrics, value: keyof StatsMetric, active: boolean) => { + if (!metrics) { + return; + } + + const metricsCopy = _.cloneDeep(metrics); + const selectedMetric = metricsCopy[metric]; + + if (selectedMetric) { + selectedMetric.key = value; + selectedMetric.active = active; + } + + setMetrics({ ...metricsCopy }); + window.localStorage.setItem("metricFilter", JSON.stringify(metricsCopy)); + }, + [metrics], + ); + + return { metrics: metrics!, setMetric }; +} diff --git a/src/user/analytics/analyticsOverview/reports/campaign/EngagementsOverview.tsx b/src/user/analytics/analyticsOverview/reports/campaign/EngagementsOverview.tsx index 6d7d41b7..0b0ab506 100644 --- a/src/user/analytics/analyticsOverview/reports/campaign/EngagementsOverview.tsx +++ b/src/user/analytics/analyticsOverview/reports/campaign/EngagementsOverview.tsx @@ -19,6 +19,7 @@ import { CampaignFormat } from "graphql/types"; import { ErrorDetail } from "components/Error/ErrorDetail"; import { ApolloError } from "@apollo/client"; import _ from "lodash"; +import { usePersistMetricFilter } from "user/analytics/analyticsOverview/hooks/usePersistMetricFilter"; interface Props { loading: boolean; @@ -33,6 +34,14 @@ export function EngagementsOverview({ error, loading, }: Props) { + const [grouping, setGrouping] = useState("daily"); + const { metrics, setMetric } = usePersistMetricFilter({ + campaignId: campaign?.id, + hasConversions: campaign?.adSets.some( + (a) => a.conversions && a.conversions.length, + ), + }); + if (error) { return ( ({ - metric1: { key: "views", active: true }, - metric2: { key: "clicks", active: false }, - metric3: { key: "dismissals", active: false }, - metric4: { key: "landings", active: false }, - }); - - const setActiveMetric = ( - metric: keyof Metrics, - value: keyof StatsMetric, - active: boolean, - ) => { - const metricsCopy = _.cloneDeep(metrics); - const selectedMetric = metricsCopy[metric]; - - if (selectedMetric) { - selectedMetric.key = value; - selectedMetric.active = active; - } - setMetrics({ ...metricsCopy }); - }; - const processedData = processData(engagements, metrics, grouping); const processedStats = processStats(engagements); const options = prepareChart(metrics, processedData); @@ -103,7 +88,7 @@ export function EngagementsOverview({