diff --git a/.eslintrc.cjs b/.eslintrc.cjs index d6c9537953..172ad0d1db 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,18 +1,11 @@ module.exports = { root: true, env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended'], ignorePatterns: ['dist', '.eslintrc.cjs'], parser: '@typescript-eslint/parser', plugins: ['react-refresh'], rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], + 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], }, -} +}; diff --git a/src/App.tsx b/src/App.tsx index 32c7f7da43..91e74d0360 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -335,6 +335,7 @@ export default function App() { const isSidebarHidden = location?.pathname.includes(APP_PATHS.PointsVault) || location?.pathname.includes('/snap') || + location?.pathname.includes('/pricing') || location?.pathname.includes(APP_PATHS.DiscordVerification); useInAppNotifications(); diff --git a/src/blocks/alert/Alert.types.ts b/src/blocks/alert/Alert.types.ts index 2e0a42f4bf..f6ce74c0b9 100644 --- a/src/blocks/alert/Alert.types.ts +++ b/src/blocks/alert/Alert.types.ts @@ -1 +1 @@ -export type AlertVariant = 'success' | 'warning' | 'error' | 'info'; +export type AlertVariant = 'success' | 'warning' | 'error' | 'info' | 'basic'; diff --git a/src/blocks/alert/Alert.utils.ts b/src/blocks/alert/Alert.utils.ts index be53753be6..6d7e478b7d 100644 --- a/src/blocks/alert/Alert.utils.ts +++ b/src/blocks/alert/Alert.utils.ts @@ -28,6 +28,13 @@ export const alertVariants: Record< bgColor: 'components-alert-background-info', ctaColor: 'components-alert-text-cta-info', }, + basic: { + icon: InfoFilled, + iconColor: 'components-alert-icon-basic', + borderColor: 'components-alert-stroke-basic', + bgColor: 'components-alert-background-basic', + ctaColor: 'components-alert-text-cta-basic', + }, error: { icon: WarningCircleFilled, iconColor: 'components-alert-icon-error', diff --git a/src/blocks/icons/components/Meteor.tsx b/src/blocks/icons/components/Meteor.tsx new file mode 100644 index 0000000000..d58f3342af --- /dev/null +++ b/src/blocks/icons/components/Meteor.tsx @@ -0,0 +1,73 @@ +import { FC } from 'react'; +import { IconWrapper } from '../IconWrapper'; +import { IconProps } from '../Icons.types'; + +const Meteor: FC = (allProps) => { + const { svgProps: props, ...restProps } = allProps; + return ( + + + + + + + + + + + + + + + + } + {...restProps} + /> + ); +}; + +export default Meteor; diff --git a/src/blocks/icons/index.ts b/src/blocks/icons/index.ts index 9b49da2f6b..07e93a0dc7 100644 --- a/src/blocks/icons/index.ts +++ b/src/blocks/icons/index.ts @@ -103,6 +103,8 @@ export { default as MaximizeLeft } from './components/MaximizeLeft'; export { default as MegaPhone } from './components/MegaPhone'; +export { default as Meteor } from './components/Meteor'; + export { default as Moon } from './components/Moon'; export { default as MoonFilled } from './components/MoonFilled'; diff --git a/src/blocks/illustrations/components/PushLogo.tsx b/src/blocks/illustrations/components/PushLogo.tsx index 53ac3f2698..144b4767dc 100644 --- a/src/blocks/illustrations/components/PushLogo.tsx +++ b/src/blocks/illustrations/components/PushLogo.tsx @@ -6,7 +6,7 @@ const PushLogo: FC = (allProps) => { const { svgProps: props, ...restProps } = allProps; return ( = (allProps) => { gradientUnits="userSpaceOnUse" > - - - - - - - + + + + + + + = (allProps) => { gradientUnits="userSpaceOnUse" > - - - - - - - + + + + + + + = (allProps) => { gradientUnits="userSpaceOnUse" > - - - - - - - + + + + + + + = (allProps) => { gradientUnits="userSpaceOnUse" > - - - - - - - + + + + + + + = (allProps) => { gradientUnits="userSpaceOnUse" > - - - - - - - + + + + + + + = (allProps) => { gradientUnits="userSpaceOnUse" > - - - - - - - + + + + + + + diff --git a/src/blocks/illustrations/components/PushLogoWithNameDark.tsx b/src/blocks/illustrations/components/PushLogoWithNameDark.tsx new file mode 100644 index 0000000000..4b98dfe999 --- /dev/null +++ b/src/blocks/illustrations/components/PushLogoWithNameDark.tsx @@ -0,0 +1,296 @@ +import { FC } from 'react'; +import { IllustrationWrapper } from '../IllustrationWrapper'; +import { IllustrationProps } from '../Illustrations.types'; + +const PushLogoWithNameDark: FC = (allProps) => { + const { svgProps: props, ...restProps } = allProps; + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + {...restProps} + /> + ); +}; + +export default PushLogoWithNameDark; diff --git a/src/blocks/illustrations/components/PushLogoWithNameLight.tsx b/src/blocks/illustrations/components/PushLogoWithNameLight.tsx new file mode 100644 index 0000000000..620a0c3ecd --- /dev/null +++ b/src/blocks/illustrations/components/PushLogoWithNameLight.tsx @@ -0,0 +1,296 @@ +import { FC } from 'react'; +import { IllustrationWrapper } from '../IllustrationWrapper'; +import { IllustrationProps } from '../Illustrations.types'; + +const PushLogoWithNameLight: FC = (allProps) => { + const { svgProps: props, ...restProps } = allProps; + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + {...restProps} + /> + ); +}; + +export default PushLogoWithNameLight; diff --git a/src/blocks/illustrations/index.ts b/src/blocks/illustrations/index.ts index 5c22e31c65..519ffc2f56 100644 --- a/src/blocks/illustrations/index.ts +++ b/src/blocks/illustrations/index.ts @@ -119,6 +119,10 @@ export { default as RewardsCoin } from './components/RewardsCoin'; export { default as PushLogo } from './components/PushLogo'; +export { default as PushLogoWithNameLight } from './components/PushLogoWithNameLight'; + +export { default as PushLogoWithNameDark } from './components/PushLogoWithNameDark'; + export { default as Polygon } from './components/Polygon'; export { default as PolygonZK } from './components/PolygonZK'; diff --git a/src/blocks/index.ts b/src/blocks/index.ts index 20c63aa278..678c54372d 100644 --- a/src/blocks/index.ts +++ b/src/blocks/index.ts @@ -1,4 +1,4 @@ -export { Alert, type AlertProps } from './alert'; +export { Alert, type AlertProps, type AlertVariant } from './alert'; export { Box, type BoxProps } from './box'; export { Button, type ButtonProps } from './button'; export { Dropdown, type DropdownProps } from './dropdown'; diff --git a/src/blocks/progressBar/ProgressBar.tsx b/src/blocks/progressBar/ProgressBar.tsx index e83c8c9630..ca4a5a648f 100644 --- a/src/blocks/progressBar/ProgressBar.tsx +++ b/src/blocks/progressBar/ProgressBar.tsx @@ -1,40 +1,47 @@ import type { FC } from 'react'; -import styled, { FlattenSimpleInterpolation } from 'styled-components'; - +import styled from 'styled-components'; import type { ProgressBarProps } from './ProgressBar.types'; import { getProgressWidthPercentage } from './ProgressBar.utils'; -const StyledProgressBarContainer = styled.div<{ css?: FlattenSimpleInterpolation }>` - /* Default CSS */ +const StyledProgressBarContainer = styled.div` background-color: var(--components-progress-bar-background-default); width: 100%; height: 4px; border-radius: var(--radius-xxs, 8px); - - /* Extra CSS prop */ - ${({ css }) => css || ''} `; -const StyledProgressBar = styled.div<{ width: string }>` - /* Default CSS */ +const StyledProgressBar = styled.div<{ width: string; isComplete: boolean }>` border-radius: var(--radius-xxs, 8px); - background-color: var(--components-progress-bar-background-progress); + background-color: ${({ isComplete }) => + isComplete + ? 'var(--components-progress-bar-background-complete)' + : 'var(--components-progress-bar-background-progress)'}; height: 100%; width: ${({ width }) => width}; - transition: width 0.3s ease; + transition: + width 0.3s ease, + background-color 0.3s ease; `; -const ProgressBar: FC = ({ progress, max = 100, ...rest }) => ( - - - -); +const ProgressBar: FC = ({ progress, max = 100, ...rest }) => { + const progressPercentage = getProgressWidthPercentage(progress, max); + const isComplete = progressPercentage >= 100; + + return ( + + + + ); +}; ProgressBar.displayName = 'ProgressBar'; diff --git a/src/blocks/tabs/Tabs.styled.ts b/src/blocks/tabs/Tabs.styled.ts index cf9c0649fc..88c34481db 100644 --- a/src/blocks/tabs/Tabs.styled.ts +++ b/src/blocks/tabs/Tabs.styled.ts @@ -1,7 +1,12 @@ import { Tabs as ReachTabs, TabList, Tab } from '@reach/tabs'; import { textVariants } from '../text'; -import styled from 'styled-components'; -import { deviceMediaQ } from '../theme'; +import styled, { CSSProperties } from 'styled-components'; +import { ResponsiveProp } from 'blocks'; + +export type TabListProps = { + /* Used to align tabs */ + alignSelf?: ResponsiveProp; +}; export const StyledFillTabs = styled(ReachTabs)` display: flex; @@ -9,17 +14,14 @@ export const StyledFillTabs = styled(ReachTabs)` gap: var(--spacing-sm); `; -export const StyledFillTabList = styled(TabList)` +export const StyledFillTabList = styled(TabList)` overflow: auto hidden; display: flex; - width: fit-content; - @media${deviceMediaQ.mobileL} { - width: -webkit-fill-available; - } padding: var(--spacing-xxxs); - background-color: var(--surface-secondary); + background-color: var(--surface-tertiary); border-radius: var(--radius-sm); gap: var(--spacing-xxs); + align-self: ${(props) => props.alignSelf ?? 'flex-start'}; `; export const StyledFillTab = styled(Tab)` @@ -34,7 +36,9 @@ export const StyledFillTab = styled(Tab)` color: var(--text-secondary); background-color: var(--surface-transparent); border-radius: var(--radius-xs); - transition: background-color 0.3s, color 0.3s; + transition: + background-color 0.3s, + color 0.3s; border-bottom: none; &[data-selected] { @@ -72,13 +76,15 @@ export const StyledLineTabs = styled(ReachTabs)` gap: var(--spacing-sm); `; -export const StyledLineTabList = styled(TabList)` +export const StyledLineTabList = styled(TabList)` overflow: auto hidden; display: flex; background-color: var(--surface-transparent); gap: var(--spacing-xs); justify-content: flex-start; border-bottom: var(--border-sm) solid var(--stroke-secondary); + align-self: ${(props) => props.alignSelf ?? 'flex-start'}; + width: 100%; `; export const StyledLineTab = styled(Tab)` @@ -92,7 +98,9 @@ export const StyledLineTab = styled(Tab)` margin-bottom: -1px; background-color: var(--surface-transparent); color: var(--text-secondary); - transition: background-color 0.3s, color 0.3s; + transition: + background-color 0.3s, + color 0.3s; border-bottom: var(--border-md) solid var(--surface-transparent); &[data-selected] { diff --git a/src/blocks/tabs/Tabs.tsx b/src/blocks/tabs/Tabs.tsx index 357a50d81e..d7ac8c90a3 100644 --- a/src/blocks/tabs/Tabs.tsx +++ b/src/blocks/tabs/Tabs.tsx @@ -10,6 +10,8 @@ import { StyledLineTabs, StyledTabLabel, } from './Tabs.styled'; +import { ResponsiveProp } from 'blocks'; +import { CSSProperties } from 'styled-components'; export type TabItem = { key: string; @@ -24,9 +26,10 @@ export type TabsProps = { onChange?: (activeKey: string) => void; activeKey?: string; variant?: 'line' | 'fill'; + alignTabs?: ResponsiveProp; }; -const Tabs: React.FC = ({ items, onChange, variant = 'line', activeKey }) => { +const Tabs: React.FC = ({ items, onChange, variant = 'line', activeKey, alignTabs }) => { const handleChange = (index: number) => { const activeItem = items[index]; if (activeItem && !activeItem.disabled) { @@ -49,7 +52,10 @@ const Tabs: React.FC = ({ items, onChange, variant = 'line', activeKe role="tabpanel" keyboardActivation={TabsKeyboardActivation.Auto} > - + {items.map((item) => ( ; @@ -138,3 +147,56 @@ export const channelCategoriesMap: Record = { '0x63381E4b8fE26cb1f55cc38e8369990594E017b1': 'Service', '0x80375eAD5561e19668eb1Dd2b6A44Fa14D5eB6BF': 'Service', }; + +export const purchasePlanAlertConfig: { + [x: string]: (planName?: string, daysRemaining?: number) => PurchasePlanAlertObjType; +} = { + success: (planName) => ({ + description: `Purchase Successful. Push ${planName} Plan`, + actionText: 'View on Explorer', + variant: 'success', + }), + renewalReminder: (planName, daysRemaining) => ({ + description: `Your Push ${planName} plan ends in ${daysRemaining} days`, + actionText: 'Renew Plan', + variant: 'warning', + }), + expired: (planName) => ({ + description: `Your Push ${planName} plan has expired`, + actionText: 'Renew Plan', + variant: 'error', + }), + notificationLimit: () => ({ + description: `Web2 Notifications limit reached. Upgrade for more features.`, + actionText: 'Upgrade Plan', + variant: 'warning', + }), +}; + +export const faqList: FAQItemTypes[] = [ + { + id: 1, + question: 'What is Push?', + answer: , + }, + { + id: 2, + question: 'What is Push trying to solve?', + answer: , + }, + { + id: 3, + question: 'What are the web3 communication products launched by Push?', + answer: , + }, + { + id: 4, + question: 'How can I use Push as an end-user?', + answer: , + }, + { + id: 5, + question: 'Is Push a blockchain? Is Push decentralised?', + answer: , + }, +]; diff --git a/src/common/Common.types.ts b/src/common/Common.types.ts index 00baba42a2..9743568f1e 100644 --- a/src/common/Common.types.ts +++ b/src/common/Common.types.ts @@ -1,3 +1,6 @@ +import { AlertProps, AlertVariant } from 'blocks'; +import { ReactNode } from 'react'; + export type ModalResponse = { isOpen: boolean; onClose: () => void; @@ -7,3 +10,15 @@ export type ModalResponse = { export type UnlockProfileModalTypes = 'portal' | 'container'; export type EnvType = 'prod' | 'dev' | 'staging'; + +export type PurchasePlanAlertObjType = { + description: AlertProps['description']; + actionText: AlertProps['actionText']; + variant: AlertVariant; +}; + +export type FAQItemTypes = { + id: number; + question: string; + answer: ReactNode; +}; diff --git a/src/common/components/FAQAnswers.tsx b/src/common/components/FAQAnswers.tsx new file mode 100644 index 0000000000..6b4dfe9a3a --- /dev/null +++ b/src/common/components/FAQAnswers.tsx @@ -0,0 +1,272 @@ +import { Box, Text, Link } from 'blocks'; +import { FC } from 'react'; +import { css } from 'styled-components'; + +export const FirstFAQAnswer: FC = () => { + return ( + + + Push is the world’s first blockchain-agnostic decentralised communication protocol for Web3. It is an open + network for validating and indexing all sorts of communication (notifications, chats, etc) that can then be + integrated by any crypto frontend (dApps, wallets, etc). + + + Any smart contract, dApp, or backend service can integrate Push to provide a communication layer through + notifications or chats that are tied to the wallet addresses of users. + + + ); +}; + +export const SecondFAQAnswer: FC = () => { + return ( + + + Push is building the communication layer for Web3, using which any dApp, smart contracts or backend can send any + real time communications (such as notifications, chats, video and more) that are tied directly to a user's + wallet address (aka web3 usernames). + + + This addresses a major gap in the web3 infrastructure, and improving the everyday experience for blockchain + users. The notifications (or any other communications) are off-chain, gasless for all scenarios except when a + smart contract sends them (in which case the smart contract pays a slightly higher gas fees for the payload that + is sent on blockchain). + + + While communications are encrypted and secure, they utilize Push open network which means any dApp or crypto + wallet can easily integrate them making the lives of all web3 users a lot easier and more akin to web2 UX where + apps (or protocols) communicate with their users whenever something of importance occurs or is about to occur + for them. + + + ); +}; + +export const ThirdFAQAnswer: FC = () => { + return ( + + + ⚬ Push Notifications: Enables any smart contract, dApp, backend to deliver critical informations as + notifications to web3 users directly to their wallet addresses. + + + ⚬ Push Chat(wallet-to-wallet chat): Enabling 2-way communication for web3 users from their wallet + addresses. + + + ); +}; + +export const FourthFAQAnswer: FC = () => { + return ( + + + Connect to the{' '} + + Push dApp + {' '} + & opt-in to channels to get notifications for protocols that are relevant to you. Channels are protocols that + activate themselves on Push protocol to send notification. + + + + You can receive notifications from any crypto frontends that have already integrated Push. Alternatively, you + can use via{' '} + + Push dApp + + ,{' '} + + browser extension + + , and mobile app ( + + Android + {' '} + &{' '} + + iOS + + ) in case your favorite wallet or dApp doesn't have Push support yet. + + + + Push recently launched a wallet-to-wallet communication product called Push Chat which is in alpha stage. Reach + out to us on{' '} + + Discord + {' '} + to get exclusive Push Chat access. + + + ); +}; + +export const FifthFAQAnswer: FC = () => { + return ( + + + Push operates on network of nodes called Push Nodes which are responsible for the validation, storage, and + delivery of notifications & chats. + + + Major efforts are put into decentralising Push Nodes which is in the final stages now. Any content or payloads + getting delivered are already immutable and can't be changed as they are secured using crypto-graphical proofs. + The other part which ensures that the content can't be censored is in final stages now of testing and public + alpha push nodes are expected to be rolled out soon. + + + ); +}; diff --git a/src/common/components/FAQContainer.tsx b/src/common/components/FAQContainer.tsx new file mode 100644 index 0000000000..4c6050882c --- /dev/null +++ b/src/common/components/FAQContainer.tsx @@ -0,0 +1,147 @@ +import { FC, useState } from 'react'; +import { Add, Box, Button, Dash, Front, Link, Text, ArrowUpRight } from 'blocks'; +import { css } from 'styled-components'; +import { faqList } from 'common'; + +export type FAQContainerProps = {}; + +const FAQContainer: FC = ({}) => { + const [expandedQid, setExpandedQid] = useState(null); + + // const answerMapper: { [x: number]: ReactNode } = { + // 1: , + // 2: , + // 3: , + // 4: , + // 5: , + // }; + + return ( + + {/* Render FAQ left side container */} + + + Frequently Asked Questions + + + + + + + {/* Render FAQ Content container */} + + {/* Render list of questions with answers */} + + {faqList.map((faqItem, index) => ( + + + + {faqItem?.question} + + + + {expandedQid === faqItem?.id ? ( + setExpandedQid(null)} + size={28} + /> + ) : ( + setExpandedQid(faqItem?.id)} + size={28} + /> + )} + + + {expandedQid && expandedQid === faqItem?.id && faqItem.answer} + + ))} + + + {/* Render explore more questions view */} + + + + + Explore FAQs + + + + + + + + ); +}; + +export { FAQContainer }; diff --git a/src/common/components/PurchasePlanAlert.tsx b/src/common/components/PurchasePlanAlert.tsx new file mode 100644 index 0000000000..7532157c52 --- /dev/null +++ b/src/common/components/PurchasePlanAlert.tsx @@ -0,0 +1,28 @@ +import { Alert } from 'blocks'; +import { PurchasePlanAlertObjType, purchasePlanAlertConfig } from 'common'; +import { FC } from 'react'; + +export type PurchasePlanAlertProps = { + variant: 'success' | 'renewalReminder' | 'expired' | 'notificationLimit'; + onClose?: () => void; + purchasedPlan?: { planName: string; daysRemaining?: number }; + onAction?: () => void; +}; + +const PurchasePlanAlert: FC = ({ variant, onClose, purchasedPlan, onAction }) => { + const alert: PurchasePlanAlertObjType = purchasePlanAlertConfig[variant]( + purchasedPlan?.planName, + purchasedPlan?.daysRemaining, + ); + return ( + onClose?.() : undefined} + onAction={() => onAction?.()} + actionText={alert.actionText} + /> + ); +}; + +export { PurchasePlanAlert }; diff --git a/src/common/components/index.ts b/src/common/components/index.ts index 4b5412cac5..428b091e11 100644 --- a/src/common/components/index.ts +++ b/src/common/components/index.ts @@ -1,3 +1,4 @@ +export * from './FAQAnswers'; export * from './ChannelDetailsCard'; export * from './ContentLayout'; export * from './Stepper'; @@ -10,3 +11,5 @@ export * from './CopyButton'; export * from './VerifiedChannelTooltipContent'; export * from './InAppChannelNotifications'; export * from './InAppChatNotifications'; +export * from './PurchasePlanAlert'; +export * from './FAQContainer'; diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx new file mode 100644 index 0000000000..6d9f0da415 --- /dev/null +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -0,0 +1,148 @@ +import { useNavigate } from 'react-router-dom'; +import { css } from 'styled-components'; + +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; +import { useGetPricingPlanStatus } from 'queries'; + +import { Box, Button, Info, ProgressBar, Sale, Skeleton, Text } from 'blocks'; +import { useMigrateToFreePlan } from './hooks/useMigrateToFreePlan'; + +export const UpgradePlanNavigationItem = () => { + const navigate = useNavigate(); + const { account, chainId } = useAccount(); + const walletAddress = convertAddressToAddrCaip(account, chainId); + + const { + data: pricingPlanStatus, + isLoading: isPricingPlanStatusLoading, + refetch: refetchPricingPlanStatus, + } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan } = useGetPricingPlanDetails( + pricingPlanStatus, + walletAddress, + ); + + useMigrateToFreePlan({ + pricingPlanStatus, + isLoading: isPricingPlanStatusLoading, + refetch: refetchPricingPlanStatus, + }); + + const totalQuota = + (pricingPlanStatus?.email_total_quota ?? 0) + + (pricingPlanStatus?.discord_total_quota ?? 0) + + (pricingPlanStatus?.telegram_total_quota ?? 0); + + const totalQuotaUsed = + (pricingPlanStatus?.email_quota_used ?? 0) + + (pricingPlanStatus?.discord_quota_used ?? 0) + + (pricingPlanStatus?.telegram_quota_used ?? 0); + + const totalQuotaRemaining = totalQuota - totalQuotaUsed; + + const handleGoToPricing = () => { + navigate('/pricing'); + }; + + return ( + + + + + {(pricingPlanStatus && !isUserOnFreePlan && `Push ${selectedPlan?.name}`) || 'Free Plan'} + + {!isUserOnEnterprisePlan && ( + + )} + + + + + {!isUserOnFreePlan && totalQuotaRemaining == 0 && } + + Monthly Web2 Notifications + + + + + + + + {!isUserOnFreePlan && totalQuotaRemaining == 0 ? 'Limit reached' : `${totalQuotaRemaining} Remaining`} + + + {!isUserOnFreePlan && totalQuotaRemaining == 0 && ( + + Upgrade Plan + + )} + + + + + ); +}; diff --git a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx new file mode 100644 index 0000000000..3a03d9efbc --- /dev/null +++ b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx @@ -0,0 +1,212 @@ +import { css } from 'styled-components'; +import { useNavigate } from 'react-router-dom'; + +import { useGetPricingPlanStatus } from 'queries'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; + +import { Box, Button, Info, ProgressBar, Text } from 'blocks'; + +const UserPlanAndBillings = () => { + const { account, chainId } = useAccount(); + const navigate = useNavigate(); + const walletAddress = convertAddressToAddrCaip(account, chainId); + const { data: pricingPlanStatus } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + + const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan, isUserOnYearlyPlan, pricingListDescriptions } = + useGetPricingPlanDetails(pricingPlanStatus, walletAddress); + + const planNotifications = [ + { + title: 'Email Notification Delivery', + subtitle: `${(pricingPlanStatus?.email_total_quota ?? 0) - (pricingPlanStatus?.email_quota_used ?? 0)} remaining`, + progress: pricingPlanStatus?.email_quota_used ?? 0, + max: pricingPlanStatus?.email_total_quota ?? 0, + }, + { + title: 'Telegram Notification Delivery', + subtitle: `${(pricingPlanStatus?.telegram_total_quota ?? 0) - (pricingPlanStatus?.telegram_quota_used ?? 0)} remaining`, + progress: pricingPlanStatus?.telegram_quota_used ?? 0, + max: pricingPlanStatus?.telegram_total_quota ?? 0, + }, + { + title: 'Discord Notification Delivery', + subtitle: `${(pricingPlanStatus?.discord_total_quota ?? 0) - (pricingPlanStatus?.discord_quota_used ?? 0)} remaining`, + progress: pricingPlanStatus?.discord_quota_used ?? 0, + max: pricingPlanStatus?.discord_total_quota ?? 0, + }, + ]; + + const navigateToPricing = () => { + navigate('/pricing'); + }; + + return ( + + + Take full control of your Push Notification plan, manage and stay up to date with your plan usage + + + + + + {(pricingPlanStatus && !isUserOnFreePlan && `Push ${selectedPlan?.name}`) || 'Free Plan'} + + {!isUserOnFreePlan && ( + + ${isUserOnYearlyPlan ? (selectedPlan?.value! * 0.85).toFixed(2) : selectedPlan?.value}/mo + + )} + + + + + {pricingListDescriptions?.find((desc) => desc.id === selectedPlan?.id)?.description} + + {!isUserOnFreePlan && isUserOnYearlyPlan && ( + + billed yearly + + )} + + + + {!isUserOnEnterprisePlan && ( + + )} + + + + + + Plan Usage + + + Keep track of usage in your current cycle + + + + + {planNotifications?.map((item) => ( + + + {!isUserOnFreePlan && item?.progress - item?.max == 0 && } + + {item.title} + + + + + + + + {!isUserOnFreePlan && item?.progress - item?.max == 0 ? 'Limit reached' : item.subtitle} + + + {!isUserOnFreePlan && item?.progress - item?.max == 0 && ( + + Upgrade Plan + + )} + + + ))} + + + ); +}; + +export default UserPlanAndBillings; diff --git a/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx b/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx new file mode 100644 index 0000000000..302ed2b224 --- /dev/null +++ b/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx @@ -0,0 +1,47 @@ +import { useEffect } from 'react'; +import { useInitiatePaymentInfo } from 'queries'; +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; +import { useAccount } from 'hooks'; + +interface UseMigrateToFreePlanProps { + pricingPlanStatus: any; // Replace with proper type if available + isLoading: boolean; + refetch: () => void; +} + +export const useMigrateToFreePlan = ({ pricingPlanStatus, isLoading, refetch }: UseMigrateToFreePlanProps) => { + const { account, chainId, isWalletConnected } = useAccount(); + const walletAddress = convertAddressToAddrCaip(account, chainId); + + const { mutate: handleInitatePayment } = useInitiatePaymentInfo(); + + const handleMigrateToFreePlan = () => { + handleInitatePayment( + { + channel: walletAddress, + pricingPlanId: '1', + currency: 'USDC', + network: chainId, + verificationProof: 'test', + duration: '1', + }, + { + onSuccess: (response) => { + console.log(response); + refetch(); + }, + onError: (error) => { + console.error(error); + }, + }, + ); + }; + + useEffect(() => { + if (isWalletConnected && pricingPlanStatus === null) { + handleMigrateToFreePlan(); + } + }, [isWalletConnected, pricingPlanStatus, account]); + + return { pricingPlanStatus, isLoading }; +}; diff --git a/src/components/userSettings/UserSettings.tsx b/src/components/userSettings/UserSettings.tsx index f5bbd4c509..04ac5f0d50 100644 --- a/src/components/userSettings/UserSettings.tsx +++ b/src/components/userSettings/UserSettings.tsx @@ -7,19 +7,23 @@ import { useDispatch, useSelector } from 'react-redux'; import { useNavigate } from 'react-router-dom'; import { AiOutlineMore } from 'react-icons/ai'; +// Internal Configs +import { device } from 'config/Globals'; +import { useAccount, useDeviceWidthCheck, useGetPricingPlanDetails } from 'hooks'; +import { updateBulkSubscriptions, updateBulkUserSettings } from 'redux/slices/channelSlice'; + // Internal Components -import { useAccount } from 'hooks'; import { Button } from 'primaries/SharedStyling'; import { ImageV2 } from 'components/reusables/SharedStylingV2'; -import { updateBulkSubscriptions, updateBulkUserSettings } from 'redux/slices/channelSlice'; +import { Alert, Box, Text } from 'blocks'; import UserProfileSettings from 'components/UserProfileSettings/UserProfileSettings'; - -// Internal Configs -import { device } from 'config/Globals'; import ChannelListSettings from 'components/channel/ChannelListSettings'; import PushSnapSettings from 'components/PushSnap/PushSnapSettings'; -import { Alert, Box } from 'blocks'; +import UserPlanAndBillings from 'components/userPlanAndBillings/UserPlanAndBillings'; import UserProfileSocialSettings from 'components/UserProfileSettings/UserProfileSocialSettings'; +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; +import { useGetPricingPlanStatus } from 'queries'; +import { calculateExpirationDetails } from './utils'; interface ChannelListItem { channel: string; @@ -30,7 +34,10 @@ interface ChannelListItem { } function UserSettings() { + const isMobile = useDeviceWidthCheck(800); + const { account, chainId } = useAccount(); + const walletAddress = convertAddressToAddrCaip(account, chainId); const { userPushSDKInstance } = useSelector((state: any) => { return state.user; }); @@ -48,6 +55,18 @@ function UserSettings() { const dispatch = useDispatch(); + const { data: pricingPlanStatus } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + + const { isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus, walletAddress); + + const expirationDetails = calculateExpirationDetails(pricingPlanStatus ?? null); + + const navigateToPricing = () => { + navigate('/pricing'); + }; + const fetchChannelDetails = async (channel: string) => { const details = await userPushSDKInstance.channel.info(channel); if (details) { @@ -68,7 +87,7 @@ function UserSettings() { Object.keys(details).map(async (channel) => { const channelData = await fetchChannelDetails(channel); if (channelData) data.push(channelData); - }) + }), ); setChannelList(data); }; @@ -104,16 +123,25 @@ function UserSettings() { value: 0, label: 'My Profile', title: 'Your Profile', + section: 'top', }, { value: 1, label: 'Notification Settings', title: 'Notification Settings', + section: 'top', }, { value: 2, label: 'Push Snap', title: '', + section: 'top', + }, + { + value: 3, + label: 'Plan & Billing', + title: 'Plan & Billing', + section: 'bottom', }, ]; @@ -124,39 +152,88 @@ function UserSettings() { - {selectOptions.map((selectOptions) => ( - setSelectedOption(selectOptions.value)} - key={selectOptions.value} - isSelected={selectOptions.value === selectedOption} - > - {selectOptions.label} - - ))} + {selectOptions + .filter((option) => option.section === 'top') + .map((option) => ( + setSelectedOption(option.value)} + key={option.value} + isSelected={option.value === selectedOption} + > + {option.label} + + ))} + + {!isMobile && ( + + + Developers + + + )} + + {selectOptions + .filter((option) => option.section === 'bottom') + .map((option) => ( + setSelectedOption(option.value)} + key={option.value} + isSelected={option.value === selectedOption} + > + {option.label} + + ))} - {successMessage && ( - - - + {selectedOption === 0 && ( + <> + {successMessage && ( + + + + )} + {errorMessage && ( + + + + )} + )} - {errorMessage && ( - - - + {selectedOption === 3 && isUserOnFreePlan && ( + navigateToPricing()} + actionText="Upgrade Plan" + variant="basic" + /> )} + + {selectedOption === 3 && !isUserOnFreePlan && !expirationDetails?.isExpired && ( + + )} + {selectOptions[selectedOption]?.title && ( - {selectOptions[selectedOption]?.title} + + {selectOptions[selectedOption]?.title} + )} {selectedOption === 0 && ( @@ -169,6 +246,7 @@ function UserSettings() { )} {selectedOption === 1 && } {selectedOption === 2 && } + {selectedOption === 3 && } @@ -291,14 +369,16 @@ const ChannelWrapper = styled.div` `; const ChannelBlock = styled.div` + overflow: hidden; display: flex; + overflow-y: auto; flex-direction: column; + height: auto; flex-grow: 1; min-height: 0; gap: 16px; padding-right: 12px; overflow-y: auto; - &::-webkit-scrollbar-track { background-color: transparent; position: absolute; @@ -327,8 +407,9 @@ const ChannelBlock = styled.div` `; const ChannelContainer = styled.div<{ selectedOption: number }>` - overflow-y: auto; - height: ${(props) => (props.selectedOption === 0 ? 'auto' : '55vh')}; + overflow-y: ${(props) => (props.selectedOption === 3 ? 'none' : 'auto')}; + height: ${(props) => (props.selectedOption === 0 || props.selectedOption === 3 ? 'auto' : '55vh')}; + padding: 12px; &::-webkit-scrollbar-track { @@ -358,13 +439,13 @@ const ChannelContainer = styled.div<{ selectedOption: number }>` } `; -const SectionTitle = styled.div` +const SectionTitle = styled.div<{ bottomSpacing: boolean }>` font-size: 22px; font-weight: 500; line-height: 33px; letter-spacing: normal; text-align: left; - margin-bottom: 20px; + margin-bottom: ${(props) => (props.bottomSpacing ? '20px' : '0px')}; color: ${(props) => props.theme.default.color}; @media ${device.tablet} { diff --git a/src/components/userSettings/utils/index.tsx b/src/components/userSettings/utils/index.tsx new file mode 100644 index 0000000000..fd7a70727f --- /dev/null +++ b/src/components/userSettings/utils/index.tsx @@ -0,0 +1,44 @@ +type ExpirationDetails = { + timeRemaining?: string; // Human-readable time remaining + expirationDate?: string; // Formatted expiration date + isExpired: boolean; // Flag to indicate if the plan has expired +}; + +export const calculateExpirationDetails = ( + pricingPlanStatus: { expirationTimestamp: number } | null, +): ExpirationDetails => { + if (!pricingPlanStatus) { + return { isExpired: true }; // If no pricing plan, mark it as expired + } + + const currentTimestamp = Date.now(); + const expirationTimestamp = pricingPlanStatus.expirationTimestamp; + + if (currentTimestamp >= expirationTimestamp) { + return { isExpired: true }; // If expired, no time remaining or expiry date + } + + const timeRemainingMillis = expirationTimestamp - currentTimestamp; + + // Calculate time components + const days = Math.floor(timeRemainingMillis / (1000 * 60 * 60 * 24)); + const hours = Math.floor((timeRemainingMillis % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + const minutes = Math.floor((timeRemainingMillis % (1000 * 60 * 60)) / (1000 * 60)); + const seconds = Math.floor((timeRemainingMillis % (1000 * 60)) / 1000); + + // Create human-readable time remaining string + const timeRemaining = `${days} days, ${hours} hours, ${minutes} minutes, ${seconds} seconds`; + + // Format expiration date as "Month Day, Year" (e.g., "November 20, 2024") + const expirationDate = new Intl.DateTimeFormat('en-US', { + month: 'long', + day: 'numeric', + year: 'numeric', + }).format(new Date(expirationTimestamp)); + + return { + timeRemaining, + expirationDate, + isExpired: false, // Plan is active + }; +}; diff --git a/src/config/AppPaths.ts b/src/config/AppPaths.ts index 6053968b7f..ed9f7b3a75 100644 --- a/src/config/AppPaths.ts +++ b/src/config/AppPaths.ts @@ -32,6 +32,8 @@ const APP_PATHS = { UserSettings: '/user/settings', ChannelSettings: '/channel/settings', ClaimGalxe: 'claim/galxe', + Pricing: '/pricing', + PurchasePlan: '/pricing/:id', }; export default APP_PATHS; diff --git a/src/config/config-dev.js b/src/config/config-dev.js index e3bfdb022c..00770e9eea 100644 --- a/src/config/config-dev.js +++ b/src/config/config-dev.js @@ -132,6 +132,10 @@ export const addresses = { yieldFarmLP: '0xAB531bD9D39c492a05de65Eee85F6C712c05ea0b', alphaAccessNft: '0x8D71C28831074DfAAfBa98AD0F5DE86E2DE594cc', + + // for monetization section + usdcTokenAddress: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', + usdcRecipient: '0x986a07797a27f51e3276b51C8E32b803a5d80d21', }; export const CHAIN_DETAILS = { diff --git a/src/config/config-prod.js b/src/config/config-prod.js index ab0d981f89..94927d1249 100644 --- a/src/config/config-prod.js +++ b/src/config/config-prod.js @@ -125,6 +125,10 @@ export const addresses = { pushCoreV2: '0x66329Fdd4042928BfCAB60b179e1538D56eeeeeE', //not upgraded alphaAccessNft: '0x87d34d40EFaF2d594A7eD9B1126F15Cb3fc721ef', + + // for monetization section + usdcTokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + usdcRecipient: '0x986a07797a27f51e3276b51C8E32b803a5d80d21', }; export const CHAIN_DETAILS = { diff --git a/src/config/config-staging.js b/src/config/config-staging.js index 6c769f72a4..2276ec0689 100644 --- a/src/config/config-staging.js +++ b/src/config/config-staging.js @@ -129,6 +129,10 @@ export const addresses = { pushToken: '0x37c779a1564DCc0e3914aB130e0e787d93e21804', alphaAccessNft: '0x8D71C28831074DfAAfBa98AD0F5DE86E2DE594cc', + + // for monetization section + usdcTokenAddress: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', + usdcRecipient: '0x986a07797a27f51e3276b51C8E32b803a5d80d21', }; export const CHAIN_DETAILS = { diff --git a/src/hooks/index.ts b/src/hooks/index.ts index 922c359ef8..a24f3c220d 100644 --- a/src/hooks/index.ts +++ b/src/hooks/index.ts @@ -4,3 +4,4 @@ export * from './useSDKSocket'; export * from './useAsyncOperation'; export * from './useAccount'; export * from './useCopy'; +export * from './useGetPricingPlanDetails'; diff --git a/src/hooks/useGetPricingPlanDetails.tsx b/src/hooks/useGetPricingPlanDetails.tsx new file mode 100644 index 0000000000..c4998a7804 --- /dev/null +++ b/src/hooks/useGetPricingPlanDetails.tsx @@ -0,0 +1,34 @@ +import { useGetPricingInfo } from 'queries'; + +export const useGetPricingPlanDetails = (pricingPlanStatus: any, walletAddress: string) => { + const { data: pricingInfoList } = useGetPricingInfo(); + const pricingListDescriptions = [ + { + id: 1, + description: 'For casual degens', + }, + { + id: 2, + description: 'For individuals', + }, + { + id: 3, + description: 'For growing apps', + }, + { + id: 4, + description: 'For advanced solutions', + }, + ]; + + const selectedPlan = pricingInfoList?.find( + (planItem: { id: number }) => + planItem?.id == parseInt(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), + ); + + const isUserOnFreePlan = selectedPlan?.id == 1; + const isUserOnEnterprisePlan = selectedPlan?.id == 4; + const isUserOnYearlyPlan = pricingPlanStatus?.pricingPlanTaken?.[0]?.duration == 12; + + return { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan, isUserOnYearlyPlan, pricingListDescriptions }; +}; diff --git a/src/modules/channelDashboard/ChannelDashboard.tsx b/src/modules/channelDashboard/ChannelDashboard.tsx index 4069b4235c..3e530a2d68 100644 --- a/src/modules/channelDashboard/ChannelDashboard.tsx +++ b/src/modules/channelDashboard/ChannelDashboard.tsx @@ -1,27 +1,134 @@ // React and other libraries import { useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; // Components -import { Box } from 'blocks'; +import { Alert, Box } from 'blocks'; import { ChannelAddSubgraph } from './components/ChannelAddSubgraph'; import { ChannelAddDelegate } from './components/ChannelAddDelegate'; import { ReactivateChannel } from './components/ReactivateChannel'; import { DeactivateChannel } from './components/DeactivateChannel'; import { UserChannelDashboard } from './components/UserChannelDashboard'; +// Hooks +import useFetchChannelDetails from 'common/hooks/useFetchUsersChannelDetails'; +import { useGetChannelCategories, useGetPaymentDetails, useGetPricingPlanStatus } from 'queries'; +import { PurchasePlanAlert, useDisclosure } from 'common'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; + // Types import { DashboardActiveState } from './ChannelDashboard.types'; import { EditChannelV2 } from 'modules/editChannel/EditChannelV2'; -import useFetchChannelDetails from 'common/hooks/useFetchUsersChannelDetails'; -import { useGetChannelCategories } from 'queries'; +import { calculateExpirationDetails } from 'components/userSettings/utils'; +import { UpgradePlanModal } from './components/UpgradePlanModal'; const ChannelDashboard = () => { const [activeState, setActiveState] = useState('dashboard'); + const [searchParams] = useSearchParams(); + const paymentId = searchParams.get('paymentId'); + const { account, chainId } = useAccount(); + const walletAddress = convertAddressToAddrCaip(account, chainId); + const navigate = useNavigate(); + const modalControl = useDisclosure(); + + const { data: pricingPlanStatus } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + const { selectedPlan, isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus, walletAddress); + + const { data: paymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); + const { channelDetails, loadingChannelDetails, refetchChannelDetails } = useFetchChannelDetails(); useGetChannelCategories(); + + const expiryDetails = calculateExpirationDetails(pricingPlanStatus!); + + const totalQuota = + (pricingPlanStatus?.email_total_quota ?? 0) + + (pricingPlanStatus?.discord_total_quota ?? 0) + + (pricingPlanStatus?.telegram_total_quota ?? 0); + + const totalQuotaUsed = + (pricingPlanStatus?.email_quota_used ?? 0) + + (pricingPlanStatus?.discord_quota_used ?? 0) + + (pricingPlanStatus?.telegram_quota_used ?? 0); + + const isAnyAlertShowing = + paymentDetails?.payment_status == 'SUCCESS' || + (pricingPlanStatus && !isUserOnFreePlan && expiryDetails?.isExpired) || + (pricingPlanStatus && !isUserOnFreePlan && parseInt(expiryDetails?.timeRemaining!) < 7) || + (isUserOnFreePlan && totalQuota - totalQuotaUsed < 100); + + // show the Go Pro alert when no other Alert is showing and user is on Free Plan + const showGoProAlert = isUserOnFreePlan && !isAnyAlertShowing && activeState === 'dashboard'; + return ( - + + {activeState === 'dashboard' && ( + + {/* Payment success alert after redirecting from purchase plan page */} + {paymentDetails?.payment_status == 'SUCCESS' && ( + { + window.open(`https://sepolia.etherscan.io/tx/${paymentDetails?.transaction_hash}`, '_blank'); + }} + /> + )} + + {/* Expiry notice alert after plan has expired */} + {pricingPlanStatus && !isUserOnFreePlan && expiryDetails?.isExpired && ( + { + navigate('/pricing'); + }} + /> + )} + + {/* Expiry notice alert when expiry is less than 7 days */} + {pricingPlanStatus && !isUserOnFreePlan && parseInt(expiryDetails?.timeRemaining!) < 7 && ( + { + navigate('/pricing'); + }} + /> + )} + + {/* Alert when user is on free plan, and notification limit is already reached */} + {isUserOnFreePlan && totalQuota - totalQuotaUsed < 100 && ( + { + navigate('/pricing'); + }} + /> + )} + + )} + + {showGoProAlert && ( + modalControl.open()} + actionText="Upgrade Plan" + variant="basic" + /> + )} + + {modalControl.isOpen && } + {activeState === 'dashboard' && ( = ({ isAliasVerified, }) => { const navigate = useNavigate(); + const { account, chainId } = useAccount(); + const walletAddress = convertAddressToAddrCaip(account, chainId); + + const { data: pricingPlanStatus, isLoading: isPricingPlanStatusLoading } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + + const { selectedPlan } = useGetPricingPlanDetails(pricingPlanStatus, walletAddress); let verifiedAliasChainIds = channelDetails?.aliases @@ -224,6 +234,10 @@ const ChannelDashboardInfo: FC = ({ /> ) : null} + + + {selectedPlan && selectedPlan?.id !== 1 ? : null} + diff --git a/src/modules/channelDashboard/components/UpgradePlanModal.tsx b/src/modules/channelDashboard/components/UpgradePlanModal.tsx new file mode 100644 index 0000000000..d1e5804ff3 --- /dev/null +++ b/src/modules/channelDashboard/components/UpgradePlanModal.tsx @@ -0,0 +1,131 @@ +import { FC } from 'react'; + +import { ModalResponse } from 'common'; +import { useBlocksTheme } from 'blocks/Blocks.hooks'; +import { useGetPricingInfo } from 'queries'; +import { formatSentenceWithBoldNumbers, parseStringToArray } from 'modules/pricing/utils'; +import { useNavigate } from 'react-router-dom'; + +import { Box, Button, Modal, PushLogoWithNameDark, PushLogoWithNameLight, Text, Tick } from 'blocks'; + +export type ConfirmPurchaseModalProps = { + modalControl: ModalResponse; +}; + +const UpgradePlanModal: FC = ({ modalControl }) => { + const { isOpen, onClose } = modalControl; + const { mode } = useBlocksTheme(); + const { data: pricingInfoList } = useGetPricingInfo(); + const navigate = useNavigate(); + + const selectedPlan = pricingInfoList?.find((item) => item.name == 'Pro'); + + return ( + + + + {mode === 'light' ? : } + + Go Pro for $14.99/mo + + + + + Upgrade to get access to the following features: + + + {parseStringToArray(selectedPlan?.description ?? '')?.map((benefit, benefitIndex) => ( + + + + + {formatSentenceWithBoldNumbers(benefit)} + + + + ))} + + + + + + + + + + Compare all plans. Change or cancel anytime + + + + + ); +}; + +export { UpgradePlanModal }; diff --git a/src/modules/createChannel/CreateChannel.tsx b/src/modules/createChannel/CreateChannel.tsx index a23590fa94..376fd5a270 100644 --- a/src/modules/createChannel/CreateChannel.tsx +++ b/src/modules/createChannel/CreateChannel.tsx @@ -1,15 +1,15 @@ import { useState } from 'react'; import { ethers } from 'ethers'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate, useSearchParams } from 'react-router-dom'; import { Alert, Box } from 'blocks'; import { appConfig } from 'config'; import APP_PATHS from 'config/AppPaths'; -import { Stepper } from 'common'; -import { useAccount } from 'hooks'; +import { PurchasePlanAlert, Stepper } from 'common'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; import { CHANNEL_TYPE } from 'helpers/UtilityHelper'; import { IPFSupload } from 'helpers/IpfsHelper'; -import { useApprovePUSHToken, useCreateChannel } from 'queries'; +import { useApprovePUSHToken, useCreateChannel, useGetPaymentDetails, useGetPricingPlanStatus } from 'queries'; import { ChannelInfo } from './components/ChannelInfo'; import { @@ -32,13 +32,17 @@ import { ChannelInfoFormValues, CreateChannelProgressType, } from './CreateChannel.types'; +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; const fees = ethers.utils.parseUnits(CHANNEL_STAKE_FEES.toString(), 18); const CreateChannel = () => { const { account, provider, isWalletConnected, chainId, connect } = useAccount(); + const walletAddress = convertAddressToAddrCaip(account, chainId); const navigate = useNavigate(); + const [searchParams] = useSearchParams(); + const paymentId = searchParams.get('paymentId'); const onCoreNetwork = appConfig.coreContractChain === chainId; @@ -59,6 +63,14 @@ const CreateChannel = () => { const [channelCreationError, setChannelCreationError] = useState(errorInitialState); + const { data: pricingPlanStatus } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + + const { selectedPlan } = useGetPricingPlanDetails(pricingPlanStatus, walletAddress); + + const { data: paymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); + const handleProgressBar = (progress: number, progressInfo: string, processingInfo: string) => { setProgressState((prevState) => ({ ...prevState, @@ -102,7 +114,7 @@ const CreateChannel = () => { setProgressState(progressInitialState); return false; }, - } + }, ); }; @@ -134,7 +146,7 @@ const CreateChannel = () => { handleProgressBar( 90, 'Creating your channel, Aligning pixels, adjusting padding... This may take some time.', - 'Redirecting... Please do not refresh' + 'Redirecting... Please do not refresh', ); }, 2000); @@ -142,7 +154,7 @@ const CreateChannel = () => { handleProgressBar( 100, 'Creating your channel, Aligning pixels, adjusting padding... This may take some time.', - 'Redirecting... Please do not refresh' + 'Redirecting... Please do not refresh', ); navigate(`${APP_PATHS.ChannelDashboard(account)}`); }, 3000); @@ -162,11 +174,11 @@ const CreateChannel = () => { handleProgressBar( 0, 'There was an error in creating the Channel', - 'Kindly Contact support@epns.io to resolve the issue.' + 'Kindly Contact support@epns.io to resolve the issue.', ); } }, - } + }, ); }; @@ -211,19 +223,34 @@ const CreateChannel = () => { } }; + console.log(paymentId); + return ( handleCreateNewChannel(values)}> + {/* Payment success alert after redirecting from purchase plan page */} + {paymentDetails?.payment_status == 'SUCCESS' && ( + + { + window.open(`https://sepolia.etherscan.io/tx/${paymentDetails?.transaction_hash}`, '_blank'); + }} + /> + + )} + diff --git a/src/modules/dashboard/components/TrendingChannelsList.tsx b/src/modules/dashboard/components/TrendingChannelsList.tsx index 3bf6b16c2a..9d5f9167fe 100644 --- a/src/modules/dashboard/components/TrendingChannelsList.tsx +++ b/src/modules/dashboard/components/TrendingChannelsList.tsx @@ -5,6 +5,7 @@ import { css } from 'styled-components'; //Hooks // import { useGetTrendingChannels } from 'queries/hooks'; + //Constants // import { firstEndDate, secondEndDate, startDate, trendingSource } from '../Dashboard.constants'; // import { appConfig } from 'config'; @@ -75,6 +76,7 @@ const TrendingChannelsList = () => { // If there are channels then render them else render 5 skeletons // const channelList = isLoadingTrendingChannels ? Array(5).fill(0) : trendingChannels; + // State to handle the profile modal const [profileModalVisibility, setProfileModalVisibility] = useState({ isVisible: false, diff --git a/src/modules/pricing/Pricing.constants.ts b/src/modules/pricing/Pricing.constants.ts new file mode 100644 index 0000000000..4ca63acf48 --- /dev/null +++ b/src/modules/pricing/Pricing.constants.ts @@ -0,0 +1,136 @@ +import { PricingPlan } from './Pricing.types'; + +export const pricingPlanList: PricingPlan[] = [ + { + id: 1, + planName: 'Basic', + currency: null, + price: 0, + planFor: 'For Casual degens', + isPopular: false, + billingCriteria: '', + planBenefits: [ + { + benefitName: 'Web3 notification', + limit: 'Unlimited', + }, + { + benefitName: 'Telegram Delivery', + limit: 1000, + }, + { + benefitName: 'Email Delivery', + limit: 1000, + }, + { + benefitName: 'No-code logic builder', + limit: null, + }, + ], + }, + { + id: 2, + planName: 'Pro', + currency: '$', + price: 12.49, + planFor: 'For individuals', + isPopular: true, + billingCriteria: 'per month billed yearly', + planBenefits: [ + { + benefitName: 'Web3 notification', + limit: 'Unlimited', + }, + { + benefitName: 'Telegram Delivery', + limit: 1000, + }, + { + benefitName: 'Email Delivery', + limit: 1000, + }, + { + benefitName: 'No-code logic builder', + limit: null, + }, + ], + }, + { + id: 3, + planName: 'Growth', + currency: '$', + price: 42.49, + planFor: 'For growing apps', + isPopular: false, + billingCriteria: 'per month billed yearly', + planBenefits: [ + { + benefitName: 'Web3 notification', + limit: 'Unlimited', + }, + { + benefitName: 'Telegram Delivery', + limit: 50000, + }, + { + benefitName: 'Email Delivery', + limit: 50000, + }, + { + benefitName: 'Discord Delivery', + limit: 50000, + }, + { + benefitName: 'Priority support within 48hrs', + limit: null, + }, + { + benefitName: 'Platform analytics ', + limit: null, + }, + { + benefitName: 'No-code logic builder', + limit: null, + }, + ], + }, + { + id: 4, + planName: 'Enterprise', + currency: null, + price: null, + planFor: 'For advanced solutions', + isPopular: false, + billingCriteria: 'Custom pricing available', + planBenefits: [ + { + benefitName: 'Web3 notification', + limit: 'Unlimited', + }, + { + benefitName: 'Custom Telegram Delivery', + limit: null, + }, + { + benefitName: 'Custom Email Delivery', + limit: null, + }, + { + benefitName: 'Custom Discord Delivery', + limit: null, + }, + { + benefitName: 'Premium support within 24hrs', + limit: null, + }, + { + benefitName: 'Platform analytics ', + limit: null, + }, + { + benefitName: 'No-code logic builder', + limit: null, + }, + ], + }, +]; diff --git a/src/modules/pricing/Pricing.tsx b/src/modules/pricing/Pricing.tsx new file mode 100644 index 0000000000..a7750bc1fa --- /dev/null +++ b/src/modules/pricing/Pricing.tsx @@ -0,0 +1,30 @@ +import { FC } from 'react'; +import { Box } from 'blocks'; +import { FAQContainer } from 'common'; +import { PricingView } from './components/PricingView'; +import { css } from 'styled-components'; + +export type PricingProps = {}; + +const Pricing: FC = () => { + return ( + + {/* Render Pricing View Component */} + + + {/* Render FAQ Component */} + + + ); +}; + +export { Pricing }; diff --git a/src/modules/pricing/Pricing.types.ts b/src/modules/pricing/Pricing.types.ts new file mode 100644 index 0000000000..df79eda571 --- /dev/null +++ b/src/modules/pricing/Pricing.types.ts @@ -0,0 +1,15 @@ +export type PricingPlan = { + id: number; + planName: string; + currency: string | null; + price: number | null; + planFor: string; + isPopular: boolean; + billingCriteria: string; + planBenefits: { + benefitName: string; + limit: string | number | null; + }[]; +}; + +export type PricingPlanTabsType = 'yearly' | 'monthly'; diff --git a/src/modules/pricing/components/PricingPlanTabs.tsx b/src/modules/pricing/components/PricingPlanTabs.tsx new file mode 100644 index 0000000000..97ea3c64ad --- /dev/null +++ b/src/modules/pricing/components/PricingPlanTabs.tsx @@ -0,0 +1,38 @@ +import { useState } from 'react'; + +import { Box, TabItem, Tabs } from 'blocks'; + +import { PricingPlanTabsType } from '../Pricing.types'; +import { PricingPlansContainer } from './PricingPlansContainer'; + +const PricingPlanTabs = () => { + const pricingPlanTabs: TabItem[] = [ + { + label: 'Yearly', + key: 'yearly', + children: , + }, + { + label: 'Monthly', + key: 'monthly', + children: , + }, + ]; + const [selectedPricingPlanTab, setSelectedPricingPlanTab] = useState( + pricingPlanTabs[1].key as PricingPlanTabsType, + ); + + return ( + + setSelectedPricingPlanTab(activeKey as PricingPlanTabsType)} + alignTabs="center" + /> + + ); +}; + +export { PricingPlanTabs }; diff --git a/src/modules/pricing/components/PricingPlansContainer.tsx b/src/modules/pricing/components/PricingPlansContainer.tsx new file mode 100644 index 0000000000..ebc2291ace --- /dev/null +++ b/src/modules/pricing/components/PricingPlansContainer.tsx @@ -0,0 +1,50 @@ +import { FC } from 'react'; +import { Box, Text } from 'blocks'; +import { PricingPlanTabsType } from '../Pricing.types'; +import { PricingPlansList } from './PricingPlansList'; + +export type PricingPlansContainerProps = { + type: PricingPlanTabsType; +}; + +const PricingPlansContainer: FC = ({ type }) => { + return ( + + + + Save + + + 15% + + + on selecting a yearly plan + + + + {/* Render pricing plans list */} + + + ); +}; + +export { PricingPlansContainer }; diff --git a/src/modules/pricing/components/PricingPlansList.tsx b/src/modules/pricing/components/PricingPlansList.tsx new file mode 100644 index 0000000000..fc0f6cc8b3 --- /dev/null +++ b/src/modules/pricing/components/PricingPlansList.tsx @@ -0,0 +1,209 @@ +import { FC } from 'react'; +import { css } from 'styled-components'; + +import { useGetPricingInfo } from 'queries'; + +import { PricingPlanTabsType } from '../Pricing.types'; + +import { Box, Button, Link, Meteor, Skeleton, Tag, Text, Tick } from 'blocks'; +import { formatSentenceWithBoldNumbers, parseStringToArray } from '../utils'; + +export type PricingPlansListProps = { + type: PricingPlanTabsType; +}; + +const PricingPlansList: FC = ({ type }) => { + const { data: pricingInfoList, isLoading: isPricingInfoListLoading } = useGetPricingInfo(); + const pricingList = isPricingInfoListLoading ? Array(4).fill(0) : pricingInfoList; + + const pricingListDescriptions = [ + { + id: 1, + description: 'For casual degens', + }, + { + id: 2, + description: 'For individuals', + }, + { + id: 3, + description: 'For growing apps', + }, + { + id: 4, + description: 'For advanced solutions', + }, + ]; + + return ( + + {pricingList?.map((planItem, planIndex) => ( + + + + + + {planItem?.name} + + {planItem?.name === 'Pro' && ( + } + label="Popular" + variant="brand" + size="medium" + /> + )} + + + {pricingListDescriptions?.find((desc) => desc.id === planItem?.id)?.description} + + + + + + + {planItem?.value >= 0 + ? planItem?.value > 0 + ? (type == 'monthly' ? planItem?.value : planItem?.value * 0.85)?.toLocaleString('en-US', { + style: 'currency', + currency: 'USD', + }) + : 'Free' + : 'Talk to us!'} + + + {planItem?.value > 0 && ( + + {(planItem.id == '2' || planItem.id == '3') && `per month`} {type == 'yearly' && `billed yearly`} + + )} + + {planItem?.id == '4' && ( + + Custom pricing available + + )} + + + 0 ? `/pricing/${planItem?.id}?type=${type}` : '#'}> + + + + + {/* Render the Plan benefit list */} + + {parseStringToArray(planItem?.description).map((benefit, benefitIndex) => ( + + + + + {formatSentenceWithBoldNumbers(benefit)} + + + + ))} + + + + ))} + + ); +}; + +export { PricingPlansList }; diff --git a/src/modules/pricing/components/PricingView.tsx b/src/modules/pricing/components/PricingView.tsx new file mode 100644 index 0000000000..3f994370f7 --- /dev/null +++ b/src/modules/pricing/components/PricingView.tsx @@ -0,0 +1,78 @@ +import { FC } from 'react'; +import { css } from 'styled-components'; +import { Box, Link, Text } from 'blocks'; +import { PricingPlanTabs } from './PricingPlanTabs'; + +export type PricingViewProps = {}; + +const PricingView: FC = () => { + return ( + + + + Built to scale with your app. + + + Unlock the power of web3 notifications. + + + Choose a plan that fits your needs. + + + + {/* Render plans tab and list */} + + + + + + + Have more questions? Get in touch with our + + + {' '} + sales team. + + + + ); +}; + +export { PricingView }; diff --git a/src/modules/pricing/index.ts b/src/modules/pricing/index.ts new file mode 100644 index 0000000000..5904dfe954 --- /dev/null +++ b/src/modules/pricing/index.ts @@ -0,0 +1 @@ +export { Pricing, type PricingProps } from './Pricing'; diff --git a/src/modules/pricing/utils/index.tsx b/src/modules/pricing/utils/index.tsx new file mode 100644 index 0000000000..d880fab821 --- /dev/null +++ b/src/modules/pricing/utils/index.tsx @@ -0,0 +1,60 @@ +import { Text } from 'blocks'; + +// Function to safely parse the stringified list into an array +export const parseStringToArray = (stringified: string): string[] => { + try { + // Remove unwanted characters (`[` and `]`) and split the string + return stringified + .replace(/[\[\]`]/g, '') // Remove brackets and backticks + .split(',') // Split by commas + .map((item) => item.trim()); // Trim spaces from each item + } catch (error) { + console.error('Failed to parse the stringified list:', error); + return []; + } +}; + +export const formatSentenceWithBoldNumbers = (benefit: string) => { + // Split the string by spaces and punctuation (e.g., commas, periods) + const parts = benefit.split(/(\s+|\W+)/); + + return ( + + {parts.map((part, index) => { + // Check if the part is a number and if it is greater than 100 + if (/\d+/.test(part) && Number(part) > 100) { + return ( + + {part} + + ); + } + + // Check for the word "unlimited" and bold it + if (/unlimited/i.test(part)) { + return ( + + {part} + + ); + } + + // For all other parts, just return as normal + return {part}; + })} + + ); +}; diff --git a/src/modules/purchasePlan/PurchasePlan.tsx b/src/modules/purchasePlan/PurchasePlan.tsx new file mode 100644 index 0000000000..25d1c0a88a --- /dev/null +++ b/src/modules/purchasePlan/PurchasePlan.tsx @@ -0,0 +1,74 @@ +import { FC } from 'react'; + +import { toNumber } from 'lodash'; +import { css } from 'styled-components'; + +import { useGetPricingInfo } from 'queries'; + +import { Box, Spinner, Text } from 'blocks'; +import { SelectedPlanView } from './components/SelectedPlanView'; +import { PurchaseSummery } from './components/PurchaseSummery'; + +export type PurchasePlanProps = { + index: string; +}; + +const PurchasePlan: FC = ({ index }) => { + const { data: pricingInfoList, isLoading } = useGetPricingInfo(); + + const selectedPlan = pricingInfoList?.find((planItem: { id: number }) => planItem?.id == toNumber(index)); + + if (isLoading) { + return ( + + + + ); + } + + if (!selectedPlan) { + return ( + + + Plan not found + + + ); + } + + return ( + + {/* Render selected plan */} + + {/* Render selected plan */} + + + ); +}; + +export { PurchasePlan }; diff --git a/src/modules/purchasePlan/PusrchasePlan.types.tsx b/src/modules/purchasePlan/PusrchasePlan.types.tsx new file mode 100644 index 0000000000..753bbb07b1 --- /dev/null +++ b/src/modules/purchasePlan/PusrchasePlan.types.tsx @@ -0,0 +1 @@ +export type PurchasePlanModalTypes = 'confirmPurchase' | 'planPurchased' | null; diff --git a/src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx b/src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx new file mode 100644 index 0000000000..6021e1f5f7 --- /dev/null +++ b/src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx @@ -0,0 +1,72 @@ +import { FC } from 'react'; +import { Box, Modal, Spinner, Text } from 'blocks'; +import { ModalResponse } from 'common'; +import { PricingPlanType } from 'queries/types/pricing'; + +export type ConfirmPurchaseModalProps = { + modalControl: ModalResponse; + plan: PricingPlanType; + selectedPlanType: string; +}; + +const ConfirmPurchaseModal: FC = ({ modalControl, plan, selectedPlanType }) => { + const { isOpen, onClose } = modalControl; + + return ( + + + + + + Confirm purchase + + + + + Purchase Push Pro plan for {selectedPlanType === '12' ? (plan?.value * 12 * 0.85).toFixed(2) : plan?.value}{' '} + USDC + + + Confirm the transaction in your wallet + + + + + ); +}; + +export { ConfirmPurchaseModal }; diff --git a/src/modules/purchasePlan/components/PlanPurchasedModal.tsx b/src/modules/purchasePlan/components/PlanPurchasedModal.tsx new file mode 100644 index 0000000000..2209ad6693 --- /dev/null +++ b/src/modules/purchasePlan/components/PlanPurchasedModal.tsx @@ -0,0 +1,131 @@ +import { FC, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +import { useBlocksTheme } from 'blocks/Blocks.hooks'; +import { ModalResponse } from 'common'; +import { PricingPlanType } from 'queries/types/pricing'; + +import { Box, Modal, PushLogoWithNameDark, PushLogoWithNameLight, Text, Tick } from 'blocks'; +import { formatSentenceWithBoldNumbers, parseStringToArray } from 'modules/pricing/utils'; +import { useSelector } from 'react-redux'; + +export type PlanPurchasedModalProps = { + plan: PricingPlanType; + modalControl: ModalResponse; + paymentId: string; + account: string; +}; + +const PlanPurchasedModal: FC = ({ plan, modalControl, paymentId, account }) => { + const [isLoading, setIsLoading] = useState(false); + const { mode } = useBlocksTheme(); + const { isOpen, onClose } = modalControl; + const navigate = useNavigate(); + const { userPushSDKInstance } = useSelector((state: any) => { + return state.user; + }); + + const getChannelDetails = async () => { + setIsLoading(true); + try { + const channelDetails = await userPushSDKInstance.channel.info(account); + return channelDetails || null; + } catch (error) { + console.error('Error fetching channel details:', error); + return null; + } + }; + + const handleRedirect = async () => { + const isChannelCreated = await getChannelDetails(); + setIsLoading(false); + if (isChannelCreated) { + navigate(`/channel/${account}?paymentId=${paymentId}`); + } else { + navigate(`/channel/create?paymentId=${paymentId}`); + } + }; + return ( + handleRedirect(), + loading: isLoading, + disabled: isLoading, + }} + cancelButtonProps={null} + > + + + {mode === 'light' ? : } + + Your {plan?.name} plan is now active + + + + + You now have access to the following features: + + + {parseStringToArray(plan?.description)?.map((benefit, benefitIndex) => ( + + + + + {formatSentenceWithBoldNumbers(benefit)} + + + + ))} + + + + + ); +}; + +export { PlanPurchasedModal }; diff --git a/src/modules/purchasePlan/components/PurchaseSummery.tsx b/src/modules/purchasePlan/components/PurchaseSummery.tsx new file mode 100644 index 0000000000..b5e823d5b5 --- /dev/null +++ b/src/modules/purchasePlan/components/PurchaseSummery.tsx @@ -0,0 +1,397 @@ +import { FC, useEffect, useState } from 'react'; +import { ethers } from 'ethers'; +import { css } from 'styled-components'; +import { useSearchParams } from 'react-router-dom'; +import { useFormik } from 'formik'; +import * as Yup from 'yup'; + +import { useAccount } from 'hooks'; +import { getRequiredFieldMessage, useDisclosure } from 'common'; +import { useGetPaymentDetails, useInitiatePaymentInfo } from 'queries'; +import { PlanPurchasedModal } from './PlanPurchasedModal'; +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; +import { getEip191Signature, getUSDCBalance, sendUSDC } from '../utils/handleUSDCutils'; +import { addresses, appConfig } from 'config'; + +import { PricingPlanTabsType } from 'modules/pricing/Pricing.types'; +import { PricingPlanType } from 'queries/types/pricing'; + +import { Alert, Box, Button, ExternalLink, Link, TabItem, Tabs, Text, TextInput } from 'blocks'; +import { ConfirmPurchaseModal } from './ConfirmPurchaseModal'; + +interface PurchaseResponse { + success: boolean; + data?: any; + error?: any; +} + +export type PurchaseSummeryProps = { selectedPlan: PricingPlanType }; +const PurchaseSummery: FC = ({ selectedPlan }) => { + const pricingPlanTabs: TabItem[] = [ + { label: 'Yearly', key: 'yearly', children: null }, + { label: 'Monthly', key: 'monthly', children: null }, + ]; + + const modalControl = useDisclosure(); + const successModalControl = useDisclosure(); + const { account, isWalletConnected, connect, chainId } = useAccount(); + const walletAddress = convertAddressToAddrCaip(account, chainId); + const [searchParams] = useSearchParams(); + const planType = searchParams.get('type'); + + const isValidPricingPlan = (value: string | null): value is PricingPlanTabsType => + value === 'yearly' || value === 'monthly'; + + const [selectedPricingPlanTab, setSelectedPricingPlanTab] = useState( + isValidPricingPlan(planType) ? planType : 'monthly', + ); + const [isLoading, setIsLoading] = useState(false); + const [balance, setBalance] = useState(null); + const [errorMessage, setErrorMessage] = useState(null); + const [paymentId, setPaymentId] = useState(null); + + // multiply by 0.85(85%) because we are applying a discount of 15% for yearly plan + const totalAmount = selectedPlan?.value + ? selectedPlan?.value * (selectedPricingPlanTab === 'yearly' ? 12 * 0.85 : 1) + : 0; + + const { mutate: handleInitatePayment } = useInitiatePaymentInfo(); + const { data: paymentDetails, refetch: refetchFetchPaymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); + + useEffect(() => { + // reset payment id and error message + setPaymentId(null); + setErrorMessage(null); + + const fetchBalance = async () => { + if (window.ethereum && account) { + const provider = new ethers.providers.Web3Provider(window.ethereum); + const fetchedBalance = await getUSDCBalance( + account, + addresses?.usdcTokenAddress, + provider, + connect, + isWalletConnected, + ); + setBalance(fetchedBalance); + } + }; + fetchBalance(); + }, [account, isWalletConnected]); + + useEffect(() => { + if (!paymentId) return; + + const interval = setInterval(() => { + refetchFetchPaymentDetails(); + console.log('retry fetching details'); + }, 5000); + + const timeout = setTimeout(() => { + clearInterval(interval); + console.log('Stopped polling after 1 minute'); + setIsLoading(false); + }, 60000); + + if (paymentDetails?.payment_status === 'SUCCESS' || paymentDetails?.payment_status === 'FAILED') { + clearInterval(interval); + clearTimeout(timeout); + if (paymentDetails?.payment_status === 'SUCCESS') { + modalControl.onClose(); + successModalControl.open(); + setIsLoading(false); + } + } + + return () => { + clearInterval(interval); + clearTimeout(timeout); + }; + }, [paymentId, paymentDetails?.payment_status]); + + const handleOpenFaucetLink = () => { + window.open('https://faucet.circle.com/', '_blank'); + }; + + const handleApproveAndPurchase = async () => { + if (!isWalletConnected) { + await connect(); + } + + setIsLoading(true); + modalControl.open(); + + // multiply by 0.85(85%) because we are applying a discount of 15% for yearly plan + const paymentAmount = selectedPricingPlanTab === 'yearly' ? selectedPlan?.value * 12 * 0.85 : selectedPlan?.value; + const provider = new ethers.providers.Web3Provider(window.ethereum); + + try { + // Call initiate payment first + const purchaseResponse = await handlePurchase(); + + if (!purchaseResponse?.success) { + console.error('Purchase failed:', purchaseResponse?.error); + setErrorMessage('Something went wrong while processing the purchase'); + setPaymentId(null); + setIsLoading(false); + modalControl.onClose(); + return; + } + + // If handlePurchase is successful, proceed with transfer + await provider.send('eth_requestAccounts', []); + await sendUSDC(paymentAmount, addresses?.usdcRecipient, provider); + } catch (error: any) { + setPaymentId(null); + console.error('Transaction failed:', error); + + // Show error message based on error type + if (error?.message.includes('User denied transaction')) { + console.log('User rejected the transaction'); + setErrorMessage('Something went wrong while processing the payment'); + } else if (error?.message.includes('transfer amount exceeds balance')) { + console.log('Insufficient balance'); + setErrorMessage('Insufficient balance'); + } else { + console.log('Something went wrong while processing the payment'); + setErrorMessage('Something went wrong while processing the payment'); + } + + setIsLoading(false); + modalControl.onClose(); + } + }; + + const handlePurchase = async (): Promise => { + try { + // generate verification proof with wallet address and pricing plan id + const req = { + body: { + channel: walletAddress, + pricingPlanId: selectedPlan?.id?.toString(), + }, + }; + + const messageHash = ethers.utils.hashMessage( + JSON.stringify({ + channel: req.body.channel, + content: req.body.pricingPlanId, + }), + ); + const provider = new ethers.providers.Web3Provider(window.ethereum); + const verificationProof = await getEip191Signature(messageHash, account, provider); + + return new Promise((resolve) => { + handleInitatePayment( + { + channel: walletAddress, + pricingPlanId: selectedPlan?.id?.toString(), + currency: 'USDC', + network: chainId, + verificationProof: verificationProof!, + email: formik.values.email, + duration: selectedPricingPlanTab === 'yearly' ? '12' : '1', + }, + { + onSuccess: (response) => { + setPaymentId(response?.paymentId); + resolve({ success: true, data: response }); + }, + onError: (error) => { + setIsLoading(false); + resolve({ success: false, error }); + }, + }, + ); + }); + } catch (error) { + console.error('Error in handlePurchase:', error); + return { success: false, error }; + } + }; + + const formik = useFormik({ + initialValues: { email: '' }, + validationSchema: Yup.object({ + email: Yup.string().email('Invalid email address').required(getRequiredFieldMessage('Email')), + }), + onSubmit: handleApproveAndPurchase, + }); + + return ( + + {modalControl.isOpen && ( + + )} + + {successModalControl.isOpen && ( + + )} + + + Summary + + Each wallet can purchase a limited allocation of Nodes. + + + +
+ + + + Plan + + Push {selectedPlan?.name} + + + + + Duration + setSelectedPricingPlanTab(activeKey as PricingPlanTabsType)} + alignTabs="center" + /> + + + + + + + + Total Price + {totalAmount.toFixed(2)} USDC + {balance && isWalletConnected && ( + + Balance: {balance} + + )} + + + {balance && parseInt(balance) < totalAmount && appConfig?.appEnv != 'prod' && ( + + + + Get more USDC + + + + + )} + + + + {errorMessage && ( + + )} + + + + + + +
+
+ ); +}; + +export { PurchaseSummery }; diff --git a/src/modules/purchasePlan/components/SelectedPlanView.tsx b/src/modules/purchasePlan/components/SelectedPlanView.tsx new file mode 100644 index 0000000000..65cce4e171 --- /dev/null +++ b/src/modules/purchasePlan/components/SelectedPlanView.tsx @@ -0,0 +1,84 @@ +import { FC } from 'react'; +import { css } from 'styled-components'; + +import { formatSentenceWithBoldNumbers, parseStringToArray } from 'modules/pricing/utils'; +import { PricingPlanType } from 'queries/types/pricing'; + +import { Box, Link, Text, Tick } from 'blocks'; + +export type SelectedPlanViewProps = { selectedPlan: PricingPlanType }; +const SelectedPlanView: FC = ({ selectedPlan }) => { + return ( + + Push {selectedPlan?.name} + + change plan + + + + + {selectedPlan?.value.toLocaleString('en-US', { style: 'currency', currency: 'USD' })} + + {selectedPlan?.value > 0 && ( + + per month billed yearly + + )} + + + {/* Render the Plan benefit list */} + + {parseStringToArray(selectedPlan?.description)?.map((benefit, benefitIndex) => ( + + + + + {formatSentenceWithBoldNumbers(benefit)} + + + + ))} + + + ); +}; + +export { SelectedPlanView }; diff --git a/src/modules/purchasePlan/index.ts b/src/modules/purchasePlan/index.ts new file mode 100644 index 0000000000..2b84ba1c0b --- /dev/null +++ b/src/modules/purchasePlan/index.ts @@ -0,0 +1 @@ +export { PurchasePlan, type PurchasePlanProps } from './PurchasePlan'; diff --git a/src/modules/purchasePlan/utils/handleUSDCutils.ts b/src/modules/purchasePlan/utils/handleUSDCutils.ts new file mode 100644 index 0000000000..1dc45e916f --- /dev/null +++ b/src/modules/purchasePlan/utils/handleUSDCutils.ts @@ -0,0 +1,60 @@ +import { ethers } from 'ethers'; +import { addresses } from 'config'; + +const guestWalletAddress = '0x0000000000000000000000000000000000000001'; + +// USDC Contract ABI (ERC-20 standard) +const USDC_ABI = ['function balanceOf(address owner) view returns (uint256)']; +const USDC_CA_ABI = ['function transfer(address to, uint256 amount) public returns (bool)']; + +// Function to get USDC balance +export const getUSDCBalance = async ( + walletAddress: string, + usdcContractAddress: string, + provider: ethers.providers.Web3Provider, + connect: () => void, + isWalletConnected: boolean, +) => { + if (!isWalletConnected) { + connect(); + } + + if (walletAddress === guestWalletAddress) return; + + try { + const usdcContract = new ethers.Contract(usdcContractAddress, USDC_ABI, provider); + const balance = await usdcContract.balanceOf(walletAddress); + return ethers.utils.formatUnits(balance, 6); + } catch (error) { + console.error('Error fetching USDC balance:', error); + throw error; + } +}; + +// Function to send USDC +export const sendUSDC = async (amount: number, recipient: string, provider: ethers.providers.Web3Provider) => { + try { + const signer = provider.getSigner(); + const usdcContractAddress = addresses?.usdcTokenAddress; + const usdcContract = new ethers.Contract(usdcContractAddress, USDC_CA_ABI, signer); + const amountInSmallestUnit = ethers.utils.parseUnits(amount.toString(), 6); + const tx = await usdcContract.transfer(recipient, amountInSmallestUnit); + console.log('Transaction sent:', tx.hash); + + // Wait for confirmation + const receipt = await tx.wait(); + console.log('Transaction confirmed:', receipt); + return receipt; + } catch (error) { + console.error('Error sending USDC:', error); + throw error; + } +}; + +// EIP191 signature +export const getEip191Signature = async (message: string, account: string, provider: ethers.providers.Web3Provider) => { + let signer = provider.getSigner(account); + + const signature = await signer.signMessage(message); + return signature; +}; diff --git a/src/pages/ChannelDashboardPageV2.tsx b/src/pages/ChannelDashboardPageV2.tsx index 47fc8df865..1214e5bca9 100644 --- a/src/pages/ChannelDashboardPageV2.tsx +++ b/src/pages/ChannelDashboardPageV2.tsx @@ -1,6 +1,6 @@ import { useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate, useLocation } from 'react-router-dom'; import { ContentLayout } from 'common'; import useFetchChannelDetails from 'common/hooks/useFetchUsersChannelDetails'; @@ -13,14 +13,15 @@ import { useAccount } from 'hooks'; const ChannelDashboardPageV2 = () => { const { account } = useAccount(); const navigate = useNavigate(); + const location = useLocation(); const { channelDetails, loadingChannelDetails, refetchChannelDetails } = useFetchChannelDetails(); useEffect(() => { if (!loadingChannelDetails && !channelDetails) { - navigate(`${APP_PATHS.CreateChannel}`); + navigate(`${APP_PATHS.CreateChannel}${location.search}`); } else { - navigate(`${APP_PATHS.ChannelDashboard(account)}`); + navigate(`${APP_PATHS.ChannelDashboard(account)}${location.search}`); } }, [channelDetails, loadingChannelDetails]); diff --git a/src/pages/PricingPage.tsx b/src/pages/PricingPage.tsx new file mode 100644 index 0000000000..ea00c2072b --- /dev/null +++ b/src/pages/PricingPage.tsx @@ -0,0 +1,13 @@ +import { Pricing } from 'modules/pricing'; +import { ContentLayout } from 'common'; + +// Other Information section +const PricingPage = () => { + // RENDER + return ( + + + + ); +}; +export default PricingPage; diff --git a/src/pages/PurchasePlanPage.tsx b/src/pages/PurchasePlanPage.tsx new file mode 100644 index 0000000000..73a83aa16f --- /dev/null +++ b/src/pages/PurchasePlanPage.tsx @@ -0,0 +1,16 @@ +import { PurchasePlan } from 'modules/purchasePlan'; +import { ContentLayout } from 'common'; +import { useParams } from 'react-router-dom'; + +// Other Information section +const PurchasePlanPage = () => { + // update spaceid in global space context + let { id } = useParams(); + // RENDER + return ( + + + + ); +}; +export default PurchasePlanPage; diff --git a/src/primaries/Profile.tsx b/src/primaries/Profile.tsx index b977693ce0..dc3e27d416 100644 --- a/src/primaries/Profile.tsx +++ b/src/primaries/Profile.tsx @@ -52,29 +52,29 @@ const Profile = ({ isDarkMode }: { isDarkMode: boolean }) => { id: 'walletAddress', value: account, title: account, - function: () => { }, + function: () => {}, invertedIcon: getPublicAssetPath('copy.svg'), }, { id: 'userSettings', value: '', title: 'Settings', - function: () => { }, + function: () => {}, to: APP_PATHS.UserSettings, invertedIcon: getPublicAssetPath('svg/setting.svg'), }, ...(EnvHelper.isProd ? [] : [ - { - id: 'prodDapp', - value: '', - function: () => { }, - link: `https://${envUtil.prod}`, - title: 'Production dapp', - invertedIcon: getPublicAssetPath('prod.svg'), - }, - ]), + { + id: 'prodDapp', + value: '', + function: () => {}, + link: `https://${envUtil.prod}`, + title: 'Production dapp', + invertedIcon: getPublicAssetPath('prod.svg'), + }, + ]), { id: 'disconnect', value: '', diff --git a/src/queries/hooks/index.ts b/src/queries/hooks/index.ts index 5ceff9be7e..118c13d559 100644 --- a/src/queries/hooks/index.ts +++ b/src/queries/hooks/index.ts @@ -6,3 +6,4 @@ export * from './rewards'; export * from './pointsVault'; export * from './analytics'; export * from './notificationSettings'; +export * from './pricing'; diff --git a/src/queries/hooks/pricing/index.ts b/src/queries/hooks/pricing/index.ts new file mode 100644 index 0000000000..760eb5e8ab --- /dev/null +++ b/src/queries/hooks/pricing/index.ts @@ -0,0 +1,5 @@ +export * from './useGetPricingInfo'; +export * from './useGetPricingPlanStatus'; +export * from './useInitiatePaymentInfo'; +export * from './useGetPaymentDetails'; +export * from './useGetPaymentHistory'; diff --git a/src/queries/hooks/pricing/useGetPaymentDetails.ts b/src/queries/hooks/pricing/useGetPaymentDetails.ts new file mode 100644 index 0000000000..7122f9ab91 --- /dev/null +++ b/src/queries/hooks/pricing/useGetPaymentDetails.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query'; +import { paymentDetails } from 'queries/queryKeys'; +import { getPaymentDetails } from 'queries/services'; + +export const useGetPaymentDetails = (payload: { paymentId: string }) => + useQuery({ + queryKey: [paymentDetails, payload?.paymentId], + queryFn: () => getPaymentDetails(payload), + }); diff --git a/src/queries/hooks/pricing/useGetPaymentHistory.ts b/src/queries/hooks/pricing/useGetPaymentHistory.ts new file mode 100644 index 0000000000..bfd611d7f9 --- /dev/null +++ b/src/queries/hooks/pricing/useGetPaymentHistory.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query'; +import { allPaymentHistory } from 'queries/queryKeys'; +import { getPaymentHistory } from 'queries/services'; + +export const useGetPaymentHistory = (payload: { channelId: string }) => + useQuery({ + queryKey: [allPaymentHistory, payload?.channelId], + queryFn: () => getPaymentHistory(payload), + }); diff --git a/src/queries/hooks/pricing/useGetPricingInfo.ts b/src/queries/hooks/pricing/useGetPricingInfo.ts new file mode 100644 index 0000000000..289891ffa0 --- /dev/null +++ b/src/queries/hooks/pricing/useGetPricingInfo.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query'; +import { pricingInfo } from 'queries/queryKeys'; +import { getPricingInfo } from 'queries/services'; + +export const useGetPricingInfo = () => + useQuery({ + queryKey: [pricingInfo], + queryFn: getPricingInfo, + }); diff --git a/src/queries/hooks/pricing/useGetPricingPlanStatus.ts b/src/queries/hooks/pricing/useGetPricingPlanStatus.ts new file mode 100644 index 0000000000..06a05f441e --- /dev/null +++ b/src/queries/hooks/pricing/useGetPricingPlanStatus.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query'; +import { pricingStatus } from 'queries/queryKeys'; +import { getPricingPlanStatus } from 'queries/services'; + +export const useGetPricingPlanStatus = (payload: { channelId: string }) => + useQuery({ + queryKey: [pricingStatus, payload?.channelId], + queryFn: () => getPricingPlanStatus(payload), + }); diff --git a/src/queries/hooks/pricing/useInitiatePaymentInfo.ts b/src/queries/hooks/pricing/useInitiatePaymentInfo.ts new file mode 100644 index 0000000000..8e5aabd542 --- /dev/null +++ b/src/queries/hooks/pricing/useInitiatePaymentInfo.ts @@ -0,0 +1,9 @@ +import { useMutation } from '@tanstack/react-query'; +import { initiatePayment } from 'queries/queryKeys'; +import { handleInitiatePayment } from 'queries/services'; + +export const useInitiatePaymentInfo = () => + useMutation({ + mutationKey: [initiatePayment], + mutationFn: handleInitiatePayment, + }); diff --git a/src/queries/models/index.ts b/src/queries/models/index.ts index bc425eb542..3643dadcfd 100644 --- a/src/queries/models/index.ts +++ b/src/queries/models/index.ts @@ -3,4 +3,5 @@ export * from './user'; export * from './rewards'; export * from './pointsVault'; export * from './chat'; +export * from './pricing'; export * from './support'; diff --git a/src/queries/models/pricing/getPaymentDetailsModel.ts b/src/queries/models/pricing/getPaymentDetailsModel.ts new file mode 100644 index 0000000000..aa540205eb --- /dev/null +++ b/src/queries/models/pricing/getPaymentDetailsModel.ts @@ -0,0 +1,3 @@ +import { PricingPlanPaymentDetails } from 'queries/types/pricing'; + +export const getPaymentDetailsModel = (response: PricingPlanPaymentDetails): PricingPlanPaymentDetails => response; diff --git a/src/queries/models/pricing/getPaymentHistoryModel.ts b/src/queries/models/pricing/getPaymentHistoryModel.ts new file mode 100644 index 0000000000..4cb9437670 --- /dev/null +++ b/src/queries/models/pricing/getPaymentHistoryModel.ts @@ -0,0 +1,3 @@ +import { PricingPaymentHistory } from 'queries/types/pricing'; + +export const getPaymentHistoryModel = (response: PricingPaymentHistory): PricingPaymentHistory => response; diff --git a/src/queries/models/pricing/getPricingInfoModel.ts b/src/queries/models/pricing/getPricingInfoModel.ts new file mode 100644 index 0000000000..3baa5a8497 --- /dev/null +++ b/src/queries/models/pricing/getPricingInfoModel.ts @@ -0,0 +1,3 @@ +import { PricingInfoResponse } from 'queries/types/pricing'; + +export const getPricingInfoModel = (response: PricingInfoResponse): PricingInfoResponse => response; diff --git a/src/queries/models/pricing/getPricingPlanStatusModel.ts b/src/queries/models/pricing/getPricingPlanStatusModel.ts new file mode 100644 index 0000000000..5911f45edc --- /dev/null +++ b/src/queries/models/pricing/getPricingPlanStatusModel.ts @@ -0,0 +1,3 @@ +import { PricingPlanStatusResponse } from 'queries/types/pricing'; + +export const getPricingPlanStatusModel = (response: PricingPlanStatusResponse): PricingPlanStatusResponse => response; diff --git a/src/queries/models/pricing/handleInitatePaymentModel.ts b/src/queries/models/pricing/handleInitatePaymentModel.ts new file mode 100644 index 0000000000..2a0fcfa3ef --- /dev/null +++ b/src/queries/models/pricing/handleInitatePaymentModel.ts @@ -0,0 +1,3 @@ +import { InitiatePaymentType } from 'queries/types/pricing'; + +export const handleInitiatePaymentModel = (response: InitiatePaymentType): InitiatePaymentType => response; diff --git a/src/queries/models/pricing/index.ts b/src/queries/models/pricing/index.ts new file mode 100644 index 0000000000..89e70b4801 --- /dev/null +++ b/src/queries/models/pricing/index.ts @@ -0,0 +1,5 @@ +export * from './getPricingInfoModel'; +export * from './getPricingPlanStatusModel'; +export * from './handleInitatePaymentModel'; +export * from './getPaymentDetailsModel'; +export * from './getPaymentHistoryModel'; diff --git a/src/queries/queryKeys.ts b/src/queries/queryKeys.ts index 383fbe3a4f..8f9f45161a 100644 --- a/src/queries/queryKeys.ts +++ b/src/queries/queryKeys.ts @@ -5,6 +5,7 @@ export const addNewSubgraph = 'addNewSubgraph'; export const aliasInfo = 'aliasInfo'; export const allActivities = 'allActivities'; export const allUserSubscriptions = 'allUserSubscriptions'; +export const allPaymentHistory = 'allPaymentHistory'; export const approvingPUSHToken = 'approvingPUSHToken'; export const approveVaultUser = 'approveVaultUser'; export const channelSearchList = 'channelSearchList'; @@ -20,6 +21,8 @@ export const discordDetails = 'discordDetails'; export const generateUserIdByWallet = 'generateUserIdByWallet'; export const groupInfo = 'groupInfo'; export const initiateNewChain = 'initiateNewChain'; +export const initiatePayment = 'initiatePayment'; +export const paymentDetails = 'paymentDetails'; export const pointsVaultApprovedUsers = 'pointsVaultApprovedUsers'; export const pointsVaultPendingUsers = 'pointsVaultPendingUsers'; export const pointsVaultRejectedUsers = 'pointsVaultRejectedUsers'; @@ -27,6 +30,8 @@ export const pointsVaultSearch = 'pointsVaultSearch'; export const pointsVaultUserLoginKey = 'pointsVaultUserLogin'; export const pushPreviousStakeEpoch = 'pushPreviousStakeEpoch'; export const pushStakeEpoch = 'pushStakeEpoch'; +export const pricingInfo = 'pricingInfo'; +export const pricingStatus = 'pricingStatus'; export const reactivatingChannel = 'reactivatingChannel'; export const rejectVaultUser = 'rejectVaultUser'; export const removeDelegate = 'removeDelegate'; @@ -48,7 +53,6 @@ export const updatingNotificationSetting = 'updatingNotificationSetting'; export const userProfileInfo = 'userProfileInfo'; export const updateUserProfileDetails = 'updateUserProfileDetails'; export const userRewardsDetails = 'userRewardsDetails'; -export const UserRewardsDetails = 'userRewardsDetails'; export const userSocialStatus = 'userSocialStatus'; export const userSubscription = 'userSubscription'; export const userTwitterDetails = 'userTwitterDetails'; diff --git a/src/queries/services/index.ts b/src/queries/services/index.ts index eaf1bbf584..754d6ce5ec 100644 --- a/src/queries/services/index.ts +++ b/src/queries/services/index.ts @@ -6,4 +6,5 @@ export * from './createChannel'; export * from './analytics'; export * from './notificationSettings'; export * from './chat'; +export * from './pricing'; export * from './support'; diff --git a/src/queries/services/pricing/getPaymentDetails.ts b/src/queries/services/pricing/getPaymentDetails.ts new file mode 100644 index 0000000000..006a572751 --- /dev/null +++ b/src/queries/services/pricing/getPaymentDetails.ts @@ -0,0 +1,9 @@ +import axios from 'axios'; +import { getCustomDeliveryURL } from 'queries/baseURL'; +import { getPaymentDetailsModel } from 'queries/models'; + +export const getPaymentDetails = (payload: { paymentId: string }) => + axios({ + method: 'GET', + url: `${getCustomDeliveryURL()}/apis/v1/payments/${payload?.paymentId}`, + }).then((response) => getPaymentDetailsModel(response.data)); diff --git a/src/queries/services/pricing/getPaymentHistory.ts b/src/queries/services/pricing/getPaymentHistory.ts new file mode 100644 index 0000000000..8c3fbbe241 --- /dev/null +++ b/src/queries/services/pricing/getPaymentHistory.ts @@ -0,0 +1,9 @@ +import axios from 'axios'; +import { getCustomDeliveryURL } from 'queries/baseURL'; +import { getPaymentHistoryModel } from 'queries/models'; + +export const getPaymentHistory = (payload: { channelId: string }) => + axios({ + method: 'GET', + url: `${getCustomDeliveryURL()}/apis/v1/channels/payments/${payload?.channelId}`, + }).then((response) => getPaymentHistoryModel(response.data)); diff --git a/src/queries/services/pricing/getPricingInfo.ts b/src/queries/services/pricing/getPricingInfo.ts new file mode 100644 index 0000000000..7fcba4faa5 --- /dev/null +++ b/src/queries/services/pricing/getPricingInfo.ts @@ -0,0 +1,9 @@ +import axios from 'axios'; +import { getCustomDeliveryURL } from 'queries/baseURL'; +import { getPricingInfoModel } from 'queries/models'; + +export const getPricingInfo = () => + axios({ + method: 'GET', + url: `${getCustomDeliveryURL()}/apis/v1/pricings`, + }).then((response) => getPricingInfoModel(response.data)); diff --git a/src/queries/services/pricing/getPricingPlanStatus.ts b/src/queries/services/pricing/getPricingPlanStatus.ts new file mode 100644 index 0000000000..9cd77657d9 --- /dev/null +++ b/src/queries/services/pricing/getPricingPlanStatus.ts @@ -0,0 +1,9 @@ +import axios from 'axios'; +import { getCustomDeliveryURL } from 'queries/baseURL'; +import { getPricingPlanStatusModel } from 'queries/models'; + +export const getPricingPlanStatus = (payload: { channelId: string }) => + axios({ + method: 'GET', + url: `${getCustomDeliveryURL()}/apis/v1/channels/${payload?.channelId}`, + }).then((response) => getPricingPlanStatusModel(response.data)); diff --git a/src/queries/services/pricing/handleInitiatePayment.ts b/src/queries/services/pricing/handleInitiatePayment.ts new file mode 100644 index 0000000000..210c0c4786 --- /dev/null +++ b/src/queries/services/pricing/handleInitiatePayment.ts @@ -0,0 +1,18 @@ +import axios from 'axios'; +import { getCustomDeliveryURL } from 'queries/baseURL'; +import { handleInitiatePaymentModel } from 'queries/models'; + +export const handleInitiatePayment = (payload: any) => + axios({ + method: 'POST', + url: `${getCustomDeliveryURL()}/apis/v1/payments/initiate/`, + data: { + channel: payload.channel, + pricingPlanId: payload.pricingPlanId, + currency: payload.currency, + network: payload.network, + email: payload.email, + verificationProof: payload.verificationProof, + duration: payload.duration, + }, + }).then((response) => handleInitiatePaymentModel(response.data)); diff --git a/src/queries/services/pricing/index.ts b/src/queries/services/pricing/index.ts new file mode 100644 index 0000000000..a68c9a5806 --- /dev/null +++ b/src/queries/services/pricing/index.ts @@ -0,0 +1,5 @@ +export * from './getPricingInfo'; +export * from './getPricingPlanStatus'; +export * from './handleInitiatePayment'; +export * from './getPaymentDetails'; +export * from './getPaymentHistory'; diff --git a/src/queries/types/pricing.ts b/src/queries/types/pricing.ts new file mode 100644 index 0000000000..3a36497de2 --- /dev/null +++ b/src/queries/types/pricing.ts @@ -0,0 +1,61 @@ +export type PricingPlanType = { + id: number; + name: string; + value: number; + email_quota: number; + telegram_quota: number; + discord_quota: number; + duration: number; + discount: number; + description: string; +}; + +export type PricingInfoResponse = PricingPlanType[]; + +export type PricingPlanStatusResponse = { + id: number; + channel: string; + email_quota_used: number; + telegram_quota_used: number; + discord_quota_used: number; + pricing_plan_id: string; + email_total_quota: number; + telegram_total_quota: number; + discord_total_quota: number; + expirationTimestamp: number; + pricingPlanTaken: Array<{ + id: number; + channel: string; + created_at: string; + duration: number; + expiration: number; + is_active: number; + next_renewal: string | null; + pricing_plan_id: string; + }>; +} | null; + +export type PricingPlanPaymentDetails = { + id: number; + channel: string; + payment_id: string; + pricing_plan_id: string; + amount: number; + currency: string; + created_at: number; + payment_network: string; + payment_status: 'SUCCESS' | 'INITIATED' | 'FAILED'; + transaction_hash: string; + expires_at: number; + message: string; + durationInMonths: number; +}; + +export type PricingPaymentHistory = PricingPlanPaymentDetails[]; + +export type InitiatePaymentType = { + success: boolean; + paymentId: string; + amount: number; + message: string; +}; diff --git a/src/queries/types/user.ts b/src/queries/types/user.ts index 4c241d1af1..f7f19529fd 100644 --- a/src/queries/types/user.ts +++ b/src/queries/types/user.ts @@ -67,6 +67,38 @@ export type UserSocialStatusResponse = { discord_username: string | null; }; +export type UserProfileInfoResponse = { + name: string | null; + desc: string | null; + picture: string | null; + profileVerificationProof?: string | null; +}; + +export type UpdateProfileInfoResponse = { + name: string | null; + desc: string | null; + picture: string | null; + profileVerificationProof?: string | null; + blockedUserList?: []; +}; + +export type SendHandlesVerificationResponse = { + email: string | null; + success: boolean; + VerificationCode?: string | null; +}; + +export type VerifyHandlesVerificationResponse = { + message: string; + success: boolean; +}; + +export type UserSocialStatusResponse = { + email: string | null; + telegram_username: string | null; + discord_username: string | null; + }; + export type UserProfileDetailsResponse = { blockedUsersList: Array; desc: string | null; @@ -74,3 +106,4 @@ export type UserProfileDetailsResponse = { picture: string; profileVerificationProof: string | null; }; + diff --git a/src/structure/Header.tsx b/src/structure/Header.tsx index 1fcaaa1e05..929475d257 100644 --- a/src/structure/Header.tsx +++ b/src/structure/Header.tsx @@ -4,7 +4,7 @@ import { Suspense, useContext, useEffect, useRef, useState } from 'react'; // External Packages import { AiOutlineMenu } from 'react-icons/ai'; -import { useLocation } from 'react-router-dom'; +import { matchPath, useLocation } from 'react-router-dom'; import { DarkModeSwitch } from 'react-toggle-dark-mode'; import styled, { useTheme } from 'styled-components'; @@ -34,6 +34,17 @@ import { walletToCAIP10 } from 'helpers/w2w'; // hooks import { useGetUserRewardsDetails } from 'queries'; +const themePricing = { + light: { + bg: GLOBALS.COLORS.GRADIENT_PRIMARY, + fg: themeLight.headerTagFg, + }, + dark: { + bg: themeDark.headerTagBg, + fg: themeDark.headerTagFg, + }, +}; + // header tags for pages that are not there in navigationList (Sidebar) const REWARDS_HEADER_TAG = { title: 'Reward Points', @@ -47,6 +58,31 @@ const REWARDS_HEADER_TAG = { }, }; +const PRICING_HEADER_TAGS = { + [APP_PATHS.Pricing]: { + title: 'Pricing', + light: { + bg: GLOBALS.COLORS.GRADIENT_PRIMARY, + fg: themeLight.headerTagFg, + }, + dark: { + bg: themeDark.headerTagBg, + fg: themeDark.headerTagFg, + }, + }, + [APP_PATHS.PurchasePlan]: { + title: 'Purchase Plan', + light: { + bg: GLOBALS.COLORS.GRADIENT_PRIMARY, + fg: themeLight.headerTagFg, + }, + dark: { + bg: themeDark.headerTagBg, + fg: themeDark.headerTagFg, + }, + }, +}; + const EXTRA_HEADER_TAGS = { [APP_PATHS.UserSettings]: { title: 'Settings', @@ -154,6 +190,7 @@ function Header({ isDarkMode, darkModeToggle }) { // Get Location const location = useLocation(); const isSnapPage = location?.pathname === '/snap'; + const isPricingPage = location?.pathname.startsWith('/pricing'); useEffect(() => { // runs when navigation setup is updated, will run on init @@ -169,6 +206,17 @@ function Header({ isDarkMode, darkModeToggle }) { // handle header tag update const updateHeaderTag = (location) => { + if (isPricingPage) { + // match path for nested pricing routes -/pricing/1, pricing/2 to for the header tag + const match = matchPath(APP_PATHS.PurchasePlan, location?.pathname); + if (match && PRICING_HEADER_TAGS[APP_PATHS.PurchasePlan]) { + setHeaderTag(PRICING_HEADER_TAGS[APP_PATHS.PurchasePlan]); + return; + } + if (PRICING_HEADER_TAGS[location.pathname]) setHeaderTag(PRICING_HEADER_TAGS[location.pathname]); + return; + } + if (navigationSetup) { Object.entries(navigationSetup.navigation).forEach(([key, value]) => { const item = navigationSetup.navigation[key]; diff --git a/src/structure/MasterInterfacePage.tsx b/src/structure/MasterInterfacePage.tsx index e6aba506f1..b125f3f0b3 100644 --- a/src/structure/MasterInterfacePage.tsx +++ b/src/structure/MasterInterfacePage.tsx @@ -50,6 +50,8 @@ const AddNewChainPage = lazy(() => import('pages/AddNewChain')); const DiscordVerificationPage = lazy(() => import('pages/DiscordVerificationPage')); const SendNotificationPage = lazy(() => import('pages/SendNotificationPage')); +const PricingPage = lazy(() => import('pages/PricingPage')); +const PurchasePlanPage = lazy(() => import('pages/PurchasePlanPage')); // import AirdropPage from 'pages/AirdropPage'; // import ChannelDashboardPage from 'pages/ChannelDashboardPage'; // import ChannelsPage from 'pages/ChannelsPage'; @@ -292,6 +294,14 @@ function MasterInterfacePage() { path="*" element={} /> + } + /> + } + /> diff --git a/src/structure/Navigation.tsx b/src/structure/Navigation.tsx index 2655728a7b..f7a6488621 100644 --- a/src/structure/Navigation.tsx +++ b/src/structure/Navigation.tsx @@ -29,6 +29,7 @@ import APP_PATHS from 'config/AppPaths'; import { ChannelDetails } from 'queries'; import useFetchChannelDetails from 'common/hooks/useFetchUsersChannelDetails'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; +import { UpgradePlanNavigationItem } from 'components/userPlanAndBillings/UpgradePlanNavigationItem'; import { AppContext } from 'contexts/AppContext'; type AddNewChainNavigationProps = { @@ -131,7 +132,7 @@ function Navigation() { const { newChatsCount, newNotifsCount } = useContext(AppContext); const CORE_CHAIN_ID = appConfig.coreContractChain; - const { account, chainId } = useAccount(); + const { account, chainId, isWalletConnected } = useAccount(); const { channelDetails } = useFetchChannelDetails(); const filteredAlias = useMemo(() => { @@ -211,15 +212,15 @@ function Navigation() { const primaryList = returnTransformedList(navigationList.primary, GLOBALS.CONSTANTS.NAVBAR_SECTIONS.PRIMARY); const notificationList = returnTransformedList( navigationList.secondary.Notifications, - GLOBALS.CONSTANTS.NAVBAR_SECTIONS.NOTIFICATION + GLOBALS.CONSTANTS.NAVBAR_SECTIONS.NOTIFICATION, ); const messagingList = returnTransformedList( navigationList.secondary.Messsaging, - GLOBALS.CONSTANTS.NAVBAR_SECTIONS.MESSAGING + GLOBALS.CONSTANTS.NAVBAR_SECTIONS.MESSAGING, ); const developersList = returnTransformedList( navigationList.secondary.Developers, - GLOBALS.CONSTANTS.NAVBAR_SECTIONS.DEVELOPERS + GLOBALS.CONSTANTS.NAVBAR_SECTIONS.DEVELOPERS, ); const thirdList = returnTransformedList(navigationList.third, GLOBALS.CONSTANTS.NAVBAR_SECTIONS.THIRD); @@ -228,7 +229,7 @@ function Navigation() { let navList = returnNavList(navigationList.primary, count); navList = Object.assign( navList, - returnNavList(navigationList.secondary.Notifications, Object.keys(navList).length) + returnNavList(navigationList.secondary.Notifications, Object.keys(navList).length), ); navList = Object.assign(navList, returnNavList(navigationList.secondary.Messsaging, Object.keys(navList).length)); navList = Object.assign(navList, returnNavList(navigationList.secondary.Developers, Object.keys(navList).length)); @@ -679,10 +680,11 @@ function Navigation() { /> )} + {/* { section.hasItems ? renderChildItems( - data.drilldown, + data.drilldown, section.opened, GLOBALS.CONSTANTS.NAVBAR_SECTIONS.PRIMARY ) @@ -825,6 +827,12 @@ function Navigation() { justify="flex-end" align="stretch" > + {!sidebarCollapsed && isWalletConnected && ( + + + + )} + {renderMainItems(navigationSetup.third, GLOBALS.CONSTANTS.NAVBAR_SECTIONS.THIRD)} @@ -936,6 +944,9 @@ const Footer = styled(Item)` align-items: stretch; flex-wrap: nowrap; padding: 0 6px 10px 0; + overflow: hidden; + display: flex; + box-sizing: border-box; `; const Secondary = styled(Item)` diff --git a/yarn.lock b/yarn.lock index e5c78c214d..325507d027 100644 --- a/yarn.lock +++ b/yarn.lock @@ -98,7 +98,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.26.2": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.26.2": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -110,45 +110,45 @@ __metadata: linkType: hard "@babel/compat-data@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/compat-data@npm:7.26.5" - checksum: 10/afe35751f27bda80390fa221d5e37be55b7fc42cec80de9896086e20394f2306936c4296fcb4d62b683e3b49ba2934661ea7e06196ca2dacdc2e779fbea4a1a9 + version: 7.26.8 + resolution: "@babel/compat-data@npm:7.26.8" + checksum: 10/bdddf577f670e0e12996ef37e134856c8061032edb71a13418c3d4dae8135da28910b7cd6dec6e668ab3a41e42089ef7ee9c54ef52fe0860b54cb420b0d14948 languageName: node linkType: hard "@babel/core@npm:^7.21.3, @babel/core@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/core@npm:7.26.0" + version: 7.26.9 + resolution: "@babel/core@npm:7.26.9" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.0" - "@babel/generator": "npm:^7.26.0" - "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/code-frame": "npm:^7.26.2" + "@babel/generator": "npm:^7.26.9" + "@babel/helper-compilation-targets": "npm:^7.26.5" "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.0" - "@babel/parser": "npm:^7.26.0" - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/traverse": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/65767bfdb1f02e80d3af4f138066670ef8fdd12293de85ef151758a901c191c797e86d2e99b11c4cdfca33c72385ecaf38bbd7fa692791ec44c77763496b9b93 + checksum: 10/ceed199dbe25f286a0a59a2ea7879aed37c1f3bb289375d061eda4752cab2ba365e7f9e969c7fd3b9b95c930493db6eeb5a6d6f017dd135fb5a4503449aad753 languageName: node linkType: hard -"@babel/generator@npm:^7.24.5, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/generator@npm:7.26.5" +"@babel/generator@npm:^7.24.5, @babel/generator@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/generator@npm:7.26.9" dependencies: - "@babel/parser": "npm:^7.26.5" - "@babel/types": "npm:^7.26.5" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10/aa5f176155431d1fb541ca11a7deddec0fc021f20992ced17dc2f688a0a9584e4ff4280f92e8a39302627345cd325762f70f032764806c579c6fd69432542bcb + checksum: 10/95075dd6158a49efcc71d7f2c5d20194fcf245348de7723ca35e37cd5800587f1d4de2be6c4ba87b5f5fbb967c052543c109eaab14b43f6a73eb05ccd9a5bb44 languageName: node linkType: hard @@ -161,7 +161,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.25.9": +"@babel/helper-compilation-targets@npm:^7.26.5": version: 7.26.5 resolution: "@babel/helper-compilation-targets@npm:7.26.5" dependencies: @@ -225,24 +225,24 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helpers@npm:7.26.0" +"@babel/helpers@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/helpers@npm:7.26.9" dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" - checksum: 10/fd4757f65d10b64cfdbf4b3adb7ea6ffff9497c53e0786452f495d1f7794da7e0898261b4db65e1c62bbb9a360d7d78a1085635c23dfc3af2ab6dcba06585f86 + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10/267dfa7d04dff7720610497f466aa7b60652b7ec8dde5914527879350c9d655271e892117c5b2f0f083d92d2a8e5e2cf9832d4f98cd7fb72d78f796002af19a1 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.5, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/parser@npm:7.26.5" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.24.5, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/parser@npm:7.26.9" dependencies: - "@babel/types": "npm:^7.26.5" + "@babel/types": "npm:^7.26.9" bin: parser: ./bin/babel-parser.js - checksum: 10/d92097066e3e26625a485149f54c27899e4d94d7ef2f76d8fc9de2019212e7951940a31c0003f26ccad22e664f89ff51e5d5fe80a11eafaaec2420655010533c + checksum: 10/cb84fe3ba556d6a4360f3373cf7eb0901c46608c8d77330cc1ca021d60f5d6ebb4056a8e7f9dd0ef231923ef1fe69c87b11ce9e160d2252e089a20232a2b942b languageName: node linkType: hard @@ -280,12 +280,12 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.10.2": - version: 7.26.0 - resolution: "@babel/runtime-corejs3@npm:7.26.0" + version: 7.26.9 + resolution: "@babel/runtime-corejs3@npm:7.26.9" dependencies: core-js-pure: "npm:^3.30.2" regenerator-runtime: "npm:^0.14.0" - checksum: 10/fd813d8b5bfc412c083033638c937e13f621b3223161c4a20bb8532d77ae622b620915476bd265670f6a8fc1a76a017ffd738ad25ad24431953e3725247c6520 + checksum: 10/8e70aa88d68f3bf689d022b1fa93ea271a8accddea7136ddd1da3aae79edac597ff9444cabbbe8f89b2552729889282c9a6a0176e92e69d47fe96c4db8bbfedd languageName: node linkType: hard @@ -299,47 +299,47 @@ __metadata: linkType: hard "@babel/runtime@npm:>=7.17.0, @babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.10.4, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.4.4, @babel/runtime@npm:^7.5.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.8.3, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7, @babel/runtime@npm:^7.9.2": - version: 7.26.0 - resolution: "@babel/runtime@npm:7.26.0" + version: 7.26.9 + resolution: "@babel/runtime@npm:7.26.9" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/9f4ea1c1d566c497c052d505587554e782e021e6ccd302c2ad7ae8291c8e16e3f19d4a7726fb64469e057779ea2081c28b7dbefec6d813a22f08a35712c0f699 + checksum: 10/08edd07d774eafbf157fdc8450ed6ddd22416fdd8e2a53e4a00349daba1b502c03ab7f7ad3ad3a7c46b9a24d99b5697591d0f852ee2f84642082ef7dda90b83d languageName: node linkType: hard -"@babel/template@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/template@npm:7.25.9" +"@babel/template@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/template@npm:7.26.9" dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/e861180881507210150c1335ad94aff80fd9e9be6202e1efa752059c93224e2d5310186ddcdd4c0f0b0fc658ce48cb47823f15142b5c00c8456dde54f5de80b2 + "@babel/code-frame": "npm:^7.26.2" + "@babel/parser": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" + checksum: 10/240288cebac95b1cc1cb045ad143365643da0470e905e11731e63280e43480785bd259924f4aea83898ef68e9fa7c176f5f2d1e8b0a059b27966e8ca0b41a1b6 languageName: node linkType: hard -"@babel/traverse@npm:^7.24.5, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.4.5": - version: 7.26.5 - resolution: "@babel/traverse@npm:7.26.5" +"@babel/traverse@npm:^7.24.5, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.9, @babel/traverse@npm:^7.4.5": + version: 7.26.9 + resolution: "@babel/traverse@npm:7.26.9" dependencies: "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.5" - "@babel/parser": "npm:^7.26.5" - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.5" + "@babel/generator": "npm:^7.26.9" + "@babel/parser": "npm:^7.26.9" + "@babel/template": "npm:^7.26.9" + "@babel/types": "npm:^7.26.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/b0131159450e3cd4208354cdea57e832e1a344fcc284b6ac84d1e13567a10501c4747bfd0ce637d2bd02277526b49372cfca71edd5c825cea74dcc9f52bb9225 + checksum: 10/c16a79522eafa0a7e40eb556bf1e8a3d50dbb0ff943a80f2c06cee2ec7ff87baa0c5d040a5cff574d9bcb3bed05e7d8c6f13b238a931c97267674b02c6cf45b4 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.24.5, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/types@npm:7.26.5" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.3, @babel/types@npm:^7.24.5, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9": + version: 7.26.9 + resolution: "@babel/types@npm:7.26.9" dependencies: "@babel/helper-string-parser": "npm:^7.25.9" "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10/148f6bead7bc39371176ba681873c930087503a8bfd2b0dab5090de32752241806c95f4e87cee8b2976bb0277c6cbc150f16c333fc90269634b711d3711c0f18 + checksum: 10/11b62ea7ed64ef7e39cc9b33852c1084064c3b970ae0eaa5db659241cfb776577d1e68cbff4de438bada885d3a827b52cc0f3746112d8e1bc672bb99a8eb5b56 languageName: node linkType: hard @@ -549,9 +549,9 @@ __metadata: linkType: hard "@chainsafe/is-ip@npm:^2.0.1": - version: 2.0.2 - resolution: "@chainsafe/is-ip@npm:2.0.2" - checksum: 10/86957254fc23e0998c2e01b76d843f96d0fbaca93cbeec7e8c1fd099a8736777a7a0ec7b0cecd507c4b1e74e54eff5b37b6cb21adfcb84588dc11df9e0a65257 + version: 2.1.0 + resolution: "@chainsafe/is-ip@npm:2.1.0" + checksum: 10/0055a6bc67b08c6e87a00e6059d78e2141684d76ec1227897c670fcae27bc52ed3e4c2f0532a38717dea5ac5a86b864e3c3af0a1d7f02a4d3d4270a4d2fc8ac4 languageName: node linkType: hard @@ -564,17 +564,15 @@ __metadata: languageName: node linkType: hard -"@coinbase/wallet-sdk@npm:4.0.3": - version: 4.0.3 - resolution: "@coinbase/wallet-sdk@npm:4.0.3" +"@coinbase/wallet-sdk@npm:4.3.0": + version: 4.3.0 + resolution: "@coinbase/wallet-sdk@npm:4.3.0" dependencies: - buffer: "npm:^6.0.3" + "@noble/hashes": "npm:^1.4.0" clsx: "npm:^1.2.1" eventemitter3: "npm:^5.0.1" - keccak: "npm:^3.0.3" - preact: "npm:^10.16.0" - sha.js: "npm:^2.4.11" - checksum: 10/fcea81c315726d648d3453ff7930d5175db641d05a7840f343d48ff6861215f2d531df5a1e5d4fa34addc10401b1033d7bc7b7b6c2c0eac2e9e4d08325f94a50 + preact: "npm:^10.24.2" + checksum: 10/56d24aaf5170d05fafe4cdafa06a000e259f3f9f3eae7879bcb5e1c316e5e3d85754639f31d3e366ed208f1667cb7d10d3c7bcae8e40cb5f46bea7c291d7c2bf languageName: node linkType: hard @@ -2458,15 +2456,15 @@ __metadata: languageName: node linkType: hard -"@formatjs/ecma402-abstract@npm:2.3.2": - version: 2.3.2 - resolution: "@formatjs/ecma402-abstract@npm:2.3.2" +"@formatjs/ecma402-abstract@npm:2.3.3": + version: 2.3.3 + resolution: "@formatjs/ecma402-abstract@npm:2.3.3" dependencies: "@formatjs/fast-memoize": "npm:2.2.6" - "@formatjs/intl-localematcher": "npm:0.5.10" + "@formatjs/intl-localematcher": "npm:0.6.0" decimal.js: "npm:10" tslib: "npm:2" - checksum: 10/db31d3d9b36033ea11ec905638ac0c1d2282f5bf53c9c06ee1d0ffd924f4bf64030702c92b56261756c4998dfa6235462689d8eda82d5913f2d7cf636a9416ae + checksum: 10/c73a704d5cba3b929a9a303a04b4e8a708bb2dea000ee41808c55b22941a70da01b065697cbc5a25898b2007405abd71f414ab8c327fe953f63ae4120c2cc98d languageName: node linkType: hard @@ -2479,33 +2477,33 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.11.0": - version: 2.11.0 - resolution: "@formatjs/icu-messageformat-parser@npm:2.11.0" +"@formatjs/icu-messageformat-parser@npm:2.11.1": + version: 2.11.1 + resolution: "@formatjs/icu-messageformat-parser@npm:2.11.1" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.2" - "@formatjs/icu-skeleton-parser": "npm:1.8.12" + "@formatjs/ecma402-abstract": "npm:2.3.3" + "@formatjs/icu-skeleton-parser": "npm:1.8.13" tslib: "npm:2" - checksum: 10/e82814d6db129be03fcdfb0c668f6902e5f3c3af85e8e81d04ab2550868645e95f439f39922d259e4a91b8b455d5d552a11b077ee95519ede7f850e50d7919de + checksum: 10/86db326b859e2d9c3e8855cb8ca28864e1bf48f80489312b204bc51fd03f69e275509c086c599b9b171f33a02065f2c40d16f26bc5650e98aa30dce8a47fa3a8 languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.8.12": - version: 1.8.12 - resolution: "@formatjs/icu-skeleton-parser@npm:1.8.12" +"@formatjs/icu-skeleton-parser@npm:1.8.13": + version: 1.8.13 + resolution: "@formatjs/icu-skeleton-parser@npm:1.8.13" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.2" + "@formatjs/ecma402-abstract": "npm:2.3.3" tslib: "npm:2" - checksum: 10/3026d45fc4edf1c1e934dfeec6c82bd60d6a9cf87416bb2d38a46d04956c835f456155295d138cceaaedd767bcff039f9041a1d45a55ec1ec2352f2d9db74fda + checksum: 10/514e7b9cc2123f666ed5d27d27e31ae0ee8cbcb53695c0363fdf7c92ec8b5515ddb39836ffdfabe8282e259ac73fe41a6da110433037057d2c34625b51e6bc5f languageName: node linkType: hard -"@formatjs/intl-localematcher@npm:0.5.10": - version: 0.5.10 - resolution: "@formatjs/intl-localematcher@npm:0.5.10" +"@formatjs/intl-localematcher@npm:0.6.0": + version: 0.6.0 + resolution: "@formatjs/intl-localematcher@npm:0.6.0" dependencies: tslib: "npm:2" - checksum: 10/119e36974607d5d3586570db93358c1f316c0736b83acc81dce88468435a9519a9e58a5abe6ed3078ffe40d6b4ad4613c6371e2a39cd570c9b6f561372ffb14d + checksum: 10/d8fd984c14121949d0ba60732a096aed6dccb2ab93770c4bffaea1170c85f5639d2a71fe6e2c68ab62bf6f3583a9c4b1fcd11bd5fb8837bfb2582228c33398c1 languageName: node linkType: hard @@ -3435,14 +3433,14 @@ __metadata: linkType: hard "@mui/types@npm:^7.2.15": - version: 7.2.21 - resolution: "@mui/types@npm:7.2.21" + version: 7.2.22 + resolution: "@mui/types@npm:7.2.22" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/cf604b02ee8a9127fe1cdcd1d2ee5d5aa92b2a3543b465a09c46a8be2452df7c58930ac0d8e55610e7130efe0fb9de9fa0c8522e30a04ca5dadc6640a4c77eda + checksum: 10/fca63bf0b082366c8bb70d5798ae348363f7f88b7523d91bcb49dfdf9c147edfc2795b58b849caec6874a445347778572e6d7cdee22151e6e325161dfb23ab20 languageName: node linkType: hard @@ -3512,8 +3510,8 @@ __metadata: linkType: hard "@multiformats/multiaddr@npm:^12.0.0": - version: 12.3.4 - resolution: "@multiformats/multiaddr@npm:12.3.4" + version: 12.3.5 + resolution: "@multiformats/multiaddr@npm:12.3.5" dependencies: "@chainsafe/is-ip": "npm:^2.0.1" "@chainsafe/netmask": "npm:^2.0.0" @@ -3521,7 +3519,14 @@ __metadata: multiformats: "npm:^13.0.0" uint8-varint: "npm:^2.0.1" uint8arrays: "npm:^5.0.0" - checksum: 10/12f7606391ccdab31c571b5fd3546f32b9f74bb1da6a3255b71d4606619dee2a94c34b7ada2dfd5ea023a4fb01141170510e872e1d0567197482241b42ad2d9d + checksum: 10/c790640a555b41d29ad95c8f3cca979c97eb8f36b11bf9fe3513e44ffaf7b990ad68df074ad87fb0ef334277aed62e7b72397e37c3f8b1fb10b3b648edf3c16f + languageName: node + linkType: hard + +"@noble/ciphers@npm:1.2.1": + version: 1.2.1 + resolution: "@noble/ciphers@npm:1.2.1" + checksum: 10/7fa0d32529d8da6323b08afec97218f6d6bc0d1e135243bf10f7587a2819495c3f3f4a5af1f41045501bb1ade94238c76960366a5d6441970e49ba9cacb88740 languageName: node linkType: hard @@ -3543,6 +3548,24 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:1.8.0": + version: 1.8.0 + resolution: "@noble/curves@npm:1.8.0" + dependencies: + "@noble/hashes": "npm:1.7.0" + checksum: 10/c54ce84cf54b8bda1a37a10dfae2e49e5b6cdf5dd98b399efa8b8a80a286b3f8f27bde53202cb308353bfd98719938991a78bed6e43f81f13b17f8181b7b82eb + languageName: node + linkType: hard + +"@noble/curves@npm:1.8.1": + version: 1.8.1 + resolution: "@noble/curves@npm:1.8.1" + dependencies: + "@noble/hashes": "npm:1.7.1" + checksum: 10/e861db372cc0734b02a4c61c0f5a6688d4a7555edca3d8a9e7c846c9aa103ca52d3c3818e8bc333a1a95b5be7f370ff344668d5d759471b11c2d14c7f24b3984 + languageName: node + linkType: hard + "@noble/hashes@npm:1.3.2": version: 1.3.2 resolution: "@noble/hashes@npm:1.3.2" @@ -3557,7 +3580,14 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:^1.4.0": +"@noble/hashes@npm:1.7.0": + version: 1.7.0 + resolution: "@noble/hashes@npm:1.7.0" + checksum: 10/ab038a816c8c9bb986e92797e3d9c5a5b37c020e0c3edc55bcae5061dbdd457f1f0a22787f83f4787c17415ba0282a20a1e455d36ed0cdcace4ce21ef1869f60 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.7.1, @noble/hashes@npm:^1.4.0": version: 1.7.1 resolution: "@noble/hashes@npm:1.7.1" checksum: 10/ca3120da0c3e7881d6a481e9667465cc9ebbee1329124fb0de442e56d63fef9870f8cc96f264ebdb18096e0e36cebc0e6e979a872d545deb0a6fed9353f17e05 @@ -3942,11 +3972,11 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-arrow@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-arrow@npm:1.1.1" +"@radix-ui/react-arrow@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-arrow@npm:1.1.2" dependencies: - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -3957,7 +3987,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/c75505c2858cffff7c742e888b635879f9a6d95e08bf5ae939be33f97e1171379bc6b5354ec0cd3d12624bdbe5a830ee6aa0fb1f46b1af160b488bc54e64d486 + checksum: 10/75dcb4430c1d3d4eb1635bbdd61f9eb079a9a9ad0281f4db4107f3dd6965164aba594c466b24ed5f29e498ad8bc3c8ec1ed78d9ccce9f7a7b3c380a36437fdb4 languageName: node linkType: hard @@ -3984,14 +4014,14 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-collection@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-collection@npm:1.1.1" +"@radix-ui/react-collection@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-collection@npm:1.1.2" dependencies: "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4002,7 +4032,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/88b53075f345ba0354e4ec6f4f35a4160379020b48a709f12c1963052dfa8475329b842a652d79ac54238f2884c85c2c793331d84713715d2452d535d14df36a + checksum: 10/f9ecb91327262f8d373b820cd72645b5de40ce8fa99070db537092629d1e0ba67c3f9b50e360a6532a029544e93a92f2e508ffff0c371791b4239e12f61bc697 languageName: node linkType: hard @@ -4063,23 +4093,23 @@ __metadata: linkType: hard "@radix-ui/react-dialog@npm:^1.0.4, @radix-ui/react-dialog@npm:^1.1.1": - version: 1.1.4 - resolution: "@radix-ui/react-dialog@npm:1.1.4" + version: 1.1.6 + resolution: "@radix-ui/react-dialog@npm:1.1.6" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.3" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-portal": "npm:1.1.3" + "@radix-ui/react-portal": "npm:1.1.4" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" - aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:^2.6.1" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4090,7 +4120,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/61edc875340a6e89228d9a42403456b2351e6c12e316bc372dfde1e616464f29d91cfed8cbda03fde634ef5b3d2046195173b20e623888ddf8316dd433aab28a + checksum: 10/bc982e26358ff6774e00a75139b221d772d32e18c798844ee3bc8862eaa63c838e3f2ed74a8d2a2263ec0ba0028e216f6a42c31ae83f5505d16ce9f4cfba5613 languageName: node linkType: hard @@ -4146,13 +4176,13 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-dismissable-layer@npm:1.1.3": - version: 1.1.3 - resolution: "@radix-ui/react-dismissable-layer@npm:1.1.3" +"@radix-ui/react-dismissable-layer@npm:1.1.5": + version: 1.1.5 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.5" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" "@radix-ui/react-use-escape-keydown": "npm:1.1.0" peerDependencies: @@ -4165,20 +4195,20 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/9905ff3d8d630223fd40bf31cdd8027b6e750cecd31aa04c2a5912e6e628f72973e58032bb944a5f4685dd888256a306a1c296a6e18648187974455a9660d95f + checksum: 10/1f9e57f4e52712897b2a61541f54dd4a53172685345e885b11a47c1e6227b0927c399324e8b39c027148f8d7fd661212de7740589c15b2a7e61328b33fad473e languageName: node linkType: hard "@radix-ui/react-dropdown-menu@npm:^2.1.1": - version: 2.1.4 - resolution: "@radix-ui/react-dropdown-menu@npm:2.1.4" + version: 2.1.6 + resolution: "@radix-ui/react-dropdown-menu@npm:2.1.6" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-menu": "npm:2.1.4" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-menu": "npm:2.1.6" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" peerDependencies: "@types/react": "*" @@ -4190,7 +4220,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/63978b6e73431c9b21b7e9926e6e202caccac2016831f580fbabfca8d64eb89da4747e366c528421499fab550de10bcd8c5a21216d8a2536d3f3949f06bedb4e + checksum: 10/3292e5a0902bfa0c36d0b61cc6258cce26c50e2f453bf102713b36bb2e40e9240d2ecc2691ffe261e115f58e82e75b75159af72ec2f92ad276f859b1a75cd00c languageName: node linkType: hard @@ -4244,12 +4274,12 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-focus-scope@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-focus-scope@npm:1.1.1" +"@radix-ui/react-focus-scope@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-focus-scope@npm:1.1.2" dependencies: "@radix-ui/react-compose-refs": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" peerDependencies: "@types/react": "*" @@ -4261,7 +4291,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/128508e7e34a47fd44d51bdb3d66a35a337c54b64125548d4a98bb377ee89b2fd8f96e0a075368d393c6664abba1e5a2f167734a6adbb170c41da0aa7a06d05f + checksum: 10/dfb2d098d5af01260dd67a268fe99aa634cbef677b660fdce7079d4e1869de2243062807441a4ee4f65c7e0db6974691996efe1d5161a4da70482541c4fe5c70 languageName: node linkType: hard @@ -4296,28 +4326,28 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-menu@npm:2.1.4": - version: 2.1.4 - resolution: "@radix-ui/react-menu@npm:2.1.4" +"@radix-ui/react-menu@npm:2.1.6": + version: 2.1.6 + resolution: "@radix-ui/react-menu@npm:2.1.6" dependencies: "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.3" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-popper": "npm:1.2.1" - "@radix-ui/react-portal": "npm:1.1.3" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-roving-focus": "npm:1.1.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-roving-focus": "npm:1.1.2" + "@radix-ui/react-slot": "npm:1.1.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" - aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:^2.6.1" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4328,29 +4358,29 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/c1b9b417515e9a0c08a9db646c2a81d1ceb236adb1629ee033c6f98e8675ab34b924e2d35d1aab605a58dab9ac509adb33875a05bbce6202270e3a54a4a6fece + checksum: 10/b1d04a8215d879df486c1ce3972a655d9a1861f7012e0d77e32c43a0aa37674432c5e8382e66902589fd24888f9bbdca55d7b766a1a0c1b5b9cb4e124dd959b2 languageName: node linkType: hard "@radix-ui/react-popover@npm:^1.0.6": - version: 1.1.4 - resolution: "@radix-ui/react-popover@npm:1.1.4" + version: 1.1.6 + resolution: "@radix-ui/react-popover@npm:1.1.6" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.3" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" "@radix-ui/react-focus-guards": "npm:1.1.1" - "@radix-ui/react-focus-scope": "npm:1.1.1" + "@radix-ui/react-focus-scope": "npm:1.1.2" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-popper": "npm:1.2.1" - "@radix-ui/react-portal": "npm:1.1.3" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" - aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:^2.6.1" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4361,7 +4391,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/8f21bc61a752291319f64327fa9b2b310c93efe55bb6e0fec7d72a4d59e1e80b28a25ad13c3b9ac600bc0c0e68f155f2226ef76c54d9e8226b4066b70611a4f3 + checksum: 10/289110a40d6ecdee5286905d12b566c36686ef26236be56818ba78cdae1df6fc9a7ac108eaf9842ff4a4591789c59017a88a2d03c38df5dda15f52c8e2861644 languageName: node linkType: hard @@ -4394,15 +4424,15 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-popper@npm:1.2.1": - version: 1.2.1 - resolution: "@radix-ui/react-popper@npm:1.2.1" +"@radix-ui/react-popper@npm:1.2.2": + version: 1.2.2 + resolution: "@radix-ui/react-popper@npm:1.2.2" dependencies: "@floating-ui/react-dom": "npm:^2.0.0" - "@radix-ui/react-arrow": "npm:1.1.1" + "@radix-ui/react-arrow": "npm:1.1.2" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" "@radix-ui/react-use-layout-effect": "npm:1.1.0" "@radix-ui/react-use-rect": "npm:1.1.0" @@ -4418,7 +4448,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/423506c2f862c3ee69956bdef3de668bf189b1ec4496c83bef01c3a962c88ab44f9154523afdcd4f0ed6a06eeb44005fcfca4ee0d68267187f58df1f65781b3c + checksum: 10/c76d65f86360e3971ce42356874c9729588fed03369d49e8b84afb26313ce65e1e5bd043ff1d33e0cd6dc198b76fc65532ab9dace4f34dbdb36c07fefd06065a languageName: node linkType: hard @@ -4442,11 +4472,11 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-portal@npm:1.1.3": - version: 1.1.3 - resolution: "@radix-ui/react-portal@npm:1.1.3" +"@radix-ui/react-portal@npm:1.1.4": + version: 1.1.4 + resolution: "@radix-ui/react-portal@npm:1.1.4" dependencies: - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-layout-effect": "npm:1.1.0" peerDependencies: "@types/react": "*" @@ -4458,7 +4488,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/470fb50c940772d05cc268e219b3d15848909dcd0a2dc1952965d0af905992f0ccab99e99c490dea6564c441397eba720b8425ba9f4582c94bef40ebe27ac0d0 + checksum: 10/7797c53d071c762e234c92b5ca721f97ba300969fa9d630e808d436a896082b7c31553cdc0ed1cbfd46b76fe2ddbe5e3a0790f9ff2f6542923b896301a634bbd languageName: node linkType: hard @@ -4502,11 +4532,11 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-primitive@npm:2.0.1": - version: 2.0.1 - resolution: "@radix-ui/react-primitive@npm:2.0.1" +"@radix-ui/react-primitive@npm:2.0.2": + version: 2.0.2 + resolution: "@radix-ui/react-primitive@npm:2.0.2" dependencies: - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-slot": "npm:1.1.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4517,21 +4547,21 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/ed6829b8ff4117cde2c02b14325ff78b7902fe9e8324b9fdbfd11646c5bb703f38711d8da5029ffc873384496481b7d398d0e3c17f7cc287b52fb92fbaf67da2 + checksum: 10/877b20d63487d0dec3f152f59a11d5826507d0839603b48b6aaa3f3eededea11f040ed36d6b868c02a7364570e5fbbbdb102c624fd930d4ed308b36c57154638 languageName: node linkType: hard -"@radix-ui/react-roving-focus@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-roving-focus@npm:1.1.1" +"@radix-ui/react-roving-focus@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-roving-focus@npm:1.1.2" dependencies: "@radix-ui/primitive": "npm:1.1.1" - "@radix-ui/react-collection": "npm:1.1.1" + "@radix-ui/react-collection": "npm:1.1.2" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-callback-ref": "npm:1.1.0" "@radix-ui/react-use-controllable-state": "npm:1.1.0" peerDependencies: @@ -4544,7 +4574,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/748dc87dfed43243e29be1d0e10a1197249379e5e2bfcd3e1c2b2d2e794f862972befc3192372fb2319a601a7449358e80c9ae8892ebdc58a83688327dcf66d5 + checksum: 10/72b0c32f3463b91052050b9f0083fbcfa8b98b243be6b08b2a850c2755589e0c4b9d4df7ff669e18f81fe65d0387e9c07ad506f0c8b5be547bc69ae8a06eb8b9 languageName: node linkType: hard @@ -4604,9 +4634,9 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-slot@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-slot@npm:1.1.1" +"@radix-ui/react-slot@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-slot@npm:1.1.2" dependencies: "@radix-ui/react-compose-refs": "npm:1.1.1" peerDependencies: @@ -4615,18 +4645,18 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/5b1ee5100da356c8f9f56cd7ca273838a373fa3808f0f909b1e132c4f734282571cb666e86a548831ee82a62240e126d43379994285a9b030fd34ea43538b5e2 + checksum: 10/6d5e1fac17b3eb79019a697581133dff23a3f6406f8ecfca476ab4a6a73baa53d66a7c9caeeebcc677363aa3b4132aa9d2168641ba9642658a2e4a297c05e4d3 languageName: node linkType: hard "@radix-ui/react-switch@npm:^1.1.0": - version: 1.1.2 - resolution: "@radix-ui/react-switch@npm:1.1.2" + version: 1.1.3 + resolution: "@radix-ui/react-switch@npm:1.1.3" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" "@radix-ui/react-use-previous": "npm:1.1.0" "@radix-ui/react-use-size": "npm:1.1.0" @@ -4640,26 +4670,26 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/ebe94a10917d370951cd988b7f16dcda62f705d43b87422adbd984e16eab00ed052960dbb71c9f87e26d8dddf11adacf5dc44e92414f36cbcf911de83ed6e6c0 + checksum: 10/ee471a5b2a0d66b10523531d0c5a2c9e5bf04ed1a070d4f1214b19d4907ce12660fffd38ccc2eb6dec10c7a134fc38b6360dcf28cddf2f8ea41a0d8b0dfcfe07 languageName: node linkType: hard "@radix-ui/react-tooltip@npm:^1.1.1": - version: 1.1.6 - resolution: "@radix-ui/react-tooltip@npm:1.1.6" + version: 1.1.8 + resolution: "@radix-ui/react-tooltip@npm:1.1.8" dependencies: "@radix-ui/primitive": "npm:1.1.1" "@radix-ui/react-compose-refs": "npm:1.1.1" "@radix-ui/react-context": "npm:1.1.1" - "@radix-ui/react-dismissable-layer": "npm:1.1.3" + "@radix-ui/react-dismissable-layer": "npm:1.1.5" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-popper": "npm:1.2.1" - "@radix-ui/react-portal": "npm:1.1.3" + "@radix-ui/react-popper": "npm:1.2.2" + "@radix-ui/react-portal": "npm:1.1.4" "@radix-ui/react-presence": "npm:1.1.2" - "@radix-ui/react-primitive": "npm:2.0.1" - "@radix-ui/react-slot": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.0.2" + "@radix-ui/react-slot": "npm:1.1.2" "@radix-ui/react-use-controllable-state": "npm:1.1.0" - "@radix-ui/react-visually-hidden": "npm:1.1.1" + "@radix-ui/react-visually-hidden": "npm:1.1.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4670,7 +4700,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/c2210c292e67714aaade5230352619bf0151885ce82ff080af1a5f697928e32ed73f406cbf3452ca014a54e0b9182572d6bc16084b9ee2d7ffa2e2fcde45f299 + checksum: 10/dc45051176114592c72428fc0db6c10337cbfd40e06bfaad17fc101688a98751104901f560755f21166436ad712686c8b6b17840c872a7bda1cfcd763e86a4a9 languageName: node linkType: hard @@ -4902,11 +4932,11 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-visually-hidden@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-visually-hidden@npm:1.1.1" +"@radix-ui/react-visually-hidden@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-visually-hidden@npm:1.1.2" dependencies: - "@radix-ui/react-primitive": "npm:2.0.1" + "@radix-ui/react-primitive": "npm:2.0.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4917,7 +4947,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/ccbdf29811283fb257f0b0f8604923e6fe349a264986463f6d6a20946fc51e243527985e69f0af27659f78fd7a4199dacbba5bfc7af3667aa409cd23a0ae3283 + checksum: 10/87dc45ffb32b652bde629bb5c3b216adb82fd1ec68c484fec260980b31508cbc515a73327798d0f47d558dd22245b25f51bb06296b1762693af9f27e23c1cb1f languageName: node linkType: hard @@ -5219,10 +5249,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.21.1": - version: 1.21.1 - resolution: "@remix-run/router@npm:1.21.1" - checksum: 10/22a3dde5dd4ee131bddb5b589f974d6cb9e8378bda219bcdf592f399b9f10b8431d5f230bea507fc3b7f295998f8379942f5f07f920c087e2ecae65c76494e51 +"@remix-run/router@npm:1.22.0": + version: 1.22.0 + resolution: "@remix-run/router@npm:1.22.0" + checksum: 10/5ee270807bf30529013292e1677681b9c67120846429d32a44b831e736c901504a7273c41da66147587373a0c2aa06baa99722775595130e8f44860600ded241 languageName: node linkType: hard @@ -5270,135 +5300,135 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.31.0" +"@rollup/rollup-android-arm-eabi@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.34.8" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-android-arm64@npm:4.31.0" +"@rollup/rollup-android-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-android-arm64@npm:4.34.8" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.31.0" +"@rollup/rollup-darwin-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-arm64@npm:4.34.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.31.0" +"@rollup/rollup-darwin-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-darwin-x64@npm:4.34.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.31.0" +"@rollup/rollup-freebsd-arm64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.34.8" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.31.0" +"@rollup/rollup-freebsd-x64@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-freebsd-x64@npm:4.34.8" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.31.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.8" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.31.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.34.8" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.31.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.34.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.31.0" +"@rollup/rollup-linux-arm64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.34.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.31.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.31.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.8" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.31.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.34.8" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.31.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.34.8" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.31.0" +"@rollup/rollup-linux-x64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.34.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.31.0" +"@rollup/rollup-linux-x64-musl@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.34.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.31.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.31.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.34.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.31.0": - version: 4.31.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.31.0" +"@rollup/rollup-win32-x64-msvc@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.34.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -5529,7 +5559,7 @@ __metadata: languageName: node linkType: hard -"@stablelib/chacha20poly1305@npm:1.0.1, @stablelib/chacha20poly1305@npm:^1.0.1": +"@stablelib/chacha20poly1305@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/chacha20poly1305@npm:1.0.1" dependencies: @@ -5578,28 +5608,6 @@ __metadata: languageName: node linkType: hard -"@stablelib/hkdf@npm:1.0.1": - version: 1.0.1 - resolution: "@stablelib/hkdf@npm:1.0.1" - dependencies: - "@stablelib/hash": "npm:^1.0.1" - "@stablelib/hmac": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10/9d45e303715a1835c8612b78e6c1b9d2b7463699b484241d8681fb5c17e0f2bbde5ce211c882134b64616a402e09177baeba80426995ff227b3654a155ab225d - languageName: node - linkType: hard - -"@stablelib/hmac@npm:^1.0.1": - version: 1.0.1 - resolution: "@stablelib/hmac@npm:1.0.1" - dependencies: - "@stablelib/constant-time": "npm:^1.0.1" - "@stablelib/hash": "npm:^1.0.1" - "@stablelib/wipe": "npm:^1.0.1" - checksum: 10/d3ac9e2fea2b4972a5d874ee9d96c94f8c8207452e2d243a2668b1325a7b20bd9a1541df32387789a0e9bfef82c3fe021a785f46eb3442c782443863faf75205 - languageName: node - linkType: hard - "@stablelib/int@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/int@npm:1.0.1" @@ -5626,7 +5634,7 @@ __metadata: languageName: node linkType: hard -"@stablelib/random@npm:1.0.2, @stablelib/random@npm:^1.0.0, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": +"@stablelib/random@npm:^1.0.0, @stablelib/random@npm:^1.0.1, @stablelib/random@npm:^1.0.2": version: 1.0.2 resolution: "@stablelib/random@npm:1.0.2" dependencies: @@ -5636,7 +5644,7 @@ __metadata: languageName: node linkType: hard -"@stablelib/sha256@npm:1.0.1, @stablelib/sha256@npm:^1.0.0, @stablelib/sha256@npm:^1.0.1": +"@stablelib/sha256@npm:^1.0.0, @stablelib/sha256@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/sha256@npm:1.0.1" dependencies: @@ -5665,7 +5673,7 @@ __metadata: languageName: node linkType: hard -"@stablelib/x25519@npm:1.0.3, @stablelib/x25519@npm:^1.0.0, @stablelib/x25519@npm:^1.0.2": +"@stablelib/x25519@npm:^1.0.0, @stablelib/x25519@npm:^1.0.2": version: 1.0.3 resolution: "@stablelib/x25519@npm:1.0.3" dependencies: @@ -5970,90 +5978,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-darwin-arm64@npm:1.10.8" +"@swc/core-darwin-arm64@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-darwin-arm64@npm:1.10.18" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-darwin-x64@npm:1.10.8" +"@swc/core-darwin-x64@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-darwin-x64@npm:1.10.18" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.8" +"@swc/core-linux-arm-gnueabihf@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.18" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-linux-arm64-gnu@npm:1.10.8" +"@swc/core-linux-arm64-gnu@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-linux-arm64-gnu@npm:1.10.18" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-linux-arm64-musl@npm:1.10.8" +"@swc/core-linux-arm64-musl@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-linux-arm64-musl@npm:1.10.18" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-linux-x64-gnu@npm:1.10.8" +"@swc/core-linux-x64-gnu@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-linux-x64-gnu@npm:1.10.18" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-linux-x64-musl@npm:1.10.8" +"@swc/core-linux-x64-musl@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-linux-x64-musl@npm:1.10.18" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-win32-arm64-msvc@npm:1.10.8" +"@swc/core-win32-arm64-msvc@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-win32-arm64-msvc@npm:1.10.18" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-win32-ia32-msvc@npm:1.10.8" +"@swc/core-win32-ia32-msvc@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-win32-ia32-msvc@npm:1.10.18" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.10.8": - version: 1.10.8 - resolution: "@swc/core-win32-x64-msvc@npm:1.10.8" +"@swc/core-win32-x64-msvc@npm:1.10.18": + version: 1.10.18 + resolution: "@swc/core-win32-x64-msvc@npm:1.10.18" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.7.0": - version: 1.10.8 - resolution: "@swc/core@npm:1.10.8" +"@swc/core@npm:^1.10.16": + version: 1.10.18 + resolution: "@swc/core@npm:1.10.18" dependencies: - "@swc/core-darwin-arm64": "npm:1.10.8" - "@swc/core-darwin-x64": "npm:1.10.8" - "@swc/core-linux-arm-gnueabihf": "npm:1.10.8" - "@swc/core-linux-arm64-gnu": "npm:1.10.8" - "@swc/core-linux-arm64-musl": "npm:1.10.8" - "@swc/core-linux-x64-gnu": "npm:1.10.8" - "@swc/core-linux-x64-musl": "npm:1.10.8" - "@swc/core-win32-arm64-msvc": "npm:1.10.8" - "@swc/core-win32-ia32-msvc": "npm:1.10.8" - "@swc/core-win32-x64-msvc": "npm:1.10.8" + "@swc/core-darwin-arm64": "npm:1.10.18" + "@swc/core-darwin-x64": "npm:1.10.18" + "@swc/core-linux-arm-gnueabihf": "npm:1.10.18" + "@swc/core-linux-arm64-gnu": "npm:1.10.18" + "@swc/core-linux-arm64-musl": "npm:1.10.18" + "@swc/core-linux-x64-gnu": "npm:1.10.18" + "@swc/core-linux-x64-musl": "npm:1.10.18" + "@swc/core-win32-arm64-msvc": "npm:1.10.18" + "@swc/core-win32-ia32-msvc": "npm:1.10.18" + "@swc/core-win32-x64-msvc": "npm:1.10.18" "@swc/counter": "npm:^0.1.3" "@swc/types": "npm:^0.1.17" peerDependencies: @@ -6082,7 +6090,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/d215538af7de6bbceaf9c76ba2c13c2ad88c9daed0a2156702f9dd3c1890bffaadf040b7a0ad56a26431683b4df257b143b429dc3bdfc09be406666a720d2b61 + checksum: 10/3fa896132d5da6bdf7be195d759084c7ba015fa615889ceb331bb2bf40877c3b1995b60c6f8fc2226fbad88712a0379ce9bef7769d1713c67c5b89a3322bc029 languageName: node linkType: hard @@ -6121,8 +6129,8 @@ __metadata: linkType: hard "@table-library/react-table-library@npm:^4.1.7": - version: 4.1.7 - resolution: "@table-library/react-table-library@npm:4.1.7" + version: 4.1.12 + resolution: "@table-library/react-table-library@npm:4.1.12" dependencies: clsx: "npm:1.1.1" react-virtualized-auto-sizer: "npm:1.0.7" @@ -6131,7 +6139,7 @@ __metadata: "@emotion/react": ">= 11" react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10/14fba2fdfd09d25d6e8321874b934ce250814e7bdb8a5c5dc627dbcd61f5d2c5d1d5ae3a52ce4036a1f28fb883ecec88ed9bd4441b2756258fe05dfce2d4fd15 + checksum: 10/b82d2bde96edfa34a7ad1ee2e788c26e54f2cd2d1e130898eff80af19dc82c0b2f28b3cc6995ce1c09eb6f0ffef023ae9d478582a37bbb7b35e2b8af024bda40 languageName: node linkType: hard @@ -6151,17 +6159,17 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.64.2": - version: 5.64.2 - resolution: "@tanstack/query-core@npm:5.64.2" - checksum: 10/6b9c225341d3636de17bfd92414d75a26472e3766c28bf9c0d617d668d573392d3381ca03daba0e59b17714ac88e1595d0b170da4b8a789ea6337c864b38f6c7 +"@tanstack/query-core@npm:5.66.4": + version: 5.66.4 + resolution: "@tanstack/query-core@npm:5.66.4" + checksum: 10/2e646aa72f74981616c153a7f7fe335acc3697f4501a6279bbee12b434de94fe6d686cee5bc9a48107bd54fa5e7c62f630cf996b601680031447c716e8cfdc1f languageName: node linkType: hard -"@tanstack/query-devtools@npm:5.64.2": - version: 5.64.2 - resolution: "@tanstack/query-devtools@npm:5.64.2" - checksum: 10/273c241037d56ae24d0047f2fd5f5349dc672f76add5c2e30907844e785583354a25ff88904d871c3bc53f74d1036d59014ee9916319b4c5ce4d016e2a64ada5 +"@tanstack/query-devtools@npm:5.65.0": + version: 5.65.0 + resolution: "@tanstack/query-devtools@npm:5.65.0" + checksum: 10/029f4caca347cc9194a594b17084af8448da9a218dbd22340c3a9ae67f1d0deef9e1074864558975c2192afeca3b4a71b6190ee735d05c6fff47014a71560718 languageName: node linkType: hard @@ -6175,14 +6183,14 @@ __metadata: linkType: hard "@tanstack/react-query-devtools@npm:^5.44.0": - version: 5.64.2 - resolution: "@tanstack/react-query-devtools@npm:5.64.2" + version: 5.66.7 + resolution: "@tanstack/react-query-devtools@npm:5.66.7" dependencies: - "@tanstack/query-devtools": "npm:5.64.2" + "@tanstack/query-devtools": "npm:5.65.0" peerDependencies: - "@tanstack/react-query": ^5.64.2 + "@tanstack/react-query": ^5.66.7 react: ^18 || ^19 - checksum: 10/86edc68ede1a09c39487c50fd380812d9124819d2aa52e460df8df059e6056e9a0360ba662b0bd732a10fdd09a73c45fab3938d99fb4a27752e311a93c82ab74 + checksum: 10/56ba322ae015f9188ed115b10be57f31569c5f3584d230e128da67a0bfb954016bcc05fe8b138fc4fde5b198bb26e00252f368fee5b3efae4565e4f113d90a9a languageName: node linkType: hard @@ -6217,13 +6225,13 @@ __metadata: linkType: hard "@tanstack/react-query@npm:^5.44.0": - version: 5.64.2 - resolution: "@tanstack/react-query@npm:5.64.2" + version: 5.66.7 + resolution: "@tanstack/react-query@npm:5.66.7" dependencies: - "@tanstack/query-core": "npm:5.64.2" + "@tanstack/query-core": "npm:5.66.4" peerDependencies: react: ^18 || ^19 - checksum: 10/c7ca9c81fd03cdd7434b3954edfeedcc3c0c5d647c9b2f1d65729f9a0535b006abeb34179f0be1df70ebe689a5c0265b6316505a1f8b4d37bee7947577eb76f2 + checksum: 10/3d66a09f56f7722f3a7273e2217bcf078515779bedc09f6fdd0aba5eb6c810e74e39a2edcbb4d0bf538d84e395cb74f5fdfd085c48d50afe675cbbe5bef07e21 languageName: node linkType: hard @@ -6522,7 +6530,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -6548,9 +6556,9 @@ __metadata: linkType: hard "@types/lodash@npm:*, @types/lodash@npm:^4.14.182": - version: 4.17.14 - resolution: "@types/lodash@npm:4.17.14" - checksum: 10/6ee40725f3e192f5ef1f493caca19210aa7acd7adc3136b8dba84d418a35be0abea0668105aed9f696ad62a54310a9c0d328971ad4b157f5bcda700424ed5aae + version: 4.17.15 + resolution: "@types/lodash@npm:4.17.15" + checksum: 10/27b348b5971b9c670215331b52448a13d7d65bf1fbd320a7049c9c153c1186ff5d116ba75f05f07d32d7ece8a992b26a30c7bdc9be22a3d1e4e3e6068aa04603 languageName: node linkType: hard @@ -6569,11 +6577,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 22.10.7 - resolution: "@types/node@npm:22.10.7" + version: 22.13.4 + resolution: "@types/node@npm:22.13.4" dependencies: undici-types: "npm:~6.20.0" - checksum: 10/64cde1c2f5e5f7d597d3bd462f52c3c2d688a66623eb75d25e1d1d63d384ef553a27100635ad0dbb7d74da517048aa636947863eb624cf85f25d2f22370ce474 + checksum: 10/716e05b1b84d9da3b2cbba9f642d7294549a89c85d27148b48815f321e0081d0546366e97d11c7710a3280160828512eb945f4e9361dda980f708473758ac0a7 languageName: node linkType: hard @@ -6640,11 +6648,11 @@ __metadata: linkType: hard "@types/react-dom@npm:*": - version: 19.0.3 - resolution: "@types/react-dom@npm:19.0.3" + version: 19.0.4 + resolution: "@types/react-dom@npm:19.0.4" peerDependencies: "@types/react": ^19.0.0 - checksum: 10/815907f7adaa078acbf1d1ae7b6bf69cebe86bd301b8b9744e392bc0f16feb31bfb9fe0bfa2681d7d86678c83d52dedba5ed9bc7776736d4050cdd426b8b2d2b + checksum: 10/f15d470242f0b7cca57dd7e991a2852525ac93b2cb92f7e6c104d7bd6a978c3b1d0ba9b8698f23bc19c16b5cd98a6d160007be52c61196952f57cf019f204254 languageName: node linkType: hard @@ -6697,11 +6705,11 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 19.0.7 - resolution: "@types/react@npm:19.0.7" + version: 19.0.10 + resolution: "@types/react@npm:19.0.10" dependencies: csstype: "npm:^3.0.2" - checksum: 10/09522132bde715888e57c61fc89a87db06699872535450296f1c975c5014a7953ff08c3bff6b37d4a4515ceeb65b09cc5f841513cc8fede65fec788790b21154 + checksum: 10/10b592d212ebe4b4e0bd42a95c58af3d8dfcb8b3fa4b412d686c2ff8810d5dd3e3a30ebedb31d7b738e33a39c43503e24fe4e6ca8a21d842870043793f4eda98 languageName: node linkType: hard @@ -6945,9 +6953,9 @@ __metadata: linkType: hard "@ungap/structured-clone@npm:^1.2.0": - version: 1.2.1 - resolution: "@ungap/structured-clone@npm:1.2.1" - checksum: 10/6770f71e8183311b2871601ddb02d62a26373be7cf2950cb546a345a2305c75b502e36ce80166120aa2f5f1ea1562141684651ebbfcc711c58acd32035d3e545 + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 languageName: node linkType: hard @@ -7000,16 +7008,16 @@ __metadata: linkType: hard "@uniswap/router-sdk@npm:^1.12.0, @uniswap/router-sdk@npm:^1.14.0, @uniswap/router-sdk@npm:^1.6.0, @uniswap/router-sdk@npm:^1.9.0": - version: 1.18.0 - resolution: "@uniswap/router-sdk@npm:1.18.0" + version: 1.22.3 + resolution: "@uniswap/router-sdk@npm:1.22.3" dependencies: "@ethersproject/abi": "npm:^5.5.0" - "@uniswap/sdk-core": "npm:^7.1.0" + "@uniswap/sdk-core": "npm:^7.5.0" "@uniswap/swap-router-contracts": "npm:^1.3.0" - "@uniswap/v2-sdk": "npm:^4.9.0" - "@uniswap/v3-sdk": "npm:^3.21.0" - "@uniswap/v4-sdk": "npm:^1.15.0" - checksum: 10/8b6827cd8a1e7d64e0509174d4d236e5461ee4132a1023cd9f4a79fc00244b9c258577f42298cd8abbec66fa5b4a0ba11ce4f5c8703c32816cdff376f2aab226 + "@uniswap/v2-sdk": "npm:^4.13.0" + "@uniswap/v3-sdk": "npm:^3.24.0" + "@uniswap/v4-sdk": "npm:^1.19.4" + checksum: 10/eacbc00f33b6838ba239c6c366b43f5d43699005851cdf619fa7d00f86add275ac5a53263af861d90022a734812edcf6dca7adf1974fe3d6a7e40f06b5847e2f languageName: node linkType: hard @@ -7044,9 +7052,9 @@ __metadata: languageName: node linkType: hard -"@uniswap/sdk-core@npm:^7.1.0": - version: 7.1.0 - resolution: "@uniswap/sdk-core@npm:7.1.0" +"@uniswap/sdk-core@npm:^7.5.0": + version: 7.5.0 + resolution: "@uniswap/sdk-core@npm:7.5.0" dependencies: "@ethersproject/address": "npm:^5.0.2" "@ethersproject/bytes": "npm:^5.7.0" @@ -7057,7 +7065,7 @@ __metadata: jsbi: "npm:^3.1.4" tiny-invariant: "npm:^1.1.0" toformat: "npm:^2.0.0" - checksum: 10/44baeff8bf80335f3015eec96e94589171d58ee1a31fd606de10e0ae3078817abe59bec3a06d3ba28194993efe85e28709f5d04f8106b280f864302086e28b81 + checksum: 10/bb6cbe3633535a51262fe694bd781e038ce3e2b19c7f77b21fed92c4fdbbd9843a726874a00d635df3c67efab610293273e4eed3bf55ab6987a268014e36a637 languageName: node linkType: hard @@ -7196,16 +7204,16 @@ __metadata: languageName: node linkType: hard -"@uniswap/v2-sdk@npm:^4.3.0, @uniswap/v2-sdk@npm:^4.3.2, @uniswap/v2-sdk@npm:^4.6.0, @uniswap/v2-sdk@npm:^4.9.0": - version: 4.9.0 - resolution: "@uniswap/v2-sdk@npm:4.9.0" +"@uniswap/v2-sdk@npm:^4.13.0, @uniswap/v2-sdk@npm:^4.3.0, @uniswap/v2-sdk@npm:^4.3.2, @uniswap/v2-sdk@npm:^4.6.0": + version: 4.13.0 + resolution: "@uniswap/v2-sdk@npm:4.13.0" dependencies: "@ethersproject/address": "npm:^5.0.2" "@ethersproject/solidity": "npm:^5.0.9" - "@uniswap/sdk-core": "npm:^7.1.0" + "@uniswap/sdk-core": "npm:^7.5.0" tiny-invariant: "npm:^1.1.0" tiny-warning: "npm:^1.0.3" - checksum: 10/1ece024f1e500338f1c6b4df286ac9c61c23fa4a0c064a08701d4e2bcd536cae8ceaec32c10fa5b4bdc43548713d3ddf85173b984c1c23996e7fc10ffa1f6672 + checksum: 10/0e6186b87c0bbb2a78f9a10f6c2eaa021be94c2560a07e04dfc4890bc3cb63313d82217223193aef04167a121ce7fe14ba6a184157c0c5ade91f6185864db9df languageName: node linkType: hard @@ -7236,19 +7244,19 @@ __metadata: languageName: node linkType: hard -"@uniswap/v3-sdk@npm:3.21.0, @uniswap/v3-sdk@npm:^3.10.0, @uniswap/v3-sdk@npm:^3.11.0, @uniswap/v3-sdk@npm:^3.13.0, @uniswap/v3-sdk@npm:^3.17.0, @uniswap/v3-sdk@npm:^3.21.0": - version: 3.21.0 - resolution: "@uniswap/v3-sdk@npm:3.21.0" +"@uniswap/v3-sdk@npm:3.24.0, @uniswap/v3-sdk@npm:^3.10.0, @uniswap/v3-sdk@npm:^3.11.0, @uniswap/v3-sdk@npm:^3.13.0, @uniswap/v3-sdk@npm:^3.17.0, @uniswap/v3-sdk@npm:^3.24.0": + version: 3.24.0 + resolution: "@uniswap/v3-sdk@npm:3.24.0" dependencies: "@ethersproject/abi": "npm:^5.5.0" "@ethersproject/solidity": "npm:^5.0.9" - "@uniswap/sdk-core": "npm:^7.1.0" + "@uniswap/sdk-core": "npm:^7.5.0" "@uniswap/swap-router-contracts": "npm:^1.3.0" "@uniswap/v3-periphery": "npm:^1.1.1" "@uniswap/v3-staker": "npm:1.0.0" tiny-invariant: "npm:^1.1.0" tiny-warning: "npm:^1.0.3" - checksum: 10/6def4c79d224c79de3a18f48f02ca6f24fb58de4c07248caa88bd07df009371c91dd06d5a9b364f24a88190df9139cf40345f7aeba8396119460c8761c1162e4 + checksum: 10/2702485db8a0a2e41596077efdde9f1dd26e0af9c1052bc1524150fcaa50f7966b1976ff94495154b66715367de6f351dcb87b1a4a7dcca1e95ac5e8fde8d0dc languageName: node linkType: hard @@ -7263,16 +7271,16 @@ __metadata: languageName: node linkType: hard -"@uniswap/v4-sdk@npm:^1.15.0, @uniswap/v4-sdk@npm:^1.2.0, @uniswap/v4-sdk@npm:^1.6.3": - version: 1.15.1 - resolution: "@uniswap/v4-sdk@npm:1.15.1" +"@uniswap/v4-sdk@npm:^1.19.4, @uniswap/v4-sdk@npm:^1.2.0, @uniswap/v4-sdk@npm:^1.6.3": + version: 1.19.4 + resolution: "@uniswap/v4-sdk@npm:1.19.4" dependencies: "@ethersproject/solidity": "npm:^5.0.9" - "@uniswap/sdk-core": "npm:^7.1.0" - "@uniswap/v3-sdk": "npm:3.21.0" + "@uniswap/sdk-core": "npm:^7.5.0" + "@uniswap/v3-sdk": "npm:3.24.0" tiny-invariant: "npm:^1.1.0" tiny-warning: "npm:^1.0.3" - checksum: 10/2a72971d4559ab9e0f1512f07032d8ebd36f5cf24a144ca8a97006dbec55f5e10b76d12743112235ee6d582ba576f8b21dfc23e3c93a04b148c8ebcf1e10341a + checksum: 10/7640aafa39fa75406d688a59b06de47128fb2e8c63a990c692757a8ace4c8e625cd0631abf4140c5b75393f42e51942d018e9a642a7aec3e1b2dc6f5938156de languageName: node linkType: hard @@ -7550,9 +7558,9 @@ __metadata: languageName: node linkType: hard -"@walletconnect/core@npm:2.17.4": - version: 2.17.4 - resolution: "@walletconnect/core@npm:2.17.4" +"@walletconnect/core@npm:2.18.1": + version: 2.18.1 + resolution: "@walletconnect/core@npm:2.18.1" dependencies: "@walletconnect/heartbeat": "npm:1.2.2" "@walletconnect/jsonrpc-provider": "npm:1.0.14" @@ -7562,16 +7570,16 @@ __metadata: "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/logger": "npm:2.1.2" "@walletconnect/relay-api": "npm:1.0.11" - "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/relay-auth": "npm:1.1.0" "@walletconnect/safe-json": "npm:1.0.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.17.4" - "@walletconnect/utils": "npm:2.17.4" + "@walletconnect/types": "npm:2.18.1" + "@walletconnect/utils": "npm:2.18.1" "@walletconnect/window-getters": "npm:1.0.1" events: "npm:3.3.0" lodash.isequal: "npm:4.5.0" uint8arrays: "npm:3.1.0" - checksum: 10/936c1525586c6b73da7b498ecd2771edc5441975e78c2c4600a02382a0a14dc9a083be2105579949f40ac5e8f64c6158d079e7840203f14b09468f4fa2651324 + checksum: 10/65d739b12a07e1c8946408f8be997f6fee5c8f2624f8fdc04471b42084a4d78f5f5dba5bd1c5e2fc2950a458d9f77b78537bea9d21d50fa246cc19d989ee066d languageName: node linkType: hard @@ -7585,8 +7593,8 @@ __metadata: linkType: hard "@walletconnect/ethereum-provider@npm:^2.10.1, @walletconnect/ethereum-provider@npm:^2.13.0, @walletconnect/ethereum-provider@npm:^2.17.3": - version: 2.17.4 - resolution: "@walletconnect/ethereum-provider@npm:2.17.4" + version: 2.18.1 + resolution: "@walletconnect/ethereum-provider@npm:2.18.1" dependencies: "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" "@walletconnect/jsonrpc-provider": "npm:1.0.14" @@ -7594,12 +7602,12 @@ __metadata: "@walletconnect/jsonrpc-utils": "npm:1.0.8" "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/modal": "npm:2.7.0" - "@walletconnect/sign-client": "npm:2.17.4" - "@walletconnect/types": "npm:2.17.4" - "@walletconnect/universal-provider": "npm:2.17.4" - "@walletconnect/utils": "npm:2.17.4" + "@walletconnect/sign-client": "npm:2.18.1" + "@walletconnect/types": "npm:2.18.1" + "@walletconnect/universal-provider": "npm:2.18.1" + "@walletconnect/utils": "npm:2.18.1" events: "npm:3.3.0" - checksum: 10/bef6524edeab186af726947ab08a90823d4066c3ba9eae1fadf5f75c2c6912fcf25cefcc56cac6201ae3bc81fa57459a229e3bc1f3b465f1214719bd3931a27f + checksum: 10/8a2ba6b0a6d776a78402dcfe230f51c4aca5842b3072e114e4cb598047883fb3c9b5df49e983cea1550ba84abd1b9b825bc4e86fc06356eec471f39a4d27ca62 languageName: node linkType: hard @@ -7746,17 +7754,16 @@ __metadata: languageName: node linkType: hard -"@walletconnect/relay-auth@npm:1.0.4": - version: 1.0.4 - resolution: "@walletconnect/relay-auth@npm:1.0.4" +"@walletconnect/relay-auth@npm:1.1.0": + version: 1.1.0 + resolution: "@walletconnect/relay-auth@npm:1.1.0" dependencies: - "@stablelib/ed25519": "npm:^1.0.2" - "@stablelib/random": "npm:^1.0.1" + "@noble/curves": "npm:1.8.0" + "@noble/hashes": "npm:1.7.0" "@walletconnect/safe-json": "npm:^1.0.1" "@walletconnect/time": "npm:^1.0.2" - tslib: "npm:1.14.1" uint8arrays: "npm:^3.0.0" - checksum: 10/d9128b2a25f38ebf2f49f8c184dad5c997ad6343513bddd7941459c2f2757e6acfbcdd36dc9c12d0491f55723d5e2c5c0ee2e9cf381b3247274b920e95d4db0e + checksum: 10/0fd6c2e05ced76fbc8e6a84c0a8e73458779662aea55568f51cd9066c337d8a12f2869f0bd717024bbe5955cc605241e68505ebac40406ed2a1bdacba42431b1 languageName: node linkType: hard @@ -7769,20 +7776,20 @@ __metadata: languageName: node linkType: hard -"@walletconnect/sign-client@npm:2.17.4": - version: 2.17.4 - resolution: "@walletconnect/sign-client@npm:2.17.4" +"@walletconnect/sign-client@npm:2.18.1": + version: 2.18.1 + resolution: "@walletconnect/sign-client@npm:2.18.1" dependencies: - "@walletconnect/core": "npm:2.17.4" + "@walletconnect/core": "npm:2.18.1" "@walletconnect/events": "npm:1.0.1" "@walletconnect/heartbeat": "npm:1.2.2" "@walletconnect/jsonrpc-utils": "npm:1.0.8" "@walletconnect/logger": "npm:2.1.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.17.4" - "@walletconnect/utils": "npm:2.17.4" + "@walletconnect/types": "npm:2.18.1" + "@walletconnect/utils": "npm:2.18.1" events: "npm:3.3.0" - checksum: 10/8dea66e5012311f943f103b32369d20cf1f750d4b03aa05f8b2eead62674906bac68dca7796474301662934451cd5d9065995a5a1ec8035f474a9bf53a4025b5 + checksum: 10/3fe2b294f827b96bbebc9bf3847c07bfb134f10dc7c65ebb95ea8d52fc84b1ed6fcb33612239d0546e65f1aa000fcb189ae2e3540b5a8c66e01b186064d8011d languageName: node linkType: hard @@ -7795,9 +7802,9 @@ __metadata: languageName: node linkType: hard -"@walletconnect/types@npm:2.17.4": - version: 2.17.4 - resolution: "@walletconnect/types@npm:2.17.4" +"@walletconnect/types@npm:2.18.1": + version: 2.18.1 + resolution: "@walletconnect/types@npm:2.18.1" dependencies: "@walletconnect/events": "npm:1.0.1" "@walletconnect/heartbeat": "npm:1.2.2" @@ -7805,13 +7812,13 @@ __metadata: "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/logger": "npm:2.1.2" events: "npm:3.3.0" - checksum: 10/0af901584fd5496d71fbed9affc2e5a6f269fb3bf68432501c9f31fd2f19945aa0a504ecfc8a06354d1c6e101f8296742a65f5f204a2ec1feee2d42e7e9402ca + checksum: 10/f5c7a7aadc1241305fec822cbfb0edc7c6aeff3e9abee6b7a60279f87525211e7dc36ecdc86427cc86e99144559cfc97b39979beff91fabddf5b81720d25647a languageName: node linkType: hard -"@walletconnect/universal-provider@npm:2.17.4": - version: 2.17.4 - resolution: "@walletconnect/universal-provider@npm:2.17.4" +"@walletconnect/universal-provider@npm:2.18.1": + version: 2.18.1 + resolution: "@walletconnect/universal-provider@npm:2.18.1" dependencies: "@walletconnect/events": "npm:1.0.1" "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" @@ -7820,40 +7827,37 @@ __metadata: "@walletconnect/jsonrpc-utils": "npm:1.0.8" "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/logger": "npm:2.1.2" - "@walletconnect/sign-client": "npm:2.17.4" - "@walletconnect/types": "npm:2.17.4" - "@walletconnect/utils": "npm:2.17.4" + "@walletconnect/sign-client": "npm:2.18.1" + "@walletconnect/types": "npm:2.18.1" + "@walletconnect/utils": "npm:2.18.1" events: "npm:3.3.0" lodash: "npm:4.17.21" - checksum: 10/9042bde1bb2e962880154b6d54a1f5af97e61dae68e90e38f9db436535c5c7f396947b4363a5b699cf33f6ad71cda05b345cd7d24331639c142715083aea32e0 + checksum: 10/df7acec514c6eb73b2e0c2fb775996c5e7834c8c4b7e39501753eb6931ac3647c4f1575c3f1620a2ffc6055841844a3ae544eb7a6852f3155b45f42dc39776c3 languageName: node linkType: hard -"@walletconnect/utils@npm:2.17.4": - version: 2.17.4 - resolution: "@walletconnect/utils@npm:2.17.4" +"@walletconnect/utils@npm:2.18.1": + version: 2.18.1 + resolution: "@walletconnect/utils@npm:2.18.1" dependencies: - "@ethersproject/hash": "npm:5.7.0" "@ethersproject/transactions": "npm:5.7.0" - "@stablelib/chacha20poly1305": "npm:1.0.1" - "@stablelib/hkdf": "npm:1.0.1" - "@stablelib/random": "npm:1.0.2" - "@stablelib/sha256": "npm:1.0.1" - "@stablelib/x25519": "npm:1.0.3" + "@noble/ciphers": "npm:1.2.1" + "@noble/curves": "npm:1.8.1" + "@noble/hashes": "npm:1.7.1" "@walletconnect/jsonrpc-utils": "npm:1.0.8" "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/relay-api": "npm:1.0.11" - "@walletconnect/relay-auth": "npm:1.0.4" + "@walletconnect/relay-auth": "npm:1.1.0" "@walletconnect/safe-json": "npm:1.0.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.17.4" + "@walletconnect/types": "npm:2.18.1" "@walletconnect/window-getters": "npm:1.0.1" "@walletconnect/window-metadata": "npm:1.0.1" detect-browser: "npm:5.3.0" elliptic: "npm:6.6.1" query-string: "npm:7.1.3" uint8arrays: "npm:3.1.0" - checksum: 10/d09308bfefb9bbaf6b64290eed121e66bbcaea77b550db5657fb12dc936d6225a85b6266ab8bf936ac1597df467c2c589f9a9a3c25f62cca02f6843b4b8e5936 + checksum: 10/103c5d6b17cdf258f3e8ac85a8873c9174e804648c6844c72bf40b9eba56a8d3069b9e5dd825c27992194204314b7ebe66a81a935b0080e9e61c1e219c8c25bc languageName: node linkType: hard @@ -7894,12 +7898,12 @@ __metadata: linkType: hard "@web3-onboard/coinbase@npm:^2.2.5, @web3-onboard/coinbase@npm:^2.4.1": - version: 2.4.1 - resolution: "@web3-onboard/coinbase@npm:2.4.1" + version: 2.4.2 + resolution: "@web3-onboard/coinbase@npm:2.4.2" dependencies: - "@coinbase/wallet-sdk": "npm:4.0.3" + "@coinbase/wallet-sdk": "npm:4.3.0" "@web3-onboard/common": "npm:^2.4.1" - checksum: 10/405f3fcb12c8ed5c56cb225cbddb8d1695fb972214b3c58fe710cba87d61469fcc1741e300f2bf5fa50918233161f5d37db3bf6f65ea198a442e2126debb9822 + checksum: 10/d0815040fe3b13d0e6a2f7b3cddfb7af0e46c0c545adab2b76dbc48d146af89914e43920b21ef5d246ac396b28e03d4bc079cc439c98ad4b8e7481f617d9dade languageName: node linkType: hard @@ -8314,10 +8318,10 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10/ca0a54e35bea4ece0ecb68a47b312e1a9a6f772408d5bcb9051230aaa94b0460671c5b5c9cb3240eb5b7bc94c52476550eb221f65a0bbd0145bdc9f3113a6707 +"abbrev@npm:^3.0.0": + version: 3.0.0 + resolution: "abbrev@npm:3.0.0" + checksum: 10/2ceee14efdeda42ef7355178c1069499f183546ff7112b3efe79c1edef09d20ad9c17939752215fb8f7fcf48d10e6a7c0aa00136dc9cf4d293d963718bb1d200 languageName: node linkType: hard @@ -8477,15 +8481,6 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 10/d57c9d5bf8849bddcbd801b79bc3d2ddc736c2adb6b93a6a365429589dd7993ddbd5d37c6025ed6a7f89c27506b80131d5345c5b1fa6a97e40cd10a96bcd228c - languageName: node - linkType: hard - "ajv-keywords@npm:^5.1.0": version: 5.1.0 resolution: "ajv-keywords@npm:5.1.0" @@ -8497,7 +8492,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.12.3, ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -8629,7 +8624,7 @@ __metadata: languageName: node linkType: hard -"aria-hidden@npm:^1.1.1": +"aria-hidden@npm:^1.1.1, aria-hidden@npm:^1.2.4": version: 1.2.4 resolution: "aria-hidden@npm:1.2.4" dependencies: @@ -9592,12 +9587,12 @@ __metadata: linkType: hard "call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1": - version: 1.0.1 - resolution: "call-bind-apply-helpers@npm:1.0.1" + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" - checksum: 10/6e30c621170e45f1fd6735e84d02ee8e02a3ab95cb109499d5308cbe5d1e84d0cd0e10b48cc43c76aa61450ae1b03a7f89c37c10fc0de8d4998b42aab0f268cc + checksum: 10/00482c1f6aa7cfb30fb1dbeb13873edf81cfac7c29ed67a5957d60635a56b2a4a480f1016ddbdb3395cc37900d46037fb965043a51c5c789ffeab4fc535d18b5 languageName: node linkType: hard @@ -9662,9 +9657,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001154, caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001695 - resolution: "caniuse-lite@npm:1.0.30001695" - checksum: 10/8107c5e89b86c7a2fd506b93c658ff945c98c6518260c3b28af9f02bd83bf83939696241f0b413545c5b9895c86bcae64c9370388576440e74e9b848f04170d3 + version: 1.0.30001700 + resolution: "caniuse-lite@npm:1.0.30001700" + checksum: 10/9203ed502fd1b74c47f315a001e1d91abe2abecb951f8e15dd1556cfc23a29fa7a7b2cc654380604bb6f58bcfa0c65b78055b9d99a7489c13baa0d4158a6e25e languageName: node linkType: hard @@ -9699,11 +9694,11 @@ __metadata: linkType: hard "cborg@npm:^4.0.0": - version: 4.2.7 - resolution: "cborg@npm:4.2.7" + version: 4.2.8 + resolution: "cborg@npm:4.2.8" bin: cborg: lib/bin.js - checksum: 10/50428bb4986d66d4fa20c3f7a4332ddca1f4341500fbc4f3ae6ca719b2a0db9a5e025ac44b6ef71cf8258f76ed5099d55e9fb89b65c486fdda201d9f577509ca + checksum: 10/2aa718778ae46dc1256831ff6c326ddb6815abe8a74f07651afd4409ff0a9fda07ed868ea13d8bbf154cf65e720ea64dda58f8de572c60ee6f3d50b6de48bb87 languageName: node linkType: hard @@ -10065,13 +10060,6 @@ __metadata: languageName: node linkType: hard -"consola@npm:^3.2.3": - version: 3.4.0 - resolution: "consola@npm:3.4.0" - checksum: 10/99d4a8131f4cc42ff6bb8e4fd8c9dbd428d6b949f3ec25d9d24892a7b0603b0aabeee8213e13ad74439b5078fdb204f9377bcdd401949c33fff672d91f05c4ec - languageName: node - linkType: hard - "console-browserify@npm:^1.1.0": version: 1.2.0 resolution: "console-browserify@npm:1.2.0" @@ -10367,16 +10355,16 @@ __metadata: languageName: node linkType: hard -"crossws@npm:^0.3.1": - version: 0.3.1 - resolution: "crossws@npm:0.3.1" +"crossws@npm:^0.3.3": + version: 0.3.4 + resolution: "crossws@npm:0.3.4" dependencies: uncrypto: "npm:^0.1.3" - checksum: 10/d358a58b364b3314a0e42ee66b1432c01d416128e53eda983eb121abdad5ff39831a1f1ea3e90e80157ceaa0fc925f5193c151b156aa62af9e0c9bcb2fb2a15a + checksum: 10/4226588a51835640e904f760e3b3d8d673c5176191d50449f5cde65bfd4c68fc1cd0db489fa46088ddde4bacec0407e00d9acab0a2abf40806dbd4dc81c1fc32 languageName: node linkType: hard -"crypto-browserify@npm:^3.11.0, crypto-browserify@npm:^3.12.0": +"crypto-browserify@npm:^3.12.0, crypto-browserify@npm:^3.12.1": version: 3.12.1 resolution: "crypto-browserify@npm:3.12.1" dependencies: @@ -10638,9 +10626,9 @@ __metadata: linkType: hard "decimal.js@npm:10": - version: 10.4.3 - resolution: "decimal.js@npm:10.4.3" - checksum: 10/de663a7bc4d368e3877db95fcd5c87b965569b58d16cdc4258c063d231ca7118748738df17cd638f7e9dd0be8e34cec08d7234b20f1f2a756a52fc5a38b188d0 + version: 10.5.0 + resolution: "decimal.js@npm:10.5.0" + checksum: 10/714d49cf2f2207b268221795ede330e51452b7c451a0c02a770837d2d4faed47d603a729c2aa1d952eb6c4102d999e91c9b952c1aa016db3c5cba9fc8bf4cda2 languageName: node linkType: hard @@ -11091,14 +11079,14 @@ __metadata: linkType: hard "dompurify@npm:^3.0.2": - version: 3.2.3 - resolution: "dompurify@npm:3.2.3" + version: 3.2.4 + resolution: "dompurify@npm:3.2.4" dependencies: "@types/trusted-types": "npm:^2.0.7" dependenciesMeta: "@types/trusted-types": optional: true - checksum: 10/aad472bcdff40afdbb307fd02abbca86acefee9c39cb35e9634ebbc5e047750a7eeb021b02cd66894d60cf75ad021f69394de2e9e8786b0dd91c5832f497a9af + checksum: 10/98570c53385518a2f9b617f796926338856acfdd3369c88b5905bddf96bd7d391bf8a5433127155e0046e6faa2bfb767185fcd571b865dfabe624c099e2537f5 languageName: node linkType: hard @@ -11258,9 +11246,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.3.585, electron-to-chromium@npm:^1.5.73": - version: 1.5.83 - resolution: "electron-to-chromium@npm:1.5.83" - checksum: 10/54326419778f80bfc3a76fec2e5a9122d81e7b04758da0b9c4d8bac612e6740f67f8a072b30ba62729f8ff5946fab3e2e1060936d1424eb5594c41baa9d82023 + version: 1.5.102 + resolution: "electron-to-chromium@npm:1.5.102" + checksum: 10/2d22b978a94c02c7db77ba25bbcffba55afabefb59ccb1979c65ece44d6e29e69593c343f026859c80202eee8f9db86bae04055da36a37917e06a64f7146fce7 languageName: node linkType: hard @@ -11447,15 +11435,15 @@ __metadata: linkType: hard "engine.io-client@npm:~6.6.1": - version: 6.6.2 - resolution: "engine.io-client@npm:6.6.2" + version: 6.6.3 + resolution: "engine.io-client@npm:6.6.3" dependencies: "@socket.io/component-emitter": "npm:~3.1.0" debug: "npm:~4.3.1" engine.io-parser: "npm:~5.2.1" ws: "npm:~8.17.1" xmlhttprequest-ssl: "npm:~2.1.1" - checksum: 10/c006b3389bb8bd0381926b9633e9f547dec187ea28d2dd99cb42d516b0720bc4373f3f937c199ca616c95b2832e0f547f73326f614caedfe39c02fa93b7ac733 + checksum: 10/c5b8e7eb0f2637b21a63780214878b842306247f540cccab7a4d15606d142e42878cc79607f8f77fa29f016b6854702b7d5ad275df7ad6150f08954a1e2c332a languageName: node linkType: hard @@ -11467,12 +11455,12 @@ __metadata: linkType: hard "enhanced-resolve@npm:^5.17.1": - version: 5.18.0 - resolution: "enhanced-resolve@npm:5.18.0" + version: 5.18.1 + resolution: "enhanced-resolve@npm:5.18.1" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10/e88463ef97b68d40d0da0cd0c572e23f43dba0be622d6d44eae5cafed05f0c5dac43e463a83a86c4f70186d029357f82b56d9e1e47e8fc91dce3d6602f8bd6ce + checksum: 10/50e81c7fe2239fba5670ebce78a34709906ed3a79274aa416434f7307b252e0b7824d76a7dd403eca795571dc6afd9a44183fc45a68475e8f2fdfbae6e92fcc3 languageName: node linkType: hard @@ -11907,11 +11895,11 @@ __metadata: linkType: hard "eslint-plugin-react-refresh@npm:^0.4.6": - version: 0.4.18 - resolution: "eslint-plugin-react-refresh@npm:0.4.18" + version: 0.4.19 + resolution: "eslint-plugin-react-refresh@npm:0.4.19" peerDependencies: eslint: ">=8.40" - checksum: 10/5374e01f4a41c0cfe66a50162ab8c63aa919cc4f287942093a0f2beecae21f5b5ccab5442a5a29b6f4d8dd653582eabca40222c494904216dbf8d3b9fa97a190 + checksum: 10/4a17088da4da6e1efe4a5bb76bcf917c82d271d8c327a6b906a4ac5623bf7b0a8a990eca78c2e04267ede9095854442ff08d7e1484baa258827a6dc3452ab892 languageName: node linkType: hard @@ -12404,9 +12392,9 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10/2d9bbb6473de7051f96790d5f9a678f32e60ed0aa70741dc7fdc96fec8d631124ec3374ac144387604f05afff9500f31a1d45bd9eee4cdc2e4f9ad2d9b9d5dbd + version: 3.1.2 + resolution: "exponential-backoff@npm:3.1.2" + checksum: 10/ca2f01f1aa4dafd3f3917bd531ab5be08c6f5f4b2389d2e974f903de3cbeb50b9633374353516b6afd70905775e33aba11afab1232d3acf0aa2963b98a611c51 languageName: node linkType: hard @@ -12558,9 +12546,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.5 - resolution: "fast-uri@npm:3.0.5" - checksum: 10/21bd8d523c32d16242a6037ae440ddc1905b6b045fdb971e8d8b6443a0ddde3fbce59ca3e6a4a79e5afadcbed79756cf9cb5f9f96a211e1b67c0255315ce12ac + version: 3.0.6 + resolution: "fast-uri@npm:3.0.6" + checksum: 10/43c87cd03926b072a241590e49eca0e2dfe1d347ddffd4b15307613b42b8eacce00a315cf3c7374736b5f343f27e27ec88726260eb03a758336d507d6fbaba0a languageName: node linkType: hard @@ -12591,11 +12579,11 @@ __metadata: linkType: hard "fastq@npm:^1.3.0, fastq@npm:^1.6.0": - version: 1.18.0 - resolution: "fastq@npm:1.18.0" + version: 1.19.0 + resolution: "fastq@npm:1.19.0" dependencies: reusify: "npm:^1.0.4" - checksum: 10/c5b501333dc8f5d188d828ea162aad03ff5a81aed185b6d4a5078aaeae0a42babc34296d7af13ebce86401cccd93c9b7b3cbf61280821c5f20af233378b42fbb + checksum: 10/20457acfb15946f8ea80496da296a0d4930919638315627f093269d302f46fa97eaac3ad180746910edcd6f7163b8125620c30a41427267ffacd10ab67b1c806 languageName: node linkType: hard @@ -12774,9 +12762,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.2 - resolution: "flatted@npm:3.3.2" - checksum: 10/ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10/8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe languageName: node linkType: hard @@ -12791,11 +12779,11 @@ __metadata: linkType: hard "for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: "npm:^1.1.3" - checksum: 10/fdac0cde1be35610bd635ae958422e8ce0cc1313e8d32ea6d34cfda7b60850940c1fd07c36456ad76bd9c24aef6ff5e03b02beb58c83af5ef6c968a64eada676 + is-callable: "npm:^1.2.7" + checksum: 10/330cc2439f85c94f4609de3ee1d32c5693ae15cdd7fe3d112c4fd9efd4ce7143f2c64ef6c2c9e0cfdb0058437f33ef05b5bdae5b98fcc903fb2143fbaf0fea0f languageName: node linkType: hard @@ -12824,13 +12812,14 @@ __metadata: linkType: hard "form-data@npm:^3.0.0": - version: 3.0.2 - resolution: "form-data@npm:3.0.2" + version: 3.0.3 + resolution: "form-data@npm:3.0.3" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" - mime-types: "npm:^2.1.12" - checksum: 10/b8d71d7149de5881c6c8ac75c03ac2e809b1b729399320cc41f59a63043fa34b95dfef5259212d6d902abb4916af48a7ca60ad5c035806ba8e3c7843dbaf3057 + es-set-tostringtag: "npm:^2.1.0" + mime-types: "npm:^2.1.35" + checksum: 10/6dbef55ddbeefc3c9ec2dac3683f0b4ca22352addc2b22a002650c90a0049b694f004c42d54971b0faf3dd7060818456e0053003a959c95ad6769905d582062f languageName: node linkType: hard @@ -13336,20 +13325,20 @@ __metadata: linkType: hard "h3@npm:^1.13.0": - version: 1.13.1 - resolution: "h3@npm:1.13.1" + version: 1.15.0 + resolution: "h3@npm:1.15.0" dependencies: cookie-es: "npm:^1.2.2" - crossws: "npm:^0.3.1" + crossws: "npm:^0.3.3" defu: "npm:^6.1.4" destr: "npm:^2.0.3" iron-webcrypto: "npm:^1.2.1" + node-mock-http: "npm:^1.0.0" ohash: "npm:^1.1.4" radix3: "npm:^1.1.2" ufo: "npm:^1.5.4" uncrypto: "npm:^0.1.3" - unenv: "npm:^1.10.0" - checksum: 10/19c75a63df087e49489a1c7bd9e12e79db26971c8e4f6e7a76ea98cc25042287d9282fd1dace47e6c3a74420737cc40fe6d629be7206cc8ec0f77fc39669622e + checksum: 10/5348ef68a80f1916fa0ec2ae82ecb701d7b1b58b416dc5bf1431972f0baa32e3eb0d8b7750c4c4ee1a76bc2edc5b353d9799400b0bfa9ab60b52a02ff641b5aa languageName: node linkType: hard @@ -13533,9 +13522,9 @@ __metadata: linkType: hard "hls.js@npm:^1.4.12": - version: 1.5.19 - resolution: "hls.js@npm:1.5.19" - checksum: 10/9542887815e205d1326cb210e4a2d1d622f3870ffd7ed6ecad8efa7c93b67b823cfd9716d895ed571f5e4684e445a8e9efa4c2a059586ea8e36fe1546e69851d + version: 1.5.20 + resolution: "hls.js@npm:1.5.20" + checksum: 10/1819ce448604d7c7f3b546c67588a04f271b29ed97e3854ef2d1888458cfd5257480eab5bebbd7fa930cdba6aa6d0ecf95f104f82b1d011511923a6750e6f7fb languageName: node linkType: hard @@ -13811,12 +13800,12 @@ __metadata: linkType: hard "import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 10/2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + checksum: 10/a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard @@ -13897,14 +13886,14 @@ __metadata: linkType: hard "intl-messageformat@npm:^10.5.3": - version: 10.7.14 - resolution: "intl-messageformat@npm:10.7.14" + version: 10.7.15 + resolution: "intl-messageformat@npm:10.7.15" dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.2" + "@formatjs/ecma402-abstract": "npm:2.3.3" "@formatjs/fast-memoize": "npm:2.2.6" - "@formatjs/icu-messageformat-parser": "npm:2.11.0" + "@formatjs/icu-messageformat-parser": "npm:2.11.1" tslib: "npm:2" - checksum: 10/1e6c41b154b50593c4b47a71930a3e02221af559f84d0f597dc250bb40c7c754f91c7264211ff4b6c1a305a8f106f8cd8f05acfe0480bd5b382405746c68ad3d + checksum: 10/817630c4997d24556714f785d26a1e8ced510c88c28837fc23add75891096e2d64156534ea126b5e1439fa23659b3e4bf530fb6ca5618c9b5ace067e6a47d486 languageName: node linkType: hard @@ -14262,16 +14251,16 @@ __metadata: linkType: hard "is-boolean-object@npm:^1.2.1": - version: 1.2.1 - resolution: "is-boolean-object@npm:1.2.1" + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bound: "npm:^1.0.2" + call-bound: "npm:^1.0.3" has-tostringtag: "npm:^1.0.2" - checksum: 10/5a15524635c9334ebbd668f20a6cbf023adceed5725ec96a50056d21ae65f52759d04a8fa7d7febf00ff3bc4e6d3837638eb84be572f287bcfd15f8b8facde43 + checksum: 10/051fa95fdb99d7fbf653165a7e6b2cba5d2eb62f7ffa81e793a790f3fb5366c91c1b7b6af6820aa2937dd86c73aa3ca9d9ca98f500988457b1c59692c52ba911 languageName: node linkType: hard -"is-callable@npm:^1.1.3": +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 10/48a9297fb92c99e9df48706241a189da362bff3003354aea4048bd5f7b2eb0d823cd16d0a383cece3d76166ba16d85d9659165ac6fcce1ac12e6c649d66dbdb9 @@ -15210,7 +15199,7 @@ __metadata: languageName: node linkType: hard -"keccak@npm:^3.0.0, keccak@npm:^3.0.3": +"keccak@npm:^3.0.0": version: 3.0.4 resolution: "keccak@npm:3.0.4" dependencies: @@ -15710,9 +15699,9 @@ __metadata: linkType: hard "long@npm:^5.0.0": - version: 5.2.4 - resolution: "long@npm:5.2.4" - checksum: 10/c27c060a683d4d76dc48da12ded0ae49c610aaf10d028ec938829d7bebe916979dcc8b67ed71f8bf6d845a90151b66a9b741a3ee51ec874908e496c2a576697a + version: 5.3.1 + resolution: "long@npm:5.3.1" + checksum: 10/7713e10b4fe10db041d9939b7c4c3d73d3dd91785be72269ca8c5262feae7cb45f4eebed2b77bd346de7fe5f847e90f52c577c89ab3f2bd8a5ddc8b4098cbe35 languageName: node linkType: hard @@ -16035,7 +16024,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.16, mime-types@npm:^2.1.27, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.16, mime-types@npm:^2.1.27, mime-types@npm:^2.1.35, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -16053,15 +16042,6 @@ __metadata: languageName: node linkType: hard -"mime@npm:^3.0.0": - version: 3.0.0 - resolution: "mime@npm:3.0.0" - bin: - mime: cli.js - checksum: 10/b2d31580deb58be89adaa1877cbbf152b7604b980fd7ef8f08b9e96bfedf7d605d9c23a8ba62aa12c8580b910cd7c1d27b7331d0f40f7a14e17d5a0bbec3b49f - languageName: node - linkType: hard - "mimic-response@npm:^1.0.0": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -16472,9 +16452,9 @@ __metadata: linkType: hard "multiformats@npm:^13.0.0, multiformats@npm:^13.1.0": - version: 13.3.1 - resolution: "multiformats@npm:13.3.1" - checksum: 10/2e529613d457590dffe212a658546f313c7c7296d240d952d2baee7ce0abb227116d784f05cf4d238ef0db7d72ad2c3d04ea3c6b9bfd20db805a092024ce8d7e + version: 13.3.2 + resolution: "multiformats@npm:13.3.2" + checksum: 10/457bcf4f1c14c59a553adad234fb1f0d82d15877b2d1c265e7f306d69824473c74b6e7a489eb88968b0db1f2c688ef64d9332a4485ef154cd2a68150ea61028c languageName: node linkType: hard @@ -16793,9 +16773,9 @@ __metadata: linkType: hard "node-fetch-native@npm:^1.6.4": - version: 1.6.5 - resolution: "node-fetch-native@npm:1.6.5" - checksum: 10/92b868f330f18ce35aa54a3460b29580299b6942b38511c3812f2ae0619b040fcf361e1ccbe101970fc2c229cbfa23221c711a0201ae1c66678b5b7384673802 + version: 1.6.6 + resolution: "node-fetch-native@npm:1.6.6" + checksum: 10/e90d5287fdfb10b9b13276158c9c0ff4318eef222562cf4a504e71665236dea9dda10ae77eb9f0f89cb7677a32ccf2326b9b54f7090121c2af2ac617c1256f8f languageName: node linkType: hard @@ -16843,8 +16823,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.0.0 - resolution: "node-gyp@npm:11.0.0" + version: 11.1.0 + resolution: "node-gyp@npm:11.1.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -16858,7 +16838,14 @@ __metadata: which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10/5d07430e887a906f85c7c6ed87e8facb7ecd4ce42d948a2438c471df2e24ae6af70f4def114ec1a03127988d164648dda8d75fe666f3c4b431e53856379fdf13 + checksum: 10/3314ebfeb99dbcdf9e8c810df1ee52294045399873d4ab1e6740608c4fbe63adaf6580c0610b23c6eda125e298536553f5bb6fb0df714016a5c721ed31095e42 + languageName: node + linkType: hard + +"node-mock-http@npm:^1.0.0": + version: 1.0.0 + resolution: "node-mock-http@npm:1.0.0" + checksum: 10/338a94e4027e96f7d33af8f7012aeff095740a89df168950d7c39a968d6edb253b145eab41bc83738db4898581d941d96d855254c344a72c8609ee69f888ce86 languageName: node linkType: hard @@ -16877,8 +16864,8 @@ __metadata: linkType: hard "node-stdlib-browser@npm:^1.2.0": - version: 1.3.0 - resolution: "node-stdlib-browser@npm:1.3.0" + version: 1.3.1 + resolution: "node-stdlib-browser@npm:1.3.1" dependencies: assert: "npm:^2.0.0" browser-resolve: "npm:^2.0.0" @@ -16887,7 +16874,7 @@ __metadata: console-browserify: "npm:^1.1.0" constants-browserify: "npm:^1.0.0" create-require: "npm:^1.1.1" - crypto-browserify: "npm:^3.11.0" + crypto-browserify: "npm:^3.12.1" domain-browser: "npm:4.22.0" events: "npm:^3.0.0" https-browserify: "npm:^1.0.0" @@ -16907,7 +16894,7 @@ __metadata: url: "npm:^0.11.4" util: "npm:^0.12.4" vm-browserify: "npm:^1.0.1" - checksum: 10/b35ea38004466d3df228b7e7b58a64b00c5a8282a4ba6c14a327623c7551ff97471a87d4ab5c1ad4fa8d7f6d766d3e5a388ff72abf50fa8dfac12ee237ba053c + checksum: 10/5d5ace50868ef1a8ce9718a5fc64e4b6712f8be75bf6ab71f2eb7b5815f55f20507e427eac2fdb384e372f58891eb34089af3b55d3f9b5b60b547c8581a1c30e languageName: node linkType: hard @@ -16927,13 +16914,13 @@ __metadata: linkType: hard "nopt@npm:^8.0.0": - version: 8.0.0 - resolution: "nopt@npm:8.0.0" + version: 8.1.0 + resolution: "nopt@npm:8.1.0" dependencies: - abbrev: "npm:^2.0.0" + abbrev: "npm:^3.0.0" bin: nopt: bin/nopt.js - checksum: 10/2d137f64b6f9331ec97047dd1cbbe4dcd9a61ceef4fd0f2252c0bbac1d69ba15671e6fd83a441328824b3ca78afe6ebe1694f12ebcd162b73a221582a06179ff + checksum: 10/26ab456c51a96f02a9e5aa8d1b80ef3219f2070f3f3528a040e32fb735b1e651e17bdf0f1476988d3a46d498f35c65ed662d122f340d38ce4a7e71dd7b20c4bc languageName: node linkType: hard @@ -16992,9 +16979,9 @@ __metadata: linkType: hard "object-inspect@npm:^1.13.3": - version: 1.13.3 - resolution: "object-inspect@npm:1.13.3" - checksum: 10/14cb973d8381c69e14d7f1c8c75044eb4caf04c6dabcf40ca5c2ce42dc2073ae0bb2a9939eeca142b0c05215afaa1cd5534adb7c8879c32cba2576e045ed8368 + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10/aa13b1190ad3e366f6c83ad8a16ed37a19ed57d267385aa4bfdccda833d7b90465c057ff6c55d035a6b2e52c1a2295582b294217a0a3a1ae7abdd6877ef781fb languageName: node linkType: hard @@ -17226,12 +17213,12 @@ __metadata: linkType: hard "p-queue@npm:^8.0.1": - version: 8.0.1 - resolution: "p-queue@npm:8.0.1" + version: 8.1.0 + resolution: "p-queue@npm:8.1.0" dependencies: eventemitter3: "npm:^5.0.1" p-timeout: "npm:^6.1.2" - checksum: 10/8dcf8fbb8339675eba7d369f6eebac9e249e2412280ad73938403b83a28a2627a2072c732890d22ef98837cef89ff09eecd839cbac358cdc532d00ef4f736d0d + checksum: 10/0dc23488b855c6b3a6c551e41c3c9c1c0991f097c294a2476f34d47ea3b1c74deac5ccd465ebc1560432e6a490a133a60b428dd44d8e51dff662f6b792814320 languageName: node linkType: hard @@ -17327,9 +17314,9 @@ __metadata: linkType: hard "parse-duration@npm:^1.0.0": - version: 1.1.1 - resolution: "parse-duration@npm:1.1.1" - checksum: 10/60622742c411139e7656643fb1c91f7c6ef0f96bb71de8a1689fb0290c7f68e1c1c160672f3a7239ec379944f79b92300d453dbd2efa8c633cd11ebb006ea7dd + version: 1.1.2 + resolution: "parse-duration@npm:1.1.2" + checksum: 10/c31ebdee783935afe250fd79cdfab9d14e196ee2a810e6a7abbdef6d945a1b88797972437c9e5ed10e8e1cb5cd68b7cc13e9ac9721839f0cb1c2f5fe837d99d9 languageName: node linkType: hard @@ -17432,13 +17419,6 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.2": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: 10/f201d796351bf7433d147b92c20eb154a4e0ea83512017bf4ec4e492a5d6e738fb45798be4259a61aa81270179fce11026f6ff0d3fa04173041de044defe9d80 - languageName: node - linkType: hard - "pathval@npm:^1.1.1": version: 1.1.1 resolution: "pathval@npm:1.1.1" @@ -17674,9 +17654,9 @@ __metadata: linkType: hard "possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10/8ed3e96dfeea1c5880c1f4c9cb707e5fb26e8be22f14f82ef92df20fd2004e635c62ba47fbe8f2bb63bfd80dac1474be2fb39798da8c2feba2815435d1f749af + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: 10/2f44137b8d3dd35f4a7ba7469eec1cd9cfbb46ec164b93a5bc1f4c3d68599c9910ee3b91da1d28b4560e9cc8414c3cd56fedc07259c67e52cc774476270d3302 languageName: node linkType: hard @@ -17687,32 +17667,32 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.38": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" +"postcss@npm:8.4.49": + version: 8.4.49 + resolution: "postcss@npm:8.4.49" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.2.0" - checksum: 10/6e44a7ed835ffa9a2b096e8d3e5dfc6bcf331a25c48aeb862dd54e3aaecadf814fa22be224fd308f87d08adf2299164f88c5fd5ab1c4ef6cbd693ceb295377f4 + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10/28fe1005b1339870e0a5006375ba5ac1213fd69800f79e7db09c398e074421ba6e162898e94f64942fed554037fd292db3811d87835d25ab5ef7f3c9daacb6ca languageName: node linkType: hard "postcss@npm:^8.4.43, postcss@npm:^8.4.48": - version: 8.5.1 - resolution: "postcss@npm:8.5.1" + version: 8.5.3 + resolution: "postcss@npm:8.5.3" dependencies: nanoid: "npm:^3.3.8" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10/1fbd28753143f7f03e4604813639918182b15343c7ad0f4e72f3875fc2cc0b8494c887f55dc05008fad5fbf1e1e908ce2edbbce364a91f84dcefb71edf7cd31d + checksum: 10/6d7e21a772e8b05bf102636918654dac097bac013f0dc8346b72ac3604fc16829646f94ea862acccd8f82e910b00e2c11c1f0ea276543565d278c7ca35516a7c languageName: node linkType: hard -"preact@npm:^10.16.0": - version: 10.25.4 - resolution: "preact@npm:10.25.4" - checksum: 10/8b377438912965b45786d1dbfdd532157294a79bebc611b242d708317574403554ab37e34c613a3e9e862685c04695343f1426a38e12258e1e9ebafc0d7e4c5d +"preact@npm:^10.24.2": + version: 10.26.2 + resolution: "preact@npm:10.26.2" + checksum: 10/3bcb7bb5018b6098c2f02e39537b9fa60fe47cd606ed1ad11a32560751121a54ed3a3d68638c4845f84cb633133467496cbf198fdf3d7238a41d2c92929b9d63 languageName: node linkType: hard @@ -18363,15 +18343,15 @@ __metadata: linkType: hard "rc-util@npm:^5.38.0": - version: 5.44.3 - resolution: "rc-util@npm:5.44.3" + version: 5.44.4 + resolution: "rc-util@npm:5.44.4" dependencies: "@babel/runtime": "npm:^7.18.3" react-is: "npm:^18.2.0" peerDependencies: react: ">=16.9.0" react-dom: ">=16.9.0" - checksum: 10/d254f339b10d7bb850cf3d792371a3ae569a4d768ceccbd5dc52779ac6edcd2aa2eb94859b10fce782f2baee4fdf5582a3d8a2293208a77edd07309c577e55f8 + checksum: 10/c456b9899545625b6d856bef1218ce0ed87af13e2c9c328e302fd255b912ee2e4a0fd81603221736ed9b176ed79507abc2275dc1df488ea465d26b4807f4e99a languageName: node linkType: hard @@ -18825,46 +18805,46 @@ __metadata: languageName: node linkType: hard -"react-remove-scroll@npm:^2.6.1": - version: 2.6.2 - resolution: "react-remove-scroll@npm:2.6.2" +"react-remove-scroll@npm:^2.6.3": + version: 2.6.3 + resolution: "react-remove-scroll@npm:2.6.3" dependencies: react-remove-scroll-bar: "npm:^2.3.7" - react-style-singleton: "npm:^2.2.1" + react-style-singleton: "npm:^2.2.3" tslib: "npm:^2.1.0" use-callback-ref: "npm:^1.3.3" - use-sidecar: "npm:^1.1.2" + use-sidecar: "npm:^1.1.3" peerDependencies: "@types/react": "*" react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10/e6d7e8c42793ae24c9d4a6cb3ebdf3499c1b413fb0c93c3fbf047d875396e944e88a0520dd7db3a20db37125ffadef45b1ce8cb77b74da44daf47c5eb2155c9a + checksum: 10/d4dfd38e4381fa6059c8b810568b2d3a31fe21168bb3e2f57d1b1885ee08736fbd5a3fd83936faef0d17031c9c4175a1af83885bfc6c4280611f025447b19a4c languageName: node linkType: hard "react-router-dom@npm:^6.9.0": - version: 6.28.2 - resolution: "react-router-dom@npm:6.28.2" + version: 6.29.0 + resolution: "react-router-dom@npm:6.29.0" dependencies: - "@remix-run/router": "npm:1.21.1" - react-router: "npm:6.28.2" + "@remix-run/router": "npm:1.22.0" + react-router: "npm:6.29.0" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 10/4775cb484c497be5833ef5e048378d685f970a72c75a595c8b74fce147eda9e705d885b71d888b1090a8f22e7630adb851766d34e771c3a649f73171f0fa4c2b + checksum: 10/2cf5bf156e0ce8c049bfe5fd78b08956f24ddaa81cc2982ccb911e20fdb9c7864365c257b9ad271dfaec9ffcb318338ae3abb1b7903a6c9f9abe9f2b9e7edbb9 languageName: node linkType: hard -"react-router@npm:6.28.2": - version: 6.28.2 - resolution: "react-router@npm:6.28.2" +"react-router@npm:6.29.0": + version: 6.29.0 + resolution: "react-router@npm:6.29.0" dependencies: - "@remix-run/router": "npm:1.21.1" + "@remix-run/router": "npm:1.22.0" peerDependencies: react: ">=16.8" - checksum: 10/4cf150e3762acff8a087d6b474861fdb73efdf829ce0619bc980f3d8fc5d9e45e67333ab7d62af5b775fba8efe8f8d342f089bec75f9b41f3162e139c0187efd + checksum: 10/c3d0ce685a74818bf904900a6a9172eab7470d92df46804563743f666759cb3395f46743c784d51be57d878f84188ddf4477c3b5f029b6132e59692b8e3dc1ef languageName: node linkType: hard @@ -18908,7 +18888,7 @@ __metadata: languageName: node linkType: hard -"react-style-singleton@npm:^2.2.1, react-style-singleton@npm:^2.2.2": +"react-style-singleton@npm:^2.2.1, react-style-singleton@npm:^2.2.2, react-style-singleton@npm:^2.2.3": version: 2.2.3 resolution: "react-style-singleton@npm:2.2.3" dependencies: @@ -19173,12 +19153,25 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^4.7.0": + version: 4.7.0 + resolution: "readable-stream@npm:4.7.0" + dependencies: + abort-controller: "npm:^3.0.0" + buffer: "npm:^6.0.3" + events: "npm:^3.3.0" + process: "npm:^0.11.10" + string_decoder: "npm:^1.3.0" + checksum: 10/bdf096c8ff59452ce5d08f13da9597f9fcfe400b4facfaa88e74ec057e5ad1fdfa140ffe28e5ed806cf4d2055f0b812806e962bca91dce31bc4cef08e53be3a4 + languageName: node + linkType: hard + "readable-web-to-node-stream@npm:^3.0.0": - version: 3.0.2 - resolution: "readable-web-to-node-stream@npm:3.0.2" + version: 3.0.4 + resolution: "readable-web-to-node-stream@npm:3.0.4" dependencies: - readable-stream: "npm:^3.6.0" - checksum: 10/d3a5bf9d707c01183d546a64864aa63df4d9cb835dfd2bf89ac8305e17389feef2170c4c14415a10d38f9b9bfddf829a57aaef7c53c8b40f11d499844bf8f1a4 + readable-stream: "npm:^4.7.0" + checksum: 10/d8fb3de7579d70ea1e9efdfb2f02e2965ae62a1e1d9e9b0bdce493cb3b98090bd4a34526a9ab6c793bb833b89ffd31a5ab06117a3ae2a3df21363651b2131da9 languageName: node linkType: hard @@ -19544,28 +19537,28 @@ __metadata: linkType: hard "rollup@npm:^4.20.0": - version: 4.31.0 - resolution: "rollup@npm:4.31.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.31.0" - "@rollup/rollup-android-arm64": "npm:4.31.0" - "@rollup/rollup-darwin-arm64": "npm:4.31.0" - "@rollup/rollup-darwin-x64": "npm:4.31.0" - "@rollup/rollup-freebsd-arm64": "npm:4.31.0" - "@rollup/rollup-freebsd-x64": "npm:4.31.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.31.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.31.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.31.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.31.0" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.31.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.31.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.31.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.31.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.31.0" - "@rollup/rollup-linux-x64-musl": "npm:4.31.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.31.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.31.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.31.0" + version: 4.34.8 + resolution: "rollup@npm:4.34.8" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.34.8" + "@rollup/rollup-android-arm64": "npm:4.34.8" + "@rollup/rollup-darwin-arm64": "npm:4.34.8" + "@rollup/rollup-darwin-x64": "npm:4.34.8" + "@rollup/rollup-freebsd-arm64": "npm:4.34.8" + "@rollup/rollup-freebsd-x64": "npm:4.34.8" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.34.8" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.34.8" + "@rollup/rollup-linux-arm64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-arm64-musl": "npm:4.34.8" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.34.8" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-s390x-gnu": "npm:4.34.8" + "@rollup/rollup-linux-x64-gnu": "npm:4.34.8" + "@rollup/rollup-linux-x64-musl": "npm:4.34.8" + "@rollup/rollup-win32-arm64-msvc": "npm:4.34.8" + "@rollup/rollup-win32-ia32-msvc": "npm:4.34.8" + "@rollup/rollup-win32-x64-msvc": "npm:4.34.8" "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -19611,7 +19604,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/4f5fac0a0df7878ca810512c283df0e81b21d42fed262943b412c488a30beceb0149a4be36dbf2750b6c5cbfa4d4cf5097a134266f1425a9e213c2a2a09853fc + checksum: 10/a8cafc19b181c521afe37c4d7601af72dedaf233e1c09ee2276a93b2656f69a08ddbc37766c397043dc413d985460c37184f1efece9d75d82225c5b880798eb0 languageName: node linkType: hard @@ -19758,17 +19751,6 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.2.0": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.8" - ajv: "npm:^6.12.5" - ajv-keywords: "npm:^3.5.2" - checksum: 10/2c7bbb1da967fdfd320e6cea538949006ec6e8c13ea560a4f94ff2c56809a8486fa5ec419e023452501a6befe1ca381e409c2798c24f4993c7c4094d97fdb258 - languageName: node - linkType: hard - "schema-utils@npm:^4.3.0": version: 4.3.0 resolution: "schema-utils@npm:4.3.0" @@ -19925,11 +19907,11 @@ __metadata: linkType: hard "semver@npm:^7.3.5, semver@npm:^7.6.0": - version: 7.6.3 - resolution: "semver@npm:7.6.3" + version: 7.7.1 + resolution: "semver@npm:7.7.1" bin: semver: bin/semver.js - checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + checksum: 10/4cfa1eb91ef3751e20fc52e47a935a0118d56d6f15a837ab814da0c150778ba2ca4f1a4d9068b33070ea4273629e615066664c2cfcd7c272caf7a8a0f6518b2c languageName: node linkType: hard @@ -20049,7 +20031,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": version: 2.4.11 resolution: "sha.js@npm:2.4.11" dependencies: @@ -20246,12 +20228,12 @@ __metadata: linkType: hard "socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" + version: 2.8.4 + resolution: "socks@npm:2.8.4" dependencies: ip-address: "npm:^9.0.5" smart-buffer: "npm:^4.2.0" - checksum: 10/ffcb622c22481dfcd7589aae71fbfd71ca34334064d181df64bf8b7feaeee19706aba4cffd1de35cc7bbaeeaa0af96be2d7f40fcbc7bc0ab69533a7ae9ffc4fb + checksum: 10/ab3af97aeb162f32c80e176c717ccf16a11a6ebb4656a62b94c0f96495ea2a1f4a8206c04b54438558485d83d0c5f61920c07a1a5d3963892a589b40cc6107dd languageName: node linkType: hard @@ -20265,12 +20247,12 @@ __metadata: linkType: hard "sonner@npm:^1.5.0": - version: 1.7.2 - resolution: "sonner@npm:1.7.2" + version: 1.7.4 + resolution: "sonner@npm:1.7.4" peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc - checksum: 10/c17de412333bff0970a0b38375e034e2df974b1849c58ccb519ea7981aea7f8c0a4c9d8b8059c36a2d2ed9df1f4f571748e3d2037c90f13f0be8bb180eae20a0 + checksum: 10/454dfedb9e91276dda38455fced43d66d84875048d5bf5e223c4d95167ca6fefb4d868ecec1c3bf5c9e91896dc6407adbde92eabb37a97126af4fb0856f96e61 languageName: node linkType: hard @@ -20561,7 +20543,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1": +"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -20660,22 +20642,22 @@ __metadata: linkType: hard "styled-components@npm:>=5, styled-components@npm:^6.1.0": - version: 6.1.14 - resolution: "styled-components@npm:6.1.14" + version: 6.1.15 + resolution: "styled-components@npm:6.1.15" dependencies: "@emotion/is-prop-valid": "npm:1.2.2" "@emotion/unitless": "npm:0.8.1" "@types/stylis": "npm:4.2.5" css-to-react-native: "npm:3.2.0" csstype: "npm:3.1.3" - postcss: "npm:8.4.38" + postcss: "npm:8.4.49" shallowequal: "npm:1.1.0" stylis: "npm:4.3.2" tslib: "npm:2.6.2" peerDependencies: react: ">= 16.8.0" react-dom: ">= 16.8.0" - checksum: 10/de26960b8e2b8d9430e8a02a22a7fa1ae764d914064525008257fb5d469cbddb4ef9b8b5b5e4baaabd236bd77c84fdad9a8d5f0d2fd05ff39ff55d80a71ff9de + checksum: 10/54b70e40baa94b99e2a01945bd0589dabd356fb0a5a6d503372d5e920db27444564f4fb9a137423c0a65bd7c1a4e1024a44a6b2c7b162ae5daf2b042f9dc086d languageName: node linkType: hard @@ -20737,9 +20719,9 @@ __metadata: linkType: hard "stylis@npm:^4.3.0": - version: 4.3.5 - resolution: "stylis@npm:4.3.5" - checksum: 10/4f5901cf7f0cd2cd5a284127a638c267325cf2cfd2a00c86bdc7aa85e370fa4029168ad453d77b67023f80f7e42e13ad6bc6c355391ed8109979ff194f6c8009 + version: 4.3.6 + resolution: "stylis@npm:4.3.6" + checksum: 10/6ebe8a37827124e0caf0704c13d39c121f6e6a8433eb8c67cfce508477b24a4434d1731198ba0b6e453655022bbf5beda93585f38ff420545e5356f925f83761 languageName: node linkType: hard @@ -20883,7 +20865,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10": +"terser-webpack-plugin@npm:^5.3.11": version: 5.3.11 resolution: "terser-webpack-plugin@npm:5.3.11" dependencies: @@ -20906,8 +20888,8 @@ __metadata: linkType: hard "terser@npm:^5.31.1": - version: 5.37.0 - resolution: "terser@npm:5.37.0" + version: 5.39.0 + resolution: "terser@npm:5.39.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -20915,7 +20897,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/3afacf7c38c47a5a25dbe1ba2e7aafd61166474d4377ec0af490bd41ab3686ab12679818d5fe4a3e7f76efee26f639c92ac334940c378bbc31176520a38379c3 + checksum: 10/d84aff642398329f7179bbeaca28cac76a86100e2372d98d39d9b86c48023b6b9f797d983d6e7c0610b3f957c53d01ada1befa25d625614cb2ccd20714f1e98b languageName: node linkType: hard @@ -21163,8 +21145,8 @@ __metadata: linkType: hard "tsconfck@npm:^3.0.3": - version: 3.1.4 - resolution: "tsconfck@npm:3.1.4" + version: 3.1.5 + resolution: "tsconfck@npm:3.1.5" peerDependencies: typescript: ^5.0.0 peerDependenciesMeta: @@ -21172,7 +21154,7 @@ __metadata: optional: true bin: tsconfck: bin/tsconfck.js - checksum: 10/4fb02e75ff374a82052b4800970bebe4466b5a6e7193d74e7b875cc8225acb5037fb4e7dcd4a5cd751c22129360cb13b4d5536897eae131d69c1a20fb18a99b4 + checksum: 10/46b68f0fcec7da045490e427400c2a7fea67bdb6dae871257e8d2ec48e9dc99674214df86ff51c6d01ceb68ba9d7d806d3b69de432efa3c76b5fba160c252857 languageName: node linkType: hard @@ -21287,9 +21269,9 @@ __metadata: linkType: hard "type-fest@npm:^4.27.0": - version: 4.32.0 - resolution: "type-fest@npm:4.32.0" - checksum: 10/7cee33a2d82c992e97e85eca4016a7dd62239fc6f95a7f86d46671900cad594eda832d97a1d4231d3bb2ed7ff5144c5f3cf4644e1f722faa4e6decef0c5276ca + version: 4.35.0 + resolution: "type-fest@npm:4.35.0" + checksum: 10/43aada576d02f2f5230bd46c859e421a1307694312b3405088a48fcc67d65bee12eafbdcd182cffe0577dd72346595cb90a1ab5700626df35bc8935cf02c635b languageName: node linkType: hard @@ -21487,19 +21469,6 @@ __metadata: languageName: node linkType: hard -"unenv@npm:^1.10.0": - version: 1.10.0 - resolution: "unenv@npm:1.10.0" - dependencies: - consola: "npm:^3.2.3" - defu: "npm:^6.1.4" - mime: "npm:^3.0.0" - node-fetch-native: "npm:^1.6.4" - pathe: "npm:^1.1.2" - checksum: 10/23198e150fd3b4db4d7abe444b75ee05a0d36768bd6d94a6aaf5dca830db82e707ccc0f6cca22671327b62c5cd85ada08d4665bf7652afec9de0bdc7a4546249 - languageName: node - linkType: hard - "unique-filename@npm:^4.0.0": version: 4.0.0 resolution: "unique-filename@npm:4.0.0" @@ -21718,7 +21687,7 @@ __metadata: languageName: node linkType: hard -"use-sidecar@npm:^1.1.2": +"use-sidecar@npm:^1.1.2, use-sidecar@npm:^1.1.3": version: 1.1.3 resolution: "use-sidecar@npm:1.1.3" dependencies: @@ -22000,15 +21969,15 @@ __metadata: linkType: hard "vite-plugin-top-level-await@npm:^1.4.1": - version: 1.4.4 - resolution: "vite-plugin-top-level-await@npm:1.4.4" + version: 1.5.0 + resolution: "vite-plugin-top-level-await@npm:1.5.0" dependencies: "@rollup/plugin-virtual": "npm:^3.0.2" - "@swc/core": "npm:^1.7.0" + "@swc/core": "npm:^1.10.16" uuid: "npm:^10.0.0" peerDependencies: vite: ">=2.8" - checksum: 10/4615c42bc47d1c89d0212c38cf0b6bac4a684e441b84e167602666af531eea9b359ffff9fd66fe5da868d8ec96e98ef4083b489dbefee234e69d0ea1a8346651 + checksum: 10/d6875a20ba57d2f72616f41e35bf97477e1494a6185a21b054f0b08101347f78378b63d9866d46dca402d09c71cec7f4ef7584b6524bb178435ea627ea16da4d languageName: node linkType: hard @@ -22029,8 +21998,8 @@ __metadata: linkType: hard "vite@npm:^5.2.7": - version: 5.4.12 - resolution: "vite@npm:5.4.12" + version: 5.4.14 + resolution: "vite@npm:5.4.14" dependencies: esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" @@ -22067,7 +22036,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/16a2b486164717b51f8a22db750bba1d1d5be939e28d199a27a3c3f54cea484b3f2e8618eeafaec8b5075c011aa9aafd3e86b54411ba90555617190e626fe4ef + checksum: 10/ce382f4059eb6c939823b8f62163794752243755d84c71a4b73ad0f7d4d9f4c7a557a6ef4c78e0640f4bcf5ae5ec6b20c7ee4816419af3c81ba275f478b73468 languageName: node linkType: hard @@ -22431,8 +22400,8 @@ __metadata: linkType: hard "webpack@npm:^4.46.0 || ^5.0.0": - version: 5.97.1 - resolution: "webpack@npm:5.97.1" + version: 5.98.0 + resolution: "webpack@npm:5.98.0" dependencies: "@types/eslint-scope": "npm:^3.7.7" "@types/estree": "npm:^1.0.6" @@ -22452,9 +22421,9 @@ __metadata: loader-runner: "npm:^4.2.0" mime-types: "npm:^2.1.27" neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" + schema-utils: "npm:^4.3.0" tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" + terser-webpack-plugin: "npm:^5.3.11" watchpack: "npm:^2.4.1" webpack-sources: "npm:^3.2.3" peerDependenciesMeta: @@ -22462,7 +22431,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10/665bd3b8c84b20f0b1f250159865e4d3e9b76c682030313d49124d5f8e96357ccdcc799dd9fe0ebf010fdb33dbc59d9863d79676a308e868e360ac98f7c09987 + checksum: 10/eb16a58b3eb02bfb538c7716e28d7f601a03922e975c74007b41ba5926071ae70302d9acae9800fbd7ddd0c66a675b1069fc6ebb88123b87895a52882e2dc06a languageName: node linkType: hard