From 9c8c41db10efa675bb3172a6e686f605d1210e84 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Mon, 18 Nov 2024 10:33:49 +0100 Subject: [PATCH 01/43] add upgrade plan modal --- .../userPlanAndBillings/UpgradePlanModal.tsx | 89 ++++++++++ .../UserPlanAndBillings.tsx | 150 +++++++++++++++++ src/components/userSettings/UserSettings.tsx | 155 +++++++++++++++--- src/config/Themization.js | 6 + 4 files changed, 375 insertions(+), 25 deletions(-) create mode 100644 src/components/userPlanAndBillings/UpgradePlanModal.tsx create mode 100644 src/components/userPlanAndBillings/UserPlanAndBillings.tsx diff --git a/src/components/userPlanAndBillings/UpgradePlanModal.tsx b/src/components/userPlanAndBillings/UpgradePlanModal.tsx new file mode 100644 index 0000000000..f4827ee2d5 --- /dev/null +++ b/src/components/userPlanAndBillings/UpgradePlanModal.tsx @@ -0,0 +1,89 @@ +import { Box, Cross, Modal, Text } from 'blocks'; +import { ModalResponse } from 'common'; +import { FC } from 'react'; + +type UpgradePlanModalProps = { + modalControl: ModalResponse; +}; + +const UpgradePlanModal: FC = ({ modalControl }) => { + const { isOpen, onClose } = modalControl; + + const planFeatures = [ + { + text: 'Telegram delivery will reduce to 1,000 from 5,000', + }, + { + text: 'Email delivery will reduce to 1,000 from 5,000', + }, + { + text: 'Features will reset to Free plan', + }, + ]; + return ( + { + // handleAddSettings(formValues); + }, + }} + cancelButtonProps={{ + children: 'Cancel', + }} + > + + + We’re sorry to see you go + + + If you cancel you will be able to continue using Pro features until November 20, 2024. Once the billing term + ends: + + + + {planFeatures.map((item) => ( + + + + + {item.text} + + + ))} + + + + ); +}; + +export default UpgradePlanModal; diff --git a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx new file mode 100644 index 0000000000..7e543c7001 --- /dev/null +++ b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx @@ -0,0 +1,150 @@ +import { Box, Button, ProgressBar, Text } from 'blocks'; +import { useDisclosure } from 'common'; +import UpgradePlanModal from './UpgradePlanModal'; + +const UserPlanAndBillings = () => { + const modalControl = useDisclosure(); + + const itemNotifications = [ + { title: 'Email Notification Delivery', subtitle: '750 remaining' }, + { title: 'Telegram Notification Delivery', subtitle: '750 remaining' }, + { title: 'Discord Notification Delivery', subtitle: '750 remaining' }, + ]; + return ( + + + Take full control of your Push Notification plan, manage and stay up to date with your plan usage + + + + + + Pro Plan + + + $14.99/mo + + + + + + For individuals + + + billed yearly + + + + + + + modalControl.open()} + > + Cancel Plan + + + + + + + Plan Usage + + + Keep track of usage in your current cycle + + + + + {itemNotifications.map((item) => ( + + + {item.title} + + + + + + {item.subtitle} + + + ))} + + + {modalControl.isOpen && } + + ); +}; + +export default UserPlanAndBillings; diff --git a/src/components/userSettings/UserSettings.tsx b/src/components/userSettings/UserSettings.tsx index c65f4dba5a..92f5453127 100644 --- a/src/components/userSettings/UserSettings.tsx +++ b/src/components/userSettings/UserSettings.tsx @@ -12,11 +12,13 @@ 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'; // Internal Configs import { device } from 'config/Globals'; import ChannelListSettings from 'components/channel/ChannelListSettings'; import PushSnapSettings from 'components/PushSnap/PushSnapSettings'; +import UserPlanAndBillings from 'components/userPlanAndBillings/UserPlanAndBillings'; interface ChannelListItem { channel: string; @@ -97,11 +99,19 @@ function UserSettings() { value: 0, label: 'Notification Settings', title: 'Notification Settings', + section: 'top', }, { value: 1, label: 'Push Snap', title: '', + section: 'top', + }, + { + value: 2, + label: 'Plan & Billing', + title: 'Plan & Billing', + section: 'bottom', }, ]; @@ -111,26 +121,82 @@ function UserSettings() { Customize your Push profile or manage your notification preferences - {selectOptions.map((selectOptions) => ( - setSelectedOption(selectOptions.value)} - key={selectOptions.value} - isSelected={selectOptions.value === selectedOption} + {selectOptions + .filter((option) => option.section === 'top') + .map((option) => ( + setSelectedOption(option.value)} + key={option.value} + isSelected={option.value === selectedOption} + > + {option.label} + + ))} + + - {selectOptions.label} - - ))} + Developers + + + + {selectOptions + .filter((option) => option.section === 'bottom') + .map((option) => ( + setSelectedOption(option.value)} + key={option.value} + isSelected={option.value === selectedOption} + > + {option.label} + + ))} - - - {selectOptions[selectedOption]?.title && ( - {selectOptions[selectedOption]?.title} - )} - - {selectedOption === 0 && } - {selectedOption === 1 && } - - + + + {/* {successMessage && ( + + + + )} + + {errorMessage && ( + + + + )} */} + + {selectedOption === 2 && ( + console.log('idea')} + actionText="Upgrade Plan" + variant="info" + /> + )} + + + + {selectOptions[selectedOption]?.title && ( + + {selectOptions[selectedOption]?.title} + + )} + + {selectedOption === 0 && } + {selectedOption === 1 && } + {selectedOption === 2 && } + + + ); @@ -142,6 +208,8 @@ export default UserSettings; const Container = styled.div` padding: 32px 24px; flex: 1; + height: 100%; + overflow: hidden; @media ${device.tablet} { padding: 24px 12px; @@ -182,6 +250,10 @@ const Wrapper = styled.div` flex-direction: row; justify-content: space-between; + height: 100%; + flex: 1; + min-height: 0; + @media ${device.tablet} { flex-direction: column; } @@ -220,10 +292,9 @@ const SelectListOption = styled(Button)<{ isSelected: boolean }>` `; const ChannelWrapper = styled.div` - border: 1px solid ${(props) => props.theme.default.borderColor}; + border: 1px solid ${(props) => props.theme.userSettingsBorder}; padding: 12px; - border-radius: 16px; - flex-grow: 1; + border-radius: 24px; @media ${device.tablet} { margin: 8px 0px; @@ -231,9 +302,43 @@ const ChannelWrapper = styled.div` } `; -const ChannelContainer = styled.div` +const ChannelBlock = styled.div` overflow: hidden; - overflow-y: scroll; + 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; + right: 10px; + } + &::-webkit-scrollbar { + background-color: transparent; + width: 4px; + position: absolute; + right: 10px; + } + &::-webkit-scrollbar-thumb { + background-color: #d53a94; + border-radius: 99px; + width: 4px; + position: absolute; + right: 10px; + } + // Adding margin-bottom to the last child + & > *:last-child { + margin-bottom: 100px; + } +`; + +const ChannelContainer = styled.div<{ selectedOption: number }>` + overflow-y: auto; height: 55vh; padding: 12px; @@ -264,13 +369,13 @@ const ChannelContainer = styled.div` } `; -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/config/Themization.js b/src/config/Themization.js index 8a1933a90e..7194737191 100644 --- a/src/config/Themization.js +++ b/src/config/Themization.js @@ -311,6 +311,9 @@ const themeLight = { //Connect Wallet and Push user Flow Modal userSecText: '#8C93A0', disabledBtnColor: '#E5E5E5', + + //userSettings + userSettingsBorder: '#EAEBF2', }; const themeDark = { @@ -627,6 +630,9 @@ const themeDark = { //Connect Wallet and Push user Flow Modal userSecText: '#484D58', disabledBtnColor: '#484D58', + + //userSettings + userSettingsBorder: '#313338', }; export { themeDark, themeLight }; From fb2525f88a487df15a5751a2065acbd1c4b1991c Mon Sep 17 00:00:00 2001 From: Kushdeep Singh <63536883+meKushdeepSingh@users.noreply.github.com> Date: Thu, 5 Dec 2024 16:39:18 +0530 Subject: [PATCH 02/43] 1966 Other push monetization payment UI (Purchase a plan) (#1974) * DAPP-1966: Pricing plan UI integration WIP * DAPP-1966: Integrate Pricing Page UI - Finalizing Tabs Background and Spacing Variables - Completed the integration of the Pricing Page UI. - Tabs background and spacing variables are still under review; awaiting final decisions from the design team. * DAPP-1966: Integrate pricing UI - Updated tab background color & button semantics for active tab - Updated get started button background style - Added padding at the bottom of the benefit list in the Pricing Plan Box * DAPP-1966: Integrate Purchase Plan UI - Integrated UI for the Purchase Plan feature. * DAPP-1966: Integrate Purchase Plan Modal UI - Integrated UI for the purchase plan modals. - Adjusted spacing and layout on the pricing page for consistency. * DAPP-1966: Integrate Purchase Plan Alerts UI - Created a common alert component to display various types of alerts with dynamic content - Moved FAQ component to common components for reuse across multiple pages - Updated FAQ answer content and UI * DAPP-1966: PR review changes - Added illustrations for Push logo with name - Implemented conditional leading icon in approve button - Extracted FAQ container and list into separate components - Created a common file for FAQ answer components - Refactored code for improved readability and maintainability * DAPP-1966: Keep componentName props value as actual component name in illustration and removed unused imports --- src/App.tsx | 1 + src/blocks/icons/components/Meteor.tsx | 73 +++++ src/blocks/icons/index.ts | 2 + .../illustrations/components/PushLogo.tsx | 212 ++++++++++--- .../components/PushLogoWithNameDark.tsx | 296 ++++++++++++++++++ .../components/PushLogoWithNameLight.tsx | 296 ++++++++++++++++++ src/blocks/illustrations/index.ts | 4 + src/blocks/index.ts | 2 +- src/blocks/tabs/Tabs.styled.ts | 16 +- src/blocks/tabs/Tabs.tsx | 10 +- src/blocks/tag/Tag.tsx | 2 +- .../theme/semantics/semantics.button.ts | 2 +- src/blocks/theme/semantics/semantics.tag.ts | 6 + ...mmon.constants.ts => Common.constants.tsx} | 60 ++++ src/common/Common.types.ts | 15 + src/common/components/FAQAnswers.tsx | 272 ++++++++++++++++ src/common/components/FAQContainer.tsx | 140 +++++++++ src/common/components/PurchasePlanAlert.tsx | 25 ++ src/common/components/index.ts | 3 + src/config/AppPaths.ts | 1 + src/modules/createChannel/CreateChannel.tsx | 16 +- src/modules/pricing/Pricing.constants.ts | 136 ++++++++ src/modules/pricing/Pricing.tsx | 30 ++ src/modules/pricing/Pricing.types.ts | 15 + .../pricing/components/PricingPlanTabs.tsx | 36 +++ .../components/PricingPlansContainer.tsx | 50 +++ .../pricing/components/PricingPlansList.tsx | 154 +++++++++ .../pricing/components/PricingView.tsx | 73 +++++ src/modules/pricing/index.ts | 1 + src/modules/purchasePlan/PurchasePlan.tsx | 33 ++ .../purchasePlan/PusrchasePlan.types.tsx | 1 + .../components/ConfirmPurchaseModal.tsx | 69 ++++ .../components/PlanPurchasedModal.tsx | 102 ++++++ .../components/PurchaseSummery.tsx | 213 +++++++++++++ .../components/SelectedPlanView.tsx | 87 +++++ src/modules/purchasePlan/index.ts | 1 + src/pages/PricingPage.tsx | 13 + src/pages/PurchasePlanPage.tsx | 16 + src/structure/MasterInterfacePage.tsx | 10 + 39 files changed, 2438 insertions(+), 56 deletions(-) create mode 100644 src/blocks/icons/components/Meteor.tsx create mode 100644 src/blocks/illustrations/components/PushLogoWithNameDark.tsx create mode 100644 src/blocks/illustrations/components/PushLogoWithNameLight.tsx rename src/common/{Common.constants.ts => Common.constants.tsx} (82%) create mode 100644 src/common/components/FAQAnswers.tsx create mode 100644 src/common/components/FAQContainer.tsx create mode 100644 src/common/components/PurchasePlanAlert.tsx create mode 100644 src/modules/pricing/Pricing.constants.ts create mode 100644 src/modules/pricing/Pricing.tsx create mode 100644 src/modules/pricing/Pricing.types.ts create mode 100644 src/modules/pricing/components/PricingPlanTabs.tsx create mode 100644 src/modules/pricing/components/PricingPlansContainer.tsx create mode 100644 src/modules/pricing/components/PricingPlansList.tsx create mode 100644 src/modules/pricing/components/PricingView.tsx create mode 100644 src/modules/pricing/index.ts create mode 100644 src/modules/purchasePlan/PurchasePlan.tsx create mode 100644 src/modules/purchasePlan/PusrchasePlan.types.tsx create mode 100644 src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx create mode 100644 src/modules/purchasePlan/components/PlanPurchasedModal.tsx create mode 100644 src/modules/purchasePlan/components/PurchaseSummery.tsx create mode 100644 src/modules/purchasePlan/components/SelectedPlanView.tsx create mode 100644 src/modules/purchasePlan/index.ts create mode 100644 src/pages/PricingPage.tsx create mode 100644 src/pages/PurchasePlanPage.tsx 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/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 5d9470392a..e3562b51ad 100644 --- a/src/blocks/illustrations/index.ts +++ b/src/blocks/illustrations/index.ts @@ -109,6 +109,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/tabs/Tabs.styled.ts b/src/blocks/tabs/Tabs.styled.ts index cf9c0649fc..bf5b4ffbfa 100644 --- a/src/blocks/tabs/Tabs.styled.ts +++ b/src/blocks/tabs/Tabs.styled.ts @@ -1,15 +1,21 @@ import { Tabs as ReachTabs, TabList, Tab } from '@reach/tabs'; import { textVariants } from '../text'; -import styled from 'styled-components'; +import styled, { CSSProperties } from 'styled-components'; +import { ResponsiveProp } from 'blocks'; import { deviceMediaQ } from '../theme'; +export type TabListProps = { + /* Used to align tabs */ + alignSelf?: ResponsiveProp; +}; + export const StyledFillTabs = styled(ReachTabs)` display: flex; flex-direction: column; gap: var(--spacing-sm); `; -export const StyledFillTabList = styled(TabList)` +export const StyledFillTabList = styled(TabList)` overflow: auto hidden; display: flex; width: fit-content; @@ -17,9 +23,10 @@ export const StyledFillTabList = styled(TabList)` 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)` @@ -72,13 +79,14 @@ 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'}; `; export const StyledLineTab = styled(Tab)` 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,54 @@ export const channelCategoriesMap: Record = { '0x63381E4b8fE26cb1f55cc38e8369990594E017b1': 'Service', '0x80375eAD5561e19668eb1Dd2b6A44Fa14D5eB6BF': 'Service', }; + +export const purchasePlanAlertConfig: { [x: string]: (planName?: string) => PurchasePlanAlertObjType } = { + success: (planName) => ({ + description: `Purchase Successful. Push ${planName} Plan`, + actionText: 'View on Explorer', + variant: 'success', + }), + renewalReminder: (planName) => ({ + description: `Your Push ${planName} plan ends in 7 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..1dd0651322 --- /dev/null +++ b/src/common/components/FAQContainer.tsx @@ -0,0 +1,140 @@ +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..5ac9b3bb64 --- /dev/null +++ b/src/common/components/PurchasePlanAlert.tsx @@ -0,0 +1,25 @@ +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 }; + onAction?: () => void; +}; + +const PurchasePlanAlert: FC = ({ variant, onClose, purchasedPlan, onAction }) => { + const alert: PurchasePlanAlertObjType = purchasePlanAlertConfig[variant](purchasedPlan?.planName); + 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/config/AppPaths.ts b/src/config/AppPaths.ts index 6053968b7f..fd9fad8511 100644 --- a/src/config/AppPaths.ts +++ b/src/config/AppPaths.ts @@ -32,6 +32,7 @@ const APP_PATHS = { UserSettings: '/user/settings', ChannelSettings: '/channel/settings', ClaimGalxe: 'claim/galxe', + Pricing: '/pricing', }; export default APP_PATHS; diff --git a/src/modules/createChannel/CreateChannel.tsx b/src/modules/createChannel/CreateChannel.tsx index a23590fa94..3e7d536228 100644 --- a/src/modules/createChannel/CreateChannel.tsx +++ b/src/modules/createChannel/CreateChannel.tsx @@ -5,7 +5,7 @@ import { useNavigate } from 'react-router-dom'; import { Alert, Box } from 'blocks'; import { appConfig } from 'config'; import APP_PATHS from 'config/AppPaths'; -import { Stepper } from 'common'; +import { PurchasePlanAlert, Stepper } from 'common'; import { useAccount } from 'hooks'; import { CHANNEL_TYPE } from 'helpers/UtilityHelper'; import { IPFSupload } from 'helpers/IpfsHelper'; @@ -213,17 +213,25 @@ const CreateChannel = () => { return ( handleCreateNewChannel(values)}> + {/* Use this wrapper to display the Alert of purchased plan status */} + {/* + + */} + 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..b2474a925a --- /dev/null +++ b/src/modules/pricing/components/PricingPlanTabs.tsx @@ -0,0 +1,36 @@ +import { useState } from 'react'; + +import { 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[0].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..f83b9f44c5 --- /dev/null +++ b/src/modules/pricing/components/PricingPlansList.tsx @@ -0,0 +1,154 @@ +import { FC } from 'react'; +import { Box, Button, Link, Meteor, Tag, Text, Tick } from 'blocks'; +import { pricingPlanList } from '../Pricing.constants'; +import { PricingPlanTabsType } from '../Pricing.types'; +import { css } from 'styled-components'; + +export type PricingPlansListProps = { + type: PricingPlanTabsType; +}; + +const PricingPlansList: FC = () => { + return ( + + {pricingPlanList.map((planItem, planIndex) => ( + + + + + {planItem?.planName} + + {planItem?.isPopular && ( + } + label="Popular" + variant="brand" + size="medium" + /> + )} + + + {planItem?.planFor} + + + + + 0 + ? css` + margin: var(--spacing-none); + ` + : css` + margin: var(--spacing-none) var(--spacing-none) 20px var(--spacing-none); + ` + } + > + + {planItem?.currency}{' '} + {planItem?.price !== null ? (planItem?.price > 0 ? planItem?.price : 'Free') : 'Talk to us!'} + + + {planItem?.billingCriteria} + + + + 0 ? `/pricing/${planIndex}` : '#'}> + + + + + {/* Render the Plan benefit list */} + + {planItem?.planBenefits.map((benefit, benefitIndex) => ( + + + + {benefit?.limit && ( + + {benefit?.limit} + + )} + + {benefit?.benefitName} + + + + ))} + + + ))} + + ); +}; + +export { PricingPlansList }; diff --git a/src/modules/pricing/components/PricingView.tsx b/src/modules/pricing/components/PricingView.tsx new file mode 100644 index 0000000000..0c61b04516 --- /dev/null +++ b/src/modules/pricing/components/PricingView.tsx @@ -0,0 +1,73 @@ +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/purchasePlan/PurchasePlan.tsx b/src/modules/purchasePlan/PurchasePlan.tsx new file mode 100644 index 0000000000..17521c1479 --- /dev/null +++ b/src/modules/purchasePlan/PurchasePlan.tsx @@ -0,0 +1,33 @@ +import { FC } from 'react'; +import { Box } from 'blocks'; +import { SelectedPlanView } from './components/SelectedPlanView'; +import { PurchaseSummery } from './components/PurchaseSummery'; +import { pricingPlanList } from 'modules/pricing/Pricing.constants'; +import { toNumber } from 'lodash'; +import { css } from 'styled-components'; + +export type PurchasePlanProps = { + index: string; +}; + +const PurchasePlan: FC = ({ index }) => { + const selectedPlan = pricingPlanList[toNumber(index)]; + 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..50254506dc --- /dev/null +++ b/src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx @@ -0,0 +1,69 @@ +import { FC } from 'react'; +import { Box, Modal, Spinner, Text } from 'blocks'; +import { ModalResponse } from 'common'; + +export type ConfirmPurchaseModalProps = { + purchaseAmount: number; + modalControl: ModalResponse; + onClose: () => void; +}; + +const ConfirmPurchaseModal: FC = ({ purchaseAmount, modalControl, onClose }) => { + const { isOpen } = modalControl; + return ( + + + + + + Confirm purchase + + + + + Purchase Push Pro plan for {purchaseAmount} 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..236968304d --- /dev/null +++ b/src/modules/purchasePlan/components/PlanPurchasedModal.tsx @@ -0,0 +1,102 @@ +import { FC } from 'react'; +import { Box, Modal, PushLogo, PushLogoWithNameDark, PushLogoWithNameLight, Text, Tick } from 'blocks'; +import { PricingPlan } from 'modules/pricing/Pricing.types'; +import { useBlocksTheme } from 'blocks/Blocks.hooks'; +import { ModalResponse } from 'common'; + +export type PlanPurchasedModalProps = { + plan: PricingPlan; + modalControl: ModalResponse; + onClose: () => void; +}; + +const PlanPurchasedModal: FC = ({ plan, modalControl, onClose }) => { + const { mode } = useBlocksTheme(); + const { isOpen } = modalControl; + return ( + + + + {mode === 'light' ? : } + + Your {plan?.planName} plan is now active + + + + + You now have access to the following features: + + + {plan?.planBenefits.map((benefit, benefitIndex) => ( + + + + {benefit?.limit && ( + + {benefit?.limit} + + )} + + {benefit?.benefitName} + + + + ))} + + + + + ); +}; + +export { PlanPurchasedModal }; diff --git a/src/modules/purchasePlan/components/PurchaseSummery.tsx b/src/modules/purchasePlan/components/PurchaseSummery.tsx new file mode 100644 index 0000000000..a9776d61b3 --- /dev/null +++ b/src/modules/purchasePlan/components/PurchaseSummery.tsx @@ -0,0 +1,213 @@ +import { FC, useState } from 'react'; +import { Box, Button, ExternalLink, Link, TabItem, Tabs, Text, TextInput, Tick } from 'blocks'; +import { PricingPlan, PricingPlanTabsType } from 'modules/pricing/Pricing.types'; +import { ConfirmPurchaseModal } from './ConfirmPurchaseModal'; +import { PurchasePlanModalTypes } from '../PusrchasePlan.types'; +import { PlanPurchasedModal } from './PlanPurchasedModal'; +import { useDisclosure } from 'common'; + +export type PurchaseSummeryProps = { selectedPlan: PricingPlan }; +const PurchaseSummery: FC = ({ selectedPlan }) => { + const pricingPlanTabs: TabItem[] = [ + { + label: 'Yearly', + key: 'yearly', + children: null, + }, + { + label: 'Monthly', + key: 'monthly', + children: null, + }, + ]; + + const [selectedPricingPlanTab, setSelectedPricingPlanTab] = useState( + pricingPlanTabs[0].key as PricingPlanTabsType + ); + const [email, setEmail] = useState(''); + const [isApproved, setIsApproved] = useState(false); + const [modalType, setShowModalType] = useState(null); + const modalControl = useDisclosure(); + + const totalAmount = selectedPlan?.price ? selectedPlan?.price * (selectedPricingPlanTab === 'yearly' ? 12 : 1) : 0; + + const handleOnCloseModal = () => { + if (modalType === 'confirmPurchase') { + setShowModalType('planPurchased'); + } else { + modalControl.onClose(); + setShowModalType(null); + } + }; + + return ( + + {/* Render Plan Purchase confirmation modal */} + {modalType === 'confirmPurchase' && ( + + )} + {modalType === 'planPurchased' && ( + + )} + + + Summary + + Each wallet can purchase a limited allocation of Nodes. + + + + {/* Render Summary View */} + + + + Plan + + Push {selectedPlan?.planName} + + + + + Duration + setSelectedPricingPlanTab(activeKey as PricingPlanTabsType)} + alignTabs="center" + /> + + + + setEmail(e.target.value)} + label="Email Address" + /> + + {/* Render total pricing view */} + + + Total Price + {totalAmount} USDC + + Balance: 0 + + + + + + + Get more USDC + + + + + + + {/* Render bottom buttons */} + + + + + + + + + + + ); +}; + +export { PurchaseSummery }; diff --git a/src/modules/purchasePlan/components/SelectedPlanView.tsx b/src/modules/purchasePlan/components/SelectedPlanView.tsx new file mode 100644 index 0000000000..761ed6bb6a --- /dev/null +++ b/src/modules/purchasePlan/components/SelectedPlanView.tsx @@ -0,0 +1,87 @@ +import { FC } from 'react'; +import { Box, Link, Text, Tick } from 'blocks'; +import { PricingPlan } from 'modules/pricing/Pricing.types'; +import { css } from 'styled-components'; + +export type SelectedPlanViewProps = { selectedPlan: PricingPlan }; +const SelectedPlanView: FC = ({ selectedPlan }) => { + return ( + + Push {selectedPlan?.planName} + + change plan + + + + + {selectedPlan?.currency} {selectedPlan?.price} + + + {selectedPlan?.billingCriteria} + + + + {/* Render the Plan benefit list */} + + {selectedPlan?.planBenefits.map((benefit, benefitIndex) => ( + + + + {benefit?.limit && ( + + {benefit?.limit} + + )} + + {benefit?.benefitName} + + + + ))} + + + ); +}; + +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/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..d7f6390b6b --- /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 { index } = useParams(); + // RENDER + return ( + + + + ); +}; +export default PurchasePlanPage; diff --git a/src/structure/MasterInterfacePage.tsx b/src/structure/MasterInterfacePage.tsx index e6aba506f1..92330d45ea 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={} /> + } + /> + } + /> From d168bdf20aedfe338909645a2a720acbdf7037c7 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Fri, 6 Dec 2024 12:35:22 +0100 Subject: [PATCH 03/43] update cursor --- .../userPlanAndBillings/UserPlanAndBillings.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx index 7e543c7001..4542c7a661 100644 --- a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx +++ b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx @@ -1,5 +1,8 @@ -import { Box, Button, ProgressBar, Text } from 'blocks'; +import { css } from 'styled-components'; + import { useDisclosure } from 'common'; + +import { Box, Button, ProgressBar, Text } from 'blocks'; import UpgradePlanModal from './UpgradePlanModal'; const UserPlanAndBillings = () => { @@ -83,6 +86,9 @@ const UserPlanAndBillings = () => { modalControl.open()} > Cancel Plan From 0a46f2f5d5e7524364a0c68e3ddbe6661a622604 Mon Sep 17 00:00:00 2001 From: Rohit Malhotra Date: Tue, 12 Nov 2024 17:19:32 +0530 Subject: [PATCH 04/43] DAPP-1967-bonus-activity-container-position-fix (#1968) * DAPP-1967-bonus-activity-container-position-fix * DAPP-1967 added lozenge tags support in staking activities --- .../components/BonusActivitiesSection.tsx | 20 +++++++++---- .../RewardsActivitiesBottomSection.tsx | 5 ++-- .../StakePushActivitiesListItem.tsx | 29 +++++++++++++++++-- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/modules/rewards/components/BonusActivitiesSection.tsx b/src/modules/rewards/components/BonusActivitiesSection.tsx index 2f078e50f7..4f769fe4bd 100644 --- a/src/modules/rewards/components/BonusActivitiesSection.tsx +++ b/src/modules/rewards/components/BonusActivitiesSection.tsx @@ -18,7 +18,7 @@ import { useRewardsContext } from 'contexts/RewardsContext'; import { walletToCAIP10 } from 'helpers/w2w'; // components -import { Alert, Box, Text } from 'blocks'; +import { Alert, Box, Lozenge, Star, Text } from 'blocks'; import { BonusActivitiesItem } from './BonusActivitiesItem'; export type BonusActivitiesSectionProps = {}; @@ -69,12 +69,20 @@ const BonusActivities: FC = () => { flexDirection="column" gap="spacing-sm" > - - Bonus Activities - + + Bonus Activities + + }>NEW + {errorMessage && ( diff --git a/src/modules/rewards/components/RewardsActivitiesBottomSection.tsx b/src/modules/rewards/components/RewardsActivitiesBottomSection.tsx index 01dbfbdec1..84c3d1f750 100644 --- a/src/modules/rewards/components/RewardsActivitiesBottomSection.tsx +++ b/src/modules/rewards/components/RewardsActivitiesBottomSection.tsx @@ -28,8 +28,6 @@ const RewardsActivitiesBottomSection: FC = - - = display="flex" flexDirection="column" padding={{ ml: 'spacing-sm', initial: 'spacing-md' }} - margin="spacing-none spacing-none spacing-md spacing-none" > = subtitle="Visit [app.push.org/yield](https://app.push.org/yield) and stake tokens in the Fee Pool or LP Pool to activate multipliers." /> + + ); }; diff --git a/src/modules/rewards/components/StakePushActivitiesListItem.tsx b/src/modules/rewards/components/StakePushActivitiesListItem.tsx index 501bb0806d..0d071ddb36 100644 --- a/src/modules/rewards/components/StakePushActivitiesListItem.tsx +++ b/src/modules/rewards/components/StakePushActivitiesListItem.tsx @@ -6,7 +6,7 @@ import { Activity, StakeActivityResponse, UsersActivity } from 'queries'; import { useAccount } from 'hooks'; // components -import { Box, Button, Lock, Multiplier, RewardsBell, Skeleton, Text } from 'blocks'; +import { Box, Button, Lock, Lozenge, Multiplier, RewardsBell, Skeleton, Star, Text } from 'blocks'; import { RewardsActivityIcon } from './RewardsActivityIcon'; import { ActivityButton } from './ActivityButton'; @@ -93,7 +93,11 @@ const StakePushActivitiesListItem: FC = ({ gap={{ ml: 'spacing-sm', initial: 'spacing-xxxs' }} alignItems={{ ml: 'center' }} > - + = ({ > {activity?.activityTitle} + {activity?.tags?.map((tag) => ( + } + > + {tag} + + ))} - + = ({ > {activity?.activityTitle} + {activity?.tags?.map((tag) => ( + } + > + {tag} + + ))} {activity.points > 0 && ( From 3a61c202407756518da8a308c16e9dd590fd1f0b Mon Sep 17 00:00:00 2001 From: Kolade Date: Thu, 14 Nov 2024 10:04:07 +0100 Subject: [PATCH 05/43] Fix Daily Rewards Section (#1970) * update reset logic * update yarn.lock --- src/modules/rewards/hooks/useDailyRewards.tsx | 16 +- yarn.lock | 2348 ++++++++--------- 2 files changed, 1116 insertions(+), 1248 deletions(-) diff --git a/src/modules/rewards/hooks/useDailyRewards.tsx b/src/modules/rewards/hooks/useDailyRewards.tsx index 366642bdd1..61a21d5e17 100644 --- a/src/modules/rewards/hooks/useDailyRewards.tsx +++ b/src/modules/rewards/hooks/useDailyRewards.tsx @@ -96,8 +96,20 @@ const useDailyRewards = () => { } } - setActiveDay(newDay); - setActiveItem(newDayData); + // first day data after completing all 7 + const firstDayData = dailyRewardsActivities?.find( + (activity) => activity.activityType === `daily_check_in_7_days_day1` + ); + + // if active day is complete, reset to first day, if not use the next day + if (newDay <= 7) { + setActiveDay(newDay); + setActiveItem(newDayData); + } else { + setActiveDay(1); + setActiveItem(firstDayData); + } + setIsLoadingRewards(false); }, [sendRecentActivities]); diff --git a/yarn.lock b/yarn.lock index a59457cd38..9d90fc1436 100644 --- a/yarn.lock +++ b/yarn.lock @@ -98,284 +98,194 @@ __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.7": - version: 7.25.7 - resolution: "@babel/code-frame@npm:7.25.7" +"@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": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@babel/highlight": "npm:^7.25.7" - picocolors: "npm:^1.0.0" - checksum: 10/000fb8299fb35b6217d4f6c6580dcc1fa2f6c0f82d0a54b8a029966f633a8b19b490a7a906b56a94e9d8bee91c3bc44c74c44c33fb0abaa588202f6280186291 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" - dependencies: - "@babel/highlight": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" picocolors: "npm:^1.0.0" - checksum: 10/4812e94885ba7e3213d49583a155fdffb05292330f0a9b2c41b49288da70cf3c746a3fda0bf1074041a6d741c33f8d7be24be5e96f41ef77395eeddc5c9ff624 + checksum: 10/db2c2122af79d31ca916755331bb4bac96feb2b334cdaca5097a6b467fdd41963b89b14b6836a14f083de7ff887fc78fa1b3c10b14e743d33e12dbfe5ee3d223 languageName: node linkType: hard -"@babel/compat-data@npm:^7.25.2": - version: 7.25.4 - resolution: "@babel/compat-data@npm:7.25.4" - checksum: 10/d37a8936cc355a9ca3050102e03d179bdae26bd2e5c99a977637376c192b23637a039795f153c849437a086727628c9860e2c6af92d7151396e2362c09176337 +"@babel/compat-data@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/compat-data@npm:7.26.2" + checksum: 10/ed9eed6b62ce803ef4a320b1dac76b0302abbb29c49dddf96f3e3207d9717eb34e299a8651bb1582e9c3346ead74b6d595ffced5b3dae718afa08b18741f8402 languageName: node linkType: hard "@babel/core@npm:^7.21.3, @babel/core@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-module-transforms": "npm:^7.25.2" - "@babel/helpers": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.2" - "@babel/types": "npm:^7.25.2" + "@babel/code-frame": "npm:^7.26.0" + "@babel/generator": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@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" 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/0d6ec10ff430df66f654c089d6f7ef1d9bed0c318ac257ad5f0dfa0caa45666011828ae75f998bcdb279763e892b091b2925d0bc483299e61649d2c7a2245e33 + checksum: 10/65767bfdb1f02e80d3af4f138066670ef8fdd12293de85ef151758a901c191c797e86d2e99b11c4cdfca33c72385ecaf38bbd7fa692791ec44c77763496b9b93 languageName: node linkType: hard -"@babel/generator@npm:^7.24.5, @babel/generator@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/generator@npm:7.25.7" +"@babel/generator@npm:^7.24.5, @babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" dependencies: - "@babel/types": "npm:^7.25.7" + "@babel/parser": "npm:^7.26.2" + "@babel/types": "npm:^7.26.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" jsesc: "npm:^3.0.2" - checksum: 10/01542829621388077fa8a7464970c1db0f748f1482968dddf5332926afe4003f953cbe08e3bbbb0a335b11eba0126c9a81779bd1c5baed681a9ccec4ae63b217 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/generator@npm:7.25.6" - dependencies: - "@babel/types": "npm:^7.25.6" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10/541e4fbb6ea7806f44232d70f25bf09dee9a57fe43d559e375536870ca5261ebb4647fec3af40dcbb3325ea2a49aff040e12a4e6f88609eaa88f10c4e27e31f8 + checksum: 10/71ace82b5b07a554846a003624bfab93275ccf73cdb9f1a37a4c1094bf9dc94bb677c67e8b8c939dbd6c5f0eda2e8f268aa2b0d9c3b9511072565660e717e045 languageName: node linkType: hard "@babel/helper-annotate-as-pure@npm:^7.0.0, @babel/helper-annotate-as-pure@npm:^7.22.5": - version: 7.24.7 - resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" + version: 7.25.9 + resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10/a9017bfc1c4e9f2225b967fbf818004703de7cf29686468b54002ffe8d6b56e0808afa20d636819fcf3a34b89ba72f52c11bdf1d69f303928ee10d92752cad95 + "@babel/types": "npm:^7.25.9" + checksum: 10/41edda10df1ae106a9b4fe617bf7c6df77db992992afd46192534f5cff29f9e49a303231733782dd65c5f9409714a529f215325569f14282046e9d3b7a1ffb6c languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-compilation-targets@npm:7.25.2" +"@babel/helper-compilation-targets@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-compilation-targets@npm:7.25.9" dependencies: - "@babel/compat-data": "npm:^7.25.2" - "@babel/helper-validator-option": "npm:^7.24.8" - browserslist: "npm:^4.23.1" + "@babel/compat-data": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10/eccb2d75923d2d4d596f9ff64716e8664047c4192f1b44c7d5c07701d4a3498ac2587a72ddae1046e65a501bc630eb7df4557958b08ec2dcf5b4a264a052f111 + checksum: 10/8053fbfc21e8297ab55c8e7f9f119e4809fa7e505268691e1bedc2cf5e7a5a7de8c60ad13da2515378621b7601c42e101d2d679904da395fa3806a1edef6b92e languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.5": - version: 7.25.7 - resolution: "@babel/helper-module-imports@npm:7.25.7" +"@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.22.5, @babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/traverse": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10/94556712c27058ea35a1a39e21a3a9f067cd699405b64333d7d92b2b3d2f24d6f0ffa51aedba0b908e320acb1854e70d296259622e636fb021eeae9a6d996f01 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10/e090be5dee94dda6cd769972231b21ddfae988acd76b703a480ac0c96f3334557d70a965bf41245d6ee43891e7571a8b400ccf2b2be5803351375d0f4e5bcf08 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/df8bfb2bb18413aa151ecd63b7d5deb0eec102f924f9de6bc08022ced7ed8ca7fed914562d2f6fa5b59b74a5d6e255dc35612b2bc3b8abf361e13f61b3704770 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-module-transforms@npm:7.25.2" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.2" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/a3bcf7815f3e9d8b205e0af4a8d92603d685868e45d119b621357e274996bf916216bb95ab5c6a60fde3775b91941555bf129d608e3d025b04f8aac84589f300 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.24.7": - version: 7.24.8 - resolution: "@babel/helper-plugin-utils@npm:7.24.8" - checksum: 10/adbc9fc1142800a35a5eb0793296924ee8057fe35c61657774208670468a9fbfbb216f2d0bc46c680c5fefa785e5ff917cc1674b10bd75cdf9a6aa3444780630 - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-simple-access@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/5083e190186028e48fc358a192e4b93ab320bd016103caffcfda81302a13300ccce46c9cd255ae520c25d2a6a9b47671f93e5fe5678954a2329dc0a685465c49 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 10/6d1bf8f27dd725ce02bdc6dffca3c95fb9ab8a06adc2edbd9c1c9d68500274230d1a609025833ed81981eff560045b6b38f7b4c6fb1ab19fc90e5004e3932535 + checksum: 10/9841d2a62f61ad52b66a72d08264f23052d533afc4ce07aec2a6202adac0bfe43014c312f94feacb3291f4c5aafe681955610041ece2c276271adce3f570f2f5 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-string-parser@npm:7.25.7" - checksum: 10/2b8de9fa86c3f3090a349f1ce6e8ee2618a95355cbdafc6f228d82fa4808c84bf3d1d25290c6616d0a18b26b6cfeb6ec2aeebf01404bc8c60051d0094209f0e6 +"@babel/helper-plugin-utils@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 10/e347d87728b1ab10b6976d46403941c8f9008c045ea6d99997a7ffca7b852dc34b6171380f7b17edf94410e0857ff26f3a53d8618f11d73744db86e8ca9b8c64 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10/86875063f57361471b531dbc2ea10bbf5406e12b06d249b03827d361db4cad2388c6f00936bcd9dc86479f7e2c69ea21412c2228d4b3672588b754b70a449d4b +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-validator-identifier@npm:7.25.7" - checksum: 10/ec6934cc47fc35baaeb968414a372b064f14f7b130cf6489a014c9486b0fd2549b3c6c682cc1fc35080075e8e38d96aeb40342d63d09fc1a62510c8ce25cde1e +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-validator-option@npm:7.24.8" - checksum: 10/a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 10/9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d languageName: node linkType: hard -"@babel/helpers@npm:^7.25.0": - version: 7.25.6 - resolution: "@babel/helpers@npm:7.25.6" +"@babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" - checksum: 10/43abc8d017b754619aa189d05e2bdb54aaf44f03ec0439e89b3e7c180d538adb01ce9014a1689f632a7e8b17655c72bfac0a92268476eec708b41d3ba0a65296 + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + checksum: 10/fd4757f65d10b64cfdbf4b3adb7ea6ffff9497c53e0786452f495d1f7794da7e0898261b4db65e1c62bbb9a360d7d78a1085635c23dfc3af2ab6dcba06585f86 languageName: node linkType: hard -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" +"@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.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/69b73f38cdd4f881b09b939a711e76646da34f4834f4ce141d7a49a6bb1926eab1c594148970a8aa9360398dff800f63aade4e81fafdd7c8d8a8489ea93bfec1 - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/highlight@npm:7.25.7" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/823be2523d246dbf80aab3cc81c2a36c6111b16ac2949ef06789da54387824c2bfaa88c6627cdeb4ba7151d047a5d6765e49ebd0b478aba09759250111e65e08 - 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.7": - version: 7.25.7 - resolution: "@babel/parser@npm:7.25.7" - dependencies: - "@babel/types": "npm:^7.25.7" - bin: - parser: ./bin/babel-parser.js - checksum: 10/98eaa81bd378734a5f2790f02c7c076ecaba0839217445b4b84f45a7b391d640c34034253231a5bb2b2daf8204796f03584c3f94c10d46b004369bbb426a418f - languageName: node - linkType: hard - -"@babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" - dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/types": "npm:^7.26.0" bin: parser: ./bin/babel-parser.js - checksum: 10/830aab72116aa14eb8d61bfa8f9d69fc8f3a43d909ce993cb4350ae14d3af1a2f740a54410a22d821c48a253263643dfecbc094f9608e6a70ce9ff3c0bbfe91a + checksum: 10/8baee43752a3678ad9f9e360ec845065eeee806f1fdc8e0f348a8a0e13eef0959dabed4a197c978896c493ea205c804d0a1187cc52e4a1ba017c7935bab4983d languageName: node linkType: hard "@babel/plugin-syntax-jsx@npm:^7.22.5": - version: 7.24.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a93516ae5b34868ab892a95315027d4e5e38e8bd1cfca6158f2974b0901cbb32bbe64ea10ad5b25f919ddc40c6d8113c4823372909c9c9922170c12b0b1acecb + checksum: 10/bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563 languageName: node linkType: hard "@babel/plugin-transform-react-jsx-self@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.24.7" + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/56115b4a6c006ce82846f1ab21e5ba713ee8f57a166c96c94fc632cdfbc8b9cebbf20b7cd9b8076439dabecdbf0f8ca4c2cb1bed1bf0b15cb44505a429f6a92f + checksum: 10/41c833cd7f91b1432710f91b1325706e57979b2e8da44e83d86312c78bbe96cd9ef778b4e79e4e17ab25fa32c72b909f2be7f28e876779ede28e27506c41f4ae languageName: node linkType: hard "@babel/plugin-transform-react-jsx-source@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.24.7" + version: 7.25.9 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/682e2ae15d788453d8ab34cf0dcc29c093faf7c7cf1d60110c43f33e6477f916cf301456b314fc496fadc07123f7978225f41ac286ed0bfbad9c8e76392fdb6d + checksum: 10/a3e0e5672e344e9d01fb20b504fe29a84918eaa70cec512c4d4b1b035f72803261257343d8e93673365b72c371f35cf34bb0d129720bf178a4c87812c8b9c662 languageName: node linkType: hard "@babel/runtime-corejs3@npm:^7.10.2": - version: 7.25.6 - resolution: "@babel/runtime-corejs3@npm:7.25.6" + version: 7.26.0 + resolution: "@babel/runtime-corejs3@npm:7.26.0" dependencies: core-js-pure: "npm:^3.30.2" regenerator-runtime: "npm:^0.14.0" - checksum: 10/67e0a012c015cdb24b373a135d93c4d73c043b266d100bdcad8aa061794121d79b4a9ce3722f881ef44bc209c3665aa8b40f7e16e4bad6d344793d2517dd9ead + checksum: 10/fd813d8b5bfc412c083033638c937e13f621b3223161c4a20bb8532d77ae622b620915476bd265670f6a8fc1a76a017ffd738ad25ad24431953e3725247c6520 languageName: node linkType: hard @@ -389,85 +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.25.6 - resolution: "@babel/runtime@npm:7.25.6" + version: 7.26.0 + resolution: "@babel/runtime@npm:7.26.0" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/0c4134734deb20e1005ffb9165bf342e1074576621b246d8e5e41cc7cb315a885b7d98950fbf5c63619a2990a56ae82f444d35fe8c4691a0b70c2fe5673667dc - languageName: node - linkType: hard - -"@babel/template@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" - dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10/07ebecf6db8b28244b7397628e09c99e7a317b959b926d90455c7253c88df3677a5a32d1501d9749fe292a263ff51a4b6b5385bcabd5dadd3a48036f4d4949e0 - languageName: node - linkType: hard - -"@babel/template@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/template@npm:7.25.7" - dependencies: - "@babel/code-frame": "npm:^7.25.7" - "@babel/parser": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10/49e1e88d2eac17d31ae28d6cf13d6d29c1f49384c4f056a6751c065d6565c351e62c01ce6b11fef5edb5f3a77c87e114ea7326ca384fa618b4834e10cf9b20f3 + checksum: 10/9f4ea1c1d566c497c052d505587554e782e021e6ccd302c2ad7ae8291c8e16e3f19d4a7726fb64469e057779ea2081c28b7dbefec6d813a22f08a35712c0f699 languageName: node linkType: hard -"@babel/traverse@npm:^7.24.5, @babel/traverse@npm:^7.25.7, @babel/traverse@npm:^7.4.5": - version: 7.25.7 - resolution: "@babel/traverse@npm:7.25.7" +"@babel/template@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.25.7" - "@babel/generator": "npm:^7.25.7" - "@babel/parser": "npm:^7.25.7" - "@babel/template": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10/5b2d332fcd6bc78e6500c997e79f7e2a54dfb357e06f0908cb7f0cdd9bb54e7fd3c5673f45993849d433d01ea6076a6d04b825958f0cfa01288ad55ffa5c286f + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 10/e861180881507210150c1335ad94aff80fd9e9be6202e1efa752059c93224e2d5310186ddcdd4c0f0b0fc658ce48cb47823f15142b5c00c8456dde54f5de80b2 languageName: node linkType: hard -"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.2": - version: 7.25.6 - resolution: "@babel/traverse@npm:7.25.6" +"@babel/traverse@npm:^7.24.5, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.4.5": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.6" - "@babel/parser": "npm:^7.25.6" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 10/de75a918299bc27a44ec973e3f2fa8c7902bbd67bd5d39a0be656f3c1127f33ebc79c12696fbc8170a0b0e1072a966d4a2126578d7ea2e241b0aeb5d16edc738 + checksum: 10/7431614d76d4a053e429208db82f2846a415833f3d9eb2e11ef72eeb3c64dfd71f4a4d983de1a4a047b36165a1f5a64de8ca2a417534cc472005c740ffcb9c6a 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.7": - version: 7.25.7 - resolution: "@babel/types@npm:7.25.7" +"@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": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" dependencies: - "@babel/helper-string-parser": "npm:^7.25.7" - "@babel/helper-validator-identifier": "npm:^7.25.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10/4504e16a95b6a67d50cfaa389bcbc0621019084cff73784ad4797f82d1bb76c870cb0abb6d9881d5776eb06b4607419a2b1205a08c3e87b152d74bd0884b822a - languageName: node - linkType: hard - -"@babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" - dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10/7b54665e1b51f525fe0f451efdd9fe7a4a6dfba3fd4956c3530bc77336b66ffe3d78c093796ed044119b5d213176af7cf326f317a2057c538d575c6cefcb3562 + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/40780741ecec886ed9edae234b5eb4976968cc70d72b4e5a40d55f83ff2cc457de20f9b0f4fe9d858350e43dab0ea496e7ef62e2b2f08df699481a76df02cd6e languageName: node linkType: hard @@ -1409,20 +1281,20 @@ __metadata: linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/8d70bcdcd8cd279049183aca747d6c2ed7092a5cf0cf5916faac1ef37ffa74f0c245c2a3a3d3b9979d9dfdd4ca59257b4c5621db699d637b847a2c5e02f491c2 + checksum: 10/ae92a11412674329b4bd38422518601ec9ceae28e251104d1cad83715da9d38e321f68c817c39b64e66d0af7d98df6f9a10ad2dc638911254b47fb8932df00ef languageName: node linkType: hard "@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.11.1 - resolution: "@eslint-community/regexpp@npm:4.11.1" - checksum: 10/934b6d3588c7f16b18d41efec4fdb89616c440b7e3256b8cb92cfd31ae12908600f2b986d6c1e61a84cbc10256b1dd3448cd1eec79904bd67ac365d0f1aba2e2 + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc languageName: node linkType: hard @@ -2055,16 +1927,16 @@ __metadata: languageName: node linkType: hard -"@firebase/app-compat@npm:0.2.41": - version: 0.2.41 - resolution: "@firebase/app-compat@npm:0.2.41" +"@firebase/app-compat@npm:0.2.43": + version: 0.2.43 + resolution: "@firebase/app-compat@npm:0.2.43" dependencies: - "@firebase/app": "npm:0.10.11" + "@firebase/app": "npm:0.10.13" "@firebase/component": "npm:0.6.9" "@firebase/logger": "npm:0.4.2" "@firebase/util": "npm:1.10.0" tslib: "npm:^2.1.0" - checksum: 10/67e4b0572a3c24c4acc13e2c3b55a4fc778d286bae10f1df684a142c9790b4f131519fe84087341884bd67b04b822c3f7092b9748dfa3b52086b6f82ca8a1001 + checksum: 10/e27340dbc9804ffd0d469cc1fa919cd61b6e04fe96599d14414aa06c3dcbe75b23c324f0bedfff4dbd5d9b829b8dde5a2e8b5464f1f686d66f9c00971d9d4c56 languageName: node linkType: hard @@ -2075,16 +1947,16 @@ __metadata: languageName: node linkType: hard -"@firebase/app@npm:0.10.11": - version: 0.10.11 - resolution: "@firebase/app@npm:0.10.11" +"@firebase/app@npm:0.10.13": + version: 0.10.13 + resolution: "@firebase/app@npm:0.10.13" dependencies: "@firebase/component": "npm:0.6.9" "@firebase/logger": "npm:0.4.2" "@firebase/util": "npm:1.10.0" idb: "npm:7.1.1" tslib: "npm:^2.1.0" - checksum: 10/529d9e59b39e96cd97a8402e1cee508dbbb962aa1805345dc902ecbfe61709bb46ab3b821cd3b50b3d2e3e9f898515eb91cded030492e376550a97518cbcdb70 + checksum: 10/54ec64b3a992c2f30c800fb5638bf586e7e7f351899887c701d5f946ad8ca445d8c1d3024007b7939a7e6ae29a51d90567552a863323594dc6fca22f1e811e0b languageName: node linkType: hard @@ -2150,6 +2022,21 @@ __metadata: languageName: node linkType: hard +"@firebase/data-connect@npm:0.1.0": + version: 0.1.0 + resolution: "@firebase/data-connect@npm:0.1.0" + dependencies: + "@firebase/auth-interop-types": "npm:0.2.3" + "@firebase/component": "npm:0.6.9" + "@firebase/logger": "npm:0.4.2" + "@firebase/util": "npm:1.10.0" + tslib: "npm:^2.1.0" + peerDependencies: + "@firebase/app": 0.x + checksum: 10/20dac7c4755a0dde17abea0c99b41e96c9f7eea6ea39c36fd85f3f5554991b718a25b4bc1f92850208ec1f0e3b1ee584b1cf1913c4ad6c41643655682c06a2b0 + languageName: node + linkType: hard + "@firebase/database-compat@npm:1.0.8": version: 1.0.8 resolution: "@firebase/database-compat@npm:1.0.8" @@ -2189,18 +2076,18 @@ __metadata: languageName: node linkType: hard -"@firebase/firestore-compat@npm:0.3.37": - version: 0.3.37 - resolution: "@firebase/firestore-compat@npm:0.3.37" +"@firebase/firestore-compat@npm:0.3.38": + version: 0.3.38 + resolution: "@firebase/firestore-compat@npm:0.3.38" dependencies: "@firebase/component": "npm:0.6.9" - "@firebase/firestore": "npm:4.7.2" + "@firebase/firestore": "npm:4.7.3" "@firebase/firestore-types": "npm:3.0.2" "@firebase/util": "npm:1.10.0" tslib: "npm:^2.1.0" peerDependencies: "@firebase/app-compat": 0.x - checksum: 10/c152ba401f0d786699b25e1101d77351b7a6503f1a1f774efa7fecacc66aec58aca58a7b54e3f8587fcb45ffa3772d5e123ae79ddd90d0a87f2042ac34880d8a + checksum: 10/de9e92b5ac612ea73322407b65b1d90067f7138d2159bcfd2400535d09968ea8c8b44956282172129eca78bf951f74a6991394b2634913458927570bb4fa8cd8 languageName: node linkType: hard @@ -2214,9 +2101,9 @@ __metadata: languageName: node linkType: hard -"@firebase/firestore@npm:4.7.2": - version: 4.7.2 - resolution: "@firebase/firestore@npm:4.7.2" +"@firebase/firestore@npm:4.7.3": + version: 4.7.3 + resolution: "@firebase/firestore@npm:4.7.3" dependencies: "@firebase/component": "npm:0.6.9" "@firebase/logger": "npm:0.4.2" @@ -2228,7 +2115,7 @@ __metadata: undici: "npm:6.19.7" peerDependencies: "@firebase/app": 0.x - checksum: 10/066a125760bc2163bbc9c6fcde8b3f67da97791f8ce6f5ffa8ff3c40567aff97b2fe02020c3403857f104f051e4d6452aee60fe75ed5e408e467c611c397b4bb + checksum: 10/f46a6e3c03eadfa970d8ecc17627d0d696931a19092fcf5be4b2056a209da3691be0bd040a11d333d26c15fd14329ce0fb5dfc32bf2cfa530a4d035b45ef4edf languageName: node linkType: hard @@ -2318,17 +2205,17 @@ __metadata: languageName: node linkType: hard -"@firebase/messaging-compat@npm:0.2.11": - version: 0.2.11 - resolution: "@firebase/messaging-compat@npm:0.2.11" +"@firebase/messaging-compat@npm:0.2.12": + version: 0.2.12 + resolution: "@firebase/messaging-compat@npm:0.2.12" dependencies: "@firebase/component": "npm:0.6.9" - "@firebase/messaging": "npm:0.12.11" + "@firebase/messaging": "npm:0.12.12" "@firebase/util": "npm:1.10.0" tslib: "npm:^2.1.0" peerDependencies: "@firebase/app-compat": 0.x - checksum: 10/8ace6d65adcf891b272875b7b3f43978a15644b23f7ee796346f02eb50007c20c99719f4991772911005697613bf122167ca150d8245d0fccb2b959472b4a625 + checksum: 10/0437ba6b24327d9eb02dc87ba61146fbb9720491ad671dc554438ac87e162d5fb154c704400d55c87ce01dd5aeedada9d0367fd114d840ead0d07802475eaa60 languageName: node linkType: hard @@ -2339,9 +2226,9 @@ __metadata: languageName: node linkType: hard -"@firebase/messaging@npm:0.12.11": - version: 0.12.11 - resolution: "@firebase/messaging@npm:0.12.11" +"@firebase/messaging@npm:0.12.12": + version: 0.12.12 + resolution: "@firebase/messaging@npm:0.12.12" dependencies: "@firebase/component": "npm:0.6.9" "@firebase/installations": "npm:0.6.9" @@ -2351,7 +2238,7 @@ __metadata: tslib: "npm:^2.1.0" peerDependencies: "@firebase/app": 0.x - checksum: 10/1de21d56c74996e99151a902e0f1ff0825d47ebff044104483a838ff5cb4883433b2f541616b033255e4fd2780b29f71982d8832edf4987c101df97ed508828a + checksum: 10/a00125489085782faf189ad42f75bed108c6632b9d198d114e0a8ce28d89f9455b4f78ff8f7d24d4a86ad13e1e14e0f17fa2ff3605c6dd0c8ff1b65fef23ce3d languageName: node linkType: hard @@ -2522,12 +2409,12 @@ __metadata: linkType: hard "@floating-ui/dom@npm:^1.0.0": - version: 1.6.11 - resolution: "@floating-ui/dom@npm:1.6.11" + version: 1.6.12 + resolution: "@floating-ui/dom@npm:1.6.12" dependencies: "@floating-ui/core": "npm:^1.6.0" "@floating-ui/utils": "npm:^0.2.8" - checksum: 10/8579392ad10151474869e7640af169b0d7fc2df48d4da27b6dcb1a57202329147ed986b2972787d4b8cd550c87897271b2d9c4633c2ec7d0b3ad37ce1da636f1 + checksum: 10/5c8e5fdcd3843140a606ab6dc6c12ad740f44e66b898966ef877393faaede0bbe14586e1049e2c2f08856437da8847e884a2762e78275fefa65a5a9cd71e580d languageName: node linkType: hard @@ -2740,12 +2627,12 @@ __metadata: linkType: hard "@ipld/dag-cbor@npm:^9.0.1": - version: 9.2.1 - resolution: "@ipld/dag-cbor@npm:9.2.1" + version: 9.2.2 + resolution: "@ipld/dag-cbor@npm:9.2.2" dependencies: cborg: "npm:^4.0.0" multiformats: "npm:^13.1.0" - checksum: 10/83cf36909be31c67e5721eed3837f9a707831ee542a22297aa7a976b80921e74a0c850b8199c20e9a9b0e7e38fae1f0a501ce42da2132062b14a8d1d565cd178 + checksum: 10/71b464313f745e4c0b62fbfd2f257f526b87dba8e007246239b44d121ca82c453adf4f659d9036140dc0a485307727ce0a8749fbda0f648d950c9ccdf496bd97 languageName: node linkType: hard @@ -3093,9 +2980,9 @@ __metadata: linkType: hard "@livekit/components-styles@npm:^1.0.6": - version: 1.1.3 - resolution: "@livekit/components-styles@npm:1.1.3" - checksum: 10/dd1abddc470c26e41d13a49e0ca0a6c7557d622697a7d7954aea716c251209a5d0620d959eb93776ff41c1bc43b9afe4e473fc59179e42224a24129fdddbd548 + version: 1.1.4 + resolution: "@livekit/components-styles@npm:1.1.4" + checksum: 10/e5599a3a9b664879f5a85ba6e4f5955b01695ac12f2fa3f37eac9f0b9aeea4c539091814d8b513f94c7c79164dcdb398cd5a4e5a05d62af5b8075b0373fca6f4 languageName: node linkType: hard @@ -3537,14 +3424,14 @@ __metadata: linkType: hard "@mui/types@npm:^7.2.15": - version: 7.2.17 - resolution: "@mui/types@npm:7.2.17" + version: 7.2.19 + resolution: "@mui/types@npm:7.2.19" peerDependencies: "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: 10/de21ecd69e4fe22738f1437d7084747c07a1e88f6fbdea5a2927594c587aaf8cac7bd67118b8749a8c7a6f45875b937d4a20b43f531773cdfd870445a4237893 + checksum: 10/a23bc280c0722527ce5e264b0dcb44271441e4016eb2285acc1f0d236cf78c73ecc3ec7abba81876c2eadf45b905b55eb26e0e824ea6afc233efce2ef5a34f7d languageName: node linkType: hard @@ -3750,117 +3637,125 @@ __metadata: languageName: node linkType: hard -"@parcel/watcher-android-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-android-arm64@npm:2.4.1" +"@parcel/watcher-android-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-android-arm64@npm:2.5.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-darwin-arm64@npm:2.4.1" +"@parcel/watcher-darwin-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-darwin-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-darwin-x64@npm:2.4.1" +"@parcel/watcher-darwin-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-freebsd-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-freebsd-x64@npm:2.4.1" +"@parcel/watcher-freebsd-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@parcel/watcher-linux-arm-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm-glibc@npm:2.4.1" +"@parcel/watcher-linux-arm-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.4.1" +"@parcel/watcher-linux-arm-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-arm64-musl@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-arm64-musl@npm:2.4.1" +"@parcel/watcher-linux-arm64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@parcel/watcher-linux-x64-glibc@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-x64-glibc@npm:2.4.1" +"@parcel/watcher-linux-x64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@parcel/watcher-linux-x64-musl@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-linux-x64-musl@npm:2.4.1" +"@parcel/watcher-linux-x64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard "@parcel/watcher-wasm@npm:^2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-wasm@npm:2.4.1" + version: 2.5.0 + resolution: "@parcel/watcher-wasm@npm:2.5.0" dependencies: is-glob: "npm:^4.0.3" micromatch: "npm:^4.0.5" napi-wasm: "npm:^1.1.0" - checksum: 10/df32eec32ce1ac895c3ee2ae4574dd5f73f4c886820992e2e7c11e8bf4913d271484cb6c4863914129bd8a104e6924c767efa75bb19e17dde9a5c14408660cd2 + checksum: 10/2e17915320267b6d6305406a4b59cb0b0e88eb93ba6acc61c5382c517421a9132992fb8d1468a0030ee9945a1d6216ee6112452e78b30089590cd206c49d98a0 languageName: node linkType: hard -"@parcel/watcher-win32-arm64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-arm64@npm:2.4.1" +"@parcel/watcher-win32-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@parcel/watcher-win32-ia32@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-ia32@npm:2.4.1" +"@parcel/watcher-win32-ia32@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@parcel/watcher-win32-x64@npm:2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher-win32-x64@npm:2.4.1" +"@parcel/watcher-win32-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-x64@npm:2.5.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@parcel/watcher@npm:^2.4.1": - version: 2.4.1 - resolution: "@parcel/watcher@npm:2.4.1" - dependencies: - "@parcel/watcher-android-arm64": "npm:2.4.1" - "@parcel/watcher-darwin-arm64": "npm:2.4.1" - "@parcel/watcher-darwin-x64": "npm:2.4.1" - "@parcel/watcher-freebsd-x64": "npm:2.4.1" - "@parcel/watcher-linux-arm-glibc": "npm:2.4.1" - "@parcel/watcher-linux-arm64-glibc": "npm:2.4.1" - "@parcel/watcher-linux-arm64-musl": "npm:2.4.1" - "@parcel/watcher-linux-x64-glibc": "npm:2.4.1" - "@parcel/watcher-linux-x64-musl": "npm:2.4.1" - "@parcel/watcher-win32-arm64": "npm:2.4.1" - "@parcel/watcher-win32-ia32": "npm:2.4.1" - "@parcel/watcher-win32-x64": "npm:2.4.1" + version: 2.5.0 + resolution: "@parcel/watcher@npm:2.5.0" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-x64": "npm:2.5.0" + "@parcel/watcher-freebsd-x64": "npm:2.5.0" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm-musl": "npm:2.5.0" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-x64-musl": "npm:2.5.0" + "@parcel/watcher-win32-arm64": "npm:2.5.0" + "@parcel/watcher-win32-ia32": "npm:2.5.0" + "@parcel/watcher-win32-x64": "npm:2.5.0" detect-libc: "npm:^1.0.3" is-glob: "npm:^4.0.3" micromatch: "npm:^4.0.5" @@ -3877,6 +3772,8 @@ __metadata: optional: true "@parcel/watcher-linux-arm-glibc": optional: true + "@parcel/watcher-linux-arm-musl": + optional: true "@parcel/watcher-linux-arm64-glibc": optional: true "@parcel/watcher-linux-arm64-musl": @@ -3891,7 +3788,7 @@ __metadata: optional: true "@parcel/watcher-win32-x64": optional: true - checksum: 10/c163dff1828fa249c00f24931332dea5a8f2fcd1bfdd0e304ccdf7619c58bff044526fa39241fd2121d2a2141f71775ce3117450d78c4df3070d152282017644 + checksum: 10/1e28b1aa9a63456ebfa7af3e41297d088bd31d9e32548604f4f26ed96c5808f4330cd515062e879c24a9eaab7894066c8a3951ee30b59e7cbe6786ab2c790dae languageName: node linkType: hard @@ -4309,24 +4206,37 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-dialog@npm:^1.0.4, @radix-ui/react-dialog@npm:^1.1.1": +"@radix-ui/react-context@npm:1.1.1": version: 1.1.1 - resolution: "@radix-ui/react-dialog@npm:1.1.1" + resolution: "@radix-ui/react-context@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/f6469583bf11cc7bff3ea5c95c56b0774a959512adead00dc64b0527cca01b90b476ca39a64edfd7e18e428e17940aa0339116b1ce5b6e8eab513cfd1065d391 + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:^1.0.4, @radix-ui/react-dialog@npm:^1.1.1": + version: 1.1.2 + resolution: "@radix-ui/react-dialog@npm:1.1.2" dependencies: "@radix-ui/primitive": "npm:1.1.0" "@radix-ui/react-compose-refs": "npm:1.1.0" - "@radix-ui/react-context": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.0" - "@radix-ui/react-focus-guards": "npm:1.1.0" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-dismissable-layer": "npm:1.1.1" + "@radix-ui/react-focus-guards": "npm:1.1.1" "@radix-ui/react-focus-scope": "npm:1.1.0" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-portal": "npm:1.1.1" - "@radix-ui/react-presence": "npm:1.1.0" + "@radix-ui/react-portal": "npm:1.1.2" + "@radix-ui/react-presence": "npm:1.1.1" "@radix-ui/react-primitive": "npm:2.0.0" "@radix-ui/react-slot": "npm:1.1.0" "@radix-ui/react-use-controllable-state": "npm:1.1.0" aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:2.5.7" + react-remove-scroll: "npm:2.6.0" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4337,7 +4247,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/8c4b4af680e306db4fe113e9e19eb173f633b40b267030906167f6f62adfaa02aa2cb8ee97775ad0c701242a5ef6d0ce3528e1b13e640cbc6ea356eb27836189 + checksum: 10/9ed653e8e29443331d8dda8174f3c47194104e8b6e7bdd8f56998860fd8bf5e5a8867863bc93b089f8f7e37964375341eec2965e2f35ec26ee2cf2dd175bb503 languageName: node linkType: hard @@ -4393,9 +4303,9 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-dismissable-layer@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-dismissable-layer@npm:1.1.0" +"@radix-ui/react-dismissable-layer@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.1" dependencies: "@radix-ui/primitive": "npm:1.1.0" "@radix-ui/react-compose-refs": "npm:1.1.0" @@ -4412,19 +4322,19 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/08baf3441f811ce88649fa90cf8031f496f81a404cda75fa2a7b42020e3368f8f2a96911a4a1f7065cfa3fb2c091156c009d9255f81feeaf2f7ffadcfd12caf1 + checksum: 10/4f2346846f15f3482b8b6cd850448838d01520366deef840d8e80f5a3443aa7f21f86bd5b9a26f2709dcf94f1ec3f2bdfe80d5c37cba504c41e487c7ff8af3de languageName: node linkType: hard "@radix-ui/react-dropdown-menu@npm:^2.1.1": - version: 2.1.1 - resolution: "@radix-ui/react-dropdown-menu@npm:2.1.1" + version: 2.1.2 + resolution: "@radix-ui/react-dropdown-menu@npm:2.1.2" dependencies: "@radix-ui/primitive": "npm:1.1.0" "@radix-ui/react-compose-refs": "npm:1.1.0" - "@radix-ui/react-context": "npm:1.1.0" + "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-id": "npm:1.1.0" - "@radix-ui/react-menu": "npm:2.1.1" + "@radix-ui/react-menu": "npm:2.1.2" "@radix-ui/react-primitive": "npm:2.0.0" "@radix-ui/react-use-controllable-state": "npm:1.1.0" peerDependencies: @@ -4437,7 +4347,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/61f671711cb49f102fc1fc4999968273009f8373b3d11ab0ae1bcf72554c06a297910b044df868b5ec90d55de4e3181a2c8c9e67bbc630add8a7dcd7f6d2b543 + checksum: 10/09c7a1807475432a7adeb57b245e1e512098ce96392111d75e38fa4be71fe8f9b35818f1d2fc3f4246651247818f95e9a435e68e6fd2cd522620a292e2e74d55 languageName: node linkType: hard @@ -4456,16 +4366,16 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-focus-guards@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-focus-guards@npm:1.1.0" +"@radix-ui/react-focus-guards@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-focus-guards@npm:1.1.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10/199717e7da1ba9b3fa74b04f6a245aaebf6bdb8ae7d6f4b5f21f95f4086414a3587beebc77399a99be7d3a4b2499eaa52bf72bef660f8e69856b0fd0593b074f + checksum: 10/ac8dd31f48fa0500bafd9368f2f06c5a06918dccefa89fa5dc77ca218dc931a094a81ca57f6b181138029822f7acdd5280dceccf5ba4d9263c754fb8f7961879 languageName: node linkType: hard @@ -4543,28 +4453,28 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-menu@npm:2.1.1": - version: 2.1.1 - resolution: "@radix-ui/react-menu@npm:2.1.1" +"@radix-ui/react-menu@npm:2.1.2": + version: 2.1.2 + resolution: "@radix-ui/react-menu@npm:2.1.2" dependencies: "@radix-ui/primitive": "npm:1.1.0" "@radix-ui/react-collection": "npm:1.1.0" "@radix-ui/react-compose-refs": "npm:1.1.0" - "@radix-ui/react-context": "npm:1.1.0" + "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-direction": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.0" - "@radix-ui/react-focus-guards": "npm:1.1.0" + "@radix-ui/react-dismissable-layer": "npm:1.1.1" + "@radix-ui/react-focus-guards": "npm:1.1.1" "@radix-ui/react-focus-scope": "npm:1.1.0" "@radix-ui/react-id": "npm:1.1.0" "@radix-ui/react-popper": "npm:1.2.0" - "@radix-ui/react-portal": "npm:1.1.1" - "@radix-ui/react-presence": "npm:1.1.0" + "@radix-ui/react-portal": "npm:1.1.2" + "@radix-ui/react-presence": "npm:1.1.1" "@radix-ui/react-primitive": "npm:2.0.0" "@radix-ui/react-roving-focus": "npm:1.1.0" "@radix-ui/react-slot": "npm:1.1.0" "@radix-ui/react-use-callback-ref": "npm:1.1.0" aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:2.5.7" + react-remove-scroll: "npm:2.6.0" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4575,29 +4485,29 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/4d523b89a91c0355337cbaafbb0eb4645daa67f6fcef00dbe499a448079ab51e01011a87474f048a54aefbe28829d61f387e67ce30e2ce0aba26734a23c62f1c + checksum: 10/62d17d75fac27f86a1eb450ee6cb627f4f21854b7568f0bc4210b2b127d15d33444939be9af893fdc5db1d82fdfbde45e29f9e783155efa4c9af30def68777a2 languageName: node linkType: hard "@radix-ui/react-popover@npm:^1.0.6": - version: 1.1.1 - resolution: "@radix-ui/react-popover@npm:1.1.1" + version: 1.1.2 + resolution: "@radix-ui/react-popover@npm:1.1.2" dependencies: "@radix-ui/primitive": "npm:1.1.0" "@radix-ui/react-compose-refs": "npm:1.1.0" - "@radix-ui/react-context": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.0" - "@radix-ui/react-focus-guards": "npm:1.1.0" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-dismissable-layer": "npm:1.1.1" + "@radix-ui/react-focus-guards": "npm:1.1.1" "@radix-ui/react-focus-scope": "npm:1.1.0" "@radix-ui/react-id": "npm:1.1.0" "@radix-ui/react-popper": "npm:1.2.0" - "@radix-ui/react-portal": "npm:1.1.1" - "@radix-ui/react-presence": "npm:1.1.0" + "@radix-ui/react-portal": "npm:1.1.2" + "@radix-ui/react-presence": "npm:1.1.1" "@radix-ui/react-primitive": "npm:2.0.0" "@radix-ui/react-slot": "npm:1.1.0" "@radix-ui/react-use-controllable-state": "npm:1.1.0" aria-hidden: "npm:^1.1.1" - react-remove-scroll: "npm:2.5.7" + react-remove-scroll: "npm:2.6.0" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -4608,7 +4518,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/977173c0c6cb0d806c1a94197c7f92447004ade8c0aba5f238acb53ccaf0d330af54f8dbd3b334b497847df28c1ef0215b1103ae6bfccba10bbaf21f4ac59fac + checksum: 10/e8390e144516a016ade2a2a8fdf6b3c2f281d67cdbbcc46478d63366498c4af6946bafef8ecc496d37350d287e05adacc22da5e286298843ac49c285ce69bfdd languageName: node linkType: hard @@ -4689,9 +4599,9 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-portal@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-portal@npm:1.1.1" +"@radix-ui/react-portal@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-portal@npm:1.1.2" dependencies: "@radix-ui/react-primitive": "npm:2.0.0" "@radix-ui/react-use-layout-effect": "npm:1.1.0" @@ -4705,13 +4615,13 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/84dab64ce9c9f4ed7d75df6d1d82877dc7976a98cc192287d39ba2ea512415ed7bf34caf02d579a18fe21766403fa9ae41d2482a14dee5514179ee1b09cc333c + checksum: 10/2f737dc0445f02f512f814ba140227e1a049b3d215d79e22ead412c9befe830292c48a559a8ad1514a474ae8f0c4c43954dfbe294b93a0279d8747d08f7b7924 languageName: node linkType: hard -"@radix-ui/react-presence@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-presence@npm:1.1.0" +"@radix-ui/react-presence@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-presence@npm:1.1.1" dependencies: "@radix-ui/react-compose-refs": "npm:1.1.0" "@radix-ui/react-use-layout-effect": "npm:1.1.0" @@ -4725,7 +4635,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/e3ce746560e1551c9c480f0ef1f085763faf7094ac9600ca15d8bacb1bf5c70e59effe889bd2116b56c798f69f8d2bfa32d14defd30b9381fb2dcc555367f11c + checksum: 10/1ae074efae47ab52a63239a5936fddb334b2f66ed91e74bfe8b1ae591e5db01fa7e9ddb1412002cc043066d40478ba05187a27eb2684dcd68dea545993f9ee20 languageName: node linkType: hard @@ -4867,12 +4777,12 @@ __metadata: linkType: hard "@radix-ui/react-switch@npm:^1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-switch@npm:1.1.0" + version: 1.1.1 + resolution: "@radix-ui/react-switch@npm:1.1.1" dependencies: "@radix-ui/primitive": "npm:1.1.0" "@radix-ui/react-compose-refs": "npm:1.1.0" - "@radix-ui/react-context": "npm:1.1.0" + "@radix-ui/react-context": "npm:1.1.1" "@radix-ui/react-primitive": "npm:2.0.0" "@radix-ui/react-use-controllable-state": "npm:1.1.0" "@radix-ui/react-use-previous": "npm:1.1.0" @@ -4887,22 +4797,22 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/847930e2a25699015e83f07ffb5065c2e925ffcf84b2ef2222e63e7862a9753e09ea8cd64504d20cbb689060ece1ad2e3b8a4c04702bc8040c5fda7d13ef71ae + checksum: 10/7dd7369b3563818088bd28f0c683e8b44c6834119ed42084fd55b685708f222f7b063082924600c11aa48f8187240e169c84a6e173874bb81b6fa4d112df0416 languageName: node linkType: hard "@radix-ui/react-tooltip@npm:^1.1.1": - version: 1.1.2 - resolution: "@radix-ui/react-tooltip@npm:1.1.2" + version: 1.1.4 + resolution: "@radix-ui/react-tooltip@npm:1.1.4" dependencies: "@radix-ui/primitive": "npm:1.1.0" "@radix-ui/react-compose-refs": "npm:1.1.0" - "@radix-ui/react-context": "npm:1.1.0" - "@radix-ui/react-dismissable-layer": "npm:1.1.0" + "@radix-ui/react-context": "npm:1.1.1" + "@radix-ui/react-dismissable-layer": "npm:1.1.1" "@radix-ui/react-id": "npm:1.1.0" "@radix-ui/react-popper": "npm:1.2.0" - "@radix-ui/react-portal": "npm:1.1.1" - "@radix-ui/react-presence": "npm:1.1.0" + "@radix-ui/react-portal": "npm:1.1.2" + "@radix-ui/react-presence": "npm:1.1.1" "@radix-ui/react-primitive": "npm:2.0.0" "@radix-ui/react-slot": "npm:1.1.0" "@radix-ui/react-use-controllable-state": "npm:1.1.0" @@ -4917,7 +4827,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/d8386260d2710720b3d87fdacc04597935e5f6eb1d0375516dd362c2f00bf07ea1fceb4c4bda76ec332ebbcf6a4b88f04050add1a9a4db0f13a5ac12b1190355 + checksum: 10/de595811329ce789e770fd3c361c6b6e7dde3f0faa4b31d8cf72adb59036734d8389c3116756cd127dd1e7674ae1df5fa2365cf201f76413f26b24662299bde4 languageName: node linkType: hard @@ -5316,18 +5226,6 @@ __metadata: languageName: node linkType: hard -"@react-spring/animated@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/animated@npm:9.7.4" - dependencies: - "@react-spring/shared": "npm:~9.7.4" - "@react-spring/types": "npm:~9.7.4" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10/b7f5f598686bd16765c78c1fc3d2b421d1a79cf6fa65b04b8bb0913630634c135e0d617915dcc8834a0874b63d24f3bc640d1a14741e9b1ed2825456978afd2f - languageName: node - linkType: hard - "@react-spring/animated@npm:~9.7.5": version: 9.7.5 resolution: "@react-spring/animated@npm:9.7.5" @@ -5340,7 +5238,7 @@ __metadata: languageName: node linkType: hard -"@react-spring/core@npm:~9.7.4": +"@react-spring/core@npm:~9.7.4, @react-spring/core@npm:~9.7.5": version: 9.7.5 resolution: "@react-spring/core@npm:9.7.5" dependencies: @@ -5354,40 +5252,33 @@ __metadata: linkType: hard "@react-spring/konva@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/konva@npm:9.7.4" + version: 9.7.5 + resolution: "@react-spring/konva@npm:9.7.5" dependencies: - "@react-spring/animated": "npm:~9.7.4" - "@react-spring/core": "npm:~9.7.4" - "@react-spring/shared": "npm:~9.7.4" - "@react-spring/types": "npm:~9.7.4" + "@react-spring/animated": "npm:~9.7.5" + "@react-spring/core": "npm:~9.7.5" + "@react-spring/shared": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" peerDependencies: konva: ">=2.6" react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-konva: ^16.8.0 || ^16.8.7-0 || ^16.9.0-0 || ^16.10.1-0 || ^16.12.0-0 || ^16.13.0-0 || ^17.0.0-0 || ^17.0.1-0 || ^17.0.2-0 || ^18.0.0-0 - checksum: 10/92c01dd7287aab01228cc01756ef89024052a35d4c8b310211451f4d1bc8f6d0308b0ea6b9aa5fe89603c98b81f26d60c0e60adf097e355a235fe707e391813f + checksum: 10/0460f107b08d0f71e71dee27ff11ad0fac8ce8b3faad00b63c0711ab1e07d8b693aca59f1c965d541f3c55dc3115c9896ad429097818f26613eeb1f801b9fe70 languageName: node linkType: hard "@react-spring/native@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/native@npm:9.7.4" + version: 9.7.5 + resolution: "@react-spring/native@npm:9.7.5" dependencies: - "@react-spring/animated": "npm:~9.7.4" - "@react-spring/core": "npm:~9.7.4" - "@react-spring/shared": "npm:~9.7.4" - "@react-spring/types": "npm:~9.7.4" + "@react-spring/animated": "npm:~9.7.5" + "@react-spring/core": "npm:~9.7.5" + "@react-spring/shared": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" peerDependencies: react: 16.8.0 || >=17.0.0 || >=18.0.0 react-native: ">=0.58" - checksum: 10/a1bc63a127dc07ace266e03fb6a5acac806c4744a88e8f7a325e5b6f7cbb21bc0a92e5d2e5a11d8fce9a1a28c39c9a1421cdae603b10c2ce6cae6691e7c9d4ee - languageName: node - linkType: hard - -"@react-spring/rafz@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/rafz@npm:9.7.4" - checksum: 10/57a36e6d6bb4743214de70c8a36924e0753bd48a4c320a9cd47d4fb5f7591e88e3ac4ad635e38c9733a449fe97e51aa88fb1acbe39b5b931a06c8c448fa30930 + checksum: 10/894c25fb332c14c3e70520b0679b372853c4e7d307c3e96fdc24ecf9869a47e60c1fb7a508b29dfc53e6002e6ba690a24370caecbc0aab503e65f32cb07df8d0 languageName: node linkType: hard @@ -5398,18 +5289,6 @@ __metadata: languageName: node linkType: hard -"@react-spring/shared@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/shared@npm:9.7.4" - dependencies: - "@react-spring/rafz": "npm:~9.7.4" - "@react-spring/types": "npm:~9.7.4" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10/c011371e8437905234e27c0811f06064021ed8f59424018835c507dec07ff22c770ab2674302743e30542ad4d8788fa1b81b9b40e094fc3ccd434323e6140907 - languageName: node - linkType: hard - "@react-spring/shared@npm:~9.7.5": version: 9.7.5 resolution: "@react-spring/shared@npm:9.7.5" @@ -5423,25 +5302,18 @@ __metadata: linkType: hard "@react-spring/three@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/three@npm:9.7.4" + version: 9.7.5 + resolution: "@react-spring/three@npm:9.7.5" dependencies: - "@react-spring/animated": "npm:~9.7.4" - "@react-spring/core": "npm:~9.7.4" - "@react-spring/shared": "npm:~9.7.4" - "@react-spring/types": "npm:~9.7.4" + "@react-spring/animated": "npm:~9.7.5" + "@react-spring/core": "npm:~9.7.5" + "@react-spring/shared": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" peerDependencies: "@react-three/fiber": ">=6.0" react: ^16.8.0 || ^17.0.0 || ^18.0.0 three: ">=0.126" - checksum: 10/56b7ecf70ea799b8e069df2bea86b809b2f8e613f4f4aa35c2f02f0da8aba5f62332573d71cac5e63a4ca57a643237aa12dabd2af54df2c27cbd0a82bfea538f - languageName: node - linkType: hard - -"@react-spring/types@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/types@npm:9.7.4" - checksum: 10/25a9a6816a3e0ab4e06f2ac66b68bfd9e2bf844c6ea30133711be85c11693a4e2b74f0ce3c60356848d9096530a748cbe84e556fa342b92ce320f4d8a21e208c + checksum: 10/0ae7bfcc438fa308b83cf6213fb34ef5eb8fbec3868190dd5eb27dde67810d4060dd944559f936e36b1efbdd84f03ffa0235dab8e0979a03e3e5f1bef7f70921 languageName: node linkType: hard @@ -5453,34 +5325,34 @@ __metadata: linkType: hard "@react-spring/web@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/web@npm:9.7.4" + version: 9.7.5 + resolution: "@react-spring/web@npm:9.7.5" dependencies: - "@react-spring/animated": "npm:~9.7.4" - "@react-spring/core": "npm:~9.7.4" - "@react-spring/shared": "npm:~9.7.4" - "@react-spring/types": "npm:~9.7.4" + "@react-spring/animated": "npm:~9.7.5" + "@react-spring/core": "npm:~9.7.5" + "@react-spring/shared": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10/1813c87d92b8d8500cf5e302d2b051aaaa79f25438f79ba4cd8d2ddb17c1667566c88fbff05a5d589f16d0ba74660de1b684de4c6402fdd2f679edace6c7050c + checksum: 10/ecd6c410d0277649c6a6dc19156a06cc7beb92ac79eb798ee18d30ca9bdf92ccf63ad7794b384471059f03d3dc8c612b26ca6aec42769d01e2a43d07919fd02b languageName: node linkType: hard "@react-spring/zdog@npm:~9.7.4": - version: 9.7.4 - resolution: "@react-spring/zdog@npm:9.7.4" + version: 9.7.5 + resolution: "@react-spring/zdog@npm:9.7.5" dependencies: - "@react-spring/animated": "npm:~9.7.4" - "@react-spring/core": "npm:~9.7.4" - "@react-spring/shared": "npm:~9.7.4" - "@react-spring/types": "npm:~9.7.4" + "@react-spring/animated": "npm:~9.7.5" + "@react-spring/core": "npm:~9.7.5" + "@react-spring/shared": "npm:~9.7.5" + "@react-spring/types": "npm:~9.7.5" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 react-zdog: ">=1.0" zdog: ">=1.0" - checksum: 10/99397263f1b5cf7fba0a5da25e344c2b115f2fe17afb4874af42ee22b8c1a6d6d64ae8c4fa5152378916c01c16df40252c317c71b157ac8aa84f6b9694644e53 + checksum: 10/ce43ad30013cad30dcccf390328d309a7b467b8fdddfd5f86a70b87b9e2ea198471a0803160fb239d33d78876e81e0421fe0cd772817fc1697927314f68cfcda languageName: node linkType: hard @@ -5504,10 +5376,10 @@ __metadata: languageName: node linkType: hard -"@remix-run/router@npm:1.19.2": - version: 1.19.2 - resolution: "@remix-run/router@npm:1.19.2" - checksum: 10/31b62b66ea68bd62018189047de7b262700113438f62407df019f81a9856a08a705b2b77454be9293518e2f5f3bbf3f8b858ac19f48cb7d89f8ab56b7b630c19 +"@remix-run/router@npm:1.21.0": + version: 1.21.0 + resolution: "@remix-run/router@npm:1.21.0" + checksum: 10/cf0fb69d19c1b79095ff67c59cea89086f3982a9a54c8a993818a60fc76e0ebab5a8db647c1a96a662729fad8e806ddd0a96622adf473f5a9f0b99998b2dbad4 languageName: node linkType: hard @@ -5539,130 +5411,144 @@ __metadata: languageName: node linkType: hard -"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.0.5": - version: 5.1.2 - resolution: "@rollup/pluginutils@npm:5.1.2" +"@rollup/pluginutils@npm:^5.0.1, @rollup/pluginutils@npm:^5.1.3": + version: 5.1.3 + resolution: "@rollup/pluginutils@npm:5.1.3" dependencies: "@types/estree": "npm:^1.0.0" estree-walker: "npm:^2.0.2" - picomatch: "npm:^2.3.1" + picomatch: "npm:^4.0.2" peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 10/cc1fe3285ab48915a6535ab2f0c90dc511bd3e63143f8e9994bb036c6c5071fd14d641cff6c89a7fde6a4faa85227d4e2cf46ee36b7d962099e0b9e4c9b8a4b0 + checksum: 10/da24956c4f7ec0aed63a2dd6c6dd64d8ad90155918056e69adda6fbb7b96c607300079805bc63f2e64e33ba256802367301a578d020a22262f408bde98ca3643 languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.22.5" +"@rollup/rollup-android-arm-eabi@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.26.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-android-arm64@npm:4.22.5" +"@rollup/rollup-android-arm64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-android-arm64@npm:4.26.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-darwin-arm64@npm:4.22.5" +"@rollup/rollup-darwin-arm64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.26.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-darwin-x64@npm:4.22.5" +"@rollup/rollup-darwin-x64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.26.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.22.5" +"@rollup/rollup-freebsd-arm64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.26.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.26.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.26.0" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.22.5" +"@rollup/rollup-linux-arm-musleabihf@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.26.0" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.22.5" +"@rollup/rollup-linux-arm64-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.26.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.22.5" +"@rollup/rollup-linux-arm64-musl@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.26.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.22.5" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.26.0" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.22.5" +"@rollup/rollup-linux-riscv64-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.26.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.22.5" +"@rollup/rollup-linux-s390x-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.26.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.22.5" +"@rollup/rollup-linux-x64-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.26.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.22.5" +"@rollup/rollup-linux-x64-musl@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.26.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.22.5" +"@rollup/rollup-win32-arm64-msvc@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.26.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.22.5" +"@rollup/rollup-win32-ia32-msvc@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.26.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.22.5": - version: 4.22.5 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.22.5" +"@rollup/rollup-win32-x64-msvc@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.26.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -6234,92 +6120,92 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-darwin-arm64@npm:1.7.28" +"@swc/core-darwin-arm64@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-darwin-arm64@npm:1.9.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-darwin-x64@npm:1.7.28" +"@swc/core-darwin-x64@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-darwin-x64@npm:1.9.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.28" +"@swc/core-linux-arm-gnueabihf@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.9.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-linux-arm64-gnu@npm:1.7.28" +"@swc/core-linux-arm64-gnu@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-linux-arm64-gnu@npm:1.9.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-linux-arm64-musl@npm:1.7.28" +"@swc/core-linux-arm64-musl@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-linux-arm64-musl@npm:1.9.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-linux-x64-gnu@npm:1.7.28" +"@swc/core-linux-x64-gnu@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-linux-x64-gnu@npm:1.9.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-linux-x64-musl@npm:1.7.28" +"@swc/core-linux-x64-musl@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-linux-x64-musl@npm:1.9.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-win32-arm64-msvc@npm:1.7.28" +"@swc/core-win32-arm64-msvc@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-win32-arm64-msvc@npm:1.9.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-win32-ia32-msvc@npm:1.7.28" +"@swc/core-win32-ia32-msvc@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-win32-ia32-msvc@npm:1.9.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.7.28": - version: 1.7.28 - resolution: "@swc/core-win32-x64-msvc@npm:1.7.28" +"@swc/core-win32-x64-msvc@npm:1.9.2": + version: 1.9.2 + resolution: "@swc/core-win32-x64-msvc@npm:1.9.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.7.0": - version: 1.7.28 - resolution: "@swc/core@npm:1.7.28" - dependencies: - "@swc/core-darwin-arm64": "npm:1.7.28" - "@swc/core-darwin-x64": "npm:1.7.28" - "@swc/core-linux-arm-gnueabihf": "npm:1.7.28" - "@swc/core-linux-arm64-gnu": "npm:1.7.28" - "@swc/core-linux-arm64-musl": "npm:1.7.28" - "@swc/core-linux-x64-gnu": "npm:1.7.28" - "@swc/core-linux-x64-musl": "npm:1.7.28" - "@swc/core-win32-arm64-msvc": "npm:1.7.28" - "@swc/core-win32-ia32-msvc": "npm:1.7.28" - "@swc/core-win32-x64-msvc": "npm:1.7.28" + version: 1.9.2 + resolution: "@swc/core@npm:1.9.2" + dependencies: + "@swc/core-darwin-arm64": "npm:1.9.2" + "@swc/core-darwin-x64": "npm:1.9.2" + "@swc/core-linux-arm-gnueabihf": "npm:1.9.2" + "@swc/core-linux-arm64-gnu": "npm:1.9.2" + "@swc/core-linux-arm64-musl": "npm:1.9.2" + "@swc/core-linux-x64-gnu": "npm:1.9.2" + "@swc/core-linux-x64-musl": "npm:1.9.2" + "@swc/core-win32-arm64-msvc": "npm:1.9.2" + "@swc/core-win32-ia32-msvc": "npm:1.9.2" + "@swc/core-win32-x64-msvc": "npm:1.9.2" "@swc/counter": "npm:^0.1.3" - "@swc/types": "npm:^0.1.12" + "@swc/types": "npm:^0.1.15" peerDependencies: "@swc/helpers": "*" dependenciesMeta: @@ -6346,7 +6232,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/a477e79387ecc8b68c2bdbbdc88cc61f27a02c5d00f0d77134f9e2de166786a4ee9f7388d6ffd44fc01bfef5311a15cc3132052bab72fb43246dc42705fedb60 + checksum: 10/6793f2014a016f90b1c41a695f6d3a14d574e129e78f651fe3d6dbacbc6d0836ab7a7eb445d873a302b060b25ae34c4e09d0f94574a71da47c6424c5fa58aa10 languageName: node linkType: hard @@ -6357,12 +6243,12 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:^0.1.12": - version: 0.1.12 - resolution: "@swc/types@npm:0.1.12" +"@swc/types@npm:^0.1.15": + version: 0.1.15 + resolution: "@swc/types@npm:0.1.15" dependencies: "@swc/counter": "npm:^0.1.3" - checksum: 10/92dbbc70cd068ea30fb6fbdc1ae8599d6c058a5d09b2923d6e4e24fab5ad7c86a19dd01f349a8e03e300a9321e06911a24df18303b40e307fbd4109372cef2ef + checksum: 10/d8bf063aeebac51290d1edf0cec52e2e5b5afced0dc6933510a86947e10f0f77976bc14c3efb5e8f265a9cbdeb0929e00e44b2f82c6d0f273997c5029417b769 languageName: node linkType: hard @@ -6415,17 +6301,17 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.56.2": - version: 5.56.2 - resolution: "@tanstack/query-core@npm:5.56.2" - checksum: 10/b7600ee71c46c756edbfb0b7733c3df10c16d57b639bf6bd43b81cbdfd7678e01b425b02bd7a08764a2610af10a27f48a4380e3504a29356781bed1d50a38341 +"@tanstack/query-core@npm:5.59.20": + version: 5.59.20 + resolution: "@tanstack/query-core@npm:5.59.20" + checksum: 10/efe34f0a05f4cdef833c3885f466bab8ecee22677a9056d161087658539c1dd14063cc19c08b8f2e56cafc4692fcde7fb4fc4962df59159b1da12c49e69892df languageName: node linkType: hard -"@tanstack/query-devtools@npm:5.58.0": - version: 5.58.0 - resolution: "@tanstack/query-devtools@npm:5.58.0" - checksum: 10/ca16c47c943ea392dfddc301f7e09ecdb0c8b905fb684b8f26b908a244e2e897679efb0ead5fa8e728711017341fdd91d8c51ebb19f746819e26ade5549f539e +"@tanstack/query-devtools@npm:5.59.20": + version: 5.59.20 + resolution: "@tanstack/query-devtools@npm:5.59.20" + checksum: 10/0bb2995337d78910c7677f780af42cd4285b39d618cd7876e24ec16243783d4cfe9e4d067d210d5337aefaad0a21928c5e4cb30fb4c08a09521625fcfe9c14d4 languageName: node linkType: hard @@ -6439,14 +6325,14 @@ __metadata: linkType: hard "@tanstack/react-query-devtools@npm:^5.44.0": - version: 5.58.0 - resolution: "@tanstack/react-query-devtools@npm:5.58.0" + version: 5.59.20 + resolution: "@tanstack/react-query-devtools@npm:5.59.20" dependencies: - "@tanstack/query-devtools": "npm:5.58.0" + "@tanstack/query-devtools": "npm:5.59.20" peerDependencies: - "@tanstack/react-query": ^5.56.2 + "@tanstack/react-query": ^5.59.20 react: ^18 || ^19 - checksum: 10/8337ee516c7ec1c9ef4f25fad98e2a689074ad1151988e8ffa0daff543ecc032577707168624b16a6fe8af4f3bde187c154783b7a3dbb3c8bc4764523a5aa1af + checksum: 10/71cf2fa81ce1d7a7e35acd9f45a4c398272f69e8ab962c5fcf686b8bf5144ca8e8702049bad452186963b4b820703c19ba9372149fd56ec95fef5390c5d7346c languageName: node linkType: hard @@ -6481,13 +6367,13 @@ __metadata: linkType: hard "@tanstack/react-query@npm:^5.44.0": - version: 5.56.2 - resolution: "@tanstack/react-query@npm:5.56.2" + version: 5.59.20 + resolution: "@tanstack/react-query@npm:5.59.20" dependencies: - "@tanstack/query-core": "npm:5.56.2" + "@tanstack/query-core": "npm:5.59.20" peerDependencies: react: ^18 || ^19 - checksum: 10/fddf62e987b4f11a31fa136c5ddc203fdec642e7c35c94e5bd1132eb94c51e7d0d8eeb26f2fec9aa330929e596a4b1e340f539be26435b8858868d12d6b1578a + checksum: 10/4bfface953fedb124c5b30d46d22e46b18dc9c53a30ad20493c2ce70dc03058d78815c2a8a8a4f0bd279dae29469b923ccb346c69485f00c1808fa7ac908d6b4 languageName: node linkType: hard @@ -6693,7 +6579,27 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: 10/e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10/719fcd255760168a43d0e306ef87548e1e15bffe361d5f4022b0f266575637acc0ecb85604ac97879ee8ae83c6a6d0613b0ed31d0209ddf22a0fe6d608fc56fe + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d @@ -6766,7 +6672,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.8": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -6792,9 +6698,9 @@ __metadata: linkType: hard "@types/lodash@npm:*, @types/lodash@npm:^4.14.182": - version: 4.17.9 - resolution: "@types/lodash@npm:4.17.9" - checksum: 10/49e35caaf668686be0bad9e9bef88456903a21999d3fd8bf91c302e0d5328398fb59fee793d0afbaf6edeca1b46c3e8109899d85ff3a433075178f1ab693e597 + version: 4.17.13 + resolution: "@types/lodash@npm:4.17.13" + checksum: 10/ddb34e20810c71be2d9445bcc4b64ec25b83976738454de709854b79c7f655b03704b76235445699956d65012987720e0e429a35489de65495cdb5420202d905 languageName: node linkType: hard @@ -6813,11 +6719,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 22.7.4 - resolution: "@types/node@npm:22.7.4" + version: 22.9.0 + resolution: "@types/node@npm:22.9.0" dependencies: - undici-types: "npm:~6.19.2" - checksum: 10/19ddab80c4eba2253c855ed67c9bbc47417183049d01e59010a738bd80d47338bab79fd1f44ae51516bd63a1db4bf21ddb38b16bf6401a2e93252068ec52e88b + undici-types: "npm:~6.19.8" + checksum: 10/a7df3426891868b0f5fb03e46aeddd8446178233521c624a44531c92a040cf08a82d8235f7e1e02af731fd16984665d4d71f3418caf9c2788313b10f040d615d languageName: node linkType: hard @@ -6884,11 +6790,11 @@ __metadata: linkType: hard "@types/react-dom@npm:*, @types/react-dom@npm:^18.2.22": - version: 18.3.0 - resolution: "@types/react-dom@npm:18.3.0" + version: 18.3.1 + resolution: "@types/react-dom@npm:18.3.1" dependencies: "@types/react": "npm:*" - checksum: 10/6ff53f5a7b7fba952a68e114d3b542ebdc1e87a794234785ebab0bcd9bde7fb4885f21ebaf93d26dc0a1b5b93287f42cad68b78ae04dddf6b20da7aceff0beaf + checksum: 10/33f9ba79b26641ddf00a8699c30066b7e3573ab254e97475bf08f82fab83a6d3ce8d4ebad86afeb49bb8df3374390a9ba93125cece33badc4b3e8f7eac3c84d8 languageName: node linkType: hard @@ -6932,12 +6838,12 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:^18.2.66": - version: 18.3.10 - resolution: "@types/react@npm:18.3.10" + version: 18.3.12 + resolution: "@types/react@npm:18.3.12" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 10/cdc946f15fcad62387e6485a2bbef3e45609708fd81e3ce30b03580077bb8a8a1bd0d19858d8602b33c3921bbb8907ddbc9411fd25294a2c2e944907dad8dd67 + checksum: 10/c9bbdfeacd5347d2240e0d2cb5336bc57dbc1b9ff557b6c4024b49df83419e4955553518169d3736039f1b62608e15b35762a6c03d49bd86e33add4b43b19033 languageName: node linkType: hard @@ -7225,31 +7131,17 @@ __metadata: languageName: node linkType: hard -"@uniswap/router-sdk@npm:^1.11.0": - version: 1.12.1 - resolution: "@uniswap/router-sdk@npm:1.12.1" - dependencies: - "@ethersproject/abi": "npm:^5.5.0" - "@uniswap/sdk-core": "npm:^5.3.1" - "@uniswap/swap-router-contracts": "npm:^1.3.0" - "@uniswap/v2-sdk": "npm:^4.3.2" - "@uniswap/v3-sdk": "npm:^3.11.2" - "@uniswap/v4-sdk": "npm:^1.6.0" - checksum: 10/d407d462a10de5f4ded6d57856e3e11c5c7a84cb1318f20b746f7347602f2fd71ecfbbf02b95c400c7599d987c4a361071e5266fc23f9f5078883621d2cdedcf - languageName: node - linkType: hard - -"@uniswap/router-sdk@npm:^1.12.0, @uniswap/router-sdk@npm:^1.6.0, @uniswap/router-sdk@npm:^1.9.0": - version: 1.14.2 - resolution: "@uniswap/router-sdk@npm:1.14.2" +"@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.14.3 + resolution: "@uniswap/router-sdk@npm:1.14.3" dependencies: "@ethersproject/abi": "npm:^5.5.0" "@uniswap/sdk-core": "npm:^5.8.0" "@uniswap/swap-router-contracts": "npm:^1.3.0" "@uniswap/v2-sdk": "npm:^4.6.0" "@uniswap/v3-sdk": "npm:^3.17.0" - "@uniswap/v4-sdk": "npm:^1.9.0" - checksum: 10/3852923549f070f753a95d7597a0bf67234ceb81bbd0d72eb881d999b07435ebe349974ff700655192d05a810eac275ba8227780a535b9e6aa54bec149e4ce25 + "@uniswap/v4-sdk": "npm:^1.10.3" + checksum: 10/0f2f8661ee25e81d57494059fb7192ee00aa5ce51ba79e27597af616f4601cf7e33b887b7d8d51072e4e10b112bcbf5e876da48354bd47caed7a58f5f7456029 languageName: node linkType: hard @@ -7267,9 +7159,9 @@ __metadata: languageName: node linkType: hard -"@uniswap/sdk-core@npm:^5.0.0, @uniswap/sdk-core@npm:^5.3.1, @uniswap/sdk-core@npm:^5.4.0, @uniswap/sdk-core@npm:^5.8.0, @uniswap/sdk-core@npm:^5.8.1": - version: 5.8.1 - resolution: "@uniswap/sdk-core@npm:5.8.1" +"@uniswap/sdk-core@npm:^5.0.0, @uniswap/sdk-core@npm:^5.3.1, @uniswap/sdk-core@npm:^5.4.0, @uniswap/sdk-core@npm:^5.8.0, @uniswap/sdk-core@npm:^5.8.1, @uniswap/sdk-core@npm:^5.9.0": + version: 5.9.0 + resolution: "@uniswap/sdk-core@npm:5.9.0" dependencies: "@ethersproject/address": "npm:^5.0.2" "@ethersproject/bytes": "npm:^5.7.0" @@ -7280,7 +7172,7 @@ __metadata: jsbi: "npm:^3.1.4" tiny-invariant: "npm:^1.1.0" toformat: "npm:^2.0.0" - checksum: 10/ff4876ca60a0098de113403f02415a1791a1e339d8349c985ff094ffd3e2c17441ae093129e2eebb656b580dc4e899138c22db6e10234093d9eeac2f317770e5 + checksum: 10/221774e4acd5ca365557998184018a19c009a00c65b359957025ca208a00feb5ec0a83fbc813e515848582bff6e0083e4b60a989c7bf5e28255ff9e7bdc0cf5c languageName: node linkType: hard @@ -7358,22 +7250,22 @@ __metadata: linkType: hard "@uniswap/universal-router-sdk@npm:^3.0.2": - version: 3.1.0 - resolution: "@uniswap/universal-router-sdk@npm:3.1.0" + version: 3.4.0 + resolution: "@uniswap/universal-router-sdk@npm:3.4.0" dependencies: "@openzeppelin/contracts": "npm:4.7.0" "@uniswap/permit2-sdk": "npm:^1.3.0" - "@uniswap/router-sdk": "npm:^1.11.0" - "@uniswap/sdk-core": "npm:^5.3.1" + "@uniswap/router-sdk": "npm:^1.14.0" + "@uniswap/sdk-core": "npm:^5.8.0" "@uniswap/universal-router": "npm:2.0.0-beta.1" "@uniswap/v2-core": "npm:^1.0.1" - "@uniswap/v2-sdk": "npm:^4.4.1" + "@uniswap/v2-sdk": "npm:^4.6.0" "@uniswap/v3-core": "npm:1.0.0" - "@uniswap/v3-sdk": "npm:^3.13.1" - "@uniswap/v4-sdk": "npm:^1.0.0" + "@uniswap/v3-sdk": "npm:^3.17.0" + "@uniswap/v4-sdk": "npm:^1.6.3" bignumber.js: "npm:^9.0.2" ethers: "npm:^5.7.0" - checksum: 10/2e379c44e125de67f9fbb957ae03f3a5b01bf45527a42f6262a994fa1a3f9d666be3e37d1ef4943475b7a1256f2a5c6febebc3471ef1bb5425d01023e25c71a3 + checksum: 10/8da17591a3b9a43a5e9774f61bc7fd26e84096dcec7d8cf257fbe4e5df7acc513839b4c4f787bebcec7618e691b6f6250973f2f00cfc11dee6bc894808c242b9 languageName: node linkType: hard @@ -7420,28 +7312,15 @@ __metadata: linkType: hard "@uniswap/v2-sdk@npm:^4.3.0, @uniswap/v2-sdk@npm:^4.3.2, @uniswap/v2-sdk@npm:^4.6.0": - version: 4.6.1 - resolution: "@uniswap/v2-sdk@npm:4.6.1" - dependencies: - "@ethersproject/address": "npm:^5.0.2" - "@ethersproject/solidity": "npm:^5.0.9" - "@uniswap/sdk-core": "npm:^5.8.1" - tiny-invariant: "npm:^1.1.0" - tiny-warning: "npm:^1.0.3" - checksum: 10/fbc5019379c9da246ba1e15564d235d2cd11967ed87d5993f32954af3f642bc302ecde59ec5d27972676c92a5617e73cc8afebf17904a98e563efdfab6dfacaa - languageName: node - linkType: hard - -"@uniswap/v2-sdk@npm:^4.4.1": - version: 4.4.1 - resolution: "@uniswap/v2-sdk@npm:4.4.1" + version: 4.6.2 + resolution: "@uniswap/v2-sdk@npm:4.6.2" dependencies: "@ethersproject/address": "npm:^5.0.2" "@ethersproject/solidity": "npm:^5.0.9" - "@uniswap/sdk-core": "npm:^5.3.1" + "@uniswap/sdk-core": "npm:^5.9.0" tiny-invariant: "npm:^1.1.0" tiny-warning: "npm:^1.0.3" - checksum: 10/2922e1ba0a3eadcb944072d7c7fc8276004a822571afae9d219684808775e726264f61b8142f09bf80c31b3868f450bff8bc59cfd13b195f65551c129493a037 + checksum: 10/db9943f3a88c1f4a11976c0fbb84de1d8dc258cd4a0f36d2ee0c0f5e4f6e3dde5ac27119898ca803acb3a02dab62cd91d99976a1108da35362251a4d4a68ccfc languageName: node linkType: hard @@ -7489,8 +7368,8 @@ __metadata: linkType: hard "@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": - version: 3.17.1 - resolution: "@uniswap/v3-sdk@npm:3.17.1" + version: 3.18.1 + resolution: "@uniswap/v3-sdk@npm:3.18.1" dependencies: "@ethersproject/abi": "npm:^5.5.0" "@ethersproject/solidity": "npm:^5.0.9" @@ -7500,23 +7379,7 @@ __metadata: "@uniswap/v3-staker": "npm:1.0.0" tiny-invariant: "npm:^1.1.0" tiny-warning: "npm:^1.0.3" - checksum: 10/1d74ef81fb2d9280a096f6fa94ef3907e4daf04cd6bcee942aacfb21036ec92d86033fa1c7146b5f49fd2634dc8cd4bcf86ad3daab85a5287b47d00763cb2275 - languageName: node - linkType: hard - -"@uniswap/v3-sdk@npm:^3.11.2, @uniswap/v3-sdk@npm:^3.13.1": - version: 3.14.0 - resolution: "@uniswap/v3-sdk@npm:3.14.0" - dependencies: - "@ethersproject/abi": "npm:^5.5.0" - "@ethersproject/solidity": "npm:^5.0.9" - "@uniswap/sdk-core": "npm:^5.3.1" - "@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/d642cf4a27097ce7f90a85a32c7aee09d943a027c844b35910077659b3ef2f3dc7213350b77c606c8b1be69e85c40d0329f04533b564c7dc02381c3850ff1a9a + checksum: 10/8508bfc64525afa152e46772f4da3204277235955458db7dc9ca569246e3ff51f7ab85874f676ea7067f83dc2a464f44093e8f6eab611c8f80b1a720b7f4aa56 languageName: node linkType: hard @@ -7531,29 +7394,16 @@ __metadata: languageName: node linkType: hard -"@uniswap/v4-sdk@npm:^1.0.0, @uniswap/v4-sdk@npm:^1.6.0": - version: 1.6.3 - resolution: "@uniswap/v4-sdk@npm:1.6.3" - dependencies: - "@ethersproject/solidity": "npm:^5.0.9" - "@uniswap/sdk-core": "npm:^5.3.1" - "@uniswap/v3-sdk": "npm:3.12.0" - tiny-invariant: "npm:^1.1.0" - tiny-warning: "npm:^1.0.3" - checksum: 10/fcba4fb677e91e387542db15fc067dbdf6c9cd847cacd3a72e4a0456378b93d820d51a937ed7c69edd7e0cc793420e85044bdb2be2623d162d1ee04cc347382b - languageName: node - linkType: hard - -"@uniswap/v4-sdk@npm:^1.2.0, @uniswap/v4-sdk@npm:^1.9.0": - version: 1.10.0 - resolution: "@uniswap/v4-sdk@npm:1.10.0" +"@uniswap/v4-sdk@npm:^1.10.3, @uniswap/v4-sdk@npm:^1.2.0, @uniswap/v4-sdk@npm:^1.6.3": + version: 1.11.1 + resolution: "@uniswap/v4-sdk@npm:1.11.1" dependencies: "@ethersproject/solidity": "npm:^5.0.9" "@uniswap/sdk-core": "npm:^5.3.1" "@uniswap/v3-sdk": "npm:3.12.0" tiny-invariant: "npm:^1.1.0" tiny-warning: "npm:^1.0.3" - checksum: 10/2dc2b85543cc5ce74cc6d31f094994cceab88868ec2127e33b500b98261103b1c958dccb5909581096d7b4f3357de75026055432a9b9adc1da2cf0c49e8e9c90 + checksum: 10/879c3c22caffd70bcbbebf9b5d08d5be8d4fb060d634ec5c7aa06e3b2372bed6379f3501d51e5a7baf64bba4c82796ef514dd61bf10f3351a554cea648e07120 languageName: node linkType: hard @@ -7760,8 +7610,8 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^4.2.1": - version: 4.3.2 - resolution: "@vitejs/plugin-react@npm:4.3.2" + version: 4.3.3 + resolution: "@vitejs/plugin-react@npm:4.3.3" dependencies: "@babel/core": "npm:^7.25.2" "@babel/plugin-transform-react-jsx-self": "npm:^7.24.7" @@ -7770,70 +7620,70 @@ __metadata: react-refresh: "npm:^0.14.2" peerDependencies: vite: ^4.2.0 || ^5.0.0 - checksum: 10/9ff278942d76e21f4680f0f9e4d8d3bfe12fe19701e0f07014dfbff83d772f10237114581a3ec2637c32856d0a99400a14e6cd80969f99b88b1a64227c531ddb + checksum: 10/816b47c54aefce198ce2fb2b3e63b5f158ab33b04713dbec0e780a89c5126d4ea6b08544972464c43096b16e90e7f467fcf19692fad30d4f8ca5bf9a386f38b3 languageName: node linkType: hard -"@vue/compiler-core@npm:3.5.10": - version: 3.5.10 - resolution: "@vue/compiler-core@npm:3.5.10" +"@vue/compiler-core@npm:3.5.12": + version: 3.5.12 + resolution: "@vue/compiler-core@npm:3.5.12" dependencies: "@babel/parser": "npm:^7.25.3" - "@vue/shared": "npm:3.5.10" + "@vue/shared": "npm:3.5.12" entities: "npm:^4.5.0" estree-walker: "npm:^2.0.2" source-map-js: "npm:^1.2.0" - checksum: 10/3207883dd018305d3a014c80e17057d1223ae5093c77300b9ad703f8282abf863a2264d8b366cb9fc64a9319e213bf59d8d3419d80f07e2d70a424c0ad1e386b + checksum: 10/287ca30a8e018f438775cdb93fca191e841e359c646a89a0788237e2af2840b04e6fcea8aea00f09b81ca96c16bcab00a53124916d07fb5c1c598dba4a6c560b languageName: node linkType: hard -"@vue/compiler-dom@npm:3.5.10": - version: 3.5.10 - resolution: "@vue/compiler-dom@npm:3.5.10" +"@vue/compiler-dom@npm:3.5.12": + version: 3.5.12 + resolution: "@vue/compiler-dom@npm:3.5.12" dependencies: - "@vue/compiler-core": "npm:3.5.10" - "@vue/shared": "npm:3.5.10" - checksum: 10/36f0eb99428bff3d42b490015d9172db0f3ed03f5ad9e6e8fb76b9b7fdb1306bf25002959442c8771a77755ead8aeabc7c6fd8918eb7d34e2c8cf125bd50bcad + "@vue/compiler-core": "npm:3.5.12" + "@vue/shared": "npm:3.5.12" + checksum: 10/7578e7e729f44fd0903cd468255d1d50fe9774073a7f5cb0a5bf4352495712454e3b698abe5b29829cf1b56267162f7e73397979e4dcc472e855192cb2c96008 languageName: node linkType: hard "@vue/compiler-sfc@npm:^3.4.27": - version: 3.5.10 - resolution: "@vue/compiler-sfc@npm:3.5.10" + version: 3.5.12 + resolution: "@vue/compiler-sfc@npm:3.5.12" dependencies: "@babel/parser": "npm:^7.25.3" - "@vue/compiler-core": "npm:3.5.10" - "@vue/compiler-dom": "npm:3.5.10" - "@vue/compiler-ssr": "npm:3.5.10" - "@vue/shared": "npm:3.5.10" + "@vue/compiler-core": "npm:3.5.12" + "@vue/compiler-dom": "npm:3.5.12" + "@vue/compiler-ssr": "npm:3.5.12" + "@vue/shared": "npm:3.5.12" estree-walker: "npm:^2.0.2" magic-string: "npm:^0.30.11" postcss: "npm:^8.4.47" source-map-js: "npm:^1.2.0" - checksum: 10/0047f519a6035c5263f82ab51dfc37e80ba869e1d8a05c15c4aa799b86a44ac8967084f39e2654d0afaa435e9f51625fcd76ff3c93e3352d73128f4603855d0d + checksum: 10/5b2fdbbf381dc684054bcfb7b0945154de658b56b618b2e1637abecd47e070976848a0bfcb2fa0698bab077f0d79ba638f2ec1d180652ca160352c72cf7e6fb3 languageName: node linkType: hard -"@vue/compiler-ssr@npm:3.5.10": - version: 3.5.10 - resolution: "@vue/compiler-ssr@npm:3.5.10" +"@vue/compiler-ssr@npm:3.5.12": + version: 3.5.12 + resolution: "@vue/compiler-ssr@npm:3.5.12" dependencies: - "@vue/compiler-dom": "npm:3.5.10" - "@vue/shared": "npm:3.5.10" - checksum: 10/6c274c6b88151519565827132a80266f1d8aa8d88f901ed465d8034fe8d3bdcdf772036cc45afbe53ca58acd3fc6bcfdc31b9b36453bb2934eff43e631e71d5b + "@vue/compiler-dom": "npm:3.5.12" + "@vue/shared": "npm:3.5.12" + checksum: 10/25b11070503f5380341d37889aa8729987f3884cdda3a01c95323ee41a00f233c6dd7439618b2389dcaa339341776e7bd21780e3416c1ec1fddee45f13f254a7 languageName: node linkType: hard -"@vue/shared@npm:3.5.10": - version: 3.5.10 - resolution: "@vue/shared@npm:3.5.10" - checksum: 10/1f8534a58ed5320c7c5a137ed18fcb21addd3ef1cb155f926d9c815ef90198d9492d3f2aa3ffd3e1d6d7bbfdebde9a9aa5a847a3ff98b442d15eb194afb46ec8 +"@vue/shared@npm:3.5.12": + version: 3.5.12 + resolution: "@vue/shared@npm:3.5.12" + checksum: 10/abe229a09a9513f484a03a8c0e63b90949d9fccf64203c1ad510628305e1fdc0e9d064174df88299409a9fbf0c142e4fbcc0a5449f10728fb12d7e10d825abc5 languageName: node linkType: hard -"@walletconnect/core@npm:2.16.2": - version: 2.16.2 - resolution: "@walletconnect/core@npm:2.16.2" +"@walletconnect/core@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/core@npm:2.17.2" dependencies: "@walletconnect/heartbeat": "npm:1.2.2" "@walletconnect/jsonrpc-provider": "npm:1.0.14" @@ -7846,12 +7696,13 @@ __metadata: "@walletconnect/relay-auth": "npm:1.0.4" "@walletconnect/safe-json": "npm:1.0.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.16.2" - "@walletconnect/utils": "npm:2.16.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/utils": "npm:2.17.2" + "@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/b867127db13594276fcf107c09b94407858fcf7214771c7682ebf1f552b386d1a116332084ce06579466a5db3a19c2750882eb44606743c54ed902ef27c849a1 + checksum: 10/331417457e17e0b0dc4bd805ecd450407ecd50b8c79609b43c7f664a7f9024d490e9d75ed52fb717a44ebc1a12721cc6cfa11d6cfe698af1439755224e225b11 languageName: node linkType: hard @@ -7865,20 +7716,21 @@ __metadata: linkType: hard "@walletconnect/ethereum-provider@npm:^2.10.1, @walletconnect/ethereum-provider@npm:^2.13.0": - version: 2.16.2 - resolution: "@walletconnect/ethereum-provider@npm:2.16.2" + version: 2.17.2 + resolution: "@walletconnect/ethereum-provider@npm:2.17.2" dependencies: "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" "@walletconnect/jsonrpc-provider": "npm:1.0.14" "@walletconnect/jsonrpc-types": "npm:1.0.4" "@walletconnect/jsonrpc-utils": "npm:1.0.8" - "@walletconnect/modal": "npm:2.6.2" - "@walletconnect/sign-client": "npm:2.16.2" - "@walletconnect/types": "npm:2.16.2" - "@walletconnect/universal-provider": "npm:2.16.2" - "@walletconnect/utils": "npm:2.16.2" + "@walletconnect/keyvaluestorage": "npm:1.1.1" + "@walletconnect/modal": "npm:2.7.0" + "@walletconnect/sign-client": "npm:2.17.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/universal-provider": "npm:2.17.2" + "@walletconnect/utils": "npm:2.17.2" events: "npm:3.3.0" - checksum: 10/b438d11e32d12f58afa6d782defc22f59ef07ecc3eef1d2bf24a500e4e2348168a1cc4185e3fcb4db90fa87c97d5722aca6c49aed5391ba66dc57f317fef8c6a + checksum: 10/23ab84dca911957aa41c4382bf97c1ff0794b3f5b262d3f14546c20b5fdfa6513e77bce69b6c52df0d12af23d5fb9753f0afcaf67fcdf17de4385b64c9c9a34d languageName: node linkType: hard @@ -7985,15 +7837,6 @@ __metadata: languageName: node linkType: hard -"@walletconnect/modal-core@npm:2.6.2": - version: 2.6.2 - resolution: "@walletconnect/modal-core@npm:2.6.2" - dependencies: - valtio: "npm:1.11.2" - checksum: 10/671184da341eebb6b7a3ad7c334851113683d71e6118f7203a377e493b61eb94bc0571484e497e577b9f4d7221a8a7034ad4b52af722c89fa4105627bed638ba - languageName: node - linkType: hard - "@walletconnect/modal-core@npm:2.7.0": version: 2.7.0 resolution: "@walletconnect/modal-core@npm:2.7.0" @@ -8003,18 +7846,6 @@ __metadata: languageName: node linkType: hard -"@walletconnect/modal-ui@npm:2.6.2": - version: 2.6.2 - resolution: "@walletconnect/modal-ui@npm:2.6.2" - dependencies: - "@walletconnect/modal-core": "npm:2.6.2" - lit: "npm:2.8.0" - motion: "npm:10.16.2" - qrcode: "npm:1.5.3" - checksum: 10/5460ad7f4591c016b723b3f707ac0020e185b60744cf7132b4b4f48d71c87c1c55826f6e11005860f96bd11e0ed3f88da7cda4c0a1c35a0e5b7d6e53bc14cf15 - languageName: node - linkType: hard - "@walletconnect/modal-ui@npm:2.7.0": version: 2.7.0 resolution: "@walletconnect/modal-ui@npm:2.7.0" @@ -8027,17 +7858,7 @@ __metadata: languageName: node linkType: hard -"@walletconnect/modal@npm:2.6.2": - version: 2.6.2 - resolution: "@walletconnect/modal@npm:2.6.2" - dependencies: - "@walletconnect/modal-core": "npm:2.6.2" - "@walletconnect/modal-ui": "npm:2.6.2" - checksum: 10/f8f132c89d1d7f44f2fa564c8d5122163610be4afb0cadc9576c77083471297c37ff62aae3a25492c0ddb480240a2a6ffefe3eba1fd48f1664160c6bac01466d - languageName: node - linkType: hard - -"@walletconnect/modal@npm:^2.6.2": +"@walletconnect/modal@npm:2.7.0, @walletconnect/modal@npm:^2.6.2": version: 2.7.0 resolution: "@walletconnect/modal@npm:2.7.0" dependencies: @@ -8079,20 +7900,20 @@ __metadata: languageName: node linkType: hard -"@walletconnect/sign-client@npm:2.16.2": - version: 2.16.2 - resolution: "@walletconnect/sign-client@npm:2.16.2" +"@walletconnect/sign-client@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/sign-client@npm:2.17.2" dependencies: - "@walletconnect/core": "npm:2.16.2" + "@walletconnect/core": "npm:2.17.2" "@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.16.2" - "@walletconnect/utils": "npm:2.16.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/utils": "npm:2.17.2" events: "npm:3.3.0" - checksum: 10/4b07c859c2d66b53bcef825b5d9374471e711b1f057c523c546d093ee66112e2884ad26dda3c3e2696b1f5abb05a88bab8bf767030e6122e5d2cb460e51a4e7a + checksum: 10/8612aaf1f527d652649babf55e7b735b61cbfc2160f56093f81f7903b5443a22f4ee7a063d2545835a9e869c1bc82034236e221124e3a816858a102275c2fb2d languageName: node linkType: hard @@ -8105,9 +7926,9 @@ __metadata: languageName: node linkType: hard -"@walletconnect/types@npm:2.16.2": - version: 2.16.2 - resolution: "@walletconnect/types@npm:2.16.2" +"@walletconnect/types@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/types@npm:2.17.2" dependencies: "@walletconnect/events": "npm:1.0.1" "@walletconnect/heartbeat": "npm:1.2.2" @@ -8115,48 +7936,55 @@ __metadata: "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/logger": "npm:2.1.2" events: "npm:3.3.0" - checksum: 10/bad714e4681aee92d9aeb112dc1e3df6336a17bb082d67e573c84c935dcee8976c3276d7b38f63d688281fe6d5ab6239528025749324cf9c36bd6e0d6d810a11 + checksum: 10/a668ab7a88b9f5904833f9e0b1bc5ac7501a5bdfdd1c84774464e399f337e31e61da90982bb9bf022ef91398b5e15d74ef368625cce38902c6a7cffb255d46fd languageName: node linkType: hard -"@walletconnect/universal-provider@npm:2.16.2": - version: 2.16.2 - resolution: "@walletconnect/universal-provider@npm:2.16.2" +"@walletconnect/universal-provider@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/universal-provider@npm:2.17.2" dependencies: + "@walletconnect/events": "npm:1.0.1" "@walletconnect/jsonrpc-http-connection": "npm:1.0.8" "@walletconnect/jsonrpc-provider": "npm:1.0.14" "@walletconnect/jsonrpc-types": "npm:1.0.4" "@walletconnect/jsonrpc-utils": "npm:1.0.8" + "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/logger": "npm:2.1.2" - "@walletconnect/sign-client": "npm:2.16.2" - "@walletconnect/types": "npm:2.16.2" - "@walletconnect/utils": "npm:2.16.2" + "@walletconnect/sign-client": "npm:2.17.2" + "@walletconnect/types": "npm:2.17.2" + "@walletconnect/utils": "npm:2.17.2" events: "npm:3.3.0" - checksum: 10/729af58013c0831d998fd72a64e89512d6311c1bcb6d5167fd5b21ea08a89a078e2c7f5592e1ff346b4ab1245a4a8a5354507b54b625210fc4795f34f1f8e0d3 + lodash: "npm:4.17.21" + checksum: 10/7081d7927df86bea80e056c497db468668369dc2020735da8ff5e687f95504e2b26e667d46bc39617db5141d42279b85a27deee699b046ab634e0f4cfd89e821 languageName: node linkType: hard -"@walletconnect/utils@npm:2.16.2": - version: 2.16.2 - resolution: "@walletconnect/utils@npm:2.16.2" +"@walletconnect/utils@npm:2.17.2": + version: 2.17.2 + resolution: "@walletconnect/utils@npm:2.17.2" 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" + "@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/safe-json": "npm:1.0.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.16.2" + "@walletconnect/types": "npm:2.17.2" "@walletconnect/window-getters": "npm:1.0.1" "@walletconnect/window-metadata": "npm:1.0.1" detect-browser: "npm:5.3.0" - elliptic: "npm:^6.5.7" + elliptic: "npm:6.6.0" query-string: "npm:7.1.3" uint8arrays: "npm:3.1.0" - checksum: 10/21bbfcdb170a661399f6a63be9338bf31492d6f2e62a58589930ad6aca639b7ea691c73ec89e97d8cb95555eaf13b0a4f5746bd20549560244d4348d34f552f1 + checksum: 10/4d43adf7c5d21cc3916a797ff704fa348c7ef9d54184e16f6a9ee8b7d3aa3e58861b1c3a8c6c7bdc5137de67da822689f0035838a4d57d50a03834920cada4b4 languageName: node linkType: hard @@ -8216,9 +8044,9 @@ __metadata: languageName: node linkType: hard -"@web3-onboard/core@npm:2.22.3, @web3-onboard/core@npm:^2.21.1, @web3-onboard/core@npm:^2.22.3": - version: 2.22.3 - resolution: "@web3-onboard/core@npm:2.22.3" +"@web3-onboard/core@npm:2.23.0, @web3-onboard/core@npm:^2.21.1, @web3-onboard/core@npm:^2.22.3": + version: 2.23.0 + resolution: "@web3-onboard/core@npm:2.23.0" dependencies: "@web3-onboard/common": "npm:^2.4.1" bnc-sdk: "npm:^4.6.7" @@ -8232,7 +8060,7 @@ __metadata: svelte: "npm:^3.49.0" svelte-i18n: "npm:^3.3.13" viem: "npm:2.12.0" - checksum: 10/2525bb3b1cf4d893f45fb4f0becd5a889a59b1ba13f02b9f567d988eac57bae28ffd8a37e153bf87595ee15dee316d78938a9e008c241cc82a2b7b215760914c + checksum: 10/4b3c1fdb186c8523d6aa59895be204886ea38ae995f946132b17c6f0509e075e508437548b61b374f09746dba95e0d9fda85c4c9bb4f309263a2e5e29c5b6397 languageName: node linkType: hard @@ -8248,15 +8076,15 @@ __metadata: linkType: hard "@web3-onboard/react@npm:^2.8.9, @web3-onboard/react@npm:^2.9.2": - version: 2.9.3 - resolution: "@web3-onboard/react@npm:2.9.3" + version: 2.10.0 + resolution: "@web3-onboard/react@npm:2.10.0" dependencies: "@web3-onboard/common": "npm:^2.4.1" - "@web3-onboard/core": "npm:2.22.3" + "@web3-onboard/core": "npm:2.23.0" use-sync-external-store: "npm:1.0.0" peerDependencies: react: ">=16.8" - checksum: 10/cd59788e532d7e1085ff0bc24a4bc592a90ef050126d784faf4065cc2ceaf21fd4399030ae22f3f047277bc11506e573a31ce385fd68876873e576e9edee7b19 + checksum: 10/a0018e29222b61274f9bf4c69ac777d4a638bb1d8482c4b8538d45782de2b77737e0ebc01668f6844ff8fb52f5a0cd73ac1b0533a66388ae388376aad61c19eb languageName: node linkType: hard @@ -8397,154 +8225,154 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: 10/a775b0559437ae122d14fec0cfe59fdcaf5ca2d8ff48254014fd05d6797e20401e0f1518e628f9b06819aa085834a2534234977f9608b3f2e51f94b6e8b0bc43 + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 10/f83e6abe38057f5d87c1fb356513a371a8b43c9b87657f2790741a66b1ef8ecf958d1391bc42f27c5fb33f58ab8286a38ea849fdd21f433cd4df1307424bab45 languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 10/29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 10/e866ec8433f4a70baa511df5e8f2ebcd6c24f4e2cc6274c7c5aabe2bcce3459ea4680e0f35d450e1f3602acf3913b6b8e4f15069c8cfd34ae8609fb9a7d01795 languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: 10/e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 10/48b5df7fd3095bb252f59a139fe2cbd999a62ac9b488123e9a0da3906ad8a2f2da7b2eb21d328c01a90da987380928706395c2897d1f3ed9e2125b6d75a920d0 languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: 10/1d8705daa41f4d22ef7c6d422af4c530b84d69d0c253c6db5adec44d511d7caa66837803db5b1addcea611a1498fd5a67d2cf318b057a916283ae41ffb85ba8a +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 10/9690afeafa5e765a34620aa6216e9d40f9126d4e37e9726a2594bf60cab6b211ef20ab6670fd3c4449dd4a3497e69e49b2b725c8da0fb213208c7f45f15f5d5b languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" - "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" "@xtuc/long": "npm:4.2.2" - checksum: 10/9ffd258ad809402688a490fdef1fd02222f20cdfe191c895ac215a331343292164e5033dbc0347f0f76f2447865c0b5c2d2e3304ee948d44f7aa27857028fd08 + checksum: 10/e4c7d0b09811e1cda8eec644a022b560b28f4e974f50195375ccd007df5ee48a922a6dcff5ac40b6a8ec850d56d0ea6419318eee49fec7819ede14e90417a6a4 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 10/4ebf03e9c1941288c10e94e0f813f413f972bfaa1f09be2cc2e5577f300430906b61aa24d52f5ef2f894e8e24e61c6f7c39871d7e3d98bc69460e1b8e00bb20b +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: 10/3edd191fff7296df1ef3b023bdbe6cb5ea668f6386fd197ccfce46015c6f2a8cc9763cfb86503a0b94973ad27996645afff2252ee39a236513833259a47af6ed languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: 10/e91e6b28114e35321934070a2db8973a08a5cd9c30500b817214c683bbf5269ed4324366dd93ad83bf2fba0d671ac8f39df1c142bf58f70c57a827eeba4a3d2f + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 10/6b73874f906532512371181d7088460f767966f26309e836060c5a8e4e4bfe6d523fb5f4c034b34aa22ebb1192815f95f0e264298769485c1f0980fdd63ae0ce languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" dependencies: "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10/13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de + checksum: 10/d7e3520baa37a7309fa7db4d73d69fb869878853b1ebd4b168821bd03fcc4c0e1669c06231315b0039035d9a7a462e53de3ad982da4a426a4b0743b5888e8673 languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" dependencies: "@xtuc/long": "npm:4.2.2" - checksum: 10/ec3b72db0e7ce7908fe08ec24395bfc97db486063824c0edc580f0973a4cfbadf30529569d9c7db663a56513e45b94299cca03be9e1992ea3308bb0744164f3d + checksum: 10/3a10542c86807061ec3230bac8ee732289c852b6bceb4b88ebd521a12fbcecec7c432848284b298154f28619e2746efbed19d6904aef06c49ef20a0b85f650cf languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 10/361a537bd604101b320a5604c3c96d1038d83166f1b9fb86cedadc7e81bae54c3785ae5d90bf5b1842f7da08194ccaf0f44a64fcca0cbbd6afe1a166196986d6 +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: 10/27885e5d19f339501feb210867d69613f281eda695ac508f04d69fa3398133d05b6870969c0242b054dc05420ed1cc49a64dea4fe0588c18d211cddb0117cc54 languageName: node linkType: hard "@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/helper-wasm-section": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-opt": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: 10/5678ae02dbebba2f3a344e25928ea5a26a0df777166c9be77a467bfde7aca7f4b57ef95587e4bd768a402cdf2fddc4c56f0a599d164cdd9fe313520e39e18137 + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 10/c62c50eadcf80876713f8c9f24106b18cf208160ab842fcb92060fd78c37bf37e7fcf0b7cbf1afc05d230277c2ce0f3f728432082c472dd1293e184a95f9dbdd languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10/ec45bd50e86bc9856f80fe9af4bc1ae5c98fb85f57023d11dff2b670da240c47a7b1b9b6c89755890314212bd167cf3adae7f1157216ddffb739a4ce589fc338 + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10/6085166b0987d3031355fe17a4f9ef0f412e08098d95454059aced2bd72a4c3df2bc099fa4d32d640551fc3eca1ac1a997b44432e46dc9d84642688e42c17ed4 languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 10/21f25ae109012c49bb084e09f3b67679510429adc3e2408ad3621b2b505379d9cce337799a7919ef44db64e0d136833216914aea16b0d4856f353b9778e0cdb7 + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 10/fa5d1ef8d2156e7390927f938f513b7fb4440dd6804b3d6c8622b7b1cf25a3abf1a5809f615896d4918e04b27b52bc3cbcf18faf2d563cb563ae0a9204a492db languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10/f7311685b76c3e1def2abea3488be1e77f06ecd8633143a6c5c943ca289660952b73785231bb76a010055ca64645227a4bc79705c26ab7536216891b6bb36320 + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 10/07d9805fda88a893c984ed93d5a772d20d671e9731358ab61c6c1af8e0e58d1c42fc230c18974dfddebc9d2dd7775d514ba4d445e70080b16478b4b16c39c7d9 languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/ast": "npm:1.14.1" "@xtuc/long": "npm:4.2.2" - checksum: 10/1a6a4b6bc4234f2b5adbab0cb11a24911b03380eb1cab6fb27a2250174a279fdc6aa2f5a9cf62dd1f6d4eb39f778f488e8ff15b9deb0670dee5c5077d46cf572 + checksum: 10/cef09aad2fcd291bfcf9efdae2ea1e961a1ba0f925d1d9dcdd8c746d32fbaf431b6d26a0241699c0e39f82139018aa720b4ceb84ac6f4c78f13072747480db69 languageName: node linkType: hard @@ -8641,9 +8469,9 @@ __metadata: linkType: hard "abortcontroller-polyfill@npm:^1.7.5": - version: 1.7.5 - resolution: "abortcontroller-polyfill@npm:1.7.5" - checksum: 10/aac398f7fc076235fe731adaffd2c319fe6c1527af8ca561890242d5396351350e0705726478778dc90326a69a4c044890c156fe867cba7f3ffeb670f8665a51 + version: 1.7.6 + resolution: "abortcontroller-polyfill@npm:1.7.6" + checksum: 10/71d9a380270be5ade5d5aca6cddd08ebd94e3ad2b10a3bcfe179b8c8b6234c426c8a9ab316c5238b52d21edd086417d9c8679b6f1b981f976960ff1d09175c4c languageName: node linkType: hard @@ -8693,15 +8521,6 @@ __metadata: languageName: node linkType: hard -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" - peerDependencies: - acorn: ^8 - checksum: 10/8bfbfbb6e2467b9b47abb4d095df717ab64fce2525da65eabee073e85e7975fb3a176b6c8bba17c99a7d8ede283a10a590272304eb54a93c4aa1af9790d47a8b - languageName: node - linkType: hard - "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -8729,12 +8548,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.12.1, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" +"acorn@npm:^8.14.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: acorn: bin/acorn - checksum: 10/d08c2d122bba32d0861e0aa840b2ee25946c286d5dc5990abca991baf8cdbfbe199b05aacb221b979411a2fea36f83e26b5ac4f6b4e0ce49038c62316c1848f0 + checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 languageName: node linkType: hard @@ -9408,9 +9227,9 @@ __metadata: linkType: hard "bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.0, bn.js@npm:^4.11.6, bn.js@npm:^4.11.8, bn.js@npm:^4.11.9, bn.js@npm:^4.12.0, bn.js@npm:^4.4.0": - version: 4.12.0 - resolution: "bn.js@npm:4.12.0" - checksum: 10/10f8db196d3da5adfc3207d35d0a42aa29033eb33685f20ba2c36cadfe2de63dad05df0a20ab5aae01b418d1c4b3d4d205273085262fa020d17e93ff32b67527 + version: 4.12.1 + resolution: "bn.js@npm:4.12.1" + checksum: 10/07f22df8880b423c4890648e95791319898b96712b6ebc5d6b1082b34074f09dedb8601e717d67f905ce29bb1a5313f9a2b1a2015a679e42c9eed94392c0d379 languageName: node linkType: hard @@ -9580,7 +9399,7 @@ __metadata: languageName: node linkType: hard -"browserify-cipher@npm:^1.0.0": +"browserify-cipher@npm:^1.0.1": version: 1.0.1 resolution: "browserify-cipher@npm:1.0.1" dependencies: @@ -9614,7 +9433,7 @@ __metadata: languageName: node linkType: hard -"browserify-sign@npm:^4.0.0": +"browserify-sign@npm:^4.2.3": version: 4.2.3 resolution: "browserify-sign@npm:4.2.3" dependencies: @@ -9655,17 +9474,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.10, browserslist@npm:^4.23.1": - version: 4.24.0 - resolution: "browserslist@npm:4.24.0" +"browserslist@npm:^4.24.0": + version: 4.24.2 + resolution: "browserslist@npm:4.24.2" dependencies: - caniuse-lite: "npm:^1.0.30001663" - electron-to-chromium: "npm:^1.5.28" + caniuse-lite: "npm:^1.0.30001669" + electron-to-chromium: "npm:^1.5.41" node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.0" + update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 10/26c1b8ba257a0b51b102080ba9d42945af2abaa8c4cf6da21cd47b3f123fc1e81640203b293214356c2c17d9d265bb3a5ed428b6d302f383576dd6ce8fd5036c + checksum: 10/f8a9d78bbabe466c57ffd5c50a9e5582a5df9aa68f43078ca62a9f6d0d6c70ba72eca72d0a574dbf177cf55cdca85a46f7eb474917a47ae5398c66f8b76f7d1c languageName: node linkType: hard @@ -9755,9 +9574,9 @@ __metadata: linkType: hard "bufio@npm:^1.0.7": - version: 1.2.1 - resolution: "bufio@npm:1.2.1" - checksum: 10/c8920ee0d765eb97d218643705346c3360ae6227414df7b3f345932531b85d18fe385d0740e1bcda6225fa082a179910679f444a6de5aec7aecd176a01e40573 + version: 1.2.2 + resolution: "bufio@npm:1.2.2" + checksum: 10/dcf0ab4f753a0af1c4215b41bd12596038d3111299673dd14aeee55206a6aa53b44292dc965cef0a41b008ddaeb38ccc9165f2d1cad0da5c8ba3754ef4b45aa1 languageName: node linkType: hard @@ -9881,7 +9700,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7": version: 1.0.7 resolution: "call-bind@npm:1.0.7" dependencies: @@ -9932,10 +9751,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001154, caniuse-lite@npm:^1.0.30001663": - version: 1.0.30001664 - resolution: "caniuse-lite@npm:1.0.30001664" - checksum: 10/ff237f6bbb59564d2a7219fe9a799a59692403115500f7548a77f1f6b82e33fd136375003f80c8df88a64048f699f9f917292ca4cac0dd8a789d2d35fba6269b +"caniuse-lite@npm:^1.0.30001154, caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001680 + resolution: "caniuse-lite@npm:1.0.30001680" + checksum: 10/38ec7e06e18ef1040740f93dff65dc4c9a7593376a783a96370f3845c586ed1d464e26b992d97919938fb07b68a4f2fb1609f66c586c3f1e7310e6511b81793f languageName: node linkType: hard @@ -9970,11 +9789,11 @@ __metadata: linkType: hard "cborg@npm:^4.0.0": - version: 4.2.4 - resolution: "cborg@npm:4.2.4" + version: 4.2.6 + resolution: "cborg@npm:4.2.6" bin: cborg: lib/bin.js - checksum: 10/b85fa8538f5c0575c511776555a58ba60ea10a56cdf19bd15d66d71e02215901f74536834eef28353f0a6dbbd13ac7335019b15041272a5288f4105b10a736ff + checksum: 10/56657cfdd42ff004f24fcf60973356245e6551ab87f710f58fc989d4225becd00f9d79e1ef21d57e37f4c08a988c5210443230eec72675c9fd73533d461e174d languageName: node linkType: hard @@ -10009,7 +9828,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.1, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.0.1, chalk@npm:^2.4.1": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -10446,7 +10265,7 @@ __metadata: languageName: node linkType: hard -"cookie-es@npm:^1.1.0": +"cookie-es@npm:^1.2.2": version: 1.2.2 resolution: "cookie-es@npm:1.2.2" checksum: 10/0fd742c11caa185928e450543f84df62d4b2c1fc7b5041196b57b7db04e1c6ac6585fb40e4f579a2819efefd2d6a9cbb4d17f71240d05f4dcd8f74ae81341a20 @@ -10460,10 +10279,10 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.6.0": - version: 0.6.0 - resolution: "cookie@npm:0.6.0" - checksum: 10/c1f8f2ea7d443b9331680598b0ae4e6af18a618c37606d1bbdc75bec8361cce09fe93e727059a673f2ba24467131a9fb5a4eec76bb1b149c1b3e1ccb268dc583 +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 10/aec6a6aa0781761bf55d60447d6be08861d381136a0fe94aa084fddd4f0300faa2b064df490c6798adfa1ebaef9e0af9b08a189c823e0811b8b313b3d9a03380 languageName: node linkType: hard @@ -10477,9 +10296,9 @@ __metadata: linkType: hard "core-js-pure@npm:^3.30.2": - version: 3.38.1 - resolution: "core-js-pure@npm:3.38.1" - checksum: 10/7dfd59bf3a09277056ac2ef87e49b49d77340952e99ee12b3e1e53bf7e1f34a8ee1fb6026f286b1ba29957f5728664430ccd1ff86983c7ae5fa411d4da74d3de + version: 3.39.0 + resolution: "core-js-pure@npm:3.39.0" + checksum: 10/43922b14f9c928ec958fc444e70cfb429a21e3f842f03f67810faf29a99780fec20dc688f65ab3780d2b8a2f1ae8287464ec5adb396826e0374a4f2907b4b383 languageName: node linkType: hard @@ -10491,9 +10310,9 @@ __metadata: linkType: hard "core-js@npm:^3.31.1": - version: 3.38.1 - resolution: "core-js@npm:3.38.1" - checksum: 10/3c25fdf0b2595ed37ceb305213a61e2cf26185f628455e99d1c736dda5f69e2de4de7126e6a1da136f54260c4fcc982c4215e37b5a618790a597930f854c0a37 + version: 3.39.0 + resolution: "core-js@npm:3.39.0" + checksum: 10/a3d34e669783dfc878e545f1983f60d9ff48a3867cd1d7ff8839b849e053002a208c7c14a5ca354b8e0b54982901e2f83dc87c3d9b95de0a94b4071d1c74e5f6 languageName: node linkType: hard @@ -10573,7 +10392,7 @@ __metadata: languageName: node linkType: hard -"create-ecdh@npm:^4.0.0": +"create-ecdh@npm:^4.0.4": version: 4.0.4 resolution: "create-ecdh@npm:4.0.4" dependencies: @@ -10622,7 +10441,7 @@ __metadata: languageName: node linkType: hard -"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": +"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": version: 1.1.7 resolution: "create-hmac@npm:1.1.7" dependencies: @@ -10662,44 +10481,42 @@ __metadata: linkType: hard "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" + version: 7.0.5 + resolution: "cross-spawn@npm:7.0.5" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10/e1a13869d2f57d974de0d9ef7acbf69dc6937db20b918525a01dacb5032129bd552d290d886d981e99f1b624cb03657084cc87bd40f115c07ecf376821c729ce + checksum: 10/c95062469d4bdbc1f099454d01c0e77177a3733012d41bf907a71eb8d22d2add43b5adf6a0a14ef4e7feaf804082714d6c262ef4557a1c480b86786c120d18e2 languageName: node linkType: hard -"crossws@npm:^0.2.4": - version: 0.2.4 - resolution: "crossws@npm:0.2.4" - peerDependencies: - uWebSockets.js: "*" - peerDependenciesMeta: - uWebSockets.js: - optional: true - checksum: 10/f8ece87d1737f370f2e4802d5423b24bbe9286dd6f3b0111d00beaf2d16879dc8d332cfc5e42312425a6f1a1010fb72a6e7d4af33fc4fa0c9c6547843d87fcb6 +"crossws@npm:>=0.2.0 <0.4.0": + version: 0.3.1 + resolution: "crossws@npm:0.3.1" + dependencies: + uncrypto: "npm:^0.1.3" + checksum: 10/d358a58b364b3314a0e42ee66b1432c01d416128e53eda983eb121abdad5ff39831a1f1ea3e90e80157ceaa0fc925f5193c151b156aa62af9e0c9bcb2fb2a15a languageName: node linkType: hard "crypto-browserify@npm:^3.11.0, crypto-browserify@npm:^3.12.0": - version: 3.12.0 - resolution: "crypto-browserify@npm:3.12.0" + version: 3.12.1 + resolution: "crypto-browserify@npm:3.12.1" dependencies: - browserify-cipher: "npm:^1.0.0" - browserify-sign: "npm:^4.0.0" - create-ecdh: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - create-hmac: "npm:^1.1.0" - diffie-hellman: "npm:^5.0.0" - inherits: "npm:^2.0.1" - pbkdf2: "npm:^3.0.3" - public-encrypt: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - randomfill: "npm:^1.0.3" - checksum: 10/5ab534474e24c8c3925bd1ec0de57c9022329cb267ca8437f1e3a7200278667c0bea0a51235030a9da3165c1885c73f51cfbece1eca31fd4a53cfea23f628c9b + browserify-cipher: "npm:^1.0.1" + browserify-sign: "npm:^4.2.3" + create-ecdh: "npm:^4.0.4" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + diffie-hellman: "npm:^5.0.3" + hash-base: "npm:~3.0.4" + inherits: "npm:^2.0.4" + pbkdf2: "npm:^3.1.2" + public-encrypt: "npm:^4.0.3" + randombytes: "npm:^2.1.0" + randomfill: "npm:^1.0.4" + checksum: 10/13da0b5f61b3e8e68fcbebf0394f2b2b4d35a0d0ba6ab762720c13391d3697ea42735260a26328a6a3d872be7d4cb5abe98a7a8f88bc93da7ba59b993331b409 languageName: node linkType: hard @@ -11245,7 +11062,7 @@ __metadata: languageName: node linkType: hard -"diffie-hellman@npm:^5.0.0": +"diffie-hellman@npm:^5.0.3": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" dependencies: @@ -11388,9 +11205,9 @@ __metadata: linkType: hard "dompurify@npm:^3.0.2": - version: 3.1.7 - resolution: "dompurify@npm:3.1.7" - checksum: 10/dc637a064306f83cf911caa267ffe1f973552047602020e3b6723c90f67962813edf8a65a0b62e8c9bc13fcd173a2691212a3719bc116226967f46bcd6181277 + version: 3.2.0 + resolution: "dompurify@npm:3.2.0" + checksum: 10/d9139fdc69e95efe43d154362216a9a6768c3a238b02b988a7ac0ddd044a992422d6c5fae5b319ab47aef8465824a815d104b843800b294352657f70d5168bfa languageName: node linkType: hard @@ -11538,10 +11355,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.3.585, electron-to-chromium@npm:^1.5.28": - version: 1.5.29 - resolution: "electron-to-chromium@npm:1.5.29" - checksum: 10/a87354db605ffdb89618c328ecc492846f8685f5ba040b9c8b511ef7a1a8e0c8999eb1ce2ea7bac30624637200f31dd1da5dc0cb3b2841ea828790f894a9ec37 +"electron-to-chromium@npm:^1.3.585, electron-to-chromium@npm:^1.5.41": + version: 1.5.57 + resolution: "electron-to-chromium@npm:1.5.57" + checksum: 10/7a365a20ce0a36a5688958d295440fe9515465c8d43841d7e6c3f822e2e04a655b5e98d29f1613f4ca8fb3f522944bcedf5486a35bd943db08a648611df29a24 languageName: node linkType: hard @@ -11590,9 +11407,24 @@ __metadata: languageName: node linkType: hard +"elliptic@npm:6.6.0": + version: 6.6.0 + resolution: "elliptic@npm:6.6.0" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 10/27575b0403e010e5d7e7a131fcadce6a7dd1ae82ccb24cc7c20b275d32ab1cb7ecb6a070225795df08407441dc8c7a32efd986596d48d1d6846f64ff8f094af7 + languageName: node + linkType: hard + "elliptic@npm:^6.4.0, elliptic@npm:^6.4.1, elliptic@npm:^6.5.2, elliptic@npm:^6.5.3, elliptic@npm:^6.5.4, elliptic@npm:^6.5.5, elliptic@npm:^6.5.7": - version: 6.5.7 - resolution: "elliptic@npm:6.5.7" + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" dependencies: bn.js: "npm:^4.11.9" brorand: "npm:^1.1.0" @@ -11601,7 +11433,7 @@ __metadata: inherits: "npm:^2.0.4" minimalistic-assert: "npm:^1.0.1" minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10/fbad1fad0a5cc07df83f80cc1f7a784247ef59075194d3e340eaeb2f4dd594825ee24c7e9b0cf279c9f1982efe610503bb3139737926428c4821d4fca1bcf348 + checksum: 10/dc678c9febd89a219c4008ba3a9abb82237be853d9fd171cd602c8fb5ec39927e65c6b5e7a1b2a4ea82ee8e0ded72275e7932bb2da04a5790c2638b818e4e1c5 languageName: node linkType: hard @@ -11613,30 +11445,30 @@ __metadata: linkType: hard "embla-carousel-react@npm:^8.1.6": - version: 8.3.0 - resolution: "embla-carousel-react@npm:8.3.0" + version: 8.3.1 + resolution: "embla-carousel-react@npm:8.3.1" dependencies: - embla-carousel: "npm:8.3.0" - embla-carousel-reactive-utils: "npm:8.3.0" + embla-carousel: "npm:8.3.1" + embla-carousel-reactive-utils: "npm:8.3.1" peerDependencies: - react: ^16.8.0 || ^17.0.1 || ^18.0.0 - checksum: 10/48b71504208741d051f09d26ec7925c4470c0c7b9dce1275079d1ab1a32f7892456b953df2836f1be7555061aaac595509d78ab12c0e1370dd7f77df682639f6 + react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + checksum: 10/24e1bed7298d458d0bb61b9f1f6f2e7645be85816861d3a3598ce6af4961fee2a61f45bb1d3fc78fca95a16518c2dd139b6de9c25bf9c13ab435af646715f595 languageName: node linkType: hard -"embla-carousel-reactive-utils@npm:8.3.0": - version: 8.3.0 - resolution: "embla-carousel-reactive-utils@npm:8.3.0" +"embla-carousel-reactive-utils@npm:8.3.1": + version: 8.3.1 + resolution: "embla-carousel-reactive-utils@npm:8.3.1" peerDependencies: - embla-carousel: 8.3.0 - checksum: 10/8d1db9a65455dbbee4de7e163c470b2a7552dee13153e95c8754d37389e29dbd03b9a7b11018c84ed59b4db616846cf39de8ea828f50945ab9ea1e99fe9e7289 + embla-carousel: 8.3.1 + checksum: 10/279c6ea265fd34acc524036985e36cc869e9500f4a557fa13a3a354c78ecc55cf0e0b814ce40a035bcc78bfce0aa049bf965675cb0cafb18aad72049615363e2 languageName: node linkType: hard -"embla-carousel@npm:8.3.0": - version: 8.3.0 - resolution: "embla-carousel@npm:8.3.0" - checksum: 10/939db8fbe604f1d46a1c3150bf8be7f5a566924e426a02762c0c97dcf474973fdb128a113d96a57e953753657fb69298f31247e7dfbc4d820fbb691c54502249 +"embla-carousel@npm:8.3.1": + version: 8.3.1 + resolution: "embla-carousel@npm:8.3.1" + checksum: 10/fd5e0960563909012428fb0e562773a56c40209e94b9adf2d8823dad04154c620d400232c89a8b4fdaebed1b81976b81a1f7227233e539a9552bdba86473a7b5 languageName: node linkType: hard @@ -11728,15 +11560,15 @@ __metadata: linkType: hard "engine.io-client@npm:~6.6.1": - version: 6.6.1 - resolution: "engine.io-client@npm:6.6.1" + version: 6.6.2 + resolution: "engine.io-client@npm:6.6.2" 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/9346c3ee60ebb7a58966e927e479b8b3c5d6bc82788ad5efc38b976c4a3b2b27420d08cb29b84de8213004d49bdeed47ecd473b427498e54301a8853cd85e0c9 + checksum: 10/c006b3389bb8bd0381926b9633e9f547dec187ea28d2dd99cb42d516b0720bc4373f3f937c199ca616c95b2832e0f547f73326f614caedfe39c02fa93b7ac733 languageName: node linkType: hard @@ -12169,11 +12001,11 @@ __metadata: linkType: hard "eslint-plugin-react-refresh@npm:^0.4.6": - version: 0.4.12 - resolution: "eslint-plugin-react-refresh@npm:0.4.12" + version: 0.4.14 + resolution: "eslint-plugin-react-refresh@npm:0.4.14" peerDependencies: eslint: ">=7" - checksum: 10/448d0a387ca4d7913534ac7bee3e7b8708236a6cef4cccf9a50e739d6d3c8d236cdbd7e360ea643c7767092a93acf30a8e5fac91f05b175c45d20ce138947bcc + checksum: 10/295ddf50cbe03187133f855f76baf88c92ce487971cdbc0ab33e037dc5d3d187fe2f809633eaa94da2769859963664b8c5b745db4812c644a1c535fe8823a045 languageName: node linkType: hard @@ -12197,7 +12029,7 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b @@ -12690,15 +12522,15 @@ __metadata: linkType: hard "express@npm:^4.14.0": - version: 4.21.0 - resolution: "express@npm:4.21.0" + version: 4.21.1 + resolution: "express@npm:4.21.1" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" body-parser: "npm:1.20.3" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" - cookie: "npm:0.6.0" + cookie: "npm:0.7.1" cookie-signature: "npm:1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" @@ -12724,7 +12556,7 @@ __metadata: type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10/3b1ee5bc5b1bd996f688702519cebc9b63a24e506965f6e1773268238cfa2c24ffdb38cc3fcb4fde66f77de1c0bebd9ee058dad06bb9c6f084b525f3c09164d3 + checksum: 10/5d4a36dd03c1d1cce93172e9b185b5cd13a978d29ee03adc51cd278be7b4a514ae2b63e2fdaec0c00fdc95c6cfb396d9dd1da147917ffd337d6cd0778e08c9bc languageName: node linkType: hard @@ -12837,9 +12669,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.2 - resolution: "fast-uri@npm:3.0.2" - checksum: 10/99224f0198e24a4072b9a8a25fc5fa553aa0153e00d29d41272096a6d97be417c9faa5978682868cbba46b09066dc9348563c7244057f3818067e7737db153b2 + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 10/92487c75848b03edc45517fca0148287d342c30818ce43d556391db774d8e01644fb6964315a3336eec5a90f301b218b21f71fb9b2528ba25757435a20392c95 languageName: node linkType: hard @@ -12992,28 +12824,29 @@ __metadata: linkType: hard "firebase@npm:^10.12.2": - version: 10.13.2 - resolution: "firebase@npm:10.13.2" + version: 10.14.1 + resolution: "firebase@npm:10.14.1" dependencies: "@firebase/analytics": "npm:0.10.8" "@firebase/analytics-compat": "npm:0.2.14" - "@firebase/app": "npm:0.10.11" + "@firebase/app": "npm:0.10.13" "@firebase/app-check": "npm:0.8.8" "@firebase/app-check-compat": "npm:0.3.15" - "@firebase/app-compat": "npm:0.2.41" + "@firebase/app-compat": "npm:0.2.43" "@firebase/app-types": "npm:0.9.2" "@firebase/auth": "npm:1.7.9" "@firebase/auth-compat": "npm:0.5.14" + "@firebase/data-connect": "npm:0.1.0" "@firebase/database": "npm:1.0.8" "@firebase/database-compat": "npm:1.0.8" - "@firebase/firestore": "npm:4.7.2" - "@firebase/firestore-compat": "npm:0.3.37" + "@firebase/firestore": "npm:4.7.3" + "@firebase/firestore-compat": "npm:0.3.38" "@firebase/functions": "npm:0.11.8" "@firebase/functions-compat": "npm:0.3.14" "@firebase/installations": "npm:0.6.9" "@firebase/installations-compat": "npm:0.2.9" - "@firebase/messaging": "npm:0.12.11" - "@firebase/messaging-compat": "npm:0.2.11" + "@firebase/messaging": "npm:0.12.12" + "@firebase/messaging-compat": "npm:0.2.12" "@firebase/performance": "npm:0.6.9" "@firebase/performance-compat": "npm:0.2.9" "@firebase/remote-config": "npm:0.4.9" @@ -13022,7 +12855,7 @@ __metadata: "@firebase/storage-compat": "npm:0.3.12" "@firebase/util": "npm:1.10.0" "@firebase/vertexai-preview": "npm:0.0.4" - checksum: 10/c91a047b34f3e2a0b0f563a4b9b4aca4887c0052f82819384acc482c1523c83c108d47eb8a96aa2adce94e07d0f9eeabbd7fd4d2b4fde1e2706fb90a6aea2db1 + checksum: 10/1b2fd7b653f632d2bb0cf3b87e7eda0ae69d28b702a7de00d2a166c7985b8747ef9d15f7ac151847d242f91a1cb08c689d0a07197e8b80561ff1a679398bf9f8 languageName: node linkType: hard @@ -13102,24 +12935,24 @@ __metadata: linkType: hard "form-data@npm:^3.0.0": - version: 3.0.1 - resolution: "form-data@npm:3.0.1" + version: 3.0.2 + resolution: "form-data@npm:3.0.2" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" mime-types: "npm:^2.1.12" - checksum: 10/944b40ff63b9cb1ca7a97e70f72104c548e0b0263e3e817e49919015a0d687453086259b93005389896dbffd3777cccea2e67c51f4e827590e5979b14ff91bf7 + checksum: 10/b8d71d7149de5881c6c8ac75c03ac2e809b1b729399320cc41f59a63043fa34b95dfef5259212d6d902abb4916af48a7ca60ad5c035806ba8e3c7843dbaf3057 languageName: node linkType: hard "form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" + version: 4.0.1 + resolution: "form-data@npm:4.0.1" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" mime-types: "npm:^2.1.12" - checksum: 10/7264aa760a8cf09482816d8300f1b6e2423de1b02bba612a136857413fdc96d7178298ced106817655facc6b89036c6e12ae31c9eb5bdc16aabf502ae8a5d805 + checksum: 10/6adb1cff557328bc6eb8a68da205f9ae44ab0e88d4d9237aaf91eed591ffc64f77411efb9016af7d87f23d0a038c45a788aa1c6634e51175c4efa36c2bc53774 languageName: node linkType: hard @@ -13622,21 +13455,21 @@ __metadata: languageName: node linkType: hard -"h3@npm:^1.12.0": - version: 1.12.0 - resolution: "h3@npm:1.12.0" +"h3@npm:^1.12.0, h3@npm:^1.13.0": + version: 1.13.0 + resolution: "h3@npm:1.13.0" dependencies: - cookie-es: "npm:^1.1.0" - crossws: "npm:^0.2.4" + cookie-es: "npm:^1.2.2" + crossws: "npm:>=0.2.0 <0.4.0" defu: "npm:^6.1.4" destr: "npm:^2.0.3" - iron-webcrypto: "npm:^1.1.1" - ohash: "npm:^1.1.3" + iron-webcrypto: "npm:^1.2.1" + ohash: "npm:^1.1.4" radix3: "npm:^1.1.2" - ufo: "npm:^1.5.3" + ufo: "npm:^1.5.4" uncrypto: "npm:^0.1.3" - unenv: "npm:^1.9.0" - checksum: 10/59c7a3818e863c84a32110cf4ee26ac6deb39b99527c483e56c4334b1cadb77ffca2895472b7af227a205757a5b27da43b73a057cb113b7769547062ace89cc7 + unenv: "npm:^1.10.0" + checksum: 10/ecdbe3cdddc767ea6f9be9939b14192dd296eb434641bbecc5b665f7210de8c03910ae40931668788395b5de6cd517afaa628d7b5ce0fb60786fce1ad6e81bcb languageName: node linkType: hard @@ -13732,7 +13565,7 @@ __metadata: languageName: node linkType: hard -"hash-base@npm:~3.0": +"hash-base@npm:~3.0, hash-base@npm:~3.0.4": version: 3.0.4 resolution: "hash-base@npm:3.0.4" dependencies: @@ -13819,10 +13652,17 @@ __metadata: languageName: node linkType: hard +"highlightjs-vue@npm:^1.0.0": + version: 1.0.0 + resolution: "highlightjs-vue@npm:1.0.0" + checksum: 10/44c9187a19fa3c7eac16bf1d327c03cb07c4b444f744624eaf873eb55e4e449a0bb6573b8ba5982006b65743707d6cad39cfc404f3fe5fb8aeb740a57ff6bc24 + languageName: node + linkType: hard + "hls.js@npm:^1.4.12": - version: 1.5.15 - resolution: "hls.js@npm:1.5.15" - checksum: 10/58dd5c70e233a3d66ebba9f55bfbe6673ac9d941d391afd896d44e7a141cba931fd25c392133c13f65fbd82e85e1575ada68a2722d1da38b6ad7b9b6a93a6a6b + version: 1.5.17 + resolution: "hls.js@npm:1.5.17" + checksum: 10/8d6fa42a2c1a6ba66a8ccefda806d7a1aedcbe718224f3c7444fc80472c95a75cde439c8c16c6a65d43062347841fa68562e496d27dd74779fe68925d7d296a5 languageName: node linkType: hard @@ -14494,7 +14334,7 @@ __metadata: languageName: node linkType: hard -"iron-webcrypto@npm:^1.1.1": +"iron-webcrypto@npm:^1.2.1": version: 1.2.1 resolution: "iron-webcrypto@npm:1.2.1" checksum: 10/c1f52ccfe2780efa5438c134538ee4b26c96a87d22f351d896781219efbce25b4fe716d1cb7f248e02da96881760541135acbcc7c0622ffedf71cb0e227bebf9 @@ -15198,12 +15038,12 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^2.0.0": - version: 2.0.0 - resolution: "jiti@npm:2.0.0" +"jiti@npm:^2.1.2": + version: 2.4.0 + resolution: "jiti@npm:2.4.0" bin: jiti: lib/jiti-cli.mjs - checksum: 10/2fdb08483c7beb1f75449b721bc0273d3eeb9008d2a3031ed24437c0e6b599813d6b531d5380331396df6f52db16f5a1c7657bfaeecee19d2e07e6f7753e7fa1 + checksum: 10/10aa999a4f9bccc82b1dab9ebaf4484a8770450883c1bf7fafc07f8fca1e417fd8e7731e651337d1060c9e2ff3f97362dcdfd27e86d1f385db97f4adf7b5a21d languageName: node linkType: hard @@ -15358,15 +15198,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10/d2096abdcdec56969764b40ffc91d4a23408aa2f351b4d1c13f736f25476643238c43fdbaf38a191c26b1b78fd856d965f5d4d0dde7b89459cd94025190cdf13 - languageName: node - linkType: hard - "jsesc@npm:^3.0.2": version: 3.0.2 resolution: "jsesc@npm:3.0.2" @@ -15791,21 +15622,21 @@ __metadata: languageName: node linkType: hard -"listhen@npm:^1.7.2": - version: 1.8.0 - resolution: "listhen@npm:1.8.0" +"listhen@npm:^1.9.0": + version: 1.9.0 + resolution: "listhen@npm:1.9.0" dependencies: "@parcel/watcher": "npm:^2.4.1" "@parcel/watcher-wasm": "npm:^2.4.1" citty: "npm:^0.1.6" clipboardy: "npm:^4.0.0" consola: "npm:^3.2.3" - crossws: "npm:^0.2.4" + crossws: "npm:>=0.2.0 <0.4.0" defu: "npm:^6.1.4" get-port-please: "npm:^3.1.2" h3: "npm:^1.12.0" http-shutdown: "npm:^1.2.2" - jiti: "npm:^2.0.0" + jiti: "npm:^2.1.2" mlly: "npm:^1.7.1" node-forge: "npm:^1.3.1" pathe: "npm:^1.1.2" @@ -15816,7 +15647,7 @@ __metadata: bin: listen: bin/listhen.mjs listhen: bin/listhen.mjs - checksum: 10/79fba7a69c971fbd67226b52f44367e9bd3a2e587dce3df620509ca101d7c5e7cb2ac386a669dedf353831a6ea61279764082f6160bf8f789a14662444baa24b + checksum: 10/72b869c8604301352c5d5825a7737705f0df2ce1795af8e779b6f956ba71302e13b12b2d35142687fb4e1e8ccc2747e2be3c9cbf20f7f96b73f897881aa3c384 languageName: node linkType: hard @@ -16072,7 +15903,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.11, lodash@npm:^4.17.21": +"lodash@npm:4.17.21, lodash@npm:^4.17.11, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 @@ -16216,11 +16047,11 @@ __metadata: linkType: hard "magic-string@npm:^0.30.11, magic-string@npm:^0.30.3": - version: 0.30.11 - resolution: "magic-string@npm:0.30.11" + version: 0.30.12 + resolution: "magic-string@npm:0.30.12" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10/b784d2240252f5b1e755d487354ada4c672cbca16f045144f7185a75b059210e5fcca7be7be03ef1bac2ca754c4428b21d36ae64a9057ba429916f06b8c54eb2 + checksum: 10/98016180a52b28efc1362152b45671067facccdaead6b70c1c14c566cba98491bc2e1336474b0996397730dca24400e85649da84d3da62b2560ed03c067573e6 languageName: node linkType: hard @@ -16681,14 +16512,14 @@ __metadata: linkType: hard "mlly@npm:^1.7.1, mlly@npm:^1.7.2": - version: 1.7.2 - resolution: "mlly@npm:1.7.2" + version: 1.7.3 + resolution: "mlly@npm:1.7.3" dependencies: - acorn: "npm:^8.12.1" + acorn: "npm:^8.14.0" pathe: "npm:^1.1.2" - pkg-types: "npm:^1.2.0" + pkg-types: "npm:^1.2.1" ufo: "npm:^1.5.4" - checksum: 10/c28e9f32cfc7b204e4d089a9af01b6af30547f39dd97244486fe208523c1453828b694430ebfa2d06297116861d464f150d3273040bf5e11ef5a357958f142d5 + checksum: 10/77921e4b37f48e939b9879dbf3d3734086a69a97ddfe9adc5ae7b026ee2f73a0bcac4511c6c645cee79ccc2852c24b83f93bfd29ada7a7a3259cb943569fc7f6 languageName: node linkType: hard @@ -16729,7 +16560,7 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.1.0, mri@npm:^1.2.0": +"mri@npm:^1.1.0": version: 1.2.0 resolution: "mri@npm:1.2.0" checksum: 10/6775a1d2228bb9d191ead4efc220bd6be64f943ad3afd4dcb3b3ac8fc7b87034443f666e38805df38e8d047b29f910c3cc7810da0109af83e42c82c73bd3f6bc @@ -16899,9 +16730,9 @@ __metadata: linkType: hard "multiformats@npm:^13.0.0, multiformats@npm:^13.1.0": - version: 13.3.0 - resolution: "multiformats@npm:13.3.0" - checksum: 10/59c75b08f54593e355b3a5b35e8693f9e3b7f04b860cf6e39aca2d2245073c8ebfdfa31ca9ee1a08fdaffdc737476484cf509f632d28048127baa962b70d23d8 + version: 13.3.1 + resolution: "multiformats@npm:13.3.1" + checksum: 10/2e529613d457590dffe212a658546f313c7c7296d240d952d2baee7ce0abb227116d784f05cf4d238ef0db7d72ad2c3d04ea3c6b9bfd20db805a092024ce8d7e languageName: node linkType: hard @@ -17011,11 +16842,11 @@ __metadata: linkType: hard "nan@npm:^2.14.0, nan@npm:^2.14.2": - version: 2.20.0 - resolution: "nan@npm:2.20.0" + version: 2.22.0 + resolution: "nan@npm:2.22.0" dependencies: node-gyp: "npm:latest" - checksum: 10/5f16e4c9953075d9920229c703c1d781c0b74118ce3d9e926b448a4eef92b7d8be5ac6adc748a13a5fafb594436cbfe63250e3471aefdd78e3a0cd14603b9ba7 + checksum: 10/ab165ba910e549fcc21fd561a33f534d86e81ae36c97b1019dcfe506b09692ff867c97794a54b49c9a83b8b485f529f0f58d24966c3a11863c97dc70814f4d50 languageName: node linkType: hard @@ -17161,13 +16992,20 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 10/2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 languageName: node linkType: hard +"negotiator@npm:^0.6.3": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10/d98c04a136583afd055746168f1067d58ce4bfe6e4c73ca1d339567f81ea1f7e665b5bd1e81f4771c67b6c2ea89b21cb2adaea2b16058c7dc31317778f931dab + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -17201,6 +17039,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10/595f59ffb4630564f587c502119cbd980d302e482781021f3b479f5fc7e41cf8f2f7280fdc2795f32d148e4f3259bd15043c52d4a3442796aa6f1ae97b959636 + languageName: node + linkType: hard + "node-addon-api@npm:^7.0.0": version: 7.1.1 resolution: "node-addon-api@npm:7.1.1" @@ -17255,13 +17102,13 @@ __metadata: linkType: hard "node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.3.0": - version: 4.8.2 - resolution: "node-gyp-build@npm:4.8.2" + version: 4.8.3 + resolution: "node-gyp-build@npm:4.8.3" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 10/e3a365eed7a2d950864a1daa34527588c16fe43ae189d0aeb8fd1dfec91ba42a0e1b499322bff86c2832029fec4f5901bf26e32005e1e17a781dcd5177b6a657 + checksum: 10/4cdc07c940bc1ae484d4d62b0627c80bfb5018e597f2c68c0a7a80b17e9b9cef9d566ec52150ff6f867dd42788eff97a3bcf5cb5b4679ef74954b2df2ac57c02 languageName: node linkType: hard @@ -17435,9 +17282,9 @@ __metadata: linkType: hard "object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 10/7ef65583b6397570a17c56f0c1841e0920e83900f2c94638927abb7b81ac08a19c7aae135bd9dcca96208cac0c7332b4650fb927f027b0cf92d71df2990d0561 + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: 10/14cb973d8381c69e14d7f1c8c75044eb4caf04c6dabcf40ca5c2ce42dc2073ae0bb2a9939eeca142b0c05215afaa1cd5534adb7c8879c32cba2576e045ed8368 languageName: node linkType: hard @@ -17486,18 +17333,18 @@ __metadata: languageName: node linkType: hard -"ofetch@npm:^1.3.4": - version: 1.4.0 - resolution: "ofetch@npm:1.4.0" +"ofetch@npm:^1.4.1": + version: 1.4.1 + resolution: "ofetch@npm:1.4.1" dependencies: destr: "npm:^2.0.3" node-fetch-native: "npm:^1.6.4" ufo: "npm:^1.5.4" - checksum: 10/92af33cfb35879314c0ecdd9c15b814fd3a7dc31dbae1032492fa42767bb1afe6f2a7faa179b2c2a4482d4b30c87671ddb043bcccde7ada7499b10e5caf2eb51 + checksum: 10/329ecd5595eff6da090c728e66f4223ad7ba5c2c309446f3707245c1b213da47dfd1eb1740f26b3da9e31ed7b7a903733bdaae85187b714514da865a0c5a4a9c languageName: node linkType: hard -"ohash@npm:^1.1.3": +"ohash@npm:^1.1.4": version: 1.1.4 resolution: "ohash@npm:1.1.4" checksum: 10/b11445234e59c9c2b00f357f8f00b6ba00e14c84fc0a232cdc14eb1d80066479b09d27af0201631e84b7a15ba7c4a1939f4cc47f2030e9bf83c9e8afc3ff7dfd @@ -17697,9 +17544,9 @@ __metadata: linkType: hard "p-timeout@npm:^6.1.2": - version: 6.1.2 - resolution: "p-timeout@npm:6.1.2" - checksum: 10/ca3ede368d792bd86fcfa4e133220536382225d31e5f62e2cedb8280df267b25f6684aa0056b22e8aa538cc85014b310058d8fdddeb0a1ff363093d56e87ac3a + version: 6.1.3 + resolution: "p-timeout@npm:6.1.3" + checksum: 10/f4ecc8986323a156f80ec5d13b46f644a7fc1dc31bf840d499c24c95528448203b20040e02c2fe19d5f50b8fcf955636adccec551e83ad7c95cc35c235361dcd languageName: node linkType: hard @@ -17905,7 +17752,7 @@ __metadata: languageName: node linkType: hard -"pbkdf2@npm:^3.0.17, pbkdf2@npm:^3.0.3, pbkdf2@npm:^3.1.1, pbkdf2@npm:^3.1.2": +"pbkdf2@npm:^3.0.17, pbkdf2@npm:^3.1.1, pbkdf2@npm:^3.1.2": version: 3.1.2 resolution: "pbkdf2@npm:3.1.2" dependencies: @@ -18007,10 +17854,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: 10/a2ad60d94d185c30f2a140b19c512547713fb89b920d32cc6cf658fa786d63a37ba7b8451872c3d9fc34883971fb6e5878e07a20b60506e0bb2554dce9169ccb +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard @@ -18021,6 +17868,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10/ce617b8da36797d09c0baacb96ca8a44460452c89362d7cb8f70ca46b4158ba8bc3606912de7c818eb4a939f7f9015cef3c766ec8a0c6bfc725fdc078e39c717 + languageName: node + linkType: hard + "pino-abstract-transport@npm:v0.5.0": version: 0.5.0 resolution: "pino-abstract-transport@npm:0.5.0" @@ -18079,7 +17933,7 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.2.0": +"pkg-types@npm:^1.2.1": version: 1.2.1 resolution: "pkg-types@npm:1.2.1" dependencies: @@ -18162,20 +18016,20 @@ __metadata: linkType: hard "postcss@npm:^8.4.43, postcss@npm:^8.4.47": - version: 8.4.47 - resolution: "postcss@npm:8.4.47" + version: 8.4.49 + resolution: "postcss@npm:8.4.49" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10/f2b50ba9b6fcb795232b6bb20de7cdc538c0025989a8ed9c4438d1960196ba3b7eaff41fdb1a5c701b3504651ea87aeb685577707f0ae4d6ce6f3eae5df79a81 + checksum: 10/28fe1005b1339870e0a5006375ba5ac1213fd69800f79e7db09c398e074421ba6e162898e94f64942fed554037fd292db3811d87835d25ab5ef7f3c9daacb6ca languageName: node linkType: hard "preact@npm:^10.16.0": - version: 10.24.1 - resolution: "preact@npm:10.24.1" - checksum: 10/44084b7c1e044a76299c9d78f5ff8b60dbe94058e819c5e81d3587f80a90d7e497a52c63ffa31e56e844c54dee322ef919d3fd5d20688a37314250c06ca85f8b + version: 10.24.3 + resolution: "preact@npm:10.24.3" + checksum: 10/e9c4c901a4ddd475a1072355b5c6c944b05797445e0d68f317ad0dbc976b831523573693ea75d2e12e7902042e3729af435377816d25558bf693ecf6b516c707 languageName: node linkType: hard @@ -18406,13 +18260,15 @@ __metadata: linkType: hard "psl@npm:^1.1.28": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 10/d07879d4bfd0ac74796306a8e5a36a93cfb9c4f4e8ee8e63fbb909066c192fe1008cd8f12abd8ba2f62ca28247949a20c8fb32e1d18831d9e71285a1569720f9 + version: 1.10.0 + resolution: "psl@npm:1.10.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10/17b493648cc16e32c41681a4648db0c7235fbe83c78b0789b519aaccd1240fe739f9a5f4c4b55cb9e3094190ddf16e38f34f5ada179d518593ded42c957bdd8b languageName: node linkType: hard -"public-encrypt@npm:^4.0.0": +"public-encrypt@npm:^4.0.3": version: 4.0.3 resolution: "public-encrypt@npm:4.0.3" dependencies: @@ -18467,7 +18323,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 @@ -18771,7 +18627,7 @@ __metadata: languageName: node linkType: hard -"randomfill@npm:^1.0.3": +"randomfill@npm:^1.0.4": version: 1.0.4 resolution: "randomfill@npm:1.0.4" dependencies: @@ -19224,7 +19080,7 @@ __metadata: languageName: node linkType: hard -"react-remove-scroll-bar@npm:^2.3.3, react-remove-scroll-bar@npm:^2.3.4": +"react-remove-scroll-bar@npm:^2.3.3, react-remove-scroll-bar@npm:^2.3.6": version: 2.3.6 resolution: "react-remove-scroll-bar@npm:2.3.6" dependencies: @@ -19259,11 +19115,11 @@ __metadata: languageName: node linkType: hard -"react-remove-scroll@npm:2.5.7": - version: 2.5.7 - resolution: "react-remove-scroll@npm:2.5.7" +"react-remove-scroll@npm:2.6.0": + version: 2.6.0 + resolution: "react-remove-scroll@npm:2.6.0" dependencies: - react-remove-scroll-bar: "npm:^2.3.4" + react-remove-scroll-bar: "npm:^2.3.6" react-style-singleton: "npm:^2.2.1" tslib: "npm:^2.1.0" use-callback-ref: "npm:^1.3.0" @@ -19274,31 +19130,31 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/a1285d118e734855be6a1cf6c83a2ee39d8c5a5c3c336a1e9b80ab571326669bf39a52607f1889337c559c18b9e5fd5a0772fa82f748de3fcfe114ee6f772cc6 + checksum: 10/9fac79e1c2ed2c85729bfe82f61ef4ae5ce51f478736a13892a9a11e05cbd4e9599f9f0e012cb5fc0719e18dc1dd687ab61f516193228615df636db8b851245e languageName: node linkType: hard "react-router-dom@npm:^6.9.0": - version: 6.26.2 - resolution: "react-router-dom@npm:6.26.2" + version: 6.28.0 + resolution: "react-router-dom@npm:6.28.0" dependencies: - "@remix-run/router": "npm:1.19.2" - react-router: "npm:6.26.2" + "@remix-run/router": "npm:1.21.0" + react-router: "npm:6.28.0" peerDependencies: react: ">=16.8" react-dom: ">=16.8" - checksum: 10/4eee37839bd1a660807c090b4d272e4aa9b95d8a9a932cdcdf7c5b10735f39b6db73bad79b08a3012386a7e225ff6bf60435e2741fb7c68e137ac5a6295d4308 + checksum: 10/e637825132ea96c3514ef7b8322f9bf0b752a942d6b4ffc4c20e389b5911726adf3dba8208ed4b97bf5b9c3bd465d9d1a1db1a58a610a8d528f18d890e0b143f languageName: node linkType: hard -"react-router@npm:6.26.2": - version: 6.26.2 - resolution: "react-router@npm:6.26.2" +"react-router@npm:6.28.0": + version: 6.28.0 + resolution: "react-router@npm:6.28.0" dependencies: - "@remix-run/router": "npm:1.19.2" + "@remix-run/router": "npm:1.21.0" peerDependencies: react: ">=16.8" - checksum: 10/496e855b53e61066c1791e354f5d79eab56a128d9722fdc6486c3ecd3b3a0bf9968e927028f429893b157f3cc10fc09e890a055847723ee242663e7995fedc9d + checksum: 10/f021a644513144884a567d9c2dcc432e8e3233f931378c219c5a3b5b842340f0faca86225a708bafca1e9010965afe1a7dada28aef5b7b6138c885c0552d9a7d languageName: node linkType: hard @@ -19372,17 +19228,18 @@ __metadata: linkType: hard "react-syntax-highlighter@npm:^15.5.0": - version: 15.5.0 - resolution: "react-syntax-highlighter@npm:15.5.0" + version: 15.6.1 + resolution: "react-syntax-highlighter@npm:15.6.1" dependencies: "@babel/runtime": "npm:^7.3.1" highlight.js: "npm:^10.4.1" + highlightjs-vue: "npm:^1.0.0" lowlight: "npm:^1.17.0" prismjs: "npm:^1.27.0" refractor: "npm:^3.6.0" peerDependencies: react: ">= 0.14.0" - checksum: 10/14291a92672a79cf167e6cf2dba2547b920c24573729a95ae24035bece43f7e00e3429477be7b87455e8ce018682c8992545c405a915421eb772c5cd07c00576 + checksum: 10/9a89c81f7dcc109b038dc2a73189fa1ea916e6485d8a39856ab3d01d2c753449b5ae1c0df9c9ee0ed5c8c9808a68422b19af9a168ec091a274bddc7ad092eb86 languageName: node linkType: hard @@ -19726,14 +19583,14 @@ __metadata: linkType: hard "regexp.prototype.flags@npm:^1.5.1": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" + version: 1.5.3 + resolution: "regexp.prototype.flags@npm:1.5.3" dependencies: - call-bind: "npm:^1.0.6" + call-bind: "npm:^1.0.7" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 10/9fffc01da9c4e12670ff95bc5204364615fcc12d86fc30642765af908675678ebb0780883c874b2dbd184505fb52fa603d80073ecf69f461ce7f56b15d10be9c + set-function-name: "npm:^2.0.2" + checksum: 10/fe17bc4eebbc72945aaf9dd059eb7784a5ca453a67cc4b5b3e399ab08452c9a05befd92063e2c52e7b24d9238c60031656af32dd57c555d1ba6330dbf8c23b43 languageName: node linkType: hard @@ -19958,25 +19815,27 @@ __metadata: linkType: hard "rollup@npm:^4.20.0": - version: 4.22.5 - resolution: "rollup@npm:4.22.5" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.22.5" - "@rollup/rollup-android-arm64": "npm:4.22.5" - "@rollup/rollup-darwin-arm64": "npm:4.22.5" - "@rollup/rollup-darwin-x64": "npm:4.22.5" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.22.5" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.22.5" - "@rollup/rollup-linux-arm64-gnu": "npm:4.22.5" - "@rollup/rollup-linux-arm64-musl": "npm:4.22.5" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.22.5" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.22.5" - "@rollup/rollup-linux-s390x-gnu": "npm:4.22.5" - "@rollup/rollup-linux-x64-gnu": "npm:4.22.5" - "@rollup/rollup-linux-x64-musl": "npm:4.22.5" - "@rollup/rollup-win32-arm64-msvc": "npm:4.22.5" - "@rollup/rollup-win32-ia32-msvc": "npm:4.22.5" - "@rollup/rollup-win32-x64-msvc": "npm:4.22.5" + version: 4.26.0 + resolution: "rollup@npm:4.26.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.26.0" + "@rollup/rollup-android-arm64": "npm:4.26.0" + "@rollup/rollup-darwin-arm64": "npm:4.26.0" + "@rollup/rollup-darwin-x64": "npm:4.26.0" + "@rollup/rollup-freebsd-arm64": "npm:4.26.0" + "@rollup/rollup-freebsd-x64": "npm:4.26.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.26.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.26.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.26.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.26.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.26.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.26.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.26.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.26.0" + "@rollup/rollup-linux-x64-musl": "npm:4.26.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.26.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.26.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.26.0" "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -19988,6 +19847,10 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true "@rollup/rollup-linux-arm-musleabihf": @@ -20016,7 +19879,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/f34812fa982442ab71410b649630c24434b2dc02485e543607734766eb7211ce7e0a79102f27210f337af00f3617006adebb4f87fb2e9d24cac7100d0e599352 + checksum: 10/aec4d876617298400c0c03d35fed67e5193addc82a76f2b2a2f4c2b000cafbca84a33cf2e686dea1d1caa06fe4028dd94b8e6cd1f5bc3bbd19026a188bb2ec55 languageName: node linkType: hard @@ -20262,31 +20125,31 @@ __metadata: linkType: hard "secp256k1@npm:^3.0.1": - version: 3.8.0 - resolution: "secp256k1@npm:3.8.0" + version: 3.8.1 + resolution: "secp256k1@npm:3.8.1" dependencies: bindings: "npm:^1.5.0" bip66: "npm:^1.1.5" bn.js: "npm:^4.11.8" create-hash: "npm:^1.2.0" drbg.js: "npm:^1.0.1" - elliptic: "npm:^6.5.2" + elliptic: "npm:^6.5.7" nan: "npm:^2.14.0" node-gyp: "npm:latest" safe-buffer: "npm:^5.1.2" - checksum: 10/45e65c68affb228fa253297188ba64c60c39a0f0defc80578ca50e0dda188efb109e9711f9d434672d3e1507860434a9c4bf16bf41a91d67ae50d32f8f6e2059 + checksum: 10/dfe9621aea56268878ed384cbf8aac55ad7d3a887816d6e130d202ad679a25546f0079b22ab462f605c30668733e6b7676e4e77c63542d6fc45a7a5ad9ebb3f4 languageName: node linkType: hard "secp256k1@npm:^4.0.0, secp256k1@npm:^4.0.1": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" + version: 4.0.4 + resolution: "secp256k1@npm:4.0.4" dependencies: - elliptic: "npm:^6.5.4" - node-addon-api: "npm:^2.0.0" + elliptic: "npm:^6.5.7" + node-addon-api: "npm:^5.0.0" node-gyp: "npm:latest" node-gyp-build: "npm:^4.2.0" - checksum: 10/8b45820cd90fd2f95cc8fdb9bf8a71e572de09f2311911ae461a951ffa9e30c99186a129d0f1afeb380dd67eca0c10493f8a7513c39063fda015e99995088e3b + checksum: 10/45000f348c853df7c1e2b67c48efb062ae78c0620ab1a5cfb02fa20d3aad39c641f4e7a18b3de3b54a7c0cc1e0addeb8ecd9d88bc332e92df17a92b60c36122a languageName: node linkType: hard @@ -20384,7 +20247,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -20552,14 +20415,14 @@ __metadata: linkType: hard "socket.io-client@npm:^4.5.2, socket.io-client@npm:^4.7.2": - version: 4.8.0 - resolution: "socket.io-client@npm:4.8.0" + version: 4.8.1 + resolution: "socket.io-client@npm:4.8.1" dependencies: "@socket.io/component-emitter": "npm:~3.1.0" debug: "npm:~4.3.2" engine.io-client: "npm:~6.6.1" socket.io-parser: "npm:~4.2.4" - checksum: 10/98e05a6e3b19e6bae39bedbb6fd07e970e90c962b6ab9b68c4968a789be84efe40129b7f8abc73bafa31a29d444c3a0bde992131f93e7c3ddb27ef5192131e08 + checksum: 10/7480cf1ab30eba371a96dd1ce2ce9018dcbeaf81035a066fb89d99df0d0a6388b05840c92d970317c739956b68b28b0f4833f3b18e460a24eef557b9bca127c1 languageName: node linkType: hard @@ -20604,12 +20467,12 @@ __metadata: linkType: hard "sonner@npm:^1.5.0": - version: 1.5.0 - resolution: "sonner@npm:1.5.0" + version: 1.7.0 + resolution: "sonner@npm:1.7.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/f189ec3cacf294b875eeb349faefa4be90d2ff4dcde6dc73b3b77a4a8ed6ff393a1d6a1b1b90ef86de861a4c84d988aec09558cabd39fcb1befddd384c4010b0 + 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/121357b6fb39d2c8f81980f72249d8fc02fa5eaba8e6522ca13a89bf4a13a8313421bd1dde9125e593f1d9a9507baa5c48f595f043373733f75e0e038eaff65f languageName: node linkType: hard @@ -20797,9 +20660,9 @@ __metadata: linkType: hard "std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10/034176196cfcaaab16dbdd96fc9e925a9544799fb6dc5a3e36fe43270f3a287c7f779d785b89edaf22cef2b5f1dcada2aae67430b8602e785ee74bdb3f671768 languageName: node linkType: hard @@ -21265,8 +21128,8 @@ __metadata: linkType: hard "terser@npm:^5.26.0": - version: 5.34.1 - resolution: "terser@npm:5.34.1" + version: 5.36.0 + resolution: "terser@npm:5.36.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -21274,7 +21137,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/4389f39b5b841e2a7795ee733b54bf8fc44f8784a78c213dae32c7e6adc66c3bb258ebdcbacb8e7f1fa08fceb20bfc4ce4f7666d42bbfc29ab71126e89614c34 + checksum: 10/52e641419f79d7ccdecd136b9a8e0b03f93cfe3b53cce556253aaabc347d3f2af1745419b9e622abc95d592084dc76e57774b8f9e68d29d543f4dd11c044daf4 languageName: node linkType: hard @@ -21407,13 +21270,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10/be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -21506,11 +21362,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.3.0": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" + version: 1.4.0 + resolution: "ts-api-utils@npm:1.4.0" peerDependencies: typescript: ">=4.2.0" - checksum: 10/3ee44faa24410cd649b5c864e068d438aa437ef64e9e4a66a41646a6d3024d3097a695eeb3fb26ee364705d3cb9653a65756d009e6a53badb6066a5f447bf7ed + checksum: 10/b2020d5da55e28dc9dd32fb94730a4f6caefbd8e103029b6b6de5f15d18873067d734f64761c424c78ad1393a2b99d82b5a9fd34d663c12243acca7d3439090b languageName: node linkType: hard @@ -21529,8 +21385,8 @@ __metadata: linkType: hard "tsconfck@npm:^3.0.3": - version: 3.1.3 - resolution: "tsconfck@npm:3.1.3" + version: 3.1.4 + resolution: "tsconfck@npm:3.1.4" peerDependencies: typescript: ^5.0.0 peerDependenciesMeta: @@ -21538,7 +21394,7 @@ __metadata: optional: true bin: tsconfck: bin/tsconfck.js - checksum: 10/bf9b9b72de5b83f833f5dea8b276e77bab08e85751589f36dd23854fa3d5f7955194086fb8424df388bf232f2fc9a067d7913bfa674cb1217be0bba648ec71f2 + checksum: 10/4fb02e75ff374a82052b4800970bebe4466b5a6e7193d74e7b875cc8225acb5037fb4e7dcd4a5cd751c22129360cb13b4d5536897eae131d69c1a20fb18a99b4 languageName: node linkType: hard @@ -21564,9 +21420,9 @@ __metadata: linkType: hard "tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.6.0": - version: 2.7.0 - resolution: "tslib@npm:2.7.0" - checksum: 10/9a5b47ddac65874fa011c20ff76db69f97cf90c78cff5934799ab8894a5342db2d17b4e7613a087046bc1d133d21547ddff87ac558abeec31ffa929c88b7fce6 + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 languageName: node linkType: hard @@ -21698,22 +21554,22 @@ __metadata: linkType: hard "typescript@npm:^5.2.2": - version: 5.6.2 - resolution: "typescript@npm:5.6.2" + version: 5.6.3 + resolution: "typescript@npm:5.6.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/f95365d4898f357823e93d334ecda9fcade54f009b397c7d05b7621cd9e865981033cf89ccde0f3e3a7b73b1fdbae18e92bc77db237b43e912f053fef0f9a53b + checksum: 10/c328e418e124b500908781d9f7b9b93cf08b66bf5936d94332b463822eea2f4e62973bfb3b8a745fdc038785cb66cf59d1092bac3ec2ac6a3e5854687f7833f1 languageName: node linkType: hard "typescript@patch:typescript@npm%3A^5.2.2#optional!builtin": - version: 5.6.2 - resolution: "typescript@patch:typescript@npm%3A5.6.2#optional!builtin::version=5.6.2&hash=b45daf" + version: 5.6.3 + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=b45daf" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/060a7349adf698477b411be4ace470aee6c2c1bd99917fdf5d33697c17ec55c64fe724eb10399387530b50e9913b41528dd8bfcca0a5fc8f8bac63fbb4580a2e + checksum: 10/dc4bec403cd33a204b655b1152a096a08e7bad2c931cb59ef8ff26b6f2aa541bf98f09fc157958a60c921b1983a8dde9a85b692f9de60fa8f574fd131e3ae4dd languageName: node linkType: hard @@ -21735,7 +21591,7 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.5.3, ufo@npm:^1.5.4": +"ufo@npm:^1.5.4": version: 1.5.4 resolution: "ufo@npm:1.5.4" checksum: 10/a885ed421e656aea6ca64e9727b8118a9488715460b6f1a0f0427118adfe2f2830fe7c1d5bd9c5c754a332e6807516551cd663ea67ce9ed6a4e3edc739916335 @@ -21830,7 +21686,7 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": +"undici-types@npm:~6.19.8": version: 6.19.8 resolution: "undici-types@npm:6.19.8" checksum: 10/cf0b48ed4fc99baf56584afa91aaffa5010c268b8842f62e02f752df209e3dea138b372a60a963b3b2576ed932f32329ce7ddb9cb5f27a6c83040d8cd74b7a70 @@ -21853,7 +21709,7 @@ __metadata: languageName: node linkType: hard -"unenv@npm:^1.9.0": +"unenv@npm:^1.10.0": version: 1.10.0 resolution: "unenv@npm:1.10.0" dependencies: @@ -21913,30 +21769,30 @@ __metadata: linkType: hard "unstorage@npm:^1.9.0": - version: 1.12.0 - resolution: "unstorage@npm:1.12.0" + version: 1.13.1 + resolution: "unstorage@npm:1.13.1" dependencies: anymatch: "npm:^3.1.3" chokidar: "npm:^3.6.0" + citty: "npm:^0.1.6" destr: "npm:^2.0.3" - h3: "npm:^1.12.0" - listhen: "npm:^1.7.2" + h3: "npm:^1.13.0" + listhen: "npm:^1.9.0" lru-cache: "npm:^10.4.3" - mri: "npm:^1.2.0" node-fetch-native: "npm:^1.6.4" - ofetch: "npm:^1.3.4" + ofetch: "npm:^1.4.1" ufo: "npm:^1.5.4" peerDependencies: "@azure/app-configuration": ^1.7.0 "@azure/cosmos": ^4.1.1 "@azure/data-tables": ^13.2.2 - "@azure/identity": ^4.4.1 - "@azure/keyvault-secrets": ^4.8.0 - "@azure/storage-blob": ^12.24.0 + "@azure/identity": ^4.5.0 + "@azure/keyvault-secrets": ^4.9.0 + "@azure/storage-blob": ^12.25.0 "@capacitor/preferences": ^6.0.2 - "@netlify/blobs": ^6.5.0 || ^7.0.0 + "@netlify/blobs": ^6.5.0 || ^7.0.0 || ^8.1.0 "@planetscale/database": ^1.19.0 - "@upstash/redis": ^1.34.0 + "@upstash/redis": ^1.34.3 "@vercel/kv": ^1.0.1 idb-keyval: ^6.2.1 ioredis: ^5.4.1 @@ -21967,7 +21823,7 @@ __metadata: optional: true ioredis: optional: true - checksum: 10/b648d79e9913a87152228a080355d9ccf780900eb78bd32f8dab9cc55eb66ab45876e9fc1ed49f1c7a4171600e78c33430e2527740d991df9d071872409b9c37 + checksum: 10/a5fea4f83189d222dcb95ce36d0de29b1ab2fa64122f4c4435b63e6dab8bacd630f6234b0599a505de620f719965ea3a3ce068ece759a96e19fd187e1fb9561c languageName: node linkType: hard @@ -21984,7 +21840,7 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": +"update-browserslist-db@npm:^1.1.1": version: 1.1.1 resolution: "update-browserslist-db@npm:1.1.1" dependencies: @@ -22360,15 +22216,15 @@ __metadata: linkType: hard "vite-plugin-svgr@npm:^4.2.0": - version: 4.2.0 - resolution: "vite-plugin-svgr@npm:4.2.0" + version: 4.3.0 + resolution: "vite-plugin-svgr@npm:4.3.0" dependencies: - "@rollup/pluginutils": "npm:^5.0.5" + "@rollup/pluginutils": "npm:^5.1.3" "@svgr/core": "npm:^8.1.0" "@svgr/plugin-jsx": "npm:^8.1.0" peerDependencies: - vite: ^2.6.0 || 3 || 4 || 5 - checksum: 10/c860e65836509a144cf838eabcf420d848f35aea4c83044e75c9f9d00947f878217470536ea4098dc4e78510cb5fb683ec564f33cddde4dab0459e3a87f5ff79 + vite: ">=2.6.0" + checksum: 10/9ade316f20dae881f4ee65e4f2a35be11cf75b22a411bfcdb55bd61382c0249395cb925775e06a49e0fdffe483e64d5a25068c3ddfc5823fb72013cf4d932d17 languageName: node linkType: hard @@ -22402,8 +22258,8 @@ __metadata: linkType: hard "vite@npm:^5.2.7": - version: 5.4.8 - resolution: "vite@npm:5.4.8" + version: 5.4.11 + resolution: "vite@npm:5.4.11" dependencies: esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" @@ -22440,7 +22296,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/17fdffa558abaf854f04ead7d3ddd76e4556a59871f9ac63cca3fc20a79979984837d8dddaae4b171e3d73061f781e4eec0f6d3babdbce2b4d111d29cf474c1c + checksum: 10/719c4dea896e9547958643354003c8c9ea98e5367196d98f5f46cffb3ec963fead3ea5853f5af941c79bbfb73583dec19bbb0d28d2f644b95d7f59c55e22919d languageName: node linkType: hard @@ -22804,16 +22660,16 @@ __metadata: linkType: hard "webpack@npm:^4.46.0 || ^5.0.0": - version: 5.95.0 - resolution: "webpack@npm:5.95.0" + version: 5.96.1 + resolution: "webpack@npm:5.96.1" dependencies: - "@types/estree": "npm:^1.0.5" + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.6" "@webassemblyjs/ast": "npm:^1.12.1" "@webassemblyjs/wasm-edit": "npm:^1.12.1" "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.7.1" - acorn-import-attributes: "npm:^1.9.5" - browserslist: "npm:^4.21.10" + acorn: "npm:^8.14.0" + browserslist: "npm:^4.24.0" chrome-trace-event: "npm:^1.0.2" enhanced-resolve: "npm:^5.17.1" es-module-lexer: "npm:^1.2.1" @@ -22835,7 +22691,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10/0377ad3a550b041f26237c96fb55754625b0ce6bae83c1c2447e3262ad056b0b0ad770dcbb92b59f188e9a2bd56155ce910add17dcf023cfbe78bdec774380c1 + checksum: 10/d3419ffd198252e1d0301bd0c072cee93172f3e47937c745aa8202691d2f5d529d4ba4a1965d1450ad89a1bcd3c1f70ae09e57232b0d01dd38d69c1060e964d5 languageName: node linkType: hard @@ -23159,9 +23015,9 @@ __metadata: linkType: hard "xmlhttprequest-ssl@npm:~2.1.1": - version: 2.1.1 - resolution: "xmlhttprequest-ssl@npm:2.1.1" - checksum: 10/40affa3100d566709965910bb3877f5434d61a5588fef46dc896ec39f141261aafe922b5fbbaa79927f019bb8e765877563f0b2ffa69e4c8779b7666bb0c2cc1 + version: 2.1.2 + resolution: "xmlhttprequest-ssl@npm:2.1.2" + checksum: 10/708a177fe41c6c8cd4ec7c04d965b4c01801d87f44383ec639be58bdc14418142969841659e0850db44feee8bec0a3d3e7d33fed22519415f3d0daab04d3f160 languageName: node linkType: hard From a95d6c9f1679fbfeeeca7b3a85609c67af269914 Mon Sep 17 00:00:00 2001 From: Rohit Malhotra Date: Wed, 20 Nov 2024 13:03:23 +0530 Subject: [PATCH 06/43] DAPP-1972 price tracker activity + blocks fixes (#1973) --- src/blocks/icons/components/Asterisk.tsx | 25 +++++++++++--- src/blocks/icons/components/Lock.tsx | 29 ++++++++++++---- src/blocks/icons/components/Logout.tsx | 8 ++--- src/blocks/text/Text.constants.ts | 34 ++++++++++++++++--- src/common/Common.baseLogos.ts | 3 ++ .../components/RewardsActivityIcon.tsx | 13 ++++++- .../rewards/utils/activityTypeArray.ts | 1 + src/queries/types/rewards.ts | 1 + 8 files changed, 93 insertions(+), 21 deletions(-) diff --git a/src/blocks/icons/components/Asterisk.tsx b/src/blocks/icons/components/Asterisk.tsx index 6313a21f20..05ca467a07 100644 --- a/src/blocks/icons/components/Asterisk.tsx +++ b/src/blocks/icons/components/Asterisk.tsx @@ -9,16 +9,33 @@ const Asterisk: FC = (allProps) => { componentName="Asterisk" icon={ + + } diff --git a/src/blocks/icons/components/Lock.tsx b/src/blocks/icons/components/Lock.tsx index 9b95956f11..1937767e9a 100644 --- a/src/blocks/icons/components/Lock.tsx +++ b/src/blocks/icons/components/Lock.tsx @@ -12,23 +12,38 @@ const Lock: FC = (allProps) => { xmlns="http://www.w3.org/2000/svg" width="inherit" height="inherit" - viewBox="0 0 29 28" + viewBox="0 0 32 32" fill="none" {...props} > - + + + - + diff --git a/src/blocks/icons/components/Logout.tsx b/src/blocks/icons/components/Logout.tsx index b6d129e4b2..d923a5bdd2 100644 --- a/src/blocks/icons/components/Logout.tsx +++ b/src/blocks/icons/components/Logout.tsx @@ -12,24 +12,24 @@ const Logout: FC = (allProps) => { xmlns="http://www.w3.org/2000/svg" width="inherit" height="inherit" - viewBox="0 0 24 24" + viewBox="0 0 32 32" fill="none" {...props} > = ({ type }) => { ); } + if (type === 'channel_specific_subscriptions:BTC_PRICE_TRACKER_CHANNEL') { + return ( + + ); + } + if (type === 'atleast_5_defi_channel_specific_subscriptions') { return ( Date: Fri, 22 Nov 2024 16:29:05 +0530 Subject: [PATCH 07/43] Fixed the flow for Snaps in user settings page (#1975) * Fixed the flow for Snaps in user settings page * DAPP-1959 logo alignment fix --------- Co-authored-by: rohitmalhotra1420 --- src/components/PushSnap/PushSnapSettings.tsx | 116 ++++++++++++++++--- 1 file changed, 99 insertions(+), 17 deletions(-) diff --git a/src/components/PushSnap/PushSnapSettings.tsx b/src/components/PushSnap/PushSnapSettings.tsx index e509132ac4..cda4ba6b07 100644 --- a/src/components/PushSnap/PushSnapSettings.tsx +++ b/src/components/PushSnap/PushSnapSettings.tsx @@ -10,14 +10,15 @@ import useModalBlur, { MODAL_POSITION } from 'hooks/useModalBlur'; import AboutSnapModal from 'modules/snap/AboutSnapModal'; import styled, { useTheme } from 'styled-components'; import PushSnapConfigureModal from './PushSnapConfigureModal'; -import { Alert, Box, Button, Text } from 'blocks'; +import { Alert, Box, Button, Metamask, Text } from 'blocks'; import { SnoozeDurationType } from 'types'; const PushSnapSettings = () => { - const { account, isWalletConnected, connect } = useAccount(); + const { account, isWalletConnected, connect, provider } = useAccount(); const theme = useTheme(); const [loading, setLoading] = useState(false); + const [walletConnected, setWalletConnected] = useState(false); const [addedAddress, setAddedAddress] = useState(false); const [errorMessage, setErrorMessage] = useState(null); @@ -31,11 +32,11 @@ const PushSnapSettings = () => { async function getInstalledSnaps() { if (!isWalletConnected) { - setErrorMessage("Connect your metamask wallet to install Snap"); + setErrorMessage('Connect your metamask wallet to install Snap'); setSnapInstalled(false); - return + return; } - setErrorMessage('') + setErrorMessage(''); const installedSnaps = await window.ethereum.request({ method: 'wallet_getSnaps', }); @@ -46,6 +47,39 @@ const PushSnapSettings = () => { } }); } + + async function getSignature(account: string) { + const signer = provider.getSigner(account); + const signature = await signer.signMessage(`Add address ${account} to receive notifications through Push Snap`); + return signature; + } + + async function addwalletAddress() { + try { + const signatureResult = await getSignature(account); + if (signatureResult) { + if (account) { + await window.ethereum?.request({ + method: 'wallet_invokeSnap', + params: { + snapId: defaultSnapOrigin, + request: { + method: 'pushproto_addaddress', + params: { address: account }, + }, + }, + }); + console.debug('Added', account); + setWalletConnected(true); + } + } else { + console.error('Signature Validation Failed'); + } + } catch (error: any) { + setErrorMessage(error.message); + } + } + async function getWalletAddresses() { const result = await window.ethereum?.request({ method: 'wallet_invokeSnap', @@ -55,10 +89,10 @@ const PushSnapSettings = () => { }, }); - console.debug(account); if (result.includes(account)) { setAddedAddress(true); + setWalletConnected(true); } else { setAddedAddress(false); } @@ -88,12 +122,15 @@ const PushSnapSettings = () => { setErrorMessage('Connect your metamask wallet to install Snap'); return; } - setErrorMessage('') + setErrorMessage(''); setLoading(true); try { if (!isWalletConnected) await connect(); if (!snapInstalled) { await connectSnap(); + getInstalledSnaps(); + } else { + await addwalletAddress(); } setLoading(false); } catch (error) { @@ -164,8 +201,13 @@ const PushSnapSettings = () => { /> )} - - {loading ? ( + + {/* {loading ? ( { ) : ( )} - + */} + {loading && !snapInstalled ? ( + + ) : ( + + )} + {loading && snapInstalled ? ( + + ) : ( + + )} + { return ( <> - {!snapInstalled ? ( + {!walletConnected ? ( ) : ( <> - Push Snap Settings + Push Snap Settings - )} @@ -224,7 +306,7 @@ export default PushSnapSettings; const Container = styled(Section)` width: 438px; - height: 423px; + height: auto; border-radius: 32px; background: #fff; background: ${(props) => props.theme.default.bg}; From 0790d86815e42b637b5005e7a20dbd8904bc7497 Mon Sep 17 00:00:00 2001 From: Kolade Date: Mon, 25 Nov 2024 12:40:05 +0100 Subject: [PATCH 08/43] Fix stake section (#1978) * update reset fn * update stake code --- .../rewards/components/ActivityButton.tsx | 35 ++++++++++++++++--- .../StakePushActivitiesListItem.tsx | 2 +- .../rewards/components/StakePushSection.tsx | 7 ++-- .../hooks/useStakeRewardsResetTime.tsx | 10 +++--- src/queries/hooks/rewards/index.ts | 1 + .../rewards/useGetPreviousPushStakeEpoch.ts | 9 +++++ .../rewards/getPreviousPushStakeEpochModel.ts | 3 ++ src/queries/models/rewards/index.ts | 1 + src/queries/queryKeys.ts | 1 + .../rewards/getPreviousPushStakeEpoch.ts | 10 ++++++ src/queries/services/rewards/index.ts | 1 + src/queries/types/rewards.ts | 5 ++- 12 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 src/queries/hooks/rewards/useGetPreviousPushStakeEpoch.ts create mode 100644 src/queries/models/rewards/getPreviousPushStakeEpochModel.ts create mode 100644 src/queries/services/rewards/getPreviousPushStakeEpoch.ts diff --git a/src/modules/rewards/components/ActivityButton.tsx b/src/modules/rewards/components/ActivityButton.tsx index 684fa37e3d..482b392b1f 100644 --- a/src/modules/rewards/components/ActivityButton.tsx +++ b/src/modules/rewards/components/ActivityButton.tsx @@ -2,7 +2,7 @@ import { FC } from 'react'; //Queries -import { ActvityType, UsersActivity } from 'queries'; +import { ActvityType, useGetPushStakeEpoch, useGetUniV2StakeEpoch, UsersActivity } from 'queries'; import { Button } from 'blocks'; import { ActivityVerificationButton } from './ActivityVerificationButton'; import { useRewardsContext } from 'contexts/RewardsContext'; @@ -31,14 +31,39 @@ const ActivityButton: FC = ({ usersSingleActivity, isLoadingActivity, label, - isStakeSection, - lifeTime, }) => { const { resetEpoch } = useRewardsContext(); + const { data: pushStakeData } = useGetPushStakeEpoch(); + const { data: uniV2StakeData } = useGetUniV2StakeEpoch(); + const isPushEpochRelated = + typeof usersSingleActivity?.activityTypeId === 'string' && + usersSingleActivity.activityTypeId.endsWith('push_epoch'); - if (usersSingleActivity?.status === 'COMPLETED' && isStakeSection && resetEpoch && !lifeTime) { + const isUniV2EpochRelated = + typeof usersSingleActivity?.activityTypeId === 'string' && usersSingleActivity.activityTypeId.endsWith('v2_epoch'); + + const isEpochRelated = + usersSingleActivity?.data?.currentEpoch == pushStakeData?.currentEpoch || + usersSingleActivity?.data?.currentEpoch == uniV2StakeData?.currentEpoch; + + // claimed status for the same epoch + if (usersSingleActivity?.status === 'COMPLETED' && (isPushEpochRelated || isUniV2EpochRelated) && isEpochRelated) { + console.log('claimed in this epoch button'); + return ( + + ); + } + + // default verify button for stake epoch section + if (usersSingleActivity?.status === 'COMPLETED' && resetEpoch && (isPushEpochRelated || isUniV2EpochRelated)) { + console.log('reset button'); return ( - // default verify button = ({ const usersSingleActivity = allUsersActivity?.[activity?.activityType] as UsersActivity; const isLoading = isAllActivitiesLoading; - const hasActivityEndedUnclaimed = usersSingleActivity?.status !== 'COMPLETED' && hasEpochEnded; + const hasActivityEndedUnclaimed = hasEpochEnded; const isLockedOrNotConnected = isLocked || !isWalletConnected; diff --git a/src/modules/rewards/components/StakePushSection.tsx b/src/modules/rewards/components/StakePushSection.tsx index 10cae3ed15..f3e6062b4e 100644 --- a/src/modules/rewards/components/StakePushSection.tsx +++ b/src/modules/rewards/components/StakePushSection.tsx @@ -25,7 +25,7 @@ export type StakePushPoints = { const StakePushSection: FC = ({ title, subtitle, timeline, lifeTime }) => { const { account, isWalletConnected } = useAccount(); const { isLocked } = useRewardsContext(); - const { stakePushArray, uniV2PushArray, isLoading, daysToReset } = useStakeRewardsResetTime({ + const { stakePushArray, uniV2PushArray, isLoading, daysToReset, refetchSendActivities } = useStakeRewardsResetTime({ lifeTime, }); const [errorMessage, setErrorMessage] = useState(''); @@ -184,7 +184,10 @@ const StakePushSection: FC = ({ title, subtitle, timeline, life hasEpochEnded={hasEpochEnded} allUsersActivity={allUsersActivity as StakeActivityResponse} isAllActivitiesLoading={isAllActivitiesLoading} - refetchActivity={refetchActivity} + refetchActivity={() => { + refetchActivity(); + refetchSendActivities(); + }} lifeTime={lifeTime} /> ))} diff --git a/src/modules/rewards/hooks/useStakeRewardsResetTime.tsx b/src/modules/rewards/hooks/useStakeRewardsResetTime.tsx index 74cc6d5750..6e789562b2 100644 --- a/src/modules/rewards/hooks/useStakeRewardsResetTime.tsx +++ b/src/modules/rewards/hooks/useStakeRewardsResetTime.tsx @@ -65,7 +65,7 @@ const useStakeRewardsResetTime = ({ lifeTime }: StakeRewardsResetTime) => { const activityTitles = allPushArray?.map((activity) => activity.activityType); - const { data: sendRecentActivities } = useGetRewardActivityStatus( + const { data: sendRecentActivities, refetch: refetchSendActivities } = useGetRewardActivityStatus( { userId: userDetails?.userId as string, activities: activityTitles as string[], @@ -80,6 +80,7 @@ const useStakeRewardsResetTime = ({ lifeTime }: StakeRewardsResetTime) => { const differenceInSeconds = (resetDate as number) - currentTime; return Math.floor(differenceInSeconds / (60 * 60 * 24)); }, [resetDate]); + // const daysToReset = -2; // Helper function to check if 7 days have passed since the stored epoch time (in seconds) const hasSevenDaysPassed = (storedEpochTime: number) => { @@ -126,7 +127,8 @@ const useStakeRewardsResetTime = ({ lifeTime }: StakeRewardsResetTime) => { updateResetDate(latestTimestamp); } - if (!isEpochActive && isPastSevenDays) { + if (!isEpochActive) { + // if (!isEpochActive && isPastSevenDays) { setResetEpoch(true); console.log(`${stakeType} epoch is reset`); } else { @@ -135,8 +137,6 @@ const useStakeRewardsResetTime = ({ lifeTime }: StakeRewardsResetTime) => { } }; - // console.log(daysToReset, 'daysToReset'); - // Effect for handling fetch data for both arrays useEffect(() => { if ( @@ -154,7 +154,7 @@ const useStakeRewardsResetTime = ({ lifeTime }: StakeRewardsResetTime) => { } }, [userDetails?.userId, isWalletConnected, isLoadingPushStakeData, isLoadingPushUniData, sendRecentActivities]); - return { stakePushArray, uniV2PushArray, isLoading, daysToReset }; + return { stakePushArray, uniV2PushArray, isLoading, daysToReset, refetchSendActivities }; }; export { useStakeRewardsResetTime }; diff --git a/src/queries/hooks/rewards/index.ts b/src/queries/hooks/rewards/index.ts index ee6ba806a3..7609e40628 100644 --- a/src/queries/hooks/rewards/index.ts +++ b/src/queries/hooks/rewards/index.ts @@ -7,4 +7,5 @@ export * from './useCreateRewardsUser'; export * from './useGetRewardsLedearboard'; export * from './useGetRewardActivityStatus'; export * from './useGetPushStakeEpoch'; +export * from './useGetPreviousPushStakeEpoch'; export * from './useGetUniV2StakeEpoch'; diff --git a/src/queries/hooks/rewards/useGetPreviousPushStakeEpoch.ts b/src/queries/hooks/rewards/useGetPreviousPushStakeEpoch.ts new file mode 100644 index 0000000000..0b1114130e --- /dev/null +++ b/src/queries/hooks/rewards/useGetPreviousPushStakeEpoch.ts @@ -0,0 +1,9 @@ +import { useQuery } from '@tanstack/react-query'; +import { getPreviousPushStakeEpoch } from 'queries'; +import { pushPreviousStakeEpoch } from 'queries/queryKeys'; + +export const useGetPreviousPushStakeEpoch = () => + useQuery({ + queryKey: [pushPreviousStakeEpoch], + queryFn: getPreviousPushStakeEpoch, + }); diff --git a/src/queries/models/rewards/getPreviousPushStakeEpochModel.ts b/src/queries/models/rewards/getPreviousPushStakeEpochModel.ts new file mode 100644 index 0000000000..0184e1d452 --- /dev/null +++ b/src/queries/models/rewards/getPreviousPushStakeEpochModel.ts @@ -0,0 +1,3 @@ +import { RewardsStakeParams } from 'queries/types'; + +export const getPreviousPushStakeEpochModel = (response: RewardsStakeParams): RewardsStakeParams => response; diff --git a/src/queries/models/rewards/index.ts b/src/queries/models/rewards/index.ts index cb8c48e292..f6d00ceca4 100644 --- a/src/queries/models/rewards/index.ts +++ b/src/queries/models/rewards/index.ts @@ -7,4 +7,5 @@ export * from './createUserRewardsDetailsModel'; export * from './getRewardsLeaderboardModalCreator'; export * from './getRewardActivityStatusModel'; export * from './getPushStakeEpochModel'; +export * from './getPreviousPushStakeEpochModel'; export * from './getUniV2StakeEpochModel'; diff --git a/src/queries/queryKeys.ts b/src/queries/queryKeys.ts index c9b8fab717..b105f97615 100644 --- a/src/queries/queryKeys.ts +++ b/src/queries/queryKeys.ts @@ -25,6 +25,7 @@ export const pointsVaultPendingUsers = 'pointsVaultPendingUsers'; export const pointsVaultRejectedUsers = 'pointsVaultRejectedUsers'; export const pointsVaultSearch = 'pointsVaultSearch'; export const pointsVaultUserLoginKey = 'pointsVaultUserLogin'; +export const pushPreviousStakeEpoch = 'pushPreviousStakeEpoch'; export const pushStakeEpoch = 'pushStakeEpoch'; export const reactivatingChannel = 'reactivatingChannel'; export const rejectVaultUser = 'rejectVaultUser'; diff --git a/src/queries/services/rewards/getPreviousPushStakeEpoch.ts b/src/queries/services/rewards/getPreviousPushStakeEpoch.ts new file mode 100644 index 0000000000..45d6f69045 --- /dev/null +++ b/src/queries/services/rewards/getPreviousPushStakeEpoch.ts @@ -0,0 +1,10 @@ +import axios from 'axios'; + +import { getRewardsBaseURL } from '../../baseURL'; +import { getPreviousPushStakeEpochModel } from 'queries/models'; + +export const getPreviousPushStakeEpoch = () => + axios({ + method: 'GET', + url: `${getRewardsBaseURL()}/staking/push/previous-epoch-blocks`, + }).then((response) => getPreviousPushStakeEpochModel(response.data)); diff --git a/src/queries/services/rewards/index.ts b/src/queries/services/rewards/index.ts index 85434d4bd6..61f7d46820 100644 --- a/src/queries/services/rewards/index.ts +++ b/src/queries/services/rewards/index.ts @@ -7,4 +7,5 @@ export * from './createUserRewardsDetail.ts'; export * from './getRewardsLeaderboard'; export * from './getRewardActivityStatus.ts'; export * from './getPushStakeEpoch.ts'; +export * from './getPreviousPushStakeEpoch.ts'; export * from './getUniV2StakeEpoch.ts'; diff --git a/src/queries/types/rewards.ts b/src/queries/types/rewards.ts index f1b057203b..a6934334ab 100644 --- a/src/queries/types/rewards.ts +++ b/src/queries/types/rewards.ts @@ -93,7 +93,10 @@ export type UsersActivity = { activityId: string; userId: string; activityTypeId: string; - data: { twitter?: string; discord?: string }; + data: + | { twitter?: string; discord?: string } + | { currentEpoch?: number; fromBlock?: number; toBlock?: number; fromTimestamp?: number; toTimestamp?: number } + | any; status: 'COMPLETED' | 'PENDING' | 'REJECTED'; points: number; multiplier: number; From d56c12e2baf8c25d733af6a0d6c2711631880c33 Mon Sep 17 00:00:00 2001 From: Rohit Malhotra Date: Tue, 10 Dec 2024 20:07:11 +0530 Subject: [PATCH 09/43] DAPP-1981-added new rivo channel activity (#1988) --- src/common/Common.baseLogos.ts | 3 +++ .../rewards/components/RewardsActivityIcon.tsx | 12 ++++++++++++ src/modules/rewards/utils/activityTypeArray.ts | 1 + src/queries/types/rewards.ts | 1 + 4 files changed, 17 insertions(+) diff --git a/src/common/Common.baseLogos.ts b/src/common/Common.baseLogos.ts index 8b28675a07..45913d6596 100644 --- a/src/common/Common.baseLogos.ts +++ b/src/common/Common.baseLogos.ts @@ -21,3 +21,6 @@ export const udLogo = export const btcTrackerLogo = 'data:image/png;base64,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'; + +export const rivoChannelLogo = + 'data:image/png;base64,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'; diff --git a/src/modules/rewards/components/RewardsActivityIcon.tsx b/src/modules/rewards/components/RewardsActivityIcon.tsx index 4ce3744cc5..4abd99232c 100644 --- a/src/modules/rewards/components/RewardsActivityIcon.tsx +++ b/src/modules/rewards/components/RewardsActivityIcon.tsx @@ -39,6 +39,7 @@ import { pwnLogo, udLogo, btcTrackerLogo, + rivoChannelLogo, } from 'common'; import { ActvityType } from 'queries'; @@ -270,6 +271,17 @@ const RewardsActivityIcon: FC = ({ type }) => { ); } + if (type === 'channel_specific_subscriptions:RIVO_CHANNEL') { + return ( + + ); + } + if (type === 'atleast_5_defi_channel_specific_subscriptions') { return ( Date: Sat, 21 Dec 2024 17:33:45 +0100 Subject: [PATCH 10/43] User Email/Telegram Integration (#1987) * update interface user account * update email and verify modal * DAPP-1957: Integrate UI for Dashboard Social Account Links (Email/Telegram/Discord) * update formdata * update button size * update icons * update user profile info * update user profile * update verify email * add telegram and discord modals * update dashboard to work with modals * update modals * update telegram flow * fix: added changes for telegram user validation * update url * update value and type * add discord verification * update dropdown * add social handles to rewards points * add rewards handle list item * update rewards email telegram * update index * update telegram and discord * add usersocial profile hook * adjust prod url * add baseurl and form error message * add enabled filter * remove console logs * hide discord on dev * remove discord * fix email schema * fix telegram schema * resolve comments * fix tooltip bug * fix url and add form settings * Fixed the display of alert message for email and telegram * telegram congif fixes for staging, localhost and alpha env --------- Co-authored-by: Kushdeep Singh Co-authored-by: Ashis Co-authored-by: abhishek-01k Co-authored-by: rohitmalhotra1420 --- src/blocks/button/Button.tsx | 4 + .../illustrations/components/Avatar.tsx | 54 ++++ .../components/DiscordProfile.tsx | 30 ++ .../illustrations/components/EmailProfile.tsx | 30 ++ .../illustrations/components/Telegram.tsx | 36 +++ .../components/TelegramProfile.tsx | 32 ++ src/blocks/illustrations/index.ts | 10 + src/blocks/tooltip/Tooltip.tsx | 33 ++- src/common/components/CopyButton.tsx | 17 +- .../UserProfileSettings/AddDiscord.tsx | 274 ++++++++++++++++++ .../UserProfileSettings/AddEmail.form.ts | 29 ++ .../UserProfileSettings/AddEmail.tsx | 247 ++++++++++++++++ .../UserProfileSettings/AddTelegram.form.ts | 18 ++ .../UserProfileSettings/AddTelegram.tsx | 274 ++++++++++++++++++ .../UserProfileSettings/UploadAvatarModal.tsx | 171 +++++++++++ .../UserProfileSettings.form.ts | 27 ++ .../UserProfileSettings.tsx | 188 ++++++++++++ .../UserProfileSettingsItem.tsx | 62 ++++ .../UserProfileSocialSettings.tsx | 134 +++++++++ src/components/userSettings/UserSettings.tsx | 58 +++- src/config/config-alpha.js | 4 + src/config/config-dev.js | 4 + src/config/config-localhost.js | 4 + src/config/config-prod.js | 4 + src/config/config-staging.js | 4 + src/modules/dashboard/Dashboard.constants.ts | 2 +- src/modules/dashboard/Dashboard.tsx | 88 +++++- .../components/ClaimSocialHandles.tsx | 85 ++++++ .../components/ConnectSocialHandles.tsx | 125 ++++++++ .../dashboard/components/Socialhandles.tsx | 39 +++ .../dashboard/hooks/useSocialHandles.tsx | 110 +++++++ .../RewardsActivitiesBottomSection.tsx | 11 +- .../components/RewardsActivitiesList.tsx | 190 +++++++----- .../components/RewardsActivitiesSection.tsx | 17 +- .../rewards/components/SocialHandleItem.tsx | 118 ++++++++ .../rewards/utils/activityTypeArray.ts | 1 + .../userSettings/UserSettingsModule.tsx | 7 +- src/queries/baseURL.ts | 13 + src/queries/hooks/user/index.ts | 5 + src/queries/hooks/user/useGetSocialsStatus.ts | 10 + .../hooks/user/useGetUserProfileInfo.ts | 22 ++ .../user/useSendHandlesVerificationCode.ts | 9 + .../hooks/user/useUpdateUserProfileInfo.ts | 9 + .../user/useVerifyHandlesVerificationCode.ts | 9 + .../user/getSocialsStatusModelCreator.ts | 3 + .../user/getUserProfileInfoModelCreator.ts | 4 + src/queries/models/user/index.ts | 4 + ...sendHandlesVerificationCodeModelCreator.ts | 5 + ...rifyHandlesVerificationCodeModelCreator.ts | 5 + src/queries/queryKeys.ts | 5 + .../services/user/getUserProfileInfo.ts | 5 + .../services/user/getUserSocialsStatus.ts | 19 ++ src/queries/services/user/index.ts | 5 + .../user/sendHandlesVerificationCode.ts | 26 ++ .../services/user/updateUserProfileInfo.ts | 24 ++ .../user/verifyHandlesVerificationCode.ts | 26 ++ src/queries/types/rewards.ts | 1 + src/queries/types/user.ts | 33 +++ 58 files changed, 2649 insertions(+), 134 deletions(-) create mode 100644 src/blocks/illustrations/components/Avatar.tsx create mode 100644 src/blocks/illustrations/components/DiscordProfile.tsx create mode 100644 src/blocks/illustrations/components/EmailProfile.tsx create mode 100644 src/blocks/illustrations/components/Telegram.tsx create mode 100644 src/blocks/illustrations/components/TelegramProfile.tsx create mode 100644 src/components/UserProfileSettings/AddDiscord.tsx create mode 100644 src/components/UserProfileSettings/AddEmail.form.ts create mode 100644 src/components/UserProfileSettings/AddEmail.tsx create mode 100644 src/components/UserProfileSettings/AddTelegram.form.ts create mode 100644 src/components/UserProfileSettings/AddTelegram.tsx create mode 100644 src/components/UserProfileSettings/UploadAvatarModal.tsx create mode 100644 src/components/UserProfileSettings/UserProfileSettings.form.ts create mode 100644 src/components/UserProfileSettings/UserProfileSettings.tsx create mode 100644 src/components/UserProfileSettings/UserProfileSettingsItem.tsx create mode 100644 src/components/UserProfileSettings/UserProfileSocialSettings.tsx create mode 100644 src/modules/dashboard/components/ClaimSocialHandles.tsx create mode 100644 src/modules/dashboard/components/ConnectSocialHandles.tsx create mode 100644 src/modules/dashboard/components/Socialhandles.tsx create mode 100644 src/modules/dashboard/hooks/useSocialHandles.tsx create mode 100644 src/modules/rewards/components/SocialHandleItem.tsx create mode 100644 src/queries/hooks/user/useGetSocialsStatus.ts create mode 100644 src/queries/hooks/user/useGetUserProfileInfo.ts create mode 100644 src/queries/hooks/user/useSendHandlesVerificationCode.ts create mode 100644 src/queries/hooks/user/useUpdateUserProfileInfo.ts create mode 100644 src/queries/hooks/user/useVerifyHandlesVerificationCode.ts create mode 100644 src/queries/models/user/getSocialsStatusModelCreator.ts create mode 100644 src/queries/models/user/getUserProfileInfoModelCreator.ts create mode 100644 src/queries/models/user/sendHandlesVerificationCodeModelCreator.ts create mode 100644 src/queries/models/user/verifyHandlesVerificationCodeModelCreator.ts create mode 100644 src/queries/services/user/getUserProfileInfo.ts create mode 100644 src/queries/services/user/getUserSocialsStatus.ts create mode 100644 src/queries/services/user/sendHandlesVerificationCode.ts create mode 100644 src/queries/services/user/updateUserProfileInfo.ts create mode 100644 src/queries/services/user/verifyHandlesVerificationCode.ts diff --git a/src/blocks/button/Button.tsx b/src/blocks/button/Button.tsx index 9aec7345d8..dbf278d217 100644 --- a/src/blocks/button/Button.tsx +++ b/src/blocks/button/Button.tsx @@ -29,6 +29,8 @@ export type ButtonProps = { block?: boolean; /* Button loading state */ loading?: boolean; + /* indicate button type ina a form or similar usecases */ + type?: 'button' | 'submit'; } & TransformedHTMLAttributes; const StyledButton = styled.button` @@ -81,6 +83,7 @@ const Button = forwardRef( iconOnly, circular = false, children, + type, ...props }, ref @@ -94,6 +97,7 @@ const Button = forwardRef( role="button" ref={ref} size={size} + type={type} variant={variant} {...props} > diff --git a/src/blocks/illustrations/components/Avatar.tsx b/src/blocks/illustrations/components/Avatar.tsx new file mode 100644 index 0000000000..05cee6e9ff --- /dev/null +++ b/src/blocks/illustrations/components/Avatar.tsx @@ -0,0 +1,54 @@ +import { FC } from 'react'; +import { IllustrationWrapper } from '../IllustrationWrapper'; +import { IllustrationProps } from '../Illustrations.types'; + +const Avatar: FC = (allProps) => { + const { svgProps: props, ...restProps } = allProps; + return ( + + + + + + + + + + } + {...restProps} + /> + ); +}; + +export default Avatar; diff --git a/src/blocks/illustrations/components/DiscordProfile.tsx b/src/blocks/illustrations/components/DiscordProfile.tsx new file mode 100644 index 0000000000..35a9944ae6 --- /dev/null +++ b/src/blocks/illustrations/components/DiscordProfile.tsx @@ -0,0 +1,30 @@ +import { FC } from 'react'; +import { IllustrationWrapper } from '../IllustrationWrapper'; +import { IllustrationProps } from '../Illustrations.types'; + +const DiscordProfile: FC = (allProps) => { + const { svgProps: props, ...restProps } = allProps; + return ( + + + + } + {...restProps} + /> + ); +}; + +export default DiscordProfile; diff --git a/src/blocks/illustrations/components/EmailProfile.tsx b/src/blocks/illustrations/components/EmailProfile.tsx new file mode 100644 index 0000000000..1df8eba6db --- /dev/null +++ b/src/blocks/illustrations/components/EmailProfile.tsx @@ -0,0 +1,30 @@ +import { FC } from 'react'; +import { IllustrationWrapper } from '../IllustrationWrapper'; +import { IllustrationProps } from '../Illustrations.types'; + +const EmailProfile: FC = (allProps) => { + const { svgProps: props, ...restProps } = allProps; + return ( + + + + } + {...restProps} + /> + ); +}; + +export default EmailProfile; diff --git a/src/blocks/illustrations/components/Telegram.tsx b/src/blocks/illustrations/components/Telegram.tsx new file mode 100644 index 0000000000..c7493a9c89 --- /dev/null +++ b/src/blocks/illustrations/components/Telegram.tsx @@ -0,0 +1,36 @@ +import { FC } from 'react'; +import { IllustrationWrapper } from '../IllustrationWrapper'; +import { IllustrationProps } from '../Illustrations.types'; + +const Telegram: FC = (allProps) => { + const { svgProps: props, ...restProps } = allProps; + return ( + + + + + } + {...restProps} + /> + ); +}; + +export default Telegram; diff --git a/src/blocks/illustrations/components/TelegramProfile.tsx b/src/blocks/illustrations/components/TelegramProfile.tsx new file mode 100644 index 0000000000..82ee5c7161 --- /dev/null +++ b/src/blocks/illustrations/components/TelegramProfile.tsx @@ -0,0 +1,32 @@ +import { FC } from 'react'; +import { IllustrationWrapper } from '../IllustrationWrapper'; +import { IllustrationProps } from '../Illustrations.types'; + +const TelegramProfile: FC = (allProps) => { + const { svgProps: props, ...restProps } = allProps; + return ( + + + + } + {...restProps} + /> + ); +}; + +export default TelegramProfile; diff --git a/src/blocks/illustrations/index.ts b/src/blocks/illustrations/index.ts index e3562b51ad..519ffc2f56 100644 --- a/src/blocks/illustrations/index.ts +++ b/src/blocks/illustrations/index.ts @@ -7,6 +7,8 @@ export { default as AlphaAccessNFT } from './components/AlphaAccessNFT'; export { default as Arbitrum } from './components/Arbitrum'; +export { default as Avatar } from './components/Avatar'; + export { default as Base } from './components/Base'; export { default as BlueBonusActivitySubscribers } from './components/BlueBonusActivitySubscribers'; @@ -29,8 +31,12 @@ export { default as CyberLogoRewards } from './components/CyberLogoRewards'; export { default as Discord } from './components/Discord'; +export { default as DiscordProfile } from './components/DiscordProfile'; + export { default as EarnOnPush } from './components/EarnOnPush'; +export { default as EmailProfile } from './components/EmailProfile'; + export { default as Ethereum } from './components/Ethereum'; export { default as FiveSubscribedDefiChannel } from './components/FiveSubscribedDefiChannel'; @@ -99,6 +105,10 @@ export { default as StakePushYellowMultiplier } from './components/StakePushYell export { default as SubscribePoints } from './components/SubscribePoints'; +export { default as Telegram } from './components/Telegram'; + +export { default as TelegramProfile } from './components/TelegramProfile'; + export { default as TripleRewardsCoin } from './components/TripleRewardsCoin'; export { default as Twitter } from './components/Twitter'; diff --git a/src/blocks/tooltip/Tooltip.tsx b/src/blocks/tooltip/Tooltip.tsx index 6d3e7553d3..75912f0093 100644 --- a/src/blocks/tooltip/Tooltip.tsx +++ b/src/blocks/tooltip/Tooltip.tsx @@ -20,6 +20,7 @@ const RadixTooltipContent = styled(RadixTooltip.Content).withConfig({ word-wrap: break-word; color: var(--text-primary-inverse); background-color: var(--surface-primary-inverse); + z-index: 9999999999; /* Tooltip non-responsive styles */ width: ${({ width }) => width}; @@ -96,21 +97,23 @@ const Tooltip: FC = ({ {children} - - {overlay ? ( - overlay - ) : ( - <> - {title && {title}} - {description && {description}} - - )} - + {(title || overlay || description) && ( + + {overlay ? ( + overlay + ) : ( + <> + {title && {title}} + {description && {description}} + + )} + + )} diff --git a/src/common/components/CopyButton.tsx b/src/common/components/CopyButton.tsx index 54b06d57f5..fae4a4d7a4 100644 --- a/src/common/components/CopyButton.tsx +++ b/src/common/components/CopyButton.tsx @@ -5,22 +5,31 @@ import { FC, useState } from 'react'; type CopyButtonProps = { tooltipTitle: string; content: string; + size?: number; }; -const CopyButton: FC = ({ tooltipTitle, content }) => { +const CopyButton: FC = ({ tooltipTitle, content, size }) => { const [hover, setHover] = useState(false); + const [copied, setCopied] = useState(false); + + const handleCopy = () => { + copyToClipboard(content); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + return ( - + copyToClipboard(content)} + onClick={handleCopy} onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} > diff --git a/src/components/UserProfileSettings/AddDiscord.tsx b/src/components/UserProfileSettings/AddDiscord.tsx new file mode 100644 index 0000000000..9ffba1779e --- /dev/null +++ b/src/components/UserProfileSettings/AddDiscord.tsx @@ -0,0 +1,274 @@ +import { FC, useCallback, useState } from 'react'; +import { useSelector } from 'react-redux'; +import * as Yup from 'yup'; +import { useFormik } from 'formik'; + +import { useAccount } from 'hooks'; +import { useAppContext } from 'contexts/AppContext'; +import { walletToCAIP10 } from 'helpers/w2w'; +import { useSendHandlesVerificationCode } from 'queries'; +import { generateVerificationProof } from 'modules/rewards/utils/generateVerificationProof'; +import { appConfig } from 'config'; + +import { Box, Discord, Link, Modal, Text, TextInput } from 'blocks'; +import { CopyButton, ModalResponse } from 'common'; +import { shortenText } from 'helpers/UtilityHelper'; + +type AddDiscordProps = { + modalControl: ModalResponse; + refetchSocialHandleStatus: () => void; + setErrorMessage: (errorMessage: string) => void; + setSuccessMessage: (successMessage: string) => void; +}; + +enum Steps { + EnterDiscord = 1, + VerifyId = 2, +} + +const AddDiscord: FC = ({ + modalControl, + refetchSocialHandleStatus, + // setErrorMessage, + // setSuccessMessage, +}) => { + const { isOpen, onClose } = modalControl; + const { account, wallet } = useAccount(); + const { handleConnectWalletAndEnableProfile } = useAppContext(); + + const caip10WalletAddress = walletToCAIP10({ account }); + const [step, setStep] = useState(1); + const [discordCode, setDiscordCode] = useState(''); + const { userPushSDKInstance } = useSelector((state: any) => { + return state.user; + }); + + const { mutate: sendVerification, isPending: isSendingVerification } = useSendHandlesVerificationCode(); + + const discordValidationSchema = Yup.object({ + discord: Yup.string().required('Required'), + }); + + const discordFormik = useFormik({ + initialValues: { discord: '' }, + validationSchema: discordValidationSchema, + onSubmit: () => { + handleSendVerificationCode(); + }, + }); + + const getSDKInstance = useCallback(async () => { + return userPushSDKInstance?.signer ? userPushSDKInstance : await handleConnectWalletAndEnableProfile({ wallet }); + }, [userPushSDKInstance, handleConnectWalletAndEnableProfile, wallet]); + + const handleSendVerificationCode = async () => { + const sdkInstance = await getSDKInstance(); + const data = { + wallet: caip10WalletAddress, + value: { discord_username: discordFormik.values.discord }, + valueType: 'telegram', + }; + + const verificationProof = await generateVerificationProof(data, sdkInstance); + + if (!verificationProof) return; + + sendVerification( + { + caipAddress: caip10WalletAddress as string, + verificationProof: verificationProof as string, + value: { discord_username: discordFormik.values.discord }, + social_platform: 'discord', + }, + { + onSuccess: (response: any) => { + if (response?.success) { + setDiscordCode(response.verificationCode); + setStep(Steps.VerifyId); + } else { + discordFormik?.setFieldError('discord', 'Error sending code. Please try again'); + } + }, + onError: (error: Error) => { + console.log('Error sending code', error); + }, + } + ); + }; + + return ( + { + refetchSocialHandleStatus(); + onClose(); + }} + {...(step === Steps.VerifyId && { + onBack: () => setStep(Steps.EnterDiscord), + })} + acceptButtonProps={ + step === Steps.EnterDiscord + ? { + children: 'Next', + loading: isSendingVerification, + onClick: () => { + discordFormik?.handleSubmit(); + }, + } + : null + } + cancelButtonProps={null} + > + {step === Steps.EnterDiscord && ( + + + + + + + Enter your Discord ID + + + + Follow the steps to link your Discord to Push and receive notifications + + +
+ + + +
+
+ )} + + {step === Steps.VerifyId && discordCode && ( + + + + + + + Connect your Discord + + + + Follow the steps to link your Discord to Push and receive notifications + + + + + Step 1: Copy the verification code + + + + + {shortenText(`${caip10WalletAddress}-${discordCode}`, 10)} + + + + + + + + + Step 2: Visit the link and paste the code + + + + {/* generate call link shortly */} + + {appConfig?.discordExternalURL} + + + + + + Please ensure you’re logged into your Discord account. Click on Complete Verification below once complete. + + + )} +
+ ); +}; + +export default AddDiscord; diff --git a/src/components/UserProfileSettings/AddEmail.form.ts b/src/components/UserProfileSettings/AddEmail.form.ts new file mode 100644 index 0000000000..d552a2b9bd --- /dev/null +++ b/src/components/UserProfileSettings/AddEmail.form.ts @@ -0,0 +1,29 @@ +import { useFormik } from 'formik'; +import * as Yup from 'yup'; +import { getRequiredFieldMessage } from 'common'; + +// Validation schema for the email field +export const emailValidationSchema = Yup.object({ + email: Yup.string().email('Invalid email address').required(getRequiredFieldMessage('Email')), +}); + +// Validation schema for the verification code +export const codeValidationSchema = Yup.object({ + code: Yup.string().length(6, 'Code should be 6 digits').required('Required'), +}); + +// Formik setup for the email form +export const useEmailFormik = (handleSendVerificationCode: () => void) => + useFormik({ + initialValues: { email: '' }, + validationSchema: emailValidationSchema, + onSubmit: handleSendVerificationCode, + }); + +// Formik setup for the code form +export const useCodeFormik = (handleVerificationCode: () => void) => + useFormik({ + initialValues: { code: '' }, + validationSchema: codeValidationSchema, + onSubmit: handleVerificationCode, + }); diff --git a/src/components/UserProfileSettings/AddEmail.tsx b/src/components/UserProfileSettings/AddEmail.tsx new file mode 100644 index 0000000000..535bf11b3c --- /dev/null +++ b/src/components/UserProfileSettings/AddEmail.tsx @@ -0,0 +1,247 @@ +import { FC, useCallback, useEffect, useState } from 'react'; +import { css } from 'styled-components'; +import { useSelector } from 'react-redux'; + +import { useEmailFormik, useCodeFormik } from './AddEmail.form'; // Import Formik hooks +import { ModalResponse } from 'common'; +import { useAccount } from 'hooks'; +import { walletToCAIP10 } from 'helpers/w2w'; +import { useAppContext } from 'contexts/AppContext'; +import { generateVerificationProof } from 'modules/rewards/utils/generateVerificationProof'; +import { useSendHandlesVerificationCode, useVerifyHandlesVerificationCode } from 'queries'; + +import { Box, Modal, Spinner, Text, TextInput } from 'blocks'; + +type AddEmailProps = { + modalControl: ModalResponse; + refetchSocialHandleStatus: () => void; + setErrorMessage: (errorMessage: string) => void; + setSuccessMessage: (successMessage: string) => void; +}; + +enum Steps { + EnterEmail = 1, + VerifyCode = 2, +} + +const AddEmail: FC = ({ + modalControl, + refetchSocialHandleStatus, + setErrorMessage, + setSuccessMessage, +}) => { + const { isOpen, onClose } = modalControl; + const { account, wallet } = useAccount(); + const { handleConnectWalletAndEnableProfile } = useAppContext(); + const [isLoading, setIsLoading] = useState(false); + + const caip10WalletAddress = walletToCAIP10({ account }); + const [step, setStep] = useState(1); + const { userPushSDKInstance } = useSelector((state: any) => { + return state.user; + }); + + const { mutate: sendVerification, isPending: isSendingVerification } = useSendHandlesVerificationCode(); + const { mutate: verifyVerification } = useVerifyHandlesVerificationCode(); + + const getSDKInstance = useCallback(async () => { + return userPushSDKInstance?.signer ? userPushSDKInstance : await handleConnectWalletAndEnableProfile({ wallet }); + }, [userPushSDKInstance, handleConnectWalletAndEnableProfile, wallet]); + + const handleSendVerificationCode = async () => { + setIsLoading(true); + const sdkInstance = await getSDKInstance(); + const data = { + wallet: caip10WalletAddress, + value: emailFormik.values.email, + valueType: 'email', + }; + + const verificationProof = await generateVerificationProof(data, sdkInstance); + + if (!verificationProof) return; + + sendVerification( + { + caipAddress: caip10WalletAddress as string, + verificationProof: verificationProof as string, + value: emailFormik.values.email, + social_platform: 'email', + }, + { + onSuccess: (response: any) => { + if (response?.success) { + setStep(Steps.VerifyCode); + } else { + emailFormik?.setFieldError('email', 'Error sending code. Please try again'); + } + setIsLoading(false); + }, + onError: (error: Error) => { + console.log('Error sending code', error); + setIsLoading(false); + }, + } + ); + }; + + const handleVerificationCode = async () => { + const sdkInstance = await getSDKInstance(); + const data = { + wallet: caip10WalletAddress, + value: emailFormik.values.email, + valueType: 'email', + verificationCode: codeFormik.values.code, + }; + + const verificationProof = await generateVerificationProof(data, sdkInstance); + + if (!verificationProof) return; + + verifyVerification( + { + caipAddress: caip10WalletAddress as string, + verificationCode: codeFormik.values.code, + value: emailFormik.values.email, + social_platform: 'email', + }, + { + onSuccess: (response: any) => { + if (response?.success) { + onClose(); + refetchSocialHandleStatus(); + setSuccessMessage('Email Account was linked successfully'); + } else { + codeFormik?.setFieldError('code', 'Error verifying code. Please try again'); + } + }, + onError: (error: Error) => { + console.log('Error verifying code', error); + setErrorMessage('Error verifying code'); + }, + } + ); + }; + + // Formik hooks from form.ts + const emailFormik = useEmailFormik(handleSendVerificationCode); + const codeFormik = useCodeFormik(handleVerificationCode); + + // Watch for code length and submit automatically if it reaches 6 digits + useEffect(() => { + if (codeFormik.values.code.length === 6 && !codeFormik.errors.code) { + codeFormik.submitForm(); + } + }, [codeFormik.values.code, codeFormik.errors.code]); + + const resendVerificationCode = () => { + handleSendVerificationCode(); + }; + + return ( + { + emailFormik.handleSubmit(); + }, + } + : null + } + cancelButtonProps={null} + > + {step === Steps.EnterEmail && ( + + + Enter your email + + + + Confirm your email and verify to connect + + +
+ + + +
+
+ )} + + {step === Steps.VerifyCode && ( + + + Verify Email + + + + We sent you a 6 digit confirmation code to {emailFormik.values.email} Please enter it below to confirm your + email address. + + + + + + + + Didn't receive a code? + + Send code again + + {(isSendingVerification || isLoading) && } + + + )} +
+ ); +}; + +export { AddEmail }; diff --git a/src/components/UserProfileSettings/AddTelegram.form.ts b/src/components/UserProfileSettings/AddTelegram.form.ts new file mode 100644 index 0000000000..35a9aa1777 --- /dev/null +++ b/src/components/UserProfileSettings/AddTelegram.form.ts @@ -0,0 +1,18 @@ +import { useFormik } from 'formik'; +import * as Yup from 'yup'; +import { getRequiredFieldMessage } from 'common'; + +// Validation schema for the telegram field +const telegramValidationSchema = Yup.object({ + telegram: Yup.string().required(getRequiredFieldMessage('Telegram')), +}); + +// Formik setup for the code form +export const useTelegramFormik = (handleSendVerificationCode: () => void) => + useFormik({ + initialValues: { telegram: '' }, + validationSchema: telegramValidationSchema, + onSubmit: () => { + handleSendVerificationCode(); + }, + }); diff --git a/src/components/UserProfileSettings/AddTelegram.tsx b/src/components/UserProfileSettings/AddTelegram.tsx new file mode 100644 index 0000000000..9bee8d59fc --- /dev/null +++ b/src/components/UserProfileSettings/AddTelegram.tsx @@ -0,0 +1,274 @@ +import { FC, useCallback, useState } from 'react'; +import { useSelector } from 'react-redux'; + +import { CopyButton, ModalResponse } from 'common'; +import { useAccount } from 'hooks'; +import { useAppContext } from 'contexts/AppContext'; +import { walletToCAIP10 } from 'helpers/w2w'; +import { generateVerificationProof } from 'modules/rewards/utils/generateVerificationProof'; +import { useSendHandlesVerificationCode } from 'queries'; +import { appConfig } from 'config'; + +import { Box, Link, Modal, Telegram, Text, TextInput } from 'blocks'; +import { shortenText } from 'helpers/UtilityHelper'; +import { useTelegramFormik } from './AddTelegram.form'; +import { css } from 'styled-components'; + +type AddTelegramProps = { + modalControl: ModalResponse; + refetchSocialHandleStatus: () => void; + setErrorMessage: (errorMessage: string) => void; + setSuccessMessage: (successMessage: string) => void; +}; + +enum Steps { + EnterTelegram = 1, + VerifyId = 2, +} + +const AddTelegram: FC = ({ + modalControl, + refetchSocialHandleStatus, + // setErrorMessage, + setSuccessMessage, +}) => { + const { isOpen, onClose } = modalControl; + const { account, wallet } = useAccount(); + const { handleConnectWalletAndEnableProfile } = useAppContext(); + + const caip10WalletAddress = walletToCAIP10({ account }); + const [step, setStep] = useState(1); + const [telegramCode, setTelegramCode] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const { userPushSDKInstance } = useSelector((state: any) => { + return state.user; + }); + + const { mutate: sendVerification, isPending: isSendingVerification } = useSendHandlesVerificationCode(); + + const getSDKInstance = useCallback(async () => { + return userPushSDKInstance?.signer ? userPushSDKInstance : await handleConnectWalletAndEnableProfile({ wallet }); + }, [userPushSDKInstance, handleConnectWalletAndEnableProfile, wallet]); + + const handleSendVerificationCode = async () => { + setIsLoading(true); + const sdkInstance = await getSDKInstance(); + const data = { + wallet: caip10WalletAddress, + value: { telegram_username: telegramFormik.values.telegram }, + valueType: 'telegram', + }; + + const verificationProof = await generateVerificationProof(data, sdkInstance); + + if (!verificationProof) return; + + sendVerification( + { + caipAddress: caip10WalletAddress as string, + verificationProof: verificationProof as string, + value: { telegram_username: telegramFormik.values.telegram }, + social_platform: 'telegram', + }, + { + onSuccess: (response: any) => { + if (response?.success) { + setTelegramCode(response.verificationCode); + setStep(Steps.VerifyId); + } else { + telegramFormik?.setFieldError('telegram', 'Error sending code. Please try again'); + } + setIsLoading(false); + }, + onError: (error: Error) => { + console.log('Error sending code', error); + setIsLoading(false); + }, + } + ); + }; + + // Formik hooks from form.ts + const telegramFormik = useTelegramFormik(handleSendVerificationCode); + + return ( + { + setSuccessMessage('') + refetchSocialHandleStatus(); + onClose(); + }} + {...(step === Steps.VerifyId && { + onBack: () => setStep(Steps.EnterTelegram), + })} + acceptButtonProps={ + step === Steps.EnterTelegram + ? { + children: 'Next', + loading: isSendingVerification || isLoading, + onClick: () => { + telegramFormik?.handleSubmit(); + }, + } + : null + } + cancelButtonProps={null} + > + {step === Steps.EnterTelegram && ( + + + + + + + Enter your Telegram ID + + + + Proceed to the next step after entering your Telegram chat ID + + +
+ + + +
+
+ )} + + {step === Steps.VerifyId && telegramCode && ( + + + + + + + Connect your Telegram + + + + Follow the steps to link your Telegram to Push and receive notifications + + + + + Step 1: Copy the verification code + + + + + {shortenText(`/verify ${caip10WalletAddress}-${telegramCode}`, 10)} + + + {isOpen && ( + + )} + + + + + + Step 2: Visit the link and paste the code + + + + + {appConfig?.telegramExternalURL} + + + + + + Please ensure you’re logged into your Telegram account. Click on Complete Verification below once complete. + + + )} +
+ ); +}; + +export default AddTelegram; diff --git a/src/components/UserProfileSettings/UploadAvatarModal.tsx b/src/components/UserProfileSettings/UploadAvatarModal.tsx new file mode 100644 index 0000000000..febe4bcc3b --- /dev/null +++ b/src/components/UserProfileSettings/UploadAvatarModal.tsx @@ -0,0 +1,171 @@ +import { FC, useRef, useState } from 'react'; +import { css } from 'styled-components'; +import { Box, Button, FileUpload, Modal, Text } from 'blocks'; +import ImageClipper from 'primaries/ImageClipper'; +import { ModalResponse } from 'common'; + +type UploadAvatarModalProps = { + formValues: { picture: string | null }; + setFieldValue: (field: string, value: any) => void; + modalControl: ModalResponse; +}; + +const UploadAvatarModal: FC = ({ formValues, setFieldValue, modalControl }) => { + const { isOpen, onClose } = modalControl; + const childRef = useRef(null); + const [croppedImage, setCroppedImage] = useState(formValues.picture as string); + + // Handle file selection from input + const handleFileChange = async (e: React.ChangeEvent) => { + const file = e.currentTarget.files?.[0]; + setCroppedImage(undefined); + if (file) { + await processFile(file); + } + }; + + // Handle file drop + const handleDrop = async (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + setCroppedImage(undefined); + const file = e.dataTransfer.files?.[0]; + if (file) { + await processFile(file); + } + }; + + // Process selected file + const processFile = async (file: File) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onloadend = () => { + setFieldValue('picture', reader.result as string); // Set as picture + }; + }; + + return ( + + {/* Upload Area */} + + + Upload a PNG, JPG up to 1MB. Crop the image to resize to 128px. + + + + + {croppedImage ? ( + + Cropped Image + + ) : ( + { + setCroppedImage(croppedImg); + setFieldValue('picture', croppedImg); // Set picture value + }} + ref={childRef} + /> + )} + + + + Drag and Drop or + + + + + + + + {/* Action Button */} + + {croppedImage ? ( + + ) : ( + + )} + + + ); +}; + +export default UploadAvatarModal; diff --git a/src/components/UserProfileSettings/UserProfileSettings.form.ts b/src/components/UserProfileSettings/UserProfileSettings.form.ts new file mode 100644 index 0000000000..52b7ac75e5 --- /dev/null +++ b/src/components/UserProfileSettings/UserProfileSettings.form.ts @@ -0,0 +1,27 @@ +import { useFormik } from 'formik'; +import * as Yup from 'yup'; +import { getRequiredFieldMessage } from 'common'; + +// Define Formik initial values type +type FormValues = { + displayName: string; + picture: string | null; + desc: string | null; +}; + +// Validation schema for the email field +const validationSchema = Yup.object({ + displayName: Yup.string() + .max(50, 'Display Name cannot exceed 50 characters') + .required(getRequiredFieldMessage('Display Name')), + desc: Yup.string().max(150, 'Bio cannot exceed 150 characters').nullable(), +}); + +// Formik setup for the email form +export const useUserFormik = (handleSubmit: () => void) => { + return useFormik({ + initialValues: { displayName: '', picture: null, desc: '' }, // Ensure picture starts as null + validationSchema, + onSubmit: handleSubmit, + }); +}; diff --git a/src/components/UserProfileSettings/UserProfileSettings.tsx b/src/components/UserProfileSettings/UserProfileSettings.tsx new file mode 100644 index 0000000000..b4f721cf1f --- /dev/null +++ b/src/components/UserProfileSettings/UserProfileSettings.tsx @@ -0,0 +1,188 @@ +// React and other libraries +import { FC, useEffect } from 'react'; +import { useSelector } from 'react-redux'; + +// hooks +import { useAccount } from 'hooks'; +import { useAppContext } from 'contexts/AppContext'; +import { useUserFormik } from './UserProfileSettings.form'; + +//Components +import { Box, Button, CameraFilled, TextInput } from 'blocks'; +import { useDisclosure } from 'common'; +import UploadAvatarModal from './UploadAvatarModal'; +import { css } from 'styled-components'; +import { useGetUserProfileInfo, useUpdateUserProfileInfo } from 'queries'; + +type UserProfileSettingsType = { + errorMessage: string; + setErrorMessage: (errorMessage: string) => void; + successMessage: string; + setSuccessMessage: (successMessage: string) => void; +}; + +const UserProfileSettings: FC = ({ setErrorMessage, setSuccessMessage }) => { + const modalControl = useDisclosure(); + const { wallet } = useAccount(); + const { handleConnectWalletAndEnableProfile } = useAppContext(); + const { data: userProfileInfo, refetch: refetchUserInfo } = useGetUserProfileInfo(); + const { mutate: updateUserInfo, isPending: updatingInfo } = useUpdateUserProfileInfo(); + + const { userPushSDKInstance } = useSelector((state: any) => { + return state.user; + }); + + const handleSubmit = async () => { + const sdkInstance = !userPushSDKInstance?.signer + ? (await handleConnectWalletAndEnableProfile({ wallet })) ?? undefined + : userPushSDKInstance; + + updateUserInfo( + { + userPushSDKInstance: sdkInstance, + name: userFormik?.values.displayName, + desc: userFormik?.values.desc, + picture: userFormik?.values.picture, + }, + { + onSuccess: (response: any) => { + console.log(response); + setSuccessMessage('User Details Updated Successfully'); + refetchUserInfo(); + }, + onError: (error: Error) => { + console.log('Error updating user profile info', error); + setErrorMessage('Error while updating User Info!'); + }, + } + ); + }; + + const userFormik = useUserFormik(handleSubmit); + + // Populate initial form values when userProfileInfo is fetched + useEffect(() => { + if (userProfileInfo) { + userFormik.setValues({ + displayName: userProfileInfo.name || '', + picture: userProfileInfo?.picture || null, + desc: userProfileInfo?.desc || null, + }); + } + }, [userProfileInfo]); + + return ( + +
+ + {userFormik.values.picture ? ( + + + + ) : ( + + + + )} + + + + + {modalControl.isOpen && ( + + )} + + + 0 && !userFormik.values.displayName + ? true // Required error on submit + : userFormik.values.displayName.length > 50 // Length error during typing + } + errorMessage={ + userFormik.submitCount > 0 && !userFormik.values.displayName + ? 'Display Name is required' + : userFormik.values.displayName.length > 50 + ? 'Display Name cannot exceed 50 characters' + : '' + } + totalCount={50} + /> + + + + + + + + +
+ ); +}; + +export default UserProfileSettings; diff --git a/src/components/UserProfileSettings/UserProfileSettingsItem.tsx b/src/components/UserProfileSettings/UserProfileSettingsItem.tsx new file mode 100644 index 0000000000..62fb9587fc --- /dev/null +++ b/src/components/UserProfileSettings/UserProfileSettingsItem.tsx @@ -0,0 +1,62 @@ +import { Box, Text, Button, Skeleton } from 'blocks'; + +const UserProfileSettingsItem = ({ item, isPending }: any) => { + return ( + + + + {item?.icon()} + + + + + {item.itemTitle} + + + {item.itemDescription} + + + + + {item.userStatus === null ? ( + + ) : ( + + + + )} + + ); +}; + +export default UserProfileSettingsItem; diff --git a/src/components/UserProfileSettings/UserProfileSocialSettings.tsx b/src/components/UserProfileSettings/UserProfileSocialSettings.tsx new file mode 100644 index 0000000000..a78f97e5f9 --- /dev/null +++ b/src/components/UserProfileSettings/UserProfileSocialSettings.tsx @@ -0,0 +1,134 @@ +// React and other libraries +import { FC, useEffect, useState } from 'react'; +import { css } from 'styled-components'; +import { useSelector } from 'react-redux'; +import { useNavigate } from 'react-router-dom'; + +// Helpers +import UnlockProfileWrapper, { UNLOCK_PROFILE_TYPE } from 'components/chat/unlockProfile/UnlockProfileWrapper'; +import APP_PATHS from 'config/AppPaths'; + +//Components +import { Box, Text } from 'blocks'; +import { AddEmail } from './AddEmail'; +import AddTelegram from './AddTelegram'; +import AddDiscord from './AddDiscord'; +import UserProfileSettingsItem from './UserProfileSettingsItem'; +import { useSocialHandles } from 'modules/dashboard/hooks/useSocialHandles'; + +type UserProfileSocialSettingsType = { + errorMessage?: string; + setErrorMessage: (errorMessage: string) => void; + successMessage?: string; + setSuccessMessage: (successMessage: string) => void; +}; + +const UserProfileSocialSettings: FC = ({ setErrorMessage, setSuccessMessage }) => { + const navigate = useNavigate(); + const [isAuthModalVisible, setIsAuthModalVisible] = useState(true); + + const { userPushSDKInstance } = useSelector((state: any) => { + return state.user; + }); + + const { + socialHandlesList, + modalControl, + telegramModalControl, + discordModalControl, + isPending, + fetchStatus, + channelAddress, + } = useSocialHandles(setErrorMessage, true, userPushSDKInstance); + + useEffect(() => { + if (!userPushSDKInstance || !channelAddress) return; + fetchStatus(); + }, [userPushSDKInstance, channelAddress]); + + useEffect(() => { + setIsAuthModalVisible(userPushSDKInstance && userPushSDKInstance?.readmode()); + }, [userPushSDKInstance]); + + const handleCloseAuthModal = () => { + setIsAuthModalVisible(false); + navigate(APP_PATHS.WelcomeDashboard); + }; + + return ( + + + + Get Notified Anywhere + + + + Connects apps and receive notifications directly in your Email, Telegram and Discord + + + + + {socialHandlesList?.map((item) => ( + + ))} + + + {isAuthModalVisible && ( + + + + )} + + {modalControl.isOpen && ( + + )} + + {telegramModalControl.isOpen && ( + + )} + + {discordModalControl.isOpen && ( + + )} + + ); +}; + +export default UserProfileSocialSettings; diff --git a/src/components/userSettings/UserSettings.tsx b/src/components/userSettings/UserSettings.tsx index 92f5453127..dedbd3663f 100644 --- a/src/components/userSettings/UserSettings.tsx +++ b/src/components/userSettings/UserSettings.tsx @@ -7,18 +7,20 @@ 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'; + // 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'; - -// Internal Configs -import { device } from 'config/Globals'; +import UserProfileSettings from 'components/UserProfileSettings/UserProfileSettings'; import ChannelListSettings from 'components/channel/ChannelListSettings'; import PushSnapSettings from 'components/PushSnap/PushSnapSettings'; import UserPlanAndBillings from 'components/userPlanAndBillings/UserPlanAndBillings'; +import UserProfileSocialSettings from 'components/UserProfileSettings/UserProfileSocialSettings'; interface ChannelListItem { channel: string; @@ -39,6 +41,10 @@ function UserSettings() { const [channelList, setChannelList] = useState([]); const [isLoading, setIsLoading] = useState(true); + // for alerts + const [errorMessage, setErrorMessage] = useState(''); + const [successMessage, setSuccessMessage] = useState(''); + const navigate = useNavigate(); const dispatch = useDispatch(); @@ -97,18 +103,24 @@ function UserSettings() { const selectOptions = [ { value: 0, + label: 'My Profile', + title: 'Your Profile', + section: 'top', + }, + { + value: 1, label: 'Notification Settings', title: 'Notification Settings', section: 'top', }, { - value: 1, + value: 2, label: 'Push Snap', title: '', section: 'top', }, { - value: 2, + value: 3, label: 'Plan & Billing', title: 'Plan & Billing', section: 'bottom', @@ -119,6 +131,7 @@ function UserSettings() { Settings Customize your Push profile or manage your notification preferences + {selectOptions @@ -155,7 +168,7 @@ function UserSettings() { - {/* {successMessage && ( + {successMessage && ( - )} */} + )} - {selectedOption === 2 && ( + {selectedOption === 3 && ( )} - {selectedOption === 0 && } - {selectedOption === 1 && } - {selectedOption === 2 && } + {selectedOption === 0 && ( + + )} + {selectedOption === 1 && } + {selectedOption === 2 && } + {selectedOption === 3 && } + + {selectedOption == 0 && ( + + + + + + )} @@ -339,7 +373,7 @@ const ChannelBlock = styled.div` const ChannelContainer = styled.div<{ selectedOption: number }>` overflow-y: auto; - height: 55vh; + height: ${(props) => (props.selectedOption === 0 ? 'auto' : '55vh')}; padding: 12px; &::-webkit-scrollbar-track { diff --git a/src/config/config-alpha.js b/src/config/config-alpha.js index 0b8eec2949..d89bb6cf42 100644 --- a/src/config/config-alpha.js +++ b/src/config/config-alpha.js @@ -80,6 +80,10 @@ export const config = { extension: 'https://chrome.google.com/webstore/detail/epns-protocol-beta/lbdcbpaldalgiieffakjhiccoeebchmg', howto: 'https://push.org/docs', }, + + // social media integration + telegramExternalURL: 'https://web.telegram.org/k/#@PushCommDevBot', + discordExternalURL: null, }; /** diff --git a/src/config/config-dev.js b/src/config/config-dev.js index 185a95759c..e3bfdb022c 100644 --- a/src/config/config-dev.js +++ b/src/config/config-dev.js @@ -81,6 +81,10 @@ export const config = { extension: 'https://chrome.google.com/webstore/detail/epns-staging-protocol-alp/bjiennpmhdcandkpigcploafccldlakj', howto: 'https://push.org/docs', }, + + // social media integration + telegramExternalURL: 'https://web.telegram.org/k/#@PushCommDevBot', + discordExternalURL: null, }; /** diff --git a/src/config/config-localhost.js b/src/config/config-localhost.js index 686b871736..0f610200e2 100644 --- a/src/config/config-localhost.js +++ b/src/config/config-localhost.js @@ -68,6 +68,10 @@ export const config = { extension: 'https://chrome.google.com/webstore/detail/epns-staging-protocol-alp/bjiennpmhdcandkpigcploafccldlakj', howto: 'https://push.org/docs', }, + + // social media integration + telegramExternalURL: 'https://web.telegram.org/k/#@PushCommDevBot', + discordExternalURL: null, }; /** diff --git a/src/config/config-prod.js b/src/config/config-prod.js index 1ff2de8ea9..ab0d981f89 100644 --- a/src/config/config-prod.js +++ b/src/config/config-prod.js @@ -81,6 +81,10 @@ export const config = { extension: 'https://chrome.google.com/webstore/detail/epns-protocol-beta/lbdcbpaldalgiieffakjhiccoeebchmg', howto: 'https://push.org/docs', }, + + // social media integration + telegramExternalURL: 'https://web.telegram.org/k/#@PushCommBot', + discordExternalURL: null, }; /** diff --git a/src/config/config-staging.js b/src/config/config-staging.js index 6d8e3e6daa..6c769f72a4 100644 --- a/src/config/config-staging.js +++ b/src/config/config-staging.js @@ -83,6 +83,10 @@ export const config = { extension: 'https://chrome.google.com/webstore/detail/epns-staging-protocol-alp/bjiennpmhdcandkpigcploafccldlakj', howto: 'https://push.org/docs', }, + + // social media integration + telegramExternalURL: 'https://web.telegram.org/k/#@PushCommDevBot', + discordExternalURL: null, }; /** diff --git a/src/modules/dashboard/Dashboard.constants.ts b/src/modules/dashboard/Dashboard.constants.ts index 4a9342b255..1e50bdacc2 100644 --- a/src/modules/dashboard/Dashboard.constants.ts +++ b/src/modules/dashboard/Dashboard.constants.ts @@ -1,6 +1,6 @@ import { PushAlpha, PushBot, PushDev } from 'blocks'; -import { ChatType, EnvKeys, SourceKeys } from './Dashboard.types'; +import { ChatType, EnvKeys, SocialHandlesItemType, SourceKeys } from './Dashboard.types'; export const recommendedChatList: ChatType[] = [ { diff --git a/src/modules/dashboard/Dashboard.tsx b/src/modules/dashboard/Dashboard.tsx index d1db76e55b..9272e422e9 100644 --- a/src/modules/dashboard/Dashboard.tsx +++ b/src/modules/dashboard/Dashboard.tsx @@ -1,19 +1,55 @@ // React and other libraries import { FC, useState } from 'react'; +// Hooks +import { useAccount } from 'hooks'; +import { walletToCAIP10 } from 'helpers/w2w'; +import { RewardActivityStatus, useGetRewardsActivity, useGetUserRewardsDetails } from 'queries'; + // Components -import { Box } from 'blocks'; +import { Alert, Box, Button, Link, Skeleton } from 'blocks'; import { AnalyticsOverview } from './components/AnalyticsOverview'; import { ChannelVariantsSection } from './components/ChannelVariantsSection'; import { DashboardHeader } from './components/DashboardHeader'; import { DashboardSubHeader } from './components/DashboardSubHeader'; import { FeaturedChannels } from './components/FeaturedChannels'; import { StakingPools } from './components/StakingPools'; +import { SocialHandles } from './components/Socialhandles'; export type DashboardProps = {}; const Dashboard: FC = () => { + const { isWalletConnected, account } = useAccount(); + + // Getting user Id by wallet address + const caip10WalletAddress = walletToCAIP10({ account }); + const { data: userDetails } = useGetUserRewardsDetails({ + caip10WalletAddress: caip10WalletAddress, + }); + const [showSubHeader, setSubHeaderVisibility] = useState(true); + // for alerts + const [errorMessage, setErrorMessage] = useState(''); + const [successMessage, setSuccessMessage] = useState(''); + + const activityType = ['notifications_integration_email_telegram_discord']; + const { + data: emailTelegramIntegrationStatus, + isLoading: isActivitiesLoading, + // refetch: refetchActivity, + } = useGetRewardsActivity( + { userId: userDetails?.userId as string, activityTypes: activityType }, + { enabled: !!userDetails?.userId && activityType.length > 0 } + ); + + // Type Guard to check if an object is RewardActivityStatus + const isRewardActivityStatus = (obj: any): obj is RewardActivityStatus => { + return obj && typeof obj.status === 'string'; + }; + + const hasUserClaimedEmailTelegramIntegration = + isRewardActivityStatus(emailTelegramIntegrationStatus?.notifications_integration_email_telegram_discord) && + emailTelegramIntegrationStatus.notifications_integration_email_telegram_discord.status === 'COMPLETED'; return ( = () => { flexDirection="column" gap="spacing-md" > + {successMessage && ( + + + + )} + + {errorMessage && ( + + + + )} + + {isWalletConnected && ( + + {hasUserClaimedEmailTelegramIntegration ? ( + + ) : ( + + + + )} + + } + /> + )} = ({ claimButton }) => { + return ( + + + + + Get notified anywhere and earn points + + }>NEW + + + Connect apps and receive notifications directly in your Email, Telegram and Discord + + + + + + + + 1.5x + + + + + + 25,000 + + + {claimButton} + + + ); +}; + +export { ClaimSocialHandles }; diff --git a/src/modules/dashboard/components/ConnectSocialHandles.tsx b/src/modules/dashboard/components/ConnectSocialHandles.tsx new file mode 100644 index 0000000000..df2e551ac1 --- /dev/null +++ b/src/modules/dashboard/components/ConnectSocialHandles.tsx @@ -0,0 +1,125 @@ +import { FC } from 'react'; + +import { Box, Button, Text, Tick, Skeleton } from 'blocks'; +import { AddEmail } from 'components/UserProfileSettings/AddEmail'; +import AddDiscord from 'components/UserProfileSettings/AddDiscord'; +import AddTelegram from 'components/UserProfileSettings/AddTelegram'; +import { useSocialHandles } from '../hooks/useSocialHandles'; + +export type ConnectSocialHandlesProps = { + setErrorMessage: (errorMessage: string) => void; + setSuccessMessage: (successMessage: string) => void; +}; + +const ConnectSocialHandles: FC = ({ setErrorMessage, setSuccessMessage }) => { + const { socialHandlesList, modalControl, telegramModalControl, discordModalControl, isPending, fetchStatus } = + useSocialHandles(setErrorMessage, false); + + return ( + <> + + {socialHandlesList?.map((item) => ( + + + + {item?.icon()} + + + {item.itemTitle} + + + + + {item.itemDescription} + + + + + + {item.userStatus ? ( + + ) : ( + + )} + + + + ))} + + {modalControl.isOpen && ( + + )} + + {telegramModalControl.isOpen && ( + + )} + + {discordModalControl.isOpen && ( + + )} + + + ); +}; + +export { ConnectSocialHandles }; diff --git a/src/modules/dashboard/components/Socialhandles.tsx b/src/modules/dashboard/components/Socialhandles.tsx new file mode 100644 index 0000000000..79e72a9b03 --- /dev/null +++ b/src/modules/dashboard/components/Socialhandles.tsx @@ -0,0 +1,39 @@ +import { FC, ReactNode } from 'react'; + +import { BlocksSpaceType, Box, ResponsiveProp } from 'blocks'; +import { ClaimSocialHandles } from './ClaimSocialHandles'; +import { ConnectSocialHandles } from './ConnectSocialHandles'; + +export type SocialHandlesProps = { + errorMessage?: string; + setErrorMessage: (errorMessage: string) => void; + successMessage?: string; + setSuccessMessage: (successMessage: string) => void; + padding?: ResponsiveProp; + claimButton?: ReactNode; +}; + +const SocialHandles: FC = ({ setErrorMessage, setSuccessMessage, padding, claimButton }) => { + return ( + + {/* Render Claim based on Social Handles if wallet is connected */} + + + {/* Render option to connect Social Handles */} + + + ); +}; + +export { SocialHandles }; diff --git a/src/modules/dashboard/hooks/useSocialHandles.tsx b/src/modules/dashboard/hooks/useSocialHandles.tsx new file mode 100644 index 0000000000..510d6dd744 --- /dev/null +++ b/src/modules/dashboard/hooks/useSocialHandles.tsx @@ -0,0 +1,110 @@ +import React, { useState, useEffect } from 'react'; + +import { useDisclosure } from 'common'; +import { useGetSocialsStatus } from 'queries'; +import { useAccount } from 'hooks'; + +import { walletToCAIP10 } from 'helpers/w2w'; +import { appConfig } from 'config'; +import { generateVerificationProof } from 'modules/rewards/utils/generateVerificationProof'; + +import { PushAPI } from '@pushprotocol/restapi'; + +import { DiscordProfile, EmailProfile, TelegramProfile } from 'blocks'; + +export type SocialHandleStatusType = { + email: string | null; + discord_username: string | null; + telegram_username: string | null; +}; + +type SocialHandlesItemType = { + icon: () => React.JSX.Element; + itemTitle: string; + itemDescription: string; + onClick: () => void; + userStatus: string | null; +}; + +export const useSocialHandles = ( + setErrorMessage: (error: string) => void, + requiresVerificationProof: boolean, + userPushSDKInstance?: PushAPI +) => { + const modalControl = useDisclosure(); + const telegramModalControl = useDisclosure(); + const discordModalControl = useDisclosure(); + const { account } = useAccount(); + const [socialHandleStatus, setSocialHandleStatus] = useState(null); + + const channelAddress = walletToCAIP10({ account }); + const { mutate: fetchSocialStatus, isPending } = useGetSocialsStatus(); + + const fetchStatus = async () => { + if (!channelAddress) return; + + let verificationProof; + + if (requiresVerificationProof) { + const data = { + wallet: channelAddress, + }; + verificationProof = await generateVerificationProof(data, userPushSDKInstance); // Pass your SDK instance if required + if (!verificationProof) return; + } + + fetchSocialStatus( + { channelAddress, ...(requiresVerificationProof && { verificationProof: verificationProof as string }) }, + { + onError: (error) => { + setErrorMessage('Failed to fetch social status.'); + console.error('Error fetching social status:', error); + }, + onSuccess: (data) => { + setSocialHandleStatus(data); + }, + } + ); + }; + + useEffect(() => { + if (channelAddress && !requiresVerificationProof) { + fetchStatus(); + } + }, [channelAddress]); + + const socialHandlesList: SocialHandlesItemType[] = [ + { + icon: () => , + itemTitle: 'Email', + itemDescription: 'Receive notifications in your email inbox', + onClick: () => modalControl.open(), + userStatus: socialHandleStatus?.email || null, + }, + appConfig?.telegramExternalURL && { + icon: () => , + itemTitle: 'Telegram', + itemDescription: 'Receive notifications as Telegram messages', + onClick: () => telegramModalControl.open(), + userStatus: socialHandleStatus?.telegram_username || null, + }, + appConfig?.discordExternalURL && { + icon: () => , + itemTitle: 'Discord', + itemDescription: 'Receive notifications as Discord messages', + onClick: () => discordModalControl.open(), + userStatus: socialHandleStatus?.discord_username || null, + }, + ].filter(Boolean); + + return { + socialHandlesList, + socialHandleStatus, + modalControl, + telegramModalControl, + discordModalControl, + isPending, + fetchStatus, + channelAddress, + }; +}; diff --git a/src/modules/rewards/components/RewardsActivitiesBottomSection.tsx b/src/modules/rewards/components/RewardsActivitiesBottomSection.tsx index 84c3d1f750..54b96a0aae 100644 --- a/src/modules/rewards/components/RewardsActivitiesBottomSection.tsx +++ b/src/modules/rewards/components/RewardsActivitiesBottomSection.tsx @@ -17,16 +17,7 @@ const RewardsActivitiesBottomSection: FC = gap="spacing-lg" margin="spacing-none spacing-none spacing-md spacing-none" > - - - + = () => { ? Array(2).fill(0) : activityList.filter((activity) => activity.index.startsWith(`social-activity`) && activity?.status === 'ENABLED'); + const emailTelegramActivities = activityList.filter( + (activity) => activity.index.startsWith(`custom-delivery`) && activity?.status === 'ENABLED' + )[0]; + const platformRewardActivities = isLoading ? Array(7).fill(0) : activityList.filter((activity) => activity.index.startsWith(`reward-activity`) && activity?.status === 'ENABLED'); - const channelSubscriptionActivities = activityList.filter( - (activity) => activity.index.startsWith(`channel-subscription`) && activity?.status === 'ENABLED' + const channelSubscriptionActivities = activityList.filter((activity) => + activity.index.startsWith(`channel-subscription`) ); const { isLocked } = useRewardsContext(); // Combine all activities into a single array - const allActivities = [...socialActivities, ...platformRewardActivities, ...channelSubscriptionActivities]; + const allActivities = [ + ...socialActivities, + ...platformRewardActivities, + ...channelSubscriptionActivities, + emailTelegramActivities, + ]; // Extract the `activityType` from each activity and filter out any undefined values const activityTypes = allActivities - .map((activity) => activity.activityType) // Extract `activityType` + .map((activity) => activity?.activityType) // Extract `activityType` .filter(Boolean); // Remove undefined/null values const { @@ -70,84 +80,122 @@ const RewardsActivitiesList: FC = () => { - {/* These are the social activites Twitter and discord */} - {socialActivities.map((activity: Activity) => ( - - ))} - {(isLocked || !isWalletConnected) && ( - + - + + {/* These are the social activites Twitter and discord */} + {socialActivities.map((activity: Activity) => ( + - - Verify X and Discord to unlock more activities - - - )} - - {/* Activites related specific channel subscription */} - {channelSubscriptionActivities.map((activity: Activity) => ( - - ))} - - {/* These are other platform specifc reward activities */} - {platformRewardActivities.map((activity: Activity) => ( - + + Verify X and Discord to unlock more activities + + + )} + + - ))} + + + + {/* Activites related specific channel subscription */} + {channelSubscriptionActivities.map((activity: Activity) => ( + + ))} + + {/* These are other platform specifc reward activities */} + {platformRewardActivities.map((activity: Activity) => ( + + ))} + ); }; diff --git a/src/modules/rewards/components/RewardsActivitiesSection.tsx b/src/modules/rewards/components/RewardsActivitiesSection.tsx index 9ee6e43d7d..707b7f54b4 100644 --- a/src/modules/rewards/components/RewardsActivitiesSection.tsx +++ b/src/modules/rewards/components/RewardsActivitiesSection.tsx @@ -1,22 +1,7 @@ -import { Box, Text } from 'blocks'; import { RewardsActivitiesList } from './RewardsActivitiesList'; const RewardsActivitiesSection = () => { - return ( - - - Activities - - - - ); + return ; }; export { RewardsActivitiesSection }; diff --git a/src/modules/rewards/components/SocialHandleItem.tsx b/src/modules/rewards/components/SocialHandleItem.tsx new file mode 100644 index 0000000000..88eeaf945b --- /dev/null +++ b/src/modules/rewards/components/SocialHandleItem.tsx @@ -0,0 +1,118 @@ +import { FC, useEffect, useMemo, useState } from 'react'; + +import { Activity, StakeActivityResponse, UsersActivity } from 'queries'; +import { useAccount } from 'hooks'; +import useLockedStatus from '../hooks/useLockedStatus'; + +import { Alert, Box, Button, Skeleton } from 'blocks'; +import { ActivityButton } from './ActivityButton'; +import { SocialHandles } from 'modules/dashboard/components/Socialhandles'; + +export type SocialHandleItemFCType = { + userId: string; + activity: Activity; + isLoadingItem: boolean; + isLocked: boolean; + allUsersActivity: StakeActivityResponse; + isAllActivitiesLoading: boolean; + refetchActivity: () => void; +}; + +const SocialHandleItem: FC = ({ + userId, + activity, + isLoadingItem, + isLocked, + allUsersActivity, + isAllActivitiesLoading, + refetchActivity, +}) => { + const { isWalletConnected } = useAccount(); + const usersSingleActivity = allUsersActivity?.[activity?.activityType] as UsersActivity; + const isLoading = isAllActivitiesLoading; + + // for alerts + const [errorMessage, setErrorMessage] = useState(''); + const [successMessage, setSuccessMessage] = useState(''); + const { refetchRecentActivities, getLockStatus, statusRecentActivities } = useLockedStatus(); + + const isRewardsLocked = useMemo(() => { + return ( + (isLocked || !isWalletConnected) && + activity?.activityType !== 'follow_push_on_discord' && + activity?.activityType !== 'follow_push_on_twitter' + ); + }, [isLocked, isWalletConnected, activity?.activityType]); + + const updateActivities = () => { + refetchActivity(); + refetchRecentActivities(); + }; + + // if activityType is twitter or discord, then re-call check lock status fn + useEffect(() => { + if (activity?.activityType == 'follow_push_on_discord' || activity?.activityType == 'follow_push_on_twitter') { + getLockStatus(); + } + }, [usersSingleActivity?.status, activity?.activityType, statusRecentActivities]); + + return ( + + + {successMessage && ( + + + + )} + + {errorMessage && ( + + + + )} + + + Locked + + ) : ( + updateActivities()} + setErrorMessage={setErrorMessage} + usersSingleActivity={usersSingleActivity} + isLoadingActivity={isLoading} + label={'Claim'} + /> + ) + } + /> + + + ); +}; + +export default SocialHandleItem; diff --git a/src/modules/rewards/utils/activityTypeArray.ts b/src/modules/rewards/utils/activityTypeArray.ts index 16acfc5963..73ffc620c2 100644 --- a/src/modules/rewards/utils/activityTypeArray.ts +++ b/src/modules/rewards/utils/activityTypeArray.ts @@ -9,6 +9,7 @@ export const otherRewardActivities: ActvityType[] = [ 'active_push_chat_user', 'hold_push_alpha_access_nft', 'hold_push_rockstar_nft', + 'notifications_integration_email_telegram_discord', ]; export const channelSubscriptionActivities: ActvityType[] = [ diff --git a/src/modules/userSettings/UserSettingsModule.tsx b/src/modules/userSettings/UserSettingsModule.tsx index 4571d806b5..4159494578 100644 --- a/src/modules/userSettings/UserSettingsModule.tsx +++ b/src/modules/userSettings/UserSettingsModule.tsx @@ -7,7 +7,6 @@ import styled from 'styled-components'; // Internal Compoonents import UserSettings from 'components/userSettings/UserSettings'; - // Internal Configs import GLOBALS, { device, globalsMargin } from 'config/Globals'; @@ -18,7 +17,7 @@ const UserSettingsModule = () => { ); -} +}; // css styles const Container = styled.div` @@ -44,8 +43,8 @@ const Container = styled.div` @media ${device.laptop} { margin: ${GLOBALS.ADJUSTMENTS.MARGIN.MINI_MODULES.TABLET}; height: calc(100vh - ${GLOBALS.CONSTANTS.HEADER_HEIGHT}px - ${globalsMargin.MINI_MODULES.TABLET.TOP} - ${ - globalsMargin.MINI_MODULES.TABLET.BOTTOM - }); + globalsMargin.MINI_MODULES.TABLET.BOTTOM +}); } @media ${device.mobileL} { diff --git a/src/queries/baseURL.ts b/src/queries/baseURL.ts index 961f354b19..799d0a3d70 100644 --- a/src/queries/baseURL.ts +++ b/src/queries/baseURL.ts @@ -20,4 +20,17 @@ export const getRewardsBaseURL = () => { } }; +export const getCustomDeliveryURL = () => { + switch (appConfig.appEnv) { + case 'prod': + return `https://custom-delivery.push.org`; + case 'staging': + return `https://custom-delivery-dev.push.org`; + case 'dev': + return `https://custom-delivery-dev.push.org`; + default: + return `https://custom-delivery-dev.push.org`; + } +}; + export const analyticsBaseURL = 'https://backend.epns.io/apis/v1'; diff --git a/src/queries/hooks/user/index.ts b/src/queries/hooks/user/index.ts index 9df9805f44..8b2966f7e5 100644 --- a/src/queries/hooks/user/index.ts +++ b/src/queries/hooks/user/index.ts @@ -2,4 +2,9 @@ export * from './useGetUserSubscriptions'; export * from './useSubscribeChannel'; export * from './useUnsubscribeChannel'; export * from './useUpdateNotificationSettings'; +export * from './useGetUserProfileInfo'; +export * from './useUpdateUserProfileInfo'; +export * from './useSendHandlesVerificationCode'; +export * from './useVerifyHandlesVerificationCode'; +export * from './useGetSocialsStatus'; export * from './useGetUserProfileDetails'; diff --git a/src/queries/hooks/user/useGetSocialsStatus.ts b/src/queries/hooks/user/useGetSocialsStatus.ts new file mode 100644 index 0000000000..2090a9a18d --- /dev/null +++ b/src/queries/hooks/user/useGetSocialsStatus.ts @@ -0,0 +1,10 @@ +import { useMutation } from '@tanstack/react-query'; + +import { userSocialStatus } from '../../queryKeys'; +import { getUserSocialsStatus } from '../../services'; + +export const useGetSocialsStatus = () => + useMutation({ + mutationKey: [userSocialStatus], + mutationFn: getUserSocialsStatus, + }); diff --git a/src/queries/hooks/user/useGetUserProfileInfo.ts b/src/queries/hooks/user/useGetUserProfileInfo.ts new file mode 100644 index 0000000000..b006400904 --- /dev/null +++ b/src/queries/hooks/user/useGetUserProfileInfo.ts @@ -0,0 +1,22 @@ +import { useQuery, UseQueryOptions } from '@tanstack/react-query'; +import { useSelector } from 'react-redux'; + +import { userProfileInfo } from '../../queryKeys'; +import { getUserProfileInfo } from '../../services'; + +//Types +import { UserStoreType } from 'types'; +import { UserProfileInfoResponse } from 'queries/types'; + +export const useGetUserProfileInfo = (config?: Partial>) => { + const { userPushSDKInstance } = useSelector((state: UserStoreType) => { + return state.user; + }); + + const query = useQuery({ + queryKey: [userProfileInfo, userPushSDKInstance?.account], + queryFn: () => getUserProfileInfo(userPushSDKInstance), + ...config, + }); + return query; +}; diff --git a/src/queries/hooks/user/useSendHandlesVerificationCode.ts b/src/queries/hooks/user/useSendHandlesVerificationCode.ts new file mode 100644 index 0000000000..0fc70dcaea --- /dev/null +++ b/src/queries/hooks/user/useSendHandlesVerificationCode.ts @@ -0,0 +1,9 @@ +import { useMutation } from '@tanstack/react-query'; +import { sendVerificationCode } from 'queries/queryKeys'; +import { sendHandlesVerificationCode } from 'queries/services'; + +export const useSendHandlesVerificationCode = () => + useMutation({ + mutationKey: [sendVerificationCode], + mutationFn: sendHandlesVerificationCode, + }); diff --git a/src/queries/hooks/user/useUpdateUserProfileInfo.ts b/src/queries/hooks/user/useUpdateUserProfileInfo.ts new file mode 100644 index 0000000000..34ae314c51 --- /dev/null +++ b/src/queries/hooks/user/useUpdateUserProfileInfo.ts @@ -0,0 +1,9 @@ +import { useMutation } from '@tanstack/react-query'; +import { updateUserProfileDetails } from 'queries/queryKeys'; +import { updateUserProfileInfo } from 'queries/services'; + +export const useUpdateUserProfileInfo = () => + useMutation({ + mutationKey: [updateUserProfileDetails], + mutationFn: updateUserProfileInfo, + }); diff --git a/src/queries/hooks/user/useVerifyHandlesVerificationCode.ts b/src/queries/hooks/user/useVerifyHandlesVerificationCode.ts new file mode 100644 index 0000000000..c764283845 --- /dev/null +++ b/src/queries/hooks/user/useVerifyHandlesVerificationCode.ts @@ -0,0 +1,9 @@ +import { useMutation } from '@tanstack/react-query'; +import { verifyVerificationCode } from 'queries/queryKeys'; +import { verifyHandlesVerificationCode } from 'queries/services'; + +export const useVerifyHandlesVerificationCode = () => + useMutation({ + mutationKey: [verifyVerificationCode], + mutationFn: verifyHandlesVerificationCode, + }); diff --git a/src/queries/models/user/getSocialsStatusModelCreator.ts b/src/queries/models/user/getSocialsStatusModelCreator.ts new file mode 100644 index 0000000000..9c4806ce53 --- /dev/null +++ b/src/queries/models/user/getSocialsStatusModelCreator.ts @@ -0,0 +1,3 @@ +import { UserSocialStatusResponse } from 'queries/types'; + +export const getSocialsStatusModelCreator = (response: UserSocialStatusResponse): UserSocialStatusResponse => response; diff --git a/src/queries/models/user/getUserProfileInfoModelCreator.ts b/src/queries/models/user/getUserProfileInfoModelCreator.ts new file mode 100644 index 0000000000..a34881fef0 --- /dev/null +++ b/src/queries/models/user/getUserProfileInfoModelCreator.ts @@ -0,0 +1,4 @@ +import { UserProfileInfoResponse } from 'queries/types'; + +//any remodelling needed in the response can be done here +export const getUserProfileInfoModelCreator = (response: UserProfileInfoResponse): UserProfileInfoResponse => response; diff --git a/src/queries/models/user/index.ts b/src/queries/models/user/index.ts index ce1d94afca..49ad9da1f6 100644 --- a/src/queries/models/user/index.ts +++ b/src/queries/models/user/index.ts @@ -1,2 +1,6 @@ export * from './getUserSubscriptionsModelCreator'; +export * from './getUserProfileInfoModelCreator'; +export * from './sendHandlesVerificationCodeModelCreator'; +export * from './verifyHandlesVerificationCodeModelCreator'; +export * from './getSocialsStatusModelCreator'; export * from './getUserProfileDetailsModelCreator'; diff --git a/src/queries/models/user/sendHandlesVerificationCodeModelCreator.ts b/src/queries/models/user/sendHandlesVerificationCodeModelCreator.ts new file mode 100644 index 0000000000..2eb7adb782 --- /dev/null +++ b/src/queries/models/user/sendHandlesVerificationCodeModelCreator.ts @@ -0,0 +1,5 @@ +import { SendHandlesVerificationResponse } from 'queries/types'; + +export const sendHandlesVerificationCodeModelCreator = ( + response: SendHandlesVerificationResponse +): SendHandlesVerificationResponse => response; diff --git a/src/queries/models/user/verifyHandlesVerificationCodeModelCreator.ts b/src/queries/models/user/verifyHandlesVerificationCodeModelCreator.ts new file mode 100644 index 0000000000..276e96e7d4 --- /dev/null +++ b/src/queries/models/user/verifyHandlesVerificationCodeModelCreator.ts @@ -0,0 +1,5 @@ +import { VerifyHandlesVerificationResponse } from 'queries/types'; + +export const verifyHandlesVerificationCodeModelCreator = ( + response: VerifyHandlesVerificationResponse +): VerifyHandlesVerificationResponse => response; diff --git a/src/queries/queryKeys.ts b/src/queries/queryKeys.ts index b105f97615..6b531599c0 100644 --- a/src/queries/queryKeys.ts +++ b/src/queries/queryKeys.ts @@ -36,6 +36,8 @@ export const rewardsLeaderboard = 'rewardsLeaderboard'; export const sendNotification = 'sendNotification'; export const sentMessageCount = 'sentMessageCount'; export const sentNotificationCount = 'sentNotificationCount'; +export const sendVerificationCode = 'sendVerificationCode'; +export const verifyVerificationCode = 'verifyVerificationCode'; export const subscribe = 'subscribe'; export const subscriberCount = 'subscriberCount'; export const trendingChannels = 'trendingChannels'; @@ -43,8 +45,11 @@ export const uniV2StakeEpoch = 'uniV2StakeEpoch'; export const unsubscribe = 'unsubscribe'; export const updateChannelDetails = 'updateChannelDetails'; 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'; export const userProfileDetails = 'userProfileDetails'; diff --git a/src/queries/services/user/getUserProfileInfo.ts b/src/queries/services/user/getUserProfileInfo.ts new file mode 100644 index 0000000000..d2130c62a2 --- /dev/null +++ b/src/queries/services/user/getUserProfileInfo.ts @@ -0,0 +1,5 @@ +import { PushAPI } from '@pushprotocol/restapi'; +import { getUserProfileInfoModelCreator } from 'queries/models'; + +export const getUserProfileInfo = (userPushSDKInstance: PushAPI) => + userPushSDKInstance.profile.info().then(getUserProfileInfoModelCreator); diff --git a/src/queries/services/user/getUserSocialsStatus.ts b/src/queries/services/user/getUserSocialsStatus.ts new file mode 100644 index 0000000000..50914e7aac --- /dev/null +++ b/src/queries/services/user/getUserSocialsStatus.ts @@ -0,0 +1,19 @@ +import axios from 'axios'; +import { getCustomDeliveryURL } from 'queries/baseURL'; +import { getSocialsStatusModelCreator } from 'queries/models'; + +type SocialStatusType = { + channelAddress: string; + verificationProof?: string; +}; + +export const getUserSocialsStatus = async (payload: SocialStatusType) => { + const response = await axios({ + method: 'POST', + url: `${getCustomDeliveryURL()}/apis/v1/users/${payload?.channelAddress}`, + data: { + verificationProof: payload?.verificationProof, + }, + }); + return getSocialsStatusModelCreator(response.data); +}; diff --git a/src/queries/services/user/index.ts b/src/queries/services/user/index.ts index da46eb1d04..75b30c5c83 100644 --- a/src/queries/services/user/index.ts +++ b/src/queries/services/user/index.ts @@ -2,4 +2,9 @@ export * from './getUserSubscriptions'; export * from './subscribeToChannel'; export * from './unsubscribeChannel'; export * from './updateNotificationSettings'; +export * from './getUserProfileInfo'; +export * from './updateUserProfileInfo'; +export * from './sendHandlesVerificationCode'; +export * from './verifyHandlesVerificationCode'; +export * from './getUserSocialsStatus'; export * from './getUserProfileDetails'; diff --git a/src/queries/services/user/sendHandlesVerificationCode.ts b/src/queries/services/user/sendHandlesVerificationCode.ts new file mode 100644 index 0000000000..925d3b356c --- /dev/null +++ b/src/queries/services/user/sendHandlesVerificationCode.ts @@ -0,0 +1,26 @@ +import axios from 'axios'; +import { getCustomDeliveryURL } from 'queries/baseURL'; + +import { sendHandlesVerificationCodeModelCreator } from 'queries/models'; + +type sendHandlesVerificationCodeType = { + caipAddress: string; + value: string | { telegram_username: string } | { discord_username: string }; + verificationProof: string; + social_platform: 'email' | 'discord' | 'telegram'; +}; + +export const sendHandlesVerificationCode = async (payload: sendHandlesVerificationCodeType) => { + const response = await axios({ + method: 'POST', + url: `${getCustomDeliveryURL()}/apis/v1/users/verify/init/${payload?.caipAddress}/${payload.social_platform}`, + data: { + value: payload?.value, + verificationProof: payload?.verificationProof, + }, + headers: { + 'Content-Type': 'application/json', + }, + }); + return sendHandlesVerificationCodeModelCreator(response.data); +}; diff --git a/src/queries/services/user/updateUserProfileInfo.ts b/src/queries/services/user/updateUserProfileInfo.ts new file mode 100644 index 0000000000..0bb47b9cfb --- /dev/null +++ b/src/queries/services/user/updateUserProfileInfo.ts @@ -0,0 +1,24 @@ +import { PushAPI } from '@pushprotocol/restapi'; +import { UpdateProfileInfoResponse } from 'queries/types'; + +// Assuming PushAPI.Profile is the type you want to use for userPushSDKInstance +type UpdateUserProfileParams = { + userPushSDKInstance: PushAPI; + name: string | null; + desc: string | null; + picture: string | null; +}; + +export const updateUserProfileInfo = async ({ + userPushSDKInstance, + name, + desc, + picture, +}: UpdateUserProfileParams): Promise => { + const res = await userPushSDKInstance.profile.update({ + name: name as string, + desc: desc ? desc : '', + picture: picture as string, + }); + return res; +}; diff --git a/src/queries/services/user/verifyHandlesVerificationCode.ts b/src/queries/services/user/verifyHandlesVerificationCode.ts new file mode 100644 index 0000000000..c6d7d128e8 --- /dev/null +++ b/src/queries/services/user/verifyHandlesVerificationCode.ts @@ -0,0 +1,26 @@ +import axios from 'axios'; +import { getCustomDeliveryURL } from 'queries/baseURL'; + +import { verifyHandlesVerificationCodeModelCreator } from 'queries/models'; + +type verifyHandlesVerificationCodeType = { + caipAddress: string; + value: string; + verificationCode: string; + social_platform: 'email' | 'discord' | 'telegram'; +}; + +export const verifyHandlesVerificationCode = async (payload: verifyHandlesVerificationCodeType) => { + const response = await axios({ + method: 'POST', + url: `${getCustomDeliveryURL()}/apis/v1/users/verify/${payload?.caipAddress}/${payload?.social_platform}`, + data: { + value: payload?.value, + verificationCode: payload?.verificationCode, + }, + headers: { + 'Content-Type': 'application/json', + }, + }); + return verifyHandlesVerificationCodeModelCreator(response.data); +}; diff --git a/src/queries/types/rewards.ts b/src/queries/types/rewards.ts index 2a8a9cb283..cb206316aa 100644 --- a/src/queries/types/rewards.ts +++ b/src/queries/types/rewards.ts @@ -9,6 +9,7 @@ export type RewardsAcitivitesResponse = { export type ActvityType = | 'follow_push_on_discord' | 'follow_push_on_twitter' + | 'notifications_integration_email_telegram_discord' | 'create_gated_group_push_chat' | 'subscribe_5_channels_push' | 'subscribe_20_channels_push' diff --git a/src/queries/types/user.ts b/src/queries/types/user.ts index 209d773ce9..9a393c2633 100644 --- a/src/queries/types/user.ts +++ b/src/queries/types/user.ts @@ -33,6 +33,38 @@ export type UnsubscribeChannelResponse = { message: string; }; +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; @@ -40,3 +72,4 @@ export type UserProfileDetailsResponse = { picture: string; profileVerificationProof: string | null; }; + From ea0311365a72c4a3f18d759fb042730d086cba68 Mon Sep 17 00:00:00 2001 From: Rohit Malhotra Date: Mon, 23 Dec 2024 11:28:35 +0530 Subject: [PATCH 11/43] analytics fallback added on dashboard (#1992) --- src/modules/dashboard/components/AnalyticsOverview.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/dashboard/components/AnalyticsOverview.tsx b/src/modules/dashboard/components/AnalyticsOverview.tsx index f151379a64..d5b202b79c 100644 --- a/src/modules/dashboard/components/AnalyticsOverview.tsx +++ b/src/modules/dashboard/components/AnalyticsOverview.tsx @@ -43,12 +43,12 @@ const AnalyticsOverview: FC = () => { Analytics Overview Date: Tue, 24 Dec 2024 14:45:29 +0530 Subject: [PATCH 12/43] trending channels fixed (#1994) --- .../components/TrendingChannelsList.tsx | 114 ++++++++++-------- 1 file changed, 66 insertions(+), 48 deletions(-) diff --git a/src/modules/dashboard/components/TrendingChannelsList.tsx b/src/modules/dashboard/components/TrendingChannelsList.tsx index 0643891a6b..8ab807d68e 100644 --- a/src/modules/dashboard/components/TrendingChannelsList.tsx +++ b/src/modules/dashboard/components/TrendingChannelsList.tsx @@ -1,78 +1,96 @@ // React and other libraries //Hooks -import { useGetTrendingChannels } from 'queries/hooks'; +// import { useGetTrendingChannels } from 'queries/hooks'; -//Constants -import { firstEndDate, secondEndDate, startDate, trendingSource } from '../Dashboard.constants'; -import { appConfig } from 'config'; +// //Constants +// import { firstEndDate, secondEndDate, startDate, trendingSource } from '../Dashboard.constants'; +// import { appConfig } from 'config'; -//Utility functions -import { getTrendingChannelsData } from '../Dashboard.utils'; +// //Utility functions +// import { getTrendingChannelsData } from '../Dashboard.utils'; -// Component -import { EmptyChannelList } from './EmptyChannelList'; +// // Component +// import { EmptyChannelList } from './EmptyChannelList'; import { Box, Separator } from 'blocks'; import { ChannelListItem } from './ChannelListItem'; //Types -import { EnvKeys } from '../Dashboard.types'; +// import { EnvKeys } from '../Dashboard.types'; + +// NOTE: This is a temporary list until the trending api works. +const channelList = [ + '0xB88460Bb2696CAb9D66013A05dFF29a28330689D', + + '0x90A48D5CF7343B08dA12E067680B4C6dbfE551Be', + + '0xe56f1D3EDFFF1f25855aEF744caFE7991c224FFF', + + '0xf1A1542Ca902AE861B59bffE77D92E8CD76146f1', + + '0x76bA9825A5F707F133124E4608F1F2Dd1EF4006a', +]; + +// TODO: Uuncomment everything down below to make the treding api works here const TrendingChannelsList = () => { - const { - data: currentData, - isLoading: isLoadingFirstList, - isSuccess: isFirstListLoaded, - refetch, - } = useGetTrendingChannels({ - startDate, - endDate: firstEndDate, - channel: 'All', - source: trendingSource[appConfig.appEnv as EnvKeys], - }); - const { - data: weekData, - isLoading: isLoadingSecondList, - isSuccess: isSecondListLoaded, - refetch: _refetch, - } = useGetTrendingChannels({ - startDate, - endDate: secondEndDate, - channel: 'All', - source: trendingSource[appConfig.appEnv as EnvKeys], - }); - - const isLoadingTrendingChannels = isLoadingFirstList || isLoadingSecondList; - - const isSuccess = isFirstListLoaded || isSecondListLoaded; - - const trendingChannels = getTrendingChannelsData(weekData, currentData); - - const handleRefetch = () => { - refetch(); - _refetch(); - }; + // const { + // data: currentData, + // isLoading: isLoadingFirstList, + // isSuccess: isFirstListLoaded, + // refetch, + // } = useGetTrendingChannels({ + // startDate, + // endDate: firstEndDate, + // channel: 'All', + // source: trendingSource[appConfig.appEnv as EnvKeys], + // }); + // const { + // data: weekData, + // isLoading: isLoadingSecondList, + // isSuccess: isSecondListLoaded, + // refetch: _refetch, + // } = useGetTrendingChannels({ + // startDate, + // endDate: secondEndDate, + // channel: 'All', + // source: trendingSource[appConfig.appEnv as EnvKeys], + // }); + + // const isLoadingTrendingChannels = isLoadingFirstList || isLoadingSecondList; + + // const isSuccess = isFirstListLoaded || isSecondListLoaded; + + // const trendingChannels = getTrendingChannelsData(weekData, currentData); + + // const handleRefetch = () => { + // refetch(); + // _refetch(); + // }; // If there are channels then render them else render 5 skeletons - const channelList = isLoadingTrendingChannels ? Array(5).fill(0) : trendingChannels; + // const channelList = isLoadingTrendingChannels ? Array(5).fill(0) : trendingChannels; return ( <> - {isSuccess && !isLoadingTrendingChannels && !trendingChannels?.length && ( + {/* {isSuccess && !isLoadingTrendingChannels && !trendingChannels?.length && ( - )} + )} */} {channelList.map((channel, index) => ( {}} /> - {index != trendingChannels.length - 1 && } + {/* {index != trendingChannels.length - 1 && } */} + {index != channelList.length - 1 && } ))} From e06d7fd9167240090ec404359322d22064aad918 Mon Sep 17 00:00:00 2001 From: rohitmalhotra1420 Date: Tue, 24 Dec 2024 15:01:32 +0530 Subject: [PATCH 13/43] numbers fixed for analytics --- src/modules/dashboard/components/AnalyticsOverview.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/modules/dashboard/components/AnalyticsOverview.tsx b/src/modules/dashboard/components/AnalyticsOverview.tsx index d5b202b79c..02d345f2be 100644 --- a/src/modules/dashboard/components/AnalyticsOverview.tsx +++ b/src/modules/dashboard/components/AnalyticsOverview.tsx @@ -43,17 +43,17 @@ const AnalyticsOverview: FC = () => { Analytics Overview From ef7c3eab27b176227232e089714d657e65d79294 Mon Sep 17 00:00:00 2001 From: Kolade Date: Tue, 24 Dec 2024 13:41:45 +0100 Subject: [PATCH 14/43] Fix Rewards Toast Notif not closing (#1996) * fix rewards toast notification not closing * remove console --- src/blocks/notification/Notification.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/blocks/notification/Notification.tsx b/src/blocks/notification/Notification.tsx index 8fefbe50af..3cce205613 100644 --- a/src/blocks/notification/Notification.tsx +++ b/src/blocks/notification/Notification.tsx @@ -127,8 +127,7 @@ const notification = { }, hide: () => { if (toastIds.length > 0) { - const toastId = toastIds.pop(); - toast.dismiss(toastId); + toast.dismiss(); } }, }; From aae9ed553b92db6afe33806040aafeb2f675afc4 Mon Sep 17 00:00:00 2001 From: Kolade Date: Tue, 7 Jan 2025 09:57:52 +0100 Subject: [PATCH 15/43] Fix Email/Telegram Issues (#1997) * add claim option in activity * add button * add telegram third step --- .../UserProfileSettings/AddTelegram.tsx | 86 ++++++++++++++++--- .../rewards/components/SocialHandleItem.tsx | 17 +++- .../user/verifyHandlesVerificationCode.ts | 2 +- 3 files changed, 91 insertions(+), 14 deletions(-) diff --git a/src/components/UserProfileSettings/AddTelegram.tsx b/src/components/UserProfileSettings/AddTelegram.tsx index 9bee8d59fc..07839e4407 100644 --- a/src/components/UserProfileSettings/AddTelegram.tsx +++ b/src/components/UserProfileSettings/AddTelegram.tsx @@ -6,10 +6,10 @@ import { useAccount } from 'hooks'; import { useAppContext } from 'contexts/AppContext'; import { walletToCAIP10 } from 'helpers/w2w'; import { generateVerificationProof } from 'modules/rewards/utils/generateVerificationProof'; -import { useSendHandlesVerificationCode } from 'queries'; +import { useSendHandlesVerificationCode, useVerifyHandlesVerificationCode } from 'queries'; import { appConfig } from 'config'; -import { Box, Link, Modal, Telegram, Text, TextInput } from 'blocks'; +import { Box, Button, Link, Modal, Telegram, Text, TextInput } from 'blocks'; import { shortenText } from 'helpers/UtilityHelper'; import { useTelegramFormik } from './AddTelegram.form'; import { css } from 'styled-components'; @@ -29,7 +29,7 @@ enum Steps { const AddTelegram: FC = ({ modalControl, refetchSocialHandleStatus, - // setErrorMessage, + setErrorMessage, setSuccessMessage, }) => { const { isOpen, onClose } = modalControl; @@ -45,6 +45,7 @@ const AddTelegram: FC = ({ }); const { mutate: sendVerification, isPending: isSendingVerification } = useSendHandlesVerificationCode(); + const { mutate: verifyVerification, isPending: isVerifyingTelegram } = useVerifyHandlesVerificationCode(); const getSDKInstance = useCallback(async () => { return userPushSDKInstance?.signer ? userPushSDKInstance : await handleConnectWalletAndEnableProfile({ wallet }); @@ -88,15 +89,53 @@ const AddTelegram: FC = ({ ); }; + const handleVerificationCode = async () => { + const sdkInstance = await getSDKInstance(); + const data = { + wallet: caip10WalletAddress, + value: { telegram_username: telegramFormik.values.telegram }, + valueType: 'telegram', + verificationCode: telegramCode, + }; + + const verificationProof = await generateVerificationProof(data, sdkInstance); + + if (!verificationProof) return; + + verifyVerification( + { + caipAddress: caip10WalletAddress as string, + verificationCode: telegramCode, + value: { telegram_username: telegramFormik.values.telegram }, + social_platform: 'telegram', + }, + { + onSuccess: (response: any) => { + if (response?.success) { + onClose(); + refetchSocialHandleStatus(); + setSuccessMessage('Telegram Account was linked successfully'); + } else { + telegramFormik?.setFieldError('telegram', 'Error verifying code. Please try again'); + } + }, + onError: (error: Error) => { + console.log('Error verifying code', error); + setErrorMessage('Error verifying code'); + }, + } + ); + }; + // Formik hooks from form.ts const telegramFormik = useTelegramFormik(handleSendVerificationCode); return ( { - setSuccessMessage('') + setSuccessMessage(''); refetchSocialHandleStatus(); onClose(); }} @@ -106,12 +145,12 @@ const AddTelegram: FC = ({ acceptButtonProps={ step === Steps.EnterTelegram ? { - children: 'Next', - loading: isSendingVerification || isLoading, - onClick: () => { - telegramFormik?.handleSubmit(); - }, - } + children: 'Next', + loading: isSendingVerification || isLoading, + onClick: () => { + telegramFormik?.handleSubmit(); + }, + } : null } cancelButtonProps={null} @@ -263,8 +302,31 @@ const AddTelegram: FC = ({ variant="bs-regular" color="text-tertiary" > - Please ensure you’re logged into your Telegram account. Click on Complete Verification below once complete. + Please ensure you’re logged into your Telegram account. + + + + Step 3: Click on the Complete Verification button once the above steps are completed + + + + + +
)} diff --git a/src/modules/rewards/components/SocialHandleItem.tsx b/src/modules/rewards/components/SocialHandleItem.tsx index 88eeaf945b..58b58b8cd8 100644 --- a/src/modules/rewards/components/SocialHandleItem.tsx +++ b/src/modules/rewards/components/SocialHandleItem.tsx @@ -7,6 +7,7 @@ import useLockedStatus from '../hooks/useLockedStatus'; import { Alert, Box, Button, Skeleton } from 'blocks'; import { ActivityButton } from './ActivityButton'; import { SocialHandles } from 'modules/dashboard/components/Socialhandles'; +import { useSocialHandles } from 'modules/dashboard/hooks/useSocialHandles'; export type SocialHandleItemFCType = { userId: string; @@ -36,6 +37,8 @@ const SocialHandleItem: FC = ({ const [successMessage, setSuccessMessage] = useState(''); const { refetchRecentActivities, getLockStatus, statusRecentActivities } = useLockedStatus(); + const { socialHandleStatus } = useSocialHandles(setErrorMessage, false); + const isRewardsLocked = useMemo(() => { return ( (isLocked || !isWalletConnected) && @@ -44,6 +47,8 @@ const SocialHandleItem: FC = ({ ); }, [isLocked, isWalletConnected, activity?.activityType]); + const hasUserConnectedAccounts = socialHandleStatus?.email && socialHandleStatus?.telegram_username; + const updateActivities = () => { refetchActivity(); refetchRecentActivities(); @@ -56,6 +61,8 @@ const SocialHandleItem: FC = ({ } }, [usersSingleActivity?.status, activity?.activityType, statusRecentActivities]); + console.log(socialHandleStatus, 'soc soc', hasUserConnectedAccounts); + return ( = ({ > Locked - ) : ( + ) : hasUserConnectedAccounts ? ( = ({ isLoadingActivity={isLoading} label={'Claim'} /> + ) : ( + ) } /> diff --git a/src/queries/services/user/verifyHandlesVerificationCode.ts b/src/queries/services/user/verifyHandlesVerificationCode.ts index c6d7d128e8..1ae6f948c7 100644 --- a/src/queries/services/user/verifyHandlesVerificationCode.ts +++ b/src/queries/services/user/verifyHandlesVerificationCode.ts @@ -5,7 +5,7 @@ import { verifyHandlesVerificationCodeModelCreator } from 'queries/models'; type verifyHandlesVerificationCodeType = { caipAddress: string; - value: string; + value: string | { telegram_username: string } | { discord_username: string }; verificationCode: string; social_platform: 'email' | 'discord' | 'telegram'; }; From 2620b7c7c2708ef8417b7b84b32dc9a7dcc2d8af Mon Sep 17 00:00:00 2001 From: corlard3y Date: Wed, 8 Jan 2025 15:37:38 +0100 Subject: [PATCH 16/43] add basic alert component --- src/blocks/alert/Alert.types.ts | 2 +- src/blocks/alert/Alert.utils.ts | 7 ++ src/blocks/theme/semantics/semantics.alert.ts | 6 +- src/components/userSettings/UserSettings.tsx | 66 +++++++++++-------- 4 files changed, 50 insertions(+), 31 deletions(-) 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/theme/semantics/semantics.alert.ts b/src/blocks/theme/semantics/semantics.alert.ts index 7b9ab7bb79..976610b274 100644 --- a/src/blocks/theme/semantics/semantics.alert.ts +++ b/src/blocks/theme/semantics/semantics.alert.ts @@ -3,22 +3,26 @@ import { colorPrimitives } from '../colors/colors.primitives'; import { textSemantics } from './semantics.text'; export const alertSemantics = { - 'text-default': { light: textSemantics['primary'].light, dark: textSemantics['primary'].dark }, + 'text-default': { light: textSemantics['tertiary'].light, dark: textSemantics['tertiary'].dark }, 'text-body': { light: textSemantics['tertiary'].light, dark: textSemantics['tertiary'].dark }, 'icon-success': { light: colorBrands['success-500'], dark: colorBrands['success-300'] }, 'icon-warning': { light: colorBrands['warning-700'], dark: colorBrands['warning-100'] }, 'icon-error': { light: colorBrands['danger-600'], dark: colorBrands['danger-500'] }, 'icon-info': { light: colorPrimitives['blue-700'], dark: colorPrimitives['blue-100'] }, + 'icon-basic': { light: colorPrimitives['gray-200'], dark: colorPrimitives['gray-100'] }, 'text-cta-success': { light: colorBrands['success-500'], dark: colorBrands['success-300'] }, 'text-cta-warning': { light: colorBrands['warning-700'], dark: colorBrands['warning-100'] }, 'text-cta-error': { light: colorBrands['danger-600'], dark: colorBrands['danger-500'] }, 'text-cta-info': { light: colorPrimitives['blue-700'], dark: colorPrimitives['blue-100'] }, + 'text-cta-basic': { light: colorPrimitives['gray-500'], dark: colorPrimitives['gray-300'] }, 'background-success': { light: colorBrands['success-100'], dark: colorBrands['success-900'] }, 'background-warning': { light: colorBrands['warning-100'], dark: colorBrands['warning-900'] }, 'background-error': { light: colorBrands['danger-100'], dark: colorBrands['danger-900'] }, 'background-info': { light: colorPrimitives['blue-100'], dark: colorPrimitives['blue-900'] }, + 'background-basic': { light: colorPrimitives['white-100'], dark: colorPrimitives['gray-900'] }, 'stroke-success': { light: colorBrands['success-300'], dark: colorBrands['success-700'] }, 'stroke-warning': { light: colorBrands['warning-300'], dark: colorBrands['warning-700'] }, 'stroke-error': { light: colorBrands['danger-300'], dark: colorBrands['danger-700'] }, 'stroke-info': { light: colorPrimitives['blue-300'], dark: colorPrimitives['blue-700'] }, + 'stroke-basic': { light: colorPrimitives['gray-300'], dark: colorPrimitives['gray-700'] }, }; diff --git a/src/components/userSettings/UserSettings.tsx b/src/components/userSettings/UserSettings.tsx index dedbd3663f..4cf0dd37f6 100644 --- a/src/components/userSettings/UserSettings.tsx +++ b/src/components/userSettings/UserSettings.tsx @@ -9,12 +9,12 @@ import { AiOutlineMore } from 'react-icons/ai'; // Internal Configs import { device } from 'config/Globals'; +import { useAccount, useDeviceWidthCheck } 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'; import ChannelListSettings from 'components/channel/ChannelListSettings'; @@ -31,6 +31,8 @@ interface ChannelListItem { } function UserSettings() { + const isMobile = useDeviceWidthCheck(800); + const { account, chainId } = useAccount(); const { userPushSDKInstance } = useSelector((state: any) => { return state.user; @@ -145,14 +147,17 @@ function UserSettings() { {option.label} ))} - - - Developers - - + + {!isMobile && ( + + + Developers + + + )} {selectOptions .filter((option) => option.section === 'bottom') @@ -168,22 +173,25 @@ function UserSettings() { - {successMessage && ( - - - - )} - - {errorMessage && ( - - - + {selectedOption === 0 && ( + <> + {successMessage && ( + + + + )} + {errorMessage && ( + + + + )} + )} {selectedOption === 3 && ( @@ -192,7 +200,7 @@ function UserSettings() { heading="Go Pro for $14.99/mo and unlock access to more features" onAction={() => console.log('idea')} actionText="Upgrade Plan" - variant="info" + variant="basic" /> )} @@ -372,8 +380,8 @@ 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 { From 47bc9ed0d925978930678afbdc2c3adccc512435 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Tue, 21 Jan 2025 11:53:54 +0100 Subject: [PATCH 17/43] chore: add pricing endpoint route --- src/common/components/FAQContainer.tsx | 32 +-- .../pricing/components/PricingPlansList.tsx | 213 +++++++++--------- src/modules/pricing/utils/index.tsx | 60 +++++ src/modules/purchasePlan/PurchasePlan.tsx | 50 +++- .../components/PlanPurchasedModal.tsx | 23 +- .../components/PurchaseSummery.tsx | 56 ++--- .../components/SelectedPlanView.tsx | 39 ++-- src/queries/hooks/index.ts | 1 + src/queries/hooks/pricing/index.ts | 1 + .../hooks/pricing/useGetPricingInfo.ts | 9 + src/queries/models/index.ts | 1 + .../models/pricing/getPricingInfoModel.ts | 3 + src/queries/models/pricing/index.ts | 1 + src/queries/queryKeys.ts | 2 +- src/queries/services/index.ts | 1 + .../services/pricing/getPricingInfo.ts | 9 + src/queries/services/pricing/index.ts | 1 + src/queries/types/pricing.ts | 13 ++ 18 files changed, 332 insertions(+), 183 deletions(-) create mode 100644 src/modules/pricing/utils/index.tsx create mode 100644 src/queries/hooks/pricing/index.ts create mode 100644 src/queries/hooks/pricing/useGetPricingInfo.ts create mode 100644 src/queries/models/pricing/getPricingInfoModel.ts create mode 100644 src/queries/models/pricing/index.ts create mode 100644 src/queries/services/pricing/getPricingInfo.ts create mode 100644 src/queries/services/pricing/index.ts create mode 100644 src/queries/types/pricing.ts diff --git a/src/common/components/FAQContainer.tsx b/src/common/components/FAQContainer.tsx index 1dd0651322..3ccb99131d 100644 --- a/src/common/components/FAQContainer.tsx +++ b/src/common/components/FAQContainer.tsx @@ -84,19 +84,25 @@ const FAQContainer: FC = ({}) => { {faqItem?.question} - {expandedQid === faqItem?.id ? ( - setExpandedQid(null)} - size={28} - /> - ) : ( - setExpandedQid(faqItem?.id)} - size={28} - /> - )} + + {expandedQid === faqItem?.id ? ( + setExpandedQid(null)} + size={28} + /> + ) : ( + setExpandedQid(faqItem?.id)} + size={28} + /> + )} + {expandedQid && expandedQid === faqItem?.id && faqItem.answer} diff --git a/src/modules/pricing/components/PricingPlansList.tsx b/src/modules/pricing/components/PricingPlansList.tsx index f83b9f44c5..352828f54e 100644 --- a/src/modules/pricing/components/PricingPlansList.tsx +++ b/src/modules/pricing/components/PricingPlansList.tsx @@ -1,14 +1,19 @@ import { FC } from 'react'; -import { Box, Button, Link, Meteor, Tag, Text, Tick } from 'blocks'; -import { pricingPlanList } from '../Pricing.constants'; -import { PricingPlanTabsType } from '../Pricing.types'; 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 = () => { + const { data: pricingInfoList, isLoading: isPricingInfoListLoading } = useGetPricingInfo(); return ( = () => { width={{ initial: 'auto', ml: '357px' }} gap="spacing-xs" > - {pricingPlanList.map((planItem, planIndex) => ( - ( + + + + {planItem?.name} + + {planItem?.name === 'Pro' && ( + } + label="Popular" + variant="brand" + size="medium" + /> + )} + - {planItem?.planName} + {/* {planItem?.planFor} */} - {planItem?.isPopular && ( - } - label="Popular" - variant="brand" - size="medium" - /> - )} - - {planItem?.planFor} - - - 0 - ? css` - margin: var(--spacing-none); - ` - : css` - margin: var(--spacing-none) var(--spacing-none) 20px var(--spacing-none); - ` - } + flexDirection="column" + display="flex" + width="auto" + gap="spacing-lg" > - - {planItem?.currency}{' '} - {planItem?.price !== null ? (planItem?.price > 0 ? planItem?.price : 'Free') : 'Talk to us!'} - - 0 + ? css` + margin: var(--spacing-none); + ` + : css` + margin: var(--spacing-none) var(--spacing-none) 20px var(--spacing-none); + ` + } > - {planItem?.billingCriteria} - - + + {planItem?.value >= 0 + ? planItem?.value > 0 + ? planItem?.value?.toLocaleString('en-US', { style: 'currency', currency: 'USD' }) + : 'Free' + : 'Talk to us!'} + + {planItem?.value > 0 && ( + + per month billed yearly + + )} + - 0 ? `/pricing/${planIndex}` : '#'}> - - - + 0 ? `/pricing/${planItem?.id}` : '#'}> + + + - {/* Render the Plan benefit list */} - - {planItem?.planBenefits.map((benefit, benefitIndex) => ( - - + {/* Render the Plan benefit list */} + + {parseStringToArray(planItem?.description).map((benefit, benefitIndex) => ( - {benefit?.limit && ( + + - {benefit?.limit} + {formatSentenceWithBoldNumbers(benefit)} - )} - - {benefit?.benefitName} - + - - ))} + ))} + - + ))} ); 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 index 17521c1479..b5f2d2fd2c 100644 --- a/src/modules/purchasePlan/PurchasePlan.tsx +++ b/src/modules/purchasePlan/PurchasePlan.tsx @@ -1,17 +1,57 @@ import { FC } from 'react'; -import { Box } from 'blocks'; -import { SelectedPlanView } from './components/SelectedPlanView'; -import { PurchaseSummery } from './components/PurchaseSummery'; -import { pricingPlanList } from 'modules/pricing/Pricing.constants'; + 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 selectedPlan = pricingPlanList[toNumber(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 ( void; }; @@ -38,7 +41,7 @@ const PlanPurchasedModal: FC = ({ plan, modalControl, o textAlign="center" variant="h3-semibold" > - Your {plan?.planName} plan is now active + Your {plan?.name} plan is now active = ({ plan, modalControl, o flexDirection="column" gap="spacing-sm" > - {plan?.planBenefits.map((benefit, benefitIndex) => ( + {parseStringToArray(plan?.description)?.map((benefit, benefitIndex) => ( = ({ plan, modalControl, o display="flex" gap="spacing-xxxs" > - {benefit?.limit && ( - - {benefit?.limit} - - )} - {benefit?.benefitName} + {formatSentenceWithBoldNumbers(benefit)} diff --git a/src/modules/purchasePlan/components/PurchaseSummery.tsx b/src/modules/purchasePlan/components/PurchaseSummery.tsx index a9776d61b3..003513213d 100644 --- a/src/modules/purchasePlan/components/PurchaseSummery.tsx +++ b/src/modules/purchasePlan/components/PurchaseSummery.tsx @@ -1,12 +1,13 @@ import { FC, useState } from 'react'; import { Box, Button, ExternalLink, Link, TabItem, Tabs, Text, TextInput, Tick } from 'blocks'; -import { PricingPlan, PricingPlanTabsType } from 'modules/pricing/Pricing.types'; +import { PricingPlanTabsType } from 'modules/pricing/Pricing.types'; import { ConfirmPurchaseModal } from './ConfirmPurchaseModal'; import { PurchasePlanModalTypes } from '../PusrchasePlan.types'; import { PlanPurchasedModal } from './PlanPurchasedModal'; import { useDisclosure } from 'common'; +import { PricingPlanType } from 'queries/types/pricing'; -export type PurchaseSummeryProps = { selectedPlan: PricingPlan }; +export type PurchaseSummeryProps = { selectedPlan: PricingPlanType }; const PurchaseSummery: FC = ({ selectedPlan }) => { const pricingPlanTabs: TabItem[] = [ { @@ -22,14 +23,15 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { ]; const [selectedPricingPlanTab, setSelectedPricingPlanTab] = useState( - pricingPlanTabs[0].key as PricingPlanTabsType + pricingPlanTabs[0].key as PricingPlanTabsType, ); const [email, setEmail] = useState(''); const [isApproved, setIsApproved] = useState(false); const [modalType, setShowModalType] = useState(null); const modalControl = useDisclosure(); - const totalAmount = selectedPlan?.price ? selectedPlan?.price * (selectedPricingPlanTab === 'yearly' ? 12 : 1) : 0; + const totalAmount = selectedPlan?.value ? selectedPlan?.value * (selectedPricingPlanTab === 'yearly' ? 12 : 1) : 0; + const usdcBalance = 0; const handleOnCloseModal = () => { if (modalType === 'confirmPurchase') { @@ -100,7 +102,7 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { color="text-secondary" variant="bl-bold" > - Push {selectedPlan?.planName} + Push {selectedPlan?.name} @@ -148,32 +150,34 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { variant="bs-regular" textAlign="right" > - Balance: 0 + Balance: {usdcBalance} - - - - Get more USDC - - - - + + Get more USDC + + + + + )} {/* Render bottom buttons */} diff --git a/src/modules/purchasePlan/components/SelectedPlanView.tsx b/src/modules/purchasePlan/components/SelectedPlanView.tsx index 761ed6bb6a..9bf933f014 100644 --- a/src/modules/purchasePlan/components/SelectedPlanView.tsx +++ b/src/modules/purchasePlan/components/SelectedPlanView.tsx @@ -1,9 +1,12 @@ import { FC } from 'react'; -import { Box, Link, Text, Tick } from 'blocks'; -import { PricingPlan } from 'modules/pricing/Pricing.types'; import { css } from 'styled-components'; -export type SelectedPlanViewProps = { selectedPlan: PricingPlan }; +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 ( = ({ selectedPlan }) => { padding="spacing-md" width="50%" > - Push {selectedPlan?.planName} + Push {selectedPlan?.name} = ({ selectedPlan }) => { - {selectedPlan?.currency} {selectedPlan?.price} - - - {selectedPlan?.billingCriteria} + {selectedPlan?.value.toLocaleString('en-US', { style: 'currency', currency: 'USD' })} + {selectedPlan?.value > 0 && ( + + per month billed yearly + + )} {/* Render the Plan benefit list */} @@ -46,7 +51,7 @@ const SelectedPlanView: FC = ({ selectedPlan }) => { gap="spacing-sm" padding="spacing-lg spacing-none spacing-none spacing-none" > - {selectedPlan?.planBenefits.map((benefit, benefitIndex) => ( + {parseStringToArray(selectedPlan?.description)?.map((benefit, benefitIndex) => ( = ({ selectedPlan }) => { display="flex" gap="spacing-xxxs" > - {benefit?.limit && ( - - {benefit?.limit} - - )} - {benefit?.benefitName} + {formatSentenceWithBoldNumbers(benefit)} 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..d4457d9bc7 --- /dev/null +++ b/src/queries/hooks/pricing/index.ts @@ -0,0 +1 @@ +export * from './useGetPricingInfo'; 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/models/index.ts b/src/queries/models/index.ts index 66edccfb44..4bebe5470e 100644 --- a/src/queries/models/index.ts +++ b/src/queries/models/index.ts @@ -3,3 +3,4 @@ export * from './user'; export * from './rewards'; export * from './pointsVault'; export * from './chat'; +export * from './pricing'; 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/index.ts b/src/queries/models/pricing/index.ts new file mode 100644 index 0000000000..c4310c1714 --- /dev/null +++ b/src/queries/models/pricing/index.ts @@ -0,0 +1 @@ +export * from './getPricingInfoModel'; diff --git a/src/queries/queryKeys.ts b/src/queries/queryKeys.ts index 6b531599c0..9c7ad3084f 100644 --- a/src/queries/queryKeys.ts +++ b/src/queries/queryKeys.ts @@ -27,6 +27,7 @@ export const pointsVaultSearch = 'pointsVaultSearch'; export const pointsVaultUserLoginKey = 'pointsVaultUserLogin'; export const pushPreviousStakeEpoch = 'pushPreviousStakeEpoch'; export const pushStakeEpoch = 'pushStakeEpoch'; +export const pricingInfo = 'pricingInfo'; export const reactivatingChannel = 'reactivatingChannel'; export const rejectVaultUser = 'rejectVaultUser'; export const removeDelegate = 'removeDelegate'; @@ -48,7 +49,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 0697336462..d06c6ec415 100644 --- a/src/queries/services/index.ts +++ b/src/queries/services/index.ts @@ -6,3 +6,4 @@ export * from './createChannel'; export * from './analytics'; export * from './notificationSettings'; export * from './chat'; +export * from './pricing'; 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/index.ts b/src/queries/services/pricing/index.ts new file mode 100644 index 0000000000..4faf454208 --- /dev/null +++ b/src/queries/services/pricing/index.ts @@ -0,0 +1 @@ +export * from './getPricingInfo'; diff --git a/src/queries/types/pricing.ts b/src/queries/types/pricing.ts new file mode 100644 index 0000000000..90334cffa4 --- /dev/null +++ b/src/queries/types/pricing.ts @@ -0,0 +1,13 @@ +export type PricingPlanType = { + id: number; + name: string; + value: number; + email_quota: number; + telegram_quota: number; + discord_quota: number; + duration: number; + discount: number; + description: string; // Description is a stringified array +}; + +export type PricingInfoResponse = PricingPlanType[]; From 16a644bc09867e81145e0c8d1b95e82d7fb2e34f Mon Sep 17 00:00:00 2001 From: corlard3y Date: Wed, 22 Jan 2025 02:13:18 +0100 Subject: [PATCH 18/43] chore: update plan and billings page --- .../UserPlanAndBillings.tsx | 240 +++++++++++++----- src/components/userSettings/UserSettings.tsx | 28 +- src/components/userSettings/utils/index.tsx | 44 ++++ src/queries/hooks/pricing/index.ts | 1 + .../hooks/pricing/useGetPricingPlanStatus.ts | 9 + .../pricing/getPricingPlanStatusModel.ts | 3 + src/queries/models/pricing/index.ts | 1 + src/queries/queryKeys.ts | 1 + .../services/pricing/getPricingPlanStatus.ts | 9 + src/queries/services/pricing/index.ts | 1 + src/queries/types/pricing.ts | 13 + 11 files changed, 280 insertions(+), 70 deletions(-) create mode 100644 src/components/userSettings/utils/index.tsx create mode 100644 src/queries/hooks/pricing/useGetPricingPlanStatus.ts create mode 100644 src/queries/models/pricing/getPricingPlanStatusModel.ts create mode 100644 src/queries/services/pricing/getPricingPlanStatus.ts diff --git a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx index 4542c7a661..55024c5356 100644 --- a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx +++ b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx @@ -1,18 +1,69 @@ import { css } from 'styled-components'; +import { toNumber } from 'lodash'; +import { useNavigate } from 'react-router-dom'; import { useDisclosure } from 'common'; import { Box, Button, ProgressBar, Text } from 'blocks'; import UpgradePlanModal from './UpgradePlanModal'; +import { useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; +import { useAccount } from 'hooks'; +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; const UserPlanAndBillings = () => { const modalControl = useDisclosure(); + const { account, chainId } = useAccount(); + const navigate = useNavigate(); + const walletAddress = convertAddressToAddrCaip(account, chainId); - const itemNotifications = [ - { title: 'Email Notification Delivery', subtitle: '750 remaining' }, - { title: 'Telegram Notification Delivery', subtitle: '750 remaining' }, - { title: 'Discord Notification Delivery', subtitle: '750 remaining' }, + const { data: pricingInfoList } = useGetPricingInfo(); + const { data: pricingPlanStatus } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + + // const pricingPlanStatus = { + // id: 1, + // channel: 'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681', + // email_quota_used: 0, + // telegram_quota_used: 0, + // discord_quota_used: 0, + // pricing_plan_id: '2', + // email_total_quota: 2000, + // telegram_total_quota: 2000, + // discord_total_quota: 0, + // expirationTimestamp: 1767961517282, + // }; + + const selectedPlan = pricingInfoList?.find( + (planItem: { id: number }) => + planItem?.id == toNumber(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), + ); + + 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?.pricing_plan_id ? ( - - Pro Plan - - - $14.99/mo - - + + {selectedPlan?.name} Plan + + + ${selectedPlan?.value}/mo + + - - - For individuals - - + For individuals + + + billed yearly + + + + - billed yearly - - + + modalControl.open()} + > + Cancel Plan + + + + ) : ( - - - modalControl.open()} + + For individuals + + + + - Cancel Plan - + + - + )} { justifyContent="space-between" gap="spacing-md" > - {itemNotifications.map((item) => ( + {planNotifications?.map((item) => ( { { return state.user; }); @@ -51,6 +55,16 @@ function UserSettings() { const dispatch = useDispatch(); + const { data: pricingPlanStatus } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + + const expirationDetails = calculateExpirationDetails(pricingPlanStatus ?? null); + + const navigateToPricing = () => { + navigate('/pricing'); + }; + const fetchChannelDetails = async (channel: string) => { const details = await userPushSDKInstance.channel.info(channel); if (details) { @@ -71,7 +85,7 @@ function UserSettings() { Object.keys(details).map(async (channel) => { const channelData = await fetchChannelDetails(channel); if (channelData) data.push(channelData); - }) + }), ); setChannelList(data); }; @@ -194,16 +208,24 @@ function UserSettings() { )} - {selectedOption === 3 && ( + {selectedOption === 3 && pricingPlanStatus == null && ( console.log('idea')} + onAction={() => navigateToPricing()} actionText="Upgrade Plan" variant="basic" /> )} + {selectedOption === 3 && pricingPlanStatus != null && !expirationDetails?.isExpired && ( + + )} + {selectOptions[selectedOption]?.title && ( 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/queries/hooks/pricing/index.ts b/src/queries/hooks/pricing/index.ts index d4457d9bc7..84d375b640 100644 --- a/src/queries/hooks/pricing/index.ts +++ b/src/queries/hooks/pricing/index.ts @@ -1 +1,2 @@ export * from './useGetPricingInfo'; +export * from './useGetPricingPlanStatus'; 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/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/index.ts b/src/queries/models/pricing/index.ts index c4310c1714..d39375ee16 100644 --- a/src/queries/models/pricing/index.ts +++ b/src/queries/models/pricing/index.ts @@ -1 +1,2 @@ export * from './getPricingInfoModel'; +export * from './getPricingPlanStatusModel'; diff --git a/src/queries/queryKeys.ts b/src/queries/queryKeys.ts index 9c7ad3084f..eef5f3bd32 100644 --- a/src/queries/queryKeys.ts +++ b/src/queries/queryKeys.ts @@ -28,6 +28,7 @@ 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'; 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/index.ts b/src/queries/services/pricing/index.ts index 4faf454208..711591b9b7 100644 --- a/src/queries/services/pricing/index.ts +++ b/src/queries/services/pricing/index.ts @@ -1 +1,2 @@ export * from './getPricingInfo'; +export * from './getPricingPlanStatus'; diff --git a/src/queries/types/pricing.ts b/src/queries/types/pricing.ts index 90334cffa4..c6415c7a0d 100644 --- a/src/queries/types/pricing.ts +++ b/src/queries/types/pricing.ts @@ -11,3 +11,16 @@ export type PricingPlanType = { }; 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; +} | null; From 1560490d396c5511b01b25a62666e554adbcf54b Mon Sep 17 00:00:00 2001 From: corlard3y Date: Sun, 26 Jan 2025 19:53:38 +0100 Subject: [PATCH 19/43] update channel pages --- src/modules/channelDashboard/ChannelDashboard.tsx | 14 +++++++++++++- src/modules/createChannel/CreateChannel.tsx | 14 +++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/modules/channelDashboard/ChannelDashboard.tsx b/src/modules/channelDashboard/ChannelDashboard.tsx index 4069b4235c..8be61c0539 100644 --- a/src/modules/channelDashboard/ChannelDashboard.tsx +++ b/src/modules/channelDashboard/ChannelDashboard.tsx @@ -14,6 +14,7 @@ import { DashboardActiveState } from './ChannelDashboard.types'; import { EditChannelV2 } from 'modules/editChannel/EditChannelV2'; import useFetchChannelDetails from 'common/hooks/useFetchUsersChannelDetails'; import { useGetChannelCategories } from 'queries'; +import { PurchasePlanAlert } from 'common'; const ChannelDashboard = () => { const [activeState, setActiveState] = useState('dashboard'); @@ -21,7 +22,18 @@ const ChannelDashboard = () => { const { channelDetails, loadingChannelDetails, refetchChannelDetails } = useFetchChannelDetails(); useGetChannelCategories(); return ( - + + + + + {activeState === 'dashboard' && ( { setProgressState(progressInitialState); return false; }, - } + }, ); }; @@ -134,7 +134,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 +142,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 +162,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.', ); } }, - } + }, ); }; @@ -214,12 +214,12 @@ const CreateChannel = () => { return ( handleCreateNewChannel(values)}> {/* Use this wrapper to display the Alert of purchased plan status */} - {/* + - */} + Date: Mon, 27 Jan 2025 16:49:02 +0100 Subject: [PATCH 20/43] chore: add navigation item --- .../UpgradePlanNavigationItem.tsx | 66 +++++++++++++++++++ src/structure/Navigation.tsx | 24 +++++-- 2 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx new file mode 100644 index 0000000000..9d78e57939 --- /dev/null +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -0,0 +1,66 @@ +import { Box, Button, ProgressBar, Sale, Text } from 'blocks'; +import { css } from 'styled-components'; + +export const UpgradePlanNavigationItem = () => { + return ( + + + + Free Plan + + + + + + + Monthly Web2 Notifications + + + + + + 100 remaining + + + + ); +}; diff --git a/src/structure/Navigation.tsx b/src/structure/Navigation.tsx index cb64f8b0db..e3a4006463 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'; type AddNewChainNavigationProps = { channelDetails: ChannelDetails; @@ -209,15 +210,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); @@ -226,7 +227,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)); @@ -678,10 +679,10 @@ function Navigation() { )} - {/* { - section.hasItems + {/* { + section.hasItems ? renderChildItems( - data.drilldown, + data.drilldown, section.opened, GLOBALS.CONSTANTS.NAVBAR_SECTIONS.PRIMARY ) @@ -812,6 +813,12 @@ function Navigation() { justify="flex-end" align="stretch" > + {!sidebarCollapsed && ( + + + + )} + {renderMainItems(navigationSetup.third, GLOBALS.CONSTANTS.NAVBAR_SECTIONS.THIRD)} @@ -923,6 +930,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)` From 5518f3f558993bb38294d2f382d7d7294f823bc3 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Mon, 27 Jan 2025 16:53:35 +0100 Subject: [PATCH 21/43] chore: handle navigation pricing --- .../userPlanAndBillings/UpgradePlanNavigationItem.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index 9d78e57939..0e0915284d 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -1,7 +1,12 @@ import { Box, Button, ProgressBar, Sale, Text } from 'blocks'; +import { useNavigate } from 'react-router-dom'; import { css } from 'styled-components'; export const UpgradePlanNavigationItem = () => { + const navigate = useNavigate(); + const handleGoToPricing = () => { + navigate('/pricing'); + }; return ( { leadingIcon={} size="extraSmall" variant="secondary" + onClick={handleGoToPricing} > Upgrade From b66494e111549130e75e8ba6e4a5041fb2169199 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Tue, 28 Jan 2025 18:38:51 +0100 Subject: [PATCH 22/43] chore: update pricing mobile view --- src/blocks/tabs/Tabs.styled.ts | 12 ++--- src/common/components/FAQContainer.tsx | 11 ++-- src/config/AppPaths.ts | 1 + .../pricing/components/PricingPlanTabs.tsx | 20 ++++---- .../pricing/components/PricingPlansList.tsx | 34 +++++++++++-- .../pricing/components/PricingView.tsx | 9 +++- src/modules/purchasePlan/PurchasePlan.tsx | 3 +- .../components/PurchaseSummery.tsx | 11 ++-- src/pages/PurchasePlanPage.tsx | 4 +- src/primaries/Profile.tsx | 22 ++++---- src/structure/Header.tsx | 50 ++++++++++++++++++- src/structure/MasterInterfacePage.tsx | 2 +- 12 files changed, 134 insertions(+), 45 deletions(-) diff --git a/src/blocks/tabs/Tabs.styled.ts b/src/blocks/tabs/Tabs.styled.ts index bf5b4ffbfa..59b60d1b1b 100644 --- a/src/blocks/tabs/Tabs.styled.ts +++ b/src/blocks/tabs/Tabs.styled.ts @@ -2,7 +2,6 @@ import { Tabs as ReachTabs, TabList, Tab } from '@reach/tabs'; import { textVariants } from '../text'; import styled, { CSSProperties } from 'styled-components'; import { ResponsiveProp } from 'blocks'; -import { deviceMediaQ } from '../theme'; export type TabListProps = { /* Used to align tabs */ @@ -19,9 +18,6 @@ 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-tertiary); border-radius: var(--radius-sm); @@ -41,7 +37,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] { @@ -100,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/common/components/FAQContainer.tsx b/src/common/components/FAQContainer.tsx index 3ccb99131d..4c6050882c 100644 --- a/src/common/components/FAQContainer.tsx +++ b/src/common/components/FAQContainer.tsx @@ -18,18 +18,19 @@ const FAQContainer: FC = ({}) => { return ( {/* Render FAQ left side container */} = ({}) => { {/* Render list of questions with answers */} diff --git a/src/config/AppPaths.ts b/src/config/AppPaths.ts index fd9fad8511..ed9f7b3a75 100644 --- a/src/config/AppPaths.ts +++ b/src/config/AppPaths.ts @@ -33,6 +33,7 @@ const APP_PATHS = { ChannelSettings: '/channel/settings', ClaimGalxe: 'claim/galxe', Pricing: '/pricing', + PurchasePlan: '/pricing/:id', }; export default APP_PATHS; diff --git a/src/modules/pricing/components/PricingPlanTabs.tsx b/src/modules/pricing/components/PricingPlanTabs.tsx index b2474a925a..9055fff6c8 100644 --- a/src/modules/pricing/components/PricingPlanTabs.tsx +++ b/src/modules/pricing/components/PricingPlanTabs.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { TabItem, Tabs } from 'blocks'; +import { Box, TabItem, Tabs } from 'blocks'; import { PricingPlanTabsType } from '../Pricing.types'; import { PricingPlansContainer } from './PricingPlansContainer'; @@ -19,17 +19,19 @@ const PricingPlanTabs = () => { }, ]; const [selectedPricingPlanTab, setSelectedPricingPlanTab] = useState( - pricingPlanTabs[0].key as PricingPlanTabsType + pricingPlanTabs[0].key as PricingPlanTabsType, ); return ( - setSelectedPricingPlanTab(activeKey as PricingPlanTabsType)} - alignTabs="center" - /> + + setSelectedPricingPlanTab(activeKey as PricingPlanTabsType)} + alignTabs="center" + /> + ); }; diff --git a/src/modules/pricing/components/PricingPlansList.tsx b/src/modules/pricing/components/PricingPlansList.tsx index 352828f54e..4b7260fae6 100644 --- a/src/modules/pricing/components/PricingPlansList.tsx +++ b/src/modules/pricing/components/PricingPlansList.tsx @@ -14,18 +14,38 @@ export type PricingPlansListProps = { const PricingPlansList: FC = () => { const { data: pricingInfoList, isLoading: isPricingInfoListLoading } = useGetPricingInfo(); + const pricingList = isPricingInfoListLoading ? Array(4).fill(0) : pricingInfoList; + return ( - {pricingInfoList?.map((planItem, planIndex) => ( + {pricingList?.map((planItem, planIndex) => ( = () => { key={`${planIndex}-pricing-plan-key`} border="border-sm solid stroke-tertiary" borderRadius="radius-lg" - width="296px" + width={{ initial: '296px', ml: '100%' }} backgroundColor={planItem?.name === 'Pro' ? 'surface-primary' : 'surface-transparent'} + css={css` + box-sizing: border-box; + @media (max-width: 1220px) { + width: 100%; + } + `} > = () => { {/* Render plans tab and list */} - + + + = () => { Have more questions? Get in touch with our @@ -58,11 +61,13 @@ const PricingView: FC = () => { to={'#'} textProps={{ variant: 'bl-bold', + as: 'span', css: css` text-decoration-line: underline; `, }} > + {' '} sales team. diff --git a/src/modules/purchasePlan/PurchasePlan.tsx b/src/modules/purchasePlan/PurchasePlan.tsx index b5f2d2fd2c..9fb4389d22 100644 --- a/src/modules/purchasePlan/PurchasePlan.tsx +++ b/src/modules/purchasePlan/PurchasePlan.tsx @@ -54,12 +54,13 @@ const PurchasePlan: FC = ({ index }) => { return ( {/* Render selected plan */} diff --git a/src/modules/purchasePlan/components/PurchaseSummery.tsx b/src/modules/purchasePlan/components/PurchaseSummery.tsx index 003513213d..665ed33629 100644 --- a/src/modules/purchasePlan/components/PurchaseSummery.tsx +++ b/src/modules/purchasePlan/components/PurchaseSummery.tsx @@ -6,6 +6,7 @@ import { PurchasePlanModalTypes } from '../PusrchasePlan.types'; import { PlanPurchasedModal } from './PlanPurchasedModal'; import { useDisclosure } from 'common'; import { PricingPlanType } from 'queries/types/pricing'; +import { css } from 'styled-components'; export type PurchaseSummeryProps = { selectedPlan: PricingPlanType }; const PurchaseSummery: FC = ({ selectedPlan }) => { @@ -46,8 +47,12 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { {/* Render Plan Purchase confirmation modal */} {modalType === 'confirmPurchase' && ( @@ -186,7 +191,7 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { flexDirection="row" gap="spacing-md" > - + - + - + + Push {(pricingPlanStatus && selectedPlan?.name) || 'Free Plan'} + + {pricingPlanStatus?.pricing_plan_id !== '3' && ( + + )} + - - - Monthly Web2 Notifications - + + Monthly Web2 Notifications + - + - - 100 remaining - + + {totalQuota - totalQuotaUsed} remaining + + - + ); }; diff --git a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx index 55024c5356..3b616badfd 100644 --- a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx +++ b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx @@ -5,7 +5,7 @@ import { useNavigate } from 'react-router-dom'; import { useDisclosure } from 'common'; import { Box, Button, ProgressBar, Text } from 'blocks'; -import UpgradePlanModal from './UpgradePlanModal'; +import CancelPlanModal from './CancelPlanModal'; import { useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; import { useAccount } from 'hooks'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; @@ -21,19 +21,6 @@ const UserPlanAndBillings = () => { channelId: walletAddress, }); - // const pricingPlanStatus = { - // id: 1, - // channel: 'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681', - // email_quota_used: 0, - // telegram_quota_used: 0, - // discord_quota_used: 0, - // pricing_plan_id: '2', - // email_total_quota: 2000, - // telegram_total_quota: 2000, - // discord_total_quota: 0, - // expirationTimestamp: 1767961517282, - // }; - const selectedPlan = pricingInfoList?.find( (planItem: { id: number }) => planItem?.id == toNumber(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), @@ -254,7 +241,13 @@ const UserPlanAndBillings = () => { ))} - {modalControl.isOpen && } + {modalControl.isOpen && ( + + )} ); }; diff --git a/src/components/userSettings/UserSettings.tsx b/src/components/userSettings/UserSettings.tsx index 2323cf9a56..c0e955eda8 100644 --- a/src/components/userSettings/UserSettings.tsx +++ b/src/components/userSettings/UserSettings.tsx @@ -211,7 +211,7 @@ function UserSettings() { {selectedOption === 3 && pricingPlanStatus == null && ( navigateToPricing()} actionText="Upgrade Plan" variant="basic" 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/modules/channelDashboard/ChannelDashboard.tsx b/src/modules/channelDashboard/ChannelDashboard.tsx index 8be61c0539..2091030e5f 100644 --- a/src/modules/channelDashboard/ChannelDashboard.tsx +++ b/src/modules/channelDashboard/ChannelDashboard.tsx @@ -1,5 +1,6 @@ // React and other libraries import { useState } from 'react'; +import { useNavigate, useSearchParams } from 'react-router-dom'; // Components import { Box } from 'blocks'; @@ -9,18 +10,80 @@ 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 } from 'common'; +import { useAccount } 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 { PurchasePlanAlert } from 'common'; +import { calculateExpirationDetails } from 'components/userSettings/utils'; 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 { data: pricingPlanStatus } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + + const { data: paymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); + // const pricingPlanStatus = { + // id: 1, + // channel: 'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681', + // email_quota_used: 0, + // telegram_quota_used: 0, + // discord_quota_used: 0, + // pricing_plan_id: '2', + // email_total_quota: 2000, + // telegram_total_quota: 2000, + // discord_total_quota: 0, + // expirationTimestamp: 1767961517282, + // expirationTimestamp: 1715515200000, + // expirationTimestamp: 1739152965000, + // }; + + // const paymentDetails = { + // id: 6, + // channel: 'eip155:11155111:0xd8634c39bbfd4033c0d3289c4515275102423681', + // payment_id: '3idbuzrWTW8w13XwJDQK72', + // pricing_plan_id: '2', + // amount: 1, + // currency: 'USDC', + // created_at: 1736856636, + // payment_network: '11155111', + // payment_status: 'SUCCESS', + // transaction_hash: '0xe1134ad134ccb9247ee9dd4c1b47fad4d9e814bc848fd8a25829d8e17a97a978', + // expires_at: 1736863836, + // message: '', + // durationInMonths: 12, + // }; + 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); + + console.log(expiryDetails, pricingPlanStatus); + return ( { gap="spacing-sm" > - + {/* 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 && expiryDetails?.isExpired && ( + { + navigate('/pricing'); + }} + /> + )} + + {/* Expiry notice alert when expiry is less than 7 days */} + {pricingPlanStatus && parseInt(expiryDetails?.timeRemaining!) < 7 && ( + { + navigate('/pricing'); + }} + /> + )} + + {/* Alert when user is on free plan, and notification limit is already reached */} + {pricingPlanStatus?.pricing_plan_id == '1' && totalQuota - totalQuotaUsed < 100 && ( + { + navigate('/pricing'); + }} + /> + )} {activeState === 'dashboard' && ( diff --git a/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx b/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx index 5e4fe71ede..cdf00e5497 100644 --- a/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx +++ b/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx @@ -9,9 +9,11 @@ import { LOGO_ALIAS_CHAIN } from 'common'; import { shortenText } from 'helpers/UtilityHelper'; -import { ChannelDetails } from 'queries'; +import { ChannelDetails, useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; import APP_PATHS from 'config/AppPaths'; +import { useAccount } from 'hooks'; +import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; type ChannelDashboardInfoProps = { channelDetails?: ChannelDetails; @@ -27,6 +29,18 @@ const ChannelDashboardInfo: FC = ({ isAliasVerified, }) => { const navigate = useNavigate(); + const { account, chainId } = useAccount(); + const walletAddress = convertAddressToAddrCaip(account, chainId); + + const { data: pricingInfoList } = useGetPricingInfo(); + const { data: pricingPlanStatus, isLoading: isPricingPlanStatusLoading } = useGetPricingPlanStatus({ + channelId: walletAddress, + }); + + const selectedPlan = pricingInfoList?.find( + (planItem: { id: number }) => + planItem?.id == parseInt(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), + ); let verifiedAliasChainIds = channelDetails?.aliases @@ -224,6 +238,10 @@ const ChannelDashboardInfo: FC = ({ /> ) : null} + + + {selectedPlan && selectedPlan?.id !== 1 ? : null} + diff --git a/src/modules/pricing/components/PricingPlanTabs.tsx b/src/modules/pricing/components/PricingPlanTabs.tsx index 9055fff6c8..97ea3c64ad 100644 --- a/src/modules/pricing/components/PricingPlanTabs.tsx +++ b/src/modules/pricing/components/PricingPlanTabs.tsx @@ -19,7 +19,7 @@ const PricingPlanTabs = () => { }, ]; const [selectedPricingPlanTab, setSelectedPricingPlanTab] = useState( - pricingPlanTabs[0].key as PricingPlanTabsType, + pricingPlanTabs[1].key as PricingPlanTabsType, ); return ( diff --git a/src/modules/pricing/components/PricingPlansList.tsx b/src/modules/pricing/components/PricingPlansList.tsx index 4b7260fae6..3cefa5be34 100644 --- a/src/modules/pricing/components/PricingPlansList.tsx +++ b/src/modules/pricing/components/PricingPlansList.tsx @@ -12,7 +12,7 @@ export type PricingPlansListProps = { type: PricingPlanTabsType; }; -const PricingPlansList: FC = () => { +const PricingPlansList: FC = ({ type }) => { const { data: pricingInfoList, isLoading: isPricingInfoListLoading } = useGetPricingInfo(); const pricingList = isPricingInfoListLoading ? Array(4).fill(0) : pricingInfoList; @@ -120,7 +120,10 @@ const PricingPlansList: FC = () => { > {planItem?.value >= 0 ? planItem?.value > 0 - ? planItem?.value?.toLocaleString('en-US', { style: 'currency', currency: 'USD' }) + ? (type == 'monthly' ? planItem?.value : planItem?.value * 12)?.toLocaleString('en-US', { + style: 'currency', + currency: 'USD', + }) : 'Free' : 'Talk to us!'} @@ -134,7 +137,7 @@ const PricingPlansList: FC = () => { )} - 0 ? `/pricing/${planItem?.id}` : '#'}> + 0 ? `/pricing/${planItem?.id}?type=${type}` : '#'}> - - - + */} + + + - + ); }; diff --git a/src/modules/purchasePlan/utils/handleUSDCutils.ts b/src/modules/purchasePlan/utils/handleUSDCutils.ts new file mode 100644 index 0000000000..d391396764 --- /dev/null +++ b/src/modules/purchasePlan/utils/handleUSDCutils.ts @@ -0,0 +1,52 @@ +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; + } +}; 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/queries/hooks/pricing/index.ts b/src/queries/hooks/pricing/index.ts index 84d375b640..61679937c7 100644 --- a/src/queries/hooks/pricing/index.ts +++ b/src/queries/hooks/pricing/index.ts @@ -1,2 +1,4 @@ export * from './useGetPricingInfo'; export * from './useGetPricingPlanStatus'; +export * from './useInitiatePaymentInfo'; +export * from './useGetPaymentDetails'; 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/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/pricing/getPaymentDetailsModel.ts b/src/queries/models/pricing/getPaymentDetailsModel.ts new file mode 100644 index 0000000000..cf6e960f68 --- /dev/null +++ b/src/queries/models/pricing/getPaymentDetailsModel.ts @@ -0,0 +1 @@ +export const getPaymentDetailsModel = (response: any): any => response; diff --git a/src/queries/models/pricing/handleInitatePaymentModel.ts b/src/queries/models/pricing/handleInitatePaymentModel.ts new file mode 100644 index 0000000000..246a0b8d1c --- /dev/null +++ b/src/queries/models/pricing/handleInitatePaymentModel.ts @@ -0,0 +1 @@ +export const handleInitiatePaymentModel = (response: any): any => response; diff --git a/src/queries/models/pricing/index.ts b/src/queries/models/pricing/index.ts index d39375ee16..b9c990ce87 100644 --- a/src/queries/models/pricing/index.ts +++ b/src/queries/models/pricing/index.ts @@ -1,2 +1,4 @@ export * from './getPricingInfoModel'; export * from './getPricingPlanStatusModel'; +export * from './handleInitatePaymentModel'; +export * from './getPaymentDetailsModel'; diff --git a/src/queries/queryKeys.ts b/src/queries/queryKeys.ts index eef5f3bd32..0fbbf42842 100644 --- a/src/queries/queryKeys.ts +++ b/src/queries/queryKeys.ts @@ -20,6 +20,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'; 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/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 index 711591b9b7..5d1c53530d 100644 --- a/src/queries/services/pricing/index.ts +++ b/src/queries/services/pricing/index.ts @@ -1,2 +1,4 @@ export * from './getPricingInfo'; export * from './getPricingPlanStatus'; +export * from './handleInitiatePayment'; +export * from './getPaymentDetails'; diff --git a/src/structure/Navigation.tsx b/src/structure/Navigation.tsx index e3a4006463..22b373c39c 100644 --- a/src/structure/Navigation.tsx +++ b/src/structure/Navigation.tsx @@ -130,7 +130,7 @@ function Navigation() { const { sidebarCollapsed, setSidebarCollapsed } = useContext(GlobalContext); const CORE_CHAIN_ID = appConfig.coreContractChain; - const { account, chainId } = useAccount(); + const { account, chainId, isWalletConnected } = useAccount(); const { channelDetails } = useFetchChannelDetails(); const filteredAlias = useMemo(() => { @@ -813,7 +813,7 @@ function Navigation() { justify="flex-end" align="stretch" > - {!sidebarCollapsed && ( + {!sidebarCollapsed && isWalletConnected && ( From 2b054263f594c93fa20535893288b4bbb8cd3632 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Thu, 6 Feb 2025 23:01:46 +0100 Subject: [PATCH 24/43] chore: fix payment flow --- .../UpgradePlanNavigationItem.tsx | 3 +- .../channelDashboard/ChannelDashboard.tsx | 15 ++- src/modules/createChannel/CreateChannel.tsx | 38 +++++- .../components/PlanPurchasedModal.tsx | 17 ++- .../components/PurchaseSummery.tsx | 118 ++++++++++-------- .../purchasePlan/utils/handleUSDCutils.ts | 8 ++ 6 files changed, 130 insertions(+), 69 deletions(-) diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index 2349001a82..dfe1d86ef1 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -36,6 +36,7 @@ export const UpgradePlanNavigationItem = () => { const handleGoToPricing = () => { navigate('/pricing'); }; + return ( { color="text-primary" variant="h6-bold" > - Push {(pricingPlanStatus && selectedPlan?.name) || 'Free Plan'} + {(pricingPlanStatus && `Push ${selectedPlan?.name}`) || 'Free Plan'} {pricingPlanStatus?.pricing_plan_id !== '3' && ( - */} - - modalControl.open()} - > - Cancel Plan - ) : ( @@ -273,14 +259,6 @@ const UserPlanAndBillings = () => { ))} - - {modalControl.isOpen && ( - - )} ); }; From ee641317bd340cbaad973d7cb11971929dafecf1 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Wed, 12 Feb 2025 11:36:44 +0100 Subject: [PATCH 30/43] chore: update transfer process --- .../components/PlanPurchasedModal.tsx | 34 ++++- .../components/PurchaseSummery.tsx | 124 ++++++++++-------- 2 files changed, 98 insertions(+), 60 deletions(-) diff --git a/src/modules/purchasePlan/components/PlanPurchasedModal.tsx b/src/modules/purchasePlan/components/PlanPurchasedModal.tsx index 9c9adc8209..87024be7bf 100644 --- a/src/modules/purchasePlan/components/PlanPurchasedModal.tsx +++ b/src/modules/purchasePlan/components/PlanPurchasedModal.tsx @@ -1,4 +1,4 @@ -import { FC } from 'react'; +import { FC, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useBlocksTheme } from 'blocks/Blocks.hooks'; @@ -7,22 +7,39 @@ 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; - channelStatus: boolean; }; -const PlanPurchasedModal: FC = ({ plan, modalControl, paymentId, account, channelStatus }) => { +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 handleRedirect = () => { - if (channelStatus) { + 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(`/create/channel?paymentId=${paymentId}`); @@ -33,7 +50,12 @@ const PlanPurchasedModal: FC = ({ plan, modalControl, p size={'medium'} isOpen={isOpen} onClose={onClose} - acceptButtonProps={{ children: 'Get Started', onClick: () => handleRedirect() }} + acceptButtonProps={{ + children: 'Get Started', + onClick: () => handleRedirect(), + loading: isLoading, + disabled: isLoading, + }} cancelButtonProps={null} > = ({ selectedPlan }) => { @@ -44,17 +49,17 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { const [balance, setBalance] = useState(null); const [errorMessage, setErrorMessage] = useState(null); const [paymentId, setPaymentId] = useState(null); - const [channelStatus, setChannelStatus] = useState(false); - const { userPushSDKInstance } = useSelector((state: any) => { - return state.user; - }); + const totalAmount = selectedPlan?.value ? selectedPlan?.value * (selectedPricingPlanTab === 'yearly' ? 12 : 1) : 0; - const usdcBalance = 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); @@ -69,7 +74,6 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { } }; fetchBalance(); - getChannelDetails(); }, [account, isWalletConnected]); useEffect(() => { @@ -118,10 +122,23 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { 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); - handlePurchase(); } catch (error: any) { + setPaymentId(null); console.error('Transaction failed:', error); // Show error message based on error type @@ -141,52 +158,52 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { } }; - const handlePurchase = async () => { - // 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); - console.log('Message Hash:', messageHash, 'verificationProof:', verificationProof); - - handleInitatePayment( - { - channel: walletAddress, - pricingPlanId: selectedPlan?.id?.toString(), - currency: 'USDC', - network: chainId, - verificationProof: verificationProof!, - email: formik.values.email, - duration: selectedPricingPlanTab === 'yearly' ? '12' : '1', - }, - { - onSuccess: (response) => { - console.log('Response on the channels page', response); - setPaymentId(response?.paymentId); - }, - onError: (error) => { - console.log('Error in the channels', error); - setIsLoading(false); + 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 getChannelDetails = async () => { - const channelDetails = await userPushSDKInstance.channel.info(account); - - if (channelDetails) setChannelStatus(true); + }; + + 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({ @@ -222,7 +239,6 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { plan={selectedPlan} paymentId={paymentId!} account={account!} - channelStatus={channelStatus} /> )} From 59fcf042ebf1ecf0784bf43be77858150e02c903 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Fri, 14 Feb 2025 11:59:43 +0100 Subject: [PATCH 31/43] add migrate hook --- .../UpgradePlanNavigationItem.tsx | 13 ++++- .../hooks/useMigrateToFreePlan.tsx | 48 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index 97aae37385..4c790fc85b 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -7,6 +7,7 @@ import { useAccount } from 'hooks'; import { useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; import { Box, Button, Info, ProgressBar, Sale, Skeleton, Text } from 'blocks'; +import { useMigrateToFreePlan } from './hooks/useMigrateToFreePlan'; export const UpgradePlanNavigationItem = () => { const navigate = useNavigate(); @@ -14,10 +15,20 @@ export const UpgradePlanNavigationItem = () => { const walletAddress = convertAddressToAddrCaip(account, chainId); const { data: pricingInfoList } = useGetPricingInfo(); - const { data: pricingPlanStatus, isLoading: isPricingPlanStatusLoading } = useGetPricingPlanStatus({ + const { + data: pricingPlanStatus, + isLoading: isPricingPlanStatusLoading, + refetch: refetchPricingPlanStatus, + } = useGetPricingPlanStatus({ channelId: walletAddress, }); + useMigrateToFreePlan({ + pricingPlanStatus, + isLoading: isPricingPlanStatusLoading, + refetch: refetchPricingPlanStatus, + }); + const selectedPlan = pricingInfoList?.find( (planItem: { id: number }) => planItem?.id == toNumber(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), diff --git a/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx b/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx new file mode 100644 index 0000000000..83f787e19d --- /dev/null +++ b/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx @@ -0,0 +1,48 @@ +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', + email: '', + 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 }; +}; From 2e939c31bd4946f1a9ec9c28a5d0e2580e7f0acc Mon Sep 17 00:00:00 2001 From: corlard3y Date: Fri, 14 Feb 2025 17:04:16 +0100 Subject: [PATCH 32/43] chore: update free plan migrate --- .../userPlanAndBillings/UpgradePlanNavigationItem.tsx | 2 ++ .../userPlanAndBillings/hooks/useMigrateToFreePlan.tsx | 1 - .../purchasePlan/components/PurchaseSummery.tsx | 10 +++++++--- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index 4c790fc85b..0e845176fe 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -51,6 +51,8 @@ export const UpgradePlanNavigationItem = () => { navigate('/pricing'); }; + console.log(pricingPlanStatus, 'plan status'); + return ( = ({ selectedPlan }) => { const [errorMessage, setErrorMessage] = useState(null); const [paymentId, setPaymentId] = useState(null); - const totalAmount = selectedPlan?.value ? selectedPlan?.value * (selectedPricingPlanTab === 'yearly' ? 12 : 1) : 0; + // 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! }); @@ -118,7 +121,8 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { setIsLoading(true); modalControl.open(); - const paymentAmount = selectedPricingPlanTab === 'yearly' ? selectedPlan?.value * 12 : selectedPlan?.value; + // 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 { @@ -322,7 +326,7 @@ const PurchaseSummery: FC = ({ selectedPlan }) => { padding="spacing-xs spacing-sm" > Total Price - {totalAmount} USDC + {totalAmount.toFixed(2)} USDC {balance && isWalletConnected && ( Date: Fri, 14 Feb 2025 18:50:31 +0100 Subject: [PATCH 33/43] fix: fix pricing numbers --- .../pricing/components/PricingPlansList.tsx | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/src/modules/pricing/components/PricingPlansList.tsx b/src/modules/pricing/components/PricingPlansList.tsx index 3cefa5be34..fc0f6cc8b3 100644 --- a/src/modules/pricing/components/PricingPlansList.tsx +++ b/src/modules/pricing/components/PricingPlansList.tsx @@ -16,6 +16,25 @@ 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 ( = ({ type }) => { color="text-secondary" variant="bm-regular" > - {/* {planItem?.planFor} */} + {pricingListDescriptions?.find((desc) => desc.id === planItem?.id)?.description} @@ -103,36 +122,36 @@ const PricingPlansList: FC = ({ type }) => { width="auto" gap="spacing-lg" > - 0 - ? css` - margin: var(--spacing-none); - ` - : css` - margin: var(--spacing-none) var(--spacing-none) 20px var(--spacing-none); - ` - } - > + {planItem?.value >= 0 ? planItem?.value > 0 - ? (type == 'monthly' ? planItem?.value : planItem?.value * 12)?.toLocaleString('en-US', { + ? (type == 'monthly' ? planItem?.value : planItem?.value * 0.85)?.toLocaleString('en-US', { style: 'currency', currency: 'USD', }) : 'Free' : 'Talk to us!'} + {planItem?.value > 0 && ( - per month billed yearly + {(planItem.id == '2' || planItem.id == '3') && `per month`} {type == 'yearly' && `billed yearly`} + + )} + + {planItem?.id == '4' && ( + + Custom pricing available )} @@ -142,7 +161,7 @@ const PricingPlansList: FC = ({ type }) => { block variant={planItem?.value === 0 ? 'outline' : planItem?.name === 'Pro' ? 'primary' : 'tertiary'} > - Get Started + {planItem.id == '4' ? `Contact Sales` : `Get Started`} From 2f1aec3821863bdf3309e4ac0740d28adf07f1f7 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Mon, 17 Feb 2025 13:18:34 +0100 Subject: [PATCH 34/43] fix: migrate to free plan --- .../UpgradePlanNavigationItem.tsx | 14 +- .../UserPlanAndBillings.tsx | 159 +++++++----------- .../hooks/useMigrateToFreePlan.tsx | 1 + src/components/userSettings/UserSettings.tsx | 19 ++- .../channelDashboard/ChannelDashboard.tsx | 39 +---- src/modules/createChannel/CreateChannel.tsx | 16 +- .../components/PlanPurchasedModal.tsx | 2 +- 7 files changed, 100 insertions(+), 150 deletions(-) diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index 0e845176fe..38a8ca2965 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -23,11 +23,11 @@ export const UpgradePlanNavigationItem = () => { channelId: walletAddress, }); - useMigrateToFreePlan({ - pricingPlanStatus, - isLoading: isPricingPlanStatusLoading, - refetch: refetchPricingPlanStatus, - }); + // useMigrateToFreePlan({ + // pricingPlanStatus, + // isLoading: isPricingPlanStatusLoading, + // refetch: refetchPricingPlanStatus, + // }); const selectedPlan = pricingInfoList?.find( (planItem: { id: number }) => @@ -51,8 +51,6 @@ export const UpgradePlanNavigationItem = () => { navigate('/pricing'); }; - console.log(pricingPlanStatus, 'plan status'); - return ( { color="text-primary" variant="h6-bold" > - {(pricingPlanStatus && `Push ${selectedPlan?.name}`) || 'Free Plan'} + {(pricingPlanStatus && !isUserOnFreePlan && `Push ${selectedPlan?.name}`) || 'Free Plan'} {pricingPlanStatus?.pricing_plan_id !== '3' && ( - + )} - ) : ( + - - - Free Plan - - - - - - For individuals - - - - - - + Upgrade Plan + - )} + { + console.log('handlemigrate'); handleInitatePayment( { channel: walletAddress, diff --git a/src/components/userSettings/UserSettings.tsx b/src/components/userSettings/UserSettings.tsx index 7a95a28183..02e8d8a7a2 100644 --- a/src/components/userSettings/UserSettings.tsx +++ b/src/components/userSettings/UserSettings.tsx @@ -22,9 +22,9 @@ import PushSnapSettings from 'components/PushSnap/PushSnapSettings'; import UserPlanAndBillings from 'components/userPlanAndBillings/UserPlanAndBillings'; import UserProfileSocialSettings from 'components/UserProfileSettings/UserProfileSocialSettings'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; -import { useGetPricingPlanStatus } from 'queries'; +import { useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; import { calculateExpirationDetails } from './utils'; - +import { toNumber } from 'lodash'; interface ChannelListItem { channel: string; @@ -56,10 +56,18 @@ function UserSettings() { const dispatch = useDispatch(); + const { data: pricingInfoList } = useGetPricingInfo(); const { data: pricingPlanStatus } = useGetPricingPlanStatus({ channelId: walletAddress, }); + const selectedPlan = pricingInfoList?.find( + (planItem: { id: number }) => + planItem?.id == toNumber(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), + ); + + const isUserOnFreePlan = selectedPlan?.id == 1; + const expirationDetails = calculateExpirationDetails(pricingPlanStatus ?? null); const navigateToPricing = () => { @@ -123,7 +131,6 @@ function UserSettings() { label: 'My Profile', title: 'Your Profile', section: 'top', - }, { value: 1, @@ -210,7 +217,7 @@ function UserSettings() { )} - {selectedOption === 3 && pricingPlanStatus == null && ( + {selectedOption === 3 && isUserOnFreePlan && ( )} - {selectedOption === 3 && pricingPlanStatus != null && !expirationDetails?.isExpired && ( + {selectedOption === 3 && !isUserOnFreePlan && !expirationDetails?.isExpired && ( {selectOptions[selectedOption]?.title} - )} {selectedOption === 0 && ( @@ -248,7 +254,6 @@ function UserSettings() { {selectedOption === 1 && } {selectedOption === 2 && } {selectedOption === 3 && } - diff --git a/src/modules/channelDashboard/ChannelDashboard.tsx b/src/modules/channelDashboard/ChannelDashboard.tsx index 4d32631c87..1e33a3e7cf 100644 --- a/src/modules/channelDashboard/ChannelDashboard.tsx +++ b/src/modules/channelDashboard/ChannelDashboard.tsx @@ -40,37 +40,10 @@ const ChannelDashboard = () => { (planItem: { id: number }) => planItem?.id == parseInt(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), ); + + const isUserOnFreePlan = selectedPlan?.id == 1; + const { data: paymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); - // const pricingPlanStatus = { - // id: 1, - // channel: 'eip155:11155111:0xD8634C39BBFd4033c0d3289C4515275102423681', - // email_quota_used: 0, - // telegram_quota_used: 0, - // discord_quota_used: 0, - // pricing_plan_id: '2', - // email_total_quota: 2000, - // telegram_total_quota: 2000, - // discord_total_quota: 0, - // expirationTimestamp: 1767961517282, - // expirationTimestamp: 1715515200000, - // expirationTimestamp: 1739152965000, - // }; - - // const paymentDetails = { - // id: 6, - // channel: 'eip155:11155111:0xd8634c39bbfd4033c0d3289c4515275102423681', - // payment_id: '3idbuzrWTW8w13XwJDQK72', - // pricing_plan_id: '2', - // amount: 1, - // currency: 'USDC', - // created_at: 1736856636, - // payment_network: '11155111', - // payment_status: 'SUCCESS', - // transaction_hash: '0xe1134ad134ccb9247ee9dd4c1b47fad4d9e814bc848fd8a25829d8e17a97a978', - // expires_at: 1736863836, - // message: '', - // durationInMonths: 12, - // }; const { channelDetails, loadingChannelDetails, refetchChannelDetails } = useFetchChannelDetails(); useGetChannelCategories(); @@ -106,7 +79,7 @@ const ChannelDashboard = () => { )} {/* Expiry notice alert after plan has expired */} - {pricingPlanStatus && expiryDetails?.isExpired && ( + {pricingPlanStatus && !isUserOnFreePlan && expiryDetails?.isExpired && ( { )} {/* Expiry notice alert when expiry is less than 7 days */} - {pricingPlanStatus && parseInt(expiryDetails?.timeRemaining!) < 7 && ( + {pricingPlanStatus && !isUserOnFreePlan && parseInt(expiryDetails?.timeRemaining!) < 7 && ( { )} {/* Alert when user is on free plan, and notification limit is already reached */} - {pricingPlanStatus?.pricing_plan_id == '1' && totalQuota - totalQuotaUsed < 100 && ( + {isUserOnFreePlan && totalQuota - totalQuotaUsed < 100 && ( { diff --git a/src/modules/createChannel/CreateChannel.tsx b/src/modules/createChannel/CreateChannel.tsx index 577f6be948..492d3ee21c 100644 --- a/src/modules/createChannel/CreateChannel.tsx +++ b/src/modules/createChannel/CreateChannel.tsx @@ -238,13 +238,15 @@ const CreateChannel = () => { 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'); - }} - /> + + { + window.open(`https://sepolia.etherscan.io/tx/${paymentDetails?.transaction_hash}`, '_blank'); + }} + /> + )} = ({ plan, modalControl, p if (isChannelCreated) { navigate(`/channel/${account}?paymentId=${paymentId}`); } else { - navigate(`/create/channel?paymentId=${paymentId}`); + navigate(`/channel/create?paymentId=${paymentId}`); } }; return ( From 805c059c7d31995279f0a63ab649342cef534e95 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Mon, 17 Feb 2025 13:25:21 +0100 Subject: [PATCH 35/43] fix: migrate to free plan --- .../userPlanAndBillings/UpgradePlanNavigationItem.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index 38a8ca2965..e80145b250 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -23,11 +23,11 @@ export const UpgradePlanNavigationItem = () => { channelId: walletAddress, }); - // useMigrateToFreePlan({ - // pricingPlanStatus, - // isLoading: isPricingPlanStatusLoading, - // refetch: refetchPricingPlanStatus, - // }); + useMigrateToFreePlan({ + pricingPlanStatus, + isLoading: isPricingPlanStatusLoading, + refetch: refetchPricingPlanStatus, + }); const selectedPlan = pricingInfoList?.find( (planItem: { id: number }) => From 82670b9bf1da5ed11b3aed42f8d9b502e0fb7079 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Mon, 17 Feb 2025 13:37:42 +0100 Subject: [PATCH 36/43] chore: upgrade dash changes --- .../UpgradePlanNavigationItem.tsx | 18 ++-- .../channelDashboard/ChannelDashboard.tsx | 90 ++++++++++--------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index e80145b250..cadb955ead 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -77,16 +77,14 @@ export const UpgradePlanNavigationItem = () => { > {(pricingPlanStatus && !isUserOnFreePlan && `Push ${selectedPlan?.name}`) || 'Free Plan'} - {pricingPlanStatus?.pricing_plan_id !== '3' && ( - - )} + { flexDirection="column" gap="spacing-sm" > - - {/* 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'); - }} - /> - )} - + {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'); + }} + /> + )} + + )} {activeState === 'dashboard' && ( Date: Mon, 17 Feb 2025 14:37:13 +0100 Subject: [PATCH 37/43] chore: addd new pricing plan hook --- .../UpgradePlanNavigationItem.tsx | 13 ++----- .../UserPlanAndBillings.tsx | 34 ++----------------- src/components/userSettings/UserSettings.tsx | 13 ++----- src/hooks/index.ts | 1 + src/hooks/useGetPricingPlanDetails.tsx | 32 +++++++++++++++++ .../channelDashboard/ChannelDashboard.tsx | 11 ++---- .../components/ChannelDashboardInfo.tsx | 8 ++--- src/modules/createChannel/CreateChannel.tsx | 17 +++------- 8 files changed, 50 insertions(+), 79 deletions(-) create mode 100644 src/hooks/useGetPricingPlanDetails.tsx diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index cadb955ead..c76a2c1e77 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -1,10 +1,9 @@ import { useNavigate } from 'react-router-dom'; import { css } from 'styled-components'; -import { toNumber } from 'lodash'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; -import { useAccount } from 'hooks'; -import { useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; +import { useGetPricingPlanStatus } from 'queries'; import { Box, Button, Info, ProgressBar, Sale, Skeleton, Text } from 'blocks'; import { useMigrateToFreePlan } from './hooks/useMigrateToFreePlan'; @@ -14,7 +13,6 @@ export const UpgradePlanNavigationItem = () => { const { account, chainId } = useAccount(); const walletAddress = convertAddressToAddrCaip(account, chainId); - const { data: pricingInfoList } = useGetPricingInfo(); const { data: pricingPlanStatus, isLoading: isPricingPlanStatusLoading, @@ -22,6 +20,7 @@ export const UpgradePlanNavigationItem = () => { } = useGetPricingPlanStatus({ channelId: walletAddress, }); + const { selectedPlan, isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus); useMigrateToFreePlan({ pricingPlanStatus, @@ -29,11 +28,6 @@ export const UpgradePlanNavigationItem = () => { refetch: refetchPricingPlanStatus, }); - const selectedPlan = pricingInfoList?.find( - (planItem: { id: number }) => - planItem?.id == toNumber(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), - ); - const totalQuota = (pricingPlanStatus?.email_total_quota ?? 0) + (pricingPlanStatus?.discord_total_quota ?? 0) + @@ -45,7 +39,6 @@ export const UpgradePlanNavigationItem = () => { (pricingPlanStatus?.telegram_quota_used ?? 0); const totalQuotaRemaining = totalQuota - totalQuotaUsed; - const isUserOnFreePlan = selectedPlan?.id == 1; const handleGoToPricing = () => { navigate('/pricing'); diff --git a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx index c5fafec8c0..8885719ec1 100644 --- a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx +++ b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx @@ -1,9 +1,8 @@ import { css } from 'styled-components'; -import { toNumber } from 'lodash'; import { useNavigate } from 'react-router-dom'; -import { useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; -import { useAccount } from 'hooks'; +import { useGetPricingPlanStatus } from 'queries'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; import { Box, Button, Info, ProgressBar, Text } from 'blocks'; @@ -12,16 +11,11 @@ const UserPlanAndBillings = () => { const { account, chainId } = useAccount(); const navigate = useNavigate(); const walletAddress = convertAddressToAddrCaip(account, chainId); - - const { data: pricingInfoList } = useGetPricingInfo(); const { data: pricingPlanStatus } = useGetPricingPlanStatus({ channelId: walletAddress, }); - const selectedPlan = pricingInfoList?.find( - (planItem: { id: number }) => - planItem?.id == toNumber(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), - ); + const { selectedPlan, isUserOnFreePlan, pricingListDescriptions } = useGetPricingPlanDetails(pricingPlanStatus); const planNotifications = [ { @@ -44,32 +38,10 @@ const UserPlanAndBillings = () => { }, ]; - const isUserOnFreePlan = selectedPlan?.id == 1; const navigateToPricing = () => { navigate('/pricing'); }; - 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', - }, - ]; - - // console.log(selectedPlan, 'check check'); - return ( - planItem?.id == toNumber(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), - ); - - const isUserOnFreePlan = selectedPlan?.id == 1; + const { isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus); const expirationDetails = calculateExpirationDetails(pricingPlanStatus ?? null); 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..f07a271b13 --- /dev/null +++ b/src/hooks/useGetPricingPlanDetails.tsx @@ -0,0 +1,32 @@ +import { useGetPricingInfo } from 'queries'; + +export const useGetPricingPlanDetails = (pricingPlanStatus: any) => { + 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; + + return { selectedPlan, isUserOnFreePlan, pricingListDescriptions }; +}; diff --git a/src/modules/channelDashboard/ChannelDashboard.tsx b/src/modules/channelDashboard/ChannelDashboard.tsx index 650e7a2dfa..0c17172fc4 100644 --- a/src/modules/channelDashboard/ChannelDashboard.tsx +++ b/src/modules/channelDashboard/ChannelDashboard.tsx @@ -14,7 +14,7 @@ import { UserChannelDashboard } from './components/UserChannelDashboard'; import useFetchChannelDetails from 'common/hooks/useFetchUsersChannelDetails'; import { useGetChannelCategories, useGetPaymentDetails, useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; import { PurchasePlanAlert } from 'common'; -import { useAccount } from 'hooks'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; // Types @@ -31,17 +31,10 @@ const ChannelDashboard = () => { const walletAddress = convertAddressToAddrCaip(account, chainId); const navigate = useNavigate(); - const { data: pricingInfoList } = useGetPricingInfo(); const { data: pricingPlanStatus } = useGetPricingPlanStatus({ channelId: walletAddress, }); - - 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 { selectedPlan, isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus); const { data: paymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); diff --git a/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx b/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx index cdf00e5497..56c4d55f71 100644 --- a/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx +++ b/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx @@ -12,7 +12,7 @@ import { shortenText } from 'helpers/UtilityHelper'; import { ChannelDetails, useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; import APP_PATHS from 'config/AppPaths'; -import { useAccount } from 'hooks'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; type ChannelDashboardInfoProps = { @@ -32,15 +32,11 @@ const ChannelDashboardInfo: FC = ({ const { account, chainId } = useAccount(); const walletAddress = convertAddressToAddrCaip(account, chainId); - const { data: pricingInfoList } = useGetPricingInfo(); const { data: pricingPlanStatus, isLoading: isPricingPlanStatusLoading } = useGetPricingPlanStatus({ channelId: walletAddress, }); - const selectedPlan = pricingInfoList?.find( - (planItem: { id: number }) => - planItem?.id == parseInt(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), - ); + const { selectedPlan } = useGetPricingPlanDetails(pricingPlanStatus); let verifiedAliasChainIds = channelDetails?.aliases diff --git a/src/modules/createChannel/CreateChannel.tsx b/src/modules/createChannel/CreateChannel.tsx index 492d3ee21c..e82ea2a198 100644 --- a/src/modules/createChannel/CreateChannel.tsx +++ b/src/modules/createChannel/CreateChannel.tsx @@ -6,16 +6,10 @@ import { Alert, Box } from 'blocks'; import { appConfig } from 'config'; import APP_PATHS from 'config/AppPaths'; import { PurchasePlanAlert, Stepper } from 'common'; -import { useAccount } from 'hooks'; +import { useAccount, useGetPricingPlanDetails } from 'hooks'; import { CHANNEL_TYPE } from 'helpers/UtilityHelper'; import { IPFSupload } from 'helpers/IpfsHelper'; -import { - useApprovePUSHToken, - useCreateChannel, - useGetPaymentDetails, - useGetPricingInfo, - useGetPricingPlanStatus, -} from 'queries'; +import { useApprovePUSHToken, useCreateChannel, useGetPaymentDetails, useGetPricingPlanStatus } from 'queries'; import { ChannelInfo } from './components/ChannelInfo'; import { @@ -69,15 +63,12 @@ const CreateChannel = () => { const [channelCreationError, setChannelCreationError] = useState(errorInitialState); - const { data: pricingInfoList } = useGetPricingInfo(); const { data: pricingPlanStatus } = useGetPricingPlanStatus({ channelId: walletAddress, }); - const selectedPlan = pricingInfoList?.find( - (planItem: { id: number }) => - planItem?.id == parseInt(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), - ); + const { selectedPlan } = useGetPricingPlanDetails(pricingPlanStatus); + const { data: paymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); const handleProgressBar = (progress: number, progressInfo: string, processingInfo: string) => { From b12d946b27304f44d62f346618a75270ddf7dda7 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Mon, 17 Feb 2025 16:38:24 +0100 Subject: [PATCH 38/43] fix: update usegetpricingdetails hook --- .../UpgradePlanNavigationItem.tsx | 20 +- .../UserPlanAndBillings.tsx | 19 +- src/hooks/useGetPricingPlanDetails.tsx | 3 +- yarn.lock | 677 +++++++++--------- 4 files changed, 358 insertions(+), 361 deletions(-) diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index c76a2c1e77..7217a952a2 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -20,7 +20,7 @@ export const UpgradePlanNavigationItem = () => { } = useGetPricingPlanStatus({ channelId: walletAddress, }); - const { selectedPlan, isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus); + const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan } = useGetPricingPlanDetails(pricingPlanStatus); useMigrateToFreePlan({ pricingPlanStatus, @@ -70,14 +70,16 @@ export const UpgradePlanNavigationItem = () => { > {(pricingPlanStatus && !isUserOnFreePlan && `Push ${selectedPlan?.name}`) || 'Free Plan'} - + {!isUserOnEnterprisePlan && ( + + )} { channelId: walletAddress, }); - const { selectedPlan, isUserOnFreePlan, pricingListDescriptions } = useGetPricingPlanDetails(pricingPlanStatus); + const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan, pricingListDescriptions } = + useGetPricingPlanDetails(pricingPlanStatus); const planNotifications = [ { @@ -109,13 +110,15 @@ const UserPlanAndBillings = () => { justifyContent="space-between" alignItems="center" > - + {!isUserOnEnterprisePlan && ( + + )} diff --git a/src/hooks/useGetPricingPlanDetails.tsx b/src/hooks/useGetPricingPlanDetails.tsx index f07a271b13..34ab959cba 100644 --- a/src/hooks/useGetPricingPlanDetails.tsx +++ b/src/hooks/useGetPricingPlanDetails.tsx @@ -27,6 +27,7 @@ export const useGetPricingPlanDetails = (pricingPlanStatus: any) => { ); const isUserOnFreePlan = selectedPlan?.id == 1; + const isUserOnEnterprisePlan = selectedPlan?.id == 4; - return { selectedPlan, isUserOnFreePlan, pricingListDescriptions }; + return { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan, pricingListDescriptions }; }; diff --git a/yarn.lock b/yarn.lock index f60e53748d..33655d33b2 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.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.7 - resolution: "@babel/core@npm:7.26.7" + version: 7.26.9 + resolution: "@babel/core@npm:7.26.9" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.5" + "@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.7" - "@babel/parser": "npm:^7.26.7" - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.26.7" - "@babel/types": "npm:^7.26.7" + "@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/1ca1c9b1366a1ee77ade9c72302f288b2b148e4190e0f36bc032d09c686b2c7973d3309e4eec2c57243508c16cf907c17dec4e34ba95e7a18badd57c61bbcb7c + checksum: 10/ceed199dbe25f286a0a59a2ea7879aed37c1f3bb289375d061eda4752cab2ba365e7f9e969c7fd3b9b95c930493db6eeb5a6d6f017dd135fb5a4503449aad753 languageName: node linkType: hard -"@babel/generator@npm:^7.24.5, @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 @@ -225,24 +225,24 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.7": - version: 7.26.7 - resolution: "@babel/helpers@npm:7.26.7" +"@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.7" - checksum: 10/97593a0c9b3c5e2e7cf824e549b5f6fa6dc739593ad93d5bb36d06883d8124beac63ee2154c9a514dbee68a169d5683ab463e0ac6713ad92fb4854cea35ed4d4 + "@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.5, @babel/parser@npm:^7.26.7": - version: 7.26.7 - resolution: "@babel/parser@npm:7.26.7" +"@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.7" + "@babel/types": "npm:^7.26.9" bin: parser: ./bin/babel-parser.js - checksum: 10/3ccc384366ca9a9b49c54f5b24c9d8cff9a505f2fbdd1cfc04941c8e1897084cc32f100e77900c12bc14a176cf88daa3c155faad680d9a23491b997fd2a59ffc + checksum: 10/cb84fe3ba556d6a4360f3373cf7eb0901c46608c8d77330cc1ca021d60f5d6ebb4056a8e7f9dd0ef231923ef1fe69c87b11ce9e160d2252e089a20232a2b942b languageName: node linkType: hard @@ -280,12 +280,12 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.10.2": - version: 7.26.7 - resolution: "@babel/runtime-corejs3@npm:7.26.7" + 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/926147ffd75a22cb005a591a72a341084780adb14698fa5c062dbdf355d18ebaaa7ad45690eef99dcd0dea1ad9e617d8b54cfb7b933cec92275a918c73a42534 + 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.7 - resolution: "@babel/runtime@npm:7.26.7" + version: 7.26.9 + resolution: "@babel/runtime@npm:7.26.9" dependencies: regenerator-runtime: "npm:^0.14.0" - checksum: 10/c7a661a6836b332d9d2e047cba77ba1862c1e4f78cec7146db45808182ef7636d8a7170be9797e5d8fd513180bffb9fa16f6ca1c69341891efec56113cf22bfc + 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.26.7, @babel/traverse@npm:^7.4.5": - version: 7.26.7 - resolution: "@babel/traverse@npm:7.26.7" +"@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.7" - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.7" + "@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/c821c9682fe0b9edf7f7cbe9cc3e0787ffee3f73b52c13b21b463f8979950a6433f5e7e482a74348d22c0b7a05180e6f72b23eb6732328b49c59fc6388ebf6e5 + 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.5, @babel/types@npm:^7.26.7": - version: 7.26.7 - resolution: "@babel/types@npm:7.26.7" +"@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/2264efd02cc261ca5d1c5bc94497c8995238f28afd2b7483b24ea64dd694cf46b00d51815bf0c87f0d0061ea221569c77893aeecb0d4b4bb254e9c2f938d7669 + checksum: 10/11b62ea7ed64ef7e39cc9b33852c1084064c3b970ae0eaa5db659241cfb776577d1e68cbff4de438bada885d3a827b52cc0f3746112d8e1bc672bb99a8eb5b56 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 @@ -3841,8 +3839,8 @@ __metadata: linkType: hard "@pushprotocol/restapi@npm:^1.7.30": - version: 1.7.30 - resolution: "@pushprotocol/restapi@npm:1.7.30" + version: 1.7.31 + resolution: "@pushprotocol/restapi@npm:1.7.31" dependencies: "@metamask/eth-sig-util": "npm:^5.0.2" axios: "npm:^0.27.2" @@ -3865,7 +3863,7 @@ __metadata: peerDependenciesMeta: ethers: optional: true - checksum: 10/327dbd17b7b3f34d56e5326502358196fcf9320a2fcdc0b73efa60e959c90f7c9359f1ea5d53387dbc8dc0551bbd9f60685dffd688ef6215558fe9939f2aee8a + checksum: 10/f79108330cedeeb5decb6d80637569219467d7aa76db8ad1f95270b0a20471592dcacf5920a795373bc6079739e87a1eb22cd4af06a3def13e7e6c032ebb8810 languageName: node linkType: hard @@ -5302,135 +5300,135 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-android-arm64@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-darwin-arm64@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-darwin-x64@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-freebsd-x64@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.34.5" +"@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.34.5": - version: 4.34.5 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.34.5" +"@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 @@ -5980,90 +5978,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-darwin-arm64@npm:1.10.14" +"@swc/core-darwin-arm64@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-darwin-arm64@npm:1.10.16" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-darwin-x64@npm:1.10.14" +"@swc/core-darwin-x64@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-darwin-x64@npm:1.10.16" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.14" +"@swc/core-linux-arm-gnueabihf@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.16" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-linux-arm64-gnu@npm:1.10.14" +"@swc/core-linux-arm64-gnu@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-arm64-gnu@npm:1.10.16" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-linux-arm64-musl@npm:1.10.14" +"@swc/core-linux-arm64-musl@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-arm64-musl@npm:1.10.16" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-linux-x64-gnu@npm:1.10.14" +"@swc/core-linux-x64-gnu@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-x64-gnu@npm:1.10.16" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-linux-x64-musl@npm:1.10.14" +"@swc/core-linux-x64-musl@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-linux-x64-musl@npm:1.10.16" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-win32-arm64-msvc@npm:1.10.14" +"@swc/core-win32-arm64-msvc@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-win32-arm64-msvc@npm:1.10.16" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-win32-ia32-msvc@npm:1.10.14" +"@swc/core-win32-ia32-msvc@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-win32-ia32-msvc@npm:1.10.16" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.10.14": - version: 1.10.14 - resolution: "@swc/core-win32-x64-msvc@npm:1.10.14" +"@swc/core-win32-x64-msvc@npm:1.10.16": + version: 1.10.16 + resolution: "@swc/core-win32-x64-msvc@npm:1.10.16" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.7.0": - version: 1.10.14 - resolution: "@swc/core@npm:1.10.14" +"@swc/core@npm:^1.10.16": + version: 1.10.16 + resolution: "@swc/core@npm:1.10.16" dependencies: - "@swc/core-darwin-arm64": "npm:1.10.14" - "@swc/core-darwin-x64": "npm:1.10.14" - "@swc/core-linux-arm-gnueabihf": "npm:1.10.14" - "@swc/core-linux-arm64-gnu": "npm:1.10.14" - "@swc/core-linux-arm64-musl": "npm:1.10.14" - "@swc/core-linux-x64-gnu": "npm:1.10.14" - "@swc/core-linux-x64-musl": "npm:1.10.14" - "@swc/core-win32-arm64-msvc": "npm:1.10.14" - "@swc/core-win32-ia32-msvc": "npm:1.10.14" - "@swc/core-win32-x64-msvc": "npm:1.10.14" + "@swc/core-darwin-arm64": "npm:1.10.16" + "@swc/core-darwin-x64": "npm:1.10.16" + "@swc/core-linux-arm-gnueabihf": "npm:1.10.16" + "@swc/core-linux-arm64-gnu": "npm:1.10.16" + "@swc/core-linux-arm64-musl": "npm:1.10.16" + "@swc/core-linux-x64-gnu": "npm:1.10.16" + "@swc/core-linux-x64-musl": "npm:1.10.16" + "@swc/core-win32-arm64-msvc": "npm:1.10.16" + "@swc/core-win32-ia32-msvc": "npm:1.10.16" + "@swc/core-win32-x64-msvc": "npm:1.10.16" "@swc/counter": "npm:^0.1.3" "@swc/types": "npm:^0.1.17" peerDependencies: @@ -6092,7 +6090,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/2244e625daafe641163578e1eebbdf7da4d93f8d9730709d01a86b936e81fb56fc8d61d1d4c4fde108566250dbd57b60d8d03dc6b9f5c1d5dd9f4857eef5ff13 + checksum: 10/237175744191c0831322ad473624b08dd2e7afb4690d1cdb088d40cb3b41161630c1465e1e6fff3b22df8ad4b06321e94f75832edce3adc8e9cd9ec32bf98392 languageName: node linkType: hard @@ -6131,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" @@ -6141,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 @@ -6161,10 +6159,10 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.66.0": - version: 5.66.0 - resolution: "@tanstack/query-core@npm:5.66.0" - checksum: 10/ba8623c0272e36d3ce616afa024d43e07e6b69170219b32eb4f60156fee9ac4ffa74d2fbb999739b6dea757b75966e76129271f4224f06c59deee24a72944da4 +"@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 @@ -6185,14 +6183,14 @@ __metadata: linkType: hard "@tanstack/react-query-devtools@npm:^5.44.0": - version: 5.66.0 - resolution: "@tanstack/react-query-devtools@npm:5.66.0" + version: 5.66.4 + resolution: "@tanstack/react-query-devtools@npm:5.66.4" dependencies: "@tanstack/query-devtools": "npm:5.65.0" peerDependencies: - "@tanstack/react-query": ^5.66.0 + "@tanstack/react-query": ^5.66.4 react: ^18 || ^19 - checksum: 10/4a2381a80de448a049e6fceedd1d9e4c810c8f85586cb4e2f9a23dc588697fc7295f106567ae4a5722027cf494593d8ce3fa326821b429c472caa21313c8b8cc + checksum: 10/7abfcbda47bda09b42e4910d0710096924366a51bdb090a032f9e94084b8469e49daf2c96764216fa57474adf841ef25963dc06e7c3c27d48310647ee2d67d15 languageName: node linkType: hard @@ -6227,13 +6225,13 @@ __metadata: linkType: hard "@tanstack/react-query@npm:^5.44.0": - version: 5.66.0 - resolution: "@tanstack/react-query@npm:5.66.0" + version: 5.66.4 + resolution: "@tanstack/react-query@npm:5.66.4" dependencies: - "@tanstack/query-core": "npm:5.66.0" + "@tanstack/query-core": "npm:5.66.4" peerDependencies: react: ^18 || ^19 - checksum: 10/482decc02664e756c66c9ff46279b5eb3f0fb29fcdcb51b96319e8487a2b2e8b151319d6a5d9ef1180523a1792d6449cec2e9bfa87f37a4f755fc9d95534585d + checksum: 10/02eac78e1436692c873a403a0d4f12b95e5041ade335d31b5883b156a3747b37d86de745744d511d495202b95fce750741e8e999466adcec12b3ac1718819fc3 languageName: node linkType: hard @@ -6532,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 @@ -6579,11 +6577,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=12.12.47, @types/node@npm:>=13.7.0": - version: 22.13.1 - resolution: "@types/node@npm:22.13.1" + version: 22.13.4 + resolution: "@types/node@npm:22.13.4" dependencies: undici-types: "npm:~6.20.0" - checksum: 10/d8ba7068b0445643c0fa6e4917cdb7a90e8756a9daff8c8a332689cd5b2eaa01e4cd07de42e3cd7e6a6f465eeda803d5a1363d00b5ab3f6cea7950350a159497 + checksum: 10/716e05b1b84d9da3b2cbba9f642d7294549a89c85d27148b48815f321e0081d0546366e97d11c7710a3280160828512eb945f4e9361dda980f708473758ac0a7 languageName: node linkType: hard @@ -6650,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 @@ -6707,11 +6705,11 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 19.0.8 - resolution: "@types/react@npm:19.0.8" + version: 19.0.10 + resolution: "@types/react@npm:19.0.10" dependencies: csstype: "npm:^3.0.2" - checksum: 10/1080d5b96ee0b4395f8f167ae6952f570088ee03bdce69f8237aab82c32d9bd2b71106f787bac17ba351acc4aba5e3454bafca51f2eb11d1562073b821e63d15 + checksum: 10/10b592d212ebe4b4e0bd42a95c58af3d8dfcb8b3fa4b412d686c2ff8810d5dd3e3a30ebedb31d7b738e33a39c43503e24fe4e6ca8a21d842870043793f4eda98 languageName: node linkType: hard @@ -7010,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.22.1 - resolution: "@uniswap/router-sdk@npm:1.22.1" + version: 1.22.3 + resolution: "@uniswap/router-sdk@npm:1.22.3" dependencies: "@ethersproject/abi": "npm:^5.5.0" "@uniswap/sdk-core": "npm:^7.5.0" "@uniswap/swap-router-contracts": "npm:^1.3.0" "@uniswap/v2-sdk": "npm:^4.13.0" "@uniswap/v3-sdk": "npm:^3.24.0" - "@uniswap/v4-sdk": "npm:^1.18.1" - checksum: 10/a0c8f65cea25b8d1c6cd07a65c752598b008a4162cff43504df84b4ee56c718e9c58f3186e56e4255e7005662b35dbad3ccaf3a3227dad1919bc44f324c61d17 + "@uniswap/v4-sdk": "npm:^1.19.4" + checksum: 10/eacbc00f33b6838ba239c6c366b43f5d43699005851cdf619fa7d00f86add275ac5a53263af861d90022a734812edcf6dca7adf1974fe3d6a7e40f06b5847e2f languageName: node linkType: hard @@ -7273,16 +7271,16 @@ __metadata: languageName: node linkType: hard -"@uniswap/v4-sdk@npm:^1.18.1, @uniswap/v4-sdk@npm:^1.2.0, @uniswap/v4-sdk@npm:^1.6.3": - version: 1.19.2 - resolution: "@uniswap/v4-sdk@npm:1.19.2" +"@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.5.0" "@uniswap/v3-sdk": "npm:3.24.0" tiny-invariant: "npm:^1.1.0" tiny-warning: "npm:^1.0.3" - checksum: 10/af274d184bf82e8f1ea8d02502fa5fe6a96afd4bfd9af2ff2c4503a9818e18759a298a4811f758b8dbab4e99c800f040238cae7c8f7a0bb1af035c15678491e2 + checksum: 10/7640aafa39fa75406d688a59b06de47128fb2e8c63a990c692757a8ace4c8e625cd0631abf4140c5b75393f42e51942d018e9a642a7aec3e1b2dc6f5938156de languageName: node linkType: hard @@ -7900,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 @@ -8483,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" @@ -8503,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: @@ -9598,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 @@ -9668,9 +9657,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001154, caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001698 - resolution: "caniuse-lite@npm:1.0.30001698" - checksum: 10/108d09b4c1a930fdcc391b6ea61476f3c80cfc83182e8336f727ea748209f1381b4ae0b9fdf9d73bdd56dbab2e3a87ff211a687bd80b6a216589126ac666ae1c + version: 1.0.30001700 + resolution: "caniuse-lite@npm:1.0.30001700" + checksum: 10/9203ed502fd1b74c47f315a001e1d91abe2abecb951f8e15dd1556cfc23a29fa7a7b2cc654380604bb6f58bcfa0c65b78055b9d99a7489c13baa0d4158a6e25e languageName: node linkType: hard @@ -10367,11 +10356,11 @@ __metadata: linkType: hard "crossws@npm:^0.3.3": - version: 0.3.3 - resolution: "crossws@npm:0.3.3" + version: 0.3.4 + resolution: "crossws@npm:0.3.4" dependencies: uncrypto: "npm:^0.1.3" - checksum: 10/f2139fa14d1f2f540a6c27aeb242f00eea97249a58f756aca8f59bbb868aeb9fc6f137bdce541070a7200aef43d744c8860c0a71a7afa25987fcc47cccaeac8b + checksum: 10/4226588a51835640e904f760e3b3d8d673c5176191d50449f5cde65bfd4c68fc1cd0db489fa46088ddde4bacec0407e00d9acab0a2abf40806dbd4dc81c1fc32 languageName: node linkType: hard @@ -11257,9 +11246,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.3.585, electron-to-chromium@npm:^1.5.73": - version: 1.5.95 - resolution: "electron-to-chromium@npm:1.5.95" - checksum: 10/4fdd345cae24ae52f46b9d810a6fbb08f5246b3c032d11e30e6b4696900830ad1c230d77190d91e5dada36adb8bc2550368c5704ebff7ae05a94fdf9e47e020a + version: 1.5.101 + resolution: "electron-to-chromium@npm:1.5.101" + checksum: 10/3454173f13ed80c657012a4e36760e6c4509c84323c42f97253150a7edd131a64ddd4eca51db7feff634f417bf1bb07b8567c72500c3849c8d770cfc060ae555 languageName: node linkType: hard @@ -11637,6 +11626,18 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10/86814bf8afbcd8966653f731415888019d4bc4aca6b6c354132a7a75bb87566751e320369654a101d23a91c87a85c79b178bcf40332839bd347aff437c4fb65f + languageName: node + linkType: hard + "es5-ext@npm:^0.10.35, es5-ext@npm:^0.10.46, es5-ext@npm:^0.10.62, es5-ext@npm:^0.10.63, es5-ext@npm:^0.10.64, es5-ext@npm:~0.10.14, es5-ext@npm:~0.10.2": version: 0.10.64 resolution: "es5-ext@npm:0.10.64" @@ -11894,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 @@ -12778,11 +12779,11 @@ __metadata: linkType: hard "for-each@npm:^0.3.3": - version: 0.3.4 - resolution: "for-each@npm:0.3.4" + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: is-callable: "npm:^1.2.7" - checksum: 10/c3bc4ebe8bd51655919dd9132c7ad0703c267bd0d737093e8424f46feea2eeaa73ecc54237346435258548d07aaeac643deb47de9b872c359e0c37cf0507a7f1 + checksum: 10/330cc2439f85c94f4609de3ee1d32c5693ae15cdd7fe3d112c4fd9efd4ce7143f2c64ef6c2c9e0cfdb0058437f33ef05b5bdae5b98fcc903fb2143fbaf0fea0f languageName: node linkType: hard @@ -12811,24 +12812,26 @@ __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 "form-data@npm:^4.0.0": - version: 4.0.1 - resolution: "form-data@npm:4.0.1" + version: 4.0.2 + resolution: "form-data@npm:4.0.2" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" mime-types: "npm:^2.1.12" - checksum: 10/6adb1cff557328bc6eb8a68da205f9ae44ab0e88d4d9237aaf91eed591ffc64f77411efb9016af7d87f23d0a038c45a788aa1c6634e51175c4efa36c2bc53774 + checksum: 10/82c65b426af4a40090e517a1bc9057f76970b4c6043e37aa49859c447d88553e77d4cc5626395079a53d2b0889ba5f2a49f3900db3ad3f3f1bf76613532572fb languageName: node linkType: hard @@ -13883,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 @@ -15196,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: @@ -15696,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 @@ -16021,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: @@ -16449,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 @@ -16820,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" @@ -16835,7 +16838,7 @@ __metadata: which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10/5d07430e887a906f85c7c6ed87e8facb7ecd4ce42d948a2438c471df2e24ae6af70f4def114ec1a03127988d164648dda8d75fe666f3c4b431e53856379fdf13 + checksum: 10/3314ebfeb99dbcdf9e8c810df1ee52294045399873d4ab1e6740608c4fbe63adaf6580c0610b23c6eda125e298536553f5bb6fb0df714016a5c721ed31095e42 languageName: node linkType: hard @@ -17676,20 +17679,20 @@ __metadata: 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.2 + resolution: "postcss@npm:8.5.2" dependencies: nanoid: "npm:^3.3.8" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10/1fbd28753143f7f03e4604813639918182b15343c7ad0f4e72f3875fc2cc0b8494c887f55dc05008fad5fbf1e1e908ce2edbbce364a91f84dcefb71edf7cd31d + checksum: 10/e08c2be3cf461cc63cf4c8e97bb3d5185e196ee0a9b75879cf130590f32bc38c7829c6c4e260158e214fb68a828a95bdac84c8f17fefba993d3ced686643c3e2 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.0 + resolution: "preact@npm:10.26.0" + checksum: 10/60650dc3cbbb044b32078a7451c2160a6490d21405beee6afc7ef68a48948e369af111745db16c9a3fa6109e0f445bd22cdd14f16154a8f9fff840043c86d5bf languageName: node linkType: hard @@ -18340,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 @@ -19164,12 +19167,11 @@ __metadata: linkType: hard "readable-web-to-node-stream@npm:^3.0.0": - version: 3.0.3 - resolution: "readable-web-to-node-stream@npm:3.0.3" + version: 3.0.4 + resolution: "readable-web-to-node-stream@npm:3.0.4" dependencies: - process: "npm:^0.11.10" readable-stream: "npm:^4.7.0" - checksum: 10/8947b5bab4a312889180dce936967133727b859abcb360c84a47d5e3fc27d4d6883352a6f04225e40ae7d09a33012dfbd51417031780aeeb8b1993cfc7c84c20 + checksum: 10/d8fb3de7579d70ea1e9efdfb2f02e2965ae62a1e1d9e9b0bdce493cb3b98090bd4a34526a9ab6c793bb833b89ffd31a5ab06117a3ae2a3df21363651b2131da9 languageName: node linkType: hard @@ -19535,28 +19537,28 @@ __metadata: linkType: hard "rollup@npm:^4.20.0": - version: 4.34.5 - resolution: "rollup@npm:4.34.5" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.34.5" - "@rollup/rollup-android-arm64": "npm:4.34.5" - "@rollup/rollup-darwin-arm64": "npm:4.34.5" - "@rollup/rollup-darwin-x64": "npm:4.34.5" - "@rollup/rollup-freebsd-arm64": "npm:4.34.5" - "@rollup/rollup-freebsd-x64": "npm:4.34.5" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.34.5" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.34.5" - "@rollup/rollup-linux-arm64-gnu": "npm:4.34.5" - "@rollup/rollup-linux-arm64-musl": "npm:4.34.5" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.34.5" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.34.5" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.34.5" - "@rollup/rollup-linux-s390x-gnu": "npm:4.34.5" - "@rollup/rollup-linux-x64-gnu": "npm:4.34.5" - "@rollup/rollup-linux-x64-musl": "npm:4.34.5" - "@rollup/rollup-win32-arm64-msvc": "npm:4.34.5" - "@rollup/rollup-win32-ia32-msvc": "npm:4.34.5" - "@rollup/rollup-win32-x64-msvc": "npm:4.34.5" + 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: @@ -19602,7 +19604,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/d6ad3650452bf4eeead6ac4305257a281ba49a4c24188f71c6d9d09d7fc93b713e413b0f2ffd654a168dbf7be3200bd7e97870025573f174cd4514fc8b8cbbfb + checksum: 10/a8cafc19b181c521afe37c4d7601af72dedaf233e1c09ee2276a93b2656f69a08ddbc37766c397043dc413d985460c37184f1efece9d75d82225c5b880798eb0 languageName: node linkType: hard @@ -19749,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" @@ -20040,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: @@ -20237,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 @@ -20874,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: @@ -20897,8 +20888,8 @@ __metadata: linkType: hard "terser@npm:^5.31.1": - version: 5.38.1 - resolution: "terser@npm:5.38.1" + version: 5.39.0 + resolution: "terser@npm:5.39.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -20906,7 +20897,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/5c32213210e6e07fef2100c231aadf4a7f7be7903cc65daa3edc886075444b940f65991acf30f8b271e13a2f395b81bba1fa248409cc57160315339a40be3e2a + checksum: 10/d84aff642398329f7179bbeaca28cac76a86100e2372d98d39d9b86c48023b6b9f797d983d6e7c0610b3f957c53d01ada1befa25d625614cb2ccd20714f1e98b languageName: node linkType: hard @@ -21278,9 +21269,9 @@ __metadata: linkType: hard "type-fest@npm:^4.27.0": - version: 4.33.0 - resolution: "type-fest@npm:4.33.0" - checksum: 10/0d179e66fa765bd0a25a785b12dc797f90f2f92bdb8c9c8a789f3fd8e5a4492444e7ef83551b3b8463aeab24fd6195761e26b03174722de636b4b75aa5726fb7 + version: 4.35.0 + resolution: "type-fest@npm:4.35.0" + checksum: 10/43aada576d02f2f5230bd46c859e421a1307694312b3405088a48fcc67d65bee12eafbdcd182cffe0577dd72346595cb90a1ab5700626df35bc8935cf02c635b languageName: node linkType: hard @@ -21978,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 @@ -22409,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" @@ -22430,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: @@ -22440,7 +22431,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 10/665bd3b8c84b20f0b1f250159865e4d3e9b76c682030313d49124d5f8e96357ccdcc799dd9fe0ebf010fdb33dbc59d9863d79676a308e868e360ac98f7c09987 + checksum: 10/eb16a58b3eb02bfb538c7716e28d7f601a03922e975c74007b41ba5926071ae70302d9acae9800fbd7ddd0c66a675b1069fc6ebb88123b87895a52882e2dc06a languageName: node linkType: hard From 546a2ca9e048e6590d9fc10c004071b408be45cb Mon Sep 17 00:00:00 2001 From: corlard3y Date: Tue, 18 Feb 2025 10:45:52 +0100 Subject: [PATCH 39/43] chore: add payment history --- .../userPlanAndBillings/UpgradePlanNavigationItem.tsx | 5 ++++- .../userPlanAndBillings/UserPlanAndBillings.tsx | 6 ++++-- .../userPlanAndBillings/hooks/useMigrateToFreePlan.tsx | 1 - src/components/userSettings/UserSettings.tsx | 2 +- src/hooks/useGetPricingPlanDetails.tsx | 4 +++- src/modules/channelDashboard/ChannelDashboard.tsx | 4 ++-- .../channelDashboard/components/ChannelDashboardInfo.tsx | 2 +- src/modules/createChannel/CreateChannel.tsx | 2 +- .../purchasePlan/components/ConfirmPurchaseModal.tsx | 3 ++- src/queries/hooks/pricing/index.ts | 1 + src/queries/hooks/pricing/useGetPaymentHistory.ts | 9 +++++++++ src/queries/models/pricing/getPaymentHistoryModel.ts | 1 + src/queries/models/pricing/index.ts | 1 + src/queries/queryKeys.ts | 1 + src/queries/services/pricing/getPaymentHistory.ts | 9 +++++++++ src/queries/services/pricing/index.ts | 1 + 16 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 src/queries/hooks/pricing/useGetPaymentHistory.ts create mode 100644 src/queries/models/pricing/getPaymentHistoryModel.ts create mode 100644 src/queries/services/pricing/getPaymentHistory.ts diff --git a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx index 7217a952a2..6d9f0da415 100644 --- a/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx +++ b/src/components/userPlanAndBillings/UpgradePlanNavigationItem.tsx @@ -20,7 +20,10 @@ export const UpgradePlanNavigationItem = () => { } = useGetPricingPlanStatus({ channelId: walletAddress, }); - const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan } = useGetPricingPlanDetails(pricingPlanStatus); + const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan } = useGetPricingPlanDetails( + pricingPlanStatus, + walletAddress, + ); useMigrateToFreePlan({ pricingPlanStatus, diff --git a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx index 6df1619f6b..c74c044ca9 100644 --- a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx +++ b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx @@ -15,8 +15,10 @@ const UserPlanAndBillings = () => { channelId: walletAddress, }); - const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan, pricingListDescriptions } = - useGetPricingPlanDetails(pricingPlanStatus); + const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan, pricingListDescriptions } = useGetPricingPlanDetails( + pricingPlanStatus, + walletAddress, + ); const planNotifications = [ { diff --git a/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx b/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx index da6977069d..302ed2b224 100644 --- a/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx +++ b/src/components/userPlanAndBillings/hooks/useMigrateToFreePlan.tsx @@ -16,7 +16,6 @@ export const useMigrateToFreePlan = ({ pricingPlanStatus, isLoading, refetch }: const { mutate: handleInitatePayment } = useInitiatePaymentInfo(); const handleMigrateToFreePlan = () => { - console.log('handlemigrate'); handleInitatePayment( { channel: walletAddress, diff --git a/src/components/userSettings/UserSettings.tsx b/src/components/userSettings/UserSettings.tsx index 4ded0318eb..fc37291a71 100644 --- a/src/components/userSettings/UserSettings.tsx +++ b/src/components/userSettings/UserSettings.tsx @@ -59,7 +59,7 @@ function UserSettings() { channelId: walletAddress, }); - const { isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus); + const { isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus, walletAddress); const expirationDetails = calculateExpirationDetails(pricingPlanStatus ?? null); diff --git a/src/hooks/useGetPricingPlanDetails.tsx b/src/hooks/useGetPricingPlanDetails.tsx index 34ab959cba..3d3336844d 100644 --- a/src/hooks/useGetPricingPlanDetails.tsx +++ b/src/hooks/useGetPricingPlanDetails.tsx @@ -1,6 +1,6 @@ import { useGetPricingInfo } from 'queries'; -export const useGetPricingPlanDetails = (pricingPlanStatus: any) => { +export const useGetPricingPlanDetails = (pricingPlanStatus: any, walletAddress: string) => { const { data: pricingInfoList } = useGetPricingInfo(); const pricingListDescriptions = [ { @@ -26,6 +26,8 @@ export const useGetPricingPlanDetails = (pricingPlanStatus: any) => { planItem?.id == parseInt(pricingPlanStatus?.pricing_plan_id ? pricingPlanStatus?.pricing_plan_id : '1'), ); + // console.log(pricingPlanStatus, 'cast cast'); + const isUserOnFreePlan = selectedPlan?.id == 1; const isUserOnEnterprisePlan = selectedPlan?.id == 4; diff --git a/src/modules/channelDashboard/ChannelDashboard.tsx b/src/modules/channelDashboard/ChannelDashboard.tsx index 0c17172fc4..cfeff239e4 100644 --- a/src/modules/channelDashboard/ChannelDashboard.tsx +++ b/src/modules/channelDashboard/ChannelDashboard.tsx @@ -12,7 +12,7 @@ import { UserChannelDashboard } from './components/UserChannelDashboard'; // Hooks import useFetchChannelDetails from 'common/hooks/useFetchUsersChannelDetails'; -import { useGetChannelCategories, useGetPaymentDetails, useGetPricingInfo, useGetPricingPlanStatus } from 'queries'; +import { useGetChannelCategories, useGetPaymentDetails, useGetPricingPlanStatus } from 'queries'; import { PurchasePlanAlert } from 'common'; import { useAccount, useGetPricingPlanDetails } from 'hooks'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; @@ -34,7 +34,7 @@ const ChannelDashboard = () => { const { data: pricingPlanStatus } = useGetPricingPlanStatus({ channelId: walletAddress, }); - const { selectedPlan, isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus); + const { selectedPlan, isUserOnFreePlan } = useGetPricingPlanDetails(pricingPlanStatus, walletAddress); const { data: paymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); diff --git a/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx b/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx index 56c4d55f71..88db9315dc 100644 --- a/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx +++ b/src/modules/channelDashboard/components/ChannelDashboardInfo.tsx @@ -36,7 +36,7 @@ const ChannelDashboardInfo: FC = ({ channelId: walletAddress, }); - const { selectedPlan } = useGetPricingPlanDetails(pricingPlanStatus); + const { selectedPlan } = useGetPricingPlanDetails(pricingPlanStatus, walletAddress); let verifiedAliasChainIds = channelDetails?.aliases diff --git a/src/modules/createChannel/CreateChannel.tsx b/src/modules/createChannel/CreateChannel.tsx index e82ea2a198..376fd5a270 100644 --- a/src/modules/createChannel/CreateChannel.tsx +++ b/src/modules/createChannel/CreateChannel.tsx @@ -67,7 +67,7 @@ const CreateChannel = () => { channelId: walletAddress, }); - const { selectedPlan } = useGetPricingPlanDetails(pricingPlanStatus); + const { selectedPlan } = useGetPricingPlanDetails(pricingPlanStatus, walletAddress); const { data: paymentDetails } = useGetPaymentDetails({ paymentId: paymentId! }); diff --git a/src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx b/src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx index 3ad79b9366..6021e1f5f7 100644 --- a/src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx +++ b/src/modules/purchasePlan/components/ConfirmPurchaseModal.tsx @@ -54,7 +54,8 @@ const ConfirmPurchaseModal: FC = ({ modalControl, pla color="text-tertiary" variant="bs-regular" > - Purchase Push Pro plan for {selectedPlanType === '12' ? plan?.value * 12 : plan?.value} USDC + Purchase Push Pro plan for {selectedPlanType === '12' ? (plan?.value * 12 * 0.85).toFixed(2) : plan?.value}{' '} + USDC + useQuery({ + queryKey: [allPaymentHistory, payload?.channelId], + queryFn: () => getPaymentHistory(payload), + }); diff --git a/src/queries/models/pricing/getPaymentHistoryModel.ts b/src/queries/models/pricing/getPaymentHistoryModel.ts new file mode 100644 index 0000000000..bc6c0d09fb --- /dev/null +++ b/src/queries/models/pricing/getPaymentHistoryModel.ts @@ -0,0 +1 @@ +export const getPaymentHistoryModel = (response: any): any => response; diff --git a/src/queries/models/pricing/index.ts b/src/queries/models/pricing/index.ts index b9c990ce87..89e70b4801 100644 --- a/src/queries/models/pricing/index.ts +++ b/src/queries/models/pricing/index.ts @@ -2,3 +2,4 @@ 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 10e263329c..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'; 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/index.ts b/src/queries/services/pricing/index.ts index 5d1c53530d..a68c9a5806 100644 --- a/src/queries/services/pricing/index.ts +++ b/src/queries/services/pricing/index.ts @@ -2,3 +2,4 @@ export * from './getPricingInfo'; export * from './getPricingPlanStatus'; export * from './handleInitiatePayment'; export * from './getPaymentDetails'; +export * from './getPaymentHistory'; From 9fb05000928078c0d1f451f826b8c1567fa404e2 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Tue, 18 Feb 2025 21:48:32 +0100 Subject: [PATCH 40/43] chore: add go pro alert --- .../channelDashboard/ChannelDashboard.tsx | 27 +++- .../components/UpgradePlanModal.tsx | 131 ++++++++++++++++++ 2 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 src/modules/channelDashboard/components/UpgradePlanModal.tsx diff --git a/src/modules/channelDashboard/ChannelDashboard.tsx b/src/modules/channelDashboard/ChannelDashboard.tsx index cfeff239e4..98912ca282 100644 --- a/src/modules/channelDashboard/ChannelDashboard.tsx +++ b/src/modules/channelDashboard/ChannelDashboard.tsx @@ -3,7 +3,7 @@ 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'; @@ -13,7 +13,7 @@ import { UserChannelDashboard } from './components/UserChannelDashboard'; // Hooks import useFetchChannelDetails from 'common/hooks/useFetchUsersChannelDetails'; import { useGetChannelCategories, useGetPaymentDetails, useGetPricingPlanStatus } from 'queries'; -import { PurchasePlanAlert } from 'common'; +import { PurchasePlanAlert, useDisclosure } from 'common'; import { useAccount, useGetPricingPlanDetails } from 'hooks'; import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; @@ -21,6 +21,7 @@ import { convertAddressToAddrCaip } from 'helpers/CaipHelper'; import { DashboardActiveState } from './ChannelDashboard.types'; import { EditChannelV2 } from 'modules/editChannel/EditChannelV2'; import { calculateExpirationDetails } from 'components/userSettings/utils'; +import { UpgradePlanModal } from './components/UpgradePlanModal'; const ChannelDashboard = () => { const [activeState, setActiveState] = useState('dashboard'); @@ -30,6 +31,7 @@ const ChannelDashboard = () => { const { account, chainId } = useAccount(); const walletAddress = convertAddressToAddrCaip(account, chainId); const navigate = useNavigate(); + const modalControl = useDisclosure(); const { data: pricingPlanStatus } = useGetPricingPlanStatus({ channelId: walletAddress, @@ -53,6 +55,15 @@ const ChannelDashboard = () => { (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 ( { )} + {showGoProAlert && ( + modalControl.open()} + actionText="Upgrade Plan" + variant="basic" + /> + )} + + {modalControl.isOpen && } + {activeState === 'dashboard' && ( = ({ 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 }; From 3b0b1b63945f47a23d04936633dbdacb7f192e45 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Wed, 19 Feb 2025 19:28:54 +0100 Subject: [PATCH 41/43] update yarn.lock --- yarn.lock | 204 +++++++++++++++++++++++++++--------------------------- 1 file changed, 102 insertions(+), 102 deletions(-) diff --git a/yarn.lock b/yarn.lock index 069c4d8c2c..325507d027 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3838,9 +3838,9 @@ __metadata: languageName: node linkType: hard -"@pushprotocol/restapi@npm:^1.7.30": - version: 1.7.30 - resolution: "@pushprotocol/restapi@npm:1.7.30" +"@pushprotocol/restapi@npm:^1.7.31": + version: 1.7.31 + resolution: "@pushprotocol/restapi@npm:1.7.31" dependencies: "@metamask/eth-sig-util": "npm:^5.0.2" axios: "npm:^0.27.2" @@ -5978,90 +5978,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.10.16": - version: 1.10.16 - resolution: "@swc/core-darwin-arm64@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-darwin-x64@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-linux-arm64-gnu@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-linux-arm64-musl@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-linux-x64-gnu@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-linux-x64-musl@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-win32-arm64-msvc@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-win32-ia32-msvc@npm:1.10.16" +"@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.16": - version: 1.10.16 - resolution: "@swc/core-win32-x64-msvc@npm:1.10.16" +"@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.10.16": - version: 1.10.16 - resolution: "@swc/core@npm:1.10.16" - dependencies: - "@swc/core-darwin-arm64": "npm:1.10.16" - "@swc/core-darwin-x64": "npm:1.10.16" - "@swc/core-linux-arm-gnueabihf": "npm:1.10.16" - "@swc/core-linux-arm64-gnu": "npm:1.10.16" - "@swc/core-linux-arm64-musl": "npm:1.10.16" - "@swc/core-linux-x64-gnu": "npm:1.10.16" - "@swc/core-linux-x64-musl": "npm:1.10.16" - "@swc/core-win32-arm64-msvc": "npm:1.10.16" - "@swc/core-win32-ia32-msvc": "npm:1.10.16" - "@swc/core-win32-x64-msvc": "npm:1.10.16" + version: 1.10.18 + resolution: "@swc/core@npm:1.10.18" + dependencies: + "@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: @@ -6090,7 +6090,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10/237175744191c0831322ad473624b08dd2e7afb4690d1cdb088d40cb3b41161630c1465e1e6fff3b22df8ad4b06321e94f75832edce3adc8e9cd9ec32bf98392 + checksum: 10/3fa896132d5da6bdf7be195d759084c7ba015fa615889ceb331bb2bf40877c3b1995b60c6f8fc2226fbad88712a0379ce9bef7769d1713c67c5b89a3322bc029 languageName: node linkType: hard @@ -6183,14 +6183,14 @@ __metadata: linkType: hard "@tanstack/react-query-devtools@npm:^5.44.0": - version: 5.66.4 - resolution: "@tanstack/react-query-devtools@npm:5.66.4" + version: 5.66.7 + resolution: "@tanstack/react-query-devtools@npm:5.66.7" dependencies: "@tanstack/query-devtools": "npm:5.65.0" peerDependencies: - "@tanstack/react-query": ^5.66.4 + "@tanstack/react-query": ^5.66.7 react: ^18 || ^19 - checksum: 10/7abfcbda47bda09b42e4910d0710096924366a51bdb090a032f9e94084b8469e49daf2c96764216fa57474adf841ef25963dc06e7c3c27d48310647ee2d67d15 + checksum: 10/56ba322ae015f9188ed115b10be57f31569c5f3584d230e128da67a0bfb954016bcc05fe8b138fc4fde5b198bb26e00252f368fee5b3efae4565e4f113d90a9a languageName: node linkType: hard @@ -6225,13 +6225,13 @@ __metadata: linkType: hard "@tanstack/react-query@npm:^5.44.0": - version: 5.66.4 - resolution: "@tanstack/react-query@npm:5.66.4" + version: 5.66.7 + resolution: "@tanstack/react-query@npm:5.66.7" dependencies: "@tanstack/query-core": "npm:5.66.4" peerDependencies: react: ^18 || ^19 - checksum: 10/02eac78e1436692c873a403a0d4f12b95e5041ade335d31b5883b156a3747b37d86de745744d511d495202b95fce750741e8e999466adcec12b3ac1718819fc3 + checksum: 10/3d66a09f56f7722f3a7273e2217bcf078515779bedc09f6fdd0aba5eb6c810e74e39a2edcbb4d0bf538d84e395cb74f5fdfd085c48d50afe675cbbe5bef07e21 languageName: node linkType: hard @@ -7558,9 +7558,9 @@ __metadata: languageName: node linkType: hard -"@walletconnect/core@npm:2.18.0": - version: 2.18.0 - resolution: "@walletconnect/core@npm:2.18.0" +"@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" @@ -7573,13 +7573,13 @@ __metadata: "@walletconnect/relay-auth": "npm:1.1.0" "@walletconnect/safe-json": "npm:1.0.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.18.0" - "@walletconnect/utils": "npm:2.18.0" + "@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/794ea08f200c8cbc912c358ab9502226634625e2f86a4248dfa7b2055682f755acd7aed84deea3c771ddbc69bfbf751d1bc6da72ae4eeb729fb4fd3e1c2d21b3 + checksum: 10/65d739b12a07e1c8946408f8be997f6fee5c8f2624f8fdc04471b42084a4d78f5f5dba5bd1c5e2fc2950a458d9f77b78537bea9d21d50fa246cc19d989ee066d languageName: node linkType: hard @@ -7593,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.18.0 - resolution: "@walletconnect/ethereum-provider@npm:2.18.0" + 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" @@ -7602,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.18.0" - "@walletconnect/types": "npm:2.18.0" - "@walletconnect/universal-provider": "npm:2.18.0" - "@walletconnect/utils": "npm:2.18.0" + "@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/4c117e67e2f559aa25bb7e4cd0d31b1d611c70a407f50906443f297e0320d1ed4150023f44f82be28a6255538dbcdf79cce9486b3bb4e88b3188f6d6fd7a5104 + checksum: 10/8a2ba6b0a6d776a78402dcfe230f51c4aca5842b3072e114e4cb598047883fb3c9b5df49e983cea1550ba84abd1b9b825bc4e86fc06356eec471f39a4d27ca62 languageName: node linkType: hard @@ -7776,20 +7776,20 @@ __metadata: languageName: node linkType: hard -"@walletconnect/sign-client@npm:2.18.0": - version: 2.18.0 - resolution: "@walletconnect/sign-client@npm:2.18.0" +"@walletconnect/sign-client@npm:2.18.1": + version: 2.18.1 + resolution: "@walletconnect/sign-client@npm:2.18.1" dependencies: - "@walletconnect/core": "npm:2.18.0" + "@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.18.0" - "@walletconnect/utils": "npm:2.18.0" + "@walletconnect/types": "npm:2.18.1" + "@walletconnect/utils": "npm:2.18.1" events: "npm:3.3.0" - checksum: 10/5aff51d01036fac482350c0c8c77d66d10d0ed69ad536b7a675fcfa3fbe4ed5d44a83c71945f260cb41cd32a07f2c25f42808261e33d4137a050bc435e9134ab + checksum: 10/3fe2b294f827b96bbebc9bf3847c07bfb134f10dc7c65ebb95ea8d52fc84b1ed6fcb33612239d0546e65f1aa000fcb189ae2e3540b5a8c66e01b186064d8011d languageName: node linkType: hard @@ -7802,9 +7802,9 @@ __metadata: languageName: node linkType: hard -"@walletconnect/types@npm:2.18.0": - version: 2.18.0 - resolution: "@walletconnect/types@npm:2.18.0" +"@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" @@ -7812,13 +7812,13 @@ __metadata: "@walletconnect/keyvaluestorage": "npm:1.1.1" "@walletconnect/logger": "npm:2.1.2" events: "npm:3.3.0" - checksum: 10/cc4c894345428ba582f3c2fad980d65d671e6e6e74acffe439362c4693f4589c4263a2f1b00dbe5c00e2aac2fd9c1b86e47d17ae0bd3365b00a9e2739eaba5cb + checksum: 10/f5c7a7aadc1241305fec822cbfb0edc7c6aeff3e9abee6b7a60279f87525211e7dc36ecdc86427cc86e99144559cfc97b39979beff91fabddf5b81720d25647a languageName: node linkType: hard -"@walletconnect/universal-provider@npm:2.18.0": - version: 2.18.0 - resolution: "@walletconnect/universal-provider@npm:2.18.0" +"@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" @@ -7827,18 +7827,18 @@ __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.18.0" - "@walletconnect/types": "npm:2.18.0" - "@walletconnect/utils": "npm:2.18.0" + "@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/b069ea65f57601c151690475002a48d8aed24e021f2db5e65e137586c69c9f512ad98f56b659f6b1de00613b64b8fac0ed6e9e414cbf17d3c04d08fc847fcb4a + checksum: 10/df7acec514c6eb73b2e0c2fb775996c5e7834c8c4b7e39501753eb6931ac3647c4f1575c3f1620a2ffc6055841844a3ae544eb7a6852f3155b45f42dc39776c3 languageName: node linkType: hard -"@walletconnect/utils@npm:2.18.0": - version: 2.18.0 - resolution: "@walletconnect/utils@npm:2.18.0" +"@walletconnect/utils@npm:2.18.1": + version: 2.18.1 + resolution: "@walletconnect/utils@npm:2.18.1" dependencies: "@ethersproject/transactions": "npm:5.7.0" "@noble/ciphers": "npm:1.2.1" @@ -7850,14 +7850,14 @@ __metadata: "@walletconnect/relay-auth": "npm:1.1.0" "@walletconnect/safe-json": "npm:1.0.2" "@walletconnect/time": "npm:1.0.2" - "@walletconnect/types": "npm:2.18.0" + "@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/4b08fc82b8c14f85dc94595def2a94c5e68b1dda8f1318ecaf78fd8589c9c5f3c4b49cd0113b2908d09f60e9931a9210a380d34b1cb4150723488b8a23bd0f31 + checksum: 10/103c5d6b17cdf258f3e8ac85a8873c9174e804648c6844c72bf40b9eba56a8d3069b9e5dd825c27992194204314b7ebe66a81a935b0080e9e61c1e219c8c25bc languageName: node linkType: hard @@ -11246,9 +11246,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.3.585, electron-to-chromium@npm:^1.5.73": - version: 1.5.101 - resolution: "electron-to-chromium@npm:1.5.101" - checksum: 10/3454173f13ed80c657012a4e36760e6c4509c84323c42f97253150a7edd131a64ddd4eca51db7feff634f417bf1bb07b8567c72500c3849c8d770cfc060ae555 + version: 1.5.102 + resolution: "electron-to-chromium@npm:1.5.102" + checksum: 10/2d22b978a94c02c7db77ba25bbcffba55afabefb59ccb1979c65ece44d6e29e69593c343f026859c80202eee8f9db86bae04055da36a37917e06a64f7146fce7 languageName: node linkType: hard @@ -12762,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 @@ -17679,20 +17679,20 @@ __metadata: linkType: hard "postcss@npm:^8.4.43, postcss@npm:^8.4.48": - version: 8.5.2 - resolution: "postcss@npm:8.5.2" + 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/e08c2be3cf461cc63cf4c8e97bb3d5185e196ee0a9b75879cf130590f32bc38c7829c6c4e260158e214fb68a828a95bdac84c8f17fefba993d3ced686643c3e2 + checksum: 10/6d7e21a772e8b05bf102636918654dac097bac013f0dc8346b72ac3604fc16829646f94ea862acccd8f82e910b00e2c11c1f0ea276543565d278c7ca35516a7c languageName: node linkType: hard "preact@npm:^10.24.2": - version: 10.26.0 - resolution: "preact@npm:10.26.0" - checksum: 10/60650dc3cbbb044b32078a7451c2160a6490d21405beee6afc7ef68a48948e369af111745db16c9a3fa6109e0f445bd22cdd14f16154a8f9fff840043c86d5bf + version: 10.26.2 + resolution: "preact@npm:10.26.2" + checksum: 10/3bcb7bb5018b6098c2f02e39537b9fa60fe47cd606ed1ad11a32560751121a54ed3a3d68638c4845f84cb633133467496cbf198fdf3d7238a41d2c92929b9d63 languageName: node linkType: hard From 0ef20870676ccbf87d7818d8fd4d1bc32a8a0263 Mon Sep 17 00:00:00 2001 From: corlard3y Date: Thu, 20 Feb 2025 12:40:12 +0100 Subject: [PATCH 42/43] chore: update \ naming in settings --- .../userPlanAndBillings/UserPlanAndBillings.tsx | 10 ++++------ src/hooks/useGetPricingPlanDetails.tsx | 5 ++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx index c74c044ca9..3a03d9efbc 100644 --- a/src/components/userPlanAndBillings/UserPlanAndBillings.tsx +++ b/src/components/userPlanAndBillings/UserPlanAndBillings.tsx @@ -15,10 +15,8 @@ const UserPlanAndBillings = () => { channelId: walletAddress, }); - const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan, pricingListDescriptions } = useGetPricingPlanDetails( - pricingPlanStatus, - walletAddress, - ); + const { selectedPlan, isUserOnFreePlan, isUserOnEnterprisePlan, isUserOnYearlyPlan, pricingListDescriptions } = + useGetPricingPlanDetails(pricingPlanStatus, walletAddress); const planNotifications = [ { @@ -77,7 +75,7 @@ const UserPlanAndBillings = () => { variant="h2-semibold" color="text-primary" > - ${selectedPlan?.value}/mo + ${isUserOnYearlyPlan ? (selectedPlan?.value! * 0.85).toFixed(2) : selectedPlan?.value}/mo )} @@ -94,7 +92,7 @@ const UserPlanAndBillings = () => { > {pricingListDescriptions?.find((desc) => desc.id === selectedPlan?.id)?.description} - {!isUserOnFreePlan && ( + {!isUserOnFreePlan && isUserOnYearlyPlan && ( Date: Thu, 20 Feb 2025 13:10:23 +0100 Subject: [PATCH 43/43] update: add types --- src/components/userSettings/UserSettings.tsx | 2 +- src/hooks/useGetPricingPlanDetails.tsx | 2 +- .../channelDashboard/ChannelDashboard.tsx | 2 +- .../models/pricing/getPaymentDetailsModel.ts | 4 +- .../models/pricing/getPaymentHistoryModel.ts | 4 +- .../pricing/handleInitatePaymentModel.ts | 4 +- src/queries/types/pricing.ts | 37 ++++++++++++++++++- 7 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/components/userSettings/UserSettings.tsx b/src/components/userSettings/UserSettings.tsx index fc37291a71..04ac5f0d50 100644 --- a/src/components/userSettings/UserSettings.tsx +++ b/src/components/userSettings/UserSettings.tsx @@ -213,7 +213,7 @@ function UserSettings() { {selectedOption === 3 && isUserOnFreePlan && ( navigateToPricing()} actionText="Upgrade Plan" variant="basic" diff --git a/src/hooks/useGetPricingPlanDetails.tsx b/src/hooks/useGetPricingPlanDetails.tsx index 8c54515ef4..c4998a7804 100644 --- a/src/hooks/useGetPricingPlanDetails.tsx +++ b/src/hooks/useGetPricingPlanDetails.tsx @@ -28,7 +28,7 @@ export const useGetPricingPlanDetails = (pricingPlanStatus: any, walletAddress: const isUserOnFreePlan = selectedPlan?.id == 1; const isUserOnEnterprisePlan = selectedPlan?.id == 4; - const isUserOnYearlyPlan = pricingPlanStatus?.pricingPlanTaken[0]?.duration == 12; + 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 98912ca282..3e530a2d68 100644 --- a/src/modules/channelDashboard/ChannelDashboard.tsx +++ b/src/modules/channelDashboard/ChannelDashboard.tsx @@ -120,7 +120,7 @@ const ChannelDashboard = () => { {showGoProAlert && ( modalControl.open()} actionText="Upgrade Plan" variant="basic" diff --git a/src/queries/models/pricing/getPaymentDetailsModel.ts b/src/queries/models/pricing/getPaymentDetailsModel.ts index cf6e960f68..aa540205eb 100644 --- a/src/queries/models/pricing/getPaymentDetailsModel.ts +++ b/src/queries/models/pricing/getPaymentDetailsModel.ts @@ -1 +1,3 @@ -export const getPaymentDetailsModel = (response: any): any => response; +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 index bc6c0d09fb..4cb9437670 100644 --- a/src/queries/models/pricing/getPaymentHistoryModel.ts +++ b/src/queries/models/pricing/getPaymentHistoryModel.ts @@ -1 +1,3 @@ -export const getPaymentHistoryModel = (response: any): any => response; +import { PricingPaymentHistory } from 'queries/types/pricing'; + +export const getPaymentHistoryModel = (response: PricingPaymentHistory): PricingPaymentHistory => response; diff --git a/src/queries/models/pricing/handleInitatePaymentModel.ts b/src/queries/models/pricing/handleInitatePaymentModel.ts index 246a0b8d1c..2a0fcfa3ef 100644 --- a/src/queries/models/pricing/handleInitatePaymentModel.ts +++ b/src/queries/models/pricing/handleInitatePaymentModel.ts @@ -1 +1,3 @@ -export const handleInitiatePaymentModel = (response: any): any => response; +import { InitiatePaymentType } from 'queries/types/pricing'; + +export const handleInitiatePaymentModel = (response: InitiatePaymentType): InitiatePaymentType => response; diff --git a/src/queries/types/pricing.ts b/src/queries/types/pricing.ts index c6415c7a0d..3a36497de2 100644 --- a/src/queries/types/pricing.ts +++ b/src/queries/types/pricing.ts @@ -7,7 +7,7 @@ export type PricingPlanType = { discord_quota: number; duration: number; discount: number; - description: string; // Description is a stringified array + description: string; }; export type PricingInfoResponse = PricingPlanType[]; @@ -23,4 +23,39 @@ export type PricingPlanStatusResponse = { 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; +};