) => {
+ setEndTimeText(e.target.value.toUpperCase());
+ };
+
+ const onBlurStartTime = (e) => {
+ checkAndSetTime(e.target.value, setStartTimeText, setStartTimeError);
+ };
+
+ const onBlurEndTime = (e) => {
+ checkAndSetTime(e.target.value, setEndTimeText, setEndTimeError);
+ };
+
+ return (
+ <>
+
+
+ }
+ dateFormat="MM/dd/yyyy h:mm aa"
+ endDate={endDate ? new Date(endDate) : null}
+ maxDate={maxDate}
+ minDate={minDate || new Date()}
+ monthsShown={2}
+ open={isDatePickerOpen}
+ popperPlacement={openDirection}
+ startDate={startDate ? new Date(startDate) : null}
+ onCalendarClose={() => {
+ setIsDatePickerOpen(false);
+ }}
+ onChange={handleDateChange}
+ />
+
+ {ctaComponent}
+ >
+ );
+}
+
+export default CustomDateRangePicker;
diff --git a/src/components/DateRangePicker/MobileDateRangePicker.tsx b/src/components/DateRangePicker/MobileDateRangePicker.tsx
new file mode 100644
index 00000000..4f3c9b13
--- /dev/null
+++ b/src/components/DateRangePicker/MobileDateRangePicker.tsx
@@ -0,0 +1,227 @@
+/** at the top of your component file */
+import { Button, HStack, Text, VStack } from '@chakra-ui/react';
+import type React from 'react';
+import { useState } from 'react';
+import DatePicker from 'react-datepicker';
+
+import { TimeInput } from '../TimeInput/TimeInput';
+
+import { canClose, checkAndSetTime } from './helpers';
+
+interface CustomFooterProps {
+ startTime: string | undefined;
+ startTimeError: boolean;
+ endTime: string | undefined;
+ endTimeError: boolean;
+ canClose: boolean;
+ onChangeStartTime: (e: React.ChangeEvent) => void;
+ onChangeEndTime: (e: React.ChangeEvent) => void;
+ onBlurStartTime: (e: React.FocusEvent) => void;
+ onBlurEndTime: (e: React.FocusEvent) => void;
+ onApplyClick: () => void;
+ onResetClick: () => void;
+}
+
+const CustomFooter = ({
+ startTime,
+ startTimeError,
+ endTime,
+ endTimeError,
+ canClose,
+ onChangeStartTime,
+ onChangeEndTime,
+ onBlurStartTime,
+ onBlurEndTime,
+ onApplyClick,
+ onResetClick,
+}: CustomFooterProps) => (
+
+
+ {/* Start Time Section */}
+
+
+ Start Time
+
+
+
+ {/* End Time Section */}
+
+
+ End Time
+
+
+
+
+
+
+
+
+
+);
+
+interface CustomDateRangePickerProps {
+ onDateChange: (startDate: number, endDate: number | undefined) => void;
+ onTimeChange: (startTime: string | undefined, endTime: string | undefined) => void;
+ isDatePickerOpen: boolean;
+ setIsDatePickerOpen: (isOpen: boolean) => void;
+ ctaComponent?: React.ReactNode;
+ startDate: number;
+ endDate?: number;
+ minDate: Date | null;
+ maxDate: Date | null;
+ openDirection?: string;
+ scale?: string;
+}
+
+function CustomDateRangePickerMobile({
+ startDate,
+ endDate,
+ onDateChange,
+ onTimeChange,
+ ctaComponent,
+ isDatePickerOpen,
+ setIsDatePickerOpen,
+ minDate,
+ maxDate,
+ scale = '1',
+ openDirection = 'top-start',
+}: CustomDateRangePickerProps) {
+ const [startTimeText, setStartTimeText] = useState();
+ const [startTimeError, setStartTimeError] = useState(false);
+ const [endTimeText, setEndTimeText] = useState();
+ const [endTimeError, setEndTimeError] = useState(false);
+
+ // handle changes inside date picker
+ const handleDateChange = (dates) => {
+ const [start, end] = dates;
+
+ if (!start) {
+ return;
+ }
+ onDateChange(start.getTime(), end ? end.getTime() : undefined);
+ };
+
+ const handleApplyClick = () => {
+ if (startTimeError || endTimeError) {
+ return;
+ }
+ setIsDatePickerOpen(false);
+ onTimeChange(startTimeText, endTimeText);
+ };
+
+ const handleResetClick = () => {
+ setStartTimeError(false);
+ setEndTimeError(false);
+ setStartTimeText(undefined);
+ setEndTimeText(undefined);
+ onDateChange(0, undefined);
+ };
+
+ const onChangeStartTime = (e: React.ChangeEvent) => {
+ setStartTimeText(e.target.value.toUpperCase());
+ };
+
+ const onChangeEndTime = (e: React.ChangeEvent) => {
+ setEndTimeText(e.target.value.toUpperCase());
+ };
+
+ const onBlurStartTime = (e) => {
+ checkAndSetTime(e.target.value, setStartTimeText, setStartTimeError);
+ };
+
+ const onBlurEndTime = (e) => {
+ checkAndSetTime(e.target.value, setEndTimeText, setEndTimeError);
+ };
+
+ return (
+ <>
+
+
+ }
+ dateFormat="MM/dd/yyyy h:mm aa"
+ endDate={endDate ? new Date(endDate) : null}
+ maxDate={maxDate}
+ minDate={minDate || new Date()}
+ monthsShown={1}
+ open={isDatePickerOpen}
+ popperPlacement={openDirection}
+ startDate={startDate ? new Date(startDate) : null}
+ onCalendarClose={() => {
+ setIsDatePickerOpen(false);
+ }}
+ onChange={handleDateChange}
+ />
+
+ {ctaComponent}
+ >
+ );
+}
+
+export default CustomDateRangePickerMobile;
diff --git a/src/components/DateRangePicker/helpers.tsx b/src/components/DateRangePicker/helpers.tsx
new file mode 100644
index 00000000..43c674f9
--- /dev/null
+++ b/src/components/DateRangePicker/helpers.tsx
@@ -0,0 +1,33 @@
+import { DateTime } from 'luxon';
+
+export const canClose = (
+ startDate,
+ endDate,
+ startTimeText,
+ endTimeText,
+ startTimeError,
+ endTimeError,
+) => {
+ // If no date range is selected, allow the date picker to close
+ if (
+ startDate === null &&
+ endDate === null &&
+ startTimeText === undefined &&
+ endTimeText === undefined
+ ) {
+ return true;
+ }
+
+ return startDate != null && !startTimeError && !endTimeError;
+};
+
+export const checkAndSetTime = (inputValue, setTimeText, setIsErr) => {
+ const parsedTime = DateTime.fromFormat(inputValue, 'h:mm a');
+ if (parsedTime.isValid) {
+ setTimeText(parsedTime.toFormat('h:mm a'));
+ setIsErr(false);
+ } else {
+ console.error('Error parsing time:', parsedTime.invalidReason);
+ setIsErr(true);
+ }
+};
diff --git a/src/components/FormControl/FormControl.tsx b/src/components/FormControl/FormControl.tsx
index 7c10794f..db00c176 100644
--- a/src/components/FormControl/FormControl.tsx
+++ b/src/components/FormControl/FormControl.tsx
@@ -13,6 +13,8 @@ export interface FormControlProps extends CFormControlProps {
helperText?: string;
errorText?: string;
labelProps?: FormLabelProps;
+ helperTextProps?: Record;
+ marginY?: string;
}
export const FormControlComponent = ({
@@ -21,14 +23,20 @@ export const FormControlComponent = ({
errorText,
children,
labelProps,
+ helperTextProps,
+ marginY = '5',
...props
}: PropsWithChildren) => {
return (
-
+
{label}
- {helperText && {helperText}}
+ {helperText && (
+
+ {helperText}
+
+ )}
{children}
{errorText && (
diff --git a/src/components/Icons/CalendarIcon.tsx b/src/components/Icons/CalendarIcon.tsx
new file mode 100644
index 00000000..0ab588a2
--- /dev/null
+++ b/src/components/Icons/CalendarIcon.tsx
@@ -0,0 +1,22 @@
+import { Icon, type IconProps } from '@chakra-ui/react';
+
+export const CalendarIcon = ({ ...props }: IconProps) => {
+ return (
+
+
+
+ );
+};
diff --git a/src/components/Icons/CheckedIcon.tsx b/src/components/Icons/CheckedIcon.tsx
index 49672b86..51b465ea 100644
--- a/src/components/Icons/CheckedIcon.tsx
+++ b/src/components/Icons/CheckedIcon.tsx
@@ -5,7 +5,7 @@ interface CheckedIconProps extends IconProps {
isChecked?: boolean;
}
-export const CheckedIcon = ({ isIndeterminate, isChecked, ...props }: CheckedIconProps) => {
+export const CheckedIcon = ({ isIndeterminate, isChecked = true, ...props }: CheckedIconProps) => {
return (
-
+
-
+
);
};
diff --git a/src/components/Icons/EyeIcon.tsx b/src/components/Icons/EyeIcon.tsx
new file mode 100644
index 00000000..1ce53c91
--- /dev/null
+++ b/src/components/Icons/EyeIcon.tsx
@@ -0,0 +1,21 @@
+import { Icon, type IconProps } from '@chakra-ui/react';
+
+export const EyeIcon = (props: IconProps) => {
+ return (
+
+
+
+ );
+};
diff --git a/src/components/Icons/FilterIcon.tsx b/src/components/Icons/FilterIcon.tsx
new file mode 100644
index 00000000..dda78e3e
--- /dev/null
+++ b/src/components/Icons/FilterIcon.tsx
@@ -0,0 +1,34 @@
+import { Icon, type IconProps } from '@chakra-ui/react';
+
+interface FilterIconProps extends IconProps {
+ highToLow: boolean;
+}
+
+export const FilterIcon = ({ highToLow, ...props }: FilterIconProps) => {
+ return (
+
+ {highToLow ? (
+
+ ) : (
+
+ )}
+
+ );
+};
diff --git a/src/components/Icons/MinusButtonIcon.tsx b/src/components/Icons/MinusButtonIcon.tsx
new file mode 100644
index 00000000..bd7934a8
--- /dev/null
+++ b/src/components/Icons/MinusButtonIcon.tsx
@@ -0,0 +1,22 @@
+import { Icon, type IconProps } from '@chakra-ui/react';
+
+export const MinusButtonIcon = (props: IconProps) => {
+ return (
+
+
+
+ );
+};
diff --git a/src/components/Icons/PlusButtonIcon.tsx b/src/components/Icons/PlusButtonIcon.tsx
new file mode 100644
index 00000000..72534a95
--- /dev/null
+++ b/src/components/Icons/PlusButtonIcon.tsx
@@ -0,0 +1,21 @@
+import { Icon, type IconProps } from '@chakra-ui/react';
+
+export const PlusButtonIcon = (props: IconProps) => {
+ return (
+
+
+
+ );
+};
diff --git a/src/components/Icons/ShareIcon.tsx b/src/components/Icons/ShareIcon.tsx
new file mode 100644
index 00000000..6d23cf12
--- /dev/null
+++ b/src/components/Icons/ShareIcon.tsx
@@ -0,0 +1,23 @@
+import { Icon, type IconProps } from '@chakra-ui/react';
+
+export const ShareIcon = ({ ...props }: IconProps) => {
+ return (
+
+
+
+
+ );
+};
diff --git a/src/components/ImageFileInput/ImageFileInput.tsx b/src/components/ImageFileInput/ImageFileInput.tsx
index 1f4d8c23..3abc443d 100644
--- a/src/components/ImageFileInput/ImageFileInput.tsx
+++ b/src/components/ImageFileInput/ImageFileInput.tsx
@@ -15,7 +15,9 @@ import {
import { ImageIcon } from '../Icons';
interface ImageFileInputProps extends InputProps {
- label: string;
+ label?: string;
+ ctaText?: string;
+ buttonText?: string;
selectedFile?: File;
preview?: string;
errorMessage?: string;
@@ -24,6 +26,8 @@ interface ImageFileInputProps extends InputProps {
export const ImageFileInput = ({
label,
+ ctaText = 'Browse or drag and drop your image here',
+ buttonText = 'Browse images',
selectedFile,
preview,
errorMessage,
@@ -32,11 +36,13 @@ export const ImageFileInput = ({
}: ImageFileInputProps) => {
return (
-
-
- {label}
-
-
+ {label && (
+
+
+ {label}
+
+
+ )}
- Browse or drag and drop your image here
+ {ctaText}
- Browse images
+ {buttonText}
)}
diff --git a/src/components/ImageFileInput/ImageFileInputSmall.tsx b/src/components/ImageFileInput/ImageFileInputSmall.tsx
new file mode 100644
index 00000000..bbc5633e
--- /dev/null
+++ b/src/components/ImageFileInput/ImageFileInputSmall.tsx
@@ -0,0 +1,117 @@
+import {
+ Center,
+ Flex,
+ type FlexProps,
+ FormControl,
+ FormLabel,
+ Input,
+ InputGroup,
+ type InputProps,
+ Text,
+ Image,
+ Show,
+} from '@chakra-ui/react';
+
+import { ImageIcon } from '../Icons';
+
+interface ImageFileInputSmallProps extends InputProps {
+ label?: string;
+ ctaText?: string;
+ buttonText?: string;
+ selectedFile?: File;
+ preview?: string;
+ errorMessage?: string;
+ flexProps?: FlexProps;
+}
+
+export const ImageFileInputSmall = ({
+ label,
+ ctaText = 'Browse or drag and drop your image here',
+ buttonText = 'Browse images',
+ selectedFile,
+ preview,
+ errorMessage,
+ flexProps,
+ ...props
+}: ImageFileInputSmallProps) => {
+ return (
+
+ {label && (
+
+
+ {label}
+
+
+ )}
+
+
+ {
+ // console.log('File input clicked');
+ }}
+ {...props}
+ />
+
+ {selectedFile !== undefined && preview ? (
+
+ ) : (
+
+
+
+ {ctaText}
+
+
+ {buttonText}
+
+
+ )}
+
+
+ {errorMessage && (
+
+ {errorMessage}
+
+ )}
+
+ );
+};
diff --git a/src/components/Navbar/MobileMenu.tsx b/src/components/Navbar/MobileMenu.tsx
index afa1531c..49b4ce92 100644
--- a/src/components/Navbar/MobileMenu.tsx
+++ b/src/components/Navbar/MobileMenu.tsx
@@ -31,6 +31,8 @@ interface MobileMenuProps {
export const MobileMenu = ({ menuItems }: MobileMenuProps) => {
const { isLoggedIn } = useAuthWalletContext();
const { isOpen, onOpen, onClose } = useDisclosure();
+ const isTicketSubdirectory =
+ location.pathname.startsWith('/tickets/') || location.pathname.startsWith('/claim/');
const btnRef = useRef(null);
return (
@@ -59,9 +61,11 @@ export const MobileMenu = ({ menuItems }: MobileMenuProps) => {
})}
-
- {isLoggedIn ? : }
-
+ {!isTicketSubdirectory && (
+
+ {isLoggedIn ? : }
+
+ )}
diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx
index 4f56477e..66c22505 100644
--- a/src/components/Navbar/Navbar.tsx
+++ b/src/components/Navbar/Navbar.tsx
@@ -25,16 +25,17 @@ type NavbarProps = BoxProps;
export const Navbar = (props: NavbarProps) => {
const { isLoggedIn } = useAuthWalletContext();
+ const isTicketSubdirectory =
+ location.pathname.startsWith('/tickets/') || location.pathname.startsWith('/claim/');
const MENU_ITEMS = [
{
- name: 'Docs',
- href: 'https://docs.keypom.xyz',
- isExternal: true,
+ name: 'Gallery',
+ href: '/gallery',
},
{
- name: 'Get in touch',
- href: 'https://twitter.com/keypomxyz',
+ name: 'Docs',
+ href: 'https://docs.keypom.xyz',
isExternal: true,
},
{
@@ -42,6 +43,11 @@ export const Navbar = (props: NavbarProps) => {
href: '/drops',
isProtected: !isLoggedIn,
},
+ {
+ name: 'My Events',
+ href: '/events',
+ isProtected: !isLoggedIn,
+ },
];
const menuItems = MENU_ITEMS.map((item) => (
@@ -72,7 +78,7 @@ export const Navbar = (props: NavbarProps) => {
{/* Menu Items */}
{menuItems}
- {isLoggedIn ? : }
+ {!isTicketSubdirectory && (isLoggedIn ? : )}
diff --git a/src/components/NotFound404/NotFound404.tsx b/src/components/NotFound404/NotFound404.tsx
index cf549cd5..4e481e93 100644
--- a/src/components/NotFound404/NotFound404.tsx
+++ b/src/components/NotFound404/NotFound404.tsx
@@ -1,38 +1,46 @@
import { Button, Center, Divider, Hide, HStack, Show, Text, VStack } from '@chakra-ui/react';
import { useNavigate } from 'react-router-dom';
-export const NotFound404 = () => {
+export const NotFound404 = ({
+ header = '404',
+ subheader = 'This page could not be found.',
+ cta = 'back to homepage',
+}: {
+ header?: string;
+ subheader?: string;
+ cta?: string;
+}) => {
const navigate = useNavigate();
return (
- 404
+ {header}
- This page could not be found.
+ {subheader}
- 404
+ {header}
- This page could not be found.
+ {subheader}
diff --git a/src/components/ProtectedRoutes/ProtectedRoute.tsx b/src/components/ProtectedRoutes/ProtectedRoute.tsx
index c1e0ba41..a0787848 100644
--- a/src/components/ProtectedRoutes/ProtectedRoute.tsx
+++ b/src/components/ProtectedRoutes/ProtectedRoute.tsx
@@ -16,6 +16,7 @@ export const ProtectedRoute = ({
useEffect(() => {
if (!isLoggedIn) {
+ // eslint-disable-next-line no-console
console.error('Unauthenticated page access.');
navigate(redirectPath);
}
diff --git a/src/components/SignedInButton/SignedInButton.tsx b/src/components/SignedInButton/SignedInButton.tsx
index bf150930..5aed7ef8 100644
--- a/src/components/SignedInButton/SignedInButton.tsx
+++ b/src/components/SignedInButton/SignedInButton.tsx
@@ -27,6 +27,10 @@ export const SignedInButton = () => {
const { account, selector } = useAuthWalletContext();
const handleSignOut = async () => {
+ if (!selector.isSignedIn()) {
+ console.error('Not signed in');
+ return;
+ }
const wallet = await selector.wallet();
wallet
@@ -37,7 +41,7 @@ export const SignedInButton = () => {
})
.catch((err) => {
// eslint-disable-next-line no-console
- console.log('Failed to sign out');
+ console.error('Failed to sign out');
// eslint-disable-next-line no-console
console.error(err);
});
@@ -121,7 +125,7 @@ export const SignedInButton = () => {
} onClick={handleMasterKey}>
- Master Key
+ Site Password
} onClick={handleSignOut}>
Sign out
diff --git a/src/components/Step/Step.tsx b/src/components/Step/Step.tsx
index 899eee2e..8b771498 100644
--- a/src/components/Step/Step.tsx
+++ b/src/components/Step/Step.tsx
@@ -1,10 +1,8 @@
import { Box, HStack, Text } from '@chakra-ui/react';
-import type React from 'react';
export interface StepItem {
title: string;
name: string;
- component: React.ReactNode;
}
export interface StepProps {
diff --git a/src/components/Table/DataTable.tsx b/src/components/Table/DataTable.tsx
index 586d564e..6b5d3bd0 100644
--- a/src/components/Table/DataTable.tsx
+++ b/src/components/Table/DataTable.tsx
@@ -1,7 +1,6 @@
import {
TableContainer,
Show,
- Hide,
Tbody,
Table,
type TableProps,
@@ -33,11 +32,24 @@ import { type ColumnItem, type DataItem } from './types';
*/
interface DataTableProps extends TableProps {
- type?: 'all-drops' | 'drop-manager';
+ type?:
+ | 'all-drops'
+ | 'drop-manager'
+ | 'no-filtered-keys'
+ | 'no-filtered-drops'
+ | 'event-manager'
+ | 'all-tickets'
+ | 'no-filtered-events'
+ | 'all-events'
+ | 'no-filtered-tickets'
+ | 'create-tickets'
+ | 'collect-info';
showColumns?: boolean;
columns: ColumnItem[];
data: DataItem[];
loading?: boolean;
+ showMobileTitles: string[];
+ excludeMobileColumns: string[];
}
export const DataTable = ({
@@ -46,6 +58,8 @@ export const DataTable = ({
columns = [],
data = [],
loading = false,
+ showMobileTitles = [],
+ excludeMobileColumns = [],
...props
}: DataTableProps) => {
const navigate = useNavigate();
@@ -98,12 +112,21 @@ export const DataTable = ({
{/* Desktop Table */}
-
+
{showColumns && (
- {columns.map((col) => (
-
+ {columns.map((col, index) => (
+ |
{col.title}
|
))}
@@ -116,9 +139,16 @@ export const DataTable = ({
{/* Mobile table */}
-
-
-
+
+
+
>
) : (
diff --git a/src/components/Table/MobileDataTable.tsx b/src/components/Table/MobileDataTable.tsx
index c5272bf0..12e36f39 100644
--- a/src/components/Table/MobileDataTable.tsx
+++ b/src/components/Table/MobileDataTable.tsx
@@ -17,12 +17,16 @@ interface MobileDataTableProps extends TableProps {
columns: ColumnItem[];
data: DataItem[];
loading: boolean;
+ showMobileTitles: string[];
+ excludeMobileTitles: string[];
}
export const MobileDataTable = ({
columns,
data,
loading = false,
+ showMobileTitles = [],
+ excludeMobileTitles = [],
...props
}: MobileDataTableProps) => {
const navigate = useNavigate();
@@ -41,7 +45,7 @@ export const MobileDataTable = ({
));
}
- return data.map((drop) => (
+ return data.map((drop, idx) => (
{columns
- .filter((column) => actionColumn.title !== column.title) // exclude action column
+ .filter(
+ (column) =>
+ actionColumn.id !== column.id && !excludeMobileTitles.includes(column.id),
+ ) // exclude action column
.map((column) => (
- {column.selector(drop)}
+
+ {showMobileTitles.includes(column.id) ? `${column.title}: ` : ''}
+ {column.selector(drop)}
+
))}
- {actionColumn.selector(drop)} |
+
+ {actionColumn.selector(drop)}
+ |
));
};
return (
-
+
diff --git a/src/components/Table/constants.ts b/src/components/Table/constants.ts
index 5449a7eb..fc2f8383 100644
--- a/src/components/Table/constants.ts
+++ b/src/components/Table/constants.ts
@@ -3,8 +3,44 @@ export const EMPTY_TABLE_TEXT_MAP = {
heading: `You haven't added any drops`,
text: `Let's create a drop!`,
},
+ 'all-events': {
+ heading: `You haven't created any events`,
+ text: `Create a new event!`,
+ },
+ 'no-filtered-events': {
+ heading: `No events found with the current filters`,
+ text: `Please try different filters`,
+ },
+ 'event-manager': {
+ heading: `You don't have any tickets for this event!`,
+ text: `Please create a new event`,
+ },
+ 'no-filtered-drops': {
+ heading: `No drops found with the current filters`,
+ text: `Please try different filters`,
+ },
+ 'no-filtered-keys': {
+ heading: `No keys found with the current filters`,
+ text: `Please try different filters`,
+ },
'drop-manager': {
heading: `You haven't added any keys`,
text: '',
},
+ 'all-tickets': {
+ heading: `No tickets have been purchased yet`,
+ text: `Please try again later`,
+ },
+ 'no-filtered-tickets': {
+ heading: `No tickets found with the current filters`,
+ text: `Please try different filters`,
+ },
+ 'collect-info': {
+ heading: `You don't have any attendee questions`,
+ text: `Add some if you want!`,
+ },
+ 'create-tickets': {
+ heading: `You don't have any tickets`,
+ text: `Create a new ticket!`,
+ },
};
diff --git a/src/components/TimeInput/TimeInput.tsx b/src/components/TimeInput/TimeInput.tsx
new file mode 100644
index 00000000..42bbd3c6
--- /dev/null
+++ b/src/components/TimeInput/TimeInput.tsx
@@ -0,0 +1,62 @@
+import type React from 'react';
+import { useState, useEffect } from 'react';
+import InputMask from 'react-input-mask';
+import { Input } from '@chakra-ui/react';
+
+interface TimeInputProps {
+ value: string;
+ onChange: (e: React.ChangeEvent) => void;
+ onBlur: (e: React.FocusEvent) => void;
+ isInvalid: boolean;
+ placeholder: string;
+}
+
+export const TimeInput = ({ value, onChange, onBlur, isInvalid, placeholder }: TimeInputProps) => {
+ const [mask, setMask] = useState('9|');
+
+ useEffect(() => {
+ // Check if the second character is a colon
+ if (value.length === 2) {
+ if (value[1] === ':') {
+ setMask('9:99 ??'); // Change the mask to "9:99 ??"
+ } else {
+ setMask('99:99 ??'); // Default mask
+ }
+ }
+ if (value.length < 2) {
+ setMask('9|'); // Default mask
+ }
+ }, [value]); // Depend on value to re-evaluate when it changes
+
+ const handleBlur = (e: React.FocusEvent) => {
+ onBlur(e); // Call the parent component's onBlur for validation
+ };
+
+ return (
+
+ {(inputProps) => (
+
+ )}
+
+ );
+};
diff --git a/src/components/ToggleColorModeButton/ToggleColorModeButton.tsx b/src/components/ToggleColorModeButton/ToggleColorModeButton.tsx
new file mode 100644
index 00000000..84f09963
--- /dev/null
+++ b/src/components/ToggleColorModeButton/ToggleColorModeButton.tsx
@@ -0,0 +1,10 @@
+import { useColorMode, Button } from '@chakra-ui/react';
+
+export const ToggleColorModeButton = () => {
+ const { colorMode, toggleColorMode } = useColorMode();
+ return (
+
+ );
+};
diff --git a/src/components/ToggleSwitch/ToggleSwitch.tsx b/src/components/ToggleSwitch/ToggleSwitch.tsx
new file mode 100644
index 00000000..a705d339
--- /dev/null
+++ b/src/components/ToggleSwitch/ToggleSwitch.tsx
@@ -0,0 +1,27 @@
+import { Switch, Box } from '@chakra-ui/react';
+
+function ToggleSwitch({
+ toggle,
+ handleToggle,
+ disabled = false,
+ size = 'md',
+}: {
+ toggle: boolean;
+ handleToggle: (a: any) => void;
+ disabled?: boolean;
+ size?: 'sm' | 'md' | 'lg';
+}) {
+ return (
+
+
+
+ );
+}
+
+export default ToggleSwitch;
diff --git a/src/config/config.ts b/src/config/config.ts
index 063e939c..367b04eb 100644
--- a/src/config/config.ts
+++ b/src/config/config.ts
@@ -3,7 +3,11 @@ import { type IToken, type IWalletOption } from '@/types/common';
const contractName = process.env.REACT_APP_CONTRACT_ID ?? 'v2.keypom.testnet';
const cloudflareIfps = process.env.REACT_APP_CLOUDFLARE_IFPS ?? 'https://cloudflare-ipfs.com/ipfs';
// eslint-disable-next-line no-console
-console.log(process.env.REACT_APP_NETWORK_ID, process.env.REACT_APP_CONTRACT_ID);
+console.log(
+ 'Network and Contract IDs: ',
+ process.env.REACT_APP_NETWORK_ID,
+ process.env.REACT_APP_CONTRACT_ID,
+);
const SUPPORTED_WALLET_OPTIONS: IWalletOption[] = [
{
diff --git a/src/constants/common.ts b/src/constants/common.ts
index 6b234115..3f699e0b 100644
--- a/src/constants/common.ts
+++ b/src/constants/common.ts
@@ -6,6 +6,7 @@ export const CLOUDFLARE_IPFS = 'https://cloudflare-ipfs.com/ipfs';
export const DROP_TYPE = {
TOKEN: 'TOKEN',
TICKET: 'TICKET',
+ EVENT: 'EVENT',
TRIAL: 'TRIAL',
NFT: 'NFT',
SIMPLE: 'SIMPLE',
@@ -15,10 +16,18 @@ export const DROP_TYPE = {
type DROP_TYPE_KEYS = keyof typeof DROP_TYPE;
export type DROP_TYPES = (typeof DROP_TYPE)[DROP_TYPE_KEYS];
+export const PURCHASED_LOCAL_STORAGE_PREFIX = 'TICKETS_PURCHASED';
+
export const MASTER_KEY = 'MASTER_KEY';
export const MAX_FILE_SIZE = 10000000;
-export const PAGE_SIZE_LIMIT = 10;
+export const WORKER_BASE_URL = 'https://keypom-nft-storage.keypom.workers.dev/';
+export const EVENTS_WORKER_IPFS_PINNING = 'https://stripe-worker.kp-capstone.workers.dev/ipfs-pin';
+export const EVENTS_WORKER_BASE = 'https://stripe-worker.kp-capstone.workers.dev';
+
+export const PAGE_SIZE_LIMIT = 5;
export const NFT_ATTEMPT_KEY = 'NFT_ATTEMPT';
export const PAGE_QUERY_PARAM = 'page';
+export const KEYPOM_EVENTS_CONTRACT = '1711230915949-kp-ticketing.testnet';
+export const KEYPOM_MARKETPLACE_CONTRACT = '1711230915949-marketplace.testnet';
diff --git a/src/contexts/AppContext.tsx b/src/contexts/AppContext.tsx
index 91d4d98e..7ef1268b 100644
--- a/src/contexts/AppContext.tsx
+++ b/src/contexts/AppContext.tsx
@@ -1,4 +1,4 @@
-import { createContext, type PropsWithChildren, useContext, useState } from 'react';
+import { createContext, type PropsWithChildren, useContext, useState, useEffect } from 'react';
import { type ButtonProps } from '@chakra-ui/react';
import { set } from '@/utils/localStorage';
@@ -15,8 +15,10 @@ export interface AppModalOptions {
buttonProps?: ButtonProps;
}
-interface AppModalValues {
+export interface AppModalValues {
isOpen: boolean;
+ modalContent?: React.ReactNode;
+ size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full';
closeOnOverlayClick?: boolean;
closeButtonVisible?: boolean;
message?: string;
@@ -27,23 +29,76 @@ interface AppModalValues {
isLoading?: boolean;
isSuccess?: boolean;
isError?: boolean;
+ canClose?: boolean;
}
interface AppContextValues {
appModal: AppModalValues;
+ fetchAttempts: number;
setAppModal: (args: AppModalValues) => void;
+ setTriggerPriceFetch: (trigger: boolean) => void;
+ nearPrice?: number;
+ setNearPrice: (price: number) => void;
}
const AppContext = createContext(null);
+const fetchPrice = async (url, parseData) => {
+ try {
+ const response = await fetch(url);
+ const data = await response.json();
+ return parseData(data);
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.error('Fetch error:', error);
+ return null;
+ }
+};
+
export const AppContextProvider = ({ children }: PropsWithChildren) => {
const [appModal, setAppModal] = useState({
isOpen: false,
});
+ const [nearPrice, setNearPrice] = useState();
+ const [fetchAttempts, setFetchAttempts] = useState(0);
+ const [triggerPriceFetch, setTriggerPriceFetch] = useState(true);
+
+ useEffect(() => {
+ const setPriceWithFallback = async () => {
+ const coingeckoPrice = await fetchPrice(
+ 'https://api.coingecko.com/api/v3/simple/price?ids=near&vs_currencies=usd',
+ (data) => data.near.usd,
+ );
+
+ if (coingeckoPrice !== null) {
+ setNearPrice(coingeckoPrice);
+ return;
+ }
+
+ const binancePrice = await fetchPrice(
+ 'https://api.binance.com/api/v3/ticker/price?symbol=NEARUSDT',
+ (data) => data.price,
+ );
+
+ if (binancePrice !== null) {
+ setNearPrice(parseFloat(binancePrice));
+ }
+ };
+
+ if (triggerPriceFetch) {
+ setFetchAttempts(fetchAttempts + 1);
+ setTriggerPriceFetch(false);
+ setPriceWithFallback();
+ }
+ }, [triggerPriceFetch]);
const value = {
appModal,
setAppModal,
+ fetchAttempts,
+ nearPrice,
+ setTriggerPriceFetch,
+ setNearPrice,
};
return {children};
@@ -64,12 +119,11 @@ export const useAppContext = () => {
export const openMasterKeyModal = (setAppModal, confirm, cancel) => {
setAppModal({
isOpen: true,
- header: 'Set your master key!',
- message:
- 'This key is used to generate the links for all of your drops. Do NOT lose it or forget it!',
+ header: 'Enter your Keypom password',
+ message: 'This is used for security purpose. Do not share or lose your password.',
inputs: [
{
- placeholder: 'Master Key',
+ placeholder: 'Password',
valueKey: 'masterKey',
},
],
@@ -84,9 +138,8 @@ export const openMasterKeyModal = (setAppModal, confirm, cancel) => {
},
},
{
- label: 'Set Master Key',
+ label: 'Set Password',
func: ({ masterKey }) => {
- console.log(masterKey);
if (!masterKey || masterKey.length === 0) {
alert('Master Key must be specified. Please try again.');
if (cancel) cancel();
diff --git a/src/contexts/AuthWalletContext.tsx b/src/contexts/AuthWalletContext.tsx
index 7b11c7de..98271214 100644
--- a/src/contexts/AuthWalletContext.tsx
+++ b/src/contexts/AuthWalletContext.tsx
@@ -105,7 +105,7 @@ export const AuthWalletContextProvider = ({ children }: PropsWithChildren) => {
selector: selector as WalletSelector,
accounts,
accountId,
- isLoggedIn: Boolean(sessionStorage.getItem('account')), // selector?.isSignedIn(), with null, cant login. with undefined, cant signout properly
+ isLoggedIn: Boolean(selector ? selector.isSignedIn() : true), // selector?.isSignedIn(), with null, cant login. with undefined, cant signout properly
account: account as Account,
};
diff --git a/src/custom.d.ts b/src/custom.d.ts
new file mode 100644
index 00000000..a0993ed6
--- /dev/null
+++ b/src/custom.d.ts
@@ -0,0 +1,4 @@
+declare module '*.png' {
+ const value: any;
+ export = value;
+}
diff --git a/src/data/db.json b/src/data/db.json
new file mode 100644
index 00000000..f980c4ef
--- /dev/null
+++ b/src/data/db.json
@@ -0,0 +1,104 @@
+{
+ "events": [
+ {
+ "id": 1,
+ "title": "Alcoholics Anonymous Meeting",
+ "description": "A funny event desciption yayay",
+ "location": "Waterloo On, CA",
+ "date": "2018-11-11",
+ "tickets": "10",
+ "price": "12.56",
+ "img": "img/alcohol.png"
+ },
+ {
+ "id": 2,
+ "title": "Paint Night",
+ "description": "A different event desciption yayay",
+ "location": "Waterloo On, CA",
+ "date": "2018-11-11",
+ "tickets": "10",
+ "price": "12.34",
+ "img": "img/paintticket.png"
+ },
+ {
+ "id": 3,
+ "title": "Art Show",
+ "description": "got this description from the db",
+ "location": "Toronto On, CA",
+ "date": "2022-11-11",
+ "tickets": "13",
+ "price": "43.21",
+ "img": "img/monalisa.png"
+ },
+ {
+ "id": 4,
+ "title": "Basketball Intermurals",
+ "description": "Another funny event desciption yayay",
+ "location": "Kitchener On, CA",
+ "date": "2021-12-12",
+ "tickets": "15",
+ "price": "11.13",
+ "img": "img/basketball.png"
+ },
+ {
+ "id": 5,
+ "title": "Ice Hockey Rink Signups",
+ "description": "A funny event desciption hurray ok",
+ "location": "Waterloo On, CA",
+ "date": "2021-10-12",
+ "tickets": "152",
+ "price": "42.00",
+ "img": "img/hockeyticket.png"
+ },
+ {
+ "id": 6,
+ "title": "Ballet",
+ "description": "A Ballet event desciption yayay",
+ "location": "Alaska, CA",
+ "date": "2021-10-12",
+ "tickets": "12",
+ "price": "3.99",
+ "img": "img/ballet.png"
+ },
+ {
+ "id": 7,
+ "title": "Car Show",
+ "location": "123 street, CA",
+ "description": "A Car event desciption yayay",
+ "date": "2021-10-1",
+ "tickets": "14",
+ "price": "19.99",
+ "img": "img/car.png"
+ },
+ {
+ "id": 8,
+ "title": "Friends Meetup",
+ "description": "A Friends event desciption yayay",
+ "location": "Waterloo On, CA",
+ "date": "2021-11-1",
+ "tickets": "112",
+ "price": "7.20",
+ "img": "img/friends.png"
+ },
+ {
+ "id": 9,
+ "title": "Hockey Game",
+ "description": "Hockey game for hockey enjoyers",
+ "location": "Waterloo On, CA",
+ "date": "2011-11-1",
+ "tickets": "111",
+ "price": "3.60",
+ "img": "img/hockeygame.png"
+ },
+ {
+ "id": 10,
+ "title": "Music Concert",
+ "description": "Music! Its fun",
+ "location": "Waterloo On, CA",
+ "date": "2024-1-1",
+ "tickets": "1000",
+ "price": "95.05",
+ "img": "img/music.png"
+ }
+ ]
+}
diff --git a/src/features/all-drops/components/AllDrops.tsx b/src/features/all-drops/components/AllDrops.tsx
index f56a74ed..533cc673 100644
--- a/src/features/all-drops/components/AllDrops.tsx
+++ b/src/features/all-drops/components/AllDrops.tsx
@@ -1,11 +1,15 @@
+import { useCallback, useEffect, useRef, useState } from 'react';
import {
+ Input,
+ Hide,
+ InputGroup,
+ InputLeftElement,
+ Icon,
+ Button,
Badge,
Box,
- Button,
HStack,
Menu,
- MenuButton,
- MenuItem,
MenuList,
Show,
Text,
@@ -15,32 +19,40 @@ import {
Skeleton,
VStack,
} from '@chakra-ui/react';
-import { useCallback, useEffect, useRef, useState } from 'react';
import { type ProtocolReturnedDrop } from 'keypom-js';
-import { ChevronDownIcon } from '@chakra-ui/icons';
-import { useSearchParams } from 'react-router-dom';
+import { SearchIcon } from '@chakra-ui/icons';
+import { useNavigate } from 'react-router-dom';
+import { PAGE_SIZE_LIMIT, DROP_TYPE } from '@/constants/common';
import { useAppContext } from '@/contexts/AppContext';
import { useAuthWalletContext } from '@/contexts/AuthWalletContext';
import { type ColumnItem, type DataItem } from '@/components/Table/types';
import { DataTable } from '@/components/Table';
import { DeleteIcon } from '@/components/Icons';
-import { truncateAddress } from '@/utils/truncateAddress';
-import { NextButton, PrevButton } from '@/components/Pagination';
-import { usePagination } from '@/hooks/usePagination';
-import { CLOUDFLARE_IPFS, DROP_TYPE, PAGE_QUERY_PARAM } from '@/constants/common';
import keypomInstance from '@/lib/keypom';
-import { PopoverTemplate } from '@/components/PopoverTemplate';
-
-import { MENU_ITEMS } from '../config/menuItems';
+import {
+ DROP_TYPE_OPTIONS,
+ DROP_CLAIM_STATUS_OPTIONS,
+ DATE_FILTER_OPTIONS,
+ DROP_CLAIM_STATUS_ITEMS,
+ PAGE_SIZE_ITEMS,
+ DROP_TYPE_ITEMS,
+ DATE_FILTER_ITEMS,
+ CREATE_DROP_ITEMS,
+ createMenuItems,
+} from '../config/menuItems';
+
+import { DropDownButton } from './DropDownButton';
import { MobileDrawerMenu } from './MobileDrawerMenu';
import { setConfirmationModalHelper } from './ConfirmationModal';
+import { DropManagerPagination } from './DropManagerPagination';
+import { FilterOptionsMobileButton } from './FilterOptionsMobileButton';
const COLUMNS: ColumnItem[] = [
{
id: 'dropName',
- title: 'Drop name',
+ title: 'Name',
selector: (drop) => drop.name,
thProps: {
minW: '240px',
@@ -55,7 +67,7 @@ const COLUMNS: ColumnItem[] = [
},
{
id: 'dropType',
- title: 'Drop type',
+ title: 'Type',
selector: (drop) => drop.type,
loadingElement: ,
},
@@ -77,159 +89,276 @@ const COLUMNS: ColumnItem[] = [
},
];
-export default function AllDrops() {
- const [searchParams, setSearchParams] = useSearchParams();
+interface AllDropsProps {
+ pageTitle: string;
+ hasDateFilter: boolean;
+ ctaButtonLabel: string;
+}
+
+export default function AllDrops({ pageTitle, hasDateFilter, ctaButtonLabel }: AllDropsProps) {
const { setAppModal } = useAppContext();
+ const navigate = useNavigate();
+
+ const [numPages, setNumPages] = useState(0);
+ const [curPage, setCurPage] = useState(0);
const { isOpen, onOpen, onClose } = useDisclosure();
const [isLoading, setIsLoading] = useState(true);
+ const [isAllDropsLoading, setIsAllDropsLoading] = useState(true);
const popoverClicked = useRef(0);
- const [dataSize, setDataSize] = useState(0);
- const [data, setData] = useState>([]);
+ const [selectedFilters, setSelectedFilters] = useState<{
+ type: string;
+ search: string;
+ status: string;
+ date: string;
+ pageSize: number;
+ }>({
+ type: DROP_TYPE_OPTIONS.ANY,
+ search: '',
+ date: DATE_FILTER_OPTIONS.ANY,
+ status: DROP_CLAIM_STATUS_OPTIONS.ANY,
+ pageSize: PAGE_SIZE_LIMIT,
+ });
+ const [searchTerm, setSearchTerm] = useState('');
+ const [numOwnedDrops, setNumOwnedDrops] = useState(0);
+ const [filteredDataItems, setFilteredDataItems] = useState([]);
const [wallet, setWallet] = useState({});
const { selector, accountId } = useAuthWalletContext();
- const {
- setPagination,
- hasPagination,
- pagination,
- isFirstPage,
- isLastPage,
- loading,
- handleNextPage,
- handlePrevPage,
- } = usePagination({
- dataSize,
- handlePrevApiCall: async () => {
- const prevPageIndex = pagination.pageIndex - 1;
- await handleGetDrops({
- start: prevPageIndex * pagination.pageSize,
- limit: pagination.pageSize,
- });
- const newQueryParams = new URLSearchParams({
- [PAGE_QUERY_PARAM]: (prevPageIndex + 1).toString(),
- });
- setSearchParams(newQueryParams);
- },
- handleNextApiCall: async () => {
- const nextPageIndex = pagination.pageIndex + 1;
- await handleGetDrops({
- start: nextPageIndex * pagination.pageSize,
- limit: pagination.pageSize,
- });
- const newQueryParams = new URLSearchParams({
- [PAGE_QUERY_PARAM]: (nextPageIndex + 1).toString(),
- });
- setSearchParams(newQueryParams);
- },
- });
+ const handlePageSizeSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ pageSize: parseInt(item.label),
+ }));
+ };
- const handleGetDropsSize = async () => {
- const numDrops = await keypomInstance.getDropSupplyForOwner({
- accountId,
- });
+ const handleDropTypeSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ type: item.label,
+ }));
+ };
+
+ const handleDateSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ date: item.label,
+ }));
+ };
- setDataSize(numDrops);
+ const handleSearchChange = (event) => {
+ const { value } = event.target;
+ setSearchTerm(value);
};
- const setAllDropsData = async (drop: ProtocolReturnedDrop) => {
- const { drop_id: id, metadata, next_key_id: totalKeys } = drop;
- const claimedKeys = await keypomInstance.getAvailableKeys(id);
- const claimedText = `${totalKeys - claimedKeys} / ${totalKeys}`;
+ const handleDropStatusSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ status: item.label,
+ }));
+ };
- const { dropName } = keypomInstance.getDropMetadata(metadata);
+ const handleNextPage = () => {
+ setCurPage((prev) => prev + 1);
+ };
- let type: string | null = '';
- try {
- type = keypomInstance.getDropType(drop);
- } catch (_) {
- type = DROP_TYPE.OTHER;
+ const handlePrevPage = () => {
+ setCurPage((prev) => prev - 1);
+ };
+
+ const handleKeyDown = (event) => {
+ if (event.key === 'Enter') {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ search: searchTerm,
+ }));
}
+ };
+
+ const handleFiltering = async (drops) => {
+ // Apply the selected filters
+ if (selectedFilters.type !== DROP_TYPE_OPTIONS.ANY) {
+ drops = drops.filter(
+ (drop) =>
+ keypomInstance.getDropType(drop).toLowerCase() === selectedFilters.type.toLowerCase(),
+ );
+ }
+
+ if (selectedFilters.status !== DROP_CLAIM_STATUS_OPTIONS.ANY) {
+ // Convert each drop to a promise that resolves to either the drop or null
+ const dropsPromises = drops.map(async (drop) => {
+ const keysLeft = await keypomInstance.getAvailableKeys(drop.drop_id);
+ const isFullyClaimed = keysLeft === 0;
+ const isPartiallyClaimed = keysLeft > 0 && keysLeft < drop.next_key_id;
+ const isUnclaimed = keysLeft === drop.next_key_id;
- let nftHref: string | undefined;
- if (type === DROP_TYPE.NFT) {
- let nftMetadata = {
- media: '',
- title: '',
- description: '',
- };
- try {
- const fcMethods = drop.fc?.methods;
if (
- fcMethods === undefined ||
- fcMethods.length === 0 ||
- fcMethods[0] === undefined ||
- fcMethods[0][0] === undefined
+ (isFullyClaimed && selectedFilters.status === DROP_CLAIM_STATUS_OPTIONS.FULLY) ||
+ (isPartiallyClaimed && selectedFilters.status === DROP_CLAIM_STATUS_OPTIONS.PARTIALLY) ||
+ (isUnclaimed && selectedFilters.status === DROP_CLAIM_STATUS_OPTIONS.UNCLAIMED)
) {
- throw new Error('Unable to retrieve function calls.');
+ return drop;
}
+ return null;
+ });
- const { nftData } = await keypomInstance.getNFTorTokensMetadata(
- fcMethods[0][0],
- drop.drop_id,
- );
+ // Wait for all promises to resolve, then filter out the nulls
+ const resolvedDrops = await Promise.all(dropsPromises);
+ drops = resolvedDrops.filter((drop): drop is ProtocolReturnedDrop => drop !== null);
+ }
- nftMetadata = {
- media: `${CLOUDFLARE_IPFS}/${nftData?.metadata?.media}`, // eslint-disable-line
- title: nftData?.metadata?.title,
- description: nftData?.metadata?.description,
- };
+ if (selectedFilters.search.trim() !== '') {
+ drops = drops.filter((drop) => {
+ const { dropName } = keypomInstance.getDropMetadata(drop.metadata);
+ return dropName.toLowerCase().includes(selectedFilters.search.toLowerCase());
+ });
+ }
- console.log(nftData);
- } catch (e) {
- console.error('failed to get nft metadata', e); // eslint-disable-line no-console
- }
- nftHref = nftMetadata?.media || 'assets/image-not-found.png';
+ if (selectedFilters.date !== DATE_FILTER_OPTIONS.ANY) {
+ drops = drops
+ .filter((drop: ProtocolReturnedDrop) => {
+ try {
+ const dropMeta = JSON.parse(drop.metadata || '{}');
+ const date = new Date(dropMeta.dateCreated);
+ return dropMeta.dateCreated && !isNaN(date.getTime()); // Ensures dateCreated is valid
+ } catch (e) {
+ return false; // Exclude drops with malformed metadata
+ }
+ })
+ .sort((a, b) => {
+ // Assuming metadata has been validated, no need for try-catch here
+ const dateA = new Date(JSON.parse(a.metadata).dateCreated).getTime();
+ const dateB = new Date(JSON.parse(b.metadata).dateCreated).getTime();
+ return selectedFilters.date === DATE_FILTER_OPTIONS.NEWEST
+ ? dateB - dateA
+ : dateA - dateB;
+ });
}
- return {
- id,
- name: truncateAddress(dropName, 'end', 48),
- type: type?.toLowerCase(),
- media: nftHref,
- claimed: claimedText,
- };
+ return drops;
};
- const handleGetDrops = useCallback(
- async ({ start = 0, limit = pagination.pageSize }) => {
- const drops = await keypomInstance.getDrops({ accountId, start, limit });
+ const handleGetAllDrops = useCallback(async () => {
+ setIsAllDropsLoading(true);
- setWallet(await selector.wallet());
+ const drops = await keypomInstance.getAllDrops({
+ accountId: accountId!,
+ });
- setData(
- await Promise.all(
- drops.map(async (drop) => {
- return await setAllDropsData(drop);
- }),
- ),
- );
+ const filteredDrops = await handleFiltering(drops);
+ const dropData = await Promise.all(
+ filteredDrops.map(async (drop) => await keypomInstance.getDropData({ drop })),
+ );
+ setFilteredDataItems(dropData);
+
+ const totalPages = Math.ceil(filteredDrops.length / selectedFilters.pageSize);
+ setNumPages(totalPages);
+
+ setCurPage(0);
+ setIsAllDropsLoading(false);
+ }, [accountId, selectedFilters, keypomInstance]);
+
+ const handleGetInitialDrops = useCallback(async () => {
+ setIsLoading(true);
+
+ // First get the total supply of drops so we know when to stop fetching
+ const totalSupply = await keypomInstance.getDropSupplyForOwner({ accountId: accountId! });
+ setNumOwnedDrops(totalSupply);
+
+ // Loop until we have enough filtered drops to fill the page size
+ let dropsFetched = 0;
+ let filteredDrops: ProtocolReturnedDrop[] = [];
+ while (dropsFetched < totalSupply && filteredDrops.length < selectedFilters.pageSize) {
+ const drops = await keypomInstance.getPaginatedDrops({
+ accountId: accountId!,
+ start: dropsFetched,
+ limit: selectedFilters.pageSize,
+ });
+ dropsFetched += drops.length;
- setIsLoading(false);
- },
- [pagination],
- );
+ const curFiltered = await handleFiltering(drops);
+ filteredDrops = filteredDrops.concat(curFiltered);
+ }
+
+ // Now, map over the filtered drops and set the data
+ const dropData = await Promise.all(
+ filteredDrops.map(async (drop) => await keypomInstance.getDropData({ drop })),
+ );
+
+ if (filteredDataItems.length === 0) {
+ setFilteredDataItems(dropData);
+ }
+ setCurPage(0);
+ setIsLoading(false);
+ }, [accountId, selectedFilters, keypomInstance]);
+
+ useEffect(() => {
+ async function fetchWallet() {
+ if (!selector) return;
+ try {
+ const wallet = await selector.wallet();
+ setWallet(wallet);
+ } catch (error) {
+ console.error('Error fetching wallet:', error);
+ // Handle the error appropriately
+ }
+ }
+
+ fetchWallet();
+ }, [selector]);
+
+ useEffect(() => {
+ if (!accountId) return;
+
+ // First get enough data with the current filters to fill the page size
+ handleGetInitialDrops();
+ }, [accountId]);
useEffect(() => {
if (!accountId) return;
- // page query param should be indexed from 1
- const pageQuery = searchParams.get('page');
- const currentPageIndex = pageQuery !== null ? parseInt(pageQuery) - 1 : 0;
- setPagination((pagination) => ({ ...pagination, pageIndex: currentPageIndex }));
- handleGetDropsSize();
- handleGetDrops({ start: currentPageIndex * pagination.pageSize });
- }, [accountId, searchParams]);
-
- const dropMenuItems = MENU_ITEMS.map((item) => (
-
- ));
-
- const handleDeleteClick = (dropId) => {
+ // In parallel, fetch all the drops
+ handleGetAllDrops();
+ }, [accountId, selectedFilters]);
+
+ const createDropMenuItems = createMenuItems({
+ menuItems: CREATE_DROP_ITEMS,
+ onClick: (item) => {
+ navigate(item.label.includes('NFT') ? '/drop/nft/new' : '/drop/token/new');
+ },
+ });
+
+ const pageSizeMenuItems = createMenuItems({
+ menuItems: PAGE_SIZE_ITEMS,
+ onClick: (item) => {
+ handlePageSizeSelect(item);
+ },
+ });
+
+ const filterDropMenuItems = createMenuItems({
+ menuItems: DROP_TYPE_ITEMS,
+ onClick: (item) => {
+ handleDropTypeSelect(item);
+ },
+ });
+
+ const filterDataMenuItems = createMenuItems({
+ menuItems: DATE_FILTER_ITEMS,
+ onClick: (item) => {
+ handleDateSelect(item);
+ },
+ });
+
+ const dropStatusMenuItems = createMenuItems({
+ menuItems: DROP_CLAIM_STATUS_ITEMS,
+ onClick: (item) => {
+ handleDropStatusSelect(item);
+ },
+ });
+
+ const handleDeleteClick = (dropId: string | number) => {
setConfirmationModalHelper(setAppModal, async () => {
await keypomInstance.deleteDrops({
wallet,
@@ -240,163 +369,230 @@ export default function AllDrops() {
};
const getTableRows = (): DataItem[] => {
- if (data === undefined || data.length === 0) return [];
-
- return data.reduce((result: DataItem[], drop) => {
- if (drop !== null) {
- // show token drop manager for other drops type
- const dropType =
- (drop.type as string).toUpperCase() === DROP_TYPE.OTHER ? DROP_TYPE.TOKEN : drop.type;
- const dataItem = {
- ...drop,
- name: {drop.name},
- type: (
-
- {drop.type}
-
- ),
- media: drop.media !== undefined && ,
- claimed: {drop.claimed} Claimed,
- action: (
-
- ),
- href: `/drop/${(dropType as string).toLowerCase()}/${drop.id}`,
- };
- return [...result, dataItem];
- }
- return result;
- }, []);
+ if (filteredDataItems === undefined || filteredDataItems.length === 0) return [];
+
+ return filteredDataItems
+ .slice(curPage * selectedFilters.pageSize, (curPage + 1) * selectedFilters.pageSize)
+ .reduce((result: DataItem[], drop) => {
+ if (drop !== null) {
+ // show token drop manager for other drops type
+ const dropType =
+ (drop.type as string).toUpperCase() === DROP_TYPE.OTHER ? DROP_TYPE.TOKEN : drop.type;
+ const dataItem = {
+ ...drop,
+ name: (
+
+ {drop.name}
+
+ ),
+ type: (
+
+ {drop.type}
+
+ ),
+ media: drop.media !== undefined && ,
+ claimed: {drop.claimed} Claimed,
+ action: (
+
+ ),
+ href: `/drop/${(dropType as string).toLowerCase()}/${drop.id}`,
+ };
+ return [...result, dataItem];
+ }
+ return result;
+ }, []);
};
- const createADropPopover = (menuIsOpen: boolean) => ({
- header: 'Click here to create a drop!',
- shouldOpen:
- !isLoading &&
- popoverClicked.current === 0 &&
- !hasPagination &&
- data.length === 0 &&
- !menuIsOpen,
- });
-
- const CreateADropButton = ({ isOpen }: { isOpen: boolean }) => (
-
- }
- variant="secondary-content-box"
- onClick={() => (popoverClicked.current += 1)}
- >
- Create a drop
-
-
- );
- const CreateADropMobileButton = () => (
-
- }
- variant="secondary-content-box"
- onClick={() => {
- popoverClicked.current += 1;
- onOpen();
- }}
- >
- Create a drop
-
-
- );
+ const getTableType = () => {
+ if (filteredDataItems.length === 0 && numOwnedDrops === 0) {
+ return 'all-drops';
+ }
+ return 'no-filtered-drops';
+ };
return (
- {/* Header Bar */}
- {/* Desktop Dropdown Menu */}
-
+ {/* Desktop Menu */}
+
+ {pageTitle}
- All drops
-
- {hasPagination && (
-
+
+
+
+
+
- )}
-
+
+
+ {hasDateFilter && (
+
)}
-
-
- {hasPagination && (
-
- )}
+
+
+
- {/* Mobile Menu Button */}
-
+ {/* Mobile Menu */}
+
All drops
-
-
- {hasPagination && (
-
-
-
-
- )}
+
+
+
-
+
- {/* Mobile Menu For Creating Drop */}
-
-
-
+ (popoverClicked.current += 1)}
+ />
+
+ {/* Mobile Popup Menu For Filtering */}
+
);
}
diff --git a/src/features/all-drops/components/AllEvents.tsx b/src/features/all-drops/components/AllEvents.tsx
new file mode 100644
index 00000000..80dd7bd7
--- /dev/null
+++ b/src/features/all-drops/components/AllEvents.tsx
@@ -0,0 +1,514 @@
+import { useCallback, useEffect, useRef, useState } from 'react';
+import {
+ Input,
+ Hide,
+ InputGroup,
+ InputLeftElement,
+ Icon,
+ Button,
+ Badge,
+ Box,
+ HStack,
+ Menu,
+ MenuList,
+ Show,
+ Text,
+ useDisclosure,
+ Heading,
+ Skeleton,
+ VStack,
+ Image,
+} from '@chakra-ui/react';
+import { SearchIcon } from '@chakra-ui/icons';
+import { useNavigate } from 'react-router-dom';
+import { type Wallet } from '@near-wallet-selector/core';
+
+import keypomInstance from '@/lib/keypom';
+import { PAGE_SIZE_LIMIT } from '@/constants/common';
+import { useAppContext } from '@/contexts/AppContext';
+import { useAuthWalletContext } from '@/contexts/AuthWalletContext';
+import { type ColumnItem, type DataItem } from '@/components/Table/types';
+import { DataTable } from '@/components/Table';
+import { type FunderEventMetadata } from '@/lib/eventsHelpers';
+import { truncateAddress } from '@/utils/truncateAddress';
+import { ShareIcon } from '@/components/Icons/ShareIcon';
+import { DeleteIcon } from '@/components/Icons';
+import useDeletion from '@/components/AppModal/useDeletion';
+import { performDeletionLogic } from '@/components/AppModal/PerformDeletion';
+
+import {
+ DROP_TYPE_OPTIONS,
+ DROP_CLAIM_STATUS_OPTIONS,
+ DATE_FILTER_OPTIONS,
+ PAGE_SIZE_ITEMS,
+ DATE_FILTER_ITEMS,
+ createMenuItems,
+} from '../config/menuItems';
+
+import { DropDownButton } from './DropDownButton';
+import { MobileDrawerMenu } from './MobileDrawerMenu';
+import { DropManagerPagination } from './DropManagerPagination';
+import { FilterOptionsMobileButton } from './FilterOptionsMobileButton';
+
+const COLUMNS: ColumnItem[] = [
+ {
+ id: 'dropName',
+ title: 'Name',
+ selector: (drop) => drop.name,
+ thProps: {
+ minW: '240px',
+ },
+ loadingElement: ,
+ },
+ {
+ id: 'dateCreated',
+ title: 'Date created',
+ selector: (drop) => drop.dateCreated,
+ loadingElement: ,
+ },
+ {
+ id: 'description',
+ title: 'Description',
+ selector: (drop) => drop.description,
+ loadingElement: ,
+ },
+ {
+ id: 'action',
+ title: '',
+ selector: (drop) => drop.action,
+ loadingElement: ,
+ },
+];
+
+interface AllDropsProps {
+ pageTitle: string;
+ hasDateFilter: boolean;
+ ctaButtonLabel: string;
+}
+
+export default function AllEvents({ pageTitle, hasDateFilter, ctaButtonLabel }: AllDropsProps) {
+ const { setAppModal } = useAppContext();
+ const navigate = useNavigate();
+
+ const [numPages, setNumPages] = useState(0);
+ const [curPage, setCurPage] = useState(0);
+
+ const { isOpen, onOpen, onClose } = useDisclosure();
+ const [isLoading, setIsLoading] = useState(true);
+ const popoverClicked = useRef(0);
+
+ const [selectedFilters, setSelectedFilters] = useState<{
+ type: string;
+ search: string;
+ status: string;
+ date: string;
+ pageSize: number;
+ }>({
+ type: DROP_TYPE_OPTIONS.ANY,
+ search: '',
+ date: DATE_FILTER_OPTIONS.ANY,
+ status: DROP_CLAIM_STATUS_OPTIONS.ANY,
+ pageSize: PAGE_SIZE_LIMIT,
+ });
+ const [searchTerm, setSearchTerm] = useState('');
+ const [numOwnedEvents, setNumOwnedEvents] = useState(0);
+ const [filteredDataItems, setFilteredDataItems] = useState([]);
+ const [wallet, setWallet] = useState();
+
+ const { selector, accountId } = useAuthWalletContext();
+
+ const formatDate = (date) => {
+ // Create an instance of Intl.DateTimeFormat for formatting
+ const formatter = new Intl.DateTimeFormat('en-US', {
+ month: 'short', // Full month name.
+ day: 'numeric', // Numeric day of the month.
+ year: 'numeric', // Numeric full year.
+ hour: 'numeric', // Numeric hour.
+ minute: 'numeric', // Numeric minute.
+ hour12: true, // Use 12-hour time.
+ });
+ return formatter.format(date);
+ };
+
+ const handlePageSizeSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ pageSize: parseInt(item.label),
+ }));
+ };
+
+ const handleDateSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ date: item.label,
+ }));
+ };
+
+ const handleSearchChange = (event) => {
+ const { value } = event.target;
+ setSearchTerm(value);
+ };
+
+ const handleNextPage = () => {
+ setCurPage((prev) => prev + 1);
+ };
+
+ const handlePrevPage = () => {
+ setCurPage((prev) => prev - 1);
+ };
+
+ const handleKeyDown = (event) => {
+ if (event.key === 'Enter') {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ search: searchTerm,
+ }));
+ }
+ };
+
+ const handleFiltering = async (events: FunderEventMetadata[]) => {
+ if (selectedFilters.search.trim() !== '') {
+ events = events.filter((event) => {
+ return (
+ event.name.toLowerCase().includes(selectedFilters.search.toLowerCase()) ||
+ event.description.toLowerCase().includes(selectedFilters.search.toLowerCase())
+ );
+ });
+ }
+
+ if (selectedFilters.date !== DATE_FILTER_OPTIONS.ANY) {
+ events = events
+ .filter((event) => {
+ try {
+ const date = new Date(parseInt(event.dateCreated));
+ return date && !isNaN(date.getTime()); // Ensures dateCreated is valid
+ } catch (e) {
+ return false; // Exclude drops with malformed metadata
+ }
+ })
+ .sort((a, b) => {
+ // Assuming metadata has been validated, no need for try-catch here
+ const dateA = new Date(parseInt(a.dateCreated)).getTime();
+ const dateB = new Date(parseInt(b.dateCreated)).getTime();
+ return selectedFilters.date === DATE_FILTER_OPTIONS.NEWEST
+ ? dateB - dateA
+ : dateA - dateB;
+ });
+ }
+
+ return events;
+ };
+
+ const handleGetAllEvents = useCallback(async () => {
+ setIsLoading(true);
+ let eventDrops: FunderEventMetadata[] = [];
+ try {
+ eventDrops = await keypomInstance.getEventsForAccount({
+ accountId: accountId!,
+ });
+ } catch (e) {
+ console.error('Error fetching events:', e);
+ }
+
+ const numEvents = eventDrops.length;
+ setNumOwnedEvents(numEvents);
+
+ const filteredEvents = await handleFiltering(eventDrops);
+ const dropData = filteredEvents.map((event: FunderEventMetadata) => {
+ return {
+ id: event.id,
+ name: truncateAddress(event.name || 'Untitled', 'end', 48),
+ media: event.artwork,
+ dateCreated: formatDate(new Date(parseInt(event.dateCreated))), // Ensure drop has dateCreated or adjust accordingly
+ description: truncateAddress(event.description, 'end', 12),
+ eventId: event.id,
+ };
+ });
+
+ setFilteredDataItems(dropData);
+
+ const totalPages = Math.ceil(filteredEvents.length / selectedFilters.pageSize);
+ setNumPages(totalPages);
+
+ setCurPage(0);
+ setIsLoading(false);
+ }, [accountId, selectedFilters, keypomInstance]);
+
+ useEffect(() => {
+ async function fetchWallet() {
+ if (!selector) return;
+ try {
+ const wallet = await selector.wallet();
+ setWallet(wallet);
+ } catch (error) {
+ console.error('Error fetching wallet:', error);
+ // Handle the error appropriately
+ }
+ }
+
+ fetchWallet();
+ }, [selector]);
+
+ useEffect(() => {
+ if (!accountId) return;
+
+ // In parallel, fetch all the drops
+ handleGetAllEvents();
+ }, [accountId, selectedFilters]);
+
+ const pageSizeMenuItems = createMenuItems({
+ menuItems: PAGE_SIZE_ITEMS,
+ onClick: (item) => {
+ handlePageSizeSelect(item);
+ },
+ });
+
+ const filterDataMenuItems = createMenuItems({
+ menuItems: DATE_FILTER_ITEMS,
+ onClick: (item) => {
+ handleDateSelect(item);
+ },
+ });
+
+ const { openConfirmationModal } = useDeletion({
+ setAppModal,
+ });
+
+ const handleDeleteClick = async (eventId: string) => {
+ if (!wallet || !eventId) return;
+
+ const ticketData = await keypomInstance.getTicketsForEventId({
+ accountId: accountId!,
+ eventId,
+ });
+
+ const deletionArgs = {
+ wallet,
+ accountId,
+ navigate,
+ eventId,
+ ticketData,
+ deleteAll: true,
+ setAppModal,
+ };
+
+ // Open the confirmation modal with customization if needed
+ openConfirmationModal(
+ deletionArgs,
+ 'Are you sure you want to delete this event and all its tickets? This action cannot be undone.',
+ performDeletionLogic,
+ );
+ };
+
+ const getTableRows = (): DataItem[] => {
+ if (filteredDataItems === undefined || filteredDataItems.length === 0) return [];
+
+ const data = filteredDataItems
+ .slice(curPage * selectedFilters.pageSize, (curPage + 1) * selectedFilters.pageSize)
+ .reduce((result: DataItem[], drop) => {
+ if (drop !== null) {
+ // show token drop manager for other drops type
+ const dataItem = {
+ ...drop,
+ name: (
+
+
+
+ {drop.name}
+
+
+ ),
+ type: (
+
+ {drop.type}
+
+ ),
+ dateCreated: drop.dateCreated,
+ numTickets: drop.numTickets,
+ claimed: {drop.claimed} Claimed,
+ action: (
+
+
+
+
+ ),
+ href: `/events/event/${((drop.eventId as string) || '').toString()}`,
+ };
+ return [...result, dataItem];
+ }
+ return result;
+ }, []);
+ return data;
+ };
+
+ const getTableType = () => {
+ if (filteredDataItems.length === 0 && numOwnedEvents === 0) {
+ return 'all-events';
+ }
+ return 'no-filtered-events';
+ };
+
+ return (
+
+ {/* Desktop Menu */}
+
+ {pageTitle}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Mobile Menu */}
+
+
+
+ My Events
+
+
+
+
+
+
+
+
+
+
+
+ (popoverClicked.current += 1)}
+ />
+
+ {/* Mobile Popup Menu For Filtering */}
+
+
+ );
+}
diff --git a/src/features/all-drops/components/DropDownButton.tsx b/src/features/all-drops/components/DropDownButton.tsx
new file mode 100644
index 00000000..8ae5c978
--- /dev/null
+++ b/src/features/all-drops/components/DropDownButton.tsx
@@ -0,0 +1,29 @@
+import { ChevronDownIcon } from '@chakra-ui/icons';
+import { Button, MenuButton } from '@chakra-ui/react';
+
+export const DropDownButton = ({
+ isOpen,
+ placeholder,
+ variant,
+ onClick,
+}: {
+ isOpen: boolean;
+ placeholder: string;
+ variant: 'primary' | 'secondary';
+ onClick: () => void;
+}) => (
+ }
+ variant={variant}
+ onClick={onClick}
+ >
+ {placeholder}
+
+);
diff --git a/src/features/all-drops/components/DropManagerPagination.tsx b/src/features/all-drops/components/DropManagerPagination.tsx
new file mode 100644
index 00000000..42f4381d
--- /dev/null
+++ b/src/features/all-drops/components/DropManagerPagination.tsx
@@ -0,0 +1,88 @@
+import { Box, HStack, Menu, MenuList, Show, Heading, Skeleton } from '@chakra-ui/react';
+import { type ReactElement } from 'react';
+
+import { NextButton, PrevButton } from '@/components/Pagination';
+
+import { DropDownButton } from './DropDownButton';
+
+interface DropManagerPaginationProps {
+ isLoading: boolean;
+ pageSizeMenuItems: ReactElement[];
+ onClickRowsSelect: () => void;
+ rowsSelectPlaceholder: string;
+ curPage: number;
+ numPages: number;
+ handleNextPage: () => void;
+ handlePrevPage: () => void;
+ type?: string;
+}
+
+export const DropManagerPagination = ({
+ isLoading,
+ pageSizeMenuItems,
+ onClickRowsSelect,
+ rowsSelectPlaceholder,
+ curPage,
+ numPages,
+ handleNextPage,
+ handlePrevPage,
+ type = 'Rows',
+}: DropManagerPaginationProps) => {
+ if (isLoading) {
+ // Render Skeleton loaders while content is loading
+ return (
+
+
+
+
+ );
+ }
+ return (
+
+
+
+
+ {type} per page
+
+
+
+
+ {type}
+
+
+
+
+
+
+ {curPage + 1} of {numPages === 0 ? 1 : numPages}
+
+
+
+
+
+ );
+};
diff --git a/src/features/all-drops/components/FilterOptionsMobileButton.tsx b/src/features/all-drops/components/FilterOptionsMobileButton.tsx
new file mode 100644
index 00000000..6d356771
--- /dev/null
+++ b/src/features/all-drops/components/FilterOptionsMobileButton.tsx
@@ -0,0 +1,26 @@
+import { ChevronDownIcon } from '@chakra-ui/icons';
+import { Button } from '@chakra-ui/react';
+
+export const FilterOptionsMobileButton = ({
+ buttonTitle,
+ onOpen,
+ popoverClicked,
+}: {
+ buttonTitle: string;
+ onOpen: () => void;
+ popoverClicked: React.MutableRefObject;
+}) => (
+ }
+ variant="secondary-content-box"
+ onClick={() => {
+ popoverClicked.current += 1;
+ onOpen();
+ }}
+ >
+ {buttonTitle}
+
+);
diff --git a/src/features/all-drops/components/MobileDrawerMenu.tsx b/src/features/all-drops/components/MobileDrawerMenu.tsx
index 8e3f1363..e0226143 100644
--- a/src/features/all-drops/components/MobileDrawerMenu.tsx
+++ b/src/features/all-drops/components/MobileDrawerMenu.tsx
@@ -1,3 +1,4 @@
+import type React from 'react';
import {
Button,
Drawer,
@@ -6,53 +7,84 @@ import {
DrawerContent,
DrawerHeader,
DrawerOverlay,
+ Input,
+ InputGroup,
+ InputLeftElement,
+ Icon,
VStack,
+ Menu,
+ MenuButton,
+ MenuList,
} from '@chakra-ui/react';
+import { SearchIcon } from '@chakra-ui/icons';
-import { MENU_ITEMS } from '../config/menuItems';
+interface FilterConfig {
+ label: string;
+ value: string;
+ menuItems: JSX.Element[];
+}
-export interface MobileDrawerMenuProps {
+interface MobileDrawerMenuProps {
isOpen: boolean;
onClose: () => void;
+ searchTerm?: string;
+ handleSearchChange?: (e: React.ChangeEvent) => void;
+ handleKeyDown?: (event: React.KeyboardEvent) => void;
+ filters: FilterConfig[];
+ title: string;
+ customButton?: React.ReactNode; // Optional custom button
}
-export const MobileDrawerMenu = ({ isOpen, onClose }: MobileDrawerMenuProps) => {
- const getMobileDrawerMenuItems = () =>
- MENU_ITEMS.map((item) => (
-
- ));
+export const MobileDrawerMenu = ({
+ isOpen,
+ onClose,
+ searchTerm,
+ handleSearchChange,
+ handleKeyDown,
+ filters,
+ title,
+ customButton, // Destructure the customButton prop
+}: MobileDrawerMenuProps) => {
return (
- Create a drop
+ {title}
- {getMobileDrawerMenuItems()}
+
+ {searchTerm !== undefined && handleSearchChange && (
+
+
+
+
+
+
+ )}
+ {filters.map((filter) => (
+
+ ))}
+ {/* Optionally render the custom button if provided */}
+ {customButton}
+
diff --git a/src/features/all-drops/config/menuItems.tsx b/src/features/all-drops/config/menuItems.tsx
index 4ee2ce16..1d370c07 100644
--- a/src/features/all-drops/config/menuItems.tsx
+++ b/src/features/all-drops/config/menuItems.tsx
@@ -1,17 +1,57 @@
-import { LinkIcon, NFTIcon } from '@/components/Icons';
+import { MenuItem } from '@chakra-ui/react';
+
+import { LinkIcon, NFTIcon, TicketIcon, CheckedIcon } from '@/components/Icons';
import { type MenuItemProps } from '@/components/Menu';
+import { FilterIcon } from '@/components/Icons/FilterIcon';
+
+export const DROP_TYPE_OPTIONS = {
+ ANY: 'Any',
+ TOKEN: 'Token',
+ NFT: 'NFT',
+ EVENT: 'Event',
+};
+
+export const DROP_CLAIM_STATUS_OPTIONS = {
+ ANY: 'Any',
+ FULLY: 'Fully',
+ PARTIALLY: 'Partially',
+ UNCLAIMED: 'Unclaimed',
+};
+
+export const KEY_CLAIM_STATUS_OPTIONS = {
+ ANY: 'Any',
+ CLAIMED: 'Claimed',
+ UNCLAIMED: 'Unclaimed',
+};
+
+export const TICKET_CLAIM_STATUS_OPTIONS = {
+ ANY: 'Any',
+ PURCHASED: 'Purchased',
+ SCANNED: 'Scanned',
+};
+
+export const DATE_FILTER_OPTIONS = {
+ ANY: 'Any',
+ NEWEST: 'Newest',
+ OLDEST: 'Oldest',
+};
-export const MENU_ITEMS: MenuItemProps[] = [
+export const createMenuItems = ({ menuItems, onClick }) => {
+ return menuItems.map((item) => (
+
+ ));
+};
+export const CREATE_DROP_ITEMS: MenuItemProps[] = [
{
label: 'Token Drop',
as: 'a',
- href: '/drop/token/new',
icon: ,
},
{
label: 'NFT Drop',
as: 'a',
- href: '/drop/nft/new',
icon: ,
},
// {
@@ -21,3 +61,165 @@ export const MENU_ITEMS: MenuItemProps[] = [
// icon: ,
// },
];
+
+export const DATE_FILTER_ITEMS: MenuItemProps[] = [
+ {
+ label: 'Any',
+ icon: ,
+ },
+ {
+ label: 'Newest',
+ icon: ,
+ },
+ {
+ label: 'Oldest',
+ icon: ,
+ },
+];
+
+export const DROP_TYPE_ITEMS: MenuItemProps[] = [
+ {
+ label: 'Any',
+ icon: ,
+ },
+ {
+ label: 'Token',
+ icon: ,
+ },
+ {
+ label: 'NFT',
+ icon: ,
+ },
+ {
+ label: 'Event',
+ icon: ,
+ },
+];
+
+export const GALLERY_PRICE_ITEMS: MenuItemProps[] = [
+ {
+ label: 'Any',
+ },
+ {
+ label: '<20',
+ },
+ {
+ label: '20-50',
+ },
+ {
+ label: '50-100',
+ },
+ {
+ label: '100+',
+ },
+];
+
+export const DROP_CLAIM_STATUS_ITEMS: MenuItemProps[] = [
+ {
+ label: 'Any',
+ icon: ,
+ },
+ {
+ label: 'Fully',
+ color: 'green.600',
+ },
+ {
+ label: 'Partially',
+ color: 'yellow.600',
+ },
+ {
+ label: 'Unclaimed',
+ color: 'gray.600',
+ },
+];
+
+export const KEY_CLAIM_STATUS_ITEMS: MenuItemProps[] = [
+ {
+ label: 'Any',
+ icon: ,
+ },
+ {
+ label: 'Claimed',
+ color: 'green.600',
+ },
+ {
+ label: 'Unclaimed',
+ color: 'gray.600',
+ },
+];
+
+export const TICKET_CLAIM_STATUS_ITEMS: MenuItemProps[] = [
+ {
+ label: 'Any',
+ icon: ,
+ },
+ {
+ label: 'Purchased',
+ color: 'gray.600',
+ },
+ {
+ label: 'Scanned',
+ color: 'green.600',
+ },
+];
+
+export const PAGE_SIZE_ITEMS: MenuItemProps[] = [
+ {
+ label: '5',
+ color: 'gray.600',
+ },
+ {
+ label: '10',
+ color: 'gray.600',
+ },
+ {
+ label: '15',
+ color: 'gray.600',
+ },
+ {
+ label: '20',
+ color: 'gray.600',
+ },
+ {
+ label: '50',
+ color: 'gray.600',
+ },
+];
+
+export const GALLERY_PAGE_SIZE_ITEMS: MenuItemProps[] = [
+ {
+ label: '6',
+ color: 'gray.600',
+ },
+ {
+ label: '12',
+ color: 'gray.600',
+ },
+ {
+ label: '18',
+ color: 'gray.600',
+ },
+ {
+ label: '24',
+ color: 'gray.600',
+ },
+ {
+ label: '60',
+ color: 'gray.600',
+ },
+];
+
+export const SORT_MENU_ITEMS: MenuItemProps[] = [
+ {
+ label: 'no sort',
+ // color: 'gray.600',
+ },
+ {
+ label: 'ascending',
+ // color: 'gray.600',
+ },
+ {
+ label: 'descending',
+ // color: 'gray.600',
+ },
+];
diff --git a/src/features/all-drops/routes/AllDropsPage.tsx b/src/features/all-drops/routes/AllDropsPage.tsx
index 06bd3b54..3af90dcf 100644
--- a/src/features/all-drops/routes/AllDropsPage.tsx
+++ b/src/features/all-drops/routes/AllDropsPage.tsx
@@ -5,7 +5,7 @@ import AllDrops from '../components/AllDrops';
export default function AllDropsPage() {
return (
-
+
);
}
diff --git a/src/features/all-drops/routes/AllEventsPage.tsx b/src/features/all-drops/routes/AllEventsPage.tsx
new file mode 100644
index 00000000..2df73e55
--- /dev/null
+++ b/src/features/all-drops/routes/AllEventsPage.tsx
@@ -0,0 +1,11 @@
+import { Box } from '@chakra-ui/react';
+
+import AllEvents from '../components/AllEvents';
+
+export default function AllEventsPage() {
+ return (
+
+
+
+ );
+}
diff --git a/src/features/claim/components/TokenNFTClaim.tsx b/src/features/claim/components/TokenNFTClaim.tsx
index 115ff9fe..0cb035a7 100644
--- a/src/features/claim/components/TokenNFTClaim.tsx
+++ b/src/features/claim/components/TokenNFTClaim.tsx
@@ -108,7 +108,6 @@ export const TokenNFTClaim = ({
label: 'Ok',
func: () => {
setAppModal({ isOpen: false });
- console.log('tx acknowledged');
},
},
],
diff --git a/src/features/claim/components/ticket/QrDetails.tsx b/src/features/claim/components/ticket/QrDetails.tsx
index 97dcf435..9c5e3715 100644
--- a/src/features/claim/components/ticket/QrDetails.tsx
+++ b/src/features/claim/components/ticket/QrDetails.tsx
@@ -1,12 +1,28 @@
-import { Box, Button, Flex, Text } from '@chakra-ui/react';
+import { Box, Button, Flex, Heading, Text, VStack } from '@chakra-ui/react';
import QRCode from 'react-qr-code';
+import { useNavigate } from 'react-router-dom';
+
+import { type TicketMetadataExtra } from '@/lib/eventsHelpers';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
interface QrDetailsProps {
qrValue: string;
ticketName: string;
+ eventName: string;
+ eventId: string;
+ funderId: string;
+ ticketInfoExtra?: TicketMetadataExtra;
}
-export const QrDetails = ({ qrValue, ticketName }: QrDetailsProps) => {
+export const QrDetails = ({
+ qrValue,
+ ticketName,
+ eventName,
+ eventId,
+ funderId,
+ ticketInfoExtra,
+}: QrDetailsProps) => {
+ const navigate = useNavigate();
const handleDownloadQrCode = () => {
const svg = document.getElementById('QRCode');
@@ -50,21 +66,40 @@ export const QrDetails = ({ qrValue, ticketName }: QrDetailsProps) => {
>
-
- {ticketName}
+
+ {eventName}
-
+
+
Save this QR code and show it at the event to gain entry.
-
+
+
+
+
+
+ Can be sold through:
+
+
+ {ticketInfoExtra && dateAndTimeToText(ticketInfoExtra?.salesValidThrough)}
+
+
+
);
};
diff --git a/src/features/claim/components/ticket/TicketQRPage.tsx b/src/features/claim/components/ticket/TicketQRPage.tsx
deleted file mode 100644
index c49e0601..00000000
--- a/src/features/claim/components/ticket/TicketQRPage.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import { Box, Button, Center, Flex, Heading, Hide, Text, VStack } from '@chakra-ui/react';
-import { useEffect, useState } from 'react';
-import { getKeyInformation } from 'keypom-js';
-
-import { IconBox } from '@/components/IconBox';
-import { TicketIcon } from '@/components/Icons';
-import { ErrorBox } from '@/components/ErrorBox';
-import { useTicketClaim } from '@/features/claim/contexts/TicketClaimContext';
-import { useClaimParams } from '@/hooks/useClaimParams';
-import { BoxWithShape } from '@/components/BoxWithShape';
-import { QrDetails } from '@/features/claim/components/ticket/QrDetails';
-import { DROP_TYPE } from '@/constants/common';
-import { DropClaimMetadata } from '@/features/claim/components/DropClaimMetadata';
-import { AvatarImage } from '@/components/AvatarImage';
-import { DropBox } from '@/components/DropBox';
-
-export const TicketQRPage = () => {
- const { secretKey } = useClaimParams();
- const [claimAttempted, setClaimAttempted] = useState(false);
- const { handleClaim, qrValue, claimError, getDropMetadata } = useTicketClaim();
- const [isShowSummary, setShowSummary] = useState(false);
-
- const { giftType, title, tokens, nftImage } = getDropMetadata();
-
- const checkClaim = async () => {
- const keyInfo = await getKeyInformation({ secretKey });
- console.log('claiming', claimAttempted, keyInfo.cur_key_use);
- if (!claimAttempted && keyInfo.cur_key_use === 1) {
- // do not await since it will only prevent user from seeing QR code, we can always show error after
- await handleClaim();
- }
- setClaimAttempted(true);
- };
-
- useEffect(() => {
- checkClaim();
- }, []);
-
- if (claimError) {
- return ;
- }
-
- return (
-
-
-
- {isShowSummary ? 'Your ticket' : 'Claim your ticket'}
-
-
- }
- maxW={{ base: '345px', md: '30rem' }}
- minW={{ base: 'inherit', md: '345px' }}
- p="0"
- pb="0"
- >
- {isShowSummary ? (
-
-
-
-
-
-
- Attendance gifts
-
-
- {giftType === DROP_TYPE.NFT ? (
- <>
-
-
-
- {title}
-
-
- >
- ) : (
-
- {tokens.map(({ icon, value, symbol }, index) => (
-
- ))}
-
- )}
-
-
- Return here after checking into the event to claim.
-
-
-
- ) : (
-
-
-
-
- )}
-
-
-
- );
-};
diff --git a/src/features/claim/contexts/TicketClaimContext.tsx b/src/features/claim/contexts/TicketClaimContext.tsx
deleted file mode 100644
index 8f3ac366..00000000
--- a/src/features/claim/contexts/TicketClaimContext.tsx
+++ /dev/null
@@ -1,204 +0,0 @@
-import {
- createContext,
- type PropsWithChildren,
- useContext,
- useState,
- useEffect,
- lazy,
-} from 'react';
-import { useNavigate } from 'react-router-dom';
-
-import keypomInstance from '@/lib/keypom';
-import { useClaimParams } from '@/hooks/useClaimParams';
-import { DROP_TYPE, type DROP_TYPES } from '@/constants/common';
-import getConfig from '@/config/config';
-import { type TokenAsset } from '@/types/common';
-
-const TicketQRPage = lazy(
- async () =>
- await import('@/features/claim/components/ticket/TicketQRPage').then((mod) => ({
- default: mod.TicketQRPage,
- })),
-);
-
-const TicketGiftPage = lazy(
- async () => await import('@/features/claim/components/ticket/TicketGiftPage'),
-);
-
-const TICKET_FLOW_KEY_USE = {
- 1: TicketQRPage,
- 2: TicketQRPage,
- 3: TicketGiftPage,
-};
-
-export interface TicketClaimContextTypes {
- getDropMetadata: () => {
- title: string;
- description: string;
- nftImage: string;
- tokens: TokenAsset[];
- giftType: DROP_TYPES;
- wallets: string[];
- };
- currentPage: (() => JSX.Element | null) | undefined;
- qrValue: string;
- handleClaim: () => Promise;
- isClaimInfoLoading: boolean;
- claimInfoError: string | null;
- claimError: string | null;
-}
-
-const TicketClaimContext = createContext(null);
-// TODO: check if drop has been claimed
-/**
- *
- * Context to manage whole ticket claim flow for each key uses
- */
-export const TicketClaimContextProvider = ({ children }: PropsWithChildren) => {
- const navigate = useNavigate();
- const { secretKey, contractId } = useClaimParams();
-
- // Drop metadata
- const [title, setTitle] = useState('');
- const [description, setDescription] = useState('');
- const [nftImage, setNftImage] = useState('');
- const [wallets, setWallets] = useState([getConfig().defaultWallet.name]);
-
- // QR code
- const [qrValue, setQrValue] = useState('');
-
- // Claim info states
- const [currentPage, setCurrentPage] = useState<() => JSX.Element | null>();
- const [isClaimInfoLoading, setIsLoading] = useState(true);
- const [claimInfoError, setClaimInfoError] = useState(null);
- const [claimError, setClaimError] = useState(null);
-
- const [currentKeyUse, setCurrentKeyUse] = useState(null);
- const [tokens, setTokens] = useState([]);
- const [giftType, setGiftType] = useState(DROP_TYPE.NFT);
-
- const loadTokenClaimInfo = async () => {
- try {
- const { ftMetadata, amountNEAR, amountTokens } =
- await keypomInstance.getTokenClaimInformation(contractId, secretKey);
- const tokens: TokenAsset[] = [
- {
- icon: 'https://cryptologos.cc/logos/near-protocol-near-logo.svg?v=024',
- value: amountNEAR || '0',
- symbol: 'NEAR',
- },
- ];
- setTokens({
- ...tokens,
- ...(ftMetadata
- ? {
- icon: ftMetadata.icon as string,
- value: amountTokens ?? '0',
- symbol: ftMetadata.symbol,
- }
- : {}),
- });
- setGiftType(DROP_TYPE.TOKEN);
- } catch (err) {
- setClaimInfoError(err.message);
- }
- };
-
- const loadNFTClaimInfo = async () => {
- const claimInfo = await keypomInstance.getTicketNftInformation(contractId, secretKey);
-
- setTitle(claimInfo.title);
- setDescription(claimInfo.description);
- setNftImage(claimInfo.media);
- setQrValue(JSON.stringify({ contractId, secretKey }));
- setWallets(claimInfo.wallets);
- };
-
- const loadTicketClaimInfo = async () => {
- // determine if ticket has NFT series else defer to show token as reward
- setIsLoading(true);
-
- try {
- await loadNFTClaimInfo();
- } catch (err) {
- if (err.message === 'NFT series not found') {
- // show tokens instead
- await loadTokenClaimInfo();
- } else {
- console.error(err.message);
- setClaimInfoError(err.message);
- }
- }
-
- setIsLoading(false);
- };
-
- const showCurrentPage = async () => {
- if (claimInfoError) {
- // if key has been deleted or has errors, we show the error in main page
- return;
- }
-
- const _currentKeyUse = await keypomInstance.getCurrentKeyUse(contractId, secretKey);
- setCurrentPage(TICKET_FLOW_KEY_USE[_currentKeyUse]);
- setCurrentKeyUse(_currentKeyUse);
- };
-
- useEffect(() => {
- if (secretKey === '' || contractId === '') {
- navigate('/');
- }
- // eslint-disable-next-line
- loadTicketClaimInfo().then(async () => {
- await showCurrentPage();
- });
- }, []);
-
- const getDropMetadata = () => {
- return {
- title,
- description,
- nftImage,
- tokens,
- giftType,
- wallets,
- };
- };
-
- const handleClaim = async () => {
- // Only allow claiming when there are 3 remaining uses
- if (currentKeyUse === 1) {
- try {
- await keypomInstance.claim(secretKey, 'foo', true);
- } catch (err) {
- setClaimError(err);
- }
- }
- };
-
- return (
-
- {children}
-
- );
-};
-
-export const useTicketClaim = (): TicketClaimContextTypes => {
- const context = useContext(TicketClaimContext);
-
- if (context === null) {
- throw new Error('useTicketClaim must be used within a TicketClaimContextProvider');
- }
-
- return context;
-};
diff --git a/src/features/claim/routes/ClaimRouter.tsx b/src/features/claim/routes/ClaimRouter.tsx
index 1843b731..2b0b5b1f 100644
--- a/src/features/claim/routes/ClaimRouter.tsx
+++ b/src/features/claim/routes/ClaimRouter.tsx
@@ -33,9 +33,6 @@ const ClaimPage = () => {
case DROP_TYPE.NFT:
navigate(`/claim/nft/${contractId}?${searchParamsStr}#${secretKey}`);
break;
- case DROP_TYPE.TRIAL:
- navigate(`/claim/trial/${contractId}?${searchParamsStr}#${secretKey}`);
- break;
default:
throw new Error('This linkdrop is unsupported.');
}
diff --git a/src/features/claim/routes/TicketClaimPage.tsx b/src/features/claim/routes/TicketClaimPage.tsx
deleted file mode 100644
index b4e0e988..00000000
--- a/src/features/claim/routes/TicketClaimPage.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { Box, Center, Spinner } from '@chakra-ui/react';
-
-import { ErrorBox } from '@/components/ErrorBox';
-import {
- TicketClaimContextProvider,
- useTicketClaim,
-} from '@/features/claim/contexts/TicketClaimContext';
-
-/**
- *
- * High level Ticket Claim page to handle all key uses
- * - Handles claim info loading and error
- * - Renders the page for the key use
- */
-
-const TicketClaimPage = () => {
- const { claimInfoError, isClaimInfoLoading, currentPage: PageComponent } = useTicketClaim();
-
- if (isClaimInfoLoading) {
- return (
-
-
-
- );
- }
-
- if (claimInfoError) {
- return ;
- }
-
- return (
-
- {/* render ticket page according to key use */}
- {PageComponent && }
-
- );
-};
-
-const WrappedTicketClaimPage = () => {
- return (
-
-
-
- );
-};
-
-export default WrappedTicketClaimPage;
diff --git a/src/features/claim/routes/TrialClaimPage.tsx b/src/features/claim/routes/TrialClaimPage.tsx
index 0cd267a9..31d8ac50 100644
--- a/src/features/claim/routes/TrialClaimPage.tsx
+++ b/src/features/claim/routes/TrialClaimPage.tsx
@@ -1,4 +1,4 @@
-import { Box, Button, Center, Heading, useBoolean, VStack } from '@chakra-ui/react';
+import { Box, Button, Center, Heading, VStack } from '@chakra-ui/react';
import { useNavigate, useSearchParams } from 'react-router-dom';
import { useEffect, useState } from 'react';
import { claimTrialAccountDrop, accountExists } from 'keypom-js';
@@ -24,7 +24,6 @@ const TrialClaimPage = () => {
const navigate = useNavigate();
const { contractId, secretKey } = useClaimParams();
const { setAppModal } = useAppContext();
- const [showInputWallet] = useBoolean(false);
const [tokens] = useState([]);
const [isClaimSuccessful, setIsClaimSuccessful] = useState(false);
const [isClaimLoading, setIsClaimLoading] = useState(false);
@@ -44,7 +43,8 @@ const TrialClaimPage = () => {
try {
await keypomInstance.getTokenClaimInformation(contractId, secretKey);
} catch (e) {
- console.log(e);
+ // eslint-disable-next-line no-console
+ console.error(e);
// `no drop ID for PK` is error we should pass through to the redirect URL
setClaimError('No drop for this link!');
}
@@ -217,7 +217,9 @@ const TrialClaimPage = () => {
label={`Your Account Name`}
message={`Create Your Account`}
noBackIcon={true}
- onBack={showInputWallet.off}
+ onBack={() => {
+ console.log(false);
+ }}
/>
diff --git a/src/features/create-drop/components/CreateTicketDropLayout.tsx b/src/features/create-drop/components/CreateTicketDropLayout.tsx
new file mode 100644
index 00000000..53d57da6
--- /dev/null
+++ b/src/features/create-drop/components/CreateTicketDropLayout.tsx
@@ -0,0 +1,29 @@
+// Generic layout for all drop
+
+import { Box, Heading } from '@chakra-ui/react';
+
+import { Breadcrumbs, type IBreadcrumbItem } from '@/components/Breadcrumbs';
+
+export const CreateTicketDropLayout = ({
+ breadcrumbs,
+ description,
+ children,
+}: {
+ breadcrumbs: IBreadcrumbItem[];
+ description: string;
+ children: React.ReactNode;
+}) => {
+ return (
+
+
+
+
+ {description}
+
+
+
+ {children}
+
+
+ );
+};
diff --git a/src/features/create-drop/components/nft/CreateNftDropSummary.tsx b/src/features/create-drop/components/nft/CreateNftDropSummary.tsx
index 7f9cd56b..52c4b48e 100644
--- a/src/features/create-drop/components/nft/CreateNftDropSummary.tsx
+++ b/src/features/create-drop/components/nft/CreateNftDropSummary.tsx
@@ -21,10 +21,10 @@ export const CreateNftDropSummary = () => {
{
- handleDropConfirmation(paymentData);
+ handleDropConfirmation(paymentData!);
}}
/>
);
diff --git a/src/features/create-drop/components/ticket/AcceptPaymentForm.tsx b/src/features/create-drop/components/ticket/AcceptPaymentForm.tsx
new file mode 100644
index 00000000..f61327e1
--- /dev/null
+++ b/src/features/create-drop/components/ticket/AcceptPaymentForm.tsx
@@ -0,0 +1,231 @@
+import {
+ HStack,
+ Image,
+ Heading,
+ VStack,
+ Divider,
+ Button,
+ useToast,
+ Box,
+ Text,
+ Flex,
+ Hide,
+} from '@chakra-ui/react';
+import { useEffect, useState } from 'react';
+
+import { EVENTS_WORKER_BASE } from '@/constants/common';
+import keypomInstance from '@/lib/keypom';
+import { useAppContext } from '@/contexts/AppContext';
+import ToggleSwitch from '@/components/ToggleSwitch/ToggleSwitch';
+
+import { type EventStepFormProps } from '../../routes/CreateTicketDropPage';
+
+const purchaseWithStripe = new URL(
+ '../../../../../public/assets/purchase_with_stripe.webp',
+ import.meta.url,
+);
+
+const STRIPE_PURCHASE_IMAGE = purchaseWithStripe.href.replace(purchaseWithStripe.search, '');
+
+function uuidv4() {
+ return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (c) =>
+ (+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16),
+ );
+}
+
+const AcceptPaymentForm = (props: EventStepFormProps) => {
+ const { accountId, formData, setFormData } = props;
+ const toast = useToast();
+ const { fetchAttempts, nearPrice, setTriggerPriceFetch } = useAppContext();
+
+ const handleToggle = (isStripe) => {
+ let curVal = isStripe ? formData.acceptStripePayments : formData.acceptNearPayments;
+ curVal = !curVal;
+
+ if (isStripe) {
+ setFormData({ ...formData, acceptStripePayments: curVal });
+ } else {
+ setFormData({ ...formData, acceptNearPayments: curVal });
+ }
+ };
+
+ const [isLoading, setIsLoading] = useState(false);
+
+ const checkForPriorStripeConnected = () => {
+ const stripeAccountId = localStorage.getItem('STRIPE_ACCOUNT_ID');
+ if (stripeAccountId) {
+ setFormData({ ...formData, stripeAccountId, acceptStripePayments: false });
+ }
+
+ return stripeAccountId;
+ };
+
+ useEffect(() => {
+ const body = localStorage.getItem('STRIPE_ACCOUNT_INFO');
+ if (body) {
+ const { stripeAccountId, uuid } = JSON.parse(body);
+ if (window.location.href.includes(`successMessage=${uuid as string}`)) {
+ localStorage.removeItem('STRIPE_ACCOUNT_INFO');
+
+ localStorage.setItem('STRIPE_ACCOUNT_ID', stripeAccountId);
+ setFormData({ ...formData, stripeAccountId, acceptStripePayments: true });
+ }
+ }
+ }, []);
+
+ useEffect(() => {
+ checkForPriorStripeConnected();
+ }, []);
+
+ useEffect(() => {
+ if (!nearPrice) {
+ setTriggerPriceFetch(true);
+ } else {
+ setFormData({ ...formData, nearPrice });
+ }
+ }, [nearPrice, fetchAttempts]);
+
+ const handleConnectStripe = async () => {
+ if (!formData.nearPrice) {
+ toast({
+ title: 'Unable to fetch NEAR price',
+ description: `Please try again later or contact support.`,
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ }
+ if (checkForPriorStripeConnected()) {
+ return;
+ }
+
+ setIsLoading(true);
+ const stripeAccountId = await keypomInstance.getStripeAccountId(accountId || '');
+
+ if (stripeAccountId) {
+ setFormData({ ...formData, stripeAccountId, acceptStripePayments: true });
+ setIsLoading(false);
+ return;
+ }
+
+ let response: Response | undefined;
+ const uuid = uuidv4();
+ try {
+ const body = {
+ accountId,
+ redirectUrl: `${window.location.origin}/drop/ticket/new?successMessage=${uuid}`,
+ };
+
+ const url = `${EVENTS_WORKER_BASE}/stripe/create-account`;
+ response = await fetch(url, {
+ method: 'POST',
+ body: JSON.stringify(body),
+ });
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.error('Error connecting to stripe: ', error);
+ }
+
+ if (response?.ok) {
+ const resBody = await response.json();
+ const { accountLinkUrl, stripeAccountId } = resBody;
+
+ localStorage.setItem('STRIPE_ACCOUNT_INFO', JSON.stringify({ stripeAccountId, uuid }));
+ window.location.href = accountLinkUrl;
+ } else {
+ toast({
+ title: 'Unable to Create Stripe Account',
+ description: `Please try again later or contact support.`,
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ }
+ };
+
+ return (
+
+
+
+ Payment Options
+
+
+ Select your preferred methods for payment processing.
+
+
+
+
+ $NEAR Checkout
+
+
+ Allow ticket purchases with $NEAR.
+
+
+
+
+ NEAR Payments
+
+ {
+ handleToggle(false);
+ }}
+ size="lg"
+ toggle={formData.acceptNearPayments}
+ />
+
+
+
+
+ Stripe Checkout
+
+
+ Allow ticket purchases with credit cards.
+
+
+
+
+ Stripe Payments
+
+ {
+ handleToggle(true);
+ }}
+ size="lg"
+ toggle={formData.acceptStripePayments}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export { AcceptPaymentForm };
diff --git a/src/features/create-drop/components/ticket/AdditionalGiftsForm/AdditionalGiftsForm.tsx b/src/features/create-drop/components/ticket/AdditionalGiftsForm/AdditionalGiftsForm.tsx
deleted file mode 100644
index c4a4356f..00000000
--- a/src/features/create-drop/components/ticket/AdditionalGiftsForm/AdditionalGiftsForm.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import { Box, TabPanel, TabPanels } from '@chakra-ui/react';
-import { useFormContext } from 'react-hook-form';
-import { useEffect } from 'react';
-
-import { RoundedTabs, type TabListItem } from '@/components/RoundedTabs';
-import { POAPNftIcon } from '@/components/Icons';
-import { type CreateTicketFieldsSchema } from '@/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext';
-
-import { POAPNftForm } from './POAPNftForm';
-
-interface AdditionalGiftTabItem extends TabListItem {
- name: 'token' | 'poapNft';
-}
-
-const TAB_LIST: AdditionalGiftTabItem[] = [
- /** token is commented in case there's a need for it in the future */
- // {
- // name: 'token',
- // label: 'Token',
- // icon: ,
- // },
- {
- name: 'poapNft',
- label: 'POAP NFT',
- icon: ,
- },
-];
-
-export const AdditionalGiftsForm = () => {
- const { setValue, formState, resetField } = useFormContext();
- const { dirtyFields } = formState;
-
- useEffect(() => {
- if (dirtyFields.additionalGift?.poapNft !== null) {
- setValue('additionalGift.type', 'poapNft', { shouldValidate: true });
- } else if (dirtyFields.additionalGift?.token !== null) {
- setValue('additionalGift.type', 'token', { shouldValidate: true });
- } else {
- setValue('additionalGift.type', 'none', { shouldValidate: true });
- }
- }, [dirtyFields?.additionalGift, setValue]);
-
- const handleChange = () => {
- resetField('additionalGift');
- };
-
- return (
-
-
-
- {/*
-
- */}
-
-
-
-
-
-
- );
-};
diff --git a/src/features/create-drop/components/ticket/AdditionalGiftsForm/POAPNftForm.tsx b/src/features/create-drop/components/ticket/AdditionalGiftsForm/POAPNftForm.tsx
deleted file mode 100644
index fec0a0e6..00000000
--- a/src/features/create-drop/components/ticket/AdditionalGiftsForm/POAPNftForm.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { VStack } from '@chakra-ui/react';
-import { Controller, useFormContext } from 'react-hook-form';
-
-import { ArtworkInput } from '@/features/create-drop/components/Fields/ArtworkInput';
-import { TextInput } from '@/components/TextInput';
-import { TextAreaInput } from '@/components/TextAreaInput';
-import { type CreateTicketFieldsSchema } from '@/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext';
-
-export const POAPNftForm = () => {
- const { control } = useFormContext();
-
- return (
-
- (
-
- )}
- />
- (
-
- )}
- />
-
-
- );
-};
diff --git a/src/features/create-drop/components/ticket/AdditionalGiftsForm/TokenForm.tsx b/src/features/create-drop/components/ticket/AdditionalGiftsForm/TokenForm.tsx
deleted file mode 100644
index baad73e3..00000000
--- a/src/features/create-drop/components/ticket/AdditionalGiftsForm/TokenForm.tsx
+++ /dev/null
@@ -1,97 +0,0 @@
-import { useMemo } from 'react';
-import { Controller, useFormContext } from 'react-hook-form';
-import { evaluate, format } from 'mathjs';
-import { formatNearAmount } from 'keypom-js';
-
-import { FormControl } from '@/components/FormControl';
-import { TokenInput } from '@/components/TokenInputMenu';
-import { type CreateTicketFieldsSchema } from '@/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext';
-import { useAuthWalletContext } from '@/contexts/AuthWalletContext';
-import { type IToken } from '@/types/common';
-
-export const TokenForm = () => {
- const {
- setValue,
- trigger,
- control,
- watch,
- formState: { errors },
- } = useFormContext();
- const { account } = useAuthWalletContext();
-
- const selectedTokenError = errors?.additionalGift?.token?.selectedToken;
-
- const WALLET_TOKENS: IToken[] = account
- ? [
- {
- amount: formatNearAmount(account.amount, 4),
- symbol: 'NEAR',
- },
- ]
- : [];
-
- const [selectedToken, amountPerLink, totalTickets] = watch([
- 'additionalGift.token.selectedToken',
- 'additionalGift.token.amountPerLink',
- 'totalTickets',
- ]);
- const totalCost = useMemo(() => {
- if (totalTickets && amountPerLink !== undefined) {
- return format(evaluate(`${totalTickets} * ${amountPerLink as number}`), {
- precision: 14,
- });
- }
- return 0;
- }, [amountPerLink, totalTickets]);
-
- const handleTokenChange = (tokenSymbol: string) => {
- const foundWallet = WALLET_TOKENS.find((token) => token.symbol === tokenSymbol);
-
- if (!foundWallet) {
- return;
- }
-
- setValue(
- 'additionalGift.token.selectedToken',
- { symbol: foundWallet.symbol, amount: foundWallet.amount },
- { shouldDirty: true, shouldValidate: true },
- );
- };
-
- return (
- (
-
- {
- if (e.target.value.length > e.target.maxLength)
- e.target.value = e.target.value.slice(0, e.target.maxLength);
- field.onChange(parseFloat(e.target.value));
- void trigger(); // errors not getting updated if its not manually validated
- }}
- >
-
-
-
-
- )}
- />
- );
-};
diff --git a/src/features/create-drop/components/ticket/CollectInfoForm.tsx b/src/features/create-drop/components/ticket/CollectInfoForm.tsx
new file mode 100644
index 00000000..26fc4043
--- /dev/null
+++ b/src/features/create-drop/components/ticket/CollectInfoForm.tsx
@@ -0,0 +1,186 @@
+import { Button, HStack, Skeleton, Text, VStack } from '@chakra-ui/react';
+import { useMemo, useState } from 'react';
+import { EditIcon } from '@chakra-ui/icons';
+
+import { FormControlComponent } from '@/components/FormControl';
+import { type ColumnItem } from '@/components/Table/types';
+import { DeleteIcon } from '@/components/Icons';
+import { DataTable } from '@/components/Table';
+import ToggleSwitch from '@/components/ToggleSwitch/ToggleSwitch';
+
+import {
+ type TicketDropFormData,
+ type EventStepFormProps,
+} from '../../routes/CreateTicketDropPage';
+
+import { ModifyQuestionModal } from './ModifyQuestionModal';
+import { EMAIL_QUESTION } from './helpers';
+
+const columns: ColumnItem[] = [
+ {
+ id: 'question',
+ title: 'Question',
+ selector: (row) => row.id,
+ loadingElement: ,
+ },
+ {
+ id: 'isRequired',
+ title: 'Is required?',
+ selector: (row) => row.isRequired,
+ loadingElement: ,
+ },
+ {
+ id: 'action',
+ title: '',
+ selector: (row) => row.action,
+ loadingElement: ,
+ },
+];
+
+export const CollectInfoFormValidation = (formData: TicketDropFormData) => {
+ const newFormData = { ...formData };
+ const isErr = false;
+
+ return { isErr, newFormData };
+};
+
+const CollectInfoForm = (props: EventStepFormProps) => {
+ const { formData, setFormData } = props;
+ const [isModalOpen, setIsModalOpen] = useState(false);
+ const [userInput, setUserInput] = useState('');
+ const [originalQuestion, setOriginalQuestion] = useState();
+
+ const handleDeleteClick = (id) => {
+ const newQuestions = formData.questions.filter((item) => item.question !== id);
+ setFormData({ ...formData, questions: newQuestions });
+ };
+
+ const handleToggle = (id) => {
+ const newQuestions = formData.questions.map((item) => {
+ if (item.question === id) {
+ return { ...item, isRequired: !item.isRequired };
+ }
+ return item;
+ });
+ setFormData({ ...formData, questions: newQuestions });
+ };
+
+ const handleModalClose = (shouldAdd, originalQuestion) => {
+ if (shouldAdd) {
+ let newQuestions = formData.questions;
+ if (originalQuestion) {
+ newQuestions = newQuestions.map((item) => {
+ if (item.question === originalQuestion) {
+ return { ...item, question: userInput, isRequired: item.isRequired };
+ }
+ return item;
+ });
+ } else {
+ newQuestions.push({ question: userInput, isRequired: false });
+ }
+
+ setFormData({ ...formData, questions: newQuestions });
+ }
+
+ setIsModalOpen(false);
+ };
+
+ const getTableRows = (data, handleToggle, handleDeleteClick) => {
+ if (data === undefined) return [];
+
+ return data.map((item: { question: string; isRequired: boolean }) => ({
+ id: item.question === EMAIL_QUESTION ? `${EMAIL_QUESTION} (required)` : item.question, // Assuming `item` has a `question` property that can serve as `id`
+ isRequired: (
+ handleToggle(item.question)}
+ toggle={item.isRequired}
+ />
+ ),
+ action: (
+
+
+
+
+ ),
+ }));
+ };
+
+ const data = useMemo(
+ () => getTableRows(formData.questions, handleToggle, handleDeleteClick),
+ [getTableRows, formData.questions],
+ );
+
+ return (
+ <>
+
+
+
+
+
+
+ {data.length >= 4 && (
+
+ You can only add up to 4 custom fields
+
+ )}
+
+ >
+ );
+};
+
+export { CollectInfoForm };
diff --git a/src/features/create-drop/components/ticket/CreateTicketDropForm.tsx b/src/features/create-drop/components/ticket/CreateTicketDropForm.tsx
deleted file mode 100644
index d48b16b9..00000000
--- a/src/features/create-drop/components/ticket/CreateTicketDropForm.tsx
+++ /dev/null
@@ -1,97 +0,0 @@
-import { useFormContext } from 'react-hook-form';
-import { Button, Divider, HStack } from '@chakra-ui/react';
-
-import { IconBox } from '@/components/IconBox';
-import { LinkIcon } from '@/components/Icons';
-import { Step } from '@/components/Step/Step';
-import { useDropFlowContext } from '@/features/create-drop/contexts/DropFlowContext';
-import { useCreateTicketDropContext } from '@/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext';
-
-export const CreateTicketDropForm = () => {
- const { onNext } = useDropFlowContext();
- const {
- reset,
- formState: { isValid, dirtyFields, defaultValues },
- } = useFormContext();
-
- const { currentIndex, onNextStep, onPreviousStep, formSteps } = useCreateTicketDropContext();
-
- const currentStep = formSteps[currentIndex];
-
- const stepsDisplay = formSteps.map((step, index) => (
-
- ));
-
- // TODO: add next step to summary
- const handleSubmitClick = () => {
- onNext?.();
- };
-
- const handleNextStepClick = () => {
- if (currentIndex === formSteps.length - 1) {
- handleSubmitClick();
- return;
- }
-
- reset(defaultValues, { keepValues: true });
- onNextStep();
- };
-
- // isDirty from react form hook does not match with dirtyFields correctly
- // https://github.com/react-hook-form/react-hook-form/issues/4740
- const isDirty = Object.keys(dirtyFields).length > 0;
-
- return (
- }
- maxW={{ base: '21.5rem', md: '36rem' }}
- mx="auto"
- >
-
- {stepsDisplay}
-
- {currentStep.component}
-
-
- {currentIndex > 0 && (
-
- )}
- {currentStep.isSkipable && !isDirty ? (
-
- ) : (
-
- )}
-
-
- );
-};
diff --git a/src/features/create-drop/components/ticket/CreateTicketDropSummary.tsx b/src/features/create-drop/components/ticket/CreateTicketDropSummary.tsx
deleted file mode 100644
index 2d55507c..00000000
--- a/src/features/create-drop/components/ticket/CreateTicketDropSummary.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { DropSummary } from '@/features/create-drop/components/DropSummary';
-import { useCreateTicketDropContext } from '@/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext';
-
-export const CreateTicketDropSummary = () => {
- const { getSummaryData, getPaymentData, createLinksSWR } = useCreateTicketDropContext();
- const { data, handleDropConfirmation } = createLinksSWR;
-
- return (
-
- );
-};
diff --git a/src/features/create-drop/components/ticket/CreateTicketsForm.tsx b/src/features/create-drop/components/ticket/CreateTicketsForm.tsx
new file mode 100644
index 00000000..4e6e37b9
--- /dev/null
+++ b/src/features/create-drop/components/ticket/CreateTicketsForm.tsx
@@ -0,0 +1,322 @@
+import {
+ Button,
+ Show,
+ Heading,
+ Hide,
+ HStack,
+ Image,
+ Skeleton,
+ VStack,
+ Text,
+} from '@chakra-ui/react';
+import { useMemo, useState } from 'react';
+import { EditIcon } from '@chakra-ui/icons';
+
+import { FormControlComponent } from '@/components/FormControl';
+import { type ColumnItem } from '@/components/Table/types';
+import { CopyIcon, DeleteIcon } from '@/components/Icons';
+import { DataTable } from '@/components/Table';
+import { truncateAddress } from '@/utils/truncateAddress';
+import { type DateAndTimeInfo } from '@/lib/eventsHelpers';
+
+import {
+ type TicketDropFormData,
+ type EventStepFormProps,
+} from '../../routes/CreateTicketDropPage';
+
+import { ModifyTicketModal } from './ModifyTicketModal';
+import { PreviewTicketModal } from './PreviewTicketModal';
+
+const columns: ColumnItem[] = [
+ {
+ id: 'ticket',
+ title: 'Ticket',
+ selector: (row) => row.name,
+ loadingElement: ,
+ },
+ {
+ id: 'previewTicket',
+ title: '',
+ selector: (row) => row.previewTicket,
+ loadingElement: ,
+ },
+ {
+ id: 'numTickets',
+ title: '# tickets',
+ selector: (row) => row.numTickets,
+ loadingElement: ,
+ },
+ {
+ id: 'priceNEAR',
+ title: 'Price (NEAR)',
+ selector: (row) => row.price,
+ loadingElement: ,
+ },
+ {
+ id: 'action',
+ title: '',
+ selector: (row) => row.action,
+ loadingElement: ,
+ },
+];
+
+export const CollectInfoFormValidation = (formData: TicketDropFormData) => {
+ const newFormData = { ...formData };
+ const isErr = false;
+
+ return { isErr, newFormData };
+};
+
+export const defaultTicket = {
+ name: '',
+ description: '',
+ artwork: undefined,
+ priceNear: '0',
+ salesValidThrough: {
+ startDate: 0,
+ },
+ passValidThrough: {
+ startDate: 0,
+ },
+ maxSupply: 0,
+ maxPurchases: 0,
+};
+
+export interface TicketInfoFormMetadata {
+ name: string;
+ description: string;
+ artwork: File | undefined;
+ priceNear: string;
+ salesValidThrough: DateAndTimeInfo;
+ passValidThrough: DateAndTimeInfo;
+ maxSupply: number;
+ maxPurchases: number;
+}
+
+const CreateTicketsForm = (props: EventStepFormProps) => {
+ const { formData, setFormData } = props;
+ const [isModifyTicketModalOpen, setIsModifyTicketModalOpen] = useState(false);
+ const [isPreviewTicketModalOpen, setIsPreviewTicketModalOpen] = useState(false);
+ const [currentTicket, setCurrentTicket] = useState(defaultTicket);
+ const [editedTicket, setEditedTicket] = useState();
+
+ const handleDeleteClick = (id) => {
+ const newTickets = formData.tickets.filter((item) => item.name !== id);
+ setFormData({ ...formData, tickets: newTickets });
+ };
+
+ const handleCopyItem = (id) => {
+ const ticket = formData.tickets.find((item) => item.name === id);
+ if (!ticket) return;
+
+ // Function to generate a new unique ticket name
+ const generateNewTicketName = (baseName: string) => {
+ let copyNumber = 1;
+ let newTicketName = `${baseName} (${copyNumber})`;
+ // As long as the new ticket name already exists, increase the number
+ while (formData.tickets.some((item) => item.name === newTicketName)) {
+ copyNumber += 1;
+ newTicketName = `${baseName} (${copyNumber})`;
+ }
+ return newTicketName;
+ };
+
+ // Generate a unique name for the new copied ticket
+ const newTicketName = generateNewTicketName(ticket.name);
+ const newTicket = { ...ticket, name: newTicketName };
+ // Add the new unique ticket to the list of tickets
+ setFormData({ ...formData, tickets: [...formData.tickets, newTicket] });
+ };
+
+ const handleModalClose = (shouldAdd: boolean, editedQuestion?: TicketInfoFormMetadata) => {
+ if (shouldAdd) {
+ let newTickets = formData.tickets;
+ if (editedQuestion) {
+ newTickets = newTickets.map((item) => {
+ if (item.name === editedQuestion.name) {
+ return currentTicket;
+ }
+ return item;
+ });
+ } else {
+ newTickets.push(currentTicket);
+ }
+
+ setFormData({ ...formData, tickets: newTickets });
+ }
+
+ setIsModifyTicketModalOpen(false);
+ };
+
+ const openPreviewModal = (item: TicketInfoFormMetadata) => {
+ setCurrentTicket(item);
+ setIsPreviewTicketModalOpen(true);
+ };
+
+ const getTableRows = (data) => {
+ if (data === undefined) return [];
+
+ return data.map((item: TicketInfoFormMetadata) => ({
+ id: item.name,
+ price: item.priceNear === '0' ? 'Free' : item.priceNear,
+ numTickets: item.maxSupply,
+ name: (
+ <>
+
+
+
+
+
+ {truncateAddress(item.name, 'end', 35)}
+
+
+ {truncateAddress(item.description, 'end', 35)}
+
+
+
+
+
+
+
+
+
+ {truncateAddress(item.name, 'end', 35)}
+
+
+ {truncateAddress(item.description, 'end', 35)}
+
+
+
+
+ >
+ ),
+ previewTicket: (
+ {
+ openPreviewModal(item);
+ }}
+ >
+ Preview ticket
+
+ ),
+ action: (
+
+
+
+
+
+ ),
+ }));
+ };
+
+ const data = useMemo(() => getTableRows(formData.tickets), [getTableRows, formData.tickets]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+export { CreateTicketsForm };
diff --git a/src/features/create-drop/components/ticket/DynamicTicketPreview.tsx b/src/features/create-drop/components/ticket/DynamicTicketPreview.tsx
new file mode 100644
index 00000000..907f7b17
--- /dev/null
+++ b/src/features/create-drop/components/ticket/DynamicTicketPreview.tsx
@@ -0,0 +1,102 @@
+import { Button, Heading, HStack, IconButton, Image, VStack, Box } from '@chakra-ui/react';
+
+import { PlusButtonIcon } from '@/components/Icons/PlusButtonIcon';
+import { MinusButtonIcon } from '@/components/Icons/MinusButtonIcon';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
+
+import { type TicketInfoFormMetadata } from './CreateTicketsForm';
+
+export const DynamicTicketPreview = ({
+ currentTicket,
+}: {
+ currentTicket: TicketInfoFormMetadata;
+}) => {
+ const placeholderColor = 'gray.200'; // Define your placeholder color here
+
+ return (
+
+
+ {currentTicket.artwork ? (
+
+ ) : (
+
+ )}
+
+ {currentTicket.name ? (
+
+ {currentTicket.name}
+
+ ) : (
+
+ )}
+ {currentTicket.passValidThrough.startDate ? (
+
+ {dateAndTimeToText(currentTicket.passValidThrough)}
+
+ ) : (
+
+ )}
+ {currentTicket.description ? (
+
+ {currentTicket.description}
+
+ ) : (
+
+
+
+
+
+
+ )}
+
+
+ } // replace with your actual icon
+ variant="outline"
+ />
+
+ } // replace with your actual icon
+ variant="outline"
+ />
+
+
+
+
+
+ );
+};
diff --git a/src/features/create-drop/components/ticket/EventCreationStatusModal.tsx b/src/features/create-drop/components/ticket/EventCreationStatusModal.tsx
new file mode 100644
index 00000000..03ddd988
--- /dev/null
+++ b/src/features/create-drop/components/ticket/EventCreationStatusModal.tsx
@@ -0,0 +1,166 @@
+import {
+ Modal,
+ ModalOverlay,
+ ModalContent,
+ ModalHeader,
+ ModalBody,
+ ModalFooter,
+ Button,
+ Text,
+ VStack,
+ IconButton,
+ useToast,
+} from '@chakra-ui/react';
+import { useState } from 'react';
+import { useNavigate } from 'react-router-dom';
+
+import { TicketIcon } from '@/components/Icons';
+import { EVENTS_WORKER_BASE } from '@/constants/common';
+
+interface EventCreationStatusModalProps {
+ isSuccess: boolean;
+ setIsOpen: () => void;
+ isOpen: boolean;
+ prevEventData?: {
+ priceByDropId?: Record;
+ eventId: string;
+ stripeAccountId?: string;
+ };
+}
+
+export const EventCreationStatusModal = ({
+ isOpen,
+ setIsOpen,
+ isSuccess,
+ prevEventData,
+}: EventCreationStatusModalProps) => {
+ const [isSetting, setIsSetting] = useState(false);
+ const navigate = useNavigate();
+ const toast = useToast();
+
+ const handlePostEventCreation = async () => {
+ if (isSuccess) {
+ setIsSetting(true);
+
+ if (prevEventData?.stripeAccountId !== undefined) {
+ let response: Response | undefined;
+ try {
+ const url = `${EVENTS_WORKER_BASE}/stripe/create-event`;
+ const body = {
+ priceByDropId: prevEventData.priceByDropId,
+ stripeAccountId: prevEventData.stripeAccountId,
+ eventId: prevEventData.eventId,
+ };
+ response = await fetch(url, {
+ method: 'POST',
+ body: JSON.stringify(body),
+ });
+ } catch (error) {
+ return;
+ }
+
+ if (!response?.ok) {
+ toast({
+ title: 'Unable to upload event to stripe',
+ description: `Please delete the event and try again later. If the error persists, contact support.`,
+ status: 'error',
+ duration: 10000,
+ isClosable: true,
+ });
+ } else {
+ localStorage.removeItem('EVENT_INFO_SUCCESS_DATA');
+ }
+ } else {
+ localStorage.removeItem('EVENT_INFO_SUCCESS_DATA');
+ }
+ setIsSetting(false);
+ navigate('/events');
+ } else {
+ localStorage.removeItem('EVENT_INFO_SUCCESS_DATA');
+ }
+ setIsOpen();
+ };
+
+ const bodyMessage = () => {
+ if (!isSuccess) {
+ return 'Please try again later. If the error persists, contact support.';
+ }
+
+ if (prevEventData?.stripeAccountId !== undefined) {
+ return 'The last step is to upload the event details to stripe so that you can receive funds.';
+ }
+
+ return `You're all set! Your event has been created and you can view it in the events page.`;
+ };
+
+ const buttonMessage = () => {
+ if (!isSuccess) {
+ return 'Close';
+ }
+
+ if (prevEventData?.stripeAccountId !== undefined) {
+ return 'Upload to Stripe';
+ }
+
+ return 'View Event';
+ };
+
+ return (
+ {
+ // console.log('close');
+ }}
+ >
+
+
+ } // replace with your actual icon
+ left="50%"
+ overflow="visible !important"
+ position="absolute"
+ top={-6} // Half of the icon size to make it center on the edge
+ transform="translateX(-50%) translateY(-10%)"
+ variant="outline"
+ width="60px"
+ zIndex={1500} // Higher than ModalContent to overlap
+ />
+
+ {isSuccess ? 'Event Created Successfully' : 'Event Creation Failed'}
+
+
+
+
+ {bodyMessage()}
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/features/create-drop/components/ticket/EventInfoForm.tsx b/src/features/create-drop/components/ticket/EventInfoForm.tsx
index 91cd5a65..ff7d7677 100644
--- a/src/features/create-drop/components/ticket/EventInfoForm.tsx
+++ b/src/features/create-drop/components/ticket/EventInfoForm.tsx
@@ -1,57 +1,278 @@
-import { Box, Input } from '@chakra-ui/react';
-import { Controller, useFormContext } from 'react-hook-form';
+import { Input, HStack, VStack, Show, Hide, Box } from '@chakra-ui/react';
+import { useEffect, useState } from 'react';
-import { FormControl } from '@/components/FormControl';
-import { type CreateTicketFieldsSchema } from '@/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext';
+import CustomDateRangePicker from '@/components/DateRangePicker/DateRangePicker';
+import { ImageFileInput } from '@/components/ImageFileInput';
+import CustomDateRangePickerMobile from '@/components/DateRangePicker/MobileDateRangePicker';
+import { FormControlComponent } from '@/components/FormControl';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
-export const EventInfoForm = () => {
- const { control } = useFormContext();
+import {
+ type TicketDropFormData,
+ type EventStepFormProps,
+} from '../../routes/CreateTicketDropPage';
- return (
-
- {
- return (
-
-
-
- );
+import EventPagePreview from './EventPagePreview';
+
+export const ClearEventInfoForm = () => {
+ return {
+ eventName: { value: '' },
+ eventArtwork: { value: undefined },
+ eventDescription: { value: '' },
+ eventLocation: { value: '' },
+ date: {
+ value: {
+ startDate: 0,
+ },
+ },
+ };
+};
+
+export const EventInfoFormValidation = (formData: TicketDropFormData) => {
+ const newFormData = { ...formData };
+ let isErr = false;
+ return { isErr, newFormData: formData };
+
+ if (formData.eventName.value === '') {
+ newFormData.eventName = { ...formData.eventName, error: 'Event name is required' };
+ isErr = true;
+ }
+ if (formData.eventArtwork.value === undefined) {
+ newFormData.eventArtwork = { ...formData.eventArtwork, error: 'Event artwork is required' };
+ isErr = true;
+ }
+ if (formData.eventDescription.value === '') {
+ newFormData.eventDescription = {
+ ...formData.eventDescription,
+ error: 'Event description is required',
+ };
+ isErr = true;
+ }
+ if (formData.eventLocation.value === '') {
+ newFormData.eventLocation = {
+ ...formData.eventLocation,
+ error: 'Event location is required',
+ };
+ isErr = true;
+ }
+ if (formData.date.value.startDate === null) {
+ newFormData.date = { ...formData.date, error: 'Event date is required' };
+ isErr = true;
+ }
+
+ return { isErr, newFormData };
+};
+
+const EventInfoForm = (props: EventStepFormProps) => {
+ const { formData, setFormData } = props;
+
+ const [isDatePickerOpen, setIsDatePickerOpen] = useState(false);
+ const [datePlaceholer, setDatePlaceholder] = useState('Select date and time');
+ const [datePreviewText, setDatePreviewText] = useState('');
+
+ const [preview, setPreview] = useState();
+
+ useEffect(() => {
+ if (formData.eventArtwork.value === undefined) {
+ setPreview(undefined);
+ return;
+ }
+ const objectUrl = URL.createObjectURL(formData.eventArtwork.value);
+ setPreview(objectUrl);
+
+ return () => {
+ URL.revokeObjectURL(objectUrl);
+ };
+ }, [formData.eventArtwork.value]);
+
+ const onSelectFile = (e) => {
+ if (!e.target.files || e.target.files.length === 0) {
+ setPreview(undefined);
+ setFormData({ ...formData, eventArtwork: { value: undefined } });
+ return;
+ }
+
+ const file = e.target.files[0];
+ setFormData({ ...formData, eventArtwork: { value: file } });
+ };
+
+ useEffect(() => {
+ const datePlaceholder = dateAndTimeToText(formData.date.value, 'Select date and time');
+ const datePreviewText = dateAndTimeToText(formData.date.value);
+
+ setDatePlaceholder(datePlaceholder);
+ setDatePreviewText(datePreviewText);
+ }, [formData.date]);
+
+ const margins = '2 !important';
+
+ const datePickerCTA = (
+
+
- {
- return (
-
- {
- field.onChange(parseInt(e.target.value), 10);
- }}
- />
-
- );
+ type="text"
+ width="100%"
+ onClick={() => {
+ setIsDatePickerOpen(true);
}}
/>
-
+
+ );
+
+ return (
+
+
+
+ {
+ setFormData({ ...formData, eventName: { value: e.target.value } });
+ }}
+ />
+
+
+ {
+ setFormData({ ...formData, eventDescription: { value: e.target.value } });
+ }}
+ />
+
+
+ {
+ setFormData({ ...formData, eventLocation: { value: e.target.value } });
+ }}
+ />
+
+
+ {
+ setFormData({
+ ...formData,
+ date: { value: { ...formData.date, startDate, endDate } },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setFormData({
+ ...formData,
+ date: { value: { ...formData.date.value, startTime, endTime } },
+ });
+ }}
+ />
+
+
+ {
+ setFormData({
+ ...formData,
+ date: { value: { ...formData.date.value, startDate, endDate } },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setFormData({
+ ...formData,
+ date: { value: { ...formData.date.value, startTime, endTime } },
+ });
+ }}
+ />
+
+
+ {
+ onSelectFile(e);
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
);
};
+
+export { EventInfoForm };
diff --git a/src/features/create-drop/components/ticket/EventPagePreview.tsx b/src/features/create-drop/components/ticket/EventPagePreview.tsx
new file mode 100644
index 00000000..6322dcbe
--- /dev/null
+++ b/src/features/create-drop/components/ticket/EventPagePreview.tsx
@@ -0,0 +1,137 @@
+import { Box, VStack, Image, Heading, HStack } from '@chakra-ui/react';
+
+import TicketPreview from './TicketPreview';
+
+interface EventPagePreviewProps {
+ eventName: string;
+ eventDescription?: string;
+ eventLocation?: string;
+ eventDate: string;
+ eventArtwork?: string;
+}
+
+function EventPagePreview({
+ eventName,
+ eventDescription,
+ eventLocation,
+ eventDate,
+ eventArtwork,
+}: EventPagePreviewProps) {
+ return (
+ <>
+ {/* Adjust height as needed */}
+ {!eventArtwork ? (
+
+ ) : (
+
+ )}
+
+
+ {eventName || 'Event name'}
+
+
+
+
+ Event details
+
+ {eventDescription ? (
+ // Assuming you want to display the event description when it exists
+
+ {eventDescription}
+
+ ) : (
+ // Placeholder pills when there is no event description
+
+ {Array.from({ length: 5 }, (_, index) => (
+
+ ))}
+
+
+ )}
+
+
+
+
+ Location
+
+ {eventLocation ? (
+ // Assuming you want to display the event description when it exists
+
+ {eventLocation}
+
+ ) : (
+
+ )}
+
+
+
+ Date
+
+ {eventDate ? (
+ // Assuming you want to display the event description when it exists
+
+ {eventDate}
+
+ ) : (
+
+ )}
+
+
+
+
+ Tickets
+
+
+
+ >
+ );
+}
+
+export default EventPagePreview;
diff --git a/src/features/create-drop/components/ticket/KeypomPasswordPromptModal.tsx b/src/features/create-drop/components/ticket/KeypomPasswordPromptModal.tsx
new file mode 100644
index 00000000..f869f707
--- /dev/null
+++ b/src/features/create-drop/components/ticket/KeypomPasswordPromptModal.tsx
@@ -0,0 +1,147 @@
+import {
+ Modal,
+ ModalOverlay,
+ ModalContent,
+ ModalHeader,
+ ModalCloseButton,
+ ModalBody,
+ ModalFooter,
+ Button,
+ Input,
+ useToast,
+ Text,
+ VStack,
+ InputGroup,
+ InputRightElement,
+ IconButton,
+} from '@chakra-ui/react';
+import { useState } from 'react';
+import { ViewIcon, ViewOffIcon } from '@chakra-ui/icons';
+
+import { set } from '@/utils/localStorage';
+import { EyeIcon } from '@/components/Icons/EyeIcon';
+
+interface KeypomPasswordPromptModalProps {
+ isOpen: boolean;
+ isSetting: boolean;
+ onModalClose: () => void;
+}
+
+export const KeypomPasswordPromptModal = ({
+ isOpen,
+ isSetting,
+ onModalClose,
+}: KeypomPasswordPromptModalProps) => {
+ const [password, setPassword] = useState('');
+ const [showPassword, setShowPassword] = useState(false);
+ const toast = useToast();
+
+ const handlePasswordSubmit = () => {
+ // Perform any validation you need here
+ if (password.length < 8) {
+ toast({
+ title: 'Password too short.',
+ description: "Please enter a password that's at least 8 characters long.",
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ return;
+ }
+
+ // If validation passes, save the password
+ set('MASTER_KEY', password);
+ onModalClose();
+ toast({
+ title: 'Password set successfully.',
+ status: 'success',
+ duration: 5000,
+ isClosable: true,
+ });
+ };
+
+ const handlePasswordVisibilityToggle = () => {
+ setShowPassword(!showPassword);
+ };
+
+ return (
+
+
+
+ } // replace with your actual icon
+ left="50%"
+ overflow="visible !important"
+ position="absolute"
+ top={-6} // Half of the icon size to make it center on the edge
+ transform="translateX(-50%) translateY(-10%)"
+ variant="outline"
+ width="60px"
+ zIndex={1500} // Higher than ModalContent to overlap
+ />
+
+ Set your Keypom password
+
+
+
+
+
+
+ To create an event, you need to set a Keypom password. This allows you to manage
+ your event securely.
+
+
+ {
+ setPassword(e.target.value);
+ }}
+ />
+
+ : }
+ size="sm"
+ variant="ghost"
+ onClick={handlePasswordVisibilityToggle}
+ />
+
+
+
+ Do not lose your password. It cannot be recovered if lost.
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/features/create-drop/components/ticket/ModifyQuestionModal.tsx b/src/features/create-drop/components/ticket/ModifyQuestionModal.tsx
new file mode 100644
index 00000000..27269fcf
--- /dev/null
+++ b/src/features/create-drop/components/ticket/ModifyQuestionModal.tsx
@@ -0,0 +1,81 @@
+import { Button, Input, Modal, ModalContent, ModalOverlay, Text, VStack } from '@chakra-ui/react';
+
+import { EMAIL_QUESTION } from './helpers';
+
+interface ModifyQuestionModalProps {
+ allQuestions: Array<{ id: string; isRequired: boolean }>;
+ isOpen: boolean;
+ onClose: (shouldAdd: boolean, originalQuestion?: string) => void;
+ userInput: string;
+ setUserInput: (value: string) => void;
+ originalQuestion?: string;
+}
+
+export const ModifyQuestionModal = ({
+ allQuestions,
+ isOpen,
+ onClose,
+ userInput,
+ setUserInput,
+ originalQuestion,
+}: ModifyQuestionModalProps) => {
+ let canAddQuestion = !allQuestions.some((question) => question.id === userInput);
+ if (userInput === EMAIL_QUESTION) {
+ canAddQuestion = false;
+ }
+ return (
+ {
+ onClose(false, originalQuestion);
+ }}
+ >
+
+
+
+
+
+ {originalQuestion ? 'Edit question' : 'Custom question'}
+
+
+ Add a question you'd like attendees to fill out for this event
+
+ {
+ e.preventDefault();
+ setUserInput(e.target.value);
+ }}
+ />
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/features/create-drop/components/ticket/ModifyTicketModal.tsx b/src/features/create-drop/components/ticket/ModifyTicketModal.tsx
new file mode 100644
index 00000000..4afcce7f
--- /dev/null
+++ b/src/features/create-drop/components/ticket/ModifyTicketModal.tsx
@@ -0,0 +1,930 @@
+import {
+ Button,
+ Hide,
+ Grid,
+ GridItem,
+ Input,
+ Modal,
+ ModalContent,
+ ModalOverlay,
+ Show,
+ Textarea,
+ VStack,
+ Center,
+ Box,
+ HStack,
+} from '@chakra-ui/react';
+import { useEffect, useRef, useState } from 'react';
+import { DateTime } from 'luxon';
+
+import { FormControlComponent } from '@/components/FormControl';
+import CustomDateRangePicker from '@/components/DateRangePicker/DateRangePicker';
+import CustomDateRangePickerMobile from '@/components/DateRangePicker/MobileDateRangePicker';
+import { ImageFileInput } from '@/components/ImageFileInput';
+import { type DateAndTimeInfo } from '@/lib/eventsHelpers';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
+import { ImageFileInputSmall } from '@/components/ImageFileInput/ImageFileInputSmall';
+
+import { type TicketDropFormData } from '../../routes/CreateTicketDropPage';
+
+import { type TicketInfoFormMetadata } from './CreateTicketsForm';
+import TicketPriceSelector from './TicketPriceSelector';
+import { DynamicTicketPreview } from './DynamicTicketPreview';
+
+const defaultErrors = {
+ name: '',
+ description: '',
+ salesValidThrough: '',
+ passValidThrough: '',
+ maxSupply: '',
+ price: '',
+ artwork: '',
+ maxPurchases: '',
+};
+
+export const isValidNonNegativeNumber = (value) => {
+ return /^\d*\.?\d+$/.test(value);
+};
+
+interface ModifyTicketModalProps {
+ isOpen: boolean;
+ onClose: (shouldAdd: boolean, editedTicket?: TicketInfoFormMetadata) => void;
+ eventDate: DateAndTimeInfo;
+ formData: TicketDropFormData;
+ allTickets: TicketInfoFormMetadata[];
+ currentTicket: TicketInfoFormMetadata;
+ setCurrentTicket: (ticket: TicketInfoFormMetadata) => void;
+ editedTicket?: TicketInfoFormMetadata;
+}
+
+// Function to parse a time string and return a Luxon DateTime object
+const parseTime = (timeString) => {
+ // Assuming your time string format is "HH:mm" (e.g., "14:00" for 2:00 PM)
+ // Adjust the format as necessary to match your input format
+ return DateTime.fromFormat(timeString, 'H:mm');
+};
+
+export const ModifyTicketModal = ({
+ isOpen,
+ onClose,
+ formData,
+ eventDate,
+ allTickets,
+ currentTicket,
+ setCurrentTicket,
+ editedTicket,
+}: ModifyTicketModalProps) => {
+ const [errors, setErrors] = useState(defaultErrors);
+
+ const [isSalesValidModalOpen, setIsSalesValidModalOpen] = useState(false);
+ const [isPassValidModalOpen, setIsPassValidModalOpen] = useState(false);
+ const [preview, setPreview] = useState();
+ const inputRef = useRef(null);
+
+ const validateForm = () => {
+ let isErr = false;
+ // Create a new object with the properties of defaultErrors to ensure a new reference
+ const newErrors = { ...defaultErrors };
+ if (!currentTicket.name) {
+ newErrors.name = 'Name is required';
+ isErr = true;
+ }
+
+ if (!editedTicket && allTickets.some((ticket) => ticket.name === currentTicket.name)) {
+ newErrors.name = 'Name must be unique';
+ isErr = true;
+ }
+
+ if (!currentTicket.description) {
+ newErrors.description = 'Description is required';
+ isErr = true;
+ }
+
+ if (!currentTicket.salesValidThrough.startDate) {
+ newErrors.salesValidThrough = 'Sales valid through is required';
+ isErr = true;
+ }
+
+ if (!currentTicket.passValidThrough.startDate) {
+ newErrors.passValidThrough = 'Pass valid through is required';
+ isErr = true;
+ }
+
+ if (currentTicket.salesValidThrough.endTime && currentTicket.salesValidThrough.startTime) {
+ const startTime = parseTime(currentTicket.salesValidThrough.startTime);
+ const endTime = parseTime(currentTicket.salesValidThrough.endTime);
+
+ if (endTime <= startTime) {
+ newErrors.salesValidThrough = 'End time must be greater than start time';
+ isErr = true;
+ }
+ }
+
+ if (currentTicket.passValidThrough.endTime && currentTicket.passValidThrough.startTime) {
+ const startTime = parseTime(currentTicket.passValidThrough.startTime);
+ const endTime = parseTime(currentTicket.passValidThrough.endTime);
+
+ // Use Luxon's isAfter method to compare times
+ if (endTime <= startTime) {
+ newErrors.passValidThrough = 'End time must be greater than start time';
+ isErr = true;
+ }
+ }
+
+ if (currentTicket.maxSupply < 1) {
+ newErrors.maxSupply = 'Max supply is required';
+ isErr = true;
+ }
+
+ if (currentTicket.maxPurchases < 1) {
+ newErrors.maxPurchases = 'Max purchases is required';
+ isErr = true;
+ }
+
+ if (!isValidNonNegativeNumber(currentTicket.priceNear)) {
+ newErrors.price = 'Price is required';
+ isErr = true;
+ }
+
+ if (!currentTicket.artwork) {
+ newErrors.artwork = 'Artwork is required';
+ isErr = true;
+ }
+
+ // Now newErrors is a new object, so setting it should trigger a re-render
+ setErrors(newErrors);
+ // eslint-disable-next-line no-console
+
+ if (!isErr) {
+ onClose(true, editedTicket);
+ }
+ };
+
+ const margins = '3';
+
+ const datePickerCTA = (
+ label: string,
+ errorField: string,
+ dateObject: DateAndTimeInfo,
+ onClick,
+ ) => (
+
+
+
+ );
+
+ useEffect(() => {
+ if (isSalesValidModalOpen) {
+ setIsPassValidModalOpen(false);
+ }
+ if (isPassValidModalOpen) {
+ setIsSalesValidModalOpen(false);
+ }
+ }, [isSalesValidModalOpen, isPassValidModalOpen]);
+
+ useEffect(() => {
+ if (currentTicket.salesValidThrough.startDate) {
+ setErrors({ ...errors, salesValidThrough: '' });
+ }
+ }, [currentTicket.salesValidThrough]);
+
+ useEffect(() => {
+ if (currentTicket.passValidThrough.startDate) {
+ setErrors({ ...errors, passValidThrough: '' });
+ }
+ }, [currentTicket.passValidThrough]);
+
+ useEffect(() => {
+ const selectedFile = currentTicket.artwork;
+ if (selectedFile === undefined) {
+ setPreview(undefined);
+ return;
+ }
+ const objectUrl = URL.createObjectURL(selectedFile);
+ setPreview(objectUrl);
+
+ return () => {
+ URL.revokeObjectURL(objectUrl);
+ };
+ }, [currentTicket.artwork]);
+
+ useEffect(() => {
+ // Reset errors when the modal is closed (i.e., isOpen changes from true to false)
+ if (!isOpen) {
+ setErrors(defaultErrors);
+ }
+ }, [isOpen]);
+
+ useEffect(() => {
+ const inputEl = inputRef.current;
+ const preventScroll = (e: WheelEvent) => {
+ e.preventDefault();
+ };
+
+ if (inputEl) {
+ // Attach the event listener without specifying the passive option
+ inputEl.addEventListener('wheel', preventScroll);
+ }
+
+ return () => {
+ if (inputEl) {
+ // Clean up the event listener
+ inputEl.removeEventListener('wheel', preventScroll);
+ }
+ };
+ }, []);
+
+ const onSelectFile = (e) => {
+ if (!e.target.files || e.target.files.length === 0) {
+ setCurrentTicket({ ...currentTicket, artwork: undefined });
+ return;
+ }
+
+ setCurrentTicket({ ...currentTicket, artwork: e.target.files[0] });
+ };
+
+ return (
+ {
+ onClose(false, editedTicket);
+ }}
+ >
+
+
+
+
+ {/* Top-left: Form Section */}
+
+
+
+ {
+ setErrors({ ...errors, name: '' });
+ setCurrentTicket({ ...currentTicket, name: e.target.value });
+ }}
+ />
+
+
+
+
+ {
+ setIsSalesValidModalOpen(true);
+ },
+ )}
+ endDate={currentTicket.salesValidThrough.endDate}
+ isDatePickerOpen={isSalesValidModalOpen}
+ maxDate={
+ eventDate.endDate
+ ? new Date(eventDate.endDate)
+ : new Date(eventDate.startDate)
+ }
+ minDate={new Date()}
+ scale="0.85"
+ setIsDatePickerOpen={setIsSalesValidModalOpen}
+ startDate={currentTicket.salesValidThrough.startDate}
+ onDateChange={(startDate, endDate) => {
+ setCurrentTicket({
+ ...currentTicket,
+ salesValidThrough: {
+ ...currentTicket.salesValidThrough,
+ startDate,
+ endDate,
+ },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setCurrentTicket({
+ ...currentTicket,
+ salesValidThrough: {
+ ...currentTicket.salesValidThrough,
+ startTime,
+ endTime,
+ },
+ });
+ }}
+ />
+
+
+ {
+ setIsSalesValidModalOpen(true);
+ },
+ )}
+ endDate={currentTicket.salesValidThrough.endDate}
+ isDatePickerOpen={isSalesValidModalOpen}
+ maxDate={
+ eventDate.endDate
+ ? new Date(eventDate.endDate)
+ : new Date(eventDate.startDate)
+ }
+ minDate={new Date()}
+ scale="0.85"
+ setIsDatePickerOpen={setIsSalesValidModalOpen}
+ startDate={currentTicket.salesValidThrough.startDate}
+ onDateChange={(startDate, endDate) => {
+ setCurrentTicket({
+ ...currentTicket,
+ salesValidThrough: {
+ ...currentTicket.salesValidThrough,
+ startDate,
+ endDate,
+ },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setCurrentTicket({
+ ...currentTicket,
+ salesValidThrough: {
+ ...currentTicket.salesValidThrough,
+ startTime,
+ endTime,
+ },
+ });
+ }}
+ />
+
+
+ {
+ setIsPassValidModalOpen(true);
+ },
+ )}
+ endDate={currentTicket.passValidThrough.endDate}
+ isDatePickerOpen={isPassValidModalOpen}
+ maxDate={
+ eventDate.endDate
+ ? new Date(eventDate.endDate)
+ : new Date(eventDate.startDate)
+ }
+ minDate={new Date(eventDate.startDate)}
+ scale="0.85"
+ setIsDatePickerOpen={setIsPassValidModalOpen}
+ startDate={currentTicket.passValidThrough.startDate}
+ onDateChange={(startDate, endDate) => {
+ setCurrentTicket({
+ ...currentTicket,
+ passValidThrough: { ...currentTicket.passValidThrough, startDate, endDate },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setCurrentTicket({
+ ...currentTicket,
+ passValidThrough: { ...currentTicket.passValidThrough, startTime, endTime },
+ });
+ }}
+ />
+
+
+ {
+ setIsPassValidModalOpen(true);
+ },
+ )}
+ endDate={currentTicket.passValidThrough.endDate}
+ isDatePickerOpen={isPassValidModalOpen}
+ maxDate={
+ eventDate.endDate
+ ? new Date(eventDate.endDate)
+ : new Date(eventDate.startDate)
+ }
+ minDate={new Date(eventDate.startDate)}
+ scale="0.85"
+ setIsDatePickerOpen={setIsPassValidModalOpen}
+ startDate={currentTicket.passValidThrough.startDate}
+ onDateChange={(startDate, endDate) => {
+ setCurrentTicket({
+ ...currentTicket,
+ passValidThrough: { ...currentTicket.passValidThrough, startDate, endDate },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setCurrentTicket({
+ ...currentTicket,
+ passValidThrough: { ...currentTicket.passValidThrough, startTime, endTime },
+ });
+ }}
+ />
+
+
+
+ {
+ let val = e.target.value;
+ if (parseInt(e.target.value) < 0) {
+ val = '0';
+ }
+
+ setErrors({ ...errors, maxSupply: '' });
+ setCurrentTicket({ ...currentTicket, maxSupply: parseInt(val) });
+ }}
+ />
+
+
+ {
+ let val = e.target.value;
+ if (val === '') {
+ val = '0';
+ }
+
+ if (parseInt(e.target.value) < 0) {
+ val = '0';
+ }
+
+ setErrors({ ...errors, maxPurchases: '' });
+ setCurrentTicket({ ...currentTicket, maxPurchases: parseInt(val) });
+ }}
+ />
+
+
+
+
+
+ {/* Top-right: Ticket Preview Section */}
+
+
+
+ {' '}
+ {/* You can adjust 'sm' to the max width you want */}
+
+
+
+
+
+ {/* Bottom-left: Price Selector */}
+
+
+
+
+
+
+ {/* Bottom-right: Artwork Selector */}
+
+
+ {
+ onSelectFile(e);
+ }}
+ />
+
+
+
+
+
+
+
+ {
+ setErrors({ ...errors, name: '' });
+ setCurrentTicket({ ...currentTicket, name: e.target.value });
+ }}
+ />
+
+
+
+
+ {
+ setIsSalesValidModalOpen(true);
+ },
+ )}
+ endDate={currentTicket.salesValidThrough.endDate}
+ isDatePickerOpen={isSalesValidModalOpen}
+ maxDate={
+ eventDate.endDate ? new Date(eventDate.endDate) : new Date(eventDate.startDate)
+ }
+ minDate={new Date()}
+ scale="0.85"
+ setIsDatePickerOpen={setIsSalesValidModalOpen}
+ startDate={currentTicket.salesValidThrough.startDate}
+ onDateChange={(startDate, endDate) => {
+ setCurrentTicket({
+ ...currentTicket,
+ salesValidThrough: { ...currentTicket.salesValidThrough, startDate, endDate },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setCurrentTicket({
+ ...currentTicket,
+ salesValidThrough: { ...currentTicket.salesValidThrough, startTime, endTime },
+ });
+ }}
+ />
+
+
+ {
+ setIsSalesValidModalOpen(true);
+ },
+ )}
+ endDate={currentTicket.salesValidThrough.endDate}
+ isDatePickerOpen={isSalesValidModalOpen}
+ maxDate={
+ eventDate.endDate ? new Date(eventDate.endDate) : new Date(eventDate.startDate)
+ }
+ minDate={new Date()}
+ scale="0.85"
+ setIsDatePickerOpen={setIsSalesValidModalOpen}
+ startDate={currentTicket.salesValidThrough.startDate}
+ onDateChange={(startDate, endDate) => {
+ setCurrentTicket({
+ ...currentTicket,
+ salesValidThrough: { ...currentTicket.salesValidThrough, startDate, endDate },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setCurrentTicket({
+ ...currentTicket,
+ salesValidThrough: { ...currentTicket.salesValidThrough, startTime, endTime },
+ });
+ }}
+ />
+
+
+ {
+ setIsPassValidModalOpen(true);
+ },
+ )}
+ endDate={currentTicket.passValidThrough.endDate}
+ isDatePickerOpen={isPassValidModalOpen}
+ maxDate={
+ eventDate.endDate ? new Date(eventDate.endDate) : new Date(eventDate.startDate)
+ }
+ minDate={new Date(eventDate.startDate)}
+ scale="0.85"
+ setIsDatePickerOpen={setIsPassValidModalOpen}
+ startDate={currentTicket.passValidThrough.startDate}
+ onDateChange={(startDate, endDate) => {
+ setCurrentTicket({
+ ...currentTicket,
+ passValidThrough: { ...currentTicket.passValidThrough, startDate, endDate },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setCurrentTicket({
+ ...currentTicket,
+ passValidThrough: { ...currentTicket.passValidThrough, startTime, endTime },
+ });
+ }}
+ />
+
+
+ {
+ setIsPassValidModalOpen(true);
+ },
+ )}
+ endDate={currentTicket.passValidThrough.endDate}
+ isDatePickerOpen={isPassValidModalOpen}
+ maxDate={
+ eventDate.endDate ? new Date(eventDate.endDate) : new Date(eventDate.startDate)
+ }
+ minDate={new Date(eventDate.startDate)}
+ scale="0.85"
+ setIsDatePickerOpen={setIsPassValidModalOpen}
+ startDate={currentTicket.passValidThrough.startDate}
+ onDateChange={(startDate, endDate) => {
+ setCurrentTicket({
+ ...currentTicket,
+ passValidThrough: { ...currentTicket.passValidThrough, startDate, endDate },
+ });
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setCurrentTicket({
+ ...currentTicket,
+ passValidThrough: { ...currentTicket.passValidThrough, startTime, endTime },
+ });
+ }}
+ />
+
+
+
+ {
+ let val = e.target.value;
+ if (parseInt(e.target.value) < 0) {
+ val = '0';
+ }
+
+ setErrors({ ...errors, maxSupply: '' });
+ setCurrentTicket({ ...currentTicket, maxSupply: parseInt(val) });
+ }}
+ />
+
+
+ {
+ let val = e.target.value;
+ if (val === '') {
+ val = '0';
+ }
+
+ if (parseInt(e.target.value) < 0) {
+ val = '0';
+ }
+
+ setErrors({ ...errors, maxPurchases: '' });
+ setCurrentTicket({ ...currentTicket, maxPurchases: parseInt(val) });
+ }}
+ />
+
+
+
+ {
+ onSelectFile(e);
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/features/create-drop/components/ticket/PreviewTicketModal.tsx b/src/features/create-drop/components/ticket/PreviewTicketModal.tsx
new file mode 100644
index 00000000..fbb3faca
--- /dev/null
+++ b/src/features/create-drop/components/ticket/PreviewTicketModal.tsx
@@ -0,0 +1,69 @@
+import { Button, IconButton, Modal, ModalContent, ModalOverlay, VStack } from '@chakra-ui/react';
+
+import { EyeIcon } from '@/components/Icons/EyeIcon';
+
+import { type TicketInfoFormMetadata } from './CreateTicketsForm';
+import { DynamicTicketPreview } from './DynamicTicketPreview';
+
+interface PreviewTicketModalProps {
+ isOpen: boolean;
+ setIsOpen: (value: boolean) => void;
+ currentTicket: TicketInfoFormMetadata;
+}
+
+export const PreviewTicketModal = ({
+ isOpen,
+ setIsOpen,
+ currentTicket,
+}: PreviewTicketModalProps) => {
+ return (
+ {
+ // console.log('close');
+ }}
+ >
+
+
+ } // replace with your actual icon
+ left="50%"
+ overflow="visible !important"
+ position="absolute"
+ top={-6} // Half of the icon size to make it center on the edge
+ transform="translateX(-50%) translateY(-10%)"
+ variant="outline"
+ width="60px"
+ zIndex={1500} // Higher than ModalContent to overlap
+ />
+
+
+
+
+
+
+ );
+};
diff --git a/src/features/create-drop/components/ticket/ReviewEventForm.tsx b/src/features/create-drop/components/ticket/ReviewEventForm.tsx
new file mode 100644
index 00000000..ead93958
--- /dev/null
+++ b/src/features/create-drop/components/ticket/ReviewEventForm.tsx
@@ -0,0 +1,309 @@
+import {
+ Button,
+ Show,
+ Heading,
+ Hide,
+ HStack,
+ Image,
+ Skeleton,
+ VStack,
+ Text,
+ Grid,
+ Flex,
+ GridItem,
+ Divider,
+ Box,
+} from '@chakra-ui/react';
+import { Fragment, useMemo, useState } from 'react';
+
+import keypomInstance from '@/lib/keypom';
+import { type ColumnItem } from '@/components/Table/types';
+import { DeleteIcon } from '@/components/Icons';
+import { DataTable } from '@/components/Table';
+import { truncateAddress } from '@/utils/truncateAddress';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
+
+import { type EventStepFormProps } from '../../routes/CreateTicketDropPage';
+
+import { PreviewTicketModal } from './PreviewTicketModal';
+import { defaultTicket, type TicketInfoFormMetadata } from './CreateTicketsForm';
+
+const columns: ColumnItem[] = [
+ {
+ id: 'ticket',
+ title: 'Ticket',
+ selector: (row) => row.name,
+ loadingElement: ,
+ },
+ {
+ id: 'previewTicket',
+ title: '',
+ selector: (row) => row.previewTicket,
+ loadingElement: ,
+ },
+ {
+ id: 'numTickets',
+ title: 'Count',
+ selector: (row) => row.numTickets,
+ loadingElement: ,
+ },
+ {
+ id: 'priceNEAR',
+ title: 'Price (NEAR)',
+ selector: (row) => row.price,
+ loadingElement: ,
+ },
+ {
+ id: 'action',
+ title: '',
+ selector: (row) => row.action,
+ loadingElement: ,
+ },
+];
+
+const ReviewEventForm = (props: EventStepFormProps) => {
+ const { formData, setFormData } = props;
+ const [isPreviewTicketModalOpen, setIsPreviewTicketModalOpen] = useState(false);
+ const [currentTicket, setCurrentTicket] = useState();
+
+ const handleDeleteClick = (id) => {
+ const newTickets = formData.tickets.filter((item) => item.name !== id);
+ setFormData({ ...formData, tickets: newTickets });
+ };
+
+ const openPreviewModal = (item: TicketInfoFormMetadata) => {
+ setCurrentTicket(item);
+ setIsPreviewTicketModalOpen(true);
+ };
+
+ const getTableRows = (data) => {
+ if (data === undefined) return [];
+
+ return data.map((item: TicketInfoFormMetadata) => ({
+ id: item.name,
+ price: item.priceNear === '0' ? 'Free' : item.priceNear,
+ numTickets: item.maxSupply,
+ name: (
+ <>
+
+
+
+
+
+ {truncateAddress(item.name, 'end', 35)}
+
+
+ {truncateAddress(item.description, 'end', 35)}
+
+
+
+
+
+
+
+
+
+ {truncateAddress(item.name, 'end', 35)}
+
+
+ {truncateAddress(item.description, 'end', 35)}
+
+
+
+
+ >
+ ),
+ previewTicket: (
+ {
+ openPreviewModal(item);
+ }}
+ >
+ Preview ticket
+
+ ),
+ action: (
+
+
+
+ ),
+ }));
+ };
+
+ const data = useMemo(() => getTableRows(formData.tickets), [getTableRows, formData.tickets]);
+
+ return (
+ <>
+
+
+
+
+ Let's make sure all your details are correct
+
+
+
+
+
+
+ Event name
+
+
+ {formData.eventName.value}
+
+
+
+
+
+ Event date
+
+
+ {dateAndTimeToText(formData.date.value)}
+
+
+
+
+
+ Event description
+
+
+ {formData.eventDescription.value}
+
+
+
+
+
+ Event location
+
+
+ {formData.eventLocation.value}
+
+
+
+
+
+
+
+
+
+ Event Setup
+
+
+ {keypomInstance.yoctoToNear(formData.costBreakdown.perEvent)} NEAR
+
+
+ Market Listing
+
+
+ {keypomInstance.yoctoToNear(formData.costBreakdown.marketListing)} NEAR
+
+ {formData.tickets.map((item, index) => (
+
+
+ {item.name}
+
+
+ {keypomInstance.yoctoToNear(formData.costBreakdown.perDrop)} NEAR
+
+
+ ))}
+
+ {/* Divider with small margin top and larger margin bottom */}
+
+
+
+
+
+
+ {/* Total with more space above */}
+
+ Total
+
+
+
+ {/* Empty box to take up space and allow the text to align right */}
+
+ {' '}
+ {/* Ensure VStack is aligning items to the end */}
+
+ {`${keypomInstance.yoctoToNear(formData.costBreakdown.total)} NEAR`}
+
+ {formData.nearPrice && (
+
+ {`($${(
+ parseFloat(keypomInstance.yoctoToNear(formData.costBreakdown.total)) *
+ formData.nearPrice
+ ).toFixed(2)})`}
+
+ )}
+
+
+
+
+
+
+ >
+ );
+};
+
+export { ReviewEventForm };
diff --git a/src/features/create-drop/components/ticket/SignUpInfoForm.tsx b/src/features/create-drop/components/ticket/SignUpInfoForm.tsx
deleted file mode 100644
index 6394ba2f..00000000
--- a/src/features/create-drop/components/ticket/SignUpInfoForm.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { Box, Text } from '@chakra-ui/react';
-import { Controller, useFormContext } from 'react-hook-form';
-import { type BaseSyntheticEvent } from 'react';
-
-import { SwitchInput } from '@/components/SwitchInput';
-import { type CreateTicketFieldsSchema } from '@/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext';
-
-interface InfoSwitchItem {
- name: 'firstName' | 'secondName' | 'emailAddress';
- label: string;
-}
-
-const infoSwitches: InfoSwitchItem[] = [
- {
- name: 'firstName',
- label: 'First Name',
- },
- {
- name: 'secondName',
- label: 'Second Name',
- },
- {
- name: 'emailAddress',
- label: 'Email address',
- },
-];
-
-export const SignUpInfoForm = () => {
- const { control } = useFormContext();
-
- const switches = infoSwitches.map((switchInfo) => {
- return (
- {
- return (
- {
- field.onChange(e.target.checked);
- },
- isChecked: field.value,
- mt: '0',
- }}
- />
- );
- }}
- />
- );
- });
-
- return (
-
-
- Collect information
-
- {switches}
-
- );
-};
diff --git a/src/features/create-drop/components/ticket/TicketPreview.tsx b/src/features/create-drop/components/ticket/TicketPreview.tsx
new file mode 100644
index 00000000..d08b16a1
--- /dev/null
+++ b/src/features/create-drop/components/ticket/TicketPreview.tsx
@@ -0,0 +1,35 @@
+import { Box, VStack } from '@chakra-ui/react';
+
+function TicketPreview() {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default TicketPreview;
diff --git a/src/features/create-drop/components/ticket/TicketPriceSelector.tsx b/src/features/create-drop/components/ticket/TicketPriceSelector.tsx
new file mode 100644
index 00000000..bd4505e4
--- /dev/null
+++ b/src/features/create-drop/components/ticket/TicketPriceSelector.tsx
@@ -0,0 +1,138 @@
+import { Box, HStack, Input, Text, VStack } from '@chakra-ui/react';
+import { useState } from 'react';
+
+import keypomInstance from '@/lib/keypom';
+import { FormControlComponent } from '@/components/FormControl';
+import { yoctoPerFreeKey } from '@/lib/eventsHelpers';
+
+import { type TicketDropFormData } from '../../routes/CreateTicketDropPage';
+
+import { type TicketInfoFormMetadata } from './CreateTicketsForm';
+
+interface TicketPriceSelectorProps {
+ formData: TicketDropFormData;
+ errors: Record;
+ currentTicket: TicketInfoFormMetadata;
+ setCurrentTicket: (ticket: TicketInfoFormMetadata) => void;
+}
+
+export default function TicketPriceSelector({
+ formData,
+ errors,
+ currentTicket,
+ setCurrentTicket,
+}: TicketPriceSelectorProps) {
+ const [customPrice, setCustomPrice] = useState('');
+ const presetPrices = [0, 5, 10, 50];
+
+ const handleCustomPriceSubmit = () => {
+ setCurrentTicket({ ...currentTicket, priceNear: customPrice });
+ };
+
+ const handlePresetPriceClick = (price: number) => {
+ setCustomPrice('');
+ setCurrentTicket({ ...currentTicket, priceNear: String(price) });
+ };
+
+ const handleCustomPriceChange = (e: React.ChangeEvent) => {
+ const newPrice = e.target.value;
+ setCustomPrice(newPrice);
+ };
+
+ const roundNumber = (num: number) => {
+ return num.toFixed(2);
+ };
+
+ const priceMessage = () => {
+ const toReceive =
+ parseInt(currentTicket.priceNear) -
+ parseFloat(keypomInstance.yoctoToNear(yoctoPerFreeKey().toString()));
+ const buyerPays = parseInt(currentTicket.priceNear);
+
+ const toReceiveUsd = roundNumber(toReceive * (formData.nearPrice || 1));
+ const buyerPaysUsd = roundNumber(buyerPays * (formData.nearPrice || 1));
+
+ if (parseInt(currentTicket.priceNear) > 0) {
+ return `You receive ${roundNumber(toReceive)} NEAR${
+ formData.nearPrice ? ` ($${toReceiveUsd})` : ''
+ }. Buyer pays ${roundNumber(buyerPays)} NEAR${
+ formData.nearPrice ? ` ($${buyerPaysUsd})` : ''
+ }.`;
+ }
+
+ return `Ticket is free`;
+ };
+
+ return (
+
+
+
+
+ {presetPrices.map((price) => (
+ {
+ handlePresetPriceClick(price);
+ }}
+ >
+ {price}
+
+ ))}
+
+
+
+
+ {priceMessage()}
+
+
+
+ );
+}
diff --git a/src/features/create-drop/components/ticket/helpers.tsx b/src/features/create-drop/components/ticket/helpers.tsx
new file mode 100644
index 00000000..680de209
--- /dev/null
+++ b/src/features/create-drop/components/ticket/helpers.tsx
@@ -0,0 +1,336 @@
+import { type Action } from '@near-wallet-selector/core';
+import { parseNearAmount } from 'keypom-js';
+
+import keypomInstance from '@/lib/keypom';
+import {
+ calculateDepositCost,
+ type TicketMetadataExtra,
+ type FunderEventMetadata,
+ type FunderMetadata,
+ type TicketInfoMetadata,
+} from '@/lib/eventsHelpers';
+import {
+ deriveKeyFromPassword,
+ encryptPrivateKey,
+ exportPublicKeyToBase64,
+ generateKeyPair,
+ uint8ArrayToBase64,
+} from '@/lib/cryptoHelpers';
+import { get } from '@/utils/localStorage';
+import { KEYPOM_MARKETPLACE_CONTRACT } from '@/constants/common';
+
+import { type TicketDropFormData } from '../../routes/CreateTicketDropPage';
+
+export const EMAIL_QUESTION = 'Email address';
+
+async function fileToArrayBuffer(file: File): Promise {
+ return await new Promise((resolve, reject) => {
+ if (!(file instanceof File)) {
+ reject(new TypeError('The provided value is not a File.'));
+ return;
+ }
+
+ const reader = new FileReader();
+ reader.onload = (event: ProgressEvent) => {
+ // Explicitly assert the result is an ArrayBuffer
+ resolve(event.target!.result as ArrayBuffer);
+ };
+ reader.onerror = (event: ProgressEvent) => {
+ // Safely access error code, considering it could be null
+ reject(new Error('File reading error: ' + (event.target?.error?.message || 'Unknown error')));
+ };
+ reader.readAsArrayBuffer(file);
+ });
+}
+
+export async function serializeMediaForWorker(formData: TicketDropFormData) {
+ const arrayBuffers: string[] = [];
+
+ if (formData.eventArtwork.value) {
+ try {
+ const eventArtworkArrayBuffer = await fileToArrayBuffer(formData.eventArtwork.value);
+ arrayBuffers.push(arrayBufferToBase64(eventArtworkArrayBuffer));
+ } catch (error) {
+ console.error('Error reading event artwork:', error);
+ }
+ }
+
+ for (const ticket of formData.tickets) {
+ if (ticket.artwork) {
+ try {
+ const ticketArtworkArrayBuffer = await fileToArrayBuffer(ticket.artwork);
+ arrayBuffers.push(arrayBufferToBase64(ticketArtworkArrayBuffer));
+ } catch (error) {
+ console.error('Error reading ticket artwork:', error);
+ }
+ }
+ }
+
+ return arrayBuffers;
+}
+
+function arrayBufferToBase64(buffer) {
+ let binary = '';
+ const bytes = new Uint8Array(buffer);
+ const len = bytes.byteLength;
+ for (let i = 0; i < len; i++) {
+ binary += String.fromCharCode(bytes[i]);
+ }
+ return window.btoa(binary);
+}
+
+export const estimateCosts = async ({
+ formData,
+ accountId,
+ setFormData,
+ setCurrentStep,
+}: {
+ accountId: string;
+ formData: TicketDropFormData;
+ setFormData: (
+ data: TicketDropFormData | ((prev: TicketDropFormData) => TicketDropFormData),
+ ) => void;
+ setCurrentStep: any;
+}) => {
+ const eventId = Date.now().toString();
+ const masterKey = get('MASTER_KEY');
+
+ const funderInfo = await keypomInstance.viewCall({
+ methodName: 'get_funder_info',
+ args: { account_id: accountId },
+ });
+ const funderMetadata: FunderMetadata =
+ funderInfo === undefined || funderInfo === null ? {} : JSON.parse(funderInfo.metadata);
+
+ const eventMetadata: FunderEventMetadata = {
+ name: formData.eventName.value,
+ dateCreated: Date.now().toString(),
+ description: formData.eventDescription.value,
+ location: formData.eventLocation.value,
+ date: formData.date.value,
+ artwork: 'bafybeiehk3mzsj2ih4u4fkvmkfrome3kars7xyy3bxh6xfjquws4flglqa',
+ questions: formData.questions.map((question) => ({
+ question: question.question,
+ required: question.isRequired || false,
+ })),
+ id: eventId.toString(),
+ };
+
+ if (formData.questions.length > 0) {
+ const { publicKey, privateKey } = await generateKeyPair();
+ const saltBytes = window.crypto.getRandomValues(new Uint8Array(16));
+ const saltBase64 = uint8ArrayToBase64(saltBytes);
+ const symmetricKey = await deriveKeyFromPassword(masterKey, saltBase64);
+ const { encryptedPrivateKeyBase64, ivBase64 } = await encryptPrivateKey(
+ privateKey,
+ symmetricKey,
+ );
+
+ eventMetadata.pubKey = await exportPublicKeyToBase64(publicKey);
+ eventMetadata.encPrivKey = encryptedPrivateKeyBase64;
+ eventMetadata.iv = ivBase64;
+ eventMetadata.salt = saltBase64;
+ }
+
+ funderMetadata[eventId] = eventMetadata;
+
+ const drop_ids: string[] = [];
+ const drop_configs: any = [];
+ const asset_datas: any = [];
+ const ticket_information: Record<
+ string,
+ { max_tickets: number; price: string; sale_start?: number; sale_end?: number }
+ > = {};
+
+ for (const ticket of formData.tickets) {
+ const dropId = `${Date.now().toString()}-${ticket.name
+ .replaceAll(' ', '')
+ .toLocaleLowerCase()}`;
+
+ ticket_information[`${dropId}`] = {
+ max_tickets: ticket.maxSupply,
+ price: parseNearAmount(ticket.priceNear)!.toString(),
+ sale_start: ticket.salesValidThrough.startDate || undefined,
+ sale_end: ticket.salesValidThrough.endDate || undefined,
+ };
+
+ const dropConfig = {
+ metadata: JSON.stringify(ticket),
+ add_key_allowlist: [KEYPOM_MARKETPLACE_CONTRACT],
+ transfer_key_allowlist: [KEYPOM_MARKETPLACE_CONTRACT],
+ };
+ const assetData = [
+ {
+ uses: 2,
+ assets: [null],
+ config: {
+ permissions: 'claim',
+ },
+ },
+ ];
+ drop_ids.push(dropId);
+ asset_datas.push(assetData);
+ drop_configs.push(dropConfig);
+ }
+
+ const { costBreakdown } = calculateDepositCost({
+ eventMetadata,
+ eventTickets: formData.tickets,
+ marketTicketInfo: ticket_information,
+ });
+
+ setFormData((prev: TicketDropFormData) => ({
+ ...prev,
+ costBreakdown,
+ }));
+
+ setCurrentStep((prevStep: number) => prevStep + 1);
+};
+
+export const createPayload = async ({
+ accountId,
+ formData,
+ eventArtworkCid,
+ ticketArtworkCids,
+ eventId,
+}: {
+ accountId: string;
+ formData: TicketDropFormData;
+ eventArtworkCid: string;
+ ticketArtworkCids: string[];
+ eventId: string;
+}): Promise<{ actions: Action[]; dropIds: string[] }> => {
+ const masterKey = get('MASTER_KEY');
+
+ const funderInfo = await keypomInstance.viewCall({
+ methodName: 'get_funder_info',
+ args: { account_id: accountId },
+ });
+ const funderMetadata: FunderMetadata =
+ funderInfo === undefined || funderInfo === null ? {} : JSON.parse(funderInfo.metadata);
+
+ const eventMetadata: FunderEventMetadata = {
+ name: formData.eventName.value,
+ dateCreated: Date.now().toString(),
+ description: formData.eventDescription.value,
+ location: formData.eventLocation.value,
+ date: formData.date.value,
+ artwork: eventArtworkCid,
+ questions: formData.questions.map((question) => ({
+ question: question.question,
+ required: question.isRequired || false,
+ })),
+ id: eventId.toString(),
+ };
+
+ if (formData.questions.length > 0) {
+ const { publicKey, privateKey } = await generateKeyPair();
+ const saltBytes = window.crypto.getRandomValues(new Uint8Array(16));
+ const saltBase64 = uint8ArrayToBase64(saltBytes);
+ const symmetricKey = await deriveKeyFromPassword(masterKey, saltBase64);
+ const { encryptedPrivateKeyBase64, ivBase64 } = await encryptPrivateKey(
+ privateKey,
+ symmetricKey,
+ );
+
+ eventMetadata.pubKey = await exportPublicKeyToBase64(publicKey);
+ eventMetadata.encPrivKey = encryptedPrivateKeyBase64;
+ eventMetadata.iv = ivBase64;
+ eventMetadata.salt = saltBase64;
+ }
+
+ funderMetadata[eventId] = eventMetadata;
+
+ const drop_ids: string[] = [];
+ const drop_configs: any = [];
+ const asset_datas: any = [];
+ const ticket_information: Record<
+ string,
+ { max_tickets: number; price: string; sale_start?: number; sale_end?: number }
+ > = {};
+
+ for (const ticket of formData.tickets) {
+ const dropId = `${Date.now().toString()}-${ticket.name
+ .replaceAll(' ', '')
+ .toLocaleLowerCase()}`;
+
+ const ticketExtra: TicketMetadataExtra = {
+ dateCreated: Date.now().toString(),
+ price: parseNearAmount(ticket.priceNear)!.toString(),
+ salesValidThrough: ticket.salesValidThrough,
+ passValidThrough: ticket.passValidThrough,
+ maxSupply: ticket.maxSupply,
+ limitPerUser: ticket.maxPurchases,
+ eventId,
+ };
+
+ const ticketNftInfo: TicketInfoMetadata = {
+ title: ticket.name,
+ description: ticket.description,
+ media: ticketArtworkCids.shift() || '',
+ extra: JSON.stringify(ticketExtra),
+ };
+
+ ticket_information[`${dropId}`] = {
+ max_tickets: ticket.maxSupply,
+ price: parseNearAmount(ticket.priceNear)!.toString(),
+ sale_start: ticket.salesValidThrough.startDate || undefined,
+ sale_end: ticket.salesValidThrough.endDate || undefined,
+ };
+
+ const dropConfig = {
+ nft_keys_config: {
+ token_metadata: ticketNftInfo,
+ },
+ add_key_allowlist: [KEYPOM_MARKETPLACE_CONTRACT],
+ transfer_key_allowlist: [KEYPOM_MARKETPLACE_CONTRACT],
+ };
+ const assetData = [
+ {
+ uses: 2,
+ assets: [null],
+ config: {
+ permissions: 'claim',
+ },
+ },
+ ];
+ drop_ids.push(dropId);
+ asset_datas.push(assetData);
+ drop_configs.push(dropConfig);
+ }
+
+ const { costBreakdown } = calculateDepositCost({
+ eventMetadata,
+ eventTickets: formData.tickets,
+ marketTicketInfo: ticket_information,
+ });
+
+ const actions: Action[] = [
+ {
+ type: 'FunctionCall',
+ params: {
+ methodName: 'create_drop_batch',
+ args: {
+ drop_ids,
+ drop_configs,
+ asset_datas,
+ change_user_metadata: JSON.stringify(funderMetadata),
+ on_success: {
+ receiver_id: KEYPOM_MARKETPLACE_CONTRACT,
+ method_name: 'create_event',
+ args: JSON.stringify({
+ event_id: eventId,
+ funder_id: accountId,
+ ticket_information,
+ }),
+ attached_deposit: costBreakdown.marketListing,
+ },
+ },
+ gas: '300000000000000',
+ deposit: costBreakdown.total,
+ },
+ },
+ ];
+
+ return { actions, dropIds: drop_ids };
+};
diff --git a/src/features/create-drop/components/ticket/index.ts b/src/features/create-drop/components/ticket/index.ts
deleted file mode 100644
index 60c413ca..00000000
--- a/src/features/create-drop/components/ticket/index.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export * from './AdditionalGiftsForm/POAPNftForm';
-export * from './AdditionalGiftsForm/TokenForm';
-export * from './CreateTicketDropForm';
-export * from './CreateTicketDropSummary';
-export * from './EventInfoForm';
-export * from './SignUpInfoForm';
diff --git a/src/features/create-drop/components/token/CreateTokenDropForm.tsx b/src/features/create-drop/components/token/CreateTokenDropForm.tsx
index 34ca9adc..132bea25 100644
--- a/src/features/create-drop/components/token/CreateTokenDropForm.tsx
+++ b/src/features/create-drop/components/token/CreateTokenDropForm.tsx
@@ -51,7 +51,6 @@ export const CreateTokenDropForm = () => {
]);
const calcTotalCost = async () => {
- console.log(totalLinks, amountPerLink, totalCost);
if (totalLinks && amountPerLink) {
const { requiredDeposit } = await createDrop({
wallet: await window.selector.wallet(),
@@ -84,7 +83,6 @@ export const CreateTokenDropForm = () => {
if (masterKey === undefined) {
openMasterKeyModal(setAppModal, onNext?.(), () => {
// eslint-disable-next-line no-console
- console.log('user cancelled');
window.location.reload();
});
return;
diff --git a/src/features/create-drop/components/token/CreateTokenDropSummary.tsx b/src/features/create-drop/components/token/CreateTokenDropSummary.tsx
index 8aa00370..7b31bb12 100644
--- a/src/features/create-drop/components/token/CreateTokenDropSummary.tsx
+++ b/src/features/create-drop/components/token/CreateTokenDropSummary.tsx
@@ -24,7 +24,7 @@ export const CreateTokenDropSummary = () => {
{
handleDropConfirmation(navigate);
diff --git a/src/features/create-drop/contexts/CreateNftDropContext.tsx b/src/features/create-drop/contexts/CreateNftDropContext.tsx
index a84bafd9..29706ba3 100644
--- a/src/features/create-drop/contexts/CreateNftDropContext.tsx
+++ b/src/features/create-drop/contexts/CreateNftDropContext.tsx
@@ -51,28 +51,29 @@ const createLinks = async () => {
interface CreateNftDropContextType {
getSummaryData: () => SummaryItem[];
- getPaymentData: () => PaymentData;
+ getPaymentData: () => Promise;
handleDropConfirmation: (paymentData: PaymentData) => void;
createLinksSWR: {
data?: { success: boolean };
- handleDropConfirmation: () => void;
+ handleDropConfirmation: (paymentData: PaymentData) => void;
};
}
const CreateNftDropContext = createContext({
getSummaryData: () => [{ type: 'text', name: '', value: '' }] as SummaryItem[],
- getPaymentData: () => ({
- costsData: [{ name: '', total: 0 }],
- totalCost: 0,
- confirmationText: '',
- }),
- handleDropConfirmation: function (): void {
- throw new Error('Function not implemented.');
+ getPaymentData: async () =>
+ await (Promise.resolve({
+ costsData: [{ name: '', total: 0 }],
+ totalCost: 0,
+ confirmationText: '',
+ }) as Promise),
+ handleDropConfirmation: async function (): Promise {
+ await Promise.resolve();
},
createLinksSWR: {
data: { success: false },
- handleDropConfirmation: function (): void {
- throw new Error('Function not implemented.');
+ handleDropConfirmation: async function (): Promise {
+ await Promise.resolve();
},
},
});
@@ -191,7 +192,7 @@ export const CreateNftDropProvider = ({ children }: PropsWithChildren) => {
const confirmationText = `Creating ${numKeys} for ${totalCost} NEAR`;
- return { costsData, totalCost, confirmationText };
+ return { costsData, totalCost: parseFloat(totalCost), confirmationText };
};
const handleDropConfirmation = async (paymentData: PaymentData) => {
diff --git a/src/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext.tsx b/src/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext.tsx
index a63d5d20..c8c360c0 100644
--- a/src/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext.tsx
+++ b/src/features/create-drop/contexts/CreateTicketDropContext/CreateTicketDropContext.tsx
@@ -1,224 +1,11 @@
-import { createContext, type PropsWithChildren, useContext } from 'react';
-import { FormProvider, useForm } from 'react-hook-form';
-import useSWRMutation from 'swr/mutation';
-import { zodResolver } from '@hookform/resolvers/zod';
import type * as z from 'zod';
-import { useSteps } from '@/hooks/useSteps';
-import { type StepItem } from '@/components/Step/Step';
import {
- type PaymentData,
- type PaymentItem,
- type SummaryItem,
-} from '@/features/create-drop/types/types';
-import { EventInfoForm } from '@/features/create-drop/components/ticket/EventInfoForm';
-import { AdditionalGiftsForm } from '@/features/create-drop/components/ticket/AdditionalGiftsForm/AdditionalGiftsForm';
-
-import { AdditionalGiftSchema, EventInfoSchema, type SignUpInfoSchema } from './FormValidations';
-
-interface FormStep extends StepItem {
- isSkipable: boolean;
- schema: typeof AdditionalGiftSchema | typeof EventInfoSchema | typeof SignUpInfoSchema;
-}
+ type AdditionalGiftSchema,
+ type EventInfoSchema,
+ type SignUpInfoSchema,
+} from './FormValidation';
export type CreateTicketFieldsSchema = z.infer<
typeof EventInfoSchema & typeof SignUpInfoSchema & typeof AdditionalGiftSchema
>;
-
-export interface CreateTicketDropContextTypes {
- onNextStep: () => void;
- onPreviousStep: () => void;
- currentIndex: number;
- getSummaryData: () => SummaryItem[];
- getPaymentData: () => PaymentData;
- handleDropConfirmation: () => void;
- formSteps: FormStep[];
- createLinksSWR: {
- data?: { success: boolean };
- handleDropConfirmation: () => void;
- };
-}
-
-const CreateTicketDropContext = createContext({
- onNextStep: function (): void {
- throw new Error('Function not implemented.');
- },
- onPreviousStep: function (): void {
- throw new Error('Function not implemented.');
- },
- currentIndex: 0,
- getSummaryData: function (): SummaryItem[] {
- throw new Error('Function not implemented.');
- },
- getPaymentData: function (): PaymentData {
- throw new Error('Function not implemented.');
- },
- handleDropConfirmation: function (): void {
- throw new Error('Function not implemented.');
- },
- formSteps: [],
- createLinksSWR: {
- data: {
- success: false,
- },
- handleDropConfirmation: function (): void {
- throw new Error('Function not implemented.');
- },
- },
-});
-
-// TODO: this is only a mock implementation of the backend api
-const createLinks = async () => {
- await new Promise((_resolve) => setTimeout(_resolve, 2000));
- return {
- success: true,
- };
-};
-
-const formSteps: FormStep[] = [
- {
- name: 'eventInfo',
- title: 'Event info',
- component: ,
- isSkipable: false,
- schema: EventInfoSchema,
- },
- /** commented in case there's a need for sign-up info in the future */
- // {
- // name: 'signUpInfo',
- // title: 'Sign-up info',
- // component: ,
- // isSkipable: true,
- // schema: SignUpInfoSchema,
- // },
- {
- name: 'additionalGifts',
- title: 'Additional gifts',
- component: ,
- isSkipable: true,
- schema: AdditionalGiftSchema,
- },
-];
-
-/**
- *
- * Context for managing form state
- */
-export const CreateTicketDropProvider = ({ children }: PropsWithChildren) => {
- const {
- onNext: onNextStep,
- onPrevious: onPreviousStep,
- currentIndex,
- } = useSteps({ maxSteps: formSteps.length });
- const { trigger, data } = useSWRMutation('/api/drops/tickets', createLinks);
-
- const methods = useForm({
- mode: 'onChange',
- defaultValues: {
- eventName: '',
- totalTickets: undefined,
- firstName: false,
- secondName: false,
- emailAddress: false,
- additionalGift: {
- type: 'none',
- token: {
- selectedToken: null,
- amountPerLink: '',
- },
- poapNft: { name: '', description: '', artwork: null },
- },
- },
- resolver: zodResolver(formSteps[currentIndex].schema),
- });
-
- const getSummaryData = (): SummaryItem[] => {
- const { eventName, totalTickets, additionalGift } = methods.getValues();
-
- const results: SummaryItem[] = [
- {
- type: 'text',
- name: 'Event name',
- value: eventName,
- },
- {
- type: 'text',
- name: 'Number of tickets',
- value: totalTickets,
- },
- ];
-
- if (additionalGift.type === 'token') {
- results.push({
- type: 'text',
- name: 'Tokens gifted per ticket',
- value: `${additionalGift.token.amountPerLink} ${additionalGift?.token?.selectedToken?.symbol}`,
- });
- } else if (additionalGift.type === 'poapNft') {
- results.push({
- type: 'image',
- name: 'POAP',
- value: additionalGift.poapNft.artwork,
- });
- }
-
- return results;
- };
-
- const getPaymentData = (): PaymentData => {
- // TODO: assuming this comes from backend
- const totalLinkCost = 20 * 3.5;
- const NEARNetworkFee = 50.15;
- const totalCost = totalLinkCost + NEARNetworkFee;
- const costsData: PaymentItem[] = [
- {
- name: 'Link cost',
- total: totalLinkCost,
- helperText: `20 x 3.509`,
- },
- {
- name: 'NEAR network fees',
- total: NEARNetworkFee,
- },
- {
- name: 'Keypom fee',
- total: 0,
- isDiscount: true,
- discountText: 'Early bird discount',
- },
- ];
-
- const confirmationText = `Creating 20 for ${totalCost} NEAR`;
-
- return { costsData, totalCost, confirmationText };
- };
-
- const handleDropConfirmation = () => {
- // TODO: send transaction/request to backend
- void trigger();
- };
-
- const createLinksSWR = {
- data,
- handleDropConfirmation,
- };
-
- return (
-
- {children}
-
- );
-};
-
-export const useCreateTicketDropContext = () => useContext(CreateTicketDropContext);
diff --git a/src/features/create-drop/contexts/CreateTicketDropContext/FormValidations.ts b/src/features/create-drop/contexts/CreateTicketDropContext/FormValidation.ts
similarity index 85%
rename from src/features/create-drop/contexts/CreateTicketDropContext/FormValidations.ts
rename to src/features/create-drop/contexts/CreateTicketDropContext/FormValidation.ts
index 4e8b3a8a..65f2dd8b 100644
--- a/src/features/create-drop/contexts/CreateTicketDropContext/FormValidations.ts
+++ b/src/features/create-drop/contexts/CreateTicketDropContext/FormValidation.ts
@@ -4,12 +4,24 @@ import { MAX_FILE_SIZE } from '@/constants/common';
const ACCEPTED_IMAGE_TYPES = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp'];
+const EventDateSchema = z
+ .object({
+ startDate: z.date(),
+ endDate: z.date(),
+ startTime: z.string().optional(),
+ endTime: z.string().optional(),
+ })
+ .refine((data) => data.endDate > data.startDate, {
+ message: 'End date must be after the start date.',
+ path: ['endDate'], // this indicates which field the error should be associated with
+ });
+
export const EventInfoSchema = z.object({
eventName: z.string().min(1, 'Event name required'),
- totalTickets: z
- .number({ invalid_type_error: 'Number of tickets required' })
- .positive()
- .min(1, 'Required'),
+ eventDescription: z.string().optional(),
+ eventLocation: z.string().optional(),
+ date: EventDateSchema, // Use the nested schema
+ eventArtwork: z.string().min(1, 'Event artwork required'),
});
export const SignUpInfoSchema = z.object({
diff --git a/src/features/create-drop/contexts/CreateTokenDropContext.tsx b/src/features/create-drop/contexts/CreateTokenDropContext.tsx
index 3666d273..07841b93 100644
--- a/src/features/create-drop/contexts/CreateTokenDropContext.tsx
+++ b/src/features/create-drop/contexts/CreateTokenDropContext.tsx
@@ -16,25 +16,29 @@ import { type PaymentData, type PaymentItem, type SummaryItem } from '../types/t
interface CreateTokenDropContextProps {
getSummaryData: () => SummaryItem[];
- getPaymentData: () => PaymentData;
- handleDropConfirmation: () => void;
- createLinksSWR: { data?: { success: boolean }; handleDropConfirmation: () => void };
+ getPaymentData: () => Promise;
+ handleDropConfirmation: (navigate: NavigateFunction) => Promise;
+ createLinksSWR: {
+ data?: { success: boolean };
+ handleDropConfirmation: (navigate: NavigateFunction) => Promise;
+ };
}
const CreateTokenDropContext = createContext({
getSummaryData: () => [{ type: 'text', name: '', value: '' }] as SummaryItem[],
- getPaymentData: () => ({
- costsData: [{ name: '', total: 0 }],
- totalCost: 0,
- confirmationText: '',
- }),
- handleDropConfirmation: function (): void {
- throw new Error('Function not implemented.');
+ getPaymentData: async () =>
+ await (Promise.resolve({
+ costsData: [{ name: '', total: 0 }],
+ totalCost: 0,
+ confirmationText: '',
+ }) as Promise),
+ handleDropConfirmation: async (navigate: NavigateFunction) => {
+ // Placeholder implementation
},
createLinksSWR: {
- data: undefined,
- handleDropConfirmation: function (): void {
- throw new Error('Function not implemented.');
+ data: { success: false },
+ handleDropConfirmation: async () => {
+ // Placeholder implementation for createLinksSWR's handleDropConfirmation
},
},
});
@@ -148,6 +152,15 @@ export const CreateTokenDropProvider = ({ children }: PropsWithChildren) => {
precision: 14,
});
const totalCost = parseFloat(formatNearAmount(requiredDeposit!, 4));
+ // Ensure totalCost and totalLinkCost are numbers before performing subtraction.
+ const totalCostNumeric = Number(totalCost);
+ const totalLinkCostNumeric = Number(totalLinkCost);
+
+ // Perform the subtraction.
+ const difference = totalCostNumeric - totalLinkCostNumeric;
+
+ // Convert the result to a fixed decimal place number.
+ const totalNetworkFees = Number(difference.toFixed(4));
const costsData: PaymentItem[] = [
{
name: 'Link cost',
@@ -156,7 +169,7 @@ export const CreateTokenDropProvider = ({ children }: PropsWithChildren) => {
},
{
name: 'NEAR network fees',
- total: Number((totalCost - totalLinkCost).toFixed(4)),
+ total: totalNetworkFees,
},
{
name: 'Keypom fee',
diff --git a/src/features/create-drop/contexts/nft-utils.ts b/src/features/create-drop/contexts/nft-utils.ts
index 76d8b583..a0f4f2a6 100644
--- a/src/features/create-drop/contexts/nft-utils.ts
+++ b/src/features/create-drop/contexts/nft-utils.ts
@@ -3,9 +3,7 @@ import { get, update, del } from 'idb-keyval';
import { pack } from 'ipfs-car/dist/esm/pack';
import { MemoryBlockStore } from 'ipfs-car/dist/esm/blockstore/memory';
-import { MASTER_KEY, NFT_ATTEMPT_KEY } from '@/constants/common';
-
-const WORKER_BASE_URL = 'https://keypom-nft-storage.keypom.workers.dev/';
+import { MASTER_KEY, NFT_ATTEMPT_KEY, WORKER_BASE_URL } from '@/constants/common';
export const DEBUG_DEL_NFT_ATTEMPT = async () => {
await del(NFT_ATTEMPT_KEY);
@@ -39,7 +37,6 @@ export const createDropsForNFT = async (dropId, returnTransactions, data, setApp
wrapWithDirectory: false,
});
media = root.toString();
- console.log('CID', media);
}
let keys, requiredDeposit;
@@ -49,7 +46,7 @@ export const createDropsForNFT = async (dropId, returnTransactions, data, setApp
wallet,
numKeys: 1,
metadata: JSON.stringify({
- name: title,
+ dropName: title,
}),
depositPerUseNEAR: 0.1,
fcData: {
@@ -107,11 +104,13 @@ export const createDropsForNFT = async (dropId, returnTransactions, data, setApp
body: file,
}).then(async (r) => await r.json());
} catch (error) {
+ // eslint-disable-next-line no-console
console.warn('cfw error', error);
res = { error };
}
if (res.error) {
+ // eslint-disable-next-line no-console
console.warn('cfw error', res.error);
const mediaErrorModal = () =>
@@ -142,10 +141,6 @@ export const createDropsForNFT = async (dropId, returnTransactions, data, setApp
],
});
- if (/Invalid drop/.test(res.error.toString())) {
- return mediaErrorModal();
- }
-
if (/drop not claimed/.test(res.error.toString())) {
return mediaErrorModal();
}
@@ -158,8 +153,6 @@ export const createDropsForNFT = async (dropId, returnTransactions, data, setApp
}
await update(NFT_ATTEMPT_KEY, (val) => ({ ...val, seriesClaimed: true, fileUploaded: true }));
-
- console.log('response from worker', res);
}
try {
@@ -223,11 +216,11 @@ export const handleFinishNFTDrop = async (setAppModal) => {
try {
res = await createDropsForNFT(data.dropId, false, data, setAppModal);
} catch (e) {
+ // eslint-disable-next-line no-console
console.warn(e);
}
const { responses } = res;
- console.log(responses);
if (responses?.length > 0) {
del(NFT_ATTEMPT_KEY);
}
diff --git a/src/features/create-drop/routes/CreateNftDropPage.tsx b/src/features/create-drop/routes/CreateNftDropPage.tsx
index 3467fd1e..ff6b6dfa 100644
--- a/src/features/create-drop/routes/CreateNftDropPage.tsx
+++ b/src/features/create-drop/routes/CreateNftDropPage.tsx
@@ -1,6 +1,7 @@
import { Box } from '@chakra-ui/react';
import { useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
+import { clear } from 'idb-keyval';
import { getNFTAttempt, handleFinishNFTDrop } from '@/features/create-drop/contexts/nft-utils';
import { useAppContext } from '@/contexts/AppContext';
@@ -51,9 +52,19 @@ const NewNftDrop = () => {
isLoading: true,
header: 'Creating NFT',
message: 'Uploading media and creating NFT drop links on-chain. This may take 15-30 seconds.',
+ options: [
+ {
+ label: 'Cancel',
+ func: () => {
+ clear();
+ },
+ buttonProps: {
+ variant: 'outline',
+ },
+ },
+ ],
});
const dropId = await handleFinishNFTDrop(setAppModal);
- console.log(dropId);
setAppModal({
isOpen: false,
isLoading: false,
diff --git a/src/features/create-drop/routes/CreateTicketDropPage.tsx b/src/features/create-drop/routes/CreateTicketDropPage.tsx
index 6acdf84c..85e5c85f 100644
--- a/src/features/create-drop/routes/CreateTicketDropPage.tsx
+++ b/src/features/create-drop/routes/CreateTicketDropPage.tsx
@@ -1,45 +1,492 @@
-import { Box } from '@chakra-ui/react';
+import { Button, HStack, useToast } from '@chakra-ui/react';
+import { type ReactElement, useState, useEffect } from 'react';
+import { type Action, type Wallet } from '@near-wallet-selector/core';
+import keypomInstance from '@/lib/keypom';
+import { get } from '@/utils/localStorage';
import { type IBreadcrumbItem } from '@/components/Breadcrumbs';
-import { type IFlowPage } from '@/types/common';
-import { DropFlow } from '@/features/create-drop/components/DropFlow';
-import { DropFlowProvider } from '@/features/create-drop/contexts/DropFlowContext';
-import { CreateTicketDropProvider } from '@/features/create-drop/contexts/CreateTicketDropContext';
-import { CreateTicketDropForm } from '@/features/create-drop/components/ticket/CreateTicketDropForm';
-import { CreateTicketDropSummary } from '@/features/create-drop/components/ticket/CreateTicketDropSummary';
-
-const flowPages: IFlowPage[] = [
+import { IconBox } from '@/components/IconBox';
+import { LinkIcon } from '@/components/Icons';
+import { Step } from '@/components/Step';
+import { useAuthWalletContext } from '@/contexts/AuthWalletContext';
+import {
+ EVENTS_WORKER_BASE,
+ KEYPOM_EVENTS_CONTRACT,
+ KEYPOM_MARKETPLACE_CONTRACT,
+} from '@/constants/common';
+import { type DateAndTimeInfo } from '@/lib/eventsHelpers';
+
+import { CreateTicketDropLayout } from '../components/CreateTicketDropLayout';
+import { CollectInfoForm } from '../components/ticket/CollectInfoForm';
+import {
+ CreateTicketsForm,
+ type TicketInfoFormMetadata,
+} from '../components/ticket/CreateTicketsForm';
+import {
+ ClearEventInfoForm,
+ EventInfoForm,
+ EventInfoFormValidation,
+} from '../components/ticket/EventInfoForm';
+import { ReviewEventForm } from '../components/ticket/ReviewEventForm';
+import { KeypomPasswordPromptModal } from '../components/ticket/KeypomPasswordPromptModal';
+import {
+ createPayload,
+ EMAIL_QUESTION,
+ estimateCosts,
+ serializeMediaForWorker,
+} from '../components/ticket/helpers';
+import { AcceptPaymentForm } from '../components/ticket/AcceptPaymentForm';
+import { EventCreationStatusModal } from '../components/ticket/EventCreationStatusModal';
+
+interface TicketStep {
+ title: string;
+ description: string;
+ name: string;
+ skippable: boolean;
+ canClearDetails: boolean;
+ component: (props: EventStepFormProps) => ReactElement;
+}
+
+export interface EventStepFormProps {
+ formData: TicketDropFormData;
+ setFormData: (data: TicketDropFormData) => void;
+ accountId: string | null | undefined;
+}
+
+export interface TicketDropFormData {
+ // Step 0
+ stripeAccountId?: string;
+ acceptStripePayments: boolean;
+ acceptNearPayments: boolean;
+ nearPrice?: number;
+
+ // Step 1
+ eventName: { value: string; error?: string };
+ eventDescription: { value: string; error?: string };
+ eventLocation: { value: string; error?: string };
+ date: { value: DateAndTimeInfo; error?: string };
+ eventArtwork: { value: File | undefined; error?: string };
+
+ // Step 2
+ questions: Array<{ question: string; isRequired: boolean }>;
+
+ // Step 3
+ tickets: TicketInfoFormMetadata[];
+
+ costBreakdown: {
+ marketListing: string;
+ total: string;
+ perDrop: string;
+ perEvent: string;
+ };
+}
+
+const breadcrumbs: IBreadcrumbItem[] = [
{
- name: 'form',
- description: 'Enter the details for your new Ticket Drop',
- component: ,
+ name: 'My events',
+ href: '/events',
},
{
- name: 'summary',
- description: 'Let’s make sure all your details are correct',
- component: ,
+ name: 'Create event',
+ href: '/drops/ticket/new',
},
];
-const breadcrumbs: IBreadcrumbItem[] = [
+const formSteps: TicketStep[] = [
{
- name: 'My drops',
- href: '/drops',
+ name: 'stripePayments',
+ title: 'Payments',
+ description: 'Allow attendees to purchase with credit cards',
+ skippable: true,
+ canClearDetails: false,
+ component: (props: EventStepFormProps) => ,
},
{
- name: 'New Ticket Drop',
- href: '/drops/ticket/new',
+ name: 'eventInfo',
+ title: 'Event info',
+ description: 'Enter the details for your new event',
+ canClearDetails: true,
+ skippable: false,
+ component: (props: EventStepFormProps) => ,
+ },
+ {
+ name: 'collectInfo',
+ title: 'Attendee info',
+ description: 'Collect information from attendees (optional)',
+ canClearDetails: true,
+ skippable: true,
+ component: (props: EventStepFormProps) => ,
+ },
+ {
+ name: 'tickets',
+ title: 'Tickets',
+ description: 'Create tickets for your event',
+ canClearDetails: true,
+ skippable: false,
+ component: (props: EventStepFormProps) => ,
+ },
+ {
+ name: 'review',
+ title: 'Review',
+ description: 'Review the details of your event',
+ canClearDetails: false,
+ skippable: false,
+ component: (props: EventStepFormProps) => ,
},
];
+const placeholderData: TicketDropFormData = {
+ // Step 0
+ nearPrice: undefined,
+ stripeAccountId: undefined,
+ acceptStripePayments: false,
+ acceptNearPayments: true,
+ // Step 1
+ eventName: { value: '' },
+ eventArtwork: { value: undefined },
+ eventDescription: { value: '' },
+ eventLocation: { value: '' },
+ date: {
+ value: {
+ startDate: 0,
+ },
+ },
+
+ // Step 2
+ questions: [
+ { question: EMAIL_QUESTION, isRequired: true },
+ { question: 'Full name', isRequired: true },
+ { question: 'How did you find out about this event?', isRequired: false },
+ ],
+
+ // Step 3
+ tickets: [],
+ costBreakdown: {
+ perEvent: '0',
+ perDrop: '0',
+ total: '0',
+ marketListing: '0',
+ },
+};
+
export default function NewTicketDrop() {
+ const [currentStep, setCurrentStep] = useState(0);
+ const [isModalOpen, setIsModalOpen] = useState(false);
+
+ const [eventCreationSuccess, setEventCreationSuccess] = useState();
+ const [prevEventData, setPrevEventData] = useState<
+ | { priceByDropId?: Record; eventId: string; stripeAccountId?: string }
+ | undefined
+ >();
+
+ const [isSettingKey, setIsSettingKey] = useState(false);
+ const [formData, setFormData] = useState(placeholderData);
+ const { selector, accountId } = useAuthWalletContext();
+ const [wallet, setWallet] = useState();
+ const toast = useToast();
+
+ useEffect(() => {
+ async function fetchWallet() {
+ if (!selector) return;
+ try {
+ const wallet = await selector.wallet();
+ setWallet(wallet);
+ } catch (error) {
+ console.error('Error fetching wallet:', error);
+ // Handle the error appropriately
+ }
+ }
+
+ fetchWallet();
+ }, [selector]);
+
+ useEffect(() => {
+ async function checkForEventCreation() {
+ const eventData = localStorage.getItem('EVENT_INFO_SUCCESS_DATA');
+
+ if (eventData) {
+ const { eventId, stripeAccountId, priceByDropId } = JSON.parse(eventData);
+ setPrevEventData({ priceByDropId, eventId, stripeAccountId });
+
+ try {
+ await keypomInstance.viewCall({
+ contractId: KEYPOM_MARKETPLACE_CONTRACT,
+ methodName: 'get_event_information',
+ args: { event_id: eventId },
+ });
+ setEventCreationSuccess(true);
+ } catch (e) {
+ setEventCreationSuccess(false);
+ }
+
+ localStorage.removeItem('EVENT_INFO_SUCCESS_DATA');
+ }
+ }
+
+ checkForEventCreation();
+ }, []);
+
+ const handleClearForm = () => {
+ switch (currentStep) {
+ case 1:
+ setFormData((prev) => ({ ...prev, ...ClearEventInfoForm() }));
+ break;
+ case 2:
+ setFormData((prev) => ({
+ ...prev,
+ questions: [{ question: EMAIL_QUESTION, isRequired: true }],
+ }));
+ break;
+ case 3:
+ setFormData((prev) => ({ ...prev, tickets: [] }));
+ break;
+ default:
+ break;
+ }
+ };
+
+ const stepsDisplay = formSteps.map((step, index) => (
+
+ ));
+
+ const handleModalClose = async () => {
+ setIsSettingKey(true);
+ await estimateCosts({
+ accountId: accountId!,
+ formData,
+ setFormData,
+ setCurrentStep,
+ });
+ setIsSettingKey(false);
+ setIsModalOpen(false);
+ };
+
+ const payAndCreateEvent = async () => {
+ if (!wallet) return;
+
+ setIsSettingKey(true);
+ const serializedData = await serializeMediaForWorker(formData);
+
+ let response: Response | undefined;
+ try {
+ const url = `${EVENTS_WORKER_BASE}/ipfs-pin`;
+ response = await fetch(url, {
+ method: 'POST',
+ body: JSON.stringify({ base64Data: serializedData }),
+ });
+ } catch (error) {
+ // eslint-disable-next-line no-console
+ console.error('Error in payAndCreateEvent', error);
+ }
+
+ if (response?.ok) {
+ const resBody = await response.json();
+ const cids: string[] = resBody.cids;
+
+ const eventArtworkCid: string = cids[0];
+ const ticketArtworkCids: string[] = [];
+ for (let i = 0; i < cids.length - 1; i++) {
+ ticketArtworkCids.push(cids[i + 1]);
+ }
+
+ const eventId = Date.now().toString();
+ const { actions, dropIds }: { actions: Action[]; dropIds: string[] } = await createPayload({
+ accountId: accountId!,
+ formData,
+ eventId,
+ eventArtworkCid,
+ ticketArtworkCids,
+ });
+
+ // Store event name, stripe account ID, event ID, object mapping ticket drop ID to USD cents
+ // ONLY if the user has accepted stripe payments
+ if (formData.acceptStripePayments && formData.stripeAccountId) {
+ const stripeAccountId = formData.stripeAccountId;
+
+ const priceByDropId = {};
+ for (let i = 0; i < formData.tickets.length; i++) {
+ const ticketDropId = dropIds[i];
+ const priceCents = Math.round(
+ parseFloat(formData.tickets[i].priceNear) * formData.nearPrice! * 100,
+ );
+ priceByDropId[ticketDropId] = priceCents;
+ }
+ const stripeAccountInfo = {
+ stripeAccountId,
+ eventId,
+ priceByDropId,
+ };
+ localStorage.setItem('EVENT_INFO_SUCCESS_DATA', JSON.stringify(stripeAccountInfo));
+ } else {
+ localStorage.setItem('EVENT_INFO_SUCCESS_DATA', JSON.stringify({ eventId }));
+ }
+
+ await wallet.signAndSendTransaction({
+ signerId: accountId!,
+ receiverId: KEYPOM_EVENTS_CONTRACT,
+ actions,
+ });
+ } else {
+ toast({
+ title: 'Unable to upload event images',
+ description: `Please try again later. If the error persists, contact support.`,
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ }
+ setIsSettingKey(false);
+ };
+
+ const handleSkipped = () => {
+ setCurrentStep((prevStep) => prevStep + 1);
+ if (currentStep === 2) {
+ setFormData((prev) => ({
+ ...prev,
+ questions: [{ question: EMAIL_QUESTION, isRequired: true }],
+ }));
+ }
+ };
+
+ const nextStep = async () => {
+ if (currentStep === 4) {
+ payAndCreateEvent();
+ return;
+ }
+
+ if (currentStep === 3) {
+ const curMasterKey = get('MASTER_KEY');
+ if (curMasterKey) {
+ setIsSettingKey(true);
+ await estimateCosts({
+ accountId: accountId!,
+ setFormData,
+ formData,
+ setCurrentStep,
+ });
+ setIsSettingKey(false);
+ } else {
+ setIsModalOpen(true);
+ }
+ return;
+ }
+
+ let isErr = false;
+ if (currentStep === 1) {
+ const { isErr: eventInfoErr, newFormData } = EventInfoFormValidation(formData);
+ isErr = eventInfoErr;
+ setFormData(newFormData);
+ }
+ if (!isErr) {
+ setCurrentStep((prevStep) => prevStep + 1);
+ }
+ };
+
+ const prevStep = () => {
+ setCurrentStep((prevStep) => (prevStep > 0 ? prevStep - 1 : prevStep));
+ };
+
+ const isNextDisabled = () => {
+ if (currentStep === 0) {
+ return !formData.acceptStripePayments && !formData.acceptNearPayments;
+ }
+
+ if (currentStep === 3) {
+ return formData.tickets.length < 1;
+ }
+
+ return false;
+ };
+
+ const CurrentStepComponent = formSteps[currentStep].component({
+ formData,
+ setFormData,
+ accountId,
+ });
return (
-
-
-
-
-
-
-
+ <>
+
+ {
+ setEventCreationSuccess(undefined);
+ }}
+ />
+
+ }
+ maxW="full"
+ mx="auto"
+ px={{ base: '6', md: '8' }}
+ py={{ base: '6', md: '12' }}
+ >
+
+ {stepsDisplay}
+
+ {CurrentStepComponent}
+
+
+
+
+ {formSteps[currentStep].canClearDetails && (
+
+ )}
+
+
+ {formSteps[currentStep].skippable && (
+
+ )}
+
+
+
+
+ >
);
}
diff --git a/src/features/create-drop/types/types.ts b/src/features/create-drop/types/types.ts
index 506eb8e4..f0da643a 100644
--- a/src/features/create-drop/types/types.ts
+++ b/src/features/create-drop/types/types.ts
@@ -6,7 +6,7 @@ export interface SummaryItem {
export interface PaymentItem {
name: string;
- total: number;
+ total: number | string;
isDiscount?: boolean;
discountText?: string;
helperText?: string;
diff --git a/src/features/drop-manager/components/ConfirmationModal.tsx b/src/features/drop-manager/components/ConfirmationModal.tsx
index 330dd6c2..9cdfcc70 100644
--- a/src/features/drop-manager/components/ConfirmationModal.tsx
+++ b/src/features/drop-manager/components/ConfirmationModal.tsx
@@ -2,7 +2,7 @@ export const setConfirmationModalHelper = (setAppModal, confirm, type = 'key') =
setAppModal({
isOpen: true,
header: 'Are you sure?',
- message: `You are going to delete the ${type === 'key' ? 'key' : 'drop'}.`,
+ message: `You are going to delete the ${type}.`,
closeButtonVisible: true,
options: [
{
diff --git a/src/features/drop-manager/components/DropManager.tsx b/src/features/drop-manager/components/DropManager.tsx
index 4a7fc9e6..b5303d03 100644
--- a/src/features/drop-manager/components/DropManager.tsx
+++ b/src/features/drop-manager/components/DropManager.tsx
@@ -1,37 +1,48 @@
import {
+ Menu,
+ Show,
+ Hide,
+ Spinner,
+ Text,
+ Image,
+ VStack,
+ MenuList,
Box,
Button,
Heading,
HStack,
- Stack,
type TableProps,
- Text,
- Skeleton,
useToast,
+ useDisclosure,
} from '@chakra-ui/react';
-import { useCallback, useEffect, useMemo, useState } from 'react';
-import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
+import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import { useNavigate, useParams } from 'react-router-dom';
import { type ProtocolReturnedKeyInfo } from 'keypom-js';
import { type ColumnItem, type DataItem } from '@/components/Table/types';
import { DataTable } from '@/components/Table';
import { Breadcrumbs } from '@/components/Breadcrumbs';
-import { NextButton, PrevButton } from '@/components/Pagination';
import { file } from '@/utils/file';
import { useAuthWalletContext } from '@/contexts/AuthWalletContext';
import { useAppContext } from '@/contexts/AppContext';
import keypomInstance from '@/lib/keypom';
import { useValidMasterKey } from '@/hooks/useValidMasterKey';
-import { usePagination } from '@/hooks/usePagination';
-import { PAGE_QUERY_PARAM, PAGE_SIZE_LIMIT } from '@/constants/common';
-import getConfig from '@/config/config';
import { share } from '@/utils/share';
import { setMasterKeyValidityModal } from '@/features/drop-manager/components/MasterKeyValidityModal';
+import { PAGE_SIZE_LIMIT } from '@/constants/common';
+import { DropManagerPagination } from '@/features/all-drops/components/DropManagerPagination';
+import { DropDownButton } from '@/features/all-drops/components/DropDownButton';
+import { FilterOptionsMobileButton } from '@/features/all-drops/components/FilterOptionsMobileButton';
+import { MobileDrawerMenu } from '@/features/all-drops/components/MobileDrawerMenu';
-import { INITIAL_SAMPLE_DATA } from '../constants/common';
+import {
+ KEY_CLAIM_STATUS_OPTIONS,
+ KEY_CLAIM_STATUS_ITEMS,
+ PAGE_SIZE_ITEMS,
+ createMenuItems,
+} from '../../../features/all-drops/config/menuItems';
import { setConfirmationModalHelper } from './ConfirmationModal';
-import { setMissingDropModal } from './MissingDropModal';
export interface DropKeyItem {
id: number;
@@ -49,88 +60,66 @@ export type GetDataFn = (
) => DataItem[];
interface DropManagerProps {
- claimedHeaderText: string;
+ placeholderImage: string;
getClaimedText: (dropSize: number) => string;
tableColumns: ColumnItem[];
showColumns?: boolean;
getData: GetDataFn;
tableProps?: TableProps;
loading?: boolean;
+ dropImageSize?: string;
}
export const DropManager = ({
- claimedHeaderText,
+ placeholderImage,
getClaimedText,
tableColumns = [],
getData,
showColumns = true,
+ dropImageSize = '150px',
tableProps,
}: DropManagerProps) => {
- const [searchParams, setSearchParams] = useSearchParams();
const { id: dropId = '' } = useParams();
const navigate = useNavigate();
const toast = useToast();
const { setAppModal } = useAppContext();
const [wallet, setWallet] = useState({});
const { selector, accountId } = useAuthWalletContext();
+ const [dropData, setDropData] = useState<{
+ id: string;
+ name: string;
+ type: string;
+ media: string | undefined;
+ claimed: string;
+ }>({
+ id: '',
+ name: '',
+ type: '',
+ media: 'loading',
+ claimed: '',
+ });
const [loading, setLoading] = useState(true);
+ const [isAllKeysLoading, setIsAllKeysLoading] = useState(true);
+
+ const popoverClicked = useRef(0);
+ const { isOpen, onOpen, onClose } = useDisclosure();
const [name, setName] = useState('Untitled');
- const [dropKeys, setDropKeys] = useState([INITIAL_SAMPLE_DATA[0]]);
const [totalKeys, setTotalKeys] = useState(0);
const [deleting, setDeleting] = useState(false);
const [exporting, setExporting] = useState(false);
- const {
- setPagination,
- hasPagination,
- pagination,
- isFirstPage,
- isLastPage,
- loading: paginationLoading,
- handleNextPage,
- handlePrevPage,
- } = usePagination({
- dataSize: totalKeys,
- handlePrevApiCall: async () => {
- const prevPageIndex = pagination.pageIndex - 1;
- await handleGetDrops({
- pageIndex: prevPageIndex,
- pageSize: pagination.pageSize,
- });
- const newQueryParams = new URLSearchParams({
- [PAGE_QUERY_PARAM]: (prevPageIndex + 1).toString(),
- });
- setSearchParams(newQueryParams);
- },
- handleNextApiCall: async () => {
- const nextPageIndex = pagination.pageIndex + 1;
- await handleGetDrops({
- pageIndex: nextPageIndex,
- pageSize: pagination.pageSize,
- });
- const newQueryParams = new URLSearchParams({
- [PAGE_QUERY_PARAM]: (nextPageIndex + 1).toString(),
- });
- setSearchParams(newQueryParams);
- },
+ const [numPages, setNumPages] = useState(0);
+ const [curPage, setCurPage] = useState(0);
+ const [selectedFilters, setSelectedFilters] = useState<{
+ status: string;
+ pageSize: number;
+ }>({
+ status: KEY_CLAIM_STATUS_OPTIONS.ANY,
+ pageSize: PAGE_SIZE_LIMIT,
});
- const getWallet = async () => {
- if (selector === null) {
- return;
- }
- try {
- const selectorWallet = await selector?.wallet();
- setWallet(selectorWallet);
- } catch (err) {
- console.log(err);
- }
- };
-
- useEffect(() => {
- getWallet();
- }, [selector]);
+ const [filteredDropKeys, setFilteredDropKeys] = useState([]);
const { masterKeyValidity } = useValidMasterKey({ dropId });
useEffect(() => {
@@ -147,53 +136,125 @@ export const DropManager = ({
}
}, [masterKeyValidity]);
- const handleGetDrops = useCallback(
- async ({ pageIndex = 0, pageSize = PAGE_SIZE_LIMIT }) => {
- if (!accountId) return;
- const keyInfoReturn = await keypomInstance.getKeysInfo(dropId, pageIndex, pageSize, () => {
- setMissingDropModal(setAppModal); // User will be redirected if getDropInformation fails
- navigate('/drops');
- });
- if (
- keyInfoReturn === undefined ||
- keyInfoReturn?.secretKeys === undefined ||
- keyInfoReturn?.publicKeys === undefined
- ) {
- navigate('/drops');
- return;
- }
- const { dropSize, dropName, publicKeys, secretKeys, keyInfo } = keyInfoReturn;
- setTotalKeys(dropSize);
- setName(dropName);
-
- setDropKeys(
- secretKeys.map((key: string, i) => ({
- id: i,
- publicKey: publicKeys[i],
- link: `${window.location.origin}/claim/${getConfig().contractId}#${key.replace(
- 'ed25519:',
- '',
- )}`,
- slug: key.substring(8, 16),
- hasClaimed: keyInfo[i] === null,
- keyInfo: keyInfo[i],
- })),
- );
+ useEffect(() => {
+ if (!keypomInstance || !dropId) return;
- setLoading(false);
- },
- [pagination],
- );
+ handleDropData(dropId);
+ }, [keypomInstance, dropId]);
useEffect(() => {
- // page query param should be indexed from 1
- const pageQuery = searchParams.get('page');
- const currentPageIndex = pageQuery !== null ? parseInt(pageQuery) - 1 : 0;
- setPagination((pagination) => ({ ...pagination, pageIndex: currentPageIndex }));
+ if (!accountId) return;
- handleGetDrops({ ...pagination, pageIndex: currentPageIndex });
+ // First get enough data with the current filters to fill the page size
+ handleGetInitialKeys();
}, [accountId]);
+ useEffect(() => {
+ if (!accountId) return;
+
+ // In parallel, fetch all the drops
+ handleGetAllKeys();
+ }, [accountId, selectedFilters]);
+
+ useEffect(() => {
+ async function fetchWallet() {
+ if (!selector) return;
+ try {
+ const wallet = await selector.wallet();
+ setWallet(wallet);
+ } catch (error) {
+ console.error('Error fetching wallet:', error);
+ // Handle the error appropriately
+ }
+ }
+
+ fetchWallet();
+ }, [selector]);
+
+ const getTableType = () => {
+ if (filteredDropKeys.length === 0 && totalKeys === 0) {
+ return 'drop-manager';
+ }
+ return 'no-filtered-keys';
+ };
+
+ const handleDropData = async (dropId) => {
+ const dropData = await keypomInstance.getDropData({ dropId });
+ setName(dropData.name);
+ setDropData(dropData);
+ };
+
+ const handleFiltering = (keys) => {
+ if (selectedFilters.status !== KEY_CLAIM_STATUS_OPTIONS.ANY) {
+ keys = keys.filter((key) => {
+ if (selectedFilters.status === KEY_CLAIM_STATUS_OPTIONS.CLAIMED) {
+ return key.hasClaimed;
+ } else {
+ return !key.hasClaimed;
+ }
+ });
+ }
+ return keys;
+ };
+
+ const handleGetAllKeys = useCallback(async () => {
+ setIsAllKeysLoading(true);
+ const keyInfoReturn = await keypomInstance.getAllKeysInfo({ dropId });
+ const { dropKeyItems } = keyInfoReturn;
+ const filteredKeys = handleFiltering(dropKeyItems);
+ setFilteredDropKeys(filteredKeys);
+
+ const totalPages = Math.ceil(filteredKeys.length / selectedFilters.pageSize);
+ setNumPages(totalPages);
+
+ setCurPage(0);
+ setIsAllKeysLoading(false);
+ }, [accountId, selectedFilters, keypomInstance]);
+
+ const handleGetInitialKeys = useCallback(async () => {
+ setLoading(true);
+
+ const dropInfo = await keypomInstance.getDropInfo({ dropId });
+ const totalKeySupply = dropInfo.next_key_id;
+ setTotalKeys(totalKeySupply);
+
+ // Loop until we have enough filtered drops to fill the page size
+ let keysFetched = 0;
+ let filteredKeys = [];
+ while (keysFetched < totalKeySupply && filteredKeys.length < selectedFilters.pageSize) {
+ const dropKeyItems = await keypomInstance.getPaginatedKeysInfo({
+ dropId,
+ start: keysFetched,
+ limit: selectedFilters.pageSize,
+ });
+
+ keysFetched += dropKeyItems.length;
+
+ const curFiltered = handleFiltering(dropKeyItems);
+ filteredKeys = filteredKeys.concat(curFiltered);
+ }
+
+ if (filteredKeys.length !== 0) {
+ setFilteredDropKeys(filteredKeys);
+ }
+ setCurPage(0);
+ setLoading(false);
+ }, [accountId, selectedFilters, keypomInstance]);
+
+ const pageSizeMenuItems = createMenuItems({
+ menuItems: PAGE_SIZE_ITEMS,
+ onClick: (item) => {
+ handlePageSizeSelect(item);
+ },
+ });
+
+ const keyClaimStatusMenuItems = createMenuItems({
+ menuItems: KEY_CLAIM_STATUS_ITEMS,
+ onClick: (item) => {
+ handleKeyClaimStatusSelect(item);
+ },
+ });
+
const breadcrumbItems = [
{
name: 'My drops',
@@ -205,6 +266,28 @@ export const DropManager = ({
},
];
+ const handlePageSizeSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ pageSize: parseInt(item.label),
+ }));
+ };
+
+ const handleKeyClaimStatusSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ status: item.label,
+ }));
+ };
+
+ const handleNextPage = () => {
+ setCurPage((prev) => prev + 1);
+ };
+
+ const handlePrevPage = () => {
+ setCurPage((prev) => prev - 1);
+ };
+
const handleExportCSVClick = async () => {
if (data.length > 0) {
setExporting(true);
@@ -237,7 +320,6 @@ export const DropManager = ({
},
'drop',
);
- console.log('deleting drop', dropId);
setDeleting(false);
}
};
@@ -263,89 +345,207 @@ export const DropManager = ({
};
const data = useMemo(
- () => getData(dropKeys, handleDeleteClick, handleCopyClick),
- [getData, dropKeys, dropKeys.length, handleCopyClick, handleDeleteClick],
+ () =>
+ getData(
+ filteredDropKeys.slice(
+ curPage * selectedFilters.pageSize,
+ (curPage + 1) * selectedFilters.pageSize,
+ ),
+ handleDeleteClick,
+ handleCopyClick,
+ ),
+ [getData, filteredDropKeys, filteredDropKeys.length, handleCopyClick, handleDeleteClick],
);
const allowAction = data.length > 0;
+ const mobileCancelButton = (
+
+ );
+
return (
-
- {/* Left Section */}
-
-
- {/* Drop name */}
-
- Drop name
-
- {name}
-
-
-
- {/* Drops claimed */}
-
- {claimedHeaderText}
-
- {getClaimedText(totalKeys)}
-
-
-
- Track link status and export them to CSV for use in email campaigns here.
-
-
- {/* Right Section */}
-
- {hasPagination && (
-
+
+ {dropData.media === 'loading' ? (
+
+ ) : (
+ {
+ // eslint-disable-next-line no-console
+ console.warn('error loading image', e);
+ setDropData((prev) => ({ ...prev, media: placeholderImage }));
+ }}
/>
)}
-
-
+
+
- Export .CSV
-
- {hasPagination && (
-
- )}
+
+ {' '}
+ {/* Adjust spacing as needed */}
+
+ Claimed
+
+ {getClaimedText(totalKeys)}
+
+
+
+
+
+ {/* Desktop Menu */}
+
+
+
+ All Keys
+
+ {/* Right Section */}
+
+
+
+
+
-
+
+
+ {/* Mobile Menu */}
+
+
+
+ All Keys
+
+
+
+
+
+
+
+
+
+
+ (popoverClicked.current += 1)}
+ />
+
+ {/* Mobile Popup Menu For Filtering */}
+
);
};
diff --git a/src/features/drop-manager/components/ExportToCsv.tsx b/src/features/drop-manager/components/ExportToCsv.tsx
new file mode 100644
index 00000000..e351d7f3
--- /dev/null
+++ b/src/features/drop-manager/components/ExportToCsv.tsx
@@ -0,0 +1,93 @@
+import { type EventDrop } from '@/lib/eventsHelpers';
+import { type AttendeeKeyItem } from '@/lib/keypom';
+
+import { type EventData } from '../routes/events/EventManagerPage';
+import { CLAIM_STATUS } from '../routes/ticket/TicketDropManagerPage';
+
+export const handleExportCSVClick = async ({
+ dropIds,
+ setExporting,
+ keypomInstance,
+ setIsCorrectMasterKey,
+ userKey,
+ eventData,
+}: {
+ dropIds: string[];
+ setExporting: any;
+ keypomInstance: any;
+ setIsCorrectMasterKey: any;
+ userKey?: string;
+ eventData?: EventData;
+}) => {
+ if (dropIds.length > 0) {
+ setExporting(true);
+ for (let i = 0; i < dropIds.length; i++) {
+ const dropId = dropIds[i];
+ const {
+ dropInfo,
+ dropKeyItems: data,
+ }: { dropInfo: EventDrop; dropKeyItems: AttendeeKeyItem[] } =
+ await keypomInstance.getAllKeysForTicket({
+ dropId,
+ });
+
+ try {
+ // Construct CSV header
+ const questions = eventData?.questions || [];
+ if (questions.length !== 0) {
+ if (!userKey) {
+ setIsCorrectMasterKey(false);
+ return;
+ }
+ }
+ let csvContent = 'data:text/csv;charset=utf-8,';
+ csvContent +=
+ 'Ticket ID,' + 'Claim Status,' + questions.map((q) => q.question).join(',') + '\r\n';
+
+ // Construct CSV rows
+ await Promise.all(
+ data.map(async (item, i) => {
+ const row = [item.pub_key.split('ed25519:')[1]];
+ row.push(CLAIM_STATUS[item.uses_remaining].name);
+ if (userKey) {
+ const decryptedMeta = await keypomInstance.decryptMetadata({
+ data: item.metadata,
+ privKey: userKey,
+ });
+ const responses = JSON.parse(decryptedMeta).questions || {};
+ // Add answers in the same order as the questions
+ questions.forEach((q) => {
+ row.push(responses[q.question] || '-');
+ });
+ }
+ // Join the individual row's columns and push it to CSV content
+ csvContent += row.join(',') + '\r\n';
+ }),
+ );
+
+ // Encode the CSV content
+ const encodedUri = encodeURI(csvContent);
+
+ // Create a link to download the CSV file
+ const link = document.createElement('a');
+ link.setAttribute('href', encodedUri);
+ link.setAttribute(
+ 'download',
+ `${(eventData?.name || '')
+ .toLowerCase()
+ .replaceAll(' ', '_')}-${dropInfo.drop_config.nft_keys_config.token_metadata.title
+ .toLowerCase()
+ .replaceAll(' ', '_')}.csv`,
+ );
+ document.body.appendChild(link); // Required for FF
+
+ link.click(); // This will download the CSV file
+ document.body.removeChild(link); // Clean up
+ } catch (e) {
+ console.error('error', e);
+ } finally {
+ setExporting(false);
+ }
+ }
+ }
+};
diff --git a/src/features/drop-manager/components/TableColumn.tsx b/src/features/drop-manager/components/TableColumn.tsx
index d2e5e54d..cc47d215 100644
--- a/src/features/drop-manager/components/TableColumn.tsx
+++ b/src/features/drop-manager/components/TableColumn.tsx
@@ -11,7 +11,7 @@ export const tableColumns: ColumnItem[] = [
},
{
id: 'claimStatus',
- title: 'Claim Status',
+ title: 'Status',
selector: (row) => row.hasClaimed,
loadingElement: ,
},
diff --git a/src/features/drop-manager/constants/placeholder-image.png b/src/features/drop-manager/constants/placeholder-image.png
new file mode 100644
index 00000000..226bec1b
Binary files /dev/null and b/src/features/drop-manager/constants/placeholder-image.png differ
diff --git a/src/features/drop-manager/constants/token-placeholder.png b/src/features/drop-manager/constants/token-placeholder.png
new file mode 100644
index 00000000..23327ae0
Binary files /dev/null and b/src/features/drop-manager/constants/token-placeholder.png differ
diff --git a/src/features/drop-manager/routes/events/EventManagerPage.tsx b/src/features/drop-manager/routes/events/EventManagerPage.tsx
new file mode 100644
index 00000000..a6fd550d
--- /dev/null
+++ b/src/features/drop-manager/routes/events/EventManagerPage.tsx
@@ -0,0 +1,630 @@
+import {
+ Box,
+ Divider,
+ Button,
+ Heading,
+ Hide,
+ HStack,
+ ModalHeader,
+ ModalBody,
+ ModalFooter,
+ Image,
+ Show,
+ Skeleton,
+ Spinner,
+ Text,
+ VStack,
+ ModalContent,
+ useToast,
+} from '@chakra-ui/react';
+import { useCallback, useEffect, useMemo, useState } from 'react';
+import { useNavigate, useParams } from 'react-router-dom';
+import { type Wallet } from '@near-wallet-selector/core';
+
+import { share } from '@/utils/share';
+import { get } from '@/utils/localStorage';
+import { CopyIcon, DeleteIcon } from '@/components/Icons';
+import { type ColumnItem, type DataItem } from '@/components/Table/types';
+import { DataTable } from '@/components/Table';
+import { Breadcrumbs } from '@/components/Breadcrumbs';
+import { useAuthWalletContext } from '@/contexts/AuthWalletContext';
+import { useAppContext } from '@/contexts/AppContext';
+import keypomInstance from '@/lib/keypom';
+import { MASTER_KEY } from '@/constants/common';
+import {
+ type QuestionInfo,
+ type DateAndTimeInfo,
+ type TicketMetadataExtra,
+ type EventDrop,
+} from '@/lib/eventsHelpers';
+import { ShareIcon } from '@/components/Icons/ShareIcon';
+import { NotFound404 } from '@/components/NotFound404';
+import useDeletion from '@/components/AppModal/useDeletion';
+import { performDeletionLogic } from '@/components/AppModal/PerformDeletion';
+
+import { handleExportCSVClick } from '../../components/ExportToCsv';
+import { dateAndTimeToText } from '../../utils/parseDates';
+
+export interface EventData {
+ name: string;
+ artwork: string;
+ questions: QuestionInfo[];
+}
+
+export interface TicketItem {
+ id: string;
+ artwork: string;
+ name: string;
+ description: string;
+ salesValidThrough: DateAndTimeInfo;
+ passValidThrough: DateAndTimeInfo;
+ maxTickets?: number;
+ soldTickets: number;
+ priceNear: string;
+}
+
+export type GetTicketDataFn = (
+ data: TicketItem[],
+ handleDelete: (pubKey: string) => Promise,
+) => DataItem[];
+
+const eventTableColumns: ColumnItem[] = [
+ {
+ id: 'ticketName',
+ title: 'Ticket name',
+ selector: (row) => row.name,
+ loadingElement: ,
+ },
+ {
+ id: 'numTickets',
+ title: 'Tickets sold',
+ selector: (row) => {
+ // Ensure that soldTickets is a number or can be coerced to a string safely
+ const soldTickets = String(row.soldTickets);
+
+ // Check if maxTickets is a number, otherwise use the infinity symbol
+ const maxTickets = typeof row.maxTickets === 'number' ? row.maxTickets : '\u221E';
+
+ return `${soldTickets}/${maxTickets}`;
+ },
+ loadingElement: ,
+ },
+ {
+ id: 'price',
+ title: 'Price (NEAR)',
+ selector: (row) => row.priceNear,
+ loadingElement: ,
+ },
+ {
+ id: 'action',
+ title: '',
+ selector: (row) => row.action,
+ loadingElement: ,
+ },
+];
+
+export default function EventManagerPage() {
+ const { id: eventId = '' } = useParams();
+ const toast = useToast();
+
+ const navigate = useNavigate();
+ const { setAppModal } = useAppContext();
+ const [wallet, setWallet] = useState();
+ const [isLoading, setIsLoading] = useState(true);
+ const [isErr, setIsErr] = useState(false);
+ const [isCorrectMasterKey, setIsCorrectMasterKey] = useState(true);
+ const [userKey, setUserKey] = useState();
+
+ const [exporting, setExporting] = useState(false);
+
+ const [ticketData, setTicketData] = useState([]);
+
+ const [eventData, setEventData] = useState();
+ const { selector, accountId } = useAuthWalletContext();
+
+ useEffect(() => {
+ if (eventId === '') navigate('/drops');
+ if (!accountId) return;
+ if (!eventId) return;
+
+ const getEventData = async () => {
+ const eventInfo = await keypomInstance.getEventInfo({ accountId, eventId });
+ if (!eventInfo) {
+ setIsErr(true);
+ return;
+ }
+ if (eventInfo?.questions) {
+ try {
+ const privKey = await keypomInstance.getDerivedPrivKey({
+ encryptedPk: eventInfo.encPrivKey!,
+ ivBase64: eventInfo.iv!,
+ saltBase64: eventInfo.salt!,
+ pw: get(MASTER_KEY) as string,
+ });
+ setUserKey(privKey);
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ setEventData({
+ name: eventInfo.name || 'Untitled',
+ artwork: eventInfo.artwork || 'loading',
+ questions: eventInfo.questions || [],
+ });
+ };
+ try {
+ getEventData();
+ } catch (e) {
+ console.error(e);
+ setIsErr(true);
+ }
+ }, [eventId, selector, accountId]);
+
+ const handleClosePwModal = () => {
+ setAppModal({ isOpen: false });
+ navigate(`/events`);
+ };
+
+ useEffect(() => {
+ if (!isCorrectMasterKey) {
+ setAppModal({
+ isOpen: true,
+ size: 'xl',
+ modalContent: (
+
+ Incorrect Site Password
+
+
+
+
+ The site password you entered is incorrect. Please change it in your user profile
+ settings.
+
+
+ Without the correct password, you will not be able to view attendee information.
+
+
+
+
+
+
+
+ ),
+ });
+ }
+ }, [isCorrectMasterKey]);
+
+ useEffect(() => {
+ if (!keypomInstance || !eventId || !accountId) return;
+
+ handleGetAllTickets();
+ }, [keypomInstance, eventId, accountId]);
+
+ useEffect(() => {
+ async function fetchWallet() {
+ if (!selector) return;
+ try {
+ const wallet = await selector.wallet();
+ setWallet(wallet);
+ } catch (error) {
+ console.error('Error fetching wallet:', error);
+ // Handle the error appropriately
+ }
+ }
+
+ fetchWallet();
+ }, [selector]);
+
+ const getSoldKeys = () => {
+ return ticketData.reduce((acc, ticket) => acc + ticket.soldTickets, 0);
+ };
+
+ const breadcrumbItems = [
+ {
+ name: 'My events',
+ href: '/events',
+ },
+ {
+ name: eventData?.name || '',
+ href: '/events',
+ },
+ ];
+
+ const handleGetAllTickets = useCallback(async () => {
+ try {
+ setIsLoading(true);
+ const ticketsForEvent: EventDrop[] = await keypomInstance.getTicketsForEventId({
+ accountId: accountId!,
+ eventId,
+ });
+
+ if (ticketsForEvent == null || ticketsForEvent.length === 0) {
+ setIsErr(true);
+ setIsLoading(false);
+ return;
+ }
+
+ const promises = ticketsForEvent.map(async (ticket) => {
+ const nftObject = ticket.drop_config.nft_keys_config.token_metadata;
+ const meta: TicketMetadataExtra = JSON.parse(nftObject.extra);
+ const supply = await keypomInstance.getKeySupplyForTicket(ticket.drop_id);
+ return {
+ id: ticket.drop_id,
+ artwork: nftObject.media,
+ name: nftObject.title,
+ description: nftObject.description,
+ salesValidThrough: meta.salesValidThrough,
+ passValidThrough: meta.passValidThrough,
+ maxTickets: meta.maxSupply,
+ soldTickets: supply,
+ priceNear: keypomInstance.yoctoToNear(meta.price),
+ };
+ });
+
+ const ticketData = await Promise.all(promises);
+
+ setTicketData(ticketData);
+ setIsLoading(false);
+ } catch (e) {
+ console.error('Error fetching tickets:', e);
+ setIsErr(true);
+ setIsLoading(false);
+ }
+ }, [accountId, keypomInstance]);
+
+ const handleDeleteClick = async (dropId) => {
+ if (!wallet) return;
+
+ const ticketData = await keypomInstance.viewCall({
+ methodName: 'get_drop_information',
+ args: { drop_id: dropId },
+ });
+
+ const deletionArgs = {
+ wallet,
+ accountId,
+ navigate,
+ eventId,
+ ticketData: [ticketData],
+ deleteAll: ticketData.length <= 1,
+ setAppModal,
+ };
+
+ // Open the confirmation modal with customization if needed
+ openConfirmationModal(
+ deletionArgs,
+ 'Are you sure you want to delete this ticket type? Any purchased tickets will be lost.',
+ performDeletionLogic,
+ );
+ };
+
+ const handleDeleteAllClick = async () => {
+ if (!wallet || !eventId) return;
+
+ const ticketData = await keypomInstance.getTicketsForEventId({
+ accountId: accountId!,
+ eventId,
+ });
+
+ const deletionArgs = {
+ wallet,
+ accountId,
+ navigate,
+ eventId,
+ deleteAll: true,
+ ticketData,
+ setAppModal,
+ };
+
+ // Open the confirmation modal with customization if needed
+ openConfirmationModal(
+ deletionArgs,
+ 'Are you sure you want to delete this event and all its tickets? This action cannot be undone.',
+ performDeletionLogic,
+ );
+ };
+
+ const { openConfirmationModal } = useDeletion({
+ setAppModal,
+ });
+
+ const getTableRows: GetTicketDataFn = (data, handleDeleteClick) => {
+ if (data === undefined) return [];
+
+ return data.map((item) => ({
+ id: item.id, // Assuming `item` has a `drop_id` property that can serve as `id`
+ name: (
+
+
+
+
+ {item.name}
+
+
+ {item.description}
+
+
+
+ Purchase through: {dateAndTimeToText(item.salesValidThrough)}
+
+
+ Valid through: {dateAndTimeToText(item.passValidThrough)}
+
+
+
+
+ ),
+ soldTickets: item.soldTickets,
+ maxTickets: item.maxTickets,
+ priceNear: item.priceNear,
+ action: (
+
+
+
+
+ ),
+ href: `/events/ticket/${(item.id || '').toString()}`,
+ }));
+ };
+
+ const handleScanPageCopyClick = () => {
+ const link = `${window.location.origin}/scan/event/${accountId}:${(eventId || '').toString()}`;
+ share(link);
+ toast({ title: 'Copied!', status: 'success', duration: 1000, isClosable: true });
+ };
+
+ const handleScanPageShareClick = () => {
+ const url = `/scan/event/${accountId}:${(eventId || '').toString()}`;
+ window.open(url, '_blank');
+ };
+
+ const data = useMemo(
+ () => getTableRows(ticketData, handleDeleteClick),
+ [getTableRows, ticketData, ticketData.length, handleDeleteClick],
+ );
+
+ const allowAction = data.length > 0;
+
+ if (isErr) {
+ return (
+
+ );
+ }
+
+ return (
+
+
+ {/* Drop info section */}
+
+
+
+ {!eventData?.artwork ? (
+
+ ) : (
+
+ )}
+
+ {' '}
+ {/* Align items to the left */}
+ Event Name
+ {eventData?.name}
+
+
+
+ {' '}
+ {/* Align items to the right */}
+
+
+
+
+
+
+ Scan Tickets
+
+
+
+
+
+
+
+ {' '}
+ {/* Adjust spacing as needed */}
+
+ Tickets Sold
+
+ {getSoldKeys()}
+
+
+
+
+ {/* Desktop Menu */}
+
+
+
+ All tickets
+
+ {/* Right Section */}
+
+
+
+
+
+
+ {/* Mobile Menu */}
+
+
+
+ All tickets
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/features/drop-manager/routes/nft/NFTDropManagerPage.tsx b/src/features/drop-manager/routes/nft/NFTDropManagerPage.tsx
index dfdc54c1..7c2106d7 100644
--- a/src/features/drop-manager/routes/nft/NFTDropManagerPage.tsx
+++ b/src/features/drop-manager/routes/nft/NFTDropManagerPage.tsx
@@ -6,6 +6,7 @@ import { CopyIcon, DeleteIcon } from '@/components/Icons';
import { DropManager, type GetDataFn } from '@/features/drop-manager/components/DropManager';
import keypomInstance from '@/lib/keypom';
+import placeholderImage from '../../constants/placeholder-image.png';
import { tableColumns } from '../../components/TableColumn';
export default function NFTDropManagerPage() {
@@ -48,8 +49,9 @@ export default function NFTDropManagerPage() {
action: (
<>
{!item.hasClaimed && (
)}
>
@@ -75,10 +78,10 @@ export default function NFTDropManagerPage() {
return (
`${dropSize - availableKeys} / ${dropSize}`}
+ getClaimedText={(dropSize) => `${dropSize - availableKeys}/${dropSize}`}
getData={getTableRows}
- showColumns={false}
+ placeholderImage={placeholderImage}
+ showColumns={true}
tableColumns={tableColumns}
/>
);
diff --git a/src/features/drop-manager/routes/ticket/TicketDropManagerPage.tsx b/src/features/drop-manager/routes/ticket/TicketDropManagerPage.tsx
index e17a28fc..db973360 100644
--- a/src/features/drop-manager/routes/ticket/TicketDropManagerPage.tsx
+++ b/src/features/drop-manager/routes/ticket/TicketDropManagerPage.tsx
@@ -1,108 +1,907 @@
-import { Button, Text } from '@chakra-ui/react';
-import { useEffect, useState } from 'react';
+import {
+ Box,
+ Input,
+ Divider,
+ Badge,
+ Icon,
+ Button,
+ Heading,
+ Hide,
+ HStack,
+ ModalHeader,
+ ModalBody,
+ ModalFooter,
+ Image,
+ InputGroup,
+ InputLeftElement,
+ Menu,
+ MenuList,
+ Show,
+ Skeleton,
+ Spinner,
+ Text,
+ VStack,
+ useDisclosure,
+ ModalContent,
+} from '@chakra-ui/react';
+import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
+import { SearchIcon } from '@chakra-ui/icons';
-import { CopyIcon, DeleteIcon } from '@/components/Icons';
-import { DropManager, type GetDataFn } from '@/features/drop-manager/components/DropManager';
-import keypomInstance from '@/lib/keypom';
+import { get } from '@/utils/localStorage';
+import { truncateAddress } from '@/utils/truncateAddress';
+import { useAuthWalletContext } from '@/contexts/AuthWalletContext';
+import keypomInstance, { type AttendeeKeyItem } from '@/lib/keypom';
+import {
+ type QuestionInfo,
+ type FunderEventMetadata,
+ type EventDrop,
+ type TicketMetadataExtra,
+} from '@/lib/eventsHelpers';
+import { type ColumnItem, type DataItem } from '@/components/Table/types';
+import { Breadcrumbs } from '@/components/Breadcrumbs';
+import { DropDownButton } from '@/features/all-drops/components/DropDownButton';
+import { FilterOptionsMobileButton } from '@/features/all-drops/components/FilterOptionsMobileButton';
+import { DataTable } from '@/components/Table';
+import { DropManagerPagination } from '@/features/all-drops/components/DropManagerPagination';
+import { MobileDrawerMenu } from '@/features/all-drops/components/MobileDrawerMenu';
+import { CLOUDFLARE_IPFS, MASTER_KEY, PAGE_SIZE_LIMIT } from '@/constants/common';
+import {
+ createMenuItems,
+ PAGE_SIZE_ITEMS,
+ TICKET_CLAIM_STATUS_ITEMS,
+ TICKET_CLAIM_STATUS_OPTIONS,
+} from '@/features/all-drops/config/menuItems';
+import { useAppContext } from '@/contexts/AppContext';
+import { NotFound404 } from '@/components/NotFound404';
-import { getClaimStatus } from '../../utils/getClaimStatus';
-import { getBadgeType } from '../../utils/getBadgeType';
-import { tableColumns } from '../../components/TableColumn';
+import { handleExportCSVClick } from '../../components/ExportToCsv';
-export default function TicketDropManagerPage() {
+const ticketTableColumns: ColumnItem[] = [
+ {
+ id: 'ticketId',
+ title: 'Ticket ID',
+ selector: (row) => row.ticketId,
+ loadingElement: ,
+ },
+ {
+ id: 'status',
+ title: 'Status',
+ selector: (row) => row.claimedStatus,
+ loadingElement: ,
+ },
+ {
+ id: 'action',
+ title: '',
+ selector: (row) => row.action,
+ tdProps: {
+ display: 'flex',
+ justifyContent: 'right',
+ verticalAlign: 'middle',
+ },
+ loadingElement: ,
+ },
+];
+
+export const CLAIM_STATUS = {
+ 2: {
+ name: 'Purchased',
+ bg: 'gray.100',
+ text: 'gray.600',
+ },
+ 1: {
+ name: 'Scanned',
+ bg: 'green.50',
+ text: 'green.600',
+ },
+};
+
+export interface AttendeeItem {
+ id: string;
+ usesRemaining: number;
+ publicKey: string;
+ responses: Record;
+}
+
+export type GetAttendeeDataFn = (data: AttendeeItem[]) => DataItem[];
+
+export default function TicketManagerPage() {
const navigate = useNavigate();
+ const { isOpen, onOpen, onClose } = useDisclosure();
+ const { setAppModal } = useAppContext();
const { id: dropId = '' } = useParams();
+ const [isErr, setIsErr] = useState(false);
+ const [isCorrectMasterKey, setIsCorrectMasterKey] = useState(true);
+ const [eventInfo, setEventInfo] = useState();
+ const [dataTableQuestionIds, setDataTableQuestionIds] = useState([]);
+ const [ticketsPurchased, setTicketsPurchased] = useState(0);
+ const [tableColumns, setTableColumns] = useState(ticketTableColumns);
+ const [ticketsScanned, setTicketsScanned] = useState(0);
+ const [dropData, setDropData] = useState();
+
+ const [exporting, setExporting] = useState(false);
+ const [numPages, setNumPages] = useState(0);
+ const [curPage, setCurPage] = useState(0);
+ const [filteredTicketData, setFilteredTicketData] = useState([]);
+ const [isLoading, setIsLoading] = useState(true);
+ const [isAllKeysLoading, setIsAllKeysLoading] = useState(true);
+ const [allowExport, setAllowExport] = useState(false);
+ const [searchTerm, setSearchTerm] = useState('');
+ const [userKey, setUserKey] = useState();
+ const [selectedFilters, setSelectedFilters] = useState<{
+ search: string;
+ status: string;
+ pageSize: number;
+ }>({
+ search: '',
+ status: TICKET_CLAIM_STATUS_OPTIONS.ANY,
+ pageSize: PAGE_SIZE_LIMIT,
+ });
+
+ const popoverClicked = useRef(0);
- const [scannedAndClaimed, setScannedAndClaimed] = useState(0);
+ const { selector, accountId } = useAuthWalletContext();
+
+ const handleClosePwModal = () => {
+ setAppModal({ isOpen: false });
+ navigate(eventInfo ? `/events/event/${eventInfo.id}` : `/events`);
+ };
+
+ useEffect(() => {
+ setAllowExport(
+ filteredTicketData.length > 0 && (eventInfo!.questions || []).length > 0
+ ? userKey !== undefined
+ : true,
+ );
+ }, [filteredTicketData, userKey, eventInfo]);
+
+ useEffect(() => {
+ if (!isCorrectMasterKey) {
+ setAppModal({
+ isOpen: true,
+ size: 'xl',
+ modalContent: (
+
+ Incorrect Site Password
+
+
+
+
+ The site password you entered is incorrect. Please change it in your user profile
+ settings.
+
+
+ Without the correct password, you will not be able to view attendee information.
+
+
+
+
+
+
+
+ ),
+ });
+ }
+ }, [isCorrectMasterKey]);
useEffect(() => {
if (dropId === '') navigate('/drops');
- }, [dropId]);
+ if (!accountId) return;
+ if (!dropId) return;
- const getScannedKeys = async () => {
- const keysSupply = await keypomInstance.getAvailableKeys(dropId);
- const getScannedInner = async (scanned = 0, index = 0) => {
- const drop = await keypomInstance.getDropInfo({ dropId });
+ const getDropData = async () => {
+ try {
+ const drop: EventDrop = await keypomInstance.viewCall({
+ methodName: 'get_drop_information',
+ args: { drop_id: dropId },
+ });
+ drop.drop_config.nft_keys_config.token_metadata.media = `${CLOUDFLARE_IPFS}/${drop.drop_config.nft_keys_config.token_metadata.media}`;
- const size = 200; // max limit is 306
+ setDropData(drop);
+ } catch (e) {
+ console.error('error', e);
+ setIsErr(true);
+ }
+ };
+ getDropData();
+ }, [dropId, selector, accountId]);
- if (index * size >= drop.next_key_id) return;
+ useEffect(() => {
+ if (dropId === '') navigate('/drops');
+ if (!accountId) return;
+ if (!dropId) return;
- const keyInfos = await keypomInstance.getKeysForDrop({
- dropId,
- limit: size,
- start: index * size,
- });
+ const getEventData = async () => {
+ try {
+ const drop: EventDrop = await keypomInstance.viewCall({
+ methodName: 'get_drop_information',
+ args: { drop_id: dropId },
+ });
+ const nftExtraObj: TicketMetadataExtra = JSON.parse(
+ drop.drop_config.nft_keys_config.token_metadata.extra,
+ );
- const scannedKeys = keyInfos.filter((key) => getClaimStatus(key) === 'Attended');
- scanned += scannedKeys.length;
- index = index + 1;
+ const eventInfo: FunderEventMetadata | null = await keypomInstance.getEventInfo({
+ accountId,
+ eventId: nftExtraObj.eventId,
+ });
+ if (eventInfo == null) {
+ setIsErr(true);
+ return;
+ }
+ setEventInfo(eventInfo);
- setScannedAndClaimed(keysSupply - scanned);
+ if (eventInfo?.questions) {
+ try {
+ const privKey = await keypomInstance.getDerivedPrivKey({
+ encryptedPk: eventInfo.encPrivKey!,
+ ivBase64: eventInfo.iv!,
+ saltBase64: eventInfo.salt!,
+ pw: get(MASTER_KEY) as string,
+ });
+ setUserKey(privKey);
+ } catch (e) {
+ setIsCorrectMasterKey(false);
+ }
+ }
- getScannedInner(scanned, index);
+ const questionColumns: ColumnItem[] =
+ eventInfo.questions
+ ?.filter((questionInfo: QuestionInfo) => showQuestion(questionInfo.question))
+ .map((questionInfo) => ({
+ id: questionInfo.question, // Using the question text as a unique ID
+ title: questionInfo.question, // The question text as the title
+ selector: (row) => row[questionInfo.question] || '-', // Accessing the response using the question
+ loadingElement: ,
+ })) || [];
+
+ setDataTableQuestionIds(questionColumns.map((questionInfo) => questionInfo.id));
+
+ setTableColumns((prevColumns) => [...questionColumns, ...prevColumns]);
+ } catch (e) {
+ // eslint-disable-next-line no-console
+ console.error('error in getEventData', e);
+ setIsErr(true);
+ }
};
- getScannedInner();
- };
+ getEventData();
+ }, [dropId, selector, accountId]);
- // set Scanned item
useEffect(() => {
- getScannedKeys();
- }, []);
-
- const getTableRows: GetDataFn = (data, handleDeleteClick, handleCopyClick) => {
- if (data === undefined) return [];
-
- return data.map((item) => ({
- id: item.id,
- dropId,
- dropLink: item.link,
- link: (
-
- {window.location.hostname}/
-
- {item.slug}
+ if (dropId === '') navigate('/drops');
+ if (!accountId) return;
+ if (!dropId) return;
+
+ const getTicketsPurchased = async () => {
+ try {
+ const numKeys = await keypomInstance.viewCall({
+ methodName: 'get_key_supply_for_drop',
+ args: { drop_id: dropId },
+ });
+ setTicketsPurchased(numKeys);
+ } catch (e) {
+ console.error('error', e);
+ setIsErr(true);
+ }
+ };
+ getTicketsPurchased();
+ }, [dropId, selector, accountId]);
+
+ useEffect(() => {
+ if (
+ accountId === undefined ||
+ accountId === null ||
+ dropId === undefined ||
+ dropId === null ||
+ eventInfo === null ||
+ eventInfo === undefined
+ )
+ return;
+ if (eventInfo.questions && !userKey) return;
+
+ // First get enough data with the current filters to fill the page size
+ try {
+ handleGetInitialKeys(userKey, eventInfo);
+ } catch (e) {
+ console.error('error', e);
+ setIsErr(true);
+ }
+ }, [accountId, userKey, eventInfo]);
+
+ useEffect(() => {
+ if (
+ accountId === undefined ||
+ accountId === null ||
+ dropId === undefined ||
+ dropId === null ||
+ eventInfo === null ||
+ eventInfo === undefined
+ )
+ return;
+
+ if (eventInfo.questions && !userKey) return;
+
+ // In parallel, fetch all the drops
+ try {
+ handleGetAllKeys(userKey, eventInfo);
+ } catch (e) {
+ console.error('error', e);
+ setIsErr(true);
+ }
+ }, [userKey, eventInfo, accountId, selectedFilters]);
+
+ const showQuestion = (question: string) => {
+ return (
+ question.toLowerCase().replaceAll(' ', '').includes('name') ||
+ question.toLowerCase().replaceAll(' ', '').includes('email')
+ );
+ };
+
+ const handleFiltering = (keys: AttendeeKeyItem[]) => {
+ if (selectedFilters.status !== TICKET_CLAIM_STATUS_OPTIONS.ANY) {
+ keys = keys.filter((key) => {
+ if (selectedFilters.status === TICKET_CLAIM_STATUS_OPTIONS.PURCHASED) {
+ return key.uses_remaining === 2;
+ }
+ return key.uses_remaining !== 2;
+ });
+ }
+
+ if (selectedFilters.search.trim() !== '') {
+ keys = keys.filter((key) => {
+ const metadata = JSON.parse(key.metadata);
+ const answers: Record = metadata.questions; // Extracts all answers to the questions
+
+ for (const [question, answer] of Object.entries(answers)) {
+ if (showQuestion(question)) {
+ const answerString = answer.toLowerCase().replaceAll(' ', '');
+ const searchTerm = selectedFilters.search.toLowerCase().trim();
+
+ if (answerString.includes(searchTerm)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ });
+ }
+
+ return keys.map((key) => {
+ const responses: Record = JSON.parse(key.metadata).questions;
+ return {
+ id: key.pub_key,
+ usesRemaining: key.uses_remaining,
+ publicKey: key.pub_key,
+ responses,
+ };
+ });
+ };
+
+ const handleGetAllKeys = useCallback(
+ async (userPrivKey, curEventInfo) => {
+ setIsAllKeysLoading(true);
+ const keyInfoReturn = await keypomInstance.getAllKeysForTicket({ dropId });
+ let { dropKeyItems } = keyInfoReturn;
+
+ const numScanned = dropKeyItems.filter((key) => {
+ return key.uses_remaining !== 2;
+ }).length;
+ setTicketsScanned(numScanned);
+
+ if (curEventInfo.questions) {
+ dropKeyItems = await Promise.all(
+ dropKeyItems.map(async (key) => {
+ const newKey = JSON.parse(JSON.stringify(key));
+ try {
+ const decryptedMeta = await keypomInstance.decryptMetadata({
+ data: key.metadata,
+ privKey: userPrivKey,
+ });
+ newKey.metadata = decryptedMeta;
+ } catch (e) {
+ console.error('error', e);
+ setIsCorrectMasterKey(false);
+ }
+ return newKey;
+ }),
+ );
+ }
+
+ const filteredKeys = handleFiltering(dropKeyItems);
+
+ const totalPages = Math.ceil(filteredKeys.length / selectedFilters.pageSize);
+ setNumPages(totalPages);
+
+ setCurPage(0);
+ setFilteredTicketData(filteredKeys);
+ setIsAllKeysLoading(false);
+ },
+ [accountId, selectedFilters, keypomInstance],
+ );
+
+ const handleGetInitialKeys = useCallback(
+ async (userPrivKey, curEventInfo) => {
+ setIsLoading(true);
+
+ // Initialize or update the cache for this drop if it doesn't exist or if total keys have changed
+ const dropInfo = await keypomInstance.viewCall({
+ methodName: 'get_drop_information',
+ args: { drop_id: dropId },
+ });
+ const totalKeySupply = dropInfo.next_key_id;
+
+ // Loop until we have enough filtered drops to fill the page size
+ let keysFetched = 0;
+ let filteredKeys: AttendeeItem[] = [];
+ while (keysFetched < totalKeySupply && filteredKeys.length < selectedFilters.pageSize) {
+ let dropKeyItems: AttendeeKeyItem[] = await keypomInstance.getPaginatedKeysForTicket({
+ dropId,
+ start: keysFetched,
+ limit: selectedFilters.pageSize,
+ });
+
+ if (curEventInfo.questions) {
+ dropKeyItems = await Promise.all(
+ dropKeyItems.map(async (key) => {
+ const newKey = JSON.parse(JSON.stringify(key));
+ try {
+ const decryptedMeta = await keypomInstance.decryptMetadata({
+ data: key.metadata,
+ privKey: userPrivKey,
+ });
+ newKey.metadata = decryptedMeta;
+ } catch (e) {
+ console.error('error', e);
+ setIsCorrectMasterKey(false);
+ }
+ return newKey;
+ }),
+ );
+ }
+
+ keysFetched += dropKeyItems.length;
+
+ const curFiltered = handleFiltering(dropKeyItems);
+ filteredKeys = filteredKeys.concat(curFiltered);
+ }
+
+ if (filteredTicketData.length === 0) {
+ setFilteredTicketData(filteredKeys);
+ }
+ setCurPage(0);
+ setIsLoading(false);
+ },
+ [accountId, keypomInstance],
+ );
+
+ const pageSizeMenuItems = createMenuItems({
+ menuItems: PAGE_SIZE_ITEMS,
+ onClick: (item) => {
+ handlePageSizeSelect(item);
+ },
+ });
+
+ const ticketClaimStatusMenuItems = createMenuItems({
+ menuItems: TICKET_CLAIM_STATUS_ITEMS,
+ onClick: (item) => {
+ handleTicketClaimStatusSelect(item);
+ },
+ });
+
+ const handleTicketClaimStatusSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ status: item.label,
+ }));
+ };
+
+ const handleKeyDown = (event) => {
+ if (event.key === 'Enter') {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ search: searchTerm,
+ }));
+ }
+ };
+
+ const handlePageSizeSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ pageSize: parseInt(item.label),
+ }));
+ };
+
+ const handleSearchChange = (event) => {
+ const { value } = event.target;
+ setSearchTerm(value);
+ };
+
+ const handleNextPage = () => {
+ setCurPage((prev) => prev + 1);
+ };
+
+ const handlePrevPage = () => {
+ setCurPage((prev) => prev - 1);
+ };
+
+ const openViewDetailsModal = ({
+ item,
+ eventInfo,
+ }: {
+ item: any;
+ eventInfo: FunderEventMetadata;
+ }) => {
+ const questionColumns = eventInfo?.questions ? (
+ eventInfo?.questions.map((questionInfo) => (
+
+
+ {questionInfo.question}
-
+ {item.responses[questionInfo.question] || '-'}
+
+ ))
+ ) : (
+ None
+ );
+
+ setAppModal({
+ isOpen: true,
+ size: 'xl',
+ modalContent: (
+
+
+
+ Attendee details
+
+
+
+ Ticket ID
+
+ {truncateAddress(item.publicKey.split('ed25519:')[1], 'end', 16)}
+
+
+
+ {CLAIM_STATUS[item.usesRemaining].name}
+
+
+ {/* This creates the horizontal line */}
+
+
+ Attendee questions and responses
+
+ {questionColumns}
+
+ {/* ... more content based on your design */}
+
+
+
),
- hasClaimed: getBadgeType(item.keyInfo?.cur_key_use as number),
- action: (
- <>
-
- {!item.hasClaimed && (
+ View details
+
+ ),
+ };
+
+ for (const [key, value] of Object.entries(item.responses)) {
+ if (!Object.hasOwn(mapped, key)) {
+ mapped[key] = truncateAddress(value, 'end', 16);
+ }
+ }
+ return mapped;
+ });
+ };
+
+ const data = useMemo(() => {
+ const rowsToShow = filteredTicketData.slice(
+ curPage * selectedFilters.pageSize,
+ (curPage + 1) * selectedFilters.pageSize,
+ );
+ return getTableRows(rowsToShow);
+ }, [filteredTicketData, filteredTicketData.length, curPage, eventInfo]);
+
+ const getTableType = () => {
+ if (filteredTicketData.length === 0 && ticketsPurchased === 0) {
+ return 'all-tickets';
+ }
+ return 'no-filtered-tickets';
+ };
+
+ const breadcrumbItems = [
+ {
+ name: 'My events',
+ href: '/events',
+ },
+ {
+ name: eventInfo?.name || '',
+ href: `/events/event/${eventInfo?.id || ''}`,
+ },
+ {
+ name: dropData?.drop_config.nft_keys_config.token_metadata.title || '',
+ href: '',
+ },
+ ];
+
+ if (isErr) {
+ return (
+
+ );
+ }
+
+ return (
+
+
+ {/* Drop info section */}
+
+
+ {!dropData?.drop_config.nft_keys_config.token_metadata.media ? (
+
+ ) : (
+
+ )}
+
+
+ Ticket name
+
+
+ {dropData?.drop_config.nft_keys_config.token_metadata.title}{' '}
+
+
+
+
+
+
+ {' '}
+ {/* Adjust spacing as needed */}
+
+ Purchased
+
+ {ticketsPurchased}
+
+
+
+
+ {' '}
+ {/* Adjust spacing as needed */}
+
+ Scanned
+
+ {ticketsScanned}
+
+
+
+
+
+ {/* Desktop Menu */}
+
+ All attendees
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Mobile Menu */}
+
+
+
+ All attendees
+
+
+
+
- )}
- >
- ),
- }));
- };
+
+
+
- return (
- `${dropSize - scannedAndClaimed} / ${dropSize}`}
- getData={getTableRows}
- showColumns={false}
- tableColumns={tableColumns}
- />
+
+
+
+ (popoverClicked.current += 1)}
+ />
+
+
+ {/* Mobile Popup Menu For Filtering */}
+
+
);
}
diff --git a/src/features/drop-manager/routes/token/TokenDropManagerPage.tsx b/src/features/drop-manager/routes/token/TokenDropManagerPage.tsx
index d39874d2..070769f1 100644
--- a/src/features/drop-manager/routes/token/TokenDropManagerPage.tsx
+++ b/src/features/drop-manager/routes/token/TokenDropManagerPage.tsx
@@ -7,6 +7,7 @@ import { DropManager, type GetDataFn } from '@/features/drop-manager/components/
import keypomInstance from '@/lib/keypom';
import { tableColumns } from '../../components/TableColumn';
+import placeholderImage from '../../constants/token-placeholder.png';
export default function TokenDropManagerPage() {
const navigate = useNavigate();
@@ -47,8 +48,9 @@ export default function TokenDropManagerPage() {
action: (
<>
{!item.hasClaimed && (
)}
>
@@ -74,9 +77,10 @@ export default function TokenDropManagerPage() {
return (
`${dropSize - availableKeys} / ${dropSize}`}
getData={getTableRows}
+ placeholderImage={placeholderImage}
showColumns={false}
tableColumns={tableColumns}
/>
diff --git a/src/features/drop-manager/utils/parseDates.tsx b/src/features/drop-manager/utils/parseDates.tsx
new file mode 100644
index 00000000..8e3a951f
--- /dev/null
+++ b/src/features/drop-manager/utils/parseDates.tsx
@@ -0,0 +1,63 @@
+import { type DateAndTimeInfo } from '@/lib/eventsHelpers';
+
+export const dateAndTimeToText = (date: DateAndTimeInfo, placeholder = '') => {
+ if (!date.startDate) {
+ return placeholder;
+ }
+
+ let formattedDate = '';
+ let timeZone = '';
+
+ const start = new Date(date.startDate);
+ const startYear = start.getFullYear();
+ const startMonth = start.toLocaleDateString(undefined, { month: 'short' });
+ const startDay = start.toLocaleDateString(undefined, { day: 'numeric' });
+
+ // Extract the time zone from the start date and use it at the end
+ timeZone = start.toLocaleDateString(undefined, { timeZoneName: 'short' }).split(', ').pop() || '';
+
+ formattedDate = `${startMonth} ${startDay}`;
+ if (date.startTime) {
+ formattedDate += ` at ${date.startTime}`;
+ }
+
+ // Only add end date information if it exists
+ if (date.endDate) {
+ const end = new Date(date.endDate);
+ const endYear = end.getFullYear();
+ const endMonth = end.toLocaleDateString(undefined, { month: 'short' });
+ const endDay = end.toLocaleDateString(undefined, { day: 'numeric' });
+
+ // Check if the year is the same for start and end date to decide if it should be repeated.
+ const sameYear = startYear === endYear;
+
+ // Check if start and end date are the same to avoid repeating the same date
+ if (date.startDate !== date.endDate) {
+ formattedDate += ` - ${endMonth} ${endDay}`;
+ if (date.endTime) {
+ formattedDate += ` at ${date.endTime}`;
+ }
+ // Append the year at the end only if start and end years are different
+ if (!sameYear) {
+ formattedDate += `, ${startYear} - ${endYear}`;
+ }
+ } else if (date.endTime) {
+ // If it's the same day but with an end time
+ formattedDate += ` - ${date.endTime}`;
+ }
+ }
+
+ // Append the year if only start date is available or if start and end are in the same year
+ if (
+ !date.endDate ||
+ start.getFullYear() ===
+ (date.endDate ? new Date(date.endDate).getFullYear() : start.getFullYear())
+ ) {
+ formattedDate += `, ${startYear}`;
+ }
+
+ // Append the time zone at the end
+ formattedDate += `, ${timeZone}`;
+
+ return formattedDate;
+};
diff --git a/src/features/gallery/components/GalleryGrid.tsx b/src/features/gallery/components/GalleryGrid.tsx
new file mode 100644
index 00000000..162a4285
--- /dev/null
+++ b/src/features/gallery/components/GalleryGrid.tsx
@@ -0,0 +1,49 @@
+import { type BoxProps, SimpleGrid, Box, Text } from '@chakra-ui/react';
+
+import { type EventInterface } from '@/pages/Event';
+import { type DataItem } from '@/components/Table/types';
+
+import { TicketCard } from './TicketCard';
+
+// props validation
+interface GalleryGridProps extends BoxProps {
+ loading?: boolean;
+ data: EventInterface[];
+}
+
+export const GalleryGrid = ({ loading = false, data = [], ...props }: GalleryGridProps) => {
+ const loadingdata: DataItem[] = [];
+
+ // append 10 loading cards
+ for (let i = 0; i < 10; i++) {
+ const loadingCard = {
+ id: i,
+ name: 'Loading',
+ type: 'Type 1',
+ media: 'https://via.placeholder.com/300',
+ claimed: 100,
+ };
+ loadingdata.push(loadingCard);
+ }
+
+ const temp = loading ? [...loadingdata] : [...data];
+
+ return (
+ <>
+
+ {(temp === undefined || temp.length === 0) && (
+
+
+ No events found with current filters
+
+
+ )}
+
+ {temp?.map((event) => (
+
+ ))}
+
+
+ >
+ );
+};
diff --git a/src/features/gallery/components/PurchaseModal.tsx b/src/features/gallery/components/PurchaseModal.tsx
new file mode 100644
index 00000000..bfbeabab
--- /dev/null
+++ b/src/features/gallery/components/PurchaseModal.tsx
@@ -0,0 +1,457 @@
+import {
+ VStack,
+ Button,
+ FormControl,
+ HStack,
+ Input,
+ Modal,
+ ModalCloseButton,
+ ModalContent,
+ ModalOverlay,
+ Text,
+ Heading,
+ Image,
+ FormLabel,
+ StackDivider,
+ Box,
+} from '@chakra-ui/react';
+import { useCallback, useEffect, useState } from 'react';
+import { type WalletSelector } from '@near-wallet-selector/core';
+
+import { type EventInterface } from '@/pages/Event';
+import { EMAIL_QUESTION } from '@/features/create-drop/components/ticket/helpers';
+import { PURCHASED_LOCAL_STORAGE_PREFIX } from '@/constants/common';
+
+import { TicketIncrementer } from './TicketIncrementer';
+
+interface PurchaseModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+ ticket: any;
+ onSubmit: (
+ email: string,
+ questionValues: object,
+ paymentMethod: string,
+ isSecondary: boolean,
+ ) => void;
+ event: EventInterface;
+ amount: number;
+ setAmount: (amount: number) => void;
+ selector: WalletSelector;
+ stripeEnabledEvent: boolean;
+}
+
+export const PurchaseModal = ({
+ isOpen,
+ onClose,
+ ticket,
+ event,
+ onSubmit,
+ amount,
+ setAmount,
+ selector,
+ stripeEnabledEvent,
+}: PurchaseModalProps) => {
+ const [showErrors, setShowErrors] = useState(false);
+ const [email, setEmail] = useState('');
+ const [questionResponses, setQuestionResponses] = useState({});
+ const [currentTicket, setCurrentTicket] = useState(ticket);
+ const [numPurchased, setNumPurchased] = useState(0);
+
+ useEffect(() => {
+ setCurrentTicket(ticket);
+
+ if (ticket) {
+ const key = `${PURCHASED_LOCAL_STORAGE_PREFIX as string}_${ticket.id as string}`;
+ const purchased = localStorage.getItem(key);
+ if (purchased) {
+ setNumPurchased(parseInt(purchased));
+ }
+ }
+ // Logic to handle updated ticket or ticketAmount
+ }, [ticket, amount]); // Depend on ticket and ticketAmount
+
+ const preOnSubmit = (type) => {
+ if (email === '') {
+ setShowErrors(true);
+ return;
+ }
+
+ for (const question of event.questions) {
+ if (
+ question.required &&
+ (questionResponses[question.question] === '' ||
+ questionResponses[question.question] === undefined)
+ ) {
+ setShowErrors(true);
+ return;
+ }
+ }
+
+ setShowErrors(false); // Reset error state before validation
+
+ // You may want to transform questionValues into the desired format for onSubmit
+ onSubmit(email, questionResponses, type, currentTicket.isSecondary);
+ };
+
+ // Use the useEffect hook to set the focus when the questionValues state changes
+ // useEffect(() => {}, [questionValues]);
+
+ const decrementAmount = () => {
+ if (amount === 1) return;
+ setAmount(amount - 1);
+ };
+ const incrementAmount = () => {
+ if (availableTickets <= 0) return;
+
+ if (amount >= availableTickets) return;
+
+ if (currentTicket.numTickets !== 'unlimited' && amount >= currentTicket.numTickets) return;
+ setAmount(amount + 1);
+ };
+
+ const handleEmailChange = useCallback((e) => {
+ setEmail(e.target.value);
+ setQuestionResponses((prev) => ({ ...prev, [EMAIL_QUESTION]: e.target.value }));
+ }, []);
+
+ const handleQuestionChange = useCallback((questionText, answer) => {
+ setQuestionResponses((prev) => ({ ...prev, [questionText]: answer }));
+ }, []);
+
+ // purchase button version
+ const stripeRegistered = stripeEnabledEvent;
+ const signedIn = Boolean(selector ? selector.isSignedIn() : true);
+ const hasQuestions = event.questions && event.questions.length > 1;
+ const modalSize = hasQuestions ? '6xl' : '3xl';
+ const modalPadding = { base: hasQuestions ? '0' : '8', md: hasQuestions ? '2' : '16' };
+ const modalHeight = { base: '95vh', md: 'auto' };
+
+ let PurchaseButton = <>>;
+
+ if (currentTicket?.price && parseInt(currentTicket.price) === 0) {
+ // purchaseType = 3;
+ PurchaseButton = (
+
+ );
+ } else if (stripeRegistered && signedIn) {
+ // purchaseType = 2;
+ PurchaseButton = (
+ <>
+
+
+ >
+ );
+ } else if (stripeRegistered) {
+ // purchaseType = 1;
+ PurchaseButton = (
+ <>
+
+ Sign in to purchase with NEAR
+ >
+ );
+ } else if (signedIn) {
+ // purchaseType = 5;
+ PurchaseButton = (
+ <>
+
+ >
+ );
+ } else {
+ // purchaseType = 4;
+ PurchaseButton = (
+ <>
+ Sign in to purchase with NEAR
+ >
+ );
+ }
+
+ if (currentTicket == null || currentTicket === undefined) return null;
+ let showLimit = true;
+ const availableTickets = currentTicket.maxTickets - currentTicket.soldTickets;
+ if (currentTicket.limitPerUser > availableTickets) {
+ showLimit = false;
+ }
+ if (currentTicket.limitPerUser == null || currentTicket.limitPerUser === undefined) {
+ showLimit = false;
+ }
+ return (
+
+
+
+
+ {hasQuestions ? (
+
+ }
+ flexDirection={{ base: 'column', md: 'row' }}
+ justifyContent="center"
+ spacing={0}
+ w="full"
+ >
+ }
+ maxW={{ base: 'full', md: '50%' }}
+ p="6"
+ spacing="6"
+ w="full"
+ >
+
+
+
+ {event.name}
+
+
+ {event.description}
+
+
+
+ Admission Date
+
+
+ {currentTicket.dateString}
+
+
+
+
+
+ Ticket Amount
+
+ {showLimit && (
+
+ {`Limit of ${currentTicket.limitPerUser as string} per customer${
+ numPurchased > 0 ? ` (${numPurchased} owned)` : ''
+ }`}
+
+ )}
+
+ {availableTickets > 1 ? (
+
+ ) : (
+
+ Sold Out
+
+ )}
+
+
+
+
+ {/* Right side: Dynamic Event Questions */}
+
+ Organizer Questions
+
+ {event.questions
+ .slice(0, 4)
+ .filter((question) => question.question !== EMAIL_QUESTION)
+ .map((question, index) => {
+ const questionKey = question.question;
+
+ const error =
+ question.required &&
+ (questionResponses[questionKey] === '' ||
+ questionResponses[questionKey] === undefined);
+
+ return (
+
+
+ {questionKey}{' '}
+ {question.required && *}
+
+ {
+ handleQuestionChange(questionKey, e.target.value);
+ }}
+ // No onChange or value prop needed, as we're accessing the input value directly through the ref
+ />
+
+ );
+ })}
+ {/* Email and Purchase Section */}
+
+
+ Email
+
+
+
+
+
+
+
+ {/* PurchaseButton with adjusted maxW to match the HStack's content width */}
+ {PurchaseButton}
+
+
+
+ ) : (
+ <>
+
+ }
+ spacing="6"
+ w="full"
+ >
+
+
+
+ {event.name}
+
+
+ {event.description}
+
+
+
+ Admission Date
+
+
+ {currentTicket.dateString}
+
+
+
+
+ Ticket Amount
+
+ {availableTickets > 1 ? (
+
+ ) : (
+
+ Sold Out
+
+ )}
+
+
+
+
+
+ {/* Email and Purchase Section */}
+
+
+ Email
+
+
+
+
+
+ {PurchaseButton}
+
+ >
+ )}
+
+
+ );
+};
diff --git a/src/features/gallery/components/SellModal.tsx b/src/features/gallery/components/SellModal.tsx
new file mode 100644
index 00000000..654f70ba
--- /dev/null
+++ b/src/features/gallery/components/SellModal.tsx
@@ -0,0 +1,98 @@
+import {
+ Box,
+ Button,
+ FormControl,
+ FormErrorMessage,
+ FormHelperText,
+ Input,
+ Modal,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalOverlay,
+ Text,
+} from '@chakra-ui/react';
+import { Form } from 'react-router-dom';
+
+import { type SellDropInfo } from '@/pages/Event';
+
+interface SellModalProps {
+ input: string;
+ setInput: (input: string) => void;
+ isOpen: boolean;
+ onClose: () => void;
+ onSubmit: (event: any) => Promise;
+ event: SellDropInfo;
+}
+
+export const SellModal = ({
+ input,
+ setInput,
+ isOpen,
+ onClose,
+ onSubmit,
+ event,
+}: SellModalProps) => {
+ // price input
+ const handleInputChange = (e) => {
+ setInput(e.target.value);
+ };
+ const isError = input === '';
+ return (
+
+
+
+
+
+ {event.name}
+
+
+ Description
+
+ {event.description}
+
+ Date
+
+ {event.date}
+
+ Location
+
+ {event.location}
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/features/gallery/components/TicketCard.tsx b/src/features/gallery/components/TicketCard.tsx
new file mode 100644
index 00000000..8ec898f1
--- /dev/null
+++ b/src/features/gallery/components/TicketCard.tsx
@@ -0,0 +1,332 @@
+import {
+ Box,
+ Button,
+ Card,
+ CardBody,
+ CardFooter,
+ CardHeader,
+ Image as ChakraImage,
+ Skeleton,
+ SkeletonText,
+ Text,
+ Badge,
+ VStack,
+} from '@chakra-ui/react';
+import { NavLink } from 'react-router-dom';
+import { useEffect, useState } from 'react';
+
+import { IconBox } from '@/components/IconBox';
+import { type EventInterface } from '@/pages/Event';
+import { type DataItem } from '@/components/Table/types';
+import { PURCHASED_LOCAL_STORAGE_PREFIX } from '@/constants/common';
+
+import { TicketIncrementer } from './TicketIncrementer';
+
+interface TicketCardProps {
+ onSubmit?: (ticket: any, ticketAmount: any) => Promise;
+ event: EventInterface | DataItem;
+ loading: boolean;
+ surroundingNavLink: boolean;
+}
+
+interface SurroundingLinkProps {
+ children: React.ReactNode;
+}
+
+export const TicketCard = ({ event, loading, surroundingNavLink, onSubmit }: TicketCardProps) => {
+ let nav = '../gallery/';
+ if (event?.navurl != null && event?.navurl !== undefined) {
+ nav = '../gallery/' + String(event.navurl);
+ }
+
+ const [amount, setAmount] = useState(1);
+ const [numPurchased, setNumPurchased] = useState(0);
+ let availableTickets = 0;
+ let limitPerUser = 100000;
+
+ if (
+ event.maxTickets !== undefined &&
+ event.maxTickets !== null &&
+ event.soldTickets !== undefined &&
+ event.soldTickets !== null &&
+ event.limitPerUser !== undefined &&
+ event.limitPerUser !== null &&
+ typeof event.maxTickets === 'number' &&
+ typeof event.soldTickets === 'number' &&
+ typeof event.limitPerUser === 'number'
+ ) {
+ limitPerUser = event.limitPerUser;
+ availableTickets = event.maxTickets - event.soldTickets;
+ }
+
+ let showLimit = true;
+ if (limitPerUser > availableTickets) {
+ showLimit = false;
+ }
+ if (limitPerUser == null || limitPerUser === undefined) {
+ showLimit = false;
+ }
+
+ useEffect(() => {
+ if (event?.id !== undefined) {
+ const key = `${PURCHASED_LOCAL_STORAGE_PREFIX as string}_${event.id as string}`;
+ const purchased = localStorage.getItem(key);
+ if (purchased) {
+ setNumPurchased(parseInt(purchased));
+ }
+ }
+ }, [event.id]);
+
+ const decrementAmount = () => {
+ if (amount === 1) return;
+ setAmount(amount - 1);
+ };
+ const incrementAmount = () => {
+ if (availableTickets <= 0) return;
+
+ if (amount >= availableTickets) return;
+
+ if (
+ event.numTickets !== undefined &&
+ event.numTickets !== 'unlimited' &&
+ typeof event.numTickets === 'number' &&
+ amount >= event.numTickets
+ )
+ return;
+ setAmount(amount + 1);
+ };
+
+ const SurroundingLink = ({ children }: SurroundingLinkProps) => {
+ return surroundingNavLink ? (
+
+ {children}
+
+ ) : (
+ {children}
+ );
+ };
+
+ const navButton = onSubmit == null;
+
+ if (loading) {
+ return (
+
+
+
+
+
+
+
+ {event.name}
+
+
+
+
+ Event loading
+ Event loading
+
+
+
+
+ );
+ }
+ let available = 0;
+ if (typeof event?.maxTickets === 'number' && typeof event?.supply === 'number') {
+ available = event?.maxTickets - event?.supply;
+ }
+ let alt = '';
+ if (event?.name != null) {
+ alt = String(event?.name);
+ }
+ let src = '';
+ if (event?.media != null) {
+ src = String(event?.media);
+ }
+
+ let multPrice = 0;
+ if (typeof event.price === 'string' && event?.price != null && amount != null) {
+ multPrice = parseFloat(event.price) * amount;
+ }
+ return (
+
+
+
+
+
+ {event.numTickets === 'unlimited' ? (
+ <>
+
+ ∞ of {event.numTickets} available
+
+ >
+ ) : (
+ <>
+ {event.numTickets === '0' ||
+ event.maxTickets === undefined ||
+ event.maxTickets == null ||
+ event.supply == null ||
+ event.supply === undefined ? (
+ <>
+
+ Sold out
+
+ >
+ ) : (
+
+ {available} of {event.maxTickets} available
+
+ )}
+ >
+ )}
+
+
+
+ {event.name}
+
+
+
+
+ {event.dateString}
+
+
+ {event.location}
+
+
+ {event.description}
+
+
+ {!navButton && amount && event.numTickets !== '0' && event.numTickets !== '1' ? (
+
+
+ {showLimit && (
+
+ {`Limit of ${limitPerUser} per customer${
+ numPurchased > 0 ? ` (${numPurchased} owned)` : ''
+ }`}
+
+ )}
+
+ ) : null}
+ {navButton ? (
+ <>
+
+
+
+
+
+ >
+ ) : (
+ <>
+
+
+ >
+ )}
+
+
+
+ );
+};
diff --git a/src/features/gallery/components/TicketIncrementer.tsx b/src/features/gallery/components/TicketIncrementer.tsx
new file mode 100644
index 00000000..29d1b7f3
--- /dev/null
+++ b/src/features/gallery/components/TicketIncrementer.tsx
@@ -0,0 +1,43 @@
+import { Button, HStack } from '@chakra-ui/react';
+
+interface TicketIncrementerProps {
+ decrementAmount: () => void;
+ incrementAmount: () => void;
+ amount: number;
+ maxAmount?: number;
+}
+
+export const TicketIncrementer = ({
+ decrementAmount,
+ incrementAmount,
+ amount,
+ maxAmount,
+}: TicketIncrementerProps) => {
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+};
diff --git a/src/features/gallery/components/VerifyModal.tsx b/src/features/gallery/components/VerifyModal.tsx
new file mode 100644
index 00000000..7b559f3d
--- /dev/null
+++ b/src/features/gallery/components/VerifyModal.tsx
@@ -0,0 +1,234 @@
+import { InfoOutlineIcon } from '@chakra-ui/icons';
+import {
+ Box,
+ Button,
+ HStack,
+ Icon,
+ Image,
+ Modal,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalOverlay,
+ Text,
+ Tooltip,
+ useToast,
+} from '@chakra-ui/react';
+import { getPubFromSecret } from 'keypom-js';
+import { useEffect, useState } from 'react';
+import { QrReader } from 'react-qr-reader';
+
+import keypomInstance from '@/lib/keypom';
+import { type TicketInterface, type EventInterface } from '@/pages/Event';
+import {
+ type FunderEventMetadata,
+ type EventDrop,
+ type TicketMetadataExtra,
+} from '@/lib/eventsHelpers';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
+
+interface VerifyModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+ event: EventInterface;
+ eventId: string;
+ accountId: string;
+}
+
+export const VerifyModal = ({ isOpen, onClose, event, eventId, accountId }: VerifyModalProps) => {
+ // qr code input
+ const [data, setData] = useState('No result');
+ const [ticketData, setTicketData] = useState(null);
+ const toast = useToast();
+
+ useEffect(() => {
+ setTicketData(null);
+ }, [isOpen]);
+
+ const checkData = async (answer) => {
+ // answer = answer?.trim();
+
+ if (keypomInstance == null || keypomInstance === undefined) {
+ toast({
+ title: 'loading...',
+ description: `Try again in a moment`,
+ status: 'error',
+ duration: 3000,
+ isClosable: true,
+ });
+ return;
+ }
+
+ // test answer
+ // answer =
+ // 'ed25519:AXSwjeNg8qS8sFPSCK2eYK7UoQ3Kyyqt9oeKiJRd8pUhhEirhL2qbrs7tLBYpoGE4Acn8JbFL7FVjgyT2aDJaJx';
+ // answer =
+ // 'ed25519:27HQjCztqJmAMHjkM6RpQCc7giQ5H8CTxFrqaScfejp1SbfHZp7oDjqn27CyLKWWLHfHTaqtWfVYa3BYqxjZ6TMp';
+ try {
+ const secretKey = answer;
+ const publicKey: string = getPubFromSecret(secretKey);
+
+ const keyinfo = await keypomInstance.getTicketKeyInformation({
+ publicKey: String(publicKey),
+ });
+
+ // get drop info using the key info id
+
+ const dropID = keyinfo.token_id.split(':')[0];
+
+ const dropData: EventDrop = await keypomInstance.getTicketDropInformation({ dropID });
+
+ // parse dropData's metadata to get eventId
+ const meta: TicketMetadataExtra = JSON.parse(
+ dropData.drop_config.nft_keys_config.token_metadata.extra,
+ );
+
+ const keyinfoEventId = meta.eventId;
+ if (keyinfoEventId !== eventId) {
+ throw new Error('The ticket is not for this event.');
+ }
+ const meta2: FunderEventMetadata | null = await keypomInstance.getEventInfo({
+ accountId,
+ eventId: keyinfoEventId,
+ });
+
+ if (meta2 == null) {
+ throw new Error('The event does not exist.');
+ }
+ setTicketData({
+ name: meta2.name || 'Untitled',
+ artwork: meta2.artwork || 'loading',
+ questions: meta2.questions || [],
+ description: meta2.description || 'loading',
+ passValidThrough: meta.passValidThrough,
+ price: meta.price || 'loading',
+ // WIP DATA BELOW
+ id: '',
+ salesValidThrough: meta.passValidThrough,
+ supply: 0,
+ limitPerUser: 0,
+ soldTickets: 0,
+ priceNear: '0',
+ maxTickets: 0,
+ });
+ toast({
+ title: 'Ticket verified!',
+ description: `Details shown in the modal`,
+ status: 'success',
+ duration: 5000,
+ isClosable: true,
+ });
+ } catch (error) {
+ toast({
+ title: 'Invalid',
+ description: 'Your ticket is invalid',
+ status: 'error',
+ duration: 1000,
+ isClosable: true,
+ });
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+ Scan QR Code
+
+
+
+
+
+
+ {
+ if (result) {
+ const data = result?.getText();
+ setData(data);
+ checkData(data);
+ }
+ }}
+ />
+
+
+ Ticket Information
+
+ {data}
+
+ {ticketData != null ? (
+ <>
+
+ {ticketData?.name}
+
+
+
+ Description
+
+ {ticketData?.description}
+
+ Ticket Date
+
+ {dateAndTimeToText(ticketData?.passValidThrough)}
+ >
+ ) : null}
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/src/features/gallery/components/cssoverrides.css b/src/features/gallery/components/cssoverrides.css
new file mode 100644
index 00000000..7ea6a632
--- /dev/null
+++ b/src/features/gallery/components/cssoverrides.css
@@ -0,0 +1,92 @@
+/* .DateRangePickerInput {
+ border-radius: 10px !important;
+ border: 1px solid grey !important;
+} */
+
+.DateInput {
+ border-radius: 10px !important;
+ padding: 0px !important;
+ margin: 0px !important;
+ /* green for testing */
+ /* border: 2px solid red !important;
+ color: green !important; */
+}
+
+.DateInput_input {
+ border-radius: 10px !important;
+ padding: 0px !important;
+ margin: 11px !important;
+ width: 90px !important;
+ /* green for testing */
+ /* border: 2px solid red !important; */
+ /* color: green !important; */
+ font-family: var(--chakra-fonts-body) !important;
+ font-weight: var(--chakra-fontWeights-medium);
+ font-size: var(--chakra-fontSizes-md);
+ color: var(--chakra-colors-gray-400);
+}
+
+.DateRangePickerInput_arrow_svg {
+ display: none !important;
+}
+
+.DateRangePickerInput {
+ border-radius: 10px !important;
+ border: 2px solid !important;
+ border-color: var(--chakra-colors-gray-200) !important;
+}
+
+.CalendarDay {
+ border-color: #ffffff00 !important;
+ color: var(--chakra-colors-gray-400) !important;
+}
+
+.CalendarDay__selected_start {
+ border-radius: 20px !important;
+ border: 2px solid !important;
+ border-color: #ffffff00 !important;
+ color: white !important;
+}
+
+.CalendarDay__selected_end {
+ border-radius: 20px !important;
+ border: 2px solid !important;
+ border-color: #ffffff00 !important;
+ color: white !important;
+}
+
+.CalendarDay__selected_span {
+ background: var(--chakra-colors-blue-200) !important;
+ color: var(--chakra-colors-gray-400) !important;
+ border-color: #ffffff00 !important;
+}
+
+/* .CalendarDay__selected {
+ background: var(--chakra-colors-blue-200) !important;
+ color: white !important;
+} */
+
+.CalendarDay__hovered_span:hover,
+.CalendarDay__hovered_span {
+ background: var(--chakra-colors-blue-200) !important;
+}
+.CalendarDay__selected_start {
+ background: var(--chakra-colors-blue-400) !important;
+}
+.CalendarDay__selected_end {
+ background: var(--chakra-colors-blue-400) !important;
+}
+
+.CalendarMonth_caption {
+ font-family: var(--chakra-fonts-body) !important;
+ font-weight: var(--chakra-fontWeights-medium);
+ font-size: var(--chakra-fontSizes-md);
+ color: var(--chakra-colors-gray-400);
+}
+
+.DateInput_input__focused {
+ border: 2px solid !important;
+ border-color: var(--chakra-colors-blue-400) !important;
+ color: var(--chakra-colors-gray-400) !important;
+ border-color: #ffffff00 !important;
+}
diff --git a/src/features/landing/components/DropsSection.tsx b/src/features/landing/components/DropsSection.tsx
index c16368b0..ec513a10 100644
--- a/src/features/landing/components/DropsSection.tsx
+++ b/src/features/landing/components/DropsSection.tsx
@@ -23,12 +23,31 @@ export const DropsSection = () => {
};
const TAB_LIST: DropsTabItem[] = [
+ {
+ name: 'ticket',
+ label: 'Ticket',
+ icon: ,
+ content: (
+ {
+ dropCta('ticket');
+ }}
+ ctaText="Create Event"
+ description="Create tickets to your event that can be bought and resold with optional credit card payments enabled."
+ headingText="Ticket your next event."
+ imageNumber={1}
+ subHeadingText="Event Drops"
+ />
+ ),
+ },
{
name: 'token',
label: 'Token',
icon: ,
content: (
{
dropCta('token');
}}
@@ -40,24 +59,6 @@ export const DropsSection = () => {
/>
),
},
- {
- name: 'ticket',
- label: 'Ticket',
- icon: ,
- content: (
- {
- // dropCta('ticket');
- }}
- ctaText="Coming soon"
- description="Generate QRs for each guest, set them up with a wallet and optionally drop attendance proof NFTs."
- headingText="Ticket your next event."
- imageNumber={1}
- subHeadingText="Ticket Drops"
- />
- ),
- },
{
name: 'nft',
label: 'NFT',
diff --git a/src/features/scanner/components/LoadingOverlay.tsx b/src/features/scanner/components/LoadingOverlay.tsx
new file mode 100644
index 00000000..314069b5
--- /dev/null
+++ b/src/features/scanner/components/LoadingOverlay.tsx
@@ -0,0 +1,36 @@
+import { Center, Icon, Spinner } from '@chakra-ui/react';
+// For icons, assuming you're using Chakra UI icons or you can replace them with your preferred icons
+import { CheckIcon, CloseIcon } from '@chakra-ui/icons';
+
+interface LoadingOverlayProps {
+ isVisible: boolean;
+ status?: 'success' | 'error';
+}
+
+export const LoadingOverlay = ({ isVisible, status }: LoadingOverlayProps) => {
+ if (!isVisible) return null;
+
+ let backgroundColor = 'rgba(0, 0, 0, 0.5)'; // Default semi-transparent background
+ let content = ;
+
+ if (status === 'success') {
+ backgroundColor = 'rgba(0, 255, 0, 0.5)'; // Green for success
+ content = ;
+ } else if (status === 'error') {
+ backgroundColor = 'rgba(255, 0, 0, 0.5)'; // Red for error
+ content = ;
+ }
+
+ return (
+
+ {content}
+
+ );
+};
diff --git a/src/features/scanner/components/helpers.tsx b/src/features/scanner/components/helpers.tsx
new file mode 100644
index 00000000..9b0a7ce1
--- /dev/null
+++ b/src/features/scanner/components/helpers.tsx
@@ -0,0 +1,120 @@
+import { DateTime } from 'luxon';
+import { getPubFromSecret } from 'keypom-js';
+
+import {
+ type TicketMetadataExtra,
+ type DateAndTimeInfo,
+ type EventDrop,
+} from '@/lib/eventsHelpers';
+import keypomInstance from '@/lib/keypom';
+
+export const getDropFromSecretKey = async (
+ secretKey: string,
+): Promise<{ drop: EventDrop; usesRemaining: number } | null> => {
+ try {
+ const pubKey = getPubFromSecret(secretKey);
+ const keyInfo: { drop_id: string; uses_remaining: number } = await keypomInstance.viewCall({
+ methodName: 'get_key_information',
+ args: { key: pubKey },
+ });
+ const drop: EventDrop = await keypomInstance.viewCall({
+ methodName: 'get_drop_information',
+ args: { drop_id: keyInfo.drop_id },
+ });
+ return { usesRemaining: keyInfo.uses_remaining, drop };
+ } catch (e) {
+ return null;
+ }
+};
+
+export const getTimeAsMinutes = (timeString) => {
+ // Assuming the format is 'h:mm a', e.g., '9:00 AM'
+ const time = DateTime.fromFormat(timeString, 'h:mm a');
+ return time.hour * 60 + (time.minute as number);
+};
+
+export const validateDateAndTime = (requiredDateAndTime: DateAndTimeInfo): boolean => {
+ // Get the current DateTime
+ const now = DateTime.now();
+ const nowDateOnly = now.startOf('day');
+
+ // Normalize the start and end dates to midnight for date comparisons
+ const requiredStartDate = DateTime.fromMillis(requiredDateAndTime.startDate).startOf('day');
+ const requiredEndDate = requiredDateAndTime.endDate
+ ? DateTime.fromMillis(requiredDateAndTime.endDate).endOf('day') // Use end of the day for end date
+ : null;
+
+ // Check the date range first
+ if (nowDateOnly < requiredStartDate || (requiredEndDate && nowDateOnly > requiredEndDate)) {
+ return false;
+ }
+
+ // If it's the start date, check the start time
+ if (nowDateOnly.equals(requiredStartDate) && requiredDateAndTime.startTime) {
+ const startTimeMinutes = getTimeAsMinutes(requiredDateAndTime.startTime);
+ const currentMinutes = now.hour * 60 + (now.minute as number);
+ if (currentMinutes < startTimeMinutes) {
+ return false; // It's earlier than the start time
+ }
+ }
+
+ // If it's the end date, check the end time
+ if (
+ requiredEndDate &&
+ nowDateOnly.equals(requiredEndDate.startOf('day')) &&
+ requiredDateAndTime.endTime
+ ) {
+ const endTimeMinutes = getTimeAsMinutes(requiredDateAndTime.endTime);
+ const currentMinutes = now.hour * 60 + (now.minute as number);
+ if (currentMinutes > endTimeMinutes) {
+ return false; // It's later than the end time
+ }
+ }
+
+ return true; // The current time is within event bounds
+};
+
+interface ValidateDropProps {
+ drop: EventDrop;
+ allTicketOptions: EventDrop[];
+ ticketToVerify: string;
+}
+export const validateDrop = ({
+ drop,
+ allTicketOptions,
+ ticketToVerify,
+}: ValidateDropProps): { status: 'success' | 'error'; message: string } => {
+ try {
+ const dropId = drop.drop_id;
+ const ticketExtra: TicketMetadataExtra = JSON.parse(
+ drop.drop_config.nft_keys_config.token_metadata.extra,
+ );
+ const requiredDateAndTime: DateAndTimeInfo = ticketExtra.passValidThrough;
+ if (!validateDateAndTime(requiredDateAndTime)) {
+ return { status: 'error', message: 'Ticket is not valid at this time.' };
+ }
+
+ // Check if the drop ID is one of the event tickets
+ const isEventTicket = allTicketOptions.find((option) => option.drop_id === dropId);
+ if (dropId === '' || !isEventTicket) {
+ return { status: 'error', message: 'Ticket does not exist for this event.' };
+ }
+
+ // Check if the ticket is the correct type
+ if (ticketToVerify === '') {
+ return { status: 'success', message: 'Ticket is valid.' };
+ }
+
+ if (ticketToVerify !== dropId) {
+ return {
+ status: 'error',
+ message: 'Ticket does not match the selected ticket type but is valid for the event.',
+ };
+ }
+
+ return { status: 'success', message: 'Ticket is valid.' };
+ } catch (e) {
+ console.error(e);
+ return { status: 'error', message: 'Invalid Ticket' };
+ }
+};
diff --git a/src/features/scanner/routes/ScannerPage.tsx b/src/features/scanner/routes/ScannerPage.tsx
index 2ad722b3..7ed891e8 100644
--- a/src/features/scanner/routes/ScannerPage.tsx
+++ b/src/features/scanner/routes/ScannerPage.tsx
@@ -1,355 +1,397 @@
/* eslint-disable @typescript-eslint/no-misused-promises */
-import { Box, Button, Center, Heading, useDisclosure, VStack } from '@chakra-ui/react';
-import { useEffect, useLayoutEffect, useState } from 'react';
-import { QrReader } from 'react-qr-reader';
+import {
+ Box,
+ Button,
+ Center,
+ Heading,
+ VStack,
+ Menu,
+ MenuButton,
+ MenuList,
+ MenuItem,
+ Text,
+ useToast,
+ Spinner,
+} from '@chakra-ui/react';
+import { useEffect, useRef, useState } from 'react';
+import { type OnResultFunction, QrReader } from 'react-qr-reader';
+import { useNavigate } from 'react-router-dom';
-import { ViewFinder } from '@/components/ViewFinder';
import keypomInstance from '@/lib/keypom';
-import { useAppContext, type AppModalOptions } from '@/contexts/AppContext';
-import { get, set } from '@/utils/localStorage';
-
-export const gas = '100000000000000';
-const SCANNER_PASSWORD_KEY = 'scanner_password';
-
-interface TicketResult {
- secretKey: string;
- contractId: string;
+import { useTicketScanningParams } from '@/hooks/useTicketScanningParams';
+import { NotFound404 } from '@/components/NotFound404';
+import { ViewFinder } from '@/components/ViewFinder';
+import {
+ type FunderEventMetadata,
+ type EventDrop,
+ type TicketMetadataExtra,
+ type DateAndTimeInfo,
+} from '@/lib/eventsHelpers';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
+
+import { getDropFromSecretKey, validateDrop } from '../components/helpers';
+import { LoadingOverlay } from '../components/LoadingOverlay';
+
+interface StateRefObject {
+ isScanning: boolean;
+ isOnCooldown: boolean;
+ ticketsToScan: string[];
+ allTicketOptions: EventDrop[];
+ ticktToVerify: string;
+ isProcessing: boolean;
}
-// To stop concurrent scan result handling
-let scanningResultInProgress = false;
-let secretKeyInCurrentTransaction = '';
-let isModalOpen = false;
-
const Scanner = () => {
- const {
- isOpen: isPasswordModalOpen,
- onOpen: onPasswordModalOpen,
- onClose: onPasswordModalClose,
- } = useDisclosure();
- const {
- setAppModal,
- appModal: { isOpen: isAppModalOpen },
- } = useAppContext();
- const {
- isOpen: isResultModalOpen,
- onOpen: onResultModalOpen,
- onClose: onResultModalClose,
- } = useDisclosure();
- const [isClaimRetry, setIsClaimRetry] = useState(false);
- const [ticketRes, setTicketRes] = useState(null);
- const [passwordErrorText, setPasswordErrorText] = useState('');
- const [isTxSuccess, setIsTxSuccess] = useState(false);
- const [isTxLoading, setIsTxLoading] = useState(false);
- const [txError, setTxError] = useState('');
-
- const getSecretKeyAndContractId = (qrText: string): TicketResult | null => {
- try {
- return JSON.parse(qrText);
- } catch (err) {
- setTxError('QR code is invalid. It should contain secret key and contract Id.');
- }
+ const { funderId, eventId } = useTicketScanningParams();
+ const navigate = useNavigate();
+ const toast = useToast();
+
+ const [facingMode, setFacingMode] = useState('user'); // default to rear camera
+ const [eventInfo, setEventInfo] = useState();
+ const [ticketOptions, setTicketOptions] = useState<
+ Array<{ dropId: string; name: string; validThrough: DateAndTimeInfo }>
+ >([{ dropId: '', name: 'All Tickets', validThrough: { startDate: 0 } }]);
+ const [isErr, setIsErr] = useState(false);
+ const [ticketToVerify, setTicketToVerify] = useState('');
+ const [isScanning, setIsScanning] = useState(false);
+ const [isOnCooldown, setIsOnCooldown] = useState(false); // New state to manage cooldown
+
+ const stateRef = useRef({
+ isScanning: false,
+ isOnCooldown: false,
+ ticketsToScan: [],
+ allTicketOptions: [],
+ ticktToVerify: '',
+ isProcessing: false,
+ });
+
+ const [allTicketOptions, setAllTicketOptions] = useState();
+
+ const [scanStatus, setScanStatus] = useState<'success' | 'error'>();
+ const [statusMessage, setStatusMessage] = useState('');
+
+ const [ticketsToScan, setTicketsToScan] = useState([]);
- return null;
- };
-
- const handleTicketClaim = async (secretKey: string, password: string) => {
- try {
- await keypomInstance.claimTicket(secretKey, password);
- // we already closed the modal
- } catch (err) {
- if (
- err.message === 'Ticket has already been claimed' ||
- err.message === 'RVSP first to enter'
- ) {
- setTxError(err.message);
- setIsTxLoading(false);
- return;
+ useEffect(() => {
+ if (eventId === '' || funderId === '') navigate('/drops');
+ if (!eventId || !funderId) return;
+
+ const getEventData = async () => {
+ try {
+ const eventInfo: FunderEventMetadata | null = await keypomInstance.getEventInfo({
+ accountId: funderId,
+ eventId,
+ });
+ if (eventInfo == null || Object.keys(eventInfo).length === 0) {
+ setIsErr(true);
+ return;
+ }
+ setEventInfo(eventInfo);
+ } catch (e) {
+ console.error(e);
+ setIsErr(true);
}
- setIsClaimRetry(true);
- setIsTxLoading(false);
- onResultModalClose();
- setPasswordErrorText(err.message);
- onPasswordModalOpen();
- }
- };
+ };
- const handleScanResult = async (result, error) => {
- if (scanningResultInProgress || isModalOpen) {
- return;
- }
+ getEventData();
+ }, [eventId, funderId]);
- scanningResultInProgress = true;
- if (result === undefined) {
- scanningResultInProgress = false;
- return;
- }
-
- setIsTxLoading(true);
- setTxError('');
- setPasswordErrorText('');
- setIsClaimRetry(false);
- setIsTxSuccess(false);
- onResultModalOpen();
-
- if (result && result?.text === '') {
- setTxError('QR code is invalid');
- scanningResultInProgress = false;
- return;
- }
-
- if (error !== undefined) {
- console.error(error);
- setIsTxLoading(false);
- setTxError('Error parsing QR code');
- scanningResultInProgress = false;
- return;
- }
-
- const ticketRes = getSecretKeyAndContractId(result.text);
- if (ticketRes === null) {
- console.error('Error parsing QR code');
- setIsTxLoading(false);
- scanningResultInProgress = false;
- return;
- }
-
- const { contractId, secretKey } = ticketRes;
-
- if (secretKeyInCurrentTransaction === '') {
- secretKeyInCurrentTransaction = secretKey;
- } else {
- // to ensure the QR code isn't repeated scanned
- if (secretKeyInCurrentTransaction === secretKey) {
- setIsTxLoading(false);
- scanningResultInProgress = false;
- onResultModalClose();
- return;
- }
- }
-
- setTicketRes(ticketRes);
-
- try {
- console.log(contractId, secretKey);
- const currentKeyUse = await keypomInstance.getCurrentKeyUse(contractId, secretKey);
- console.log({ currentKeyUse });
- switch (currentKeyUse) {
- case 3:
- throw new Error('This ticket has been claimed');
- case 1:
- throw new Error('RVSP first to enter');
- case 2:
- default:
+ useEffect(() => {
+ if (eventId === '' || funderId === '') navigate('/drops');
+ if (!eventId || !funderId) return;
+
+ const getEventTickets = async () => {
+ try {
+ const ticketsReturned: EventDrop[] = await keypomInstance.getTicketsForEventId({
+ accountId: funderId,
+ eventId,
+ });
+ setAllTicketOptions(ticketsReturned);
+
+ const ticketOptions: Array<{
+ dropId: string;
+ name: string;
+ validThrough: DateAndTimeInfo;
+ }> = [{ dropId: '', name: 'All Tickets', validThrough: { startDate: 0 } }];
+ ticketsReturned.forEach((ticket) => {
+ const extra: TicketMetadataExtra = JSON.parse(
+ ticket.drop_config.nft_keys_config.token_metadata.extra,
+ );
+ ticketOptions.push({
+ dropId: ticket.drop_id,
+ name: ticket.drop_config.nft_keys_config.token_metadata.title,
+ validThrough: extra.passValidThrough,
+ });
+ });
+ setTicketOptions(ticketOptions);
+ } catch (e) {
+ // eslint-disable-next-line no-console
+ console.error('error getting event tickets:', e);
+ setIsErr(true);
}
- } catch (err) {
- console.error(err);
- setTxError(err.message);
- setIsTxLoading(false);
- scanningResultInProgress = false;
- secretKeyInCurrentTransaction = '';
- return;
- }
+ };
- const password = get(SCANNER_PASSWORD_KEY);
-
- setIsTxSuccess(true);
- setIsTxLoading(false);
- onResultModalOpen();
-
- // we don't await it, because it takes to long...
- handleTicketClaim(secretKey, password)
- .then((res) => {
- console.log(res);
- })
- .catch((e) => {
- setAppModal({
- isOpen: true,
- header: 'ERROR Scanning Previous Ticket!',
- message: `Please try scanning the ticket again, otherwise the person will not be able to claim their gift until they are scanned successfully!`,
- options: [
- {
- label: 'Ok',
- },
- ],
- });
- })
- .finally(() => {
- scanningResultInProgress = false;
- secretKeyInCurrentTransaction = '';
- });
- // yaaaa we can scan more tickets and everything looks super fast!
- };
+ getEventTickets();
+ }, [eventId, funderId]);
- const openResultModal = () => {
- let message = '';
- const options: AppModalOptions[] = [];
- if (isTxSuccess) {
- message = 'Ticket is valid!';
- options.push({
- label: 'Ok',
- func: () => {
- scanningResultInProgress = false;
- console.log('tx acknowledged');
- },
- });
- }
- if (txError) {
- message = txError;
- options.push({
- label: 'Ok',
- func: () => {
- scanningResultInProgress = false;
- console.log('error acknowledged');
- },
+ useEffect(() => {
+ if (scanStatus) {
+ toast({
+ title: scanStatus === 'success' ? 'Success' : 'Error',
+ description: statusMessage,
+ status: scanStatus,
+ duration: 5000,
+ isClosable: true,
});
+ // Reset the status after showing the message
+ setTimeout(() => {
+ setScanStatus(undefined);
+ }, 5000);
}
+ }, [scanStatus, statusMessage, toast]);
- setAppModal({
- isOpen: true,
- isLoading: isTxLoading,
- isError: Boolean(txError),
- isSuccess: isTxSuccess,
- message,
- options,
- });
- };
-
- const handlePasswordSaveClick = (password: string) => {
- set(SCANNER_PASSWORD_KEY, password ?? '');
- onPasswordModalClose();
- if (isClaimRetry) {
- // eslint-disable-next-line
- handleScanResult({ text: JSON.stringify(ticketRes) }, undefined);
- }
- };
-
- const openPasswordWarning = () => {
- setAppModal({
- isOpen: true,
- header: 'No password has been set!',
- message: `You won't be able to scan tickets without setting a password. Click ok to continue.`,
- options: [
- {
- lazy: true,
- label: 'Ok',
- func: openPasswordModal,
- },
- ],
- });
- };
-
- const openPasswordModal = () => {
- setAppModal({
- isOpen: true,
- header: 'Enter your password',
- message: passwordErrorText || '',
- inputs: [
- {
- placeholder: 'Password',
- valueKey: 'password',
- },
- ],
- options: [
- {
- lazy: true,
- label: 'Cancel',
- func: () => {
- const cachedPassword = get(SCANNER_PASSWORD_KEY);
- if (!!cachedPassword && cachedPassword.length > 0) return;
- openPasswordWarning();
- },
- buttonProps: {
- variant: 'outline',
- },
- },
- {
- lazy: true,
- label: 'Ok',
- func: ({ password }) => {
- if (password?.length > 0) {
- handlePasswordSaveClick(password.trim());
- return;
- }
- openPasswordWarning();
- },
- },
- ],
- });
+ const enableCooldown = () => {
+ setIsOnCooldown(true); // Activate cooldown
+ setTimeout(() => {
+ setIsOnCooldown(false); // Deactivate cooldown after 3000 milliseconds (3 seconds)
+ }, 1000);
};
useEffect(() => {
- if (isPasswordModalOpen) {
- openPasswordModal();
- }
- }, [isPasswordModalOpen, passwordErrorText]);
+ stateRef.current.isScanning = isScanning;
+ stateRef.current.ticketsToScan = ticketsToScan;
+ stateRef.current.isOnCooldown = isOnCooldown;
+ stateRef.current.allTicketOptions = allTicketOptions || [];
+ stateRef.current.ticktToVerify = ticketToVerify;
+ // Update other state variables in stateRef.current as needed
+ }, [isScanning, ticketsToScan, isOnCooldown, allTicketOptions, ticketToVerify]);
useEffect(() => {
- if (isResultModalOpen) {
- openResultModal();
+ // Process tickets in batches but only if not currently processing
+ if (!stateRef.current.isProcessing && stateRef.current.ticketsToScan.length > 0) {
+ processBatchOfTickets();
+ }
+ }, [ticketsToScan]);
+
+ const handleScanResult: OnResultFunction = async (result) => {
+ if (result && !stateRef.current.isScanning && !stateRef.current.isOnCooldown) {
+ setIsScanning(true); // Start scanning
+ setScanStatus(undefined); // Reset the status message
+ try {
+ const secretKey = result.getText();
+ const dropInfo = await getDropFromSecretKey(secretKey);
+ if (dropInfo) {
+ const { drop, usesRemaining } = dropInfo;
+ // Check if the ticket has already been scanned
+ if (stateRef.current.ticketsToScan.includes(secretKey)) {
+ // This now correctly checks against the most up-to-date ticketsToScan
+ setScanStatus('error');
+ setStatusMessage('Ticket already scanned.');
+ return;
+ }
+
+ if (usesRemaining !== 2) {
+ setScanStatus('error');
+ setStatusMessage('Ticket has already been used.');
+ return;
+ }
+
+ // Suppose you have a function to validate the ticket
+ const { status, message } = validateDrop({
+ drop,
+ allTicketOptions: stateRef.current.allTicketOptions,
+ ticketToVerify: stateRef.current.ticktToVerify,
+ });
+
+ // If the ticket is valid, update the state to include the new ticket
+ if (status === 'success') {
+ // Update both the ref and the state to enqueue the ticket
+ const updatedTickets = [...stateRef.current.ticketsToScan, secretKey];
+ stateRef.current.ticketsToScan = updatedTickets;
+ setTicketsToScan(updatedTickets);
+ }
+ setScanStatus(status);
+ setStatusMessage(message);
+ } else {
+ setScanStatus('error');
+ setStatusMessage('No ticket information found.');
+ }
+ } catch (error) {
+ console.error('Scan failed', error);
+ setScanStatus('error');
+ setStatusMessage('Error scanning the ticket. Please try again.');
+ } finally {
+ setIsScanning(false); // End scanning regardless of success or error
+ enableCooldown(); // Enable cooldown to prevent multiple scans
+ }
}
- }, [isTxLoading, isTxSuccess, isResultModalOpen, txError]);
+ };
- useEffect(() => {
- onPasswordModalOpen();
- }, []);
+ const processBatchOfTickets = async () => {
+ stateRef.current.isProcessing = true;
+ // Take up to 10 tickets to process
+ const ticketsToProcess = stateRef.current.ticketsToScan.slice(0, 10);
+
+ await Promise.all(
+ ticketsToProcess.map(async (ticket) => {
+ try {
+ // Placeholder for your actual ticket processing logic
+ await keypomInstance.onEventTicketScanned(ticket);
+ // Process successful, remove from the ref queue
+ stateRef.current.ticketsToScan = stateRef.current.ticketsToScan.filter(
+ (t) => t !== ticket,
+ );
+ } catch (error) {
+ console.error('Error processing ticket:', ticket, error);
+ // Decide how to handle errors, e.g., retry later, log, etc.
+ }
+ }),
+ );
+
+ // Update the ticketsToScan state to trigger re-render if needed
+ setTicketsToScan([...stateRef.current.ticketsToScan]);
+ stateRef.current.isProcessing = false;
+
+ // Check if more tickets are in the queue and continue processing
+ if (stateRef.current.ticketsToScan.length > 0) {
+ processBatchOfTickets();
+ }
+ };
- useLayoutEffect(() => {
- isModalOpen = isAppModalOpen;
- }, [isAppModalOpen]);
+ if (isErr) {
+ return (
+
+ );
+ }
+
+ if (!allTicketOptions || !eventInfo) {
+ return (
+
+ {' '}
+ {/* Adjust the height as needed */}
+
+
+ );
+ }
return (
-
+
-
- Scanner
- {/** keypom scanner placeholder */}
-
- }
- onResult={handleScanResult}
- />
+
+
+ Scanning Tickets For {eventInfo?.name}
+
+
+ Currently Scanning For{' '}
+ {ticketOptions.find((option) => option.dropId === ticketToVerify)?.name}
+
+ {ticketToVerify !== '' && (
+
+ Valid Through:{' '}
+ {dateAndTimeToText(
+ ticketOptions.find((option) => option.dropId === ticketToVerify)!.validThrough,
+ )}
+
+ )}
+
+
+
+ {/* Dropdown for selecting ticket types */}
+
+
+
+ }
+ onResult={handleScanResult}
+ />
+ {/* Overlay Component */}
+
+
+
+ {ticketsToScan.length > 0 ? (
+
+ Processing {ticketsToScan.length} tickets in the background...
+
+ ) : (
+ Waiting for QR code...
+ )}
+
+
- {/* )} */}
-
-
-
-
-
- {/* */}
diff --git a/src/features/ticket-qr/TicketQRPage.tsx b/src/features/ticket-qr/TicketQRPage.tsx
new file mode 100644
index 00000000..6d36bb12
--- /dev/null
+++ b/src/features/ticket-qr/TicketQRPage.tsx
@@ -0,0 +1,228 @@
+import {
+ Box,
+ Center,
+ Flex,
+ Grid,
+ GridItem,
+ Heading,
+ Hide,
+ Image,
+ Skeleton,
+ Text,
+ VStack,
+} from '@chakra-ui/react';
+import { useEffect, useState } from 'react';
+import { getPubFromSecret } from 'keypom-js';
+
+import { IconBox } from '@/components/IconBox';
+import { TicketIcon } from '@/components/Icons';
+import { BoxWithShape } from '@/components/BoxWithShape';
+import { QrDetails } from '@/features/claim/components/ticket/QrDetails';
+import { useTicketClaimParams } from '@/hooks/useTicketClaimParams';
+import { NotFound404 } from '@/components/NotFound404';
+import keypomInstance from '@/lib/keypom';
+import {
+ type FunderEventMetadata,
+ type EventDrop,
+ type TicketInfoMetadata,
+ type TicketMetadataExtra,
+} from '@/lib/eventsHelpers';
+
+import { dateAndTimeToText } from '../drop-manager/utils/parseDates';
+
+export default function TicketQRPage() {
+ const { secretKey } = useTicketClaimParams();
+
+ const [isValid, setIsValid] = useState(true);
+ const [isLoading, setIsLoading] = useState(true);
+
+ const [eventInfo, setEventInfo] = useState();
+ const [ticketInfo, setTicketInfo] = useState();
+ const [ticketInfoExtra, setTicketInfoExtra] = useState();
+
+ const [eventId, setEventId] = useState('');
+ const [funderId, setFunderId] = useState('');
+
+ useEffect(() => {
+ const getEventInfo = async () => {
+ try {
+ setIsLoading(true);
+ const pubKey = getPubFromSecret(secretKey);
+ const keyInfo: { drop_id: string } = await keypomInstance.viewCall({
+ methodName: 'get_key_information',
+ args: { key: pubKey },
+ });
+ const drop: EventDrop = await keypomInstance.viewCall({
+ methodName: 'get_drop_information',
+ args: { drop_id: keyInfo.drop_id },
+ });
+ const ticketMetadata: TicketInfoMetadata = drop.drop_config.nft_keys_config.token_metadata;
+ setTicketInfo(ticketMetadata);
+
+ const ticketExtra: TicketMetadataExtra = JSON.parse(ticketMetadata.extra);
+ setTicketInfoExtra(ticketExtra);
+
+ const eventInfo: FunderEventMetadata | null = await keypomInstance.getEventInfo({
+ accountId: drop.funder_id,
+ eventId: ticketExtra.eventId,
+ });
+ if (!eventInfo) {
+ setIsValid(false);
+ setIsLoading(false);
+ return;
+ }
+ setEventInfo(eventInfo);
+ setEventId(ticketExtra.eventId);
+ setFunderId(drop.funder_id);
+ setIsLoading(false);
+ } catch (e) {
+ // eslint-disable-next-line no-console
+ console.error('Error getting event info: ', e);
+ setIsValid(false);
+ setIsLoading(false);
+ }
+ };
+ getEventInfo();
+ }, []);
+
+ if (!isValid) {
+ return (
+
+ );
+ }
+
+ const ticketDetails = () => {
+ return (
+
+
+ {ticketInfo?.title}
+
+
+ {ticketInfoExtra && dateAndTimeToText(ticketInfoExtra?.passValidThrough)}
+
+
+ );
+ };
+
+ return (
+
+
+
+ You're attending {eventInfo?.name}!
+
+
+
+
+
+ Location
+
+
+ {eventInfo?.location || 'Online'}
+
+
+
+
+
+ Event Date
+
+
+ {eventInfo?.date && dateAndTimeToText(eventInfo?.date)}
+
+
+
+
+
+
+
+
+
+ {isLoading ? 'Loading ticket...' : ticketDetails()}
+
+
+
+
+
+
+ }
+ maxW={{ base: '345px', md: '30rem' }}
+ minW={{ base: 'inherit', md: '345px' }}
+ p="0"
+ pb="0"
+ >
+
+
+ {isLoading ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+ {eventInfo?.name}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/hooks/useTicketClaimParams.tsx b/src/hooks/useTicketClaimParams.tsx
new file mode 100644
index 00000000..af1be6a2
--- /dev/null
+++ b/src/hooks/useTicketClaimParams.tsx
@@ -0,0 +1,28 @@
+import { useLocation, useNavigate, useParams } from 'react-router-dom';
+
+export const useTicketClaimParams = () => {
+ const navigate = useNavigate();
+ const { id: dropId = '' } = useParams();
+ const { hash } = useLocation();
+
+ let secretKey = '';
+ if (hash !== undefined) {
+ secretKey = hash.replace('#', '');
+ }
+
+ if (dropId === undefined || dropId === '' || secretKey === undefined || secretKey === '') {
+ console.error(
+ 'Navigating to home page. dropId or SecretKey are not found in the URL paramater',
+ );
+ navigate('/');
+ return {
+ dropId: '',
+ secretKey: '',
+ };
+ }
+
+ return {
+ dropId,
+ secretKey,
+ };
+};
diff --git a/src/hooks/useTicketScanningParams.tsx b/src/hooks/useTicketScanningParams.tsx
new file mode 100644
index 00000000..64d45eba
--- /dev/null
+++ b/src/hooks/useTicketScanningParams.tsx
@@ -0,0 +1,42 @@
+import { useNavigate, useParams } from 'react-router-dom';
+
+export const useTicketScanningParams = () => {
+ const navigate = useNavigate();
+ const { funderAndEventId } = useParams();
+
+ if (funderAndEventId === undefined || funderAndEventId === '') {
+ console.error('Navigating to home page. eventId is not found in the URL paramater');
+ navigate('/');
+ return {
+ eventId: '',
+ funderId: '',
+ };
+ }
+
+ const split = funderAndEventId.split(':');
+ if (split.length !== 2) {
+ console.error('Navigating to home page. eventId is not found in the URL paramater');
+ navigate('/');
+ return {
+ eventId: '',
+ funderId: '',
+ };
+ }
+
+ const [funderId, eventId] = split;
+ if (eventId === undefined || eventId === '' || funderId === undefined || funderId === '') {
+ console.error(
+ 'Navigating to home page. dropId or SecretKey are not found in the URL paramater',
+ );
+ navigate('/');
+ return {
+ eventId: '',
+ funderId: '',
+ };
+ }
+
+ return {
+ eventId,
+ funderId,
+ };
+};
diff --git a/src/hooks/useValidMasterKey.tsx b/src/hooks/useValidMasterKey.tsx
index 716abdda..7e5e57dc 100644
--- a/src/hooks/useValidMasterKey.tsx
+++ b/src/hooks/useValidMasterKey.tsx
@@ -24,7 +24,7 @@ export const useValidMasterKey = ({ dropId }: useValidMasterKeyProps) => {
metaEntropy: keys[0].key_id.toString(),
});
- setValid(keys[0].pk === publicKeys[0]);
+ setValid((keys[0] as any).pk === publicKeys[0]);
};
validateMasterKey();
}, []);
diff --git a/src/lib/cryptoHelpers.ts b/src/lib/cryptoHelpers.ts
new file mode 100644
index 00000000..eead9e9e
--- /dev/null
+++ b/src/lib/cryptoHelpers.ts
@@ -0,0 +1,138 @@
+export async function generateKeyPair(): Promise<{
+ privateKey: any;
+ publicKey: any;
+}> {
+ return await window.crypto.subtle.generateKey(
+ {
+ name: 'RSA-OAEP',
+ modulusLength: 4096,
+ publicExponent: new Uint8Array([1, 0, 1]),
+ hash: { name: 'SHA-256' },
+ },
+ true,
+ ['encrypt', 'decrypt'],
+ );
+}
+
+export function uint8ArrayToBase64(u8Arr: Uint8Array): string {
+ const string = u8Arr.reduce((data, byte) => data + String.fromCharCode(byte), '');
+ return btoa(string);
+}
+
+export async function encryptPrivateKey(
+ privateKey: any,
+ symmetricKey: any,
+): Promise<{ encryptedPrivateKeyBase64: string; ivBase64: string }> {
+ const exportedPrivateKey = await crypto.subtle.exportKey('pkcs8', privateKey);
+
+ const iv = crypto.getRandomValues(new Uint8Array(12));
+ const encryptedPrivateKey = await crypto.subtle.encrypt(
+ {
+ name: 'AES-GCM',
+ iv,
+ },
+ symmetricKey,
+ exportedPrivateKey,
+ );
+
+ const encryptedBase64 = uint8ArrayToBase64(new Uint8Array(encryptedPrivateKey));
+ const ivBase64 = uint8ArrayToBase64(iv);
+
+ return { encryptedPrivateKeyBase64: encryptedBase64, ivBase64 };
+}
+
+export async function exportPublicKeyToBase64(publicKey: any) {
+ // Export the key to the SPKI format
+ const exportedKey = await crypto.subtle.exportKey('spki', publicKey);
+
+ // Convert the exported key to a Base64 string
+ const base64Key = arrayBufferToBase64(exportedKey);
+
+ return base64Key;
+}
+
+export function arrayBufferToBase64(buffer: any) {
+ let binary = '';
+ const bytes = new Uint8Array(buffer);
+ const len = bytes.byteLength;
+ for (let i = 0; i < len; i++) {
+ binary += String.fromCharCode(bytes[i]);
+ }
+ return btoa(binary);
+}
+
+export async function deriveKeyFromPassword(password: string, saltBase64: string): Promise {
+ // Convert Base64-encoded salt back to Uint8Array
+ const salt = Uint8Array.from(atob(saltBase64), (c) => c.charCodeAt(0));
+
+ const keyMaterial = await window.crypto.subtle.importKey(
+ 'raw',
+ new TextEncoder().encode(password),
+ { name: 'PBKDF2' },
+ false,
+ ['deriveKey'],
+ );
+
+ return await window.crypto.subtle.deriveKey(
+ {
+ name: 'PBKDF2',
+ salt,
+ iterations: 100000,
+ hash: 'SHA-256',
+ },
+ keyMaterial,
+ { name: 'AES-GCM', length: 256 },
+ true,
+ ['encrypt', 'decrypt'],
+ );
+}
+
+export async function decryptPrivateKey(
+ encryptedPrivateKeyBase64: string,
+ ivBase64: string,
+ symmetricKey: any,
+): Promise {
+ const encryptedPrivateKey = Uint8Array.from(atob(encryptedPrivateKeyBase64), (c) =>
+ c.charCodeAt(0),
+ );
+ const iv = Uint8Array.from(atob(ivBase64), (c) => c.charCodeAt(0));
+
+ const decryptedPrivateKeyBuffer = await window.crypto.subtle.decrypt(
+ {
+ name: 'AES-GCM',
+ iv,
+ },
+ symmetricKey,
+ encryptedPrivateKey,
+ );
+
+ return await window.crypto.subtle.importKey(
+ 'pkcs8',
+ decryptedPrivateKeyBuffer,
+ {
+ name: 'RSA-OAEP',
+ hash: { name: 'SHA-256' },
+ },
+ true,
+ ['decrypt'],
+ );
+}
+
+export async function decryptWithPrivateKey(
+ encryptedData: string,
+ privateKey: any,
+): Promise {
+ const encryptedDataArrayBuffer = Uint8Array.from(atob(encryptedData), (c) =>
+ c.charCodeAt(0),
+ ).buffer;
+
+ const decrypted = await window.crypto.subtle.decrypt(
+ {
+ name: 'RSA-OAEP',
+ },
+ privateKey,
+ encryptedDataArrayBuffer,
+ );
+
+ return new TextDecoder().decode(decrypted);
+}
diff --git a/src/lib/eventsHelpers.ts b/src/lib/eventsHelpers.ts
new file mode 100644
index 00000000..48c3f8cb
--- /dev/null
+++ b/src/lib/eventsHelpers.ts
@@ -0,0 +1,163 @@
+import { type TicketInfoFormMetadata } from '@/features/create-drop/components/ticket/CreateTicketsForm';
+
+type AllDayEvent = string;
+interface MultiDayEvent {
+ from: string;
+ to: string;
+}
+export interface EventDateInfo {
+ time?: string;
+ date: AllDayEvent | MultiDayEvent;
+}
+
+export interface QuestionInfo {
+ required: boolean;
+ question: string;
+}
+
+export interface FunderEventMetadata {
+ // Stage 1
+ name: string;
+ id: string;
+ description: string;
+ location: string;
+ date: DateAndTimeInfo;
+ artwork: string;
+ dateCreated: string;
+
+ // Stage 2
+ questions?: QuestionInfo[];
+
+ // If there are some questions, then we need to encrypt the answers
+ pubKey?: string;
+ encPrivKey?: string;
+ iv?: string;
+ salt?: string;
+}
+
+export interface EventDrop {
+ drop_id: string;
+ funder_id: string;
+ drop_config: {
+ nft_keys_config: {
+ token_metadata: TicketInfoMetadata;
+ };
+ };
+}
+
+export interface DateAndTimeInfo {
+ startDate: number; // Milliseconds from Unix Epoch
+
+ startTime?: string; // Raw time string such as 9:00 AM
+ // For single day events, toDay is not required
+ endDate?: number; // Milliseconds from Unix Epoch
+ endTime?: string; // Raw time string such as 9:00 AM
+}
+
+export interface TicketMetadataExtra {
+ eventId: string;
+ dateCreated: string;
+ salesValidThrough: DateAndTimeInfo;
+ passValidThrough: DateAndTimeInfo;
+ price: string;
+ limitPerUser: number;
+ maxSupply?: number;
+}
+
+export interface TicketInfoMetadata {
+ title: string;
+ description: string;
+ media: string; // CID to IPFS. To render, use `${CLOUDFLARE_IPDS}/${media}`
+ extra: string; // Stringified TicketMetadataExtra
+}
+
+/// Maps UUID to Event Metadata
+export type FunderMetadata = Record;
+
+export function isValidTicketNFTMetadata(tokenMetadata: TicketInfoMetadata) {
+ try {
+ const extraMetadata: TicketMetadataExtra = JSON.parse(tokenMetadata.extra);
+
+ // Check if all required properties exist and are of type 'string'
+ return (
+ typeof tokenMetadata.title === 'string' &&
+ typeof tokenMetadata.description === 'string' &&
+ typeof tokenMetadata.media === 'string' &&
+ typeof extraMetadata.price === 'string' &&
+ typeof extraMetadata.salesValidThrough === 'object' &&
+ typeof extraMetadata.passValidThrough === 'object' &&
+ typeof extraMetadata.salesValidThrough.startDate === 'number'
+ );
+ } catch (e) {
+ return false;
+ }
+}
+
+const FIRST_DROP_BASE_COST = BigInt('15899999999999900000000');
+const SUBSEQUENT_DROP_BASE_COST = BigInt('14460000000000200000000');
+const FUNDER_METADATA_BASE_COST = BigInt('840000000000000000000');
+const FIRST_MARKET_DROP_BASE_COST = BigInt('11790000000000000000000');
+const SUBSEQUENT_MARKET_DROP_BASE_COST = BigInt('6810000000000000000000');
+const YOCTO_PER_BYTE = BigInt('15000000000000000000'); // Includes a 200% safety margin
+
+const BASE_MARKET_BYTES_PER_KEY = BigInt('800');
+const METADATA_MARKET_BYTES_PER_KEY = BigInt('900');
+
+export function getByteSize(str: string) {
+ return new Blob([str]).size;
+}
+
+export const yoctoPerFreeKey = () => {
+ return (BASE_MARKET_BYTES_PER_KEY + METADATA_MARKET_BYTES_PER_KEY) * YOCTO_PER_BYTE;
+};
+
+export const calculateDepositCost = ({
+ eventMetadata,
+ eventTickets,
+ marketTicketInfo,
+}: {
+ eventMetadata: FunderEventMetadata;
+ eventTickets: TicketInfoFormMetadata[];
+ marketTicketInfo: Record<
+ string,
+ { max_tickets: number; price: string; sale_start?: number; sale_end?: number }
+ >;
+}) => {
+ let marketDeposit = FIRST_MARKET_DROP_BASE_COST;
+ let dropDeposit = FIRST_DROP_BASE_COST;
+ let funderMetaCost = FUNDER_METADATA_BASE_COST;
+
+ // Calculate drop deposit
+ dropDeposit += BigInt(eventTickets.length - 1) * SUBSEQUENT_DROP_BASE_COST;
+ dropDeposit += BigInt(getByteSize(JSON.stringify(eventTickets))) * YOCTO_PER_BYTE;
+
+ // Calculate funder metadata cost
+ funderMetaCost += BigInt(getByteSize(JSON.stringify(eventMetadata))) * YOCTO_PER_BYTE;
+
+ // Initialize market deposit
+ marketDeposit +=
+ BigInt(Object.keys(marketTicketInfo).length - 1) * SUBSEQUENT_MARKET_DROP_BASE_COST;
+
+ let numFreeKeys = 0; // Initialize numFreeKeys as a number
+ for (const keyInfo of Object.values(marketTicketInfo)) {
+ if (keyInfo.price === '0') {
+ numFreeKeys += keyInfo.max_tickets; // Ensure max_tickets is a number
+ }
+ }
+
+ // Calculate market key cost for free keys (if any)
+ marketDeposit +=
+ BigInt(numFreeKeys) *
+ (BASE_MARKET_BYTES_PER_KEY + METADATA_MARKET_BYTES_PER_KEY) *
+ YOCTO_PER_BYTE;
+
+ // Return the total deposit cost
+ return {
+ costBreakdown: {
+ perDrop: (dropDeposit / BigInt(eventTickets.length)).toString(),
+ perEvent: funderMetaCost.toString(),
+ marketListing: marketDeposit.toString(),
+ total: (dropDeposit + funderMetaCost + marketDeposit).toString(),
+ },
+ };
+};
diff --git a/src/lib/keypom.ts b/src/lib/keypom.ts
index fc81332c..eb8e775e 100644
--- a/src/lib/keypom.ts
+++ b/src/lib/keypom.ts
@@ -7,7 +7,6 @@ import {
getFTMetadata,
claim,
getKeyInformation,
- hashPassword,
getPubFromSecret,
formatNearAmount,
formatLinkdropUrl,
@@ -19,13 +18,34 @@ import {
deleteDrops,
getDropSupplyForOwner,
getDrops,
+ type ProtocolReturnedKeyInfo,
} from 'keypom-js';
import * as nearAPI from 'near-api-js';
+import { type Wallet } from '@near-wallet-selector/core';
+import * as bs58 from 'bs58';
+import * as nacl from 'tweetnacl';
+import * as naclUtil from 'tweetnacl-util';
-import { CLOUDFLARE_IPFS, DROP_TYPE, MASTER_KEY } from '@/constants/common';
+import { truncateAddress } from '@/utils/truncateAddress';
+import {
+ CLOUDFLARE_IPFS,
+ DROP_TYPE,
+ KEYPOM_EVENTS_CONTRACT,
+ KEYPOM_MARKETPLACE_CONTRACT,
+ MASTER_KEY,
+} from '@/constants/common';
import getConfig from '@/config/config';
import { get } from '@/utils/localStorage';
+import {
+ type FunderEventMetadata,
+ type FunderMetadata,
+ isValidTicketNFTMetadata,
+ type TicketMetadataExtra,
+ type EventDrop,
+} from './eventsHelpers';
+import { decryptPrivateKey, decryptWithPrivateKey, deriveKeyFromPassword } from './cryptoHelpers';
+
let instance: KeypomJS;
const ACCOUNT_ID_REGEX = /^(([a-z\d]+[-_])*[a-z\d]+\.)*([a-z\d]+[-_])*[a-z\d]+$/;
const networkId = process.env.REACT_APP_NETWORK_ID ?? 'testnet';
@@ -42,59 +62,206 @@ const connectionConfig = {
explorerUrl: config.explorerUrl,
};
-const CACHE_MAX_AGE = 5000; // in ms
+export interface DropKeyItem {
+ id: number;
+ publicKey: string;
+ link: string;
+ slug: string;
+ hasClaimed: boolean;
+ keyInfo: ProtocolReturnedKeyInfo | undefined;
+}
+
+export interface AttendeeKeyItem {
+ drop_id: string;
+ pub_key: string;
+ owner_id: string;
+ metadata: string;
+ uses_remaining: number;
+ message_nonce: number;
+}
+
+const KEY_ITEMS_PER_QUERY = 30;
+const DROP_ITEMS_PER_QUERY = 5;
class KeypomJS {
- private static instance: KeypomJS;
+ static instance: KeypomJS;
nearConnection: nearAPI.Near;
- test = 0;
-
- dropStore: {
- dropWithKeys: Record<
- string,
- Record<
- number,
- {
- drop: ProtocolReturnedDrop;
- cacheExpiryTime: number;
- pk?: string[];
- sk?: string[];
- }
- >
- >;
- paginatedMyDrops: Record;
- } = {
- dropWithKeys: {}, // this is to cache the keys of each respective drops, mainly used in DropManager.tsx and [id].tsx
- paginatedMyDrops: {}, // this is to cache the drops from My Drops, mainly used in AllDrops.tsx
- };
+ viewAccount: nearAPI.Account;
+
+ allEventsGallery: any[];
+
+ // Map the event ID to a set of drop IDs
+ ticketDropsByEventId: Record = {};
+ // Maps the event ID to its metadata
+ eventInfoById: Record = {};
+ // Map a drop ID to a set of keys
+ purchasedTicketsById: Record<
+ string,
+ {
+ totalKeys: number;
+ dropInfo: EventDrop;
+ dropKeyItems: AttendeeKeyItem[];
+ }
+ > = {};
+
+ // Drops
+ totalDrops: number;
+ dropStore: Record = {};
+ keyStore: Record<
+ string,
+ {
+ dropName: string;
+ totalKeys: number;
+ dropKeyItems: DropKeyItem[];
+ }
+ > = {};
constructor() {
if (instance !== undefined) {
throw new Error('New instance cannot be created!!');
}
- }
- init = async () => {
- initKeypom({ network: networkId })
- .then(() => {
- console.log('KeypomJS initialized');
- })
- .catch((err) => {
- console.error('Failed to initialize KeypomJS', err);
- });
-
- const { connect } = nearAPI;
+ this.init();
+ }
- this.nearConnection = await connect(connectionConfig);
- };
+ async init() {
+ await initKeypom({ network: networkId });
+ this.nearConnection = await nearAPI.connect(connectionConfig);
+ this.viewAccount = await this.nearConnection.account(config.contractId);
+ }
public static getInstance(): KeypomJS {
- if (!KeypomJS.instance) {
+ if (
+ KeypomJS.instance == null ||
+ KeypomJS.instance === undefined ||
+ !(KeypomJS.instance instanceof KeypomJS) ||
+ this.instance === undefined
+ ) {
KeypomJS.instance = new KeypomJS();
}
return KeypomJS.instance;
}
+ yoctoToNear = (yocto: string) => nearAPI.utils.format.formatNearAmount(yocto, 4);
+
+ nearToYocto = (near: string) => nearAPI.utils.format.parseNearAmount(near);
+
+ viewCall = async ({ contractId = KEYPOM_EVENTS_CONTRACT, methodName, args }) => {
+ const res = await this.viewAccount.viewFunctionV2({
+ contractId,
+ methodName,
+ args,
+ });
+ return res;
+ };
+
+ getResalesForEvent = async ({ eventId }) => {
+ return await this.viewAccount.viewFunctionV2({
+ contractId: KEYPOM_MARKETPLACE_CONTRACT,
+ methodName: 'get_resales_per_event',
+ args: { event_id: eventId },
+ });
+ };
+
+ GetGlobalKey = async () => {
+ return await this.viewAccount.viewFunctionV2({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'get_global_secret_key',
+ args: {},
+ });
+ };
+
+ ListUnownedTickets = async ({ msg }) => {
+ // const publicKey = JSON.parse(msg).linkdrop_pk;
+ const keypomGlobalSecretKey = await this.GetGlobalKey();
+ const keypomKeypair = nearAPI.KeyPair.fromString(keypomGlobalSecretKey);
+ myKeyStore.setKey(networkId, KEYPOM_EVENTS_CONTRACT, keypomKeypair);
+ const keypomAccount = new nearAPI.Account(
+ this.nearConnection.connection,
+ KEYPOM_EVENTS_CONTRACT,
+ );
+ await keypomAccount.functionCall({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'nft_approve',
+ args: {
+ account_id: KEYPOM_MARKETPLACE_CONTRACT,
+ msg,
+ },
+ gas: '300000000000000',
+ });
+ };
+
+ GenerateResellSignature = async (keypair) => {
+ const sk_bytes = bs58.decode(keypair.secretKey);
+
+ const signing_message = await this.viewAccount.viewFunctionV2({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'get_signing_message',
+ args: {},
+ });
+ const key_info = await this.viewAccount.viewFunctionV2({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'get_key_information',
+ args: {
+ key: keypair.publicKey.toString(),
+ },
+ });
+ const message_nonce = key_info.message_nonce;
+
+ const message = `${String(signing_message)}${String(message_nonce.toString())}`;
+ const message_bytes = new TextEncoder().encode(`${message}`);
+
+ const signature = nacl.sign.detached(message_bytes, sk_bytes);
+ const base64_signature = naclUtil.encodeBase64(signature);
+
+ return [base64_signature, signature];
+ };
+
+ GenerateTicketKeys = async (numKeys) => {
+ const { publicKeys, secretKeys } = await generateKeys({
+ numKeys,
+ // rootEntropy: `${get(MASTER_KEY) as string}-${dropId}`,
+ // autoMetaNonceStart: start,
+ });
+
+ return { publicKeys, secretKeys };
+ };
+
+ GetMarketListings = async ({ contractId = KEYPOM_MARKETPLACE_CONTRACT, limit, from_index }) => {
+ if (limit > 50) {
+ limit = 50;
+ }
+ if (
+ this.allEventsGallery == null ||
+ this.allEventsGallery === undefined ||
+ this.allEventsGallery.length === 0
+ ) {
+ const supply = await this.getEventSupply();
+ // initialize to length supply
+ this.allEventsGallery = new Array(supply).fill(null);
+ }
+
+ const cached = this.allEventsGallery.slice(from_index, parseInt(from_index) + parseInt(limit));
+
+ const hasNoNulls = cached.every((item) => item !== null);
+ const hasNoUndefineds = cached.every((item) => item !== undefined);
+
+ if (hasNoNulls && hasNoUndefineds) {
+ // just return from cache
+ return cached;
+ }
+
+ const answer = await this.viewAccount.viewFunctionV2({
+ contractId,
+ methodName: 'get_events',
+ args: { limit, from_index },
+ });
+
+ this.allEventsGallery.splice(from_index, limit, ...answer);
+
+ return answer;
+ };
+
validateAccountId = async (accountId: string) => {
if (!(accountId.length >= 2 && accountId.length <= 64 && ACCOUNT_ID_REGEX.test(accountId))) {
throw new Error('Account Id is invalid');
@@ -148,23 +315,47 @@ class KeypomJS {
}
};
- claimTicket = async (secretKey: string, password: string) => {
- let keyInfo = await getKeyInformation({ secretKey });
- const publicKey: string = getPubFromSecret(secretKey);
- const passwordForClaim = await hashPassword(
- password + publicKey + keyInfo.cur_key_use.toString(),
- );
+ onEventTicketScanned = async (secretKey: string) => {
+ const pubKey = getPubFromSecret(secretKey);
- try {
- await claim({ secretKey, password: passwordForClaim, accountId: 'foo' });
- } catch (e) {
- console.warn(e);
- }
+ const keypomGlobalSecretKey = await this.GetGlobalKey();
+ const keypomKeypair = nearAPI.KeyPair.fromString(keypomGlobalSecretKey);
+ await myKeyStore.setKey(networkId, KEYPOM_EVENTS_CONTRACT, keypomKeypair);
+ const keypomAccount = new nearAPI.Account(
+ this.nearConnection.connection,
+ KEYPOM_EVENTS_CONTRACT,
+ );
- keyInfo = await getKeyInformation({ secretKey });
- if (keyInfo.remaining_uses === 2) {
- throw new Error('Password is incorrect. Please try again.');
- }
+ const sk_bytes = bs58.decode(secretKey);
+ const signingMessage = await this.viewAccount.viewFunctionV2({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'get_signing_message',
+ args: {},
+ });
+ const keyInfo = await this.viewAccount.viewFunctionV2({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'get_key_information',
+ args: {
+ key: pubKey,
+ },
+ });
+ const message_nonce = keyInfo.message_nonce;
+ const message = `${String(signingMessage)}${String(message_nonce.toString())}`;
+ const message_bytes = new TextEncoder().encode(`${message}`);
+ const signature = nacl.sign.detached(message_bytes, sk_bytes);
+ const base64Signature = naclUtil.encodeBase64(signature);
+ const gasToAttach = keyInfo.required_gas;
+
+ await keypomAccount.functionCall({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'claim',
+ args: {
+ account_id: KEYPOM_EVENTS_CONTRACT,
+ signature: base64Signature,
+ linkdrop_pk: pubKey,
+ },
+ gas: gasToAttach,
+ });
};
// valid contract id -> v1-3.keypom.testnet
@@ -189,10 +380,6 @@ class KeypomJS {
}
if (drop.fc !== undefined) {
- if (drop.fc.methods[0]?.length === 2) {
- return DROP_TYPE.TRIAL;
- }
-
if (drop.fc.methods.length === 3) {
return DROP_TYPE.TICKET;
}
@@ -200,6 +387,7 @@ class KeypomJS {
if (
drop.fc.methods.length === 1 &&
drop.fc.methods[0] !== undefined &&
+ drop.fc.methods[0] !== null &&
drop.fc.methods[0][0].method_name === 'nft_mint'
) {
return DROP_TYPE.NFT;
@@ -209,43 +397,551 @@ class KeypomJS {
return DROP_TYPE.OTHER;
};
- getDrops = async ({
+ // Utility function to fetch drops for a specific page index
+ async fetchDropsPage(accountId, pageIndex) {
+ return await getDrops({
+ accountId,
+ start: pageIndex * DROP_ITEMS_PER_QUERY,
+ limit: DROP_ITEMS_PER_QUERY,
+ withKeys: false,
+ });
+ }
+
+ // Main function to get drops, with caching logic for paginated values
+ getAllDrops = async ({ accountId }: { accountId: string }) => {
+ try {
+ // If totalDrops is not known, fetch it
+ if (!this.totalDrops) {
+ this.totalDrops = await getDropSupplyForOwner({ accountId });
+ }
+
+ // Initialize the cache for this account if it doesn't exist
+ if (this.dropStore[accountId] == null || this.dropStore[accountId] === undefined) {
+ this.dropStore[accountId] = [];
+ }
+
+ if (this.dropStore[accountId].length >= this.totalDrops) {
+ return this.dropStore[accountId];
+ }
+
+ const totalQueries = Math.ceil(this.totalDrops / DROP_ITEMS_PER_QUERY);
+ const pageIndices = Array.from({ length: totalQueries }, (_, index) => index);
+
+ const allPagesDrops = await Promise.all(
+ pageIndices.map(
+ async (pageIndex) =>
+ await getDrops({
+ accountId,
+ start: pageIndex * DROP_ITEMS_PER_QUERY,
+ limit: DROP_ITEMS_PER_QUERY,
+ withKeys: false,
+ }),
+ ),
+ );
+ this.dropStore[accountId] = allPagesDrops.flat();
+
+ return this.dropStore[accountId];
+ } catch (error) {
+ throw new Error('Failed to fetch drops.');
+ }
+ };
+
+ getKeySupplyForTicket = async (dropId: string) => {
+ return await this.viewCall({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'get_key_supply_for_drop',
+ args: { drop_id: dropId },
+ });
+ };
+
+ getEventSupply = async () => {
+ return await this.viewAccount.viewFunctionV2({
+ contractId: KEYPOM_MARKETPLACE_CONTRACT,
+ methodName: 'get_event_supply',
+ args: {},
+ });
+ };
+
+ getStripeAccountId = async (accountId: string) => {
+ return await this.viewCall({
+ contractId: KEYPOM_MARKETPLACE_CONTRACT,
+ methodName: 'get_stripe_id_for_account',
+ args: { account_id: accountId },
+ });
+ };
+
+ getStripeEnabledEvents = async () => {
+ return await this.viewCall({
+ contractId: KEYPOM_MARKETPLACE_CONTRACT,
+ methodName: 'get_stripe_enabled_events',
+ args: {},
+ });
+ };
+
+ deleteEventFromFunderMetadata = async ({
+ wallet,
+ eventId,
+ accountId,
+ }: {
+ wallet: Wallet;
+ eventId: string;
+ accountId: string;
+ }) => {
+ const funderInfo = await this.viewCall({
+ methodName: 'get_funder_info',
+ args: { account_id: accountId },
+ });
+ const meta: FunderMetadata = JSON.parse(funderInfo.metadata);
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ delete meta[eventId];
+
+ await wallet.signAndSendTransaction({
+ signerId: accountId,
+ receiverId: KEYPOM_EVENTS_CONTRACT,
+ actions: [
+ {
+ type: 'FunctionCall',
+ params: {
+ methodName: 'set_funder_metadata',
+ args: { metadata: JSON.stringify(meta) },
+ gas: '300000000000000',
+ deposit: '0',
+ },
+ },
+ ],
+ });
+ };
+
+ deleteEventFromCache = ({ eventId }: { eventId: string }) => {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ delete this.eventInfoById[eventId];
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ delete this.ticketDropsByEventId[eventId];
+ };
+
+ deleteTicketFromCache = ({ dropId }: { dropId: string }) => {
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
+ delete this.purchasedTicketsById[dropId];
+ };
+
+ getEventInfo = async ({
accountId,
+ eventId,
+ }: {
+ accountId: string;
+ eventId: string;
+ }): Promise => {
+ try {
+ const funderInfo = await this.viewCall({
+ methodName: 'get_funder_info',
+ args: { account_id: accountId },
+ });
+
+ const funderMeta: Record = JSON.parse(funderInfo.metadata);
+ const eventInfo: FunderEventMetadata = funderMeta[eventId];
+
+ eventInfo.artwork = `${CLOUDFLARE_IPFS}/${eventInfo.artwork}`;
+
+ return eventInfo;
+ } catch (error) {
+ /* eslint-disable no-console */
+ console.error('Error getting event info', error);
+ return null;
+ }
+ };
+
+ groupDropsByEvent = (drops: EventDrop[]) => {
+ for (const eventDrop of drops) {
+ const metadata: TicketMetadataExtra = JSON.parse(
+ eventDrop.drop_config.nft_keys_config.token_metadata.extra,
+ );
+
+ if (!Object.hasOwn(this.ticketDropsByEventId, metadata.eventId)) {
+ this.ticketDropsByEventId[metadata.eventId] = [];
+ }
+ this.ticketDropsByEventId[metadata.eventId].push(eventDrop);
+ }
+ };
+
+ groupAllDropsForAccount = async ({ accountId }: { accountId: string }) => {
+ const numDrops = await this.viewCall({
+ methodName: 'get_drop_supply_for_funder',
+ args: { account_id: accountId },
+ });
+ const totalQueries = Math.ceil(numDrops / DROP_ITEMS_PER_QUERY);
+ const pageIndices = Array.from({ length: totalQueries }, (_, index) => index);
+
+ const allPagesDrops = await Promise.all(
+ pageIndices.map(
+ async (pageIndex) =>
+ await this.viewCall({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'get_drops_for_funder',
+ args: {
+ account_id: accountId,
+ from_index: (pageIndex * DROP_ITEMS_PER_QUERY).toString(),
+ limit: DROP_ITEMS_PER_QUERY,
+ },
+ }),
+ ),
+ );
+
+ let allDrops: EventDrop[] = allPagesDrops.flat(); // Assuming allPagesDrops is already defined and flattened.
+ allDrops = allDrops.filter((drop) => {
+ if (
+ !drop.drop_id ||
+ !drop.funder_id ||
+ !drop.drop_config ||
+ !drop.drop_config.nft_keys_config
+ ) {
+ return false; // Drop does not have the required top-level structure
+ }
+
+ return isValidTicketNFTMetadata(drop.drop_config.nft_keys_config.token_metadata);
+ });
+
+ // Add cloudflare IPFS prefix to media
+ allDrops = allDrops.map((drop) => {
+ return {
+ ...drop,
+ drop_config: {
+ ...drop.drop_config,
+ nft_keys_config: {
+ ...drop.drop_config.nft_keys_config,
+ token_metadata: {
+ ...drop.drop_config.nft_keys_config.token_metadata,
+ media: `${CLOUDFLARE_IPFS}/${drop.drop_config.nft_keys_config.token_metadata.media}`,
+ },
+ },
+ },
+ };
+ });
+
+ this.groupDropsByEvent(allDrops);
+ };
+
+ getTicketsForEventId = async ({ accountId, eventId }: { accountId: string; eventId: string }) => {
+ if (!Object.hasOwn(this.ticketDropsByEventId, eventId)) {
+ await this.groupAllDropsForAccount({ accountId });
+ }
+
+ if (
+ this.ticketDropsByEventId[eventId] != null &&
+ this.ticketDropsByEventId[eventId] !== undefined
+ ) {
+ return this.ticketDropsByEventId[eventId];
+ }
+
+ return [];
+ };
+
+ getEventsForAccount = async ({ accountId }: { accountId: string }) => {
+ try {
+ const funderInfo = await this.viewCall({
+ methodName: 'get_funder_info',
+ args: { account_id: accountId },
+ });
+ const funderMeta: FunderMetadata = JSON.parse(funderInfo.metadata);
+
+ const events: FunderEventMetadata[] = [];
+ for (const eventId in funderMeta) {
+ const eventInfo: FunderEventMetadata = funderMeta[eventId];
+ eventInfo.artwork = `${CLOUDFLARE_IPFS}/${eventInfo.artwork}`;
+
+ events.push(eventInfo);
+ this.eventInfoById[eventId] = eventInfo;
+ }
+
+ return events;
+ } catch (error) {
+ throw new Error('Failed to fetch drops.');
+ }
+ };
+
+ getDerivedPrivKey = async ({ encryptedPk, pw, saltBase64, ivBase64 }) => {
+ // Step 3: Derive a symmetric key from the password
+ const symmetricKey = await deriveKeyFromPassword(pw, saltBase64);
+ // Step 5: Decrypt the private key using the symmetric key
+ const decryptedPrivateKey = await decryptPrivateKey(encryptedPk, ivBase64, symmetricKey);
+ return decryptedPrivateKey;
+ };
+
+ decryptMetadata = async ({ privKey, data }) => {
+ // Step 6: Decrypt the encrypted data using the decrypted private key
+ const decryptedData = await decryptWithPrivateKey(data, privKey);
+ return decryptedData;
+ };
+
+ getAllKeysForTicket = async ({ dropId }) => {
+ try {
+ const dropInfo = await this.viewCall({
+ methodName: 'get_drop_information',
+ args: { drop_id: dropId },
+ });
+ const totalKeys = dropInfo.next_key_id;
+ if (
+ !Object.hasOwn(this.purchasedTicketsById, dropId) ||
+ this.purchasedTicketsById[dropId]?.totalKeys !== totalKeys
+ ) {
+ // Initialize the cache for this drop
+ this.purchasedTicketsById[dropId] = {
+ dropKeyItems: new Array(totalKeys).fill(null),
+ dropInfo,
+ totalKeys,
+ };
+
+ // Define how many batches are needed based on KEY_ITEMS_PER_QUERY
+ const totalBatches = Math.ceil(totalKeys / KEY_ITEMS_PER_QUERY);
+ const batchPromises: Array> = [];
+
+ for (let i = 0; i < totalBatches; i++) {
+ const start = i * KEY_ITEMS_PER_QUERY;
+ const limit = Math.min(KEY_ITEMS_PER_QUERY, totalKeys - start);
+
+ batchPromises.push(
+ this.viewCall({
+ methodName: 'get_keys_for_drop',
+ args: { drop_id: dropId, from_index: start.toString(), limit },
+ }),
+ );
+ }
+
+ // Wait for all batches to resolve and process the results
+ const batchResults = await Promise.all(batchPromises);
+ this.purchasedTicketsById[dropId].dropKeyItems = batchResults.flat(); // Use .flat()
+ }
+
+ return this.purchasedTicketsById[dropId];
+ } catch (error) {
+ throw new Error('Failed to get keys info.');
+ }
+ };
+
+ getTicketKeyInformation = async ({ publicKey }: { publicKey: string }) => {
+ const fetchedinfo = await this.viewAccount.viewFunctionV2({
+ contractId: KEYPOM_EVENTS_CONTRACT,
+ methodName: 'get_key_information',
+ args: {
+ key: publicKey,
+ },
+ });
+ return fetchedinfo;
+ };
+
+ getTicketDropInformation = async ({ dropID }: { dropID: string }) => {
+ try {
+ const fetchedinfo = await this.viewCall({
+ methodName: 'get_drop_information',
+ args: {
+ drop_id: dropID,
+ },
+ });
+
+ // Return the requested slice from the cache
+ return fetchedinfo;
+ } catch (e) {
+ throw new Error('Failed to get key info.');
+ }
+ };
+
+ getPaginatedKeysForTicket = async ({
+ dropId,
start,
limit,
- withKeys,
}: {
- accountId: string;
+ dropId: string;
start: number;
limit: number;
- withKeys: boolean;
}) => {
- /** Get Drops caching logic */
- if (
- !Object.prototype.hasOwnProperty.call(this.dropStore.paginatedMyDrops, start) ||
- Date.now() > this.dropStore.paginatedMyDrops[start].cacheExpiryTime
- ) {
- const newDropsCacheExpiryTime = new Date(Date.now() + CACHE_MAX_AGE).getTime();
+ try {
+ // Initialize or update the cache for this drop if it doesn't exist or if total keys have changed
+ const dropInfo = await this.viewCall({
+ methodName: 'get_drop_information',
+ args: { drop_id: dropId },
+ });
+ const totalKeys = dropInfo.next_key_id;
- this.dropStore.paginatedMyDrops[start] = {
- drops: await getDrops({ accountId, start, limit, withKeys }),
- cacheExpiryTime: newDropsCacheExpiryTime,
- };
+ if (
+ !Object.hasOwn(this.purchasedTicketsById, dropId) ||
+ this.purchasedTicketsById[dropId]?.totalKeys !== totalKeys
+ ) {
+ this.purchasedTicketsById[dropId] = {
+ dropInfo,
+ dropKeyItems: new Array(totalKeys).fill(null),
+ totalKeys,
+ };
+ }
+
+ // Calculate the end index for the requested keys
+ const endIndex = Math.min(start + limit, this.purchasedTicketsById[dropId].totalKeys);
+
+ // Fetch and cache only the needed batches
+ for (let i = start; i < endIndex; i += KEY_ITEMS_PER_QUERY) {
+ const batchStart = i;
+ const batchEnd = Math.min(i + KEY_ITEMS_PER_QUERY, endIndex);
+ if (
+ this.purchasedTicketsById[dropId].dropKeyItems
+ .slice(batchStart, batchEnd)
+ .some((item) => item === null)
+ ) {
+ // If any item in the range is null, fetch the batch
+ const fetchedKeys = await this.viewCall({
+ methodName: 'get_keys_for_drop',
+ args: {
+ drop_id: dropId,
+ from_index: batchStart.toString(),
+ limit: batchEnd - batchStart,
+ },
+ });
+ // Assume fetchedKeys is an array of keys; adjust based on actual structure
+ for (let j = 0; j < fetchedKeys.length; j++) {
+ this.purchasedTicketsById[dropId].dropKeyItems[batchStart + j] = fetchedKeys[j];
+ }
+ }
+ }
+
+ // Return the requested slice from the cache
+ return this.purchasedTicketsById[dropId].dropKeyItems.slice(start, endIndex);
+ } catch (e) {
+ throw new Error('Failed to get paginated keys info.');
}
+ };
- return this.dropStore.paginatedMyDrops[start].drops;
+ // Main function to get drops, with caching logic for paginated values
+ getPaginatedDrops = async ({
+ accountId,
+ start,
+ limit,
+ }: {
+ accountId: string;
+ start: number;
+ limit: number;
+ }) => {
+ try {
+ // If totalDrops is not known, fetch it
+ if (!this.totalDrops) {
+ this.totalDrops = await getDropSupplyForOwner({ accountId });
+ }
+
+ // Initialize the cache for this account if it doesn't exist
+ if (this.dropStore[accountId] == null || this.dropStore[accountId] === undefined) {
+ this.dropStore[accountId] = [];
+ }
+
+ // Calculate the end index and the page index for start and end
+ const endIndex = start + limit;
+ const startPageIndex = Math.floor(start / DROP_ITEMS_PER_QUERY);
+ const endPageIndex = Math.ceil(endIndex / DROP_ITEMS_PER_QUERY);
+
+ // Fetch and cache pages as needed
+ for (let pageIndex = startPageIndex; pageIndex < endPageIndex; pageIndex++) {
+ const pageStart = pageIndex * DROP_ITEMS_PER_QUERY;
+
+ // Only fetch if this page hasn't been cached yet
+ if (
+ this.dropStore[accountId][pageStart] == null ||
+ this.dropStore[accountId][pageStart] === undefined
+ ) {
+ const pageDrops = await this.fetchDropsPage(accountId, pageIndex);
+
+ // Cache each item from the page with its index as the key
+ pageDrops.forEach((drop, index) => {
+ this.dropStore[accountId][pageStart + index] = drop;
+ });
+ }
+ }
+
+ // Return the requested slice from the cache
+ return this.dropStore[accountId].slice(start, endIndex);
+ } catch (error) {
+ throw new Error('Failed to fetch drops.');
+ }
};
getDropSupplyForOwner = async ({ accountId }) => await getDropSupplyForOwner({ accountId });
getDropMetadata = (metadata: string | undefined) => {
const parsedObj = JSON.parse(metadata || '{}');
+ if (Object.hasOwn(parsedObj, 'drop_name')) {
+ parsedObj.dropName = parsedObj.drop_name;
+ }
+
if (!Object.hasOwn(parsedObj, 'dropName')) {
parsedObj.dropName = 'Untitled';
}
return parsedObj;
};
+ getDropData = async ({
+ drop,
+ dropId,
+ }: {
+ drop?: ProtocolReturnedDrop;
+ dropId?: string | number;
+ }) => {
+ if (drop === undefined && dropId === undefined) {
+ throw new Error('drop or dropId must be provided.');
+ }
+
+ if (dropId !== undefined) {
+ drop = await this.getDropInfo({ dropId: dropId.toString() });
+ }
+ if (drop == null || drop === undefined) throw new Error('Drop is null or undefined');
+
+ const { drop_id: id, metadata, next_key_id: totalKeys } = drop;
+ const claimedKeys = await this.getAvailableKeys(id);
+ const claimedText = `${totalKeys - claimedKeys} / ${totalKeys}`;
+
+ const { dropName } = this.getDropMetadata(metadata);
+
+ let type: string | null = '';
+ try {
+ if (drop == null || drop === undefined) throw new Error('Drop is null or undefined');
+ type = this.getDropType(drop);
+ } catch (_) {
+ type = DROP_TYPE.OTHER;
+ }
+
+ let nftHref: string | undefined;
+ if (type === DROP_TYPE.NFT) {
+ let nftMetadata = {
+ media: '',
+ title: '',
+ description: '',
+ };
+ try {
+ const fcMethods = drop.fc?.methods;
+ if (
+ fcMethods === undefined ||
+ fcMethods.length === 0 ||
+ fcMethods[0] === undefined ||
+ fcMethods[0][0] === undefined
+ ) {
+ throw new Error('Unable to retrieve function calls.');
+ }
+
+ const { nftData } = await this.getNFTorTokensMetadata(fcMethods[0][0], drop.drop_id);
+
+ nftMetadata = {
+ media: `${CLOUDFLARE_IPFS}/${nftData?.metadata?.media}`, // eslint-disable-line
+ title: nftData?.metadata?.title,
+ description: nftData?.metadata?.description,
+ };
+ } catch (e) {
+ throw new Error('Failed to get NFT metadata.');
+ }
+ nftHref = nftMetadata?.media || 'assets/image-not-found.png';
+ }
+
+ return {
+ id,
+ name: truncateAddress(dropName, 'end', 48),
+ type: type !== 'NFT' ? type?.toLowerCase() : type,
+ media: nftHref,
+ claimed: claimedText,
+ };
+ };
+
deleteDrops = async ({ wallet, dropIds }) => await deleteDrops({ wallet, dropIds });
deleteKeys = async ({ wallet, dropId, publicKeys }) =>
@@ -294,69 +990,116 @@ class KeypomJS {
return links;
};
- getKeysInfo = async (
- dropId: string,
- pageIndex: number,
- pageSize: number,
- getDropErrorCallback?: () => void,
- ) => {
+ // Utility function to fetch a batch of key information
+ fetchKeyBatch = async (dropId: string, start: number, limit: number) => {
+ const { publicKeys, secretKeys } = await generateKeys({
+ numKeys: limit,
+ rootEntropy: `${get(MASTER_KEY) as string}-${dropId}`,
+ autoMetaNonceStart: start,
+ });
+
+ const keyInfos = await getKeyInformationBatch({ publicKeys });
+
+ const dropKeyItems: DropKeyItem[] = [];
+ keyInfos.forEach((info, index) => {
+ const keyIndex = start + index;
+ this.keyStore[dropId].dropKeyItems[keyIndex] = {
+ id: keyIndex,
+ link: `${window.location.origin}/claim/${getConfig().contractId}#${secretKeys[
+ index
+ ].replace('ed25519:', '')}`,
+ slug: secretKeys[index].substring(8, 16),
+ publicKey: publicKeys[index],
+ hasClaimed: info === null, // Assuming the info contains data to determine this
+ keyInfo: info,
+ };
+ });
+
+ return dropKeyItems;
+ };
+
+ async getAllKeysInfo({ dropId }) {
try {
- /** Get PaginatedDrops caching logic */
+ const dropInfo = await this.getDropInfo({ dropId });
+ const dropName = this.getDropMetadata(dropInfo.metadata).dropName;
+ const totalKeys = dropInfo.next_key_id;
if (
- !Object.prototype.hasOwnProperty.call(this.dropStore.dropWithKeys, dropId) ||
- !Object.prototype.hasOwnProperty.call(this.dropStore.dropWithKeys[dropId], pageIndex) ||
- Date.now() > this.dropStore.dropWithKeys[dropId][pageIndex].cacheExpiryTime
+ this.keyStore[dropId] == null ||
+ this.keyStore[dropId] === undefined ||
+ (this.keyStore[dropId] != null && this.keyStore[dropId].totalKeys !== totalKeys)
) {
- if (this.dropStore.dropWithKeys[dropId] === undefined)
- this.dropStore.dropWithKeys[dropId] = {};
- const newPaginatedDropsCacheExpiryTime = new Date(Date.now() + CACHE_MAX_AGE).getTime();
-
- this.dropStore.dropWithKeys[dropId][pageIndex] = {
- drop: await this.getDropInfo({ dropId }),
- cacheExpiryTime: newPaginatedDropsCacheExpiryTime,
- pk: undefined,
- sk: undefined,
+ // Initialize the cache for this drop
+ this.keyStore[dropId] = {
+ dropName,
+ dropKeyItems: new Array(totalKeys).fill(null),
+ totalKeys,
};
- }
- const dropSize = this.dropStore.dropWithKeys[dropId][pageIndex].drop.next_key_id;
- const { dropName } = this.getDropMetadata(
- this.dropStore.dropWithKeys[dropId][pageIndex].drop.metadata,
- );
+ // Define how many batches are needed based on KEY_ITEMS_PER_QUERY
+ const totalBatches = Math.ceil(totalKeys / KEY_ITEMS_PER_QUERY);
+ const batchPromises: Array> = [];
- // Get PaginatedDrops PK SK caching logic
- if (
- this.dropStore.dropWithKeys[dropId][pageIndex].pk === undefined ||
- this.dropStore.dropWithKeys[dropId][pageIndex].sk === undefined
- ) {
- const { publicKeys, secretKeys } = await generateKeys({
- numKeys:
- (pageIndex + 1) * pageSize > dropSize
- ? dropSize - pageIndex * pageSize
- : Math.min(dropSize, pageSize),
- rootEntropy: `${get(MASTER_KEY) as string}-${dropId}`,
- autoMetaNonceStart: pageIndex * pageSize,
- });
-
- this.dropStore.dropWithKeys[dropId][pageIndex].pk = publicKeys;
- this.dropStore.dropWithKeys[dropId][pageIndex].sk = secretKeys;
+ for (let i = 0; i < totalBatches; i++) {
+ const start = i * KEY_ITEMS_PER_QUERY;
+ const limit = Math.min(KEY_ITEMS_PER_QUERY, totalKeys - start);
+
+ batchPromises.push(this.fetchKeyBatch(dropId, start, limit));
+ }
+
+ // Wait for all batches to resolve
+ await Promise.all(batchPromises);
}
- const keyInfo = await getKeyInformationBatch({
- publicKeys: this.dropStore.dropWithKeys[dropId][pageIndex].pk,
- secretKeys: this.dropStore.dropWithKeys[dropId][pageIndex].sk,
- });
+ return this.keyStore[dropId];
+ } catch (error) {
+ throw new Error('Failed to get keys info.');
+ }
+ }
- return {
- dropSize,
+ // Main function to get key info, with caching logic for paginated values
+ getPaginatedKeysInfo = async ({
+ dropId,
+ start,
+ limit,
+ }: {
+ dropId: string;
+ start: number;
+ limit: number;
+ }) => {
+ try {
+ // Initialize the cache for this drop if it doesn't exist
+ if (this.keyStore[dropId] == null || this.keyStore[dropId] === undefined)
+ throw new Error('Drop is null or undefined');
+
+ const dropInfo = await this.getDropInfo({ dropId });
+ const dropName = this.getDropMetadata(dropInfo.metadata).dropName;
+ const totalKeys = dropInfo.next_key_id;
+
+ this.keyStore[dropId] = {
dropName,
- publicKeys: this.dropStore.dropWithKeys[dropId][pageIndex].pk,
- secretKeys: this.dropStore.dropWithKeys[dropId][pageIndex].sk,
- keyInfo,
+ dropKeyItems: Array(totalKeys).fill(null), // Initialize with nulls
+ totalKeys,
};
+
+ // Calculate the end index
+ const endIndex = Math.min(start + limit, this.keyStore[dropId].totalKeys);
+
+ // Fetch and cache batches as needed
+ for (let i = start; i < endIndex; i += KEY_ITEMS_PER_QUERY) {
+ if (
+ this.keyStore[dropId].dropKeyItems[i] == null ||
+ this.keyStore[dropId].dropKeyItems[i] === undefined
+ ) {
+ // Fetch the keys for this batch
+ const batchLimit = Math.min(KEY_ITEMS_PER_QUERY, endIndex - i);
+ await this.fetchKeyBatch(dropId, i, batchLimit);
+ }
+ }
+
+ // Return the requested slice from the cache
+ return this.keyStore[dropId].dropKeyItems.slice(start, endIndex);
} catch (e) {
- if (getDropErrorCallback) getDropErrorCallback();
- return; // eslint-disable-line no-useless-return
+ throw new Error('Failed to get keys info.');
}
};
@@ -369,7 +1112,6 @@ class KeypomJS {
try {
await this.getDropInfo({ secretKey });
} catch (err) {
- console.error(err);
throw new Error('This drop has been claimed.');
}
@@ -427,8 +1169,7 @@ class KeypomJS {
args: { mint_id: parseFloat(dropId) },
});
} catch (err) {
- console.error('NFT series not found');
- // throw new Error('NFT series not found');
+ throw new Error('NFT series not found');
}
// show tokens if NFT series not found
diff --git a/src/lib/walletSelector.ts b/src/lib/walletSelector.ts
index da4b0ea7..4ae0451f 100644
--- a/src/lib/walletSelector.ts
+++ b/src/lib/walletSelector.ts
@@ -8,8 +8,9 @@ import { setupModal, type WalletSelectorModal } from '@near-wallet-selector/moda
import { setupNearWallet } from '@near-wallet-selector/near-wallet';
import { setupMyNearWallet } from '@near-wallet-selector/my-near-wallet';
+import { KEYPOM_EVENTS_CONTRACT } from '@/constants/common';
+
const NETWORK_ID = process.env.REACT_APP_NETWORK_ID ?? 'testnet';
-const CONTRACT_ID = process.env.REACT_APP_CONTRACT_ID ?? 'v2.keypom.testnet';
export class NearWalletSelector {
public accounts: AccountState[];
@@ -22,7 +23,7 @@ export class NearWalletSelector {
debug: true,
modules: [setupNearWallet(), setupMyNearWallet()],
});
- const _modal = setupModal(_selector, { contractId: CONTRACT_ID, theme: 'light' });
+ const _modal = setupModal(_selector, { contractId: KEYPOM_EVENTS_CONTRACT, theme: 'light' });
const state = _selector.store.getState();
this.accounts = state.accounts;
diff --git a/src/pages/Event.tsx b/src/pages/Event.tsx
new file mode 100644
index 00000000..d307f1cf
--- /dev/null
+++ b/src/pages/Event.tsx
@@ -0,0 +1,1152 @@
+import {
+ Box,
+ Button,
+ Divider,
+ Heading,
+ Text,
+ Image as ChakraImage,
+ SimpleGrid,
+ useDisclosure,
+ useToast,
+ HStack,
+ Hide,
+ Show,
+} from '@chakra-ui/react';
+import { useParams, useNavigate } from 'react-router-dom';
+import { ExternalLinkIcon } from '@chakra-ui/icons';
+import { useCallback, useEffect, useState } from 'react';
+import { getPubFromSecret } from 'keypom-js';
+import { type Wallet } from '@near-wallet-selector/core';
+
+import { SellModal } from '@/features/gallery/components/SellModal';
+import { PurchaseModal } from '@/features/gallery/components/PurchaseModal';
+import { VerifyModal } from '@/features/gallery/components/VerifyModal';
+import { TicketCard } from '@/features/gallery/components/TicketCard';
+import { useAuthWalletContext } from '@/contexts/AuthWalletContext';
+import {
+ type TicketInfoMetadata,
+ type QuestionInfo,
+ type TicketMetadataExtra,
+ type DateAndTimeInfo,
+ type EventDrop,
+ type FunderEventMetadata,
+} from '@/lib/eventsHelpers';
+import keypomInstance from '@/lib/keypom';
+import { KEYPOM_MARKETPLACE_CONTRACT, PURCHASED_LOCAL_STORAGE_PREFIX } from '@/constants/common';
+import { type DataItem } from '@/components/Table/types';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
+
+interface WorkerPayload {
+ name: string | null;
+ ticketAmount: number;
+ buyerAnswers: string;
+ ticket_info: {
+ location: string;
+ eventName: string;
+ ticketType: string;
+ eventDate: string;
+ ticketOwner: string | undefined;
+ eventId: string;
+ dropId: string;
+ funderId: string;
+ };
+ purchaseEmail: string;
+ stripeAccountId: string | undefined;
+ baseUrl: string;
+ priceNear: string;
+ ticketKeys?: string[];
+ ticketKey?: string;
+}
+
+export interface TicketInterface {
+ id: string;
+ artwork: string;
+ name: string;
+ description: string;
+ salesValidThrough: DateAndTimeInfo;
+ passValidThrough: DateAndTimeInfo;
+ questions?: QuestionInfo[];
+ supply: number;
+ maxTickets: number | undefined;
+ soldTickets: number;
+ limitPerUser: number;
+ priceNear: string;
+ dateString?: string;
+ media?: string;
+ isSecondary?: boolean;
+ publicKey?: string;
+ public_key?: string;
+ price?: string;
+}
+
+export interface EventInterface {
+ title: string;
+ name: string;
+ artwork: string;
+ location: string;
+ date: string;
+ description: string;
+ questions: QuestionInfo[];
+ pubKey: string;
+ secretKey: string;
+ navurl: string | undefined;
+ maxTickets: number | undefined;
+ soldTickets: number | undefined;
+ limitPerUser?: number;
+ numTickets: number | string | undefined;
+ id: number | undefined;
+ media: string | undefined;
+ supply: number | undefined;
+ dateString: string | undefined;
+ price: number | undefined;
+}
+
+export interface SellDropInfo {
+ name: string;
+ artwork: string;
+ questions: QuestionInfo[];
+ location: string;
+ date: string;
+ description: string;
+ publicKey: string;
+ secretKey: string;
+}
+
+export default function Event() {
+ const params = useParams();
+ if (params.eventID == null || params.eventID === undefined) {
+ return (
+
+ Event not found
+
+ Sorry, the event you are looking for does not exist.
+ The URL is malformed.
+
+ );
+ }
+ // split up params into two parts, the funderId and the eventId
+ const eventURL = params.eventID.split(':');
+ const funderId = eventURL[0];
+ const eventId = eventURL[1];
+
+ if (eventId == null || eventId === undefined) {
+ return (
+
+ Event not found
+
+ Sorry, the event you are looking for does not exist.
+ The URL is malformed.
+
+ );
+ }
+
+ const navigate = useNavigate();
+ const toast = useToast();
+
+ // GET SINGLE EVENT DATA USING URL
+ const [event, setEvent] = useState(null);
+ const [stripeEnabledEvent, setStripeEnabledEvent] = useState(false);
+ const [stripeAccountId, setStripeAccountId] = useState('');
+ const [isLoading, setIsLoading] = useState(true);
+ const [noDrop, setNoDrop] = useState(false);
+ const [input, setInput] = useState('');
+ const [ticketList, setTicketList] = useState([]);
+ const [resaleTicketList, setResaleTicketList] = useState([]);
+ const [areTicketsLoading, setAreTicketsLoading] = useState(true);
+ const [doKeyModal, setDoKeyModal] = useState(false);
+
+ const [sellDropInfo, setSellDropInfo] = useState(null);
+
+ // purchase modal
+ const { isOpen, onOpen, onClose } = useDisclosure();
+ const [ticketBeingPurchased, setTicketBeingPurchased] = useState(null);
+ const [ticketAmount, setTicketAmount] = useState(1);
+
+ // verify
+ const { isOpen: verifyIsOpen, onOpen: verifyOnOpen, onClose: verifyOnClose } = useDisclosure();
+
+ const secretKey = window.location.hash.substring(1).trim().split('=', 2)[1];
+
+ const { accountId, selector } = useAuthWalletContext();
+
+ const [wallet, setWallet] = useState();
+
+ useEffect(() => {
+ async function fetchWallet() {
+ if (selector == null || selector === undefined) return;
+ try {
+ const wallet = await selector.wallet();
+ setWallet(wallet);
+ } catch (error) {
+ // This error happens immediately on page load so just wait for the next
+ }
+ }
+ fetchWallet();
+ }, [selector]);
+
+ useEffect(() => {
+ if (keypomInstance == null || keypomInstance === undefined || !eventId || !funderId) return;
+ // TODO: check if secretKey is reasonable
+
+ getKeyInformation();
+ }, [secretKey, eventId]);
+
+ // http://localhost:3000/gallery/minqi.testnet:299df60c-5036-4adb-888f-001706f13962#secretKey=2121cLnS58WEghkDd7qptGovW3f7RGixJE2E6QJXbUkAAWCuRCWHEaxfeMgLpWsuvRAgzityezpW8wFXyahzuLDr
+
+ // http://localhost:3000/gallery/minqi.testnet:299df60c-5036-4adb-888f-001706f13962/?transactionHashes=7VSivNFojMxDr1fVsTQ5teJSeqHxTj6ERG3ctyotBpUm
+ const nearRedirect = window.location.search.substring(1).trim().split('=', 2)[1];
+
+ useEffect(() => {
+ if (keypomInstance == null || keypomInstance === undefined || !eventId || !funderId) return;
+
+ CheckForNearRedirect();
+ }, [keypomInstance, eventId, funderId]);
+
+ const getKeyInformation = useCallback(async () => {
+ if (secretKey == null) {
+ return;
+ }
+
+ try {
+ const publicKey: string = getPubFromSecret(secretKey);
+
+ const keyinfo = await keypomInstance.getTicketKeyInformation({
+ publicKey: String(publicKey),
+ });
+
+ // get drop info using the key info id
+
+ const dropID = keyinfo.token_id.split(':')[0];
+
+ // testing dropID = "1709145479199-Ground Ticket-14"
+
+ const dropData: EventDrop = await keypomInstance.getTicketDropInformation({ dropID });
+
+ // parse dropData's metadata to get eventId
+ const meta: TicketMetadataExtra = JSON.parse(
+ dropData.drop_config.nft_keys_config.token_metadata.extra,
+ );
+
+ const keyinfoEventId = meta.eventId;
+ if (keyinfoEventId !== eventId) {
+ toast({
+ title: 'Ticket does not match current event',
+ description: `This ticket is for a different event, please scan it on the correct event page`,
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ }
+
+ const meta2: FunderEventMetadata | null = await keypomInstance.getEventInfo({
+ accountId: funderId,
+ eventId: keyinfoEventId,
+ });
+
+ if (meta2 == null) {
+ throw new Error('The event does not exist.');
+ }
+
+ let dateString = '';
+ if (meta2.date != null) {
+ dateString = dateAndTimeToText(meta2.date);
+ }
+ setSellDropInfo({
+ name: meta2.name || 'Untitled',
+ artwork: meta2.artwork || 'loading',
+ questions: meta2.questions || [],
+ location: meta2.location || 'loading',
+ date: dateString,
+ description: meta2.description || 'loading',
+ publicKey,
+ secretKey,
+ });
+
+ setDoKeyModal(true);
+ } catch (error) {
+ const errorLog: string = error.toString();
+ toast({
+ title: 'Sale request failure',
+ description: `This item may not be put for sale at this time since ${errorLog}`,
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ }
+ }, [secretKey, keypomInstance]);
+
+ // example: http://localhost:3000/gallery/minqi.testnet:152c9ef5-13de-40f6-9ec2-cc39f5886f4e#secretKey=ed25519:AXSwjeNg8qS8sFPSCK2eYK7UoQ3Kyyqt9oeKiJRd8pUhhEirhL2qbrs7tLBYpoGE4Acn8JbFL7FVjgyT2aDJaJx
+ const loadingdata = [] as DataItem[];
+ // append 3 loading cards
+ for (let i = 0; i < 3; i++) {
+ const loadingCard: DataItem = {
+ id: i,
+ title: 'Loading',
+ name: 'Loading',
+ artwork: 'https://via.placeholder.com/300',
+ location: 'Loading',
+ };
+ loadingdata.push(loadingCard);
+ }
+
+ let res = '';
+ if (event?.location !== undefined && event?.location !== null) {
+ res = event.location.trim().replace(/ /g, '+');
+ }
+
+ const mapHref = 'https://www.google.com/maps/search/' + String(res);
+
+ // purchase modal
+
+ const OpenPurchaseModal = async (ticket, ticketAmount) => {
+ setTicketBeingPurchased(ticket);
+ setTicketAmount(ticketAmount);
+ onOpen();
+ };
+
+ const ClosePurchaseModal = () => {
+ setTicketAmount(1);
+ onClose();
+ };
+
+ function uint8ArrayToBase64(u8Arr: Uint8Array): string {
+ const string = u8Arr.reduce((data, byte) => data + String.fromCharCode(byte), '');
+ return btoa(string);
+ }
+ async function encryptWithPublicKey(data: string, publicKey: CryptoKey): Promise {
+ const encoded = new TextEncoder().encode(data);
+ const encrypted = await window.crypto.subtle.encrypt(
+ {
+ name: 'RSA-OAEP',
+ },
+ publicKey,
+ encoded,
+ );
+
+ return uint8ArrayToBase64(new Uint8Array(encrypted));
+ }
+
+ async function base64ToPublicKey(base64Key: string) {
+ // Decode the Base64 string to an ArrayBuffer
+ const binaryString = atob(base64Key);
+ const len = binaryString.length;
+ const bytes = new Uint8Array(len);
+ for (let i = 0; i < len; i++) {
+ bytes[i] = binaryString.charCodeAt(i);
+ }
+
+ // Import the key from the ArrayBuffer
+ const publicKey = await window.crypto.subtle.importKey(
+ 'spki',
+ bytes.buffer,
+ {
+ name: 'RSA-OAEP',
+ hash: { name: 'SHA-256' },
+ },
+ true,
+ ['encrypt'],
+ );
+
+ return publicKey;
+ }
+
+ const PurchaseTicket = async (email, questionValues, purchaseType, isSecondary) => {
+ navigate('./');
+
+ const dropData = await keypomInstance.getTicketDropInformation({
+ dropID: ticketBeingPurchased.id,
+ });
+
+ // parse dropData's metadata to get eventId
+ const meta: TicketMetadataExtra = JSON.parse(
+ dropData.drop_config.nft_keys_config.token_metadata.extra,
+ );
+
+ const keyinfoEventId = meta.eventId;
+
+ const drop = await keypomInstance.getEventInfo({
+ accountId: dropData.funder_id ? dropData.funder_id : undefined,
+ eventId: keyinfoEventId,
+ });
+
+ if (drop == null || drop === undefined || drop.pubKey == null || drop.pubKey === undefined) {
+ toast({
+ title: 'Purchase failed',
+ description: 'This event does not have a public key',
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ return;
+ }
+
+ const publicKeyBase64: string = drop.pubKey;
+
+ const publicKey = await base64ToPublicKey(publicKeyBase64);
+
+ // encrypt the questionValues
+ const data = JSON.stringify({ questions: questionValues });
+
+ const encryptedValues = await encryptWithPublicKey(data, publicKey);
+
+ let attendeeName: string | null = null;
+
+ if (drop?.questions?.length !== 0 && drop?.questions !== undefined) {
+ // filter each question to find the list of ones that contain "name"
+ const indexlist: number[] = [];
+ for (let i = 0; i < drop?.questions?.length; i++) {
+ if (drop?.questions[i]?.question?.toLowerCase().replaceAll(' ', '').includes('name')) {
+ indexlist.push(i);
+ }
+ }
+
+ // get the shortest question in indexlist
+ let shortestIndex = -1;
+ let shortestLength = 1000;
+ for (let i = 0; i < indexlist.length; i++) {
+ if (drop?.questions[indexlist[i]].question.length < shortestLength) {
+ shortestIndex = indexlist[i];
+ shortestLength = drop?.questions[indexlist[i]].question.length;
+ }
+ }
+ if (shortestIndex !== -1) {
+ attendeeName = questionValues[shortestIndex];
+ }
+ }
+
+ // limit the number of characters in the email and name to 500
+ if (attendeeName != null && attendeeName.length > 500) {
+ attendeeName = attendeeName.substring(0, 500);
+ }
+ let trimmedEmail = email;
+ if (trimmedEmail && trimmedEmail.length > 500) {
+ trimmedEmail = trimmedEmail.substring(0, 500);
+ }
+
+ const workerPayload: WorkerPayload = {
+ name: attendeeName,
+ ticketAmount, // (number of tickets being purchase)
+ buyerAnswers: encryptedValues, // (encrypted user answers)
+ ticket_info: {
+ location: drop.location,
+ eventName: drop.name,
+ ticketType: dropData.drop_config.nft_keys_config.token_metadata.title,
+ eventDate: JSON.stringify(drop.date),
+ ticketOwner: accountId || undefined, // (if signed in, this is signed in account, otherwise its none/empty)
+ eventId: meta.eventId,
+ dropId: ticketBeingPurchased.id,
+ funderId,
+ },
+ purchaseEmail: trimmedEmail, // (currently just called email in userInfo)
+ stripeAccountId,
+ baseUrl: window.location.origin,
+ priceNear: ticketBeingPurchased.price,
+ };
+
+ if (purchaseType === 'free') {
+ const response = await fetch(
+ 'https://stripe-worker.kp-capstone.workers.dev/purchase-free-tickets',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(workerPayload),
+ },
+ );
+
+ if (response.ok) {
+ const responseBody = await response.json();
+ TicketPurchaseSuccessful(workerPayload, responseBody);
+ } else {
+ const responseBody = await response.json();
+ console.error('responseBody', responseBody);
+ TicketPurchaseFailure(workerPayload, await response.json());
+ }
+ } else if (purchaseType === 'near') {
+ // put the workerPayload in local storage
+ const { secretKeys, publicKeys } = await keypomInstance.GenerateTicketKeys(ticketAmount);
+ workerPayload.ticketKeys = secretKeys;
+ localStorage.setItem('workerPayload', JSON.stringify(workerPayload));
+
+ const nearSendPrice = keypomInstance.nearToYocto(
+ (ticketAmount * ticketBeingPurchased.price).toString(),
+ );
+
+ if (nearSendPrice === null) {
+ toast({
+ title: 'Purchase failed',
+ description: 'Given price was null, please try again later',
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ return;
+ }
+
+ if (!isSecondary) {
+ // primary
+
+ const newKeys: any[] = [];
+ for (const publicKey of publicKeys) {
+ newKeys.push({
+ public_key: publicKey,
+ metadata: encryptedValues,
+ key_owner: accountId,
+ });
+ }
+
+ if (wallet == null) {
+ toast({
+ title: 'Purchase failed',
+ description: 'Wallet not found, reconnect it and try again',
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ return;
+ }
+
+ await wallet.signAndSendTransaction({
+ signerId: accountId || undefined,
+ receiverId: KEYPOM_MARKETPLACE_CONTRACT,
+ actions: [
+ {
+ type: 'FunctionCall',
+ params: {
+ methodName: 'buy_initial_sale',
+ args: {
+ event_id: meta.eventId,
+ drop_id: ticketBeingPurchased.id,
+ new_keys: newKeys,
+ },
+ gas: '300000000000000',
+ deposit: nearSendPrice,
+ },
+ },
+ ],
+ });
+ } else {
+ // secondary
+ const memo = {
+ linkdrop_pk: ticketBeingPurchased.publicKey,
+ new_public_key: publicKeys[0],
+ }; // NftTransferMemo,
+
+ if (wallet == null) {
+ toast({
+ title: 'Purchase failed',
+ description: 'Wallet not found, reconnect it and try again',
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ return;
+ }
+ await wallet.signAndSendTransaction({
+ signerId: accountId || undefined,
+ receiverId: KEYPOM_MARKETPLACE_CONTRACT,
+ actions: [
+ {
+ type: 'FunctionCall',
+ params: {
+ methodName: 'buy_resale',
+ args: {
+ drop_id: ticketBeingPurchased.id,
+ memo,
+ new_owner: accountId,
+ },
+ gas: '300000000000000',
+ deposit: nearSendPrice,
+ },
+ },
+ ],
+ });
+ }
+ } else if (purchaseType === 'stripe') {
+ const response = await fetch(
+ 'https://stripe-worker.kp-capstone.workers.dev/stripe/create-checkout-session',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(workerPayload),
+ },
+ );
+ if (response.ok) {
+ // Account created successfully
+ const responseBody = await response.json();
+
+ const stripeUrl = responseBody.stripe_url;
+ window.location.href = stripeUrl;
+ TicketPurchaseSuccessful(workerPayload, responseBody);
+ } else {
+ // Error creating account
+ TicketPurchaseFailure(workerPayload, await response.json());
+ }
+ }
+ };
+
+ const CheckForNearRedirect = async () => {
+ if (nearRedirect == null) {
+ return;
+ }
+ // get workerpayload from local storage
+ const workerPayloadStringified = localStorage.getItem('workerPayload');
+ if (workerPayloadStringified == null) {
+ return;
+ }
+
+ const workerPayload: WorkerPayload = JSON.parse(workerPayloadStringified);
+
+ const purchaseLocalStorageKey = `${PURCHASED_LOCAL_STORAGE_PREFIX}_${workerPayload.ticket_info.dropId}`;
+ let numTicketsPurchased = parseInt(localStorage.getItem(purchaseLocalStorageKey) || '0');
+ numTicketsPurchased += workerPayload.ticketAmount;
+ localStorage.setItem(purchaseLocalStorageKey, numTicketsPurchased.toString());
+ // remove workerpayload from localstorage
+ localStorage.removeItem('workerPayload');
+
+ // Remove the near parameters from the URL
+ navigate('./');
+
+ const newWorkerPayload = workerPayload;
+
+ for (const key in workerPayload.ticketKeys) {
+ newWorkerPayload.ticketKey = workerPayload.ticketKeys[key];
+
+ // newWorkerPayload["ticketKeys"] = null;
+ const response = await fetch(
+ 'https://email-worker.kp-capstone.workers.dev/send-confirmation-email',
+ {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(newWorkerPayload),
+ },
+ );
+
+ if (response.ok) {
+ const responseBody = await response.json();
+ TicketPurchaseSuccessful(newWorkerPayload, responseBody);
+ } else {
+ // Error creating account
+ TicketPurchaseFailure(newWorkerPayload, await response.json());
+ }
+ }
+ };
+
+ const TicketPurchaseSuccessful = (workerPayload: WorkerPayload, responseBody) => {
+ const priceLog: string = workerPayload.priceNear.toString();
+ let description = `The item has been bought for ${priceLog} NEAR`;
+
+ const purchaseLocalStorageKey = `${PURCHASED_LOCAL_STORAGE_PREFIX}_${workerPayload.ticket_info.dropId}`;
+ let numTicketsPurchased = parseInt(localStorage.getItem(purchaseLocalStorageKey) || '0');
+ numTicketsPurchased += workerPayload.ticketAmount;
+ localStorage.setItem(purchaseLocalStorageKey, numTicketsPurchased.toString());
+
+ if (workerPayload.ticketAmount > 1) {
+ const amountLog: string = workerPayload.ticketAmount.toString();
+ description = `${amountLog} items have been bought for ${priceLog} NEAR`;
+ }
+
+ const emailLog: string = workerPayload.purchaseEmail.toString();
+ const email = ` and an email has been sent to ${emailLog}`;
+ description += email;
+ toast({
+ title: 'Purchase successful',
+ description,
+ status: 'success',
+ duration: 5000,
+ isClosable: true,
+ });
+ };
+
+ const TicketPurchaseFailure = (workerPayload, responseBody) => {
+ const responseLog: string = responseBody.toString();
+ toast({
+ title: 'Purchase failed',
+ description: 'Not purchase was made due to the error: ' + responseLog,
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ };
+
+ function CloseSellModal() {
+ setDoKeyModal(false);
+ setSellDropInfo(null);
+
+ // Remove the secretKey parameter from the URL
+ navigate('./');
+ }
+
+ const SellTicket = async (event) => {
+ event.preventDefault();
+ // sell the ticket with the secret key, give toast, and sell
+ navigate('./');
+ setDoKeyModal(false);
+
+ const sellInfo = sellDropInfo;
+
+ if (sellInfo == null) {
+ return;
+ }
+
+ setSellDropInfo(null);
+
+ const yoctoPrice = keypomInstance.nearToYocto(input);
+
+ const signature = await keypomInstance.GenerateResellSignature({
+ secretKey: sellInfo.secretKey,
+ publicKey: sellInfo.publicKey,
+ });
+
+ const marketplaceMemo = {
+ public_key: sellInfo.publicKey,
+ price: yoctoPrice,
+ };
+
+ const base64Signature = signature[0];
+
+ const memo = JSON.stringify({
+ linkdrop_pk: sellInfo.publicKey,
+ signature: base64Signature,
+ msg: JSON.stringify(marketplaceMemo),
+ });
+
+ let sellsuccessful = false;
+ try {
+ await keypomInstance.ListUnownedTickets({ msg: memo });
+ sellsuccessful = true;
+ } catch (error) {
+ toast({
+ title: 'Item not put for sale',
+ description: `Your item has not been put for sale due to the error: ${String(error)}`,
+ status: 'error',
+ duration: 5000,
+ isClosable: true,
+ });
+ }
+
+ if (sellsuccessful) {
+ toast({
+ title: 'Item put for sale successfully',
+ description: `Your item has been put for sale for ${input} NEAR`,
+ status: 'success',
+ duration: 5000,
+ isClosable: true,
+ });
+ }
+ };
+
+ const handleGetAllTickets = useCallback(async () => {
+ setIsLoading(true);
+ const ticketsForEvent: EventDrop[] = await keypomInstance.getTicketsForEventId({
+ accountId: funderId,
+ eventId,
+ });
+
+ const resalePack: TicketInterface[][] = await keypomInstance.getResalesForEvent({
+ eventId,
+ });
+
+ const iseventavailable = await keypomInstance.getStripeEnabledEvents();
+ // check if this event is stripe enabled
+ const iseventstripeenabled = iseventavailable.includes(eventId);
+
+ setStripeEnabledEvent(iseventstripeenabled);
+
+ // get stripe id for account
+ const stripeAccountId = await keypomInstance.getStripeAccountId(funderId);
+ setStripeAccountId(stripeAccountId);
+
+ const promises = ticketsForEvent.map(async (ticket) => {
+ const meta: TicketInfoMetadata = ticket.drop_config.nft_keys_config.token_metadata;
+ const extra: TicketMetadataExtra = JSON.parse(meta.extra);
+
+ const supply = await keypomInstance.getKeySupplyForTicket(ticket.drop_id);
+ return {
+ id: ticket.drop_id,
+ artwork: meta.media,
+ name: meta.title,
+ description: meta.description,
+ salesValidThrough: extra.salesValidThrough,
+ passValidThrough: extra.passValidThrough,
+ limitPerUser: extra.limitPerUser,
+ supply,
+ maxTickets: extra.maxSupply,
+ soldTickets: supply,
+ priceNear: keypomInstance.yoctoToNear(extra.price),
+ };
+ });
+
+ let tickets: TicketInterface[] = await Promise.all(promises);
+
+ // map tickets
+ tickets = tickets.map((ticket: TicketInterface) => {
+ let available = 'unlimited';
+ if (ticket.maxTickets !== undefined) {
+ available = String(ticket.maxTickets - ticket.soldTickets);
+ }
+ let dateString = '';
+ if (ticket.passValidThrough != null && ticket.passValidThrough !== undefined) {
+ dateString = dateAndTimeToText(ticket.passValidThrough);
+ }
+
+ return {
+ ...ticket,
+ price: ticket.priceNear,
+ media: ticket.artwork,
+ numTickets: available,
+ dateString,
+ location: '',
+ description: ticket.description,
+ isSecondary: false,
+ };
+ });
+
+ setTicketList(tickets);
+
+ // this resalePack object is not containing the things I need it to, instead it has a list of resales for each ticket tier.
+ // I want to extract it into a list of resales for the event, so it looks like ticketsForEvent
+
+ // NOTE: I will also need to use the previously set tickets to get some details
+ const resaleTickets: TicketInterface[] = [];
+ for (const [dropId, resales] of Object.entries(resalePack)) {
+ for (const resale of resales) {
+ // find the corresponding ticket in tickets using the dropId
+ for (const ticket of tickets) {
+ if (ticket.id === dropId) {
+ resaleTickets.push({
+ artwork: ticket.artwork,
+ dateString: ticket.dateString,
+ description: ticket.description,
+ id: ticket.id,
+ limitPerUser: ticket.limitPerUser,
+ // location: ticket.location,
+ maxTickets: 1,
+ media: ticket.media,
+ name: ticket.name,
+ passValidThrough: ticket.passValidThrough,
+ priceNear: ticket.priceNear,
+ salesValidThrough: ticket.salesValidThrough,
+ soldTickets: 0,
+ supply: 0,
+ isSecondary: true,
+ publicKey: resale.public_key,
+ price: keypomInstance.yoctoToNear(String(resale.price)),
+ });
+ }
+ }
+ }
+ }
+
+ setResaleTicketList(resaleTickets);
+
+ setAreTicketsLoading(false);
+ }, [funderId, keypomInstance]);
+
+ useEffect(() => {
+ if (keypomInstance == null || keypomInstance === undefined || !eventId || !funderId) {
+ return;
+ }
+
+ handleGetAllTickets();
+ }, [keypomInstance, eventId, funderId]);
+
+ useEffect(() => {
+ if (eventId === '') navigate('/drops');
+ if (!funderId) return;
+ if (!eventId) return;
+
+ const getEventData = async () => {
+ try {
+ const drop = await keypomInstance.getEventInfo({ accountId: funderId, eventId });
+
+ if (drop == null) {
+ setNoDrop(true);
+ return;
+ }
+
+ const meta = drop;
+
+ let dateString = '';
+ if (meta?.date != null) {
+ dateString = dateAndTimeToText(meta.date);
+ }
+
+ setEvent({
+ name: meta.name || 'Untitled',
+ artwork: meta.artwork || 'loading',
+ questions: meta.questions || [],
+ location: meta.location || 'loading',
+ date: dateString,
+ description: meta.description || 'loading',
+ // WIP data below here
+ title: '',
+ pubKey: '',
+ secretKey: '',
+ navurl: '',
+ maxTickets: 0,
+ soldTickets: 0,
+ numTickets: '',
+ id: 0,
+ media: '',
+ supply: 0,
+ dateString: '',
+ price: 0,
+ });
+ setIsLoading(false);
+ } catch (error) {
+ // eslint-disable-next-line
+ console.error('error loading event: ', error);
+
+ setNoDrop(true);
+ }
+ };
+ getEventData();
+ }, [eventId, selector, funderId, keypomInstance]);
+
+ if (noDrop) {
+ return (
+
+ Event not found
+
+ Sorry, the event you are looking for does not exist.
+
+ );
+ }
+
+ if (isLoading || event == null) {
+ return (
+
+ Loading...
+
+ Fetching event data
+
+ );
+ }
+ return (
+
+
+
+
+
+
+
+
+
+ {/* Details about the Event:
+ Event ID: {eventID} */}
+
+ {/* */}
+
+ {event.name}
+
+ {/* TODO: make these stacks change between hstack and vstack nicely */}
+
+
+
+
+ Event Details
+
+
+ {event.description}
+
+
+
+ Location
+
+
+ {event.location}
+
+
+ Open in Google Maps
+
+
+
+ Date
+
+ {event.date}
+
+
+
+
+
+
+
+
+
+ Event Details
+
+
+ {event.description}
+
+
+
+ Location
+
+ {event.location}
+
+ Open in Google Maps
+
+
+ Date
+
+ {event.date}
+
+
+
+
+
+
+ Tickets
+
+
+
+ {!areTicketsLoading
+ ? ticketList.map((ticket: any) => (
+
+ ))
+ : loadingdata.map((ticket) => (
+
+ ))}
+
+
+
+ {!areTicketsLoading && resaleTicketList.length > 0 ? (
+
+ Secondary Tickets
+
+ ) : (
+ <>>
+ )}
+
+
+
+ {!areTicketsLoading ? (
+ resaleTicketList.map((ticket: any) => (
+
+ ))
+ ) : (
+ <>>
+ )}
+
+
+
+
+
+ {doKeyModal && sellDropInfo != null && (
+
+ )}
+
+
+
+ );
+}
diff --git a/src/pages/Gallery.tsx b/src/pages/Gallery.tsx
new file mode 100644
index 00000000..9255d1fd
--- /dev/null
+++ b/src/pages/Gallery.tsx
@@ -0,0 +1,702 @@
+import {
+ Box,
+ Heading,
+ Input,
+ Image as ChakraImage,
+ HStack,
+ InputGroup,
+ InputLeftElement,
+ Icon,
+ Button,
+ Menu,
+ MenuList,
+ Skeleton,
+ Flex,
+ Hide,
+ VStack,
+ Show,
+ useDisclosure,
+} from '@chakra-ui/react';
+import { useEffect, useRef, useState } from 'react';
+import { SearchIcon } from '@chakra-ui/icons';
+
+import { DropManagerPagination } from '@/features/all-drops/components/DropManagerPagination';
+import {
+ GALLERY_PRICE_ITEMS,
+ GALLERY_PAGE_SIZE_ITEMS,
+ SORT_MENU_ITEMS,
+ createMenuItems,
+} from '@/features/all-drops/config/menuItems';
+import keypomInstance from '@/lib/keypom';
+import { GalleryGrid } from '@/features/gallery/components/GalleryGrid';
+import { DropDownButton } from '@/features/all-drops/components/DropDownButton';
+import { FilterOptionsMobileButton } from '@/features/all-drops/components/FilterOptionsMobileButton';
+import { MobileDrawerMenu } from '@/features/all-drops/components/MobileDrawerMenu';
+import { truncateAddress } from '@/utils/truncateAddress';
+import { FormControlComponent } from '@/components/FormControl';
+import CustomDateRangePickerMobile from '@/components/DateRangePicker/MobileDateRangePicker';
+import CustomDateRangePicker from '@/components/DateRangePicker/DateRangePicker';
+import { dateAndTimeToText } from '@/features/drop-manager/utils/parseDates';
+import { type DateAndTimeInfo } from '@/lib/eventsHelpers';
+
+// import myData from '../data/db.json';
+
+// props validation
+// Gallery.propTypes = {
+// isSecondary: PropTypes.bool,
+// };
+
+export default function Gallery() {
+ // const isSecondary = props.isSecondary || false;
+ // pagination
+ // const [hasPagination, setHasPagination] = useState(false);
+ const [numPages, setNumPages] = useState(0);
+ const [curPage, setCurPage] = useState(0);
+
+ const [isLoading, setIsLoading] = useState(true);
+ const [isAllDropsLoading, setIsAllDropsLoading] = useState(true);
+ const popoverClicked = useRef(0);
+
+ const { isOpen, onOpen, onClose } = useDisclosure();
+
+ // date range picker
+ const [isDatePickerOpen, setIsDatePickerOpen] = useState(false);
+ const [datePlaceholer, setDatePlaceholder] = useState('Select date and time');
+
+ const datePickerCTA = (
+ // formData.date.error
+
+ {
+ setIsDatePickerOpen(true);
+ }}
+ />
+
+ );
+
+ const [selectedFilters, setSelectedFilters] = useState<{
+ // type: string;
+ search: string;
+ pageSize: number;
+ price: string;
+ eventDate: DateAndTimeInfo;
+ sort: string;
+ // reversed: boolean;
+ }>({
+ // type: DROP_TYPE_OPTIONS.ANY,
+ search: '',
+ pageSize: parseInt(GALLERY_PAGE_SIZE_ITEMS[0].label),
+ price: GALLERY_PRICE_ITEMS[0].label,
+ eventDate: { startDate: 0 },
+ sort: 'no sort',
+ // reversed: false,
+ });
+
+ useEffect(() => {
+ if (selectedFilters.eventDate === undefined) return;
+ const datePlaceholder = dateAndTimeToText(selectedFilters.eventDate, 'Filter by Date');
+
+ setDatePlaceholder(datePlaceholder);
+ }, [selectedFilters.eventDate]);
+
+ const [searchTerm, setSearchTerm] = useState('');
+ // const [numOwnedDrops, setNumOwnedDrops] = useState(0);
+ const [filteredDataItems, setFilteredDataItems] = useState([]);
+ // const [wallet, setWallet] = useState({});
+
+ const [banner, setBanner] = useState('');
+
+ const handleSortMenuSelect = (item) => {
+ // if you select the same item, reverse the order
+ // if (selectedFilters.sort === item.label) {
+ // setSelectedFilters((prevFilters) => ({
+ // ...prevFilters,
+ // reversed: !prevFilters.reversed,
+ // }));
+ // } else {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ sort: item.label,
+ }));
+ // }
+ };
+
+ const handlePriceFilterSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ price: item.label,
+ }));
+ };
+
+ const handlePageSizeSelect = (item) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ pageSize: parseInt(item.label),
+ }));
+ };
+
+ const handleSearchChange = (event) => {
+ const { value } = event.target;
+ setSearchTerm(value);
+ };
+
+ const handleNextPage = () => {
+ setCurPage((prev) => prev + 1);
+ };
+
+ const handlePrevPage = () => {
+ setCurPage((prev) => prev - 1);
+ };
+
+ const handleKeyDown = (event) => {
+ if (event.key === 'Enter') {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ search: searchTerm.toLowerCase(),
+ }));
+ }
+ };
+
+ const handleFiltering = async (drops) => {
+ // Apply the selected filters
+
+ drops = drops.filter((drop) => drop !== null);
+
+ if (selectedFilters.price !== GALLERY_PRICE_ITEMS[0].label) {
+ const priceFilter = selectedFilters.price;
+
+ // Apply price filter
+ drops = drops.filter((drop) => {
+ let price = -1;
+ for (const key in drop.prices) {
+ const value = drop.prices[key];
+ price = parseFloat(keypomInstance.yoctoToNear(value));
+ if (priceFilter === GALLERY_PRICE_ITEMS[1].label) {
+ if (price < 20) {
+ return true;
+ }
+ } else if (priceFilter === GALLERY_PRICE_ITEMS[2].label) {
+ if (price >= 20 && price < 50) {
+ return true;
+ }
+ } else if (priceFilter === GALLERY_PRICE_ITEMS[3].label) {
+ if (price >= 50 && price < 100) {
+ return true;
+ }
+ } else if (priceFilter === GALLERY_PRICE_ITEMS[4].label) {
+ if (price >= 100) {
+ return true;
+ }
+ }
+ }
+ return false;
+ });
+ }
+
+ if (selectedFilters.search.trim() !== '') {
+ // Apply search filter
+ drops = drops.filter((drop) => {
+ return (
+ drop.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ drop.description.toLowerCase().includes(searchTerm.toLowerCase())
+ );
+ });
+ }
+
+ // apply start and end date filters
+
+ if (
+ selectedFilters.eventDate.startDate !== null &&
+ selectedFilters.eventDate.startDate !== undefined &&
+ selectedFilters.eventDate.startDate !== 0
+ ) {
+ drops = drops.filter((drop) => {
+ if (drop === undefined) return false;
+ let dateString = drop.date.date;
+ // take start date, check if it is a string or object
+ if (typeof drop.date.date !== 'string') {
+ dateString = drop.date.date.from;
+ }
+ const date = new Date(dateString).getTime();
+ return (
+ selectedFilters.eventDate.startDate !== null &&
+ date >= selectedFilters.eventDate.startDate
+ );
+ });
+ }
+
+ if (
+ selectedFilters.eventDate.endDate !== null &&
+ selectedFilters.eventDate.endDate !== undefined
+ ) {
+ drops = drops.filter((drop) => {
+ if (drop === undefined) return false;
+ let dateString = drop.date.date;
+ // take start date, check if it is a string or object
+ if (typeof drop.date.date !== 'string') {
+ dateString = drop.date.date.to;
+ }
+ const date = new Date(dateString).getTime();
+ return date <= selectedFilters.eventDate.endDate!;
+ });
+ }
+
+ // before returning drops, sort them if all drops are fetched
+ if (selectedFilters.sort !== 'no sort') {
+ if (selectedFilters.sort === 'ascending') {
+ drops = drops.sort((a, b) => {
+ const availableA = a.maxTickets - a.supply;
+ const availableB = b.maxTickets - b.supply;
+ return availableA - availableB;
+ });
+ }
+ if (selectedFilters.sort === 'descending') {
+ drops = drops.sort((a, b) => {
+ const availableA = a.maxTickets - a.supply;
+ const availableB = b.maxTickets - b.supply;
+ return availableB - availableA;
+ });
+ }
+ }
+
+ return drops;
+ };
+
+ // const [numOwnedEvents, setNumOwnedEvents] = useState(0);
+
+ const handleGetAllEvents = async () => {
+ setIsAllDropsLoading(true);
+ const eventListings = await keypomInstance.GetMarketListings({
+ limit: 50,
+ from_index: 0,
+ });
+
+ // const numEvents = eventListings.length;
+ // setNumOwnedEvents(numEvents);
+
+ const dropDataPromises = eventListings.map(async (event) => {
+ // get metadata from drop.event_id and drop.funder_id
+ const eventInfo = await keypomInstance.getEventInfo({
+ accountId: event.funder_id,
+ eventId: event.event_id,
+ });
+
+ // filter out events with null info
+ if (eventInfo === null) {
+ return null;
+ }
+
+ // for each ticket in the event, get the supply
+ let supply = 0;
+ let maxTickets = 0;
+ const prices: number[] = [];
+
+ interface TicketData {
+ max_tickets: number; // or the correct type
+ price: number; // or the correct type
+ // add other properties as needed
+ }
+
+ for (const [name, ticketdata] of Object.entries(event.ticket_info)) {
+ const thissupply = await keypomInstance.getKeySupplyForTicket(name);
+ const ticketData = ticketdata as TicketData;
+ supply += parseInt(thissupply);
+ maxTickets += ticketData.max_tickets;
+ prices.push(ticketData.price);
+ }
+
+ let dateString = '';
+ if (eventInfo?.date != null) {
+ dateString = dateAndTimeToText(eventInfo.date);
+ }
+
+ if (event === undefined || eventInfo === undefined) {
+ return null;
+ }
+
+ const numTickets = Object.keys(event.ticket_info).length;
+ return {
+ prices,
+ maxTickets,
+ supply,
+ location: eventInfo.location,
+ dateString,
+ date: eventInfo.date,
+ id: event.event_id,
+ name: truncateAddress(eventInfo.name, 'middle', 32),
+ media: eventInfo.artwork,
+ dateCreated: eventInfo.dateCreated,
+ numTickets,
+ description: truncateAddress(eventInfo.description, 'end', 128),
+ eventId: event.event_id,
+ navurl: String(event.funder_id) + ':' + String(event.event_id),
+ };
+ });
+
+ let dropData = await Promise.all(dropDataPromises);
+
+ dropData = await handleFiltering(dropData);
+
+ // Use Promise.all to wait for all promises to resolve
+ // filter out all null entries
+
+ setFilteredDataItems(dropData);
+
+ const totalPages = Math.ceil(dropDataPromises.length / selectedFilters.pageSize);
+ setNumPages(totalPages);
+
+ setCurPage(0);
+ setIsAllDropsLoading(false);
+ };
+
+ const handleGetInitialDrops = async () => {
+ // setIsLoading(true);
+ // First get the total supply of drops so we know when to stop fetching
+ const totalSupply = await keypomInstance.getEventSupply();
+
+ // Loop until we have enough filtered drops to fill the page size
+ let dropsFetched = 0;
+ let filteredDrops = [];
+ while (dropsFetched < totalSupply && filteredDrops.length < selectedFilters.pageSize) {
+ const eventListings = await keypomInstance.GetMarketListings({
+ limit: 6,
+ from_index: dropsFetched,
+ });
+
+ dropsFetched += Number(eventListings.length);
+
+ filteredDrops = filteredDrops.concat(eventListings);
+ }
+
+ // Now, map over the filtered drops and set the data
+ const dropDataPromises = filteredDrops.map(async (event: any) => {
+ // get metadata from drop.event_id and drop.funder_id
+ const eventInfo = await keypomInstance.getEventInfo({
+ accountId: event.funder_id,
+ eventId: event.event_id,
+ });
+
+ // for each ticket in the event, get the supply
+ let supply = 0;
+ let maxTickets = 0;
+
+ for (const [name, ticketdata] of Object.entries(event.ticket_info) as [string, any]) {
+ const thissupply = await keypomInstance.getKeySupplyForTicket(name);
+ supply += parseInt(thissupply);
+ maxTickets += parseInt(ticketdata.max_tickets);
+ }
+
+ let dateString = '';
+ if (eventInfo?.date != null) {
+ dateString = dateAndTimeToText(eventInfo.date);
+ }
+
+ if (event == null || event === undefined || eventInfo == null || eventInfo === undefined) {
+ return null;
+ }
+
+ const numTickets = Object.keys(event.ticket_info).length;
+ return {
+ maxTickets,
+ supply,
+ location: eventInfo.location,
+ dateString,
+ date: eventInfo.date,
+ id: event.event_id,
+ name: truncateAddress(eventInfo.name, 'middle', 32),
+ media: eventInfo.artwork,
+ dateCreated: eventInfo.dateCreated, // Ensure drop has dateCreated or adjust accordingly
+ numTickets,
+ description: truncateAddress(eventInfo.description, 'end', 128),
+ eventId: event.event_id,
+ navurl: String(event.funder_id) + ':' + String(event.event_id),
+ };
+ });
+
+ // filter out all null entries
+ // Use Promise.all to wait for all promises to resolve
+ let dropData = await Promise.all(dropDataPromises);
+ // filter out all null entries
+ dropData = dropData.filter((drop) => drop !== null);
+
+ if (filteredDataItems.length === 0) {
+ // not actually filtered lol
+ setFilteredDataItems(dropData);
+ }
+ setCurPage(0);
+ setIsLoading(false);
+ };
+
+ useEffect(() => {
+ if (filteredDataItems.length === 0 || banner !== '') return;
+ const randomElement = filteredDataItems[Math.floor(Math.random() * filteredDataItems.length)];
+
+ setBanner(randomElement.media);
+ }, [filteredDataItems]);
+
+ useEffect(() => {
+ if (keypomInstance === undefined) return;
+ // First get enough data with the current filters to fill the page size
+ handleGetInitialDrops();
+ }, [keypomInstance]);
+
+ useEffect(() => {
+ if (keypomInstance === undefined) return;
+ // In parallel, fetch all the events
+ handleGetAllEvents();
+ }, [selectedFilters, keypomInstance]);
+
+ const pageSizeMenuItems = createMenuItems({
+ menuItems: GALLERY_PAGE_SIZE_ITEMS,
+ onClick: (item) => {
+ handlePageSizeSelect(item);
+ },
+ });
+
+ const sortOrderMenuItems = createMenuItems({
+ menuItems: SORT_MENU_ITEMS,
+ onClick: (item) => {
+ handleSortMenuSelect(item);
+ },
+ });
+
+ const priceMenuItems = createMenuItems({
+ menuItems: GALLERY_PRICE_ITEMS,
+ onClick: (item) => {
+ handlePriceFilterSelect(item);
+ },
+ });
+
+ const getGalleryGridRows = () => {
+ if (filteredDataItems === undefined || filteredDataItems.length === 0) return [];
+
+ const gridData = filteredDataItems;
+
+ return gridData.slice(
+ curPage * selectedFilters.pageSize,
+ (curPage + 1) * selectedFilters.pageSize,
+ );
+ };
+
+ return (
+
+
+ Browse Events
+
+
+
+
+
+
+
+
+
+
+
+ {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ eventDate: {
+ ...prevFilters.eventDate,
+ startDate,
+ endDate,
+ },
+ }));
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ eventDate: {
+ ...prevFilters.eventDate,
+ startTime,
+ endTime,
+ },
+ }));
+ }}
+ />
+
+
+
+
+ {!isAllDropsLoading && (
+
+ )}
+ {isAllDropsLoading && (
+
+
+
+
+ )}
+
+
+
+
+
+
+
+ {/* Mobile Menu */}
+
+
+
+ All drops
+
+
+
+
+
+
+ {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ eventDate: {
+ ...prevFilters.eventDate,
+ startDate,
+ endDate,
+ },
+ }));
+ }}
+ onTimeChange={(startTime, endTime) => {
+ setSelectedFilters((prevFilters) => ({
+ ...prevFilters,
+ eventDate: {
+ ...prevFilters.eventDate,
+ startTime,
+ endTime,
+ },
+ }));
+ }}
+ />
+
+
+
+ {/* Mobile Popup Menu For Filtering */}
+
+
+
+
+ (popoverClicked.current += 1)}
+ />
+
+
+ );
+}
diff --git a/src/router.tsx b/src/router.tsx
index e18cbf17..0e5a00d8 100644
--- a/src/router.tsx
+++ b/src/router.tsx
@@ -20,14 +20,16 @@ const ProtectedRoute = React.lazy(
const AllDropsPage = React.lazy(
async () => await import('./features/all-drops/routes/AllDropsPage'),
);
+
+const AllEventsPage = React.lazy(
+ async () => await import('./features/all-drops/routes/AllEventsPage'),
+);
+const TicketQRPage = React.lazy(async () => await import('@/features/ticket-qr/TicketQRPage'));
const ClaimPage = React.lazy(async () => await import('@/features/claim/routes/ClaimRouter'));
const ClaimTokenPage = React.lazy(
async () => await import('@/features/claim/routes/TokenClaimPage'),
);
const ClaimNftPage = React.lazy(async () => await import('@/features/claim/routes/NFTClaimPage'));
-const ClaimTicketPage = React.lazy(
- async () => await import('@/features/claim/routes/TicketClaimPage'),
-);
const ClaimTrialPage = React.lazy(
async () => await import('@/features/claim/routes/TrialClaimPage'),
);
@@ -40,7 +42,9 @@ const CreateNftDropPage = React.lazy(
const CreateTicketDropPage = React.lazy(
async () => await import('@/features/create-drop/routes/CreateTicketDropPage'),
);
-
+const EventManagerPage = React.lazy(
+ async () => await import('@/features/drop-manager/routes/events/EventManagerPage'),
+);
const TokenDropManagerPage = React.lazy(
async () => await import('@/features/drop-manager/routes/token/TokenDropManagerPage'),
);
@@ -52,6 +56,10 @@ const TicketDropManagerPage = React.lazy(
);
const EthDenverLandingPage = React.lazy(async () => await import('@/pages/EthDenver'));
+const Gallery = React.lazy(async () => await import('@/pages/Gallery'));
+
+const Event = React.lazy(async () => await import('@/pages/Event'));
+
const ScannerPage = React.lazy(async () => await import('@/features/scanner/routes/ScannerPage'));
export const router = createBrowserRouter([
@@ -66,6 +74,20 @@ export const router = createBrowserRouter([
path: 'ethdenver',
element: ,
},
+ {
+ path: 'gallery',
+ element: ,
+ loader: () => {
+ import('@/lib/keypom').then(async (keypomLib) => {
+ await keypomLib.default.init();
+ });
+ return null;
+ },
+ },
+ {
+ path: 'gallery/:eventID',
+ element: ,
+ },
{
loader: () => {
import('@/lib/keypom').then(async (keypomLib) => {
@@ -82,6 +104,34 @@ export const router = createBrowserRouter([
),
},
+ {
+ path: 'events',
+ element: , // Wrap the AllEventsPage and its dynamic children with ProtectedRoute
+ children: [
+ {
+ index: true,
+ element: , // Display AllEventsPage at /events
+ },
+ {
+ path: 'event/:id', // Match /events/event/:id
+ element: ,
+ },
+ {
+ path: 'ticket/:id', // Match /events/ticket/:id
+ element: ,
+ },
+ // Add other paths as needed...
+ ],
+ },
+ {
+ path: 'tickets',
+ children: [
+ {
+ path: 'ticket/:id', // Match /events/event/:id
+ element: ,
+ },
+ ],
+ },
{
path: 'drop',
element: ,
@@ -119,10 +169,6 @@ export const router = createBrowserRouter([
path: 'new',
element: ,
},
- {
- path: ':id',
- element: ,
- },
],
},
],
@@ -139,14 +185,6 @@ export const router = createBrowserRouter([
path: 'nft/:contractId',
element: ,
},
- {
- path: 'gift/:contractId',
- element: ,
- },
- {
- path: 'ticket/:contractId',
- element: ,
- },
{
path: 'trial/:contractId',
element: ,
@@ -158,8 +196,13 @@ export const router = createBrowserRouter([
],
},
{
- path: 'scanner',
- element: ,
+ path: 'scan',
+ children: [
+ {
+ path: 'event/:funderAndEventId',
+ element: ,
+ },
+ ],
},
],
},
diff --git a/src/utils/file.ts b/src/utils/file.ts
index f37495b9..60180657 100644
--- a/src/utils/file.ts
+++ b/src/utils/file.ts
@@ -15,6 +15,6 @@ export const file = (fn, data) => {
// a little while before removing it.
setTimeout(() => {
URL.revokeObjectURL(link.href);
- link.parentNode.removeChild(link);
+ link.parentNode!.removeChild(link);
}, 0);
};
diff --git a/src/utils/share.ts b/src/utils/share.ts
index 28734793..7b9e2a39 100644
--- a/src/utils/share.ts
+++ b/src/utils/share.ts
@@ -1,7 +1,6 @@
import copy from 'copy-to-clipboard';
export const share = (text) => {
- console.log(navigator);
if (navigator.share && /mobile/gi.test(window.navigator.userAgent)) {
navigator
.share({
diff --git a/yarn.lock b/yarn.lock
index 25d0a08e..0c639737 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,268 +2,261 @@
# yarn lockfile v1
-"@ampproject/remapping@^2.1.0":
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
- integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
+"@aashutoshrathi/word-wrap@^1.2.3":
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
+ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
dependencies:
- "@jridgewell/gen-mapping" "^0.1.0"
- "@jridgewell/trace-mapping" "^0.3.9"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
"@assemblyscript/loader@^0.9.4":
version "0.9.4"
resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.9.4.tgz#a483c54c1253656bb33babd464e3154a173e1577"
integrity sha512-HazVq9zwTVwGmqdwYzu7WyQ6FQVZ7SwET0KKQuKm55jD0IfUpZgN0OPIiZG3zV1iSrVYcN0bdwLRXI/VNCYsUA==
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
- integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2":
+ version "7.24.2"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
+ integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
dependencies:
- "@babel/highlight" "^7.18.6"
+ "@babel/highlight" "^7.24.2"
+ picocolors "^1.0.0"
-"@babel/compat-data@^7.20.5":
- version "7.20.14"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8"
- integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==
+"@babel/compat-data@^7.23.5":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742"
+ integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==
"@babel/core@^7.19.6":
- version "7.20.12"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d"
- integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==
- dependencies:
- "@ampproject/remapping" "^2.1.0"
- "@babel/code-frame" "^7.18.6"
- "@babel/generator" "^7.20.7"
- "@babel/helper-compilation-targets" "^7.20.7"
- "@babel/helper-module-transforms" "^7.20.11"
- "@babel/helpers" "^7.20.7"
- "@babel/parser" "^7.20.7"
- "@babel/template" "^7.20.7"
- "@babel/traverse" "^7.20.12"
- "@babel/types" "^7.20.7"
- convert-source-map "^1.7.0"
+ version "7.24.3"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3"
+ integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.24.2"
+ "@babel/generator" "^7.24.1"
+ "@babel/helper-compilation-targets" "^7.23.6"
+ "@babel/helper-module-transforms" "^7.23.3"
+ "@babel/helpers" "^7.24.1"
+ "@babel/parser" "^7.24.1"
+ "@babel/template" "^7.24.0"
+ "@babel/traverse" "^7.24.1"
+ "@babel/types" "^7.24.0"
+ convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
- json5 "^2.2.2"
- semver "^6.3.0"
+ json5 "^2.2.3"
+ semver "^6.3.1"
-"@babel/generator@^7.20.7":
- version "7.20.14"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce"
- integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==
+"@babel/generator@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0"
+ integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==
dependencies:
- "@babel/types" "^7.20.7"
- "@jridgewell/gen-mapping" "^0.3.2"
+ "@babel/types" "^7.24.0"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
-"@babel/helper-compilation-targets@^7.20.7":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb"
- integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==
+"@babel/helper-compilation-targets@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
+ integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==
dependencies:
- "@babel/compat-data" "^7.20.5"
- "@babel/helper-validator-option" "^7.18.6"
- browserslist "^4.21.3"
+ "@babel/compat-data" "^7.23.5"
+ "@babel/helper-validator-option" "^7.23.5"
+ browserslist "^4.22.2"
lru-cache "^5.1.1"
- semver "^6.3.0"
-
-"@babel/helper-environment-visitor@^7.18.9":
- version "7.18.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
- integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
-
-"@babel/helper-function-name@^7.19.0":
- version "7.19.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c"
- integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==
- dependencies:
- "@babel/template" "^7.18.10"
- "@babel/types" "^7.19.0"
-
-"@babel/helper-hoist-variables@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
- integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
- integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-module-transforms@^7.20.11":
- version "7.20.11"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0"
- integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==
- dependencies:
- "@babel/helper-environment-visitor" "^7.18.9"
- "@babel/helper-module-imports" "^7.18.6"
- "@babel/helper-simple-access" "^7.20.2"
- "@babel/helper-split-export-declaration" "^7.18.6"
- "@babel/helper-validator-identifier" "^7.19.1"
- "@babel/template" "^7.20.7"
- "@babel/traverse" "^7.20.10"
- "@babel/types" "^7.20.7"
-
-"@babel/helper-simple-access@^7.20.2":
- version "7.20.2"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9"
- integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==
- dependencies:
- "@babel/types" "^7.20.2"
-
-"@babel/helper-split-export-declaration@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
- integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
- dependencies:
- "@babel/types" "^7.18.6"
-
-"@babel/helper-string-parser@^7.19.4":
- version "7.19.4"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
- integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
-
-"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
- version "7.19.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
- integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
-
-"@babel/helper-validator-option@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
- integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
-
-"@babel/helpers@^7.20.7":
- version "7.20.13"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2"
- integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==
- dependencies:
- "@babel/template" "^7.20.7"
- "@babel/traverse" "^7.20.13"
- "@babel/types" "^7.20.7"
-
-"@babel/highlight@^7.18.6":
- version "7.18.6"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
- integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
- dependencies:
- "@babel/helper-validator-identifier" "^7.18.6"
- chalk "^2.0.0"
+ semver "^6.3.1"
+
+"@babel/helper-environment-visitor@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
+"@babel/helper-function-name@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+ integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.23.0"
+
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15":
+ version "7.24.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
+ integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==
+ dependencies:
+ "@babel/types" "^7.24.0"
+
+"@babel/helper-module-transforms@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1"
+ integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-module-imports" "^7.22.15"
+ "@babel/helper-simple-access" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/helper-validator-identifier" "^7.22.20"
+
+"@babel/helper-simple-access@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
+ integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+ integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.23.4":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
+ integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
+
+"@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+"@babel/helper-validator-option@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
+ integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
+
+"@babel/helpers@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94"
+ integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==
+ dependencies:
+ "@babel/template" "^7.24.0"
+ "@babel/traverse" "^7.24.1"
+ "@babel/types" "^7.24.0"
+
+"@babel/highlight@^7.24.2":
+ version "7.24.2"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26"
+ integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
js-tokens "^4.0.0"
+ picocolors "^1.0.0"
-"@babel/parser@^7.20.13", "@babel/parser@^7.20.7":
- version "7.20.15"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89"
- integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==
-
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3":
- version "7.20.13"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
- integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
- dependencies:
- regenerator-runtime "^0.13.11"
-
-"@babel/runtime@^7.20.13":
- version "7.21.0"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673"
- integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==
- dependencies:
- regenerator-runtime "^0.13.11"
-
-"@babel/template@^7.18.10", "@babel/template@^7.20.7":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
- integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
- dependencies:
- "@babel/code-frame" "^7.18.6"
- "@babel/parser" "^7.20.7"
- "@babel/types" "^7.20.7"
-
-"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13":
- version "7.20.13"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473"
- integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==
- dependencies:
- "@babel/code-frame" "^7.18.6"
- "@babel/generator" "^7.20.7"
- "@babel/helper-environment-visitor" "^7.18.9"
- "@babel/helper-function-name" "^7.19.0"
- "@babel/helper-hoist-variables" "^7.18.6"
- "@babel/helper-split-export-declaration" "^7.18.6"
- "@babel/parser" "^7.20.13"
- "@babel/types" "^7.20.7"
- debug "^4.1.0"
+"@babel/parser@^7.24.0", "@babel/parser@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a"
+ integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==
+
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.2":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.1.tgz#431f9a794d173b53720e69a6464abc6f0e2a5c57"
+ integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.22.15", "@babel/template@^7.24.0":
+ version "7.24.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50"
+ integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==
+ dependencies:
+ "@babel/code-frame" "^7.23.5"
+ "@babel/parser" "^7.24.0"
+ "@babel/types" "^7.24.0"
+
+"@babel/traverse@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
+ integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==
+ dependencies:
+ "@babel/code-frame" "^7.24.1"
+ "@babel/generator" "^7.24.1"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.24.1"
+ "@babel/types" "^7.24.0"
+ debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7":
- version "7.20.7"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f"
- integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==
+"@babel/types@^7.20.0", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0":
+ version "7.24.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
+ integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==
dependencies:
- "@babel/helper-string-parser" "^7.19.4"
- "@babel/helper-validator-identifier" "^7.19.1"
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
-"@chakra-ui/accordion@2.1.9":
- version "2.1.9"
- resolved "https://registry.yarnpkg.com/@chakra-ui/accordion/-/accordion-2.1.9.tgz#20fa86d94dc034251df2f7c8595ae4dd541a29d9"
- integrity sha512-a9CKIAUHezc0f5FR/SQ4GVxnWuIb2HbDTxTEKTp58w/J9pecIbJaNrJ5TUZ0MVbDU9jkgO9RsZ29jkja8PomAw==
- dependencies:
- "@chakra-ui/descendant" "3.0.13"
- "@chakra-ui/icon" "3.0.16"
- "@chakra-ui/react-context" "2.0.7"
- "@chakra-ui/react-use-controllable-state" "2.0.8"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+"@chakra-ui/accordion@2.3.1":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/accordion/-/accordion-2.3.1.tgz#a326509e286a5c4e8478de9bc2b4b05017039e6b"
+ integrity sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==
+ dependencies:
+ "@chakra-ui/descendant" "3.1.0"
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/react-use-controllable-state" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/transition" "2.0.15"
+ "@chakra-ui/transition" "2.1.0"
-"@chakra-ui/alert@2.0.17":
- version "2.0.17"
- resolved "https://registry.yarnpkg.com/@chakra-ui/alert/-/alert-2.0.17.tgz#b129732ec308db6a6a1afa7c06a6595ad853c967"
- integrity sha512-0Y5vw+HkeXpwbL1roVpSSNM6luMRmUbwduUSHEA4OnX1ismvsDb1ZBfpi4Vxp6w8euJ2Uj6df3krbd5tbCP6tg==
+"@chakra-ui/alert@2.2.2":
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/alert/-/alert-2.2.2.tgz#aeba951d120c7c6e69d5f515a695ad6e4db43ffe"
+ integrity sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw==
dependencies:
- "@chakra-ui/icon" "3.0.16"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/spinner" "2.0.13"
+ "@chakra-ui/spinner" "2.1.0"
"@chakra-ui/anatomy@2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@chakra-ui/anatomy/-/anatomy-2.1.0.tgz#8aeb9b753f0412f262743adf68519dfa85120b3e"
integrity sha512-E3jMPGqKuGTbt7mKtc8g/MOOenw2c4wqRC1vOypyFgmC8wsewdY+DJJNENF3atXAK7p5VMBKQfZ7ipNlHnDAwA==
-"@chakra-ui/anatomy@2.1.2":
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/@chakra-ui/anatomy/-/anatomy-2.1.2.tgz#ea66b1841e7195da08ddc862daaa3f3e56e565f5"
- integrity sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ==
-
-"@chakra-ui/anatomy@^2.1.1":
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/@chakra-ui/anatomy/-/anatomy-2.1.1.tgz#819a1458ff727157e5500a69fc26bfea6e944495"
- integrity sha512-LUHAoqJAgxAqmyckG5bUpBrfEo1FleEyY+1A8hkWciy58gZ+h3GoY9oBpHcdo7XdHPpy3G+3hieK/7i9NLwxAw==
+"@chakra-ui/anatomy@2.2.2", "@chakra-ui/anatomy@^2.1.1":
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/anatomy/-/anatomy-2.2.2.tgz#2d0e14cba2534d92077ca28abf8c183b6e27897b"
+ integrity sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg==
-"@chakra-ui/avatar@2.2.5":
- version "2.2.5"
- resolved "https://registry.yarnpkg.com/@chakra-ui/avatar/-/avatar-2.2.5.tgz#50eb7cc5a172d394b301fa0abd5f607b7f5d3563"
- integrity sha512-TEHXuGE79+fEn61qJ7J/A0Ec+WjyNwobrDTATcLg9Zx2/WEMmZNfrWIAlI5ANQAwVbdSWeGVbyoLAK5mbcrE0A==
+"@chakra-ui/avatar@2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/avatar/-/avatar-2.3.0.tgz#f018a2714d1e3ba5970bcf66558887925fdfccf4"
+ integrity sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g==
dependencies:
- "@chakra-ui/image" "2.0.15"
+ "@chakra-ui/image" "2.1.0"
"@chakra-ui/react-children-utils" "2.0.6"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/breadcrumb@2.1.4":
- version "2.1.4"
- resolved "https://registry.yarnpkg.com/@chakra-ui/breadcrumb/-/breadcrumb-2.1.4.tgz#0d249dc2a92639bd2bf46d097dd5445112bd2367"
- integrity sha512-vyBx5TAxPnHhb0b8nyRGfqyjleD//9mySFhk96c9GL+T6YDO4swHw5y/kvDv3Ngc/iRwJ9hdI49PZKwPxLqsEg==
+"@chakra-ui/breadcrumb@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/breadcrumb/-/breadcrumb-2.2.0.tgz#751bc48498f3c403f97b5d9aae528ebfd405ef48"
+ integrity sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA==
dependencies:
"@chakra-ui/react-children-utils" "2.0.6"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
"@chakra-ui/breakpoint-utils@2.0.8":
@@ -273,54 +266,54 @@
dependencies:
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/button@2.0.16":
- version "2.0.16"
- resolved "https://registry.yarnpkg.com/@chakra-ui/button/-/button-2.0.16.tgz#ff315b57ee47c3511a6507fcfb6f00bb93e2ac7d"
- integrity sha512-NjuTKa7gNhnGSUutKuTc8HoAOe9WWIigpciBG7yj3ok67kg8bXtSzPyQFZlgTY6XGdAckWTT+Do4tvhwa5LA+g==
+"@chakra-ui/button@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/button/-/button-2.1.0.tgz#623ed32cc92fc8e52492923e9924791fc6f25447"
+ integrity sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA==
dependencies:
- "@chakra-ui/react-context" "2.0.7"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/spinner" "2.0.13"
+ "@chakra-ui/spinner" "2.1.0"
-"@chakra-ui/card@2.1.6":
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/@chakra-ui/card/-/card-2.1.6.tgz#27176bdee363ecab7d563c4997c4b2fe9e835ecc"
- integrity sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==
+"@chakra-ui/card@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/card/-/card-2.2.0.tgz#b5e59dc51c171fced76ea76bf26088803b8bc184"
+ integrity sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g==
dependencies:
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/checkbox@2.2.10":
- version "2.2.10"
- resolved "https://registry.yarnpkg.com/@chakra-ui/checkbox/-/checkbox-2.2.10.tgz#e4f773e7d2464f1d6e9d18dd88b679290cb33171"
- integrity sha512-vzxEjw99qj7loxAdP1WuHNt4EAvj/t6cc8oxyOB2mEvkAzhxI34rLR+3zWDuHWsmhyUO+XEDh4FiWdR+DK5Siw==
+"@chakra-ui/checkbox@2.3.2":
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/checkbox/-/checkbox-2.3.2.tgz#4ecb14a2f57b7470d1a58542ca4691c3b105bfa1"
+ integrity sha512-85g38JIXMEv6M+AcyIGLh7igNtfpAN6KGQFYxY9tBj0eWvWk4NKQxvqqyVta0bSAyIl1rixNIIezNpNWk2iO4g==
dependencies:
- "@chakra-ui/form-control" "2.0.17"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/form-control" "2.2.0"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-callback-ref" "2.0.7"
- "@chakra-ui/react-use-controllable-state" "2.0.8"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
- "@chakra-ui/react-use-update-effect" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
+ "@chakra-ui/react-use-controllable-state" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
+ "@chakra-ui/react-use-update-effect" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/visually-hidden" "2.0.15"
- "@zag-js/focus-visible" "0.2.1"
+ "@chakra-ui/visually-hidden" "2.2.0"
+ "@zag-js/focus-visible" "0.16.0"
-"@chakra-ui/clickable@2.0.14":
- version "2.0.14"
- resolved "https://registry.yarnpkg.com/@chakra-ui/clickable/-/clickable-2.0.14.tgz#88093008672a2a30bdd2a30ff815dcc2c88c01a5"
- integrity sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==
+"@chakra-ui/clickable@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/clickable/-/clickable-2.1.0.tgz#800fa8d10cf45a41fc50a3df32c679a3ce1921c3"
+ integrity sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==
dependencies:
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/close-button@2.0.17":
- version "2.0.17"
- resolved "https://registry.yarnpkg.com/@chakra-ui/close-button/-/close-button-2.0.17.tgz#d43d3a2ea1f08250f8d0da7704baf0e1fbd91b4b"
- integrity sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==
+"@chakra-ui/close-button@2.1.1":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/close-button/-/close-button-2.1.1.tgz#995b245c56eb41465a71d8667840c238618a7b66"
+ integrity sha512-gnpENKOanKexswSVpVz7ojZEALl2x5qjLYNqSQGbxz+aP9sOXPfUS56ebyBrre7T7exuWGiFeRwnM0oVeGPaiw==
dependencies:
- "@chakra-ui/icon" "3.0.16"
+ "@chakra-ui/icon" "3.2.0"
"@chakra-ui/color-mode@2.1.10":
version "2.1.10"
@@ -329,58 +322,58 @@
dependencies:
"@chakra-ui/react-use-safe-layout-effect" "2.0.3"
-"@chakra-ui/color-mode@2.1.12":
- version "2.1.12"
- resolved "https://registry.yarnpkg.com/@chakra-ui/color-mode/-/color-mode-2.1.12.tgz#c0caeadd5f87fadbeefc6826beabac6c4a88d8f5"
- integrity sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==
+"@chakra-ui/color-mode@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/color-mode/-/color-mode-2.2.0.tgz#828d47234c74ba2fb4c5dd63a63331aead20b9f6"
+ integrity sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==
dependencies:
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
-"@chakra-ui/control-box@2.0.13":
- version "2.0.13"
- resolved "https://registry.yarnpkg.com/@chakra-ui/control-box/-/control-box-2.0.13.tgz#ffe9634d0c3aecb8e1eb7da19e64fb3d2b181d03"
- integrity sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A==
+"@chakra-ui/control-box@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/control-box/-/control-box-2.1.0.tgz#0f4586797b3154c02463bc5c106782e70c88f04f"
+ integrity sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg==
-"@chakra-ui/counter@2.0.14":
- version "2.0.14"
- resolved "https://registry.yarnpkg.com/@chakra-ui/counter/-/counter-2.0.14.tgz#6e37a863afd2e87d7c94208245e81777640e76e2"
- integrity sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==
+"@chakra-ui/counter@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/counter/-/counter-2.1.0.tgz#e413a2f1093a18f847bb7aa240117fde788a59e6"
+ integrity sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw==
dependencies:
"@chakra-ui/number-utils" "2.0.7"
- "@chakra-ui/react-use-callback-ref" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/css-reset@2.0.12":
- version "2.0.12"
- resolved "https://registry.yarnpkg.com/@chakra-ui/css-reset/-/css-reset-2.0.12.tgz#6eebcbe9e971facd215e174e063ace29f647a045"
- integrity sha512-Q5OYIMvqTl2vZ947kIYxcS5DhQXeStB84BzzBd6C10wOx1gFUu9pL+jLpOnHR3hhpWRMdX5o7eT+gMJWIYUZ0Q==
+"@chakra-ui/css-reset@2.3.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/css-reset/-/css-reset-2.3.0.tgz#83e3160a9c2a12431cad0ee27ebfbf3aedc5c9c7"
+ integrity sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg==
-"@chakra-ui/descendant@3.0.13":
- version "3.0.13"
- resolved "https://registry.yarnpkg.com/@chakra-ui/descendant/-/descendant-3.0.13.tgz#e883a2233ee07fe1ae6c014567824c0f79df11cf"
- integrity sha512-9nzxZVxUSMc4xPL5fSaRkEOQjDQWUGjGvrZI7VzWk9eq63cojOtIxtWMSW383G9148PzWJjJYt30Eud5tdZzlg==
+"@chakra-ui/descendant@3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/descendant/-/descendant-3.1.0.tgz#f3b80ed13ffc4bf1d615b3ed5541bd0905375cca"
+ integrity sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==
dependencies:
- "@chakra-ui/react-context" "2.0.7"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
-"@chakra-ui/dom-utils@2.0.6":
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/@chakra-ui/dom-utils/-/dom-utils-2.0.6.tgz#68f49f3b4a0bdebd5e416d6fd2c012c9ad64b76a"
- integrity sha512-PVtDkPrDD5b8aoL6Atg7SLjkwhWb7BwMcLOF1L449L3nZN+DAO3nyAh6iUhZVJyunELj9d0r65CDlnMREyJZmA==
+"@chakra-ui/dom-utils@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz#d15df89e458ef19756db04c7cfd084eb552454f0"
+ integrity sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==
-"@chakra-ui/editable@2.0.19":
- version "2.0.19"
- resolved "https://registry.yarnpkg.com/@chakra-ui/editable/-/editable-2.0.19.tgz#1af2fe3c215111f61f7872fb5f599f4d8da24e7d"
- integrity sha512-YxRJsJ2JQd42zfPBgTKzIhg1HugT+gfQz1ZosmUN+IZT9YZXL2yodHTUz6Lee04Vc/CdEqgBFLuREXEUNBfGtA==
+"@chakra-ui/editable@3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/editable/-/editable-3.1.0.tgz#065783c2e3389c3bb9ab0582cb50d38e1dc00fa1"
+ integrity sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg==
dependencies:
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-callback-ref" "2.0.7"
- "@chakra-ui/react-use-controllable-state" "2.0.8"
- "@chakra-ui/react-use-focus-on-pointer-down" "2.0.6"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
- "@chakra-ui/react-use-update-effect" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
+ "@chakra-ui/react-use-controllable-state" "2.1.0"
+ "@chakra-ui/react-use-focus-on-pointer-down" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
+ "@chakra-ui/react-use-update-effect" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
"@chakra-ui/event-utils@2.0.8":
@@ -388,33 +381,33 @@
resolved "https://registry.yarnpkg.com/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz#e6439ba200825a2f15d8f1973d267d1c00a6d1b4"
integrity sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==
-"@chakra-ui/focus-lock@2.0.16":
- version "2.0.16"
- resolved "https://registry.yarnpkg.com/@chakra-ui/focus-lock/-/focus-lock-2.0.16.tgz#bfb705b565d70b2f908d7c7a27f40426ac48dff8"
- integrity sha512-UuAdGCPVrCa1lecoAvpOQD7JFT7a9RdmhKWhFt5ioIcekSLJcerdLHuuL3w0qz//8kd1/SOt7oP0aJqdAJQrCw==
+"@chakra-ui/focus-lock@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/focus-lock/-/focus-lock-2.1.0.tgz#580e5450fe85356987b9a246abaff8333369c667"
+ integrity sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==
dependencies:
- "@chakra-ui/dom-utils" "2.0.6"
- react-focus-lock "^2.9.2"
+ "@chakra-ui/dom-utils" "2.1.0"
+ react-focus-lock "^2.9.4"
-"@chakra-ui/form-control@2.0.17":
- version "2.0.17"
- resolved "https://registry.yarnpkg.com/@chakra-ui/form-control/-/form-control-2.0.17.tgz#2f710325e77ce35067337616d440f903b137bdd5"
- integrity sha512-34ptCaJ2LNvQNOlB6MAKsmH1AkT1xo7E+3Vw10Urr81yTOjDTM/iU6vG3JKPfRDMyXeowPjXmutlnuk72SSjRg==
+"@chakra-ui/form-control@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/form-control/-/form-control-2.2.0.tgz#69c771d6406ddac8ab357ae88446cc11827656a4"
+ integrity sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw==
dependencies:
- "@chakra-ui/icon" "3.0.16"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/hooks@2.1.6":
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/@chakra-ui/hooks/-/hooks-2.1.6.tgz#4d829535868148912ef7a4ff274e03b8d1cf7c72"
- integrity sha512-oMSOeoOF6/UpwTVlDFHSROAA4hPY8WgJ0erdHs1ZkuwAwHv7UzjDkvrb6xYzAAH9qHoFzc5RIBm6jVoh3LCc+Q==
+"@chakra-ui/hooks@2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/hooks/-/hooks-2.2.1.tgz#b86ce5eeaaab877ddcb11a50842d1227306ace28"
+ integrity sha512-RQbTnzl6b1tBjbDPf9zGRo9rf/pQMholsOudTxjy4i9GfTfz6kgp5ValGjQm2z7ng6Z31N1cnjZ1AlSzQ//ZfQ==
dependencies:
"@chakra-ui/react-utils" "2.0.12"
"@chakra-ui/utils" "2.0.15"
- compute-scroll-into-view "1.0.20"
+ compute-scroll-into-view "3.0.3"
copy-to-clipboard "3.3.3"
"@chakra-ui/icon@3.0.13":
@@ -424,10 +417,10 @@
dependencies:
"@chakra-ui/shared-utils" "2.0.3"
-"@chakra-ui/icon@3.0.16":
- version "3.0.16"
- resolved "https://registry.yarnpkg.com/@chakra-ui/icon/-/icon-3.0.16.tgz#6413ec637c0c3acc204301485f05451b5bcd6ba4"
- integrity sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==
+"@chakra-ui/icon@3.2.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/icon/-/icon-3.2.0.tgz#92b9454aa0d561b4994bcd6a1b3bb1fdd5c67bef"
+ integrity sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ==
dependencies:
"@chakra-ui/shared-utils" "2.0.5"
@@ -438,35 +431,35 @@
dependencies:
"@chakra-ui/icon" "3.0.13"
-"@chakra-ui/image@2.0.15":
- version "2.0.15"
- resolved "https://registry.yarnpkg.com/@chakra-ui/image/-/image-2.0.15.tgz#7f275f8f3edbb420e0613afd5023ad9cf442d09d"
- integrity sha512-w2rElXtI3FHXuGpMCsSklus+pO1Pl2LWDwsCGdpBQUvGFbnHfl7MftQgTlaGHeD5OS95Pxva39hKrA2VklKHiQ==
+"@chakra-ui/image@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/image/-/image-2.1.0.tgz#6c205f1ca148e3bf58345b0b5d4eb3d959eb9f87"
+ integrity sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA==
dependencies:
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/input@2.0.20":
- version "2.0.20"
- resolved "https://registry.yarnpkg.com/@chakra-ui/input/-/input-2.0.20.tgz#8db3ec46b52be901c94599b3659a9003bdb2dd07"
- integrity sha512-ypmsy4n4uNBVgn6Gd24Zrpi+qRf/T9WEzWkysuYC9Qfxo+i7yuf3snp7XmBy8KSGVSiXE11eO8ZN5oCg6Xg0jg==
+"@chakra-ui/input@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/input/-/input-2.1.2.tgz#0cad49ec372f8f21f2f4f1db365f34b9a708ff9d"
+ integrity sha512-GiBbb3EqAA8Ph43yGa6Mc+kUPjh4Spmxp1Pkelr8qtudpc3p2PJOOebLpd90mcqw8UePPa+l6YhhPtp6o0irhw==
dependencies:
- "@chakra-ui/form-control" "2.0.17"
- "@chakra-ui/object-utils" "2.0.8"
+ "@chakra-ui/form-control" "2.2.0"
+ "@chakra-ui/object-utils" "2.1.0"
"@chakra-ui/react-children-utils" "2.0.6"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/layout@2.1.16":
- version "2.1.16"
- resolved "https://registry.yarnpkg.com/@chakra-ui/layout/-/layout-2.1.16.tgz#9d90f25cf9f0537d19cd36a417f7ddc1461e8591"
- integrity sha512-QFS3feozIGsvB0H74lUocev55aRF26eNrdmhfJifwikZAiq+zzZAMdBdNU9UJhHClnMOU8/iGZ0MF7ti4zQS1A==
+"@chakra-ui/layout@2.3.1":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/layout/-/layout-2.3.1.tgz#0601c5eb91555d24a7015a7c9d4e01fed2698557"
+ integrity sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg==
dependencies:
"@chakra-ui/breakpoint-utils" "2.0.8"
- "@chakra-ui/icon" "3.0.16"
- "@chakra-ui/object-utils" "2.0.8"
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/object-utils" "2.1.0"
"@chakra-ui/react-children-utils" "2.0.6"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
"@chakra-ui/lazy-utils@2.0.5":
@@ -474,73 +467,73 @@
resolved "https://registry.yarnpkg.com/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz#363c3fa1d421362790b416ffa595acb835e1ae5b"
integrity sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==
-"@chakra-ui/live-region@2.0.13":
- version "2.0.13"
- resolved "https://registry.yarnpkg.com/@chakra-ui/live-region/-/live-region-2.0.13.tgz#1d00a637b74372d1ee0b215c649ebd4a33893e58"
- integrity sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ==
+"@chakra-ui/live-region@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/live-region/-/live-region-2.1.0.tgz#02b4b1d997075f19a7a9a87187e08c72e82ef0dd"
+ integrity sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw==
-"@chakra-ui/media-query@3.2.12":
- version "3.2.12"
- resolved "https://registry.yarnpkg.com/@chakra-ui/media-query/-/media-query-3.2.12.tgz#75e31f3c88818e687a4d90a2993286c2c3ca2453"
- integrity sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==
+"@chakra-ui/media-query@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/media-query/-/media-query-3.3.0.tgz#40f9151dedb6a7af9df3be0474b59a799c92c619"
+ integrity sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==
dependencies:
"@chakra-ui/breakpoint-utils" "2.0.8"
- "@chakra-ui/react-env" "3.0.0"
+ "@chakra-ui/react-env" "3.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/menu@2.1.9":
- version "2.1.9"
- resolved "https://registry.yarnpkg.com/@chakra-ui/menu/-/menu-2.1.9.tgz#2f3239a9b2855fd77fc317d9e6b904c1ad50d7c6"
- integrity sha512-ue5nD4QJcl3H3UwN0zZNJmH89XUebnvEdW6THAUL41hDjJ0J/Fjpg9Sgzwug2aBbBXBNbVMsUuhcCj6x91d+IQ==
+"@chakra-ui/menu@2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/menu/-/menu-2.2.1.tgz#7d9810d435f6b40fa72ed867a33b88a1ef75073f"
+ integrity sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==
dependencies:
- "@chakra-ui/clickable" "2.0.14"
- "@chakra-ui/descendant" "3.0.13"
+ "@chakra-ui/clickable" "2.1.0"
+ "@chakra-ui/descendant" "3.1.0"
"@chakra-ui/lazy-utils" "2.0.5"
- "@chakra-ui/popper" "3.0.13"
+ "@chakra-ui/popper" "3.1.0"
"@chakra-ui/react-children-utils" "2.0.6"
- "@chakra-ui/react-context" "2.0.7"
- "@chakra-ui/react-use-animation-state" "2.0.8"
- "@chakra-ui/react-use-controllable-state" "2.0.8"
- "@chakra-ui/react-use-disclosure" "2.0.8"
- "@chakra-ui/react-use-focus-effect" "2.0.9"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
- "@chakra-ui/react-use-outside-click" "2.0.7"
- "@chakra-ui/react-use-update-effect" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/react-use-animation-state" "2.1.0"
+ "@chakra-ui/react-use-controllable-state" "2.1.0"
+ "@chakra-ui/react-use-disclosure" "2.1.0"
+ "@chakra-ui/react-use-focus-effect" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
+ "@chakra-ui/react-use-outside-click" "2.2.0"
+ "@chakra-ui/react-use-update-effect" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/transition" "2.0.15"
+ "@chakra-ui/transition" "2.1.0"
-"@chakra-ui/modal@2.2.9":
- version "2.2.9"
- resolved "https://registry.yarnpkg.com/@chakra-ui/modal/-/modal-2.2.9.tgz#aad65a2c60aa974e023f8b3facc0e79eb742e006"
- integrity sha512-nTfNp7XsVwn5+xJOtstoFA8j0kq/9sJj7KesyYzjEDaMKvCZvIOntRYowoydho43jb4+YC7ebKhp0KOIINS0gg==
+"@chakra-ui/modal@2.3.1":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/modal/-/modal-2.3.1.tgz#524dc32b6b4f545b54ae531dbf6c74e1052ee794"
+ integrity sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==
dependencies:
- "@chakra-ui/close-button" "2.0.17"
- "@chakra-ui/focus-lock" "2.0.16"
- "@chakra-ui/portal" "2.0.15"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/close-button" "2.1.1"
+ "@chakra-ui/focus-lock" "2.1.0"
+ "@chakra-ui/portal" "2.1.0"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/transition" "2.0.15"
- aria-hidden "^1.2.2"
- react-remove-scroll "^2.5.5"
-
-"@chakra-ui/number-input@2.0.18":
- version "2.0.18"
- resolved "https://registry.yarnpkg.com/@chakra-ui/number-input/-/number-input-2.0.18.tgz#072a00ef869ebafa4960cfdee8caae8208864289"
- integrity sha512-cPkyAFFHHzeFBselrT1BtjlzMkJ6TKrTDUnHFlzqXy6aqeXuhrjFhMfXucjedSpOqedsP9ZbKFTdIAhu9DdL/A==
- dependencies:
- "@chakra-ui/counter" "2.0.14"
- "@chakra-ui/form-control" "2.0.17"
- "@chakra-ui/icon" "3.0.16"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/transition" "2.1.0"
+ aria-hidden "^1.2.3"
+ react-remove-scroll "^2.5.6"
+
+"@chakra-ui/number-input@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/number-input/-/number-input-2.1.2.tgz#dda9095fba6a4b89212332db02831b94120da163"
+ integrity sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA==
+ dependencies:
+ "@chakra-ui/counter" "2.1.0"
+ "@chakra-ui/form-control" "2.2.0"
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-callback-ref" "2.0.7"
- "@chakra-ui/react-use-event-listener" "2.0.7"
- "@chakra-ui/react-use-interval" "2.0.5"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
- "@chakra-ui/react-use-update-effect" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
+ "@chakra-ui/react-use-event-listener" "2.1.0"
+ "@chakra-ui/react-use-interval" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
+ "@chakra-ui/react-use-update-effect" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
"@chakra-ui/number-utils@2.0.7":
@@ -548,226 +541,226 @@
resolved "https://registry.yarnpkg.com/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz#aaee979ca2fb1923a0373a91619473811315db11"
integrity sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==
-"@chakra-ui/object-utils@2.0.8":
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/@chakra-ui/object-utils/-/object-utils-2.0.8.tgz#307f927f6434f99feb32ba92bdf451a6b59a6199"
- integrity sha512-2upjT2JgRuiupdrtBWklKBS6tqeGMA77Nh6Q0JaoQuH/8yq+15CGckqn3IUWkWoGI0Fg3bK9LDlbbD+9DLw95Q==
+"@chakra-ui/object-utils@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz#a4ecf9cea92f1de09f5531f53ffdc41e0b19b6c3"
+ integrity sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==
-"@chakra-ui/pin-input@2.0.19":
- version "2.0.19"
- resolved "https://registry.yarnpkg.com/@chakra-ui/pin-input/-/pin-input-2.0.19.tgz#f9b196174f0518feec5c1ee3fcaf2134c301148a"
- integrity sha512-6O7s4vWz4cqQ6zvMov9sYj6ZqWAsTxR/MNGe3DNgu1zWQg8veNCYtj1rNGhNS3eZNUMAa8uM2dXIphGTP53Xow==
+"@chakra-ui/pin-input@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/pin-input/-/pin-input-2.1.0.tgz#61e6bbf909ec510634307b2861c4f1891a9f8d81"
+ integrity sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw==
dependencies:
- "@chakra-ui/descendant" "3.0.13"
+ "@chakra-ui/descendant" "3.1.0"
"@chakra-ui/react-children-utils" "2.0.6"
- "@chakra-ui/react-context" "2.0.7"
- "@chakra-ui/react-use-controllable-state" "2.0.8"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/react-use-controllable-state" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/popover@2.1.8":
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/@chakra-ui/popover/-/popover-2.1.8.tgz#e906ce0533693d735b6e13a3a6ffe16d8e0a9ab4"
- integrity sha512-ob7fAz+WWmXIq7iGHVB3wDKzZTj+T+noYBT/U1Q+jIf+jMr2WOpJLTfb0HTZcfhvn4EBFlfBg7Wk5qbXNaOn7g==
+"@chakra-ui/popover@2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/popover/-/popover-2.2.1.tgz#89cfd29817abcd204da570073c0f2b4d8072c3a3"
+ integrity sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg==
dependencies:
- "@chakra-ui/close-button" "2.0.17"
+ "@chakra-ui/close-button" "2.1.1"
"@chakra-ui/lazy-utils" "2.0.5"
- "@chakra-ui/popper" "3.0.13"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/popper" "3.1.0"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-animation-state" "2.0.8"
- "@chakra-ui/react-use-disclosure" "2.0.8"
- "@chakra-ui/react-use-focus-effect" "2.0.9"
- "@chakra-ui/react-use-focus-on-pointer-down" "2.0.6"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-use-animation-state" "2.1.0"
+ "@chakra-ui/react-use-disclosure" "2.1.0"
+ "@chakra-ui/react-use-focus-effect" "2.1.0"
+ "@chakra-ui/react-use-focus-on-pointer-down" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/popper@3.0.13":
- version "3.0.13"
- resolved "https://registry.yarnpkg.com/@chakra-ui/popper/-/popper-3.0.13.tgz#914a90e9ae2b83d39a0f40a5454267f1266a2cb6"
- integrity sha512-FwtmYz80Ju8oK3Z1HQfisUE7JIMmDsCQsRBu6XuJ3TFQnBHit73yjZmxKjuRJ4JgyT4WBnZoTF3ATbRKSagBeg==
+"@chakra-ui/popper@3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/popper/-/popper-3.1.0.tgz#92a9180c6894763af3b22a6003f9a9d958fe2659"
+ integrity sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==
dependencies:
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@popperjs/core" "^2.9.3"
-"@chakra-ui/portal@2.0.15":
- version "2.0.15"
- resolved "https://registry.yarnpkg.com/@chakra-ui/portal/-/portal-2.0.15.tgz#21e1f97c4407fc15df8c365cb5cf799dac73ce41"
- integrity sha512-z8v7K3j1/nMuBzp2+wRIIw7s/eipVtnXLdjK5yqbMxMRa44E8Mu5VNJLz3aQFLHXEUST+ifqrjImQeli9do6LQ==
+"@chakra-ui/portal@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/portal/-/portal-2.1.0.tgz#9e7f57424d7041738b6563cac80134561080bd27"
+ integrity sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg==
dependencies:
- "@chakra-ui/react-context" "2.0.7"
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
-"@chakra-ui/progress@2.1.5":
- version "2.1.5"
- resolved "https://registry.yarnpkg.com/@chakra-ui/progress/-/progress-2.1.5.tgz#eb6a47adf2bff93971262d163461d390782a04ff"
- integrity sha512-jj5Vp4lxUchuwp4RPCepM0yAyKi344bgsOd3Apd+ldxclDcewPc82fbwDu7g/Xv27LqJkT+7E/SlQy04wGrk0g==
+"@chakra-ui/progress@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/progress/-/progress-2.2.0.tgz#67444ea9779631d7c8395b2c9c78e5634f994999"
+ integrity sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ==
dependencies:
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
-"@chakra-ui/provider@2.1.2":
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/@chakra-ui/provider/-/provider-2.1.2.tgz#b025cb718826b003b3c9535b6961e8f3be70ebd5"
- integrity sha512-4lLlz8QuJv00BhfyKzWpzfoti9MDOdJ/MqXixJV/EZ02RMBOdE9qy9bSz/WckPC2MVhtRUuwMkxH+0QY21PXuw==
+"@chakra-ui/provider@2.4.2":
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/provider/-/provider-2.4.2.tgz#92cb10b6a7df0720e3fa62716dc7cd872ae3ea3d"
+ integrity sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw==
dependencies:
- "@chakra-ui/css-reset" "2.0.12"
- "@chakra-ui/portal" "2.0.15"
- "@chakra-ui/react-env" "3.0.0"
- "@chakra-ui/system" "2.5.1"
+ "@chakra-ui/css-reset" "2.3.0"
+ "@chakra-ui/portal" "2.1.0"
+ "@chakra-ui/react-env" "3.1.0"
+ "@chakra-ui/system" "2.6.2"
"@chakra-ui/utils" "2.0.15"
-"@chakra-ui/radio@2.0.19":
- version "2.0.19"
- resolved "https://registry.yarnpkg.com/@chakra-ui/radio/-/radio-2.0.19.tgz#8d5c02eae8eddbced4476b1b50921ade62f0a744"
- integrity sha512-PlJiV59eGSmeKP4v/4+ccQUWGRd0cjPKkj/p3L+UbOf8pl9dWm8y9kIeL5TYbghQSDv0nzkrH4+yMnnDTZjdMQ==
+"@chakra-ui/radio@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/radio/-/radio-2.1.2.tgz#66db19c61a2e628aaf5e727027f7c3b4006ea898"
+ integrity sha512-n10M46wJrMGbonaghvSRnZ9ToTv/q76Szz284gv4QUWvyljQACcGrXIONUnQ3BIwbOfkRqSk7Xl/JgZtVfll+w==
dependencies:
- "@chakra-ui/form-control" "2.0.17"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/form-control" "2.2.0"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
- "@zag-js/focus-visible" "0.2.1"
+ "@zag-js/focus-visible" "0.16.0"
"@chakra-ui/react-children-utils@2.0.6":
version "2.0.6"
resolved "https://registry.yarnpkg.com/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz#6c480c6a60678fcb75cb7d57107c7a79e5179b92"
integrity sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==
-"@chakra-ui/react-context@2.0.7":
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-context/-/react-context-2.0.7.tgz#f79a2b072d04d4280ec8799dc03a8a1af521ca2e"
- integrity sha512-i7EGmSU+h2GB30cwrKB4t1R5BMHyGoJM5L2Zz7b+ZUX4aAqyPcfe97wPiQB6Rgr1ImGXrUeov4CDVrRZ2FPgLQ==
+"@chakra-ui/react-context@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-context/-/react-context-2.1.0.tgz#4858be1d5ff1c8ac0a0ec088d93a3b7f1cbbff99"
+ integrity sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==
-"@chakra-ui/react-env@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-env/-/react-env-3.0.0.tgz#2c3c9dc0e529b9b474a386a2b24988317b2a0811"
- integrity sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==
+"@chakra-ui/react-env@3.1.0":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-env/-/react-env-3.1.0.tgz#7d3c1c05a501bb369524d9f3d38c9325eb16ab50"
+ integrity sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==
dependencies:
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
"@chakra-ui/react-types@2.0.7":
version "2.0.7"
resolved "https://registry.yarnpkg.com/@chakra-ui/react-types/-/react-types-2.0.7.tgz#799c166a44882b23059c8f510eac9bd5d0869ac4"
integrity sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==
-"@chakra-ui/react-use-animation-state@2.0.8":
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.8.tgz#544ef3007498d4a0629b9d1916056ddaf59aa286"
- integrity sha512-xv9zSF2Rd1mHWQ+m5DLBWeh4atF8qrNvsOs3MNrvxKYBS3f79N3pqcQGrWAEvirXWXfiCeje2VAkEggqFRIo+Q==
+"@chakra-ui/react-use-animation-state@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.1.0.tgz#eab661fbafd96804fe867b0df0c27e78feefe6e2"
+ integrity sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==
dependencies:
- "@chakra-ui/dom-utils" "2.0.6"
- "@chakra-ui/react-use-event-listener" "2.0.7"
+ "@chakra-ui/dom-utils" "2.1.0"
+ "@chakra-ui/react-use-event-listener" "2.1.0"
-"@chakra-ui/react-use-callback-ref@2.0.7":
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.7.tgz#9b844a81037d0ecaaa8031979fa050165635e211"
- integrity sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw==
+"@chakra-ui/react-use-callback-ref@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.1.0.tgz#a508085f4d9e7d84d4ceffdf5f41745c9ac451d7"
+ integrity sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==
-"@chakra-ui/react-use-controllable-state@2.0.8":
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.8.tgz#6b71187e03be632c244dde9f16ed685428087ec9"
- integrity sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==
+"@chakra-ui/react-use-controllable-state@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.1.0.tgz#8fb6fa2f45d0c04173582ae8297e604ffdb9c7d9"
+ integrity sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==
dependencies:
- "@chakra-ui/react-use-callback-ref" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
-"@chakra-ui/react-use-disclosure@2.0.8":
- version "2.0.8"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.8.tgz#e0e0445afc6d6d96bb262b99751e675034c31497"
- integrity sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==
+"@chakra-ui/react-use-disclosure@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.1.0.tgz#90093eaf45db1bea7a6851dd0ce5cdb3eb66f90a"
+ integrity sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==
dependencies:
- "@chakra-ui/react-use-callback-ref" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
-"@chakra-ui/react-use-event-listener@2.0.7":
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.7.tgz#ed08164164e79183d876eeb71e12c6bfaca3ad17"
- integrity sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==
+"@chakra-ui/react-use-event-listener@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.1.0.tgz#afea2645bd9b38f754fc2b8eb858f9bb22385ded"
+ integrity sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==
dependencies:
- "@chakra-ui/react-use-callback-ref" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
-"@chakra-ui/react-use-focus-effect@2.0.9":
- version "2.0.9"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.9.tgz#9f94c0cb54e6e14ac9f048ca4d32a1fdcea067c1"
- integrity sha512-20nfNkpbVwyb41q9wxp8c4jmVp6TUGAPE3uFTDpiGcIOyPW5aecQtPmTXPMJH+2aa8Nu1wyoT1btxO+UYiQM3g==
+"@chakra-ui/react-use-focus-effect@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.1.0.tgz#963fb790370dfadd51d12666ff2da60706f53a2a"
+ integrity sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==
dependencies:
- "@chakra-ui/dom-utils" "2.0.6"
- "@chakra-ui/react-use-event-listener" "2.0.7"
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
- "@chakra-ui/react-use-update-effect" "2.0.7"
+ "@chakra-ui/dom-utils" "2.1.0"
+ "@chakra-ui/react-use-event-listener" "2.1.0"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
+ "@chakra-ui/react-use-update-effect" "2.1.0"
-"@chakra-ui/react-use-focus-on-pointer-down@2.0.6":
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.6.tgz#13330eb518c17e591c908cb8f4a30d43a978e3f2"
- integrity sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==
+"@chakra-ui/react-use-focus-on-pointer-down@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.1.0.tgz#2fbcf6bc7d06d97606747e231a908d5c387ca0cc"
+ integrity sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg==
dependencies:
- "@chakra-ui/react-use-event-listener" "2.0.7"
+ "@chakra-ui/react-use-event-listener" "2.1.0"
-"@chakra-ui/react-use-interval@2.0.5":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-interval/-/react-use-interval-2.0.5.tgz#c1a0043bf188b19b790a27668f4e860391335a60"
- integrity sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==
+"@chakra-ui/react-use-interval@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-interval/-/react-use-interval-2.1.0.tgz#2602c097b3ab74b6644812e4f5efaad621218d98"
+ integrity sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw==
dependencies:
- "@chakra-ui/react-use-callback-ref" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
-"@chakra-ui/react-use-latest-ref@2.0.5":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.5.tgz#b61dc4dadda340f7b14df0ec1d50ab2e507b3b3e"
- integrity sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ==
+"@chakra-ui/react-use-latest-ref@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.1.0.tgz#d1e926130102566ece1d39f8a48ed125e0c8441a"
+ integrity sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ==
-"@chakra-ui/react-use-merge-refs@2.0.7":
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.7.tgz#1a1fe800fb5501ec3da4088fbac78c03bbad13a7"
- integrity sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw==
+"@chakra-ui/react-use-merge-refs@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.1.0.tgz#c0c233527abdbea9a1348269c192012205762314"
+ integrity sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==
-"@chakra-ui/react-use-outside-click@2.0.7":
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.0.7.tgz#56c668f020fbc6331db4c3b61c8b845a68c4a134"
- integrity sha512-MsAuGLkwYNxNJ5rb8lYNvXApXxYMnJ3MzqBpQj1kh5qP/+JSla9XMjE/P94ub4fSEttmNSqs43SmPPrmPuihsQ==
+"@chakra-ui/react-use-outside-click@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.2.0.tgz#5570b772a255f6f02b69e967127397c1b5fa3d3c"
+ integrity sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==
dependencies:
- "@chakra-ui/react-use-callback-ref" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
-"@chakra-ui/react-use-pan-event@2.0.9":
- version "2.0.9"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.9.tgz#0ff33a285e75a692d1ed52dbb9f3046a593b8004"
- integrity sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==
+"@chakra-ui/react-use-pan-event@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.1.0.tgz#51c21bc3c0e9e73d1faef5ea4f7e3c3d071a2758"
+ integrity sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg==
dependencies:
"@chakra-ui/event-utils" "2.0.8"
- "@chakra-ui/react-use-latest-ref" "2.0.5"
+ "@chakra-ui/react-use-latest-ref" "2.1.0"
framesync "6.1.2"
-"@chakra-ui/react-use-previous@2.0.5":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-previous/-/react-use-previous-2.0.5.tgz#65836cc81e3a1bf4252cd08a71094f1be827b56c"
- integrity sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw==
+"@chakra-ui/react-use-previous@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-previous/-/react-use-previous-2.1.0.tgz#f6046e6f7398b1e8d7e66ff7ebb8d61c92a2d3d0"
+ integrity sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg==
"@chakra-ui/react-use-safe-layout-effect@2.0.3":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.3.tgz#bf63ac8c94460aa1b20b6b601a0ea873556ffb1b"
integrity sha512-dlTvQURzmdfyBbNdydgO4Wy2/HV8aJN8LszTtyb5vRZsyaslDM/ftcxo8E8QjHwRLD/V1Epb/A8731QfimfVaQ==
-"@chakra-ui/react-use-safe-layout-effect@2.0.5":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.5.tgz#6cf388c37fd2a42b5295a292e149b32f860a00a7"
- integrity sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ==
+"@chakra-ui/react-use-safe-layout-effect@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.1.0.tgz#3a95f0ba6fd5d2d0aa14919160f2c825f13e686f"
+ integrity sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==
-"@chakra-ui/react-use-size@2.0.9":
- version "2.0.9"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-size/-/react-use-size-2.0.9.tgz#00717867b98a24c3bdcfaa0c3e70732404193486"
- integrity sha512-Jce7QmO1jlQZq+Y77VKckWzroRnajChzUQ8xhLQZO6VbYvrpg3cu+X2QCz3G+MZzB+1/hnvvAqmZ+uJLd8rEJg==
+"@chakra-ui/react-use-size@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-size/-/react-use-size-2.1.0.tgz#fcf3070eaade8b4a84af8ce5341c4d5ca0a42bec"
+ integrity sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A==
dependencies:
- "@zag-js/element-size" "0.3.1"
+ "@zag-js/element-size" "0.10.5"
-"@chakra-ui/react-use-timeout@2.0.5":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.5.tgz#13c4e48e48d4b84ce1e062f0f1c9ec401ece78c9"
- integrity sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==
+"@chakra-ui/react-use-timeout@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-timeout/-/react-use-timeout-2.1.0.tgz#24415f54267d7241a3c1d36a5cae4d472834cef7"
+ integrity sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ==
dependencies:
- "@chakra-ui/react-use-callback-ref" "2.0.7"
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
-"@chakra-ui/react-use-update-effect@2.0.7":
- version "2.0.7"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.7.tgz#f94b7975ebb150c03d410e754b54f0e9dd263134"
- integrity sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg==
+"@chakra-ui/react-use-update-effect@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.1.0.tgz#5c57cd1f50c2a6a8119e0f57f69510723d69884b"
+ integrity sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==
"@chakra-ui/react-utils@2.0.12":
version "2.0.12"
@@ -784,68 +777,70 @@
"@chakra-ui/utils" "2.0.12"
"@chakra-ui/react@^2.4.9":
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.5.1.tgz#05414db2b512bd4402e42eecc6b915d85102c576"
- integrity sha512-ugkaqfcNMb9L4TkalWiF3rnqfr0TlUUD46JZaDIZiORVisaSwXTZTQrVfG40VghhaJT28rnC5WtiE8kd567ZBQ==
- dependencies:
- "@chakra-ui/accordion" "2.1.9"
- "@chakra-ui/alert" "2.0.17"
- "@chakra-ui/avatar" "2.2.5"
- "@chakra-ui/breadcrumb" "2.1.4"
- "@chakra-ui/button" "2.0.16"
- "@chakra-ui/card" "2.1.6"
- "@chakra-ui/checkbox" "2.2.10"
- "@chakra-ui/close-button" "2.0.17"
- "@chakra-ui/control-box" "2.0.13"
- "@chakra-ui/counter" "2.0.14"
- "@chakra-ui/css-reset" "2.0.12"
- "@chakra-ui/editable" "2.0.19"
- "@chakra-ui/focus-lock" "2.0.16"
- "@chakra-ui/form-control" "2.0.17"
- "@chakra-ui/hooks" "2.1.6"
- "@chakra-ui/icon" "3.0.16"
- "@chakra-ui/image" "2.0.15"
- "@chakra-ui/input" "2.0.20"
- "@chakra-ui/layout" "2.1.16"
- "@chakra-ui/live-region" "2.0.13"
- "@chakra-ui/media-query" "3.2.12"
- "@chakra-ui/menu" "2.1.9"
- "@chakra-ui/modal" "2.2.9"
- "@chakra-ui/number-input" "2.0.18"
- "@chakra-ui/pin-input" "2.0.19"
- "@chakra-ui/popover" "2.1.8"
- "@chakra-ui/popper" "3.0.13"
- "@chakra-ui/portal" "2.0.15"
- "@chakra-ui/progress" "2.1.5"
- "@chakra-ui/provider" "2.1.2"
- "@chakra-ui/radio" "2.0.19"
- "@chakra-ui/react-env" "3.0.0"
- "@chakra-ui/select" "2.0.18"
- "@chakra-ui/skeleton" "2.0.24"
- "@chakra-ui/slider" "2.0.21"
- "@chakra-ui/spinner" "2.0.13"
- "@chakra-ui/stat" "2.0.17"
- "@chakra-ui/styled-system" "2.6.1"
- "@chakra-ui/switch" "2.0.22"
- "@chakra-ui/system" "2.5.1"
- "@chakra-ui/table" "2.0.16"
- "@chakra-ui/tabs" "2.1.8"
- "@chakra-ui/tag" "2.0.17"
- "@chakra-ui/textarea" "2.0.18"
- "@chakra-ui/theme" "2.2.5"
- "@chakra-ui/theme-utils" "2.0.11"
- "@chakra-ui/toast" "6.0.1"
- "@chakra-ui/tooltip" "2.2.6"
- "@chakra-ui/transition" "2.0.15"
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.8.2.tgz#94d692fb35e4447748c5bfd73d8d38a746193c7d"
+ integrity sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ==
+ dependencies:
+ "@chakra-ui/accordion" "2.3.1"
+ "@chakra-ui/alert" "2.2.2"
+ "@chakra-ui/avatar" "2.3.0"
+ "@chakra-ui/breadcrumb" "2.2.0"
+ "@chakra-ui/button" "2.1.0"
+ "@chakra-ui/card" "2.2.0"
+ "@chakra-ui/checkbox" "2.3.2"
+ "@chakra-ui/close-button" "2.1.1"
+ "@chakra-ui/control-box" "2.1.0"
+ "@chakra-ui/counter" "2.1.0"
+ "@chakra-ui/css-reset" "2.3.0"
+ "@chakra-ui/editable" "3.1.0"
+ "@chakra-ui/focus-lock" "2.1.0"
+ "@chakra-ui/form-control" "2.2.0"
+ "@chakra-ui/hooks" "2.2.1"
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/image" "2.1.0"
+ "@chakra-ui/input" "2.1.2"
+ "@chakra-ui/layout" "2.3.1"
+ "@chakra-ui/live-region" "2.1.0"
+ "@chakra-ui/media-query" "3.3.0"
+ "@chakra-ui/menu" "2.2.1"
+ "@chakra-ui/modal" "2.3.1"
+ "@chakra-ui/number-input" "2.1.2"
+ "@chakra-ui/pin-input" "2.1.0"
+ "@chakra-ui/popover" "2.2.1"
+ "@chakra-ui/popper" "3.1.0"
+ "@chakra-ui/portal" "2.1.0"
+ "@chakra-ui/progress" "2.2.0"
+ "@chakra-ui/provider" "2.4.2"
+ "@chakra-ui/radio" "2.1.2"
+ "@chakra-ui/react-env" "3.1.0"
+ "@chakra-ui/select" "2.1.2"
+ "@chakra-ui/skeleton" "2.1.0"
+ "@chakra-ui/skip-nav" "2.1.0"
+ "@chakra-ui/slider" "2.1.0"
+ "@chakra-ui/spinner" "2.1.0"
+ "@chakra-ui/stat" "2.1.1"
+ "@chakra-ui/stepper" "2.3.1"
+ "@chakra-ui/styled-system" "2.9.2"
+ "@chakra-ui/switch" "2.1.2"
+ "@chakra-ui/system" "2.6.2"
+ "@chakra-ui/table" "2.1.0"
+ "@chakra-ui/tabs" "3.0.0"
+ "@chakra-ui/tag" "3.1.1"
+ "@chakra-ui/textarea" "2.1.2"
+ "@chakra-ui/theme" "3.3.1"
+ "@chakra-ui/theme-utils" "2.0.21"
+ "@chakra-ui/toast" "7.0.2"
+ "@chakra-ui/tooltip" "2.3.1"
+ "@chakra-ui/transition" "2.1.0"
"@chakra-ui/utils" "2.0.15"
- "@chakra-ui/visually-hidden" "2.0.15"
+ "@chakra-ui/visually-hidden" "2.2.0"
-"@chakra-ui/select@2.0.18":
- version "2.0.18"
- resolved "https://registry.yarnpkg.com/@chakra-ui/select/-/select-2.0.18.tgz#4eb6092610067c1b4131353fe39b4466e251395b"
- integrity sha512-1d2lUT5LM6oOs5x4lzBh4GFDuXX62+lr+sgV7099g951/5UNbb0CS2hSZHsO7yZThLNbr7QTWZvAOAayVcGzdw==
+"@chakra-ui/select@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/select/-/select-2.1.2.tgz#f57d6cec0559373c32094fd4a5abd32855829264"
+ integrity sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA==
dependencies:
- "@chakra-ui/form-control" "2.0.17"
+ "@chakra-ui/form-control" "2.2.0"
"@chakra-ui/shared-utils" "2.0.5"
"@chakra-ui/shared-utils@2.0.3":
@@ -858,45 +853,59 @@
resolved "https://registry.yarnpkg.com/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz#cb2b49705e113853647f1822142619570feba081"
integrity sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==
-"@chakra-ui/skeleton@2.0.24":
- version "2.0.24"
- resolved "https://registry.yarnpkg.com/@chakra-ui/skeleton/-/skeleton-2.0.24.tgz#dc9dcca6fc43005544fabfd38a444943b0a29cad"
- integrity sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==
+"@chakra-ui/skeleton@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/skeleton/-/skeleton-2.1.0.tgz#e3b25dd3afa330029d6d63be0f7cb8d44ad25531"
+ integrity sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ==
dependencies:
- "@chakra-ui/media-query" "3.2.12"
- "@chakra-ui/react-use-previous" "2.0.5"
+ "@chakra-ui/media-query" "3.3.0"
+ "@chakra-ui/react-use-previous" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/slider@2.0.21":
- version "2.0.21"
- resolved "https://registry.yarnpkg.com/@chakra-ui/slider/-/slider-2.0.21.tgz#f65b15bf0d5f827699ff9a2d6faee35006e2bfce"
- integrity sha512-Mm76yJxEqJl21+3waEcKg3tM8Y4elJ7mcViN6Brj35PTfzUJfSJxeBGo1nLPJ+X5jLj7o/L4kfBmUk3lY4QYEQ==
+"@chakra-ui/skip-nav@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/skip-nav/-/skip-nav-2.1.0.tgz#cac27eecc6eded1e83c8f0cf7445d727739cb325"
+ integrity sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug==
+
+"@chakra-ui/slider@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/slider/-/slider-2.1.0.tgz#1caeed18761ba2a390777418cc9389ba25e39bce"
+ integrity sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ==
dependencies:
"@chakra-ui/number-utils" "2.0.7"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-callback-ref" "2.0.7"
- "@chakra-ui/react-use-controllable-state" "2.0.8"
- "@chakra-ui/react-use-latest-ref" "2.0.5"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
- "@chakra-ui/react-use-pan-event" "2.0.9"
- "@chakra-ui/react-use-size" "2.0.9"
- "@chakra-ui/react-use-update-effect" "2.0.7"
-
-"@chakra-ui/spinner@2.0.13":
- version "2.0.13"
- resolved "https://registry.yarnpkg.com/@chakra-ui/spinner/-/spinner-2.0.13.tgz#64fe919c18305c653ced046e25d5883ee4c1e7d7"
- integrity sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==
+ "@chakra-ui/react-use-callback-ref" "2.1.0"
+ "@chakra-ui/react-use-controllable-state" "2.1.0"
+ "@chakra-ui/react-use-latest-ref" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
+ "@chakra-ui/react-use-pan-event" "2.1.0"
+ "@chakra-ui/react-use-size" "2.1.0"
+ "@chakra-ui/react-use-update-effect" "2.1.0"
+
+"@chakra-ui/spinner@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/spinner/-/spinner-2.1.0.tgz#aa24a3d692c6ac90714e0f0f82c76c12c78c8e60"
+ integrity sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==
dependencies:
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/stat@2.0.17":
- version "2.0.17"
- resolved "https://registry.yarnpkg.com/@chakra-ui/stat/-/stat-2.0.17.tgz#2cd712cc7e0d58d9cbd542deea911f1b0925074f"
- integrity sha512-PhD+5oVLWjQmGLfeZSmexp3AtLcaggWBwoMZ4z8QMZIQzf/fJJWMk0bMqxlpTv8ORDkfY/4ImuFB/RJHvcqlcA==
+"@chakra-ui/stat@2.1.1":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/stat/-/stat-2.1.1.tgz#a204ba915795345996a16c79794d84826d7dcc2d"
+ integrity sha512-LDn0d/LXQNbAn2KaR3F1zivsZCewY4Jsy1qShmfBMKwn6rI8yVlbvu6SiA3OpHS0FhxbsZxQI6HefEoIgtqY6Q==
dependencies:
- "@chakra-ui/icon" "3.0.16"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/shared-utils" "2.0.5"
+
+"@chakra-ui/stepper@2.3.1":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/stepper/-/stepper-2.3.1.tgz#a0a0b73e147f202ab4e51cae55dad45489cc89fd"
+ integrity sha512-ky77lZbW60zYkSXhYz7kbItUpAQfEdycT0Q4bkHLxfqbuiGMf8OmgZOQkOB9uM4v0zPwy2HXhe0vq4Dd0xa55Q==
+ dependencies:
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
"@chakra-ui/styled-system@2.5.0":
@@ -907,21 +916,21 @@
csstype "^3.0.11"
lodash.mergewith "4.6.2"
-"@chakra-ui/styled-system@2.6.1":
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/@chakra-ui/styled-system/-/styled-system-2.6.1.tgz#302d496d34c0b7b30c646a7e3c9b113a2f4588da"
- integrity sha512-jy/1dVi1LxjoRCm+Eo5mqBgvPy5SCWMlIcz6GbIZBDpkGeKZwtqrZLjekxxLBCy8ORY+kJlUB0FT6AzVR/1tjw==
+"@chakra-ui/styled-system@2.9.2":
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/styled-system/-/styled-system-2.9.2.tgz#898ab63da560a4a014f7b05fa7767e8c76da6d2f"
+ integrity sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg==
dependencies:
"@chakra-ui/shared-utils" "2.0.5"
- csstype "^3.0.11"
+ csstype "^3.1.2"
lodash.mergewith "4.6.2"
-"@chakra-ui/switch@2.0.22":
- version "2.0.22"
- resolved "https://registry.yarnpkg.com/@chakra-ui/switch/-/switch-2.0.22.tgz#7b35e2b10ea4cf91fb49f5175b4335c61dcd25b3"
- integrity sha512-+/Yy6y7VFD91uSPruF8ZvePi3tl5D8UNVATtWEQ+QBI92DLSM+PtgJ2F0Y9GMZ9NzMxpZ80DqwY7/kqcPCfLvw==
+"@chakra-ui/switch@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/switch/-/switch-2.1.2.tgz#f7c6878d8126bfac8fa3b939079f1017c21b7479"
+ integrity sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA==
dependencies:
- "@chakra-ui/checkbox" "2.2.10"
+ "@chakra-ui/checkbox" "2.3.2"
"@chakra-ui/shared-utils" "2.0.5"
"@chakra-ui/system@2.3.5":
@@ -936,56 +945,56 @@
"@chakra-ui/utils" "2.0.12"
react-fast-compare "3.2.0"
-"@chakra-ui/system@2.5.1":
- version "2.5.1"
- resolved "https://registry.yarnpkg.com/@chakra-ui/system/-/system-2.5.1.tgz#bc03a11ae31e795966c7618280548d5cd866f47e"
- integrity sha512-4+86OrcSoq7lGkm5fh+sJ3IWXSTzjz+HOllRbCW2Rtnmcg7ritiXVNV2VygEg2DrCcx5+tNqRHDM764zW+AEug==
+"@chakra-ui/system@2.6.2":
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/system/-/system-2.6.2.tgz#528ec955bd6a7f74da46470ee8225b1e2c80a78b"
+ integrity sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==
dependencies:
- "@chakra-ui/color-mode" "2.1.12"
- "@chakra-ui/object-utils" "2.0.8"
+ "@chakra-ui/color-mode" "2.2.0"
+ "@chakra-ui/object-utils" "2.1.0"
"@chakra-ui/react-utils" "2.0.12"
- "@chakra-ui/styled-system" "2.6.1"
- "@chakra-ui/theme-utils" "2.0.11"
+ "@chakra-ui/styled-system" "2.9.2"
+ "@chakra-ui/theme-utils" "2.0.21"
"@chakra-ui/utils" "2.0.15"
- react-fast-compare "3.2.0"
+ react-fast-compare "3.2.2"
-"@chakra-ui/table@2.0.16":
- version "2.0.16"
- resolved "https://registry.yarnpkg.com/@chakra-ui/table/-/table-2.0.16.tgz#e69736cba5cfb218c5e40592ad9280c6e32f6fe7"
- integrity sha512-vWDXZ6Ad3Aj66curp1tZBHvCfQHX2FJ4ijLiqGgQszWFIchfhJ5vMgEBJaFMZ+BN1draAjuRTZqaQefOApzvRg==
+"@chakra-ui/table@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/table/-/table-2.1.0.tgz#20dce14c5e4d70dc7c6c0e87cce9b05907ff8c50"
+ integrity sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ==
dependencies:
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/react-context" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/tabs@2.1.8":
- version "2.1.8"
- resolved "https://registry.yarnpkg.com/@chakra-ui/tabs/-/tabs-2.1.8.tgz#e83071380f9a3633810308d45de51be7a74f5eb9"
- integrity sha512-B7LeFN04Ny2jsSy5TFOQxnbZ6ITxGxLxsB2PE0vvQjMSblBrUryOxdjw80HZhfiw6od0ikK9CeKQOIt9QCguSw==
+"@chakra-ui/tabs@3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/tabs/-/tabs-3.0.0.tgz#854c06880af26158d7c72881c4b5e0453f6c485d"
+ integrity sha512-6Mlclp8L9lqXmsGWF5q5gmemZXOiOYuh0SGT/7PgJVNPz3LXREXlXg2an4MBUD8W5oTkduCX+3KTMCwRrVrDYw==
dependencies:
- "@chakra-ui/clickable" "2.0.14"
- "@chakra-ui/descendant" "3.0.13"
+ "@chakra-ui/clickable" "2.1.0"
+ "@chakra-ui/descendant" "3.1.0"
"@chakra-ui/lazy-utils" "2.0.5"
"@chakra-ui/react-children-utils" "2.0.6"
- "@chakra-ui/react-context" "2.0.7"
- "@chakra-ui/react-use-controllable-state" "2.0.8"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
- "@chakra-ui/react-use-safe-layout-effect" "2.0.5"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/react-use-controllable-state" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
+ "@chakra-ui/react-use-safe-layout-effect" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/tag@2.0.17":
- version "2.0.17"
- resolved "https://registry.yarnpkg.com/@chakra-ui/tag/-/tag-2.0.17.tgz#97adb86db190ddb3526060b78c590392e0ac8b4c"
- integrity sha512-A47zE9Ft9qxOJ+5r1cUseKRCoEdqCRzFm0pOtZgRcckqavglk75Xjgz8HbBpUO2zqqd49MlqdOwR8o87fXS1vg==
+"@chakra-ui/tag@3.1.1":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/tag/-/tag-3.1.1.tgz#d05284b6549a84d3a08e57eec57df3ad0eebd882"
+ integrity sha512-Bdel79Dv86Hnge2PKOU+t8H28nm/7Y3cKd4Kfk9k3lOpUh4+nkSGe58dhRzht59lEqa4N9waCgQiBdkydjvBXQ==
dependencies:
- "@chakra-ui/icon" "3.0.16"
- "@chakra-ui/react-context" "2.0.7"
+ "@chakra-ui/icon" "3.2.0"
+ "@chakra-ui/react-context" "2.1.0"
-"@chakra-ui/textarea@2.0.18":
- version "2.0.18"
- resolved "https://registry.yarnpkg.com/@chakra-ui/textarea/-/textarea-2.0.18.tgz#da6d629b465f65bbc7b48039c2e48a4ae1d853b4"
- integrity sha512-aGHHb29vVifO0OtcK/k8cMykzjOKo/coDTU0NJqz7OOLAWIMNV2eGenvmO1n9tTZbmbqHiX+Sa1nPRX+pd14lg==
+"@chakra-ui/textarea@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/textarea/-/textarea-2.1.2.tgz#30f8af0e233cec2dee79d527450c6586e7122eff"
+ integrity sha512-ip7tvklVCZUb2fOHDb23qPy/Fr2mzDOGdkrpbNi50hDCiV4hFX02jdQJdi3ydHZUyVgZVBKPOJ+lT9i7sKA2wA==
dependencies:
- "@chakra-ui/form-control" "2.0.17"
+ "@chakra-ui/form-control" "2.2.0"
"@chakra-ui/shared-utils" "2.0.5"
"@chakra-ui/theme-tools@2.0.14":
@@ -996,23 +1005,23 @@
"@chakra-ui/anatomy" "2.1.0"
color2k "^2.0.0"
-"@chakra-ui/theme-tools@2.0.17":
- version "2.0.17"
- resolved "https://registry.yarnpkg.com/@chakra-ui/theme-tools/-/theme-tools-2.0.17.tgz#9496094336c9480f950c8d7ab6e05f1c19caa955"
- integrity sha512-Auu38hnihlJZQcPok6itRDBbwof3TpXGYtDPnOvrq4Xp7jnab36HLt7KEXSDPXbtOk3ZqU99pvI1en5LbDrdjg==
+"@chakra-ui/theme-tools@2.1.2":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/theme-tools/-/theme-tools-2.1.2.tgz#913be05879cd816c546993ccb9ff7615f85ff69f"
+ integrity sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA==
dependencies:
- "@chakra-ui/anatomy" "2.1.2"
+ "@chakra-ui/anatomy" "2.2.2"
"@chakra-ui/shared-utils" "2.0.5"
- color2k "^2.0.0"
+ color2k "^2.0.2"
-"@chakra-ui/theme-utils@2.0.11":
- version "2.0.11"
- resolved "https://registry.yarnpkg.com/@chakra-ui/theme-utils/-/theme-utils-2.0.11.tgz#c01b1d14fdd63326d1ad11fd8f0872921ea43872"
- integrity sha512-lBAay6Sq3/fl7exd3mFxWAbzgdQowytor0fnlHrpNStn1HgFjXukwsf6356XQOie2Vd8qaMM7qZtMh4AiC0dcg==
+"@chakra-ui/theme-utils@2.0.21":
+ version "2.0.21"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/theme-utils/-/theme-utils-2.0.21.tgz#da7ed541a5241a8ed0384eb14f37fa9b998382cf"
+ integrity sha512-FjH5LJbT794r0+VSCXB3lT4aubI24bLLRWB+CuRKHijRvsOg717bRdUN/N1fEmEpFnRVrbewttWh/OQs0EWpWw==
dependencies:
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/styled-system" "2.6.1"
- "@chakra-ui/theme" "2.2.5"
+ "@chakra-ui/styled-system" "2.9.2"
+ "@chakra-ui/theme" "3.3.1"
lodash.mergewith "4.6.2"
"@chakra-ui/theme-utils@2.0.6":
@@ -1032,47 +1041,48 @@
"@chakra-ui/anatomy" "2.1.0"
"@chakra-ui/theme-tools" "2.0.14"
-"@chakra-ui/theme@2.2.5":
- version "2.2.5"
- resolved "https://registry.yarnpkg.com/@chakra-ui/theme/-/theme-2.2.5.tgz#18ed1755ff27c1ff1f1a77083ffc546c361c926e"
- integrity sha512-hYASZMwu0NqEv6PPydu+F3I+kMNd44yR4TwjR/lXBz/LEh64L6UPY6kQjebCfgdVtsGdl3HKg+eLlfa7SvfRgw==
+"@chakra-ui/theme@3.3.1":
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/theme/-/theme-3.3.1.tgz#75c6cd0b5c70c0aa955068274ee4780f299bd8a4"
+ integrity sha512-Hft/VaT8GYnItGCBbgWd75ICrIrIFrR7lVOhV/dQnqtfGqsVDlrztbSErvMkoPKt0UgAkd9/o44jmZ6X4U2nZQ==
dependencies:
- "@chakra-ui/anatomy" "2.1.2"
+ "@chakra-ui/anatomy" "2.2.2"
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/theme-tools" "2.0.17"
-
-"@chakra-ui/toast@6.0.1":
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/@chakra-ui/toast/-/toast-6.0.1.tgz#726b67a57cdd592320bb3f450c66d007a2a1d902"
- integrity sha512-ej2kJXvu/d2h6qnXU5D8XTyw0qpsfmbiU7hUffo/sPxkz89AUOQ08RUuUmB1ssW/FZcQvNMJ5WgzCTKHGBxtxw==
- dependencies:
- "@chakra-ui/alert" "2.0.17"
- "@chakra-ui/close-button" "2.0.17"
- "@chakra-ui/portal" "2.0.15"
- "@chakra-ui/react-context" "2.0.7"
- "@chakra-ui/react-use-timeout" "2.0.5"
- "@chakra-ui/react-use-update-effect" "2.0.7"
+ "@chakra-ui/theme-tools" "2.1.2"
+
+"@chakra-ui/toast@7.0.2":
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/toast/-/toast-7.0.2.tgz#d1c396bbfced12e22b010899731fd8cc294d53ec"
+ integrity sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA==
+ dependencies:
+ "@chakra-ui/alert" "2.2.2"
+ "@chakra-ui/close-button" "2.1.1"
+ "@chakra-ui/portal" "2.1.0"
+ "@chakra-ui/react-context" "2.1.0"
+ "@chakra-ui/react-use-timeout" "2.1.0"
+ "@chakra-ui/react-use-update-effect" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
- "@chakra-ui/styled-system" "2.6.1"
- "@chakra-ui/theme" "2.2.5"
+ "@chakra-ui/styled-system" "2.9.2"
+ "@chakra-ui/theme" "3.3.1"
-"@chakra-ui/tooltip@2.2.6":
- version "2.2.6"
- resolved "https://registry.yarnpkg.com/@chakra-ui/tooltip/-/tooltip-2.2.6.tgz#a38f9ff2dd8a574c8cf49526c3846533455f8ddd"
- integrity sha512-4cbneidZ5+HCWge3OZzewRQieIvhDjSsl+scrl4Scx7E0z3OmqlTIESU5nGIZDBLYqKn/UirEZhqaQ33FOS2fw==
+"@chakra-ui/tooltip@2.3.1":
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/tooltip/-/tooltip-2.3.1.tgz#29fb8508a37bb6b20ab8dbb32bca6cd59b098796"
+ integrity sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A==
dependencies:
- "@chakra-ui/popper" "3.0.13"
- "@chakra-ui/portal" "2.0.15"
+ "@chakra-ui/dom-utils" "2.1.0"
+ "@chakra-ui/popper" "3.1.0"
+ "@chakra-ui/portal" "2.1.0"
"@chakra-ui/react-types" "2.0.7"
- "@chakra-ui/react-use-disclosure" "2.0.8"
- "@chakra-ui/react-use-event-listener" "2.0.7"
- "@chakra-ui/react-use-merge-refs" "2.0.7"
+ "@chakra-ui/react-use-disclosure" "2.1.0"
+ "@chakra-ui/react-use-event-listener" "2.1.0"
+ "@chakra-ui/react-use-merge-refs" "2.1.0"
"@chakra-ui/shared-utils" "2.0.5"
-"@chakra-ui/transition@2.0.15":
- version "2.0.15"
- resolved "https://registry.yarnpkg.com/@chakra-ui/transition/-/transition-2.0.15.tgz#c640df2ea82f5ad58c55a6e1a7c338f377cb96d8"
- integrity sha512-o9LBK/llQfUDHF/Ty3cQ6nShpekKTqHUoJlUOzNKhoTsNpoRerr9v0jwojrX1YI02KtVjfhFU6PiqXlDfREoNw==
+"@chakra-ui/transition@2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/transition/-/transition-2.1.0.tgz#c8e95564f7ab356e78119780037bae5ad150c7b3"
+ integrity sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==
dependencies:
"@chakra-ui/shared-utils" "2.0.5"
@@ -1096,43 +1106,43 @@
framesync "6.1.2"
lodash.mergewith "4.6.2"
-"@chakra-ui/visually-hidden@2.0.15":
- version "2.0.15"
- resolved "https://registry.yarnpkg.com/@chakra-ui/visually-hidden/-/visually-hidden-2.0.15.tgz#60df64e0ab97d95fee4e6c61ccabd15fd5ace398"
- integrity sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw==
+"@chakra-ui/visually-hidden@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/visually-hidden/-/visually-hidden-2.2.0.tgz#9b0ecef8f01263ab808ba3bda7b36a0d91b4d5c1"
+ integrity sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ==
-"@emotion/babel-plugin@^11.10.6":
- version "11.10.6"
- resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz#a68ee4b019d661d6f37dec4b8903255766925ead"
- integrity sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==
+"@emotion/babel-plugin@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
+ integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
dependencies:
"@babel/helper-module-imports" "^7.16.7"
"@babel/runtime" "^7.18.3"
- "@emotion/hash" "^0.9.0"
- "@emotion/memoize" "^0.8.0"
- "@emotion/serialize" "^1.1.1"
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/serialize" "^1.1.2"
babel-plugin-macros "^3.1.0"
convert-source-map "^1.5.0"
escape-string-regexp "^4.0.0"
find-root "^1.1.0"
source-map "^0.5.7"
- stylis "4.1.3"
+ stylis "4.2.0"
-"@emotion/cache@^11.10.5":
- version "11.10.5"
- resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.5.tgz#c142da9351f94e47527ed458f7bbbbe40bb13c12"
- integrity sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==
+"@emotion/cache@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff"
+ integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
dependencies:
- "@emotion/memoize" "^0.8.0"
- "@emotion/sheet" "^1.2.1"
- "@emotion/utils" "^1.2.0"
- "@emotion/weak-memoize" "^0.3.0"
- stylis "4.1.3"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/sheet" "^1.2.2"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
+ stylis "4.2.0"
-"@emotion/hash@^0.9.0":
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7"
- integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==
+"@emotion/hash@^0.9.1":
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43"
+ integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
"@emotion/is-prop-valid@^0.8.2":
version "0.8.8"
@@ -1141,93 +1151,105 @@
dependencies:
"@emotion/memoize" "0.7.4"
-"@emotion/is-prop-valid@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83"
- integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==
+"@emotion/is-prop-valid@^1.2.1":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337"
+ integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==
dependencies:
- "@emotion/memoize" "^0.8.0"
+ "@emotion/memoize" "^0.8.1"
"@emotion/memoize@0.7.4":
version "0.7.4"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
-"@emotion/memoize@^0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f"
- integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==
+"@emotion/memoize@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
+ integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
"@emotion/react@^11.10.5":
- version "11.10.6"
- resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.6.tgz#dbe5e650ab0f3b1d2e592e6ab1e006e75fd9ac11"
- integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==
+ version "11.11.4"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.4.tgz#3a829cac25c1f00e126408fab7f891f00ecc3c1d"
+ integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==
dependencies:
"@babel/runtime" "^7.18.3"
- "@emotion/babel-plugin" "^11.10.6"
- "@emotion/cache" "^11.10.5"
- "@emotion/serialize" "^1.1.1"
- "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
- "@emotion/utils" "^1.2.0"
- "@emotion/weak-memoize" "^0.3.0"
+ "@emotion/babel-plugin" "^11.11.0"
+ "@emotion/cache" "^11.11.0"
+ "@emotion/serialize" "^1.1.3"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+ "@emotion/utils" "^1.2.1"
+ "@emotion/weak-memoize" "^0.3.1"
hoist-non-react-statics "^3.3.1"
-"@emotion/serialize@^1.1.1":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0"
- integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==
+"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.3.tgz#84b77bfcfe3b7bb47d326602f640ccfcacd5ffb0"
+ integrity sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==
dependencies:
- "@emotion/hash" "^0.9.0"
- "@emotion/memoize" "^0.8.0"
- "@emotion/unitless" "^0.8.0"
- "@emotion/utils" "^1.2.0"
+ "@emotion/hash" "^0.9.1"
+ "@emotion/memoize" "^0.8.1"
+ "@emotion/unitless" "^0.8.1"
+ "@emotion/utils" "^1.2.1"
csstype "^3.0.2"
-"@emotion/sheet@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c"
- integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==
+"@emotion/sheet@^1.2.2":
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec"
+ integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
"@emotion/styled@^11.10.5":
- version "11.10.6"
- resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.6.tgz#d886afdc51ef4d66c787ebde848f3cc8b117ebba"
- integrity sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346"
+ integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==
dependencies:
"@babel/runtime" "^7.18.3"
- "@emotion/babel-plugin" "^11.10.6"
- "@emotion/is-prop-valid" "^1.2.0"
- "@emotion/serialize" "^1.1.1"
- "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0"
- "@emotion/utils" "^1.2.0"
-
-"@emotion/unitless@^0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db"
- integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==
-
-"@emotion/use-insertion-effect-with-fallbacks@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df"
- integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==
+ "@emotion/babel-plugin" "^11.11.0"
+ "@emotion/is-prop-valid" "^1.2.1"
+ "@emotion/serialize" "^1.1.2"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+ "@emotion/utils" "^1.2.1"
-"@emotion/utils@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561"
- integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==
+"@emotion/unitless@^0.8.1":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
+ integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
-"@emotion/weak-memoize@^0.3.0":
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb"
- integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==
+"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
+ integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
-"@eslint/eslintrc@^1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e"
- integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==
+"@emotion/utils@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4"
+ integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
+
+"@emotion/weak-memoize@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6"
+ integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
+
+"@eslint-community/eslint-utils@^4.2.0":
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1":
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63"
+ integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
+
+"@eslint/eslintrc@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
+ integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
- espree "^9.4.0"
+ espree "^9.6.0"
globals "^13.19.0"
ignore "^5.2.0"
import-fresh "^3.2.1"
@@ -1235,18 +1257,59 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
+"@eslint/js@8.57.0":
+ version "8.57.0"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
+ integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
+
+"@floating-ui/core@^1.0.0":
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1"
+ integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==
+ dependencies:
+ "@floating-ui/utils" "^0.2.1"
+
+"@floating-ui/dom@^1.6.1":
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.3.tgz#954e46c1dd3ad48e49db9ada7218b0985cee75ef"
+ integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==
+ dependencies:
+ "@floating-ui/core" "^1.0.0"
+ "@floating-ui/utils" "^0.2.0"
+
+"@floating-ui/react-dom@^2.0.8":
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.8.tgz#afc24f9756d1b433e1fe0d047c24bd4d9cefaa5d"
+ integrity sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==
+ dependencies:
+ "@floating-ui/dom" "^1.6.1"
+
+"@floating-ui/react@^0.26.2":
+ version "0.26.9"
+ resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.9.tgz#bbccbefa0e60c8b7f4c0387ba0fc0607bb65f2cc"
+ integrity sha512-p86wynZJVEkEq2BBjY/8p2g3biQ6TlgT4o/3KgFKyTWoJLU1GZ8wpctwRqtkEl2tseYA+kw7dBAIDFcednfI5w==
+ dependencies:
+ "@floating-ui/react-dom" "^2.0.8"
+ "@floating-ui/utils" "^0.2.1"
+ tabbable "^6.0.1"
+
+"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1":
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2"
+ integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
+
"@hookform/resolvers@^2.9.10":
version "2.9.11"
resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-2.9.11.tgz#9ce96e7746625a89239f68ca57c4f654264c17ef"
integrity sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==
-"@humanwhocodes/config-array@^0.11.8":
- version "0.11.8"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
- integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==
+"@humanwhocodes/config-array@^0.11.14":
+ version "0.11.14"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
+ integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
dependencies:
- "@humanwhocodes/object-schema" "^1.2.1"
- debug "^4.1.1"
+ "@humanwhocodes/object-schema" "^2.0.2"
+ debug "^4.3.1"
minimatch "^3.0.5"
"@humanwhocodes/module-importer@^1.0.1":
@@ -1254,10 +1317,10 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
-"@humanwhocodes/object-schema@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
- integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+"@humanwhocodes/object-schema@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917"
+ integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==
"@ipld/car@^3.2.3":
version "3.2.4"
@@ -1283,187 +1346,171 @@
dependencies:
multiformats "^9.5.4"
-"@jridgewell/gen-mapping@^0.1.0":
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
- integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
- dependencies:
- "@jridgewell/set-array" "^1.0.0"
- "@jridgewell/sourcemap-codec" "^1.4.10"
-
-"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
- integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
dependencies:
- "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/set-array" "^1.2.1"
"@jridgewell/sourcemap-codec" "^1.4.10"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@jridgewell/resolve-uri@3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
- integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+ "@jridgewell/trace-mapping" "^0.3.24"
-"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
- integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
-"@jridgewell/source-map@^0.3.2":
- version "0.3.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
- integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
- dependencies:
- "@jridgewell/gen-mapping" "^0.3.0"
- "@jridgewell/trace-mapping" "^0.3.9"
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
-"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10":
- version "1.4.14"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
- integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
-"@jridgewell/trace-mapping@^0.3.9":
- version "0.3.17"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985"
- integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
dependencies:
- "@jridgewell/resolve-uri" "3.1.0"
- "@jridgewell/sourcemap-codec" "1.4.14"
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
-"@lezer/common@^0.15.0", "@lezer/common@^0.15.7":
- version "0.15.12"
- resolved "https://registry.yarnpkg.com/@lezer/common/-/common-0.15.12.tgz#2f21aec551dd5fd7d24eb069f90f54d5bc6ee5e9"
- integrity sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==
+"@lezer/common@^1.0.0":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.2.1.tgz#198b278b7869668e1bebbe687586e12a42731049"
+ integrity sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==
-"@lezer/lr@^0.15.4":
- version "0.15.8"
- resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-0.15.8.tgz#1564a911e62b0a0f75ca63794a6aa8c5dc63db21"
- integrity sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==
+"@lezer/lr@^1.0.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.0.tgz#ed52a75dbbfbb0d1eb63710ea84c35ee647cb67e"
+ integrity sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==
dependencies:
- "@lezer/common" "^0.15.0"
+ "@lezer/common" "^1.0.0"
-"@lmdb/lmdb-darwin-arm64@2.5.2":
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.5.2.tgz#bc66fa43286b5c082e8fee0eacc17995806b6fbe"
- integrity sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==
+"@lmdb/lmdb-darwin-arm64@2.8.5":
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz#895d8cb16a9d709ce5fedd8b60022903b875e08e"
+ integrity sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==
-"@lmdb/lmdb-darwin-x64@2.5.2":
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.5.2.tgz#89d8390041bce6bab24a82a20392be22faf54ffc"
- integrity sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==
+"@lmdb/lmdb-darwin-x64@2.8.5":
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz#ca243534c8b37d5516c557e4624256d18dd63184"
+ integrity sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==
-"@lmdb/lmdb-linux-arm64@2.5.2":
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.5.2.tgz#14fe4c96c2bb1285f93797f45915fa35ee047268"
- integrity sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==
+"@lmdb/lmdb-linux-arm64@2.8.5":
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz#b44a8023057e21512eefb9f6120096843b531c1e"
+ integrity sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==
-"@lmdb/lmdb-linux-arm@2.5.2":
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.5.2.tgz#05bde4573ab10cf21827339fe687148f2590cfa1"
- integrity sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==
+"@lmdb/lmdb-linux-arm@2.8.5":
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz#17bd54740779c3e4324e78e8f747c21416a84b3d"
+ integrity sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==
-"@lmdb/lmdb-linux-x64@2.5.2":
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.5.2.tgz#d2f85afd857d2c33d2caa5b057944574edafcfee"
- integrity sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==
+"@lmdb/lmdb-linux-x64@2.8.5":
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz#6c61835b6cc58efdf79dbd5e8c72a38300a90302"
+ integrity sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==
-"@lmdb/lmdb-win32-x64@2.5.2":
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.5.2.tgz#28f643fbc0bec30b07fbe95b137879b6b4d1c9c5"
- integrity sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==
+"@lmdb/lmdb-win32-x64@2.8.5":
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz#8233e8762440b0f4632c47a09b1b6f23de8b934c"
+ integrity sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==
"@mischnic/json-sourcemap@^0.1.0":
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.0.tgz#38af657be4108140a548638267d02a2ea3336507"
- integrity sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz#0ef9b015a8f575dd9a8720d9a6b4dbc988425906"
+ integrity sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==
dependencies:
- "@lezer/common" "^0.15.7"
- "@lezer/lr" "^0.15.4"
+ "@lezer/common" "^1.0.0"
+ "@lezer/lr" "^1.0.0"
json5 "^2.2.1"
-"@motionone/animation@^10.15.1":
- version "10.15.1"
- resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.15.1.tgz#4a85596c31cbc5100ae8eb8b34c459fb0ccf6807"
- integrity sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==
+"@motionone/animation@^10.17.0":
+ version "10.17.0"
+ resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.17.0.tgz#7633c6f684b5fee2b61c405881b8c24662c68fca"
+ integrity sha512-ANfIN9+iq1kGgsZxs+Nz96uiNcPLGTXwfNo2Xz/fcJXniPYpaz/Uyrfa+7I5BPLxCP82sh7quVDudf1GABqHbg==
dependencies:
- "@motionone/easing" "^10.15.1"
- "@motionone/types" "^10.15.1"
- "@motionone/utils" "^10.15.1"
+ "@motionone/easing" "^10.17.0"
+ "@motionone/types" "^10.17.0"
+ "@motionone/utils" "^10.17.0"
tslib "^2.3.1"
"@motionone/dom@^10.15.3":
- version "10.15.5"
- resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.15.5.tgz#4af18f8136d85c2fc997cac98121c969f6731802"
- integrity sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA==
- dependencies:
- "@motionone/animation" "^10.15.1"
- "@motionone/generators" "^10.15.1"
- "@motionone/types" "^10.15.1"
- "@motionone/utils" "^10.15.1"
+ version "10.17.0"
+ resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.17.0.tgz#519dd78aab0750a94614c69a82da5290cd617383"
+ integrity sha512-cMm33swRlCX/qOPHWGbIlCl0K9Uwi6X5RiL8Ma6OrlJ/TP7Q+Np5GE4xcZkFptysFjMTi4zcZzpnNQGQ5D6M0Q==
+ dependencies:
+ "@motionone/animation" "^10.17.0"
+ "@motionone/generators" "^10.17.0"
+ "@motionone/types" "^10.17.0"
+ "@motionone/utils" "^10.17.0"
hey-listen "^1.0.8"
tslib "^2.3.1"
-"@motionone/easing@^10.15.1":
- version "10.15.1"
- resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.15.1.tgz#95cf3adaef34da6deebb83940d8143ede3deb693"
- integrity sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==
+"@motionone/easing@^10.17.0":
+ version "10.17.0"
+ resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.17.0.tgz#d66cecf7e3ee30104ad00389fb3f0b2282d81aa9"
+ integrity sha512-Bxe2wSuLu/qxqW4rBFS5m9tMLOw+QBh8v5A7Z5k4Ul4sTj5jAOfZG5R0bn5ywmk+Fs92Ij1feZ5pmC4TeXA8Tg==
dependencies:
- "@motionone/utils" "^10.15.1"
+ "@motionone/utils" "^10.17.0"
tslib "^2.3.1"
-"@motionone/generators@^10.15.1":
- version "10.15.1"
- resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.15.1.tgz#dc6abb11139d1bafe758a41c134d4c753a9b871c"
- integrity sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==
+"@motionone/generators@^10.17.0":
+ version "10.17.0"
+ resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.17.0.tgz#878d292539c41434c13310d5f863a87a94e6e689"
+ integrity sha512-T6Uo5bDHrZWhIfxG/2Aut7qyWQyJIWehk6OB4qNvr/jwA/SRmixwbd7SOrxZi1z5rH3LIeFFBKK1xHnSbGPZSQ==
dependencies:
- "@motionone/types" "^10.15.1"
- "@motionone/utils" "^10.15.1"
+ "@motionone/types" "^10.17.0"
+ "@motionone/utils" "^10.17.0"
tslib "^2.3.1"
-"@motionone/types@^10.15.1":
- version "10.15.1"
- resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.15.1.tgz#89441b54285012795cbba8612cbaa0fa420db3eb"
- integrity sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==
+"@motionone/types@^10.17.0":
+ version "10.17.0"
+ resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.17.0.tgz#179571ce98851bac78e19a1c3974767227f08ba3"
+ integrity sha512-EgeeqOZVdRUTEHq95Z3t8Rsirc7chN5xFAPMYFobx8TPubkEfRSm5xihmMUkbaR2ErKJTUw3347QDPTHIW12IA==
-"@motionone/utils@^10.15.1":
- version "10.15.1"
- resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.15.1.tgz#6b5f51bde75be88b5411e084310299050368a438"
- integrity sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==
+"@motionone/utils@^10.17.0":
+ version "10.17.0"
+ resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.17.0.tgz#cc0ba8acdc6848ff48d8c1f2d0d3e7602f4f942e"
+ integrity sha512-bGwrki4896apMWIj9yp5rAS2m0xyhxblg6gTB/leWDPt+pb410W8lYWsxyurX+DH+gO1zsQsfx2su/c1/LtTpg==
dependencies:
- "@motionone/types" "^10.15.1"
+ "@motionone/types" "^10.17.0"
hey-listen "^1.0.8"
tslib "^2.3.1"
-"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.0.tgz#d31a238c943ffc34bab73ad6ce7a6466d65888ef"
- integrity sha512-5qpnNHUyyEj9H3sm/4Um/bnx1lrQGhe8iqry/1d+cQYCRd/gzYA0YLeq0ezlk4hKx4vO+dsEsNyeowqRqslwQA==
+"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz#44d752c1a2dc113f15f781b7cc4f53a307e3fa38"
+ integrity sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==
-"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.0.tgz#2f6fbbec3d3f0bbe9c6678c899f1c1a6e25ed980"
- integrity sha512-ZphTFFd6SFweNAMKD+QJCrWpgkjf4qBuHltiMkKkD6FFrB3NOTRVmetAGTkJ57pa+s6J0yCH06LujWB9rZe94g==
+"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz#f954f34355712212a8e06c465bc06c40852c6bb3"
+ integrity sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==
-"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.0.tgz#19875441da50b9aa8f8e726eb097a4cead435a3f"
- integrity sha512-NEX6hdSvP4BmVyegaIbrGxvHzHvTzzsPaxXCsUt0mbLbPpEftsvNwaEVKOowXnLoeuGeD4MaqSwL3BUK2elsUA==
+"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz#45c63037f045c2b15c44f80f0393fa24f9655367"
+ integrity sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==
-"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.0.tgz#3b855ac72cc16e89db2f72adf47ddc964c20a53d"
- integrity sha512-ztKVV1dO/sSZyGse0PBCq3Pk1PkYjsA/dsEWE7lfrGoAK3i9HpS2o7XjGQ7V4va6nX+xPPOiuYpQwa4Bi6vlww==
+"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz#35707efeafe6d22b3f373caf9e8775e8920d1399"
+ integrity sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==
-"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.0.tgz#455f1d5bb00e87f78c67711f26e7bff9f1457684"
- integrity sha512-9uvdAkZMOPCY7SPRxZLW8XGqBOVNVEhqlgffenN8shA1XR9FWVsSM13nr/oHtNgXg6iVyML7RwWPyqUeThlwxg==
+"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz#091b1218b66c341f532611477ef89e83f25fae4f"
+ integrity sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==
-"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.0.tgz#03c6bfcd3acb179ea69546c20d50895b9d623ada"
- integrity sha512-Wg0+9615kHKlr9iLVcG5I+/CHnf6w3x5UADRv8Ad16yA0Bu5l9eVOROjV7aHPG6uC8ZPFIVVaoSjDChD+Y0pzg==
+"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz#0f164b726869f71da3c594171df5ebc1c4b0a407"
+ integrity sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==
"@multiformats/murmur3@^1.0.3":
version "1.1.3"
@@ -1473,21 +1520,7 @@
multiformats "^9.5.4"
murmurhash3js-revisited "^3.0.0"
-"@near-wallet-selector/core@7.8.0", "@near-wallet-selector/core@^7.6.1":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@near-wallet-selector/core/-/core-7.8.0.tgz#690a9f20deb20dbcfb40074933a4fbcd280662e6"
- integrity sha512-hFYbWE4aUwhaCqYHXQ7eyhu2dZQl5EIi1TFwkaEcaaQirHBhLda8vpHARAzrZ9H5po2yUhqxv1lw/5O6uAcF4Q==
- dependencies:
- rxjs "^7.8.0"
-
-"@near-wallet-selector/core@7.8.2":
- version "7.8.2"
- resolved "https://registry.yarnpkg.com/@near-wallet-selector/core/-/core-7.8.2.tgz#4671660a5bdf3517133e4ea48729655ae643d4d8"
- integrity sha512-jR4KDwrT3y0TiHoaVqGM5crd8M8UvSn+hp9xu8x6tKVeIe+s1hB7rFPAh3uJho/1BuyBIOVOzkcMBgrWMoFnVw==
- dependencies:
- rxjs "^7.8.0"
-
-"@near-wallet-selector/core@^7.9.1":
+"@near-wallet-selector/core@7.9.3", "@near-wallet-selector/core@^7.6.1", "@near-wallet-selector/core@^7.9.1":
version "7.9.3"
resolved "https://registry.yarnpkg.com/@near-wallet-selector/core/-/core-7.9.3.tgz#5a51b72064c9e018c0f0eb97db06b70cd58b8358"
integrity sha512-SNIgLnI/LeU1mwBHc5wcyOrVAqhWmFXJfVIfB1P16ziH3EKMsbs/gxcKUSPuvDagm9dZm11k+FA7bxSspavibA==
@@ -1495,54 +1528,38 @@
rxjs "^7.8.0"
"@near-wallet-selector/modal-ui@^7.6.1":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@near-wallet-selector/modal-ui/-/modal-ui-7.8.0.tgz#43a71194f8a4ab4b7efc50768ad9c7e28d457e0b"
- integrity sha512-BtSVVggFK2OLhxgssHYjm46qfhjppR/qZg1ec47NL54OpNwzFSqSnGCpgzqtGjir4jHX3i+VDWLmP6dU1EKBnw==
+ version "7.9.3"
+ resolved "https://registry.yarnpkg.com/@near-wallet-selector/modal-ui/-/modal-ui-7.9.3.tgz#8fe6eddccaf76ee38ddb815b627430c061d0cf92"
+ integrity sha512-gwbSIW3/30WsYe9wY0F6DQ92yrv8sMYO9WF2cqy/p7UwG6ZMWQ9FIhlkc2XUC1datBEbKfB/fO4nNpeHoSGTbw==
dependencies:
- "@near-wallet-selector/core" "7.8.0"
+ "@near-wallet-selector/core" "7.9.3"
copy-to-clipboard "^3.3.3"
qrcode "^1.5.1"
react "18.2.0"
react-dom "18.2.0"
-"@near-wallet-selector/my-near-wallet@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@near-wallet-selector/my-near-wallet/-/my-near-wallet-7.8.0.tgz#57ff616af71654ce342e11f2dfed3acc0c694af8"
- integrity sha512-+mRCOuPtiJRrPCTnSDjzbzIU8e7QHAQKPG3b/Kx/z1DFrOogvOXN37UPsS3CxHz0d8UVPQZBuTgFH/iQ7RcQrg==
- dependencies:
- "@near-wallet-selector/core" "7.8.0"
- "@near-wallet-selector/wallet-utils" "7.8.0"
-
-"@near-wallet-selector/my-near-wallet@^7.8.2":
- version "7.8.2"
- resolved "https://registry.yarnpkg.com/@near-wallet-selector/my-near-wallet/-/my-near-wallet-7.8.2.tgz#ea1c0c1216f028502d17413e40c6c5e9f998c09d"
- integrity sha512-TOHNdR3Y0cT7aD8JKTp5tMyqA85niyOEFxy+pLKe3z/FGcdQX7Ui0DWdE9Qa14TwzbLHJtXmT0+/jg5p70oRag==
+"@near-wallet-selector/my-near-wallet@7.9.3", "@near-wallet-selector/my-near-wallet@^7.8.2":
+ version "7.9.3"
+ resolved "https://registry.yarnpkg.com/@near-wallet-selector/my-near-wallet/-/my-near-wallet-7.9.3.tgz#8a43c01d553d9908ca93698853bee2427774cb55"
+ integrity sha512-McwIYW4njj1ctZUAKG2/zv6uC5OsKrjxuBPie/yx0+WVWuJiQO2Wemjs4uYMas5Ld8OqYDX5p/6cYyr7d0hfSQ==
dependencies:
- "@near-wallet-selector/core" "7.8.2"
- "@near-wallet-selector/wallet-utils" "7.8.2"
+ "@near-wallet-selector/core" "7.9.3"
+ "@near-wallet-selector/wallet-utils" "7.9.3"
"@near-wallet-selector/near-wallet@^7.6.1":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@near-wallet-selector/near-wallet/-/near-wallet-7.8.0.tgz#60bbf44962bc5356adfba40c3e18623057acd89d"
- integrity sha512-9DpWYL7nDwAvQumr7TM+5ZcfkovO4notu9JR/juZc6nn3kiwjMWaqUMeePsvZ0Xo/Eh5FmK+w2Kw7zMZRh0ruA==
- dependencies:
- "@near-wallet-selector/core" "7.8.0"
- "@near-wallet-selector/my-near-wallet" "7.8.0"
-
-"@near-wallet-selector/wallet-utils@7.8.0":
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/@near-wallet-selector/wallet-utils/-/wallet-utils-7.8.0.tgz#33a868fc47a6299bafc4890a0fbe65a8f57f981a"
- integrity sha512-L14ykKZSGE7G5vu8GHxCQ6x0rDGd6AJDiHe8vLPbFz71DVQIo4VV2PRTz5DzKL29CfCU4Q2tWXlILPXtqvDKgw==
+ version "7.9.3"
+ resolved "https://registry.yarnpkg.com/@near-wallet-selector/near-wallet/-/near-wallet-7.9.3.tgz#677b87a029af3f5a9b8855a17ffe86ddd9dbbdb0"
+ integrity sha512-oAtqC0ERhJZ7pVlUJZDmWU4AcTeNW+C4eab3eQCNWToH6gx1/OsKa7nSvcAzomaARBqE1ttE9KhAQUzvRXd07A==
dependencies:
- "@near-wallet-selector/core" "7.8.0"
- bn.js "^5.2.0"
+ "@near-wallet-selector/core" "7.9.3"
+ "@near-wallet-selector/my-near-wallet" "7.9.3"
-"@near-wallet-selector/wallet-utils@7.8.2":
- version "7.8.2"
- resolved "https://registry.yarnpkg.com/@near-wallet-selector/wallet-utils/-/wallet-utils-7.8.2.tgz#38ceee02f5016633cd6713f886b1b796075101fe"
- integrity sha512-PVbfM0+2eHhVpnj53SWlbqL8vEGM6K4uakxeVGu/tdQ8MZrd4Rmrw/q/YUX5DDRqdxdC2hZHicnWVY1ffYDTag==
+"@near-wallet-selector/wallet-utils@7.9.3":
+ version "7.9.3"
+ resolved "https://registry.yarnpkg.com/@near-wallet-selector/wallet-utils/-/wallet-utils-7.9.3.tgz#35a098f29080041fc83daa6b48a7e005fa441fa1"
+ integrity sha512-uH99A7K0eibZeWVHb+fFgP/rpaDskEfHQXZiAOuIzaDmWnm8KSG4VxA+l5GAR/X+OTpaYwNSd+AB/v3PdeH0Ug==
dependencies:
- "@near-wallet-selector/core" "7.8.2"
+ "@near-wallet-selector/core" "7.9.3"
bn.js "^5.2.0"
"@nodelib/fs.scandir@2.1.5":
@@ -1566,97 +1583,99 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@parcel/bundler-default@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.8.3.tgz#d64739dbc2dbd59d6629861bf77a8083aced5229"
- integrity sha512-yJvRsNWWu5fVydsWk3O2L4yIy3UZiKWO2cPDukGOIWMgp/Vbpp+2Ct5IygVRtE22bnseW/E/oe0PV3d2IkEJGg==
+"@parcel/bundler-default@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/bundler-default/-/bundler-default-2.12.0.tgz#b8f6f3fc3f497714bd54e19882aaa116e97df4a4"
+ integrity sha512-3ybN74oYNMKyjD6V20c9Gerdbh7teeNvVMwIoHIQMzuIFT6IGX53PyOLlOKRLbjxMc0TMimQQxIt2eQqxR5LsA==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/graph" "2.8.3"
- "@parcel/hash" "2.8.3"
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/graph" "3.2.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/rust" "2.12.0"
+ "@parcel/utils" "2.12.0"
nullthrows "^1.1.1"
-"@parcel/cache@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.8.3.tgz#169e130cf59913c0ed9fadce1a450e68f710e16f"
- integrity sha512-k7xv5vSQrJLdXuglo+Hv3yF4BCSs1tQ/8Vbd6CHTkOhf7LcGg6CPtLw053R/KdMpd/4GPn0QrAsOLdATm1ELtQ==
+"@parcel/cache@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/cache/-/cache-2.12.0.tgz#b8fd2ea2bc7a2353a9b20344cc191bfb4f8284f3"
+ integrity sha512-FX5ZpTEkxvq/yvWklRHDESVRz+c7sLTXgFuzz6uEnBcXV38j6dMSikflNpHA6q/L4GKkCqRywm9R6XQwhwIMyw==
dependencies:
- "@parcel/fs" "2.8.3"
- "@parcel/logger" "2.8.3"
- "@parcel/utils" "2.8.3"
- lmdb "2.5.2"
+ "@parcel/fs" "2.12.0"
+ "@parcel/logger" "2.12.0"
+ "@parcel/utils" "2.12.0"
+ lmdb "2.8.5"
-"@parcel/codeframe@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.8.3.tgz#84fb529ef70def7f5bc64f6c59b18d24826f5fcc"
- integrity sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==
+"@parcel/codeframe@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/codeframe/-/codeframe-2.12.0.tgz#9ea75bd7ae6c5f7fadf42a5e64657cf88fdcb29e"
+ integrity sha512-v2VmneILFiHZJTxPiR7GEF1wey1/IXPdZMcUlNXBiPZyWDfcuNgGGVQkx/xW561rULLIvDPharOMdxz5oHOKQg==
dependencies:
chalk "^4.1.0"
-"@parcel/compressor-raw@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/compressor-raw/-/compressor-raw-2.8.3.tgz#301753df8c6de967553149639e8a4179b88f0c95"
- integrity sha512-bVDsqleBUxRdKMakWSlWC9ZjOcqDKE60BE+Gh3JSN6WJrycJ02P5wxjTVF4CStNP/G7X17U+nkENxSlMG77ySg==
- dependencies:
- "@parcel/plugin" "2.8.3"
-
-"@parcel/config-default@2.8.3", "@parcel/config-default@^2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/config-default/-/config-default-2.8.3.tgz#9a43486e7c702e96c68052c37b79098d7240e35b"
- integrity sha512-o/A/mbrO6X/BfGS65Sib8d6SSG45NYrNooNBkH/o7zbOBSRQxwyTlysleK1/3Wa35YpvFyLOwgfakqCtbGy4fw==
- dependencies:
- "@parcel/bundler-default" "2.8.3"
- "@parcel/compressor-raw" "2.8.3"
- "@parcel/namer-default" "2.8.3"
- "@parcel/optimizer-css" "2.8.3"
- "@parcel/optimizer-htmlnano" "2.8.3"
- "@parcel/optimizer-image" "2.8.3"
- "@parcel/optimizer-svgo" "2.8.3"
- "@parcel/optimizer-terser" "2.8.3"
- "@parcel/packager-css" "2.8.3"
- "@parcel/packager-html" "2.8.3"
- "@parcel/packager-js" "2.8.3"
- "@parcel/packager-raw" "2.8.3"
- "@parcel/packager-svg" "2.8.3"
- "@parcel/reporter-dev-server" "2.8.3"
- "@parcel/resolver-default" "2.8.3"
- "@parcel/runtime-browser-hmr" "2.8.3"
- "@parcel/runtime-js" "2.8.3"
- "@parcel/runtime-react-refresh" "2.8.3"
- "@parcel/runtime-service-worker" "2.8.3"
- "@parcel/transformer-babel" "2.8.3"
- "@parcel/transformer-css" "2.8.3"
- "@parcel/transformer-html" "2.8.3"
- "@parcel/transformer-image" "2.8.3"
- "@parcel/transformer-js" "2.8.3"
- "@parcel/transformer-json" "2.8.3"
- "@parcel/transformer-postcss" "2.8.3"
- "@parcel/transformer-posthtml" "2.8.3"
- "@parcel/transformer-raw" "2.8.3"
- "@parcel/transformer-react-refresh-wrap" "2.8.3"
- "@parcel/transformer-svg" "2.8.3"
-
-"@parcel/core@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/core/-/core-2.8.3.tgz#22a69f36095d53736ab10bf42697d9aa5f4e382b"
- integrity sha512-Euf/un4ZAiClnlUXqPB9phQlKbveU+2CotZv7m7i+qkgvFn5nAGnrV4h1OzQU42j9dpgOxWi7AttUDMrvkbhCQ==
+"@parcel/compressor-raw@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/compressor-raw/-/compressor-raw-2.12.0.tgz#71012b695c870f1d26bfd8d56983c14bf13fd996"
+ integrity sha512-h41Q3X7ZAQ9wbQ2csP8QGrwepasLZdXiuEdpUryDce6rF9ZiHoJ97MRpdLxOhOPyASTw/xDgE1xyaPQr0Q3f5A==
+ dependencies:
+ "@parcel/plugin" "2.12.0"
+
+"@parcel/config-default@2.12.0", "@parcel/config-default@^2.8.3":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/config-default/-/config-default-2.12.0.tgz#7b213348db349c6042a80dfd4a7eab707a1dfbfa"
+ integrity sha512-dPNe2n9eEsKRc1soWIY0yToMUPirPIa2QhxcCB3Z5RjpDGIXm0pds+BaiqY6uGLEEzsjhRO0ujd4v2Rmm0vuFg==
+ dependencies:
+ "@parcel/bundler-default" "2.12.0"
+ "@parcel/compressor-raw" "2.12.0"
+ "@parcel/namer-default" "2.12.0"
+ "@parcel/optimizer-css" "2.12.0"
+ "@parcel/optimizer-htmlnano" "2.12.0"
+ "@parcel/optimizer-image" "2.12.0"
+ "@parcel/optimizer-svgo" "2.12.0"
+ "@parcel/optimizer-swc" "2.12.0"
+ "@parcel/packager-css" "2.12.0"
+ "@parcel/packager-html" "2.12.0"
+ "@parcel/packager-js" "2.12.0"
+ "@parcel/packager-raw" "2.12.0"
+ "@parcel/packager-svg" "2.12.0"
+ "@parcel/packager-wasm" "2.12.0"
+ "@parcel/reporter-dev-server" "2.12.0"
+ "@parcel/resolver-default" "2.12.0"
+ "@parcel/runtime-browser-hmr" "2.12.0"
+ "@parcel/runtime-js" "2.12.0"
+ "@parcel/runtime-react-refresh" "2.12.0"
+ "@parcel/runtime-service-worker" "2.12.0"
+ "@parcel/transformer-babel" "2.12.0"
+ "@parcel/transformer-css" "2.12.0"
+ "@parcel/transformer-html" "2.12.0"
+ "@parcel/transformer-image" "2.12.0"
+ "@parcel/transformer-js" "2.12.0"
+ "@parcel/transformer-json" "2.12.0"
+ "@parcel/transformer-postcss" "2.12.0"
+ "@parcel/transformer-posthtml" "2.12.0"
+ "@parcel/transformer-raw" "2.12.0"
+ "@parcel/transformer-react-refresh-wrap" "2.12.0"
+ "@parcel/transformer-svg" "2.12.0"
+
+"@parcel/core@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/core/-/core-2.12.0.tgz#ea5734f008300bc57aaff2ba0f7949724c93b56d"
+ integrity sha512-s+6pwEj+GfKf7vqGUzN9iSEPueUssCCQrCBUlcAfKrJe0a22hTUCjewpB0I7lNrCIULt8dkndD+sMdOrXsRl6Q==
dependencies:
"@mischnic/json-sourcemap" "^0.1.0"
- "@parcel/cache" "2.8.3"
- "@parcel/diagnostic" "2.8.3"
- "@parcel/events" "2.8.3"
- "@parcel/fs" "2.8.3"
- "@parcel/graph" "2.8.3"
- "@parcel/hash" "2.8.3"
- "@parcel/logger" "2.8.3"
- "@parcel/package-manager" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/cache" "2.12.0"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/events" "2.12.0"
+ "@parcel/fs" "2.12.0"
+ "@parcel/graph" "3.2.0"
+ "@parcel/logger" "2.12.0"
+ "@parcel/package-manager" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/profiler" "2.12.0"
+ "@parcel/rust" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/types" "2.8.3"
- "@parcel/utils" "2.8.3"
- "@parcel/workers" "2.8.3"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
+ "@parcel/workers" "2.12.0"
abortcontroller-polyfill "^1.1.9"
base-x "^3.0.8"
browserslist "^4.6.6"
@@ -1664,290 +1683,315 @@
dotenv "^7.0.0"
dotenv-expand "^5.1.0"
json5 "^2.2.0"
- msgpackr "^1.5.4"
+ msgpackr "^1.9.9"
nullthrows "^1.1.1"
- semver "^5.7.1"
+ semver "^7.5.2"
-"@parcel/diagnostic@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.8.3.tgz#d560276d5d2804b48beafa1feaf3fc6b2ac5e39d"
- integrity sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==
+"@parcel/diagnostic@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/diagnostic/-/diagnostic-2.12.0.tgz#b38057d819ea2edc32018a1d51df434f07840be9"
+ integrity sha512-8f1NOsSFK+F4AwFCKynyIu9Kr/uWHC+SywAv4oS6Bv3Acig0gtwUjugk0C9UaB8ztBZiW5TQZhw+uPZn9T/lJA==
dependencies:
"@mischnic/json-sourcemap" "^0.1.0"
nullthrows "^1.1.1"
-"@parcel/events@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.8.3.tgz#205f8d874e6ecc2cbdb941bf8d54bae669e571af"
- integrity sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==
+"@parcel/events@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/events/-/events-2.12.0.tgz#ef67e3fbb96806b3531a37bcf95e8fbb3818ffa2"
+ integrity sha512-nmAAEIKLjW1kB2cUbCYSmZOGbnGj8wCzhqnK727zCCWaA25ogzAtt657GPOeFyqW77KyosU728Tl63Fc8hphIA==
-"@parcel/fs-search@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/fs-search/-/fs-search-2.8.3.tgz#1c7d812c110b808758f44c56e61dfffdb09e9451"
- integrity sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==
+"@parcel/fs@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.12.0.tgz#8c9029353888311ba2e9e2198dbe6c7c1da635c0"
+ integrity sha512-NnFkuvou1YBtPOhTdZr44WN7I60cGyly2wpHzqRl62yhObyi1KvW0SjwOMa0QGNcBOIzp4G0CapoZ93hD0RG5Q==
dependencies:
- detect-libc "^1.0.3"
-
-"@parcel/fs@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-2.8.3.tgz#80536afe877fc8a2bd26be5576b9ba27bb4c5754"
- integrity sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==
- dependencies:
- "@parcel/fs-search" "2.8.3"
- "@parcel/types" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/rust" "2.12.0"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
"@parcel/watcher" "^2.0.7"
- "@parcel/workers" "2.8.3"
+ "@parcel/workers" "2.12.0"
-"@parcel/graph@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/graph/-/graph-2.8.3.tgz#00ffe8ec032e74fee57199e54529f1da7322571d"
- integrity sha512-26GL8fYZPdsRhSXCZ0ZWliloK6DHlMJPWh6Z+3VVZ5mnDSbYg/rRKWmrkhnr99ZWmL9rJsv4G74ZwvDEXTMPBg==
+"@parcel/graph@3.2.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@parcel/graph/-/graph-3.2.0.tgz#309e6e3f19ef4ea7f71b2341ec1bcc08e7c43523"
+ integrity sha512-xlrmCPqy58D4Fg5umV7bpwDx5Vyt7MlnQPxW68vae5+BA4GSWetfZt+Cs5dtotMG2oCHzZxhIPt7YZ7NRyQzLA==
dependencies:
nullthrows "^1.1.1"
-"@parcel/hash@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/hash/-/hash-2.8.3.tgz#bc2499a27395169616cad2a99e19e69b9098f6e9"
- integrity sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==
+"@parcel/logger@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.12.0.tgz#0b866b7aee8a0a462596a80cd46bd8b29c318758"
+ integrity sha512-cJ7Paqa7/9VJ7C+KwgJlwMqTQBOjjn71FbKk0G07hydUEBISU2aDfmc/52o60ErL9l+vXB26zTrIBanbxS8rVg==
dependencies:
- detect-libc "^1.0.3"
- xxhash-wasm "^0.4.2"
-
-"@parcel/logger@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-2.8.3.tgz#e14e4debafb3ca9e87c07c06780f9afc38b2712c"
- integrity sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==
- dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/events" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/events" "2.12.0"
-"@parcel/markdown-ansi@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.8.3.tgz#1337d421bb1133ad178f386a8e1b746631bba4a1"
- integrity sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==
+"@parcel/markdown-ansi@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/markdown-ansi/-/markdown-ansi-2.12.0.tgz#a4301321fa784a28ba817e65e41432fe8b3b3192"
+ integrity sha512-WZz3rzL8k0H3WR4qTHX6Ic8DlEs17keO9gtD4MNGyMNQbqQEvQ61lWJaIH0nAtgEetu0SOITiVqdZrb8zx/M7w==
dependencies:
chalk "^4.1.0"
-"@parcel/namer-default@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/namer-default/-/namer-default-2.8.3.tgz#5304bee74beb4b9c1880781bdbe35be0656372f4"
- integrity sha512-tJ7JehZviS5QwnxbARd8Uh63rkikZdZs1QOyivUhEvhN+DddSAVEdQLHGPzkl3YRk0tjFhbqo+Jci7TpezuAMw==
+"@parcel/namer-default@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/namer-default/-/namer-default-2.12.0.tgz#f9903da8e4c5c3e33fc8ab70b222be520a46da5d"
+ integrity sha512-9DNKPDHWgMnMtqqZIMiEj/R9PNWW16lpnlHjwK3ciRlMPgjPJ8+UNc255teZODhX0T17GOzPdGbU/O/xbxVPzA==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
nullthrows "^1.1.1"
-"@parcel/node-resolver-core@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/node-resolver-core/-/node-resolver-core-2.8.3.tgz#581df074a27646400b3fed9da95297b616a7db8f"
- integrity sha512-12YryWcA5Iw2WNoEVr/t2HDjYR1iEzbjEcxfh1vaVDdZ020PiGw67g5hyIE/tsnG7SRJ0xdRx1fQ2hDgED+0Ww==
+"@parcel/node-resolver-core@3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@parcel/node-resolver-core/-/node-resolver-core-3.3.0.tgz#f40d80de800baa7cf230406b7122c8711ac4cdc8"
+ integrity sha512-rhPW9DYPEIqQBSlYzz3S0AjXxjN6Ub2yS6tzzsW/4S3Gpsgk/uEq4ZfxPvoPf/6TgZndVxmKwpmxaKtGMmf3cA==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@mischnic/json-sourcemap" "^0.1.0"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/fs" "2.12.0"
+ "@parcel/rust" "2.12.0"
+ "@parcel/utils" "2.12.0"
nullthrows "^1.1.1"
- semver "^5.7.1"
+ semver "^7.5.2"
-"@parcel/optimizer-css@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/optimizer-css/-/optimizer-css-2.8.3.tgz#420a333f4b78f7ff15e69217dfed34421b1143ee"
- integrity sha512-JotGAWo8JhuXsQDK0UkzeQB0UR5hDAKvAviXrjqB4KM9wZNLhLleeEAW4Hk8R9smCeQFP6Xg/N/NkLDpqMwT3g==
+"@parcel/optimizer-css@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/optimizer-css/-/optimizer-css-2.12.0.tgz#f44f38dc7136b511a849343eea04714a42e1ba5f"
+ integrity sha512-ifbcC97fRzpruTjaa8axIFeX4MjjSIlQfem3EJug3L2AVqQUXnM1XO8L0NaXGNLTW2qnh1ZjIJ7vXT/QhsphsA==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/utils" "2.8.3"
+ "@parcel/utils" "2.12.0"
browserslist "^4.6.6"
- lightningcss "^1.16.1"
+ lightningcss "^1.22.1"
nullthrows "^1.1.1"
-"@parcel/optimizer-htmlnano@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.8.3.tgz#a71ab6f0f24160ef9f573266064438eff65e96d0"
- integrity sha512-L8/fHbEy8Id2a2E0fwR5eKGlv9VYDjrH9PwdJE9Za9v1O/vEsfl/0T/79/x129l5O0yB6EFQkFa20MiK3b+vOg==
+"@parcel/optimizer-htmlnano@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/optimizer-htmlnano/-/optimizer-htmlnano-2.12.0.tgz#e389d56d3f5cd2f6dd464a756a0704a65e527a9b"
+ integrity sha512-MfPMeCrT8FYiOrpFHVR+NcZQlXAptK2r4nGJjfT+ndPBhEEZp4yyL7n1y7HfX9geg5altc4WTb4Gug7rCoW8VQ==
dependencies:
- "@parcel/plugin" "2.8.3"
+ "@parcel/plugin" "2.12.0"
htmlnano "^2.0.0"
nullthrows "^1.1.1"
posthtml "^0.16.5"
svgo "^2.4.0"
-"@parcel/optimizer-image@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/optimizer-image/-/optimizer-image-2.8.3.tgz#ea49b4245b4f7d60b38c7585c6311fb21d341baa"
- integrity sha512-SD71sSH27SkCDNUNx9A3jizqB/WIJr3dsfp+JZGZC42tpD/Siim6Rqy9M4To/BpMMQIIiEXa5ofwS+DgTEiEHQ==
- dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
- "@parcel/workers" "2.8.3"
- detect-libc "^1.0.3"
-
-"@parcel/optimizer-svgo@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.8.3.tgz#04da4efec6b623679539a84961bff6998034ba8a"
- integrity sha512-9KQed99NZnQw3/W4qBYVQ7212rzA9EqrQG019TIWJzkA9tjGBMIm2c/nXpK1tc3hQ3e7KkXkFCQ3C+ibVUnHNA==
- dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+"@parcel/optimizer-image@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/optimizer-image/-/optimizer-image-2.12.0.tgz#46dd3c2a871700076c17376d27f6d46d030a0717"
+ integrity sha512-bo1O7raeAIbRU5nmNVtx8divLW9Xqn0c57GVNGeAK4mygnQoqHqRZ0mR9uboh64pxv6ijXZHPhKvU9HEpjPjBQ==
+ dependencies:
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/rust" "2.12.0"
+ "@parcel/utils" "2.12.0"
+ "@parcel/workers" "2.12.0"
+
+"@parcel/optimizer-svgo@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/optimizer-svgo/-/optimizer-svgo-2.12.0.tgz#f1e411cbc3a3c56e05aa5fb2e1edd1ecc7016378"
+ integrity sha512-Kyli+ZZXnoonnbeRQdoWwee9Bk2jm/49xvnfb+2OO8NN0d41lblBoRhOyFiScRnJrw7eVl1Xrz7NTkXCIO7XFQ==
+ dependencies:
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
svgo "^2.4.0"
-"@parcel/optimizer-terser@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/optimizer-terser/-/optimizer-terser-2.8.3.tgz#3a06d98d09386a1a0ae1be85376a8739bfba9618"
- integrity sha512-9EeQlN6zIeUWwzrzu6Q2pQSaYsYGah8MtiQ/hog9KEPlYTP60hBv/+utDyYEHSQhL7y5ym08tPX5GzBvwAD/dA==
+"@parcel/optimizer-swc@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/optimizer-swc/-/optimizer-swc-2.12.0.tgz#bacbdb4f6f4a7e0b7086f30b683e3f3f2f980c96"
+ integrity sha512-iBi6LZB3lm6WmbXfzi8J3DCVPmn4FN2lw7DGXxUXu7MouDPVWfTsM6U/5TkSHJRNRogZ2gqy5q9g34NPxHbJcw==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/utils" "2.8.3"
+ "@parcel/utils" "2.12.0"
+ "@swc/core" "^1.3.36"
nullthrows "^1.1.1"
- terser "^5.2.0"
-
-"@parcel/package-manager@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.8.3.tgz#ddd0d62feae3cf0fb6cc0537791b3a16296ad458"
- integrity sha512-tIpY5pD2lH53p9hpi++GsODy6V3khSTX4pLEGuMpeSYbHthnOViobqIlFLsjni+QA1pfc8NNNIQwSNdGjYflVA==
- dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/fs" "2.8.3"
- "@parcel/logger" "2.8.3"
- "@parcel/types" "2.8.3"
- "@parcel/utils" "2.8.3"
- "@parcel/workers" "2.8.3"
- semver "^5.7.1"
-
-"@parcel/packager-css@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/packager-css/-/packager-css-2.8.3.tgz#0eff34268cb4f5dfb53c1bbca85f5567aeb1835a"
- integrity sha512-WyvkMmsurlHG8d8oUVm7S+D+cC/T3qGeqogb7sTI52gB6uiywU7lRCizLNqGFyFGIxcVTVHWnSHqItBcLN76lA==
- dependencies:
- "@parcel/plugin" "2.8.3"
+
+"@parcel/package-manager@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/package-manager/-/package-manager-2.12.0.tgz#7e1eb5f652544e045f7240fa6cf92e5ff1627624"
+ integrity sha512-0nvAezcjPx9FT+hIL+LS1jb0aohwLZXct7jAh7i0MLMtehOi0z1Sau+QpgMlA9rfEZZ1LIeFdnZZwqSy7Ccspw==
+ dependencies:
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/fs" "2.12.0"
+ "@parcel/logger" "2.12.0"
+ "@parcel/node-resolver-core" "3.3.0"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
+ "@parcel/workers" "2.12.0"
+ "@swc/core" "^1.3.36"
+ semver "^7.5.2"
+
+"@parcel/packager-css@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/packager-css/-/packager-css-2.12.0.tgz#bee2908608f306186695c6505c3303548751a7b8"
+ integrity sha512-j3a/ODciaNKD19IYdWJT+TP+tnhhn5koBGBWWtrKSu0UxWpnezIGZetit3eE+Y9+NTePalMkvpIlit2eDhvfJA==
+ dependencies:
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/utils" "2.8.3"
+ "@parcel/utils" "2.12.0"
+ lightningcss "^1.22.1"
nullthrows "^1.1.1"
-"@parcel/packager-html@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/packager-html/-/packager-html-2.8.3.tgz#f9263b891aa4dd46c6e2fa2b07025a482132fff1"
- integrity sha512-OhPu1Hx1RRKJodpiu86ZqL8el2Aa4uhBHF6RAL1Pcrh2EhRRlPf70Sk0tC22zUpYL7es+iNKZ/n0Rl+OWSHWEw==
+"@parcel/packager-html@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/packager-html/-/packager-html-2.12.0.tgz#dd62a483043982880a63e68ce8d8132f60becd3d"
+ integrity sha512-PpvGB9hFFe+19NXGz2ApvPrkA9GwEqaDAninT+3pJD57OVBaxB8U+HN4a5LICKxjUppPPqmrLb6YPbD65IX4RA==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/types" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
nullthrows "^1.1.1"
posthtml "^0.16.5"
-"@parcel/packager-js@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/packager-js/-/packager-js-2.8.3.tgz#3ed11565915d73d12192b6901c75a6b820e4a83a"
- integrity sha512-0pGKC3Ax5vFuxuZCRB+nBucRfFRz4ioie19BbDxYnvBxrd4M3FIu45njf6zbBYsI9eXqaDnL1b3DcZJfYqtIzw==
+"@parcel/packager-js@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/packager-js/-/packager-js-2.12.0.tgz#f81f64d16560b97e70bbb4cf568555f990afa2f6"
+ integrity sha512-viMF+FszITRRr8+2iJyk+4ruGiL27Y6AF7hQ3xbJfzqnmbOhGFtLTQwuwhOLqN/mWR2VKdgbLpZSarWaO3yAMg==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/hash" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/rust" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/utils" "2.8.3"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
globals "^13.2.0"
nullthrows "^1.1.1"
-"@parcel/packager-raw@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.8.3.tgz#bdec826df991e186cb58691cc45d12ad5c06676e"
- integrity sha512-BA6enNQo1RCnco9MhkxGrjOk59O71IZ9DPKu3lCtqqYEVd823tXff2clDKHK25i6cChmeHu6oB1Rb73hlPqhUA==
+"@parcel/packager-raw@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.12.0.tgz#043b704814ff2bcc884cf33e6542f72e246367e0"
+ integrity sha512-tJZqFbHqP24aq1F+OojFbQIc09P/u8HAW5xfndCrFnXpW4wTgM3p03P0xfw3gnNq+TtxHJ8c3UFE5LnXNNKhYA==
dependencies:
- "@parcel/plugin" "2.8.3"
+ "@parcel/plugin" "2.12.0"
-"@parcel/packager-svg@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/packager-svg/-/packager-svg-2.8.3.tgz#7233315296001c531cb55ca96b5f2ef672343630"
- integrity sha512-mvIoHpmv5yzl36OjrklTDFShLUfPFTwrmp1eIwiszGdEBuQaX7JVI3Oo2jbVQgcN4W7J6SENzGQ3Q5hPTW3pMw==
+"@parcel/packager-svg@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/packager-svg/-/packager-svg-2.12.0.tgz#2c392243373d60fc834a08d15003f239c34f39a7"
+ integrity sha512-ldaGiacGb2lLqcXas97k8JiZRbAnNREmcvoY2W2dvW4loVuDT9B9fU777mbV6zODpcgcHWsLL3lYbJ5Lt3y9cg==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/types" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
posthtml "^0.16.4"
-"@parcel/plugin@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.8.3.tgz#7bb30a5775eaa6473c27f002a0a3ee7308d6d669"
- integrity sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==
+"@parcel/packager-wasm@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/packager-wasm/-/packager-wasm-2.12.0.tgz#39dbd91e7bf68456dbc9d19a412017e2b513736f"
+ integrity sha512-fYqZzIqO9fGYveeImzF8ll6KRo2LrOXfD+2Y5U3BiX/wp9wv17dz50QLDQm9hmTcKGWxK4yWqKQh+Evp/fae7A==
+ dependencies:
+ "@parcel/plugin" "2.12.0"
+
+"@parcel/plugin@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/plugin/-/plugin-2.12.0.tgz#3db4237e8977ef5b5378b65eaffb809d2026431a"
+ integrity sha512-nc/uRA8DiMoe4neBbzV6kDndh/58a4wQuGKw5oEoIwBCHUvE2W8ZFSu7ollSXUGRzfacTt4NdY8TwS73ScWZ+g==
dependencies:
- "@parcel/types" "2.8.3"
+ "@parcel/types" "2.12.0"
+
+"@parcel/profiler@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/profiler/-/profiler-2.12.0.tgz#8541ca5d27500aebc843b1de081734442e5ee054"
+ integrity sha512-q53fvl5LDcFYzMUtSusUBZSjQrKjMlLEBgKeQHFwkimwR1mgoseaDBDuNz0XvmzDzF1UelJ02TUKCGacU8W2qA==
+ dependencies:
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/events" "2.12.0"
+ chrome-trace-event "^1.0.2"
"@parcel/reporter-bundle-analyzer@^2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/reporter-bundle-analyzer/-/reporter-bundle-analyzer-2.8.3.tgz#706899df09f5ad4fa2882a6139e95935c2848329"
- integrity sha512-4h0JwqOCmHlbzFwgYyEqgchMwk2N1zXmDltO2vIhPikvdsJCJXoRqvJvVTeLeL5bPOYLduMhlaAvn5B3jqcsFA==
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/reporter-bundle-analyzer/-/reporter-bundle-analyzer-2.12.0.tgz#7fc6db7eb085af702ffb61f0af829f59c3f1dea5"
+ integrity sha512-lj5ayqpo7lzvc1jZWDKiqzzFakhfF8a6U59cxmCGXn4sU6qEDbJcGUqox4vemiBWb1cr0/b4MpfnIs9aUl5UDA==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
nullthrows "^1.1.1"
-"@parcel/reporter-cli@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/reporter-cli/-/reporter-cli-2.8.3.tgz#12a4743b51b8fe6837f53c20e01bbf1f7336e8e4"
- integrity sha512-3sJkS6tFFzgIOz3u3IpD/RsmRxvOKKiQHOTkiiqRt1l44mMDGKS7zANRnJYsQzdCsgwc9SOP30XFgJwtoVlMbw==
+"@parcel/reporter-cli@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/reporter-cli/-/reporter-cli-2.12.0.tgz#e067b4eeca49c7120d3455d99810bed5bc825920"
+ integrity sha512-TqKsH4GVOLPSCanZ6tcTPj+rdVHERnt5y4bwTM82cajM21bCX1Ruwp8xOKU+03091oV2pv5ieB18pJyRF7IpIw==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/types" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
chalk "^4.1.0"
term-size "^2.2.1"
-"@parcel/reporter-dev-server@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.8.3.tgz#a0daa5cc015642684cea561f4e0e7116bbffdc1c"
- integrity sha512-Y8C8hzgzTd13IoWTj+COYXEyCkXfmVJs3//GDBsH22pbtSFMuzAZd+8J9qsCo0EWpiDow7V9f1LischvEh3FbQ==
+"@parcel/reporter-dev-server@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/reporter-dev-server/-/reporter-dev-server-2.12.0.tgz#bd4c9e3d6dc8d8b178564a336f46b4f70acf3e79"
+ integrity sha512-tIcDqRvAPAttRlTV28dHcbWT5K2r/MBFks7nM4nrEDHWtnrCwimkDmZTc1kD8QOCCjGVwRHcQybpHvxfwol6GA==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
-"@parcel/resolver-default@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/resolver-default/-/resolver-default-2.8.3.tgz#5ae41e537ae4a793c1abb47f094482b9e2ac3535"
- integrity sha512-k0B5M/PJ+3rFbNj4xZSBr6d6HVIe6DH/P3dClLcgBYSXAvElNDfXgtIimbjCyItFkW9/BfcgOVKEEIZOeySH/A==
+"@parcel/reporter-tracer@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/reporter-tracer/-/reporter-tracer-2.12.0.tgz#680e8be677277318c656c1825dbe98a8bfb64e16"
+ integrity sha512-g8rlu9GxB8Ut/F8WGx4zidIPQ4pcYFjU9bZO+fyRIPrSUFH2bKijCnbZcr4ntqzDGx74hwD6cCG4DBoleq2UlQ==
dependencies:
- "@parcel/node-resolver-core" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
+ chrome-trace-event "^1.0.3"
+ nullthrows "^1.1.1"
+
+"@parcel/resolver-default@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/resolver-default/-/resolver-default-2.12.0.tgz#005b6bc01de9d166a97d7ef30daf339973c4898a"
+ integrity sha512-uuhbajTax37TwCxu7V98JtRLiT6hzE4VYSu5B7Qkauy14/WFt2dz6GOUXPgVsED569/hkxebPx3KCMtZW6cHHA==
+ dependencies:
+ "@parcel/node-resolver-core" "3.3.0"
+ "@parcel/plugin" "2.12.0"
-"@parcel/runtime-browser-hmr@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.8.3.tgz#1fa74e1fbd1030b0a920c58afa3a9eb7dc4bcd1e"
- integrity sha512-2O1PYi2j/Q0lTyGNV3JdBYwg4rKo6TEVFlYGdd5wCYU9ZIN9RRuoCnWWH2qCPj3pjIVtBeppYxzfVjPEHINWVg==
+"@parcel/runtime-browser-hmr@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.12.0.tgz#9d045785b83760e305c9efd3d6300a9ff73bcfaf"
+ integrity sha512-4ZLp2FWyD32r0GlTulO3+jxgsA3oO1P1b5oO2IWuWilfhcJH5LTiazpL5YdusUjtNn9PGN6QLAWfxmzRIfM+Ow==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
-"@parcel/runtime-js@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/runtime-js/-/runtime-js-2.8.3.tgz#0baa4c8fbf77eabce05d01ccc186614968ffc0cd"
- integrity sha512-IRja0vNKwvMtPgIqkBQh0QtRn0XcxNC8HU1jrgWGRckzu10qJWO+5ULgtOeR4pv9krffmMPqywGXw6l/gvJKYQ==
+"@parcel/runtime-js@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/runtime-js/-/runtime-js-2.12.0.tgz#da6f7da041cb157556822ad60fefcdbc790dda9c"
+ integrity sha512-sBerP32Z1crX5PfLNGDSXSdqzlllM++GVnVQVeM7DgMKS8JIFG3VLi28YkX+dYYGtPypm01JoIHCkvwiZEcQJg==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
nullthrows "^1.1.1"
-"@parcel/runtime-react-refresh@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.8.3.tgz#381a942fb81e8f5ac6c7e0ee1b91dbf34763c3f8"
- integrity sha512-2v/qFKp00MfG0234OdOgQNAo6TLENpFYZMbVbAsPMY9ITiqG73MrEsrGXVoGbYiGTMB/Toer/lSWlJxtacOCuA==
+"@parcel/runtime-react-refresh@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/runtime-react-refresh/-/runtime-react-refresh-2.12.0.tgz#58c17552766492ec2005ffedfa04ecb29386dd8b"
+ integrity sha512-SCHkcczJIDFTFdLTzrHTkQ0aTrX3xH6jrA4UsCBL6ji61+w+ohy4jEEe9qCgJVXhnJfGLE43HNXek+0MStX+Mw==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
react-error-overlay "6.0.9"
react-refresh "^0.9.0"
-"@parcel/runtime-service-worker@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.8.3.tgz#54d92da9ff1dfbd27db0e84164a22fa59e99b348"
- integrity sha512-/Skkw+EeRiwzOJso5fQtK8c9b452uWLNhQH1ISTodbmlcyB4YalAiSsyHCtMYD0c3/t5Sx4ZS7vxBAtQd0RvOw==
+"@parcel/runtime-service-worker@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/runtime-service-worker/-/runtime-service-worker-2.12.0.tgz#67ee1e6dbc5441651fed04ecb2bd7ebe1e362679"
+ integrity sha512-BXuMBsfiwpIEnssn+jqfC3jkgbS8oxeo3C7xhSQsuSv+AF2FwY3O3AO1c1RBskEW3XrBLNINOJujroNw80VTKA==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
nullthrows "^1.1.1"
+"@parcel/rust@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/rust/-/rust-2.12.0.tgz#135df4dd8c63d97720379777c5bb4a2680a201cd"
+ integrity sha512-005cldMdFZFDPOjbDVEXcINQ3wT4vrxvSavRWI3Az0e3E18exO/x/mW9f648KtXugOXMAqCEqhFHcXECL9nmMw==
+
"@parcel/source-map@^2.1.1":
version "2.1.1"
resolved "https://registry.yarnpkg.com/@parcel/source-map/-/source-map-2.1.1.tgz#fb193b82dba6dd62cc7a76b326f57bb35000a782"
@@ -1955,229 +1999,303 @@
dependencies:
detect-libc "^1.0.3"
-"@parcel/transformer-babel@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-babel/-/transformer-babel-2.8.3.tgz#286bc6cb9afe4c0259f0b28e0f2f47322a24b130"
- integrity sha512-L6lExfpvvC7T/g3pxf3CIJRouQl+sgrSzuWQ0fD4PemUDHvHchSP4SNUVnd6gOytF3Y1KpnEZIunQGi5xVqQCQ==
+"@parcel/transformer-babel@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-babel/-/transformer-babel-2.12.0.tgz#29be68f2fad4688b33ef3f03ef2b8c3e9928b87f"
+ integrity sha512-zQaBfOnf/l8rPxYGnsk/ufh/0EuqvmnxafjBIpKZ//j6rGylw5JCqXSb1QvvAqRYruKeccxGv7+HrxpqKU6V4A==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/utils" "2.8.3"
+ "@parcel/utils" "2.12.0"
browserslist "^4.6.6"
json5 "^2.2.0"
nullthrows "^1.1.1"
- semver "^5.7.0"
+ semver "^7.5.2"
-"@parcel/transformer-css@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-css/-/transformer-css-2.8.3.tgz#d6c44100204e73841ad8e0f90472172ea8b9120c"
- integrity sha512-xTqFwlSXtnaYen9ivAgz+xPW7yRl/u4QxtnDyDpz5dr8gSeOpQYRcjkd4RsYzKsWzZcGtB5EofEk8ayUbWKEUg==
+"@parcel/transformer-css@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-css/-/transformer-css-2.12.0.tgz#218a98948c9410c17287183d80ca9bd9943cc9e9"
+ integrity sha512-vXhOqoAlQGATYyQ433Z1DXKmiKmzOAUmKysbYH3FD+LKEKLMEl/pA14goqp00TW+A/EjtSKKyeMyHlMIIUqj4Q==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/utils" "2.8.3"
+ "@parcel/utils" "2.12.0"
browserslist "^4.6.6"
- lightningcss "^1.16.1"
+ lightningcss "^1.22.1"
nullthrows "^1.1.1"
-"@parcel/transformer-html@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-html/-/transformer-html-2.8.3.tgz#5c68b28ee6b8c7a13b8aee87f7957ad3227bd83f"
- integrity sha512-kIZO3qsMYTbSnSpl9cnZog+SwL517ffWH54JeB410OSAYF1ouf4n5v9qBnALZbuCCmPwJRGs4jUtE452hxwN4g==
+"@parcel/transformer-html@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-html/-/transformer-html-2.12.0.tgz#8681b089e2b20c5fda1c966cefb8de4d8fb2ce80"
+ integrity sha512-5jW4dFFBlYBvIQk4nrH62rfA/G/KzVzEDa6S+Nne0xXhglLjkm64Ci9b/d4tKZfuGWUbpm2ASAq8skti/nfpXw==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/hash" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/rust" "2.12.0"
nullthrows "^1.1.1"
posthtml "^0.16.5"
posthtml-parser "^0.10.1"
posthtml-render "^3.0.0"
- semver "^5.7.1"
+ semver "^7.5.2"
srcset "4"
-"@parcel/transformer-image@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-image/-/transformer-image-2.8.3.tgz#73805b2bfc3c8919d7737544e5f8be39e3f303fe"
- integrity sha512-cO4uptcCGTi5H6bvTrAWEFUsTNhA4kCo8BSvRSCHA2sf/4C5tGQPHt3JhdO0GQLPwZRCh/R41EkJs5HZ8A8DAg==
+"@parcel/transformer-image@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-image/-/transformer-image-2.12.0.tgz#8ba2ca3b5d88287bf38c8244b2714158c9d34b2e"
+ integrity sha512-8hXrGm2IRII49R7lZ0RpmNk27EhcsH+uNKsvxuMpXPuEnWgC/ha/IrjaI29xCng1uGur74bJF43NUSQhR4aTdw==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
- "@parcel/workers" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
+ "@parcel/workers" "2.12.0"
nullthrows "^1.1.1"
-"@parcel/transformer-js@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-js/-/transformer-js-2.8.3.tgz#fe400df428394d1e7fe5afb6dea5c7c858e44f03"
- integrity sha512-9Qd6bib+sWRcpovvzvxwy/PdFrLUXGfmSW9XcVVG8pvgXsZPFaNjnNT8stzGQj1pQiougCoxMY4aTM5p1lGHEQ==
+"@parcel/transformer-js@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-js/-/transformer-js-2.12.0.tgz#e6bf0c312f78603faf98ce546086898506e3811f"
+ integrity sha512-OSZpOu+FGDbC/xivu24v092D9w6EGytB3vidwbdiJ2FaPgfV7rxS0WIUjH4I0OcvHAcitArRXL0a3+HrNTdQQw==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/rust" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/utils" "2.8.3"
- "@parcel/workers" "2.8.3"
- "@swc/helpers" "^0.4.12"
+ "@parcel/utils" "2.12.0"
+ "@parcel/workers" "2.12.0"
+ "@swc/helpers" "^0.5.0"
browserslist "^4.6.6"
- detect-libc "^1.0.3"
nullthrows "^1.1.1"
regenerator-runtime "^0.13.7"
- semver "^5.7.1"
+ semver "^7.5.2"
-"@parcel/transformer-json@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-json/-/transformer-json-2.8.3.tgz#25deb3a5138cc70a83269fc5d39d564609354d36"
- integrity sha512-B7LmVq5Q7bZO4ERb6NHtRuUKWGysEeaj9H4zelnyBv+wLgpo4f5FCxSE1/rTNmP9u1qHvQ3scGdK6EdSSokGPg==
+"@parcel/transformer-json@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-json/-/transformer-json-2.12.0.tgz#16cc0454e4862350b605a5e2009d050c676c6ea5"
+ integrity sha512-Utv64GLRCQILK5r0KFs4o7I41ixMPllwOLOhkdjJKvf1hZmN6WqfOmB1YLbWS/y5Zb/iB52DU2pWZm96vLFQZQ==
dependencies:
- "@parcel/plugin" "2.8.3"
+ "@parcel/plugin" "2.12.0"
json5 "^2.2.0"
-"@parcel/transformer-postcss@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.8.3.tgz#df4fdc1c90893823445f2a8eb8e2bdd0349ccc58"
- integrity sha512-e8luB/poIlz6jBsD1Izms+6ElbyzuoFVa4lFVLZnTAChI3UxPdt9p/uTsIO46HyBps/Bk8ocvt3J4YF84jzmvg==
+"@parcel/transformer-postcss@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-postcss/-/transformer-postcss-2.12.0.tgz#195f4fb86f36f42b5de82076ea36b9d850f4832e"
+ integrity sha512-FZqn+oUtiLfPOn67EZxPpBkfdFiTnF4iwiXPqvst3XI8H+iC+yNgzmtJkunOOuylpYY6NOU5jT8d7saqWSDv2Q==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/hash" "2.8.3"
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/rust" "2.12.0"
+ "@parcel/utils" "2.12.0"
clone "^2.1.1"
nullthrows "^1.1.1"
postcss-value-parser "^4.2.0"
- semver "^5.7.1"
+ semver "^7.5.2"
-"@parcel/transformer-posthtml@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.8.3.tgz#7c3912a5a631cb26485f6464e0d6eeabb6f1e718"
- integrity sha512-pkzf9Smyeaw4uaRLsT41RGrPLT5Aip8ZPcntawAfIo+KivBQUV0erY1IvHYjyfFzq1ld/Fo2Ith9He6mxpPifA==
+"@parcel/transformer-posthtml@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-posthtml/-/transformer-posthtml-2.12.0.tgz#a906c26278e03455f6186b7dbd9f5b63eaa26948"
+ integrity sha512-z6Z7rav/pcaWdeD+2sDUcd0mmNZRUvtHaUGa50Y2mr+poxrKilpsnFMSiWBT+oOqPt7j71jzDvrdnAF4XkCljg==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
nullthrows "^1.1.1"
posthtml "^0.16.5"
posthtml-parser "^0.10.1"
posthtml-render "^3.0.0"
- semver "^5.7.1"
+ semver "^7.5.2"
-"@parcel/transformer-raw@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-raw/-/transformer-raw-2.8.3.tgz#3a22213fe18a5f83fd78889cb49f06e059cfead7"
- integrity sha512-G+5cXnd2/1O3nV/pgRxVKZY/HcGSseuhAe71gQdSQftb8uJEURyUHoQ9Eh0JUD3MgWh9V+nIKoyFEZdf9T0sUQ==
+"@parcel/transformer-raw@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-raw/-/transformer-raw-2.12.0.tgz#1ee7e02214f777cf3a5bf53580ee4dadfaf8a44c"
+ integrity sha512-Ht1fQvXxix0NncdnmnXZsa6hra20RXYh1VqhBYZLsDfkvGGFnXIgO03Jqn4Z8MkKoa0tiNbDhpKIeTjyclbBxQ==
dependencies:
- "@parcel/plugin" "2.8.3"
+ "@parcel/plugin" "2.12.0"
-"@parcel/transformer-react-refresh-wrap@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.8.3.tgz#8b0392638405dd470a886002229f7889d5464822"
- integrity sha512-q8AAoEvBnCf/nPvgOwFwKZfEl/thwq7c2duxXkhl+tTLDRN2vGmyz4355IxCkavSX+pLWSQ5MexklSEeMkgthg==
+"@parcel/transformer-react-refresh-wrap@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.12.0.tgz#cf079353126f2bb820209736a75f868d0df58d92"
+ integrity sha512-GE8gmP2AZtkpBIV5vSCVhewgOFRhqwdM5Q9jNPOY5PKcM3/Ff0qCqDiTzzGLhk0/VMBrdjssrfZkVx6S/lHdJw==
dependencies:
- "@parcel/plugin" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/utils" "2.12.0"
react-refresh "^0.9.0"
"@parcel/transformer-svg-react@^2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-svg-react/-/transformer-svg-react-2.8.3.tgz#120d2907142d26ddc94abeef668955f2ad0ae5d8"
- integrity sha512-TbiaHJ74zpzHovaHe7LCeGpNh/8GV8ZRKmCj83+y9fjjoBKo8IaYtKp48mszY9ltma0xBqhmFarddF19kQxb+g==
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-svg-react/-/transformer-svg-react-2.12.0.tgz#646df7c76201dd0ef08b0eb9921b329df022f133"
+ integrity sha512-vhutEXbPqu1PeJNofB4KaAoXpOJrlfdCibWilZKEs7ZPEMOxtWXGa0mcUlSNgB4vRNmUqz0vUP0uBF9O1FxBrQ==
dependencies:
- "@parcel/plugin" "2.8.3"
+ "@parcel/plugin" "2.12.0"
"@svgr/core" "^6.2.0"
"@svgr/plugin-jsx" "^6.2.0"
"@svgr/plugin-svgo" "^6.2.0"
-"@parcel/transformer-svg@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-svg/-/transformer-svg-2.8.3.tgz#4df959cba4ebf45d7aaddd540f752e6e84df38b2"
- integrity sha512-3Zr/gBzxi1ZH1fftH/+KsZU7w5GqkmxlB0ZM8ovS5E/Pl1lq1t0xvGJue9m2VuQqP8Mxfpl5qLFmsKlhaZdMIQ==
+"@parcel/transformer-svg@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-svg/-/transformer-svg-2.12.0.tgz#0281e89bf0f438ec161c19b59a8a8978434a3621"
+ integrity sha512-cZJqGRJ4JNdYcb+vj94J7PdOuTnwyy45dM9xqbIMH+HSiiIkfrMsdEwYft0GTyFTdsnf+hdHn3tau7Qa5hhX+A==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/hash" "2.8.3"
- "@parcel/plugin" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/rust" "2.12.0"
nullthrows "^1.1.1"
posthtml "^0.16.5"
posthtml-parser "^0.10.1"
posthtml-render "^3.0.0"
- semver "^5.7.1"
+ semver "^7.5.2"
"@parcel/transformer-typescript-tsc@^2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/transformer-typescript-tsc/-/transformer-typescript-tsc-2.8.3.tgz#9a50a6abda0ee08f3d803896a168bdd2f33b071a"
- integrity sha512-hig99OrUJhXuGLN+Nxisvfkj3cggH6GM1nDcS3KWEGoD+UkxLaXkd32Od/mvJ4nUN/ThbAPqwIljmgkgPlYzbw==
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/transformer-typescript-tsc/-/transformer-typescript-tsc-2.12.0.tgz#96219045f90535c345e305552ed2ecb90a2b3c5b"
+ integrity sha512-2y74ijth5nngFTRXvZGmZXRwmPjzTHTs8LA6PLXiAbR41091C4QdHvNk1Z3iFo29yyECwAUXGubY2mC0sfWbUA==
dependencies:
- "@parcel/plugin" "2.8.3"
+ "@parcel/plugin" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/ts-utils" "2.8.3"
+ "@parcel/ts-utils" "2.12.0"
-"@parcel/ts-utils@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/ts-utils/-/ts-utils-2.8.3.tgz#f3590ca033c061779dc35ff3d14af2860ed106ac"
- integrity sha512-4HMt9B9LF2pDFvSKGImho48tlCvCUl7ly1ZMXvQdmEq2i0yoS81tDsmxX3yly/RVUVeUCGAj1JRuuy1lw5zw1A==
+"@parcel/ts-utils@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/ts-utils/-/ts-utils-2.12.0.tgz#47878a6f3baff77d2fa6f9878fe235c9c5d75da8"
+ integrity sha512-zou+W6dcqnXXUOfN5zGM+ePIWbYOhGp8bVB2jICoNkoKmNAHd4l4zeHl5yQXnbZfynVw88cZVqxtXS8tYebelg==
dependencies:
nullthrows "^1.1.1"
-"@parcel/types@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.8.3.tgz#3306bc5391b6913bd619914894b8cd84a24b30fa"
- integrity sha512-FECA1FB7+0UpITKU0D6TgGBpGxYpVSMNEENZbSJxFSajNy3wrko+zwBKQmFOLOiPcEtnGikxNs+jkFWbPlUAtw==
+"@parcel/types@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.12.0.tgz#caf0af00ee0c7228b350eca5f4d3a5b85ce457ad"
+ integrity sha512-8zAFiYNCwNTQcglIObyNwKfRYQK5ELlL13GuBOrSMxueUiI5ylgsGbTS1N7J3dAGZixHO8KhHGv5a71FILn9rQ==
dependencies:
- "@parcel/cache" "2.8.3"
- "@parcel/diagnostic" "2.8.3"
- "@parcel/fs" "2.8.3"
- "@parcel/package-manager" "2.8.3"
+ "@parcel/cache" "2.12.0"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/fs" "2.12.0"
+ "@parcel/package-manager" "2.12.0"
"@parcel/source-map" "^2.1.1"
- "@parcel/workers" "2.8.3"
+ "@parcel/workers" "2.12.0"
utility-types "^3.10.0"
-"@parcel/utils@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.8.3.tgz#0d56c9e8e22c119590a5e044a0e01031965da40e"
- integrity sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==
+"@parcel/utils@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-2.12.0.tgz#ac900726e7cb12a9e6392081fa05b756183f65fd"
+ integrity sha512-z1JhLuZ8QmDaYoEIuUCVZlhcFrS7LMfHrb2OCRui5SQFntRWBH2fNM6H/fXXUkT9SkxcuFP2DUA6/m4+Gkz72g==
dependencies:
- "@parcel/codeframe" "2.8.3"
- "@parcel/diagnostic" "2.8.3"
- "@parcel/hash" "2.8.3"
- "@parcel/logger" "2.8.3"
- "@parcel/markdown-ansi" "2.8.3"
+ "@parcel/codeframe" "2.12.0"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/logger" "2.12.0"
+ "@parcel/markdown-ansi" "2.12.0"
+ "@parcel/rust" "2.12.0"
"@parcel/source-map" "^2.1.1"
chalk "^4.1.0"
+ nullthrows "^1.1.1"
"@parcel/validator-typescript@^2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/validator-typescript/-/validator-typescript-2.8.3.tgz#6f9cb5b48df302b1d65e9b17dc1a20870e746976"
- integrity sha512-2UYGCAwrxh7HIGcrXl8Vu9Sisd8vAu/6Jp/oJV5n9ZQuT5O9pQAlK2lZGSocYRucBtmb4WajII2S2GTzUZeEuQ==
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/validator-typescript/-/validator-typescript-2.12.0.tgz#aad284f47bfa01b53790f1d3dea7311b28e786b6"
+ integrity sha512-oiAG/MA6Ycbv106KCAQAwwVKdDdpyvK8xWJ47wme726Nkc6YO/UCoHBqIFTld8+PC7QD3U0XY5Y4kavm3n+lMQ==
dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/plugin" "2.8.3"
- "@parcel/ts-utils" "2.8.3"
- "@parcel/types" "2.8.3"
- "@parcel/utils" "2.8.3"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/plugin" "2.12.0"
+ "@parcel/ts-utils" "2.12.0"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
+
+"@parcel/watcher-android-arm64@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84"
+ integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==
+
+"@parcel/watcher-darwin-arm64@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34"
+ integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==
+
+"@parcel/watcher-darwin-x64@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020"
+ integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==
+
+"@parcel/watcher-freebsd-x64@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8"
+ integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==
+
+"@parcel/watcher-linux-arm-glibc@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d"
+ integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==
+
+"@parcel/watcher-linux-arm64-glibc@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7"
+ integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==
+
+"@parcel/watcher-linux-arm64-musl@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635"
+ integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==
+
+"@parcel/watcher-linux-x64-glibc@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39"
+ integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==
+
+"@parcel/watcher-linux-x64-musl@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16"
+ integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==
+
+"@parcel/watcher-win32-arm64@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc"
+ integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==
+
+"@parcel/watcher-win32-ia32@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7"
+ integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==
+
+"@parcel/watcher-win32-x64@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf"
+ integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==
"@parcel/watcher@^2.0.7":
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.1.0.tgz#5f32969362db4893922c526a842d8af7a8538545"
- integrity sha512-8s8yYjd19pDSsBpbkOHnT6Z2+UJSuLQx61pCFM0s5wSRvKCEMDjd/cHY3/GI1szHIWbpXpsJdg3V6ISGGx9xDw==
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8"
+ integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==
dependencies:
+ detect-libc "^1.0.3"
is-glob "^4.0.3"
micromatch "^4.0.5"
- node-addon-api "^3.2.1"
- node-gyp-build "^4.3.0"
-
-"@parcel/workers@2.8.3":
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.8.3.tgz#255450ccf4db234082407e4ddda5fd575f08c235"
- integrity sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==
- dependencies:
- "@parcel/diagnostic" "2.8.3"
- "@parcel/logger" "2.8.3"
- "@parcel/types" "2.8.3"
- "@parcel/utils" "2.8.3"
- chrome-trace-event "^1.0.2"
+ node-addon-api "^7.0.0"
+ optionalDependencies:
+ "@parcel/watcher-android-arm64" "2.4.1"
+ "@parcel/watcher-darwin-arm64" "2.4.1"
+ "@parcel/watcher-darwin-x64" "2.4.1"
+ "@parcel/watcher-freebsd-x64" "2.4.1"
+ "@parcel/watcher-linux-arm-glibc" "2.4.1"
+ "@parcel/watcher-linux-arm64-glibc" "2.4.1"
+ "@parcel/watcher-linux-arm64-musl" "2.4.1"
+ "@parcel/watcher-linux-x64-glibc" "2.4.1"
+ "@parcel/watcher-linux-x64-musl" "2.4.1"
+ "@parcel/watcher-win32-arm64" "2.4.1"
+ "@parcel/watcher-win32-ia32" "2.4.1"
+ "@parcel/watcher-win32-x64" "2.4.1"
+
+"@parcel/workers@2.12.0":
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-2.12.0.tgz#773182b5006741102de8ae36d18a5a9e3320ebd1"
+ integrity sha512-zv5We5Jmb+ZWXlU6A+AufyjY4oZckkxsZ8J4dvyWL0W8IQvGO1JB4FGeryyttzQv3RM3OxcN/BpTGPiDG6keBw==
+ dependencies:
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/logger" "2.12.0"
+ "@parcel/profiler" "2.12.0"
+ "@parcel/types" "2.12.0"
+ "@parcel/utils" "2.12.0"
nullthrows "^1.1.1"
"@popperjs/core@^2.9.3":
- version "2.11.6"
- resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45"
- integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==
+ version "2.11.8"
+ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
+ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
version "1.1.2"
@@ -2232,10 +2350,10 @@
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
-"@remix-run/router@1.3.2":
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.2.tgz#58cd2bd25df2acc16c628e1b6f6150ea6c7455bc"
- integrity sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==
+"@remix-run/router@1.15.3":
+ version "1.15.3"
+ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.3.tgz#d2509048d69dbb72d5389a14945339f1430b2d3c"
+ integrity sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==
"@svgr/babel-plugin-add-jsx-attribute@^6.5.1":
version "6.5.1"
@@ -2243,14 +2361,14 @@
integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==
"@svgr/babel-plugin-remove-jsx-attribute@*":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.5.0.tgz#652bfd4ed0a0699843585cda96faeb09d6e1306e"
- integrity sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186"
+ integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==
"@svgr/babel-plugin-remove-jsx-empty-expression@*":
- version "6.5.0"
- resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.5.0.tgz#4b78994ab7d39032c729903fc2dd5c0fa4565cb8"
- integrity sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44"
+ integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==
"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1":
version "6.5.1"
@@ -2329,22 +2447,103 @@
deepmerge "^4.2.2"
svgo "^2.8.0"
-"@swc/helpers@^0.4.12":
- version "0.4.14"
- resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74"
- integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==
+"@swc/core-darwin-arm64@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.8.tgz#2fb702e209310c2da2bc712b0757c011b583a60d"
+ integrity sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ==
+
+"@swc/core-darwin-x64@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.8.tgz#a5bcbec6830800ca8acafbda1944464ca8421804"
+ integrity sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ==
+
+"@swc/core-linux-arm-gnueabihf@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.8.tgz#0bf6ae3793bbb7dd0e47c3d153350d31b7e63cf9"
+ integrity sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA==
+
+"@swc/core-linux-arm64-gnu@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.8.tgz#8d3d3e698fc243d4a55c01a968b7297547aa6275"
+ integrity sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ==
+
+"@swc/core-linux-arm64-musl@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.8.tgz#ace70bbb650ceb70609987c5b07ff34462960b9e"
+ integrity sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w==
+
+"@swc/core-linux-x64-gnu@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.8.tgz#76e7fb06e5b6a14ed6dbc0fd00743706d022eb02"
+ integrity sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w==
+
+"@swc/core-linux-x64-musl@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.8.tgz#a6e03fe6207fcb9715250c7af260e5ee1bf43c5a"
+ integrity sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q==
+
+"@swc/core-win32-arm64-msvc@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.8.tgz#5daa44087324c49c64fdbb48fdb3aa00218de03b"
+ integrity sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA==
+
+"@swc/core-win32-ia32-msvc@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.8.tgz#0f1186d2d8bf60c12cfe8ac013b8a520fd850f2e"
+ integrity sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw==
+
+"@swc/core-win32-x64-msvc@1.4.8":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.8.tgz#0bf080132a52e332c7c221d1087a311824746d76"
+ integrity sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg==
+
+"@swc/core@^1.3.36":
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.8.tgz#de859373a01f499ed27744f6848b28bbb977e81c"
+ integrity sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg==
+ dependencies:
+ "@swc/counter" "^0.1.2"
+ "@swc/types" "^0.1.5"
+ optionalDependencies:
+ "@swc/core-darwin-arm64" "1.4.8"
+ "@swc/core-darwin-x64" "1.4.8"
+ "@swc/core-linux-arm-gnueabihf" "1.4.8"
+ "@swc/core-linux-arm64-gnu" "1.4.8"
+ "@swc/core-linux-arm64-musl" "1.4.8"
+ "@swc/core-linux-x64-gnu" "1.4.8"
+ "@swc/core-linux-x64-musl" "1.4.8"
+ "@swc/core-win32-arm64-msvc" "1.4.8"
+ "@swc/core-win32-ia32-msvc" "1.4.8"
+ "@swc/core-win32-x64-msvc" "1.4.8"
+
+"@swc/counter@^0.1.2", "@swc/counter@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
+ integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
+
+"@swc/helpers@^0.5.0":
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.7.tgz#36c05f61b412abcff3616ecc8634623bcc7c9618"
+ integrity sha512-BVvNZhx362+l2tSwSuyEUV4h7+jk9raNdoTSdLfwTshXJSaGmYKluGRJznziCI3KX02Z19DdsQrdfrpXAU3Hfg==
dependencies:
tslib "^2.4.0"
+"@swc/types@^0.1.5":
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.6.tgz#2f13f748995b247d146de2784d3eb7195410faba"
+ integrity sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==
+ dependencies:
+ "@swc/counter" "^0.1.3"
+
"@trysound/sax@0.2.0":
version "0.2.0"
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
"@types/json-schema@^7.0.9":
- version "7.0.11"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
- integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+ version "7.0.15"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
"@types/json5@^0.0.29":
version "0.0.29"
@@ -2366,9 +2565,9 @@
"@types/lodash" "*"
"@types/lodash@*":
- version "4.14.191"
- resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa"
- integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.0.tgz#d774355e41f372d5350a4d0714abb48194a489c3"
+ integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==
"@types/long@^4.0.1":
version "4.0.2"
@@ -2381,9 +2580,9 @@
integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
"@types/minimist@^1.2.0":
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
- integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e"
+ integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
"@types/node@11.11.6":
version "11.11.6"
@@ -2391,144 +2590,153 @@
integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==
"@types/node@>=13.7.0":
- version "18.15.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.0.tgz#286a65e3fdffd691e170541e6ecb0410b16a38be"
- integrity sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==
+ version "20.11.30"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f"
+ integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==
+ dependencies:
+ undici-types "~5.26.4"
"@types/node@^18.11.18":
- version "18.13.0"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850"
- integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==
+ version "18.19.26"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.26.tgz#18991279d0a0e53675285e8cf4a0823766349729"
+ integrity sha512-+wiMJsIwLOYCvUqSdKTrfkS8mpTp+MPINe6+Np4TAGFWWRWiBQ5kSq9nZGCSPkzx9mvT+uEukzpX4MOSCydcvw==
+ dependencies:
+ undici-types "~5.26.4"
"@types/normalize-package-data@^2.4.0":
- version "2.4.1"
- resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
- integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
+ version "2.4.4"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
+ integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
"@types/parse-json@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
- integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
+ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
"@types/prop-types@*":
- version "15.7.5"
- resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
- integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
+ version "15.7.12"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
+ integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
"@types/react-dom@^18.0.10":
- version "18.0.11"
- resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33"
- integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==
+ version "18.2.22"
+ resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae"
+ integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@^18.0.26", "@types/react@^18.0.27":
- version "18.0.28"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.28.tgz#accaeb8b86f4908057ad629a26635fe641480065"
- integrity sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==
+ version "18.2.69"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.69.tgz#313ec21891b22bb7646a54cb4bdb8cddb0880271"
+ integrity sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/scheduler@*":
- version "0.16.2"
- resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
- integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
+ version "0.16.8"
+ resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff"
+ integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==
"@types/semver@^7.3.12":
- version "7.3.13"
- resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
- integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
+ version "7.5.8"
+ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
+ integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
"@typescript-eslint/eslint-plugin@^5.0.0":
- version "5.52.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz#5fb0d43574c2411f16ea80f5fc335b8eaa7b28a8"
- integrity sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==
- dependencies:
- "@typescript-eslint/scope-manager" "5.52.0"
- "@typescript-eslint/type-utils" "5.52.0"
- "@typescript-eslint/utils" "5.52.0"
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db"
+ integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
+ dependencies:
+ "@eslint-community/regexpp" "^4.4.0"
+ "@typescript-eslint/scope-manager" "5.62.0"
+ "@typescript-eslint/type-utils" "5.62.0"
+ "@typescript-eslint/utils" "5.62.0"
debug "^4.3.4"
- grapheme-splitter "^1.0.4"
+ graphemer "^1.4.0"
ignore "^5.2.0"
natural-compare-lite "^1.4.0"
- regexpp "^3.2.0"
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.50.0":
- version "5.52.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.52.0.tgz#73c136df6c0133f1d7870de7131ccf356f5be5a4"
- integrity sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7"
+ integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==
dependencies:
- "@typescript-eslint/scope-manager" "5.52.0"
- "@typescript-eslint/types" "5.52.0"
- "@typescript-eslint/typescript-estree" "5.52.0"
+ "@typescript-eslint/scope-manager" "5.62.0"
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/typescript-estree" "5.62.0"
debug "^4.3.4"
-"@typescript-eslint/scope-manager@5.52.0":
- version "5.52.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz#a993d89a0556ea16811db48eabd7c5b72dcb83d1"
- integrity sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==
+"@typescript-eslint/scope-manager@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c"
+ integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==
dependencies:
- "@typescript-eslint/types" "5.52.0"
- "@typescript-eslint/visitor-keys" "5.52.0"
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/visitor-keys" "5.62.0"
-"@typescript-eslint/type-utils@5.52.0":
- version "5.52.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz#9fd28cd02e6f21f5109e35496df41893f33167aa"
- integrity sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==
+"@typescript-eslint/type-utils@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a"
+ integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==
dependencies:
- "@typescript-eslint/typescript-estree" "5.52.0"
- "@typescript-eslint/utils" "5.52.0"
+ "@typescript-eslint/typescript-estree" "5.62.0"
+ "@typescript-eslint/utils" "5.62.0"
debug "^4.3.4"
tsutils "^3.21.0"
-"@typescript-eslint/types@5.52.0":
- version "5.52.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.52.0.tgz#19e9abc6afb5bd37a1a9bea877a1a836c0b3241b"
- integrity sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==
+"@typescript-eslint/types@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
+ integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
-"@typescript-eslint/typescript-estree@5.52.0":
- version "5.52.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz#6408cb3c2ccc01c03c278cb201cf07e73347dfca"
- integrity sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==
+"@typescript-eslint/typescript-estree@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b"
+ integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==
dependencies:
- "@typescript-eslint/types" "5.52.0"
- "@typescript-eslint/visitor-keys" "5.52.0"
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/visitor-keys" "5.62.0"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.52.0":
- version "5.52.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.52.0.tgz#b260bb5a8f6b00a0ed51db66bdba4ed5e4845a72"
- integrity sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==
+"@typescript-eslint/utils@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86"
+ integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
"@types/json-schema" "^7.0.9"
"@types/semver" "^7.3.12"
- "@typescript-eslint/scope-manager" "5.52.0"
- "@typescript-eslint/types" "5.52.0"
- "@typescript-eslint/typescript-estree" "5.52.0"
+ "@typescript-eslint/scope-manager" "5.62.0"
+ "@typescript-eslint/types" "5.62.0"
+ "@typescript-eslint/typescript-estree" "5.62.0"
eslint-scope "^5.1.1"
- eslint-utils "^3.0.0"
semver "^7.3.7"
-"@typescript-eslint/visitor-keys@5.52.0":
- version "5.52.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz#e38c971259f44f80cfe49d97dbffa38e3e75030f"
- integrity sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==
+"@typescript-eslint/visitor-keys@5.62.0":
+ version "5.62.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e"
+ integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==
dependencies:
- "@typescript-eslint/types" "5.52.0"
+ "@typescript-eslint/types" "5.62.0"
eslint-visitor-keys "^3.3.0"
+"@ungap/structured-clone@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
+ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
"@web-std/blob@^3.0.1":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@web-std/blob/-/blob-3.0.4.tgz#dd67a685547331915428d69e723c7da2015c3fc5"
- integrity sha512-+dibyiw+uHYK4dX5cJ7HA+gtDAaUUe6JsOryp2ZpAC7h4ICsh49E34JwHoEKPlPvP0llCrNzz45vvD+xX5QDBg==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@web-std/blob/-/blob-3.0.5.tgz#391e652dd3cc370dbb32c828368a3022b4d55c9c"
+ integrity sha512-Lm03qr0eT3PoLBuhkvFBLf0EFkAsNz/G/AYCzpOdi483aFaVX86b4iQs0OHhzHJfN5C15q17UtDbyABjlzM96A==
dependencies:
"@web-std/stream" "1.0.0"
web-encoding "1.1.5"
@@ -2540,15 +2748,22 @@
dependencies:
web-streams-polyfill "^3.1.1"
-"@zag-js/element-size@0.3.1":
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.3.1.tgz#f9f6ae98355e2250d18d0f6e2f1134a0ae4c6a2f"
- integrity sha512-jR5j4G//bRzcxwAACWi9EfITnwjNmn10LxF4NmALrdZU7/PNWP3uUCdhCxd/0SCyeiJXUl0yvD57rWAbKPs1nw==
+"@zag-js/dom-query@0.16.0":
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/@zag-js/dom-query/-/dom-query-0.16.0.tgz#bca46bcd78f78c900064478646d95f9781ed098e"
+ integrity sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==
-"@zag-js/focus-visible@0.2.1":
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/@zag-js/focus-visible/-/focus-visible-0.2.1.tgz#bf4f1009f4fd35a9728dfaa9214d8cb318fe8b1e"
- integrity sha512-19uTjoZGP4/Ax7kSNhhay9JA83BirKzpqLkeEAilrpdI1hE5xuq6q+tzJOsrMOOqJrm7LkmZp5lbsTQzvK2pYg==
+"@zag-js/element-size@0.10.5":
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.10.5.tgz#a24bad2eeb7e2c8709e32be5336e158e1a1a174f"
+ integrity sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==
+
+"@zag-js/focus-visible@0.16.0":
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz#c9e53e3dbab0f2649d04a489bb379f5800f4f069"
+ integrity sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA==
+ dependencies:
+ "@zag-js/dom-query" "0.16.0"
"@zxing/browser@0.0.7":
version "0.0.7"
@@ -2589,14 +2804,14 @@ acorn-jsx@^5.3.2:
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn-walk@^8.2.0:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
- integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa"
+ integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==
-acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0:
- version "8.8.2"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
- integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
+acorn@^8.7.1, acorn@^8.9.0:
+ version "8.11.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
+ integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
aggregate-error@^3.0.0:
version "3.1.0"
@@ -2614,7 +2829,7 @@ aggregate-error@^4.0.0:
clean-stack "^4.0.0"
indent-string "^5.0.0"
-ajv@^6.10.0, ajv@^6.12.4:
+ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -2686,27 +2901,36 @@ argparse@^2.0.1:
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-aria-hidden@^1.2.2:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.2.tgz#8c4f7cc88d73ca42114106fdf6f47e68d31475b8"
- integrity sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==
+aria-hidden@^1.2.3:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522"
+ integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==
dependencies:
tslib "^2.0.0"
+array-buffer-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
+ integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+ dependencies:
+ call-bind "^1.0.5"
+ is-array-buffer "^3.0.4"
+
array-find-index@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==
-array-includes@^3.1.5, array-includes@^3.1.6:
- version "3.1.6"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f"
- integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==
+array-includes@^3.1.6, array-includes@^3.1.7:
+ version "3.1.8"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
+ integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
- get-intrinsic "^1.1.3"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
is-string "^1.0.7"
array-union@^2.1.0:
@@ -2714,36 +2938,84 @@ array-union@^2.1.0:
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-array.prototype.flat@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2"
- integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==
+array.prototype.findlast@^1.2.4:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904"
+ integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.findlastindex@^1.2.3:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d"
+ integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
+ integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
-array.prototype.flatmap@^1.3.1:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183"
- integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==
+array.prototype.flatmap@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
+ integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
-array.prototype.tosorted@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532"
- integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==
+array.prototype.toreversed@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba"
+ integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
- get-intrinsic "^1.1.3"
+
+array.prototype.tosorted@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8"
+ integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==
+ dependencies:
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ es-abstract "^1.22.3"
+ es-errors "^1.1.0"
+ es-shim-unscopables "^1.0.2"
+
+arraybuffer.prototype.slice@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6"
+ integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ es-abstract "^1.22.3"
+ es-errors "^1.2.1"
+ get-intrinsic "^1.2.3"
+ is-array-buffer "^3.0.4"
+ is-shared-array-buffer "^1.0.2"
arrgv@^1.0.2:
version "1.0.2"
@@ -2760,15 +3032,14 @@ arrify@^3.0.0:
resolved "https://registry.yarnpkg.com/arrify/-/arrify-3.0.0.tgz#ccdefb8eaf2a1d2ab0da1ca2ce53118759fd46bc"
integrity sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==
-asn1.js@^5.2.0:
- version "5.4.1"
- resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
- integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+asn1.js@^4.10.1:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
dependencies:
bn.js "^4.0.0"
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
- safer-buffer "^2.1.0"
ava@^4.3.3:
version "4.3.3"
@@ -2821,10 +3092,12 @@ ava@^4.3.3:
write-file-atomic "^4.0.1"
yargs "^17.5.1"
-available-typed-arrays@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
- integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
babel-plugin-macros@^3.1.0:
version "3.1.0"
@@ -2853,9 +3126,9 @@ base64-js@^1.3.1:
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
binary-extensions@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
- integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
bip39-light@^1.0.7:
version "1.0.7"
@@ -2915,7 +3188,7 @@ bn.js@5.2.0:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
-bn.js@5.2.1, bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0, bn.js@^5.2.1:
+bn.js@5.2.1, bn.js@^5.0.0, bn.js@^5.2.0, bn.js@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
@@ -2964,7 +3237,7 @@ browser-readablestream-to-it@^1.0.0, browser-readablestream-to-it@^1.0.1, browse
resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76"
integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw==
-browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+browserify-aes@^1.0.4, browserify-aes@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
@@ -2995,7 +3268,7 @@ browserify-des@^1.0.0:
inherits "^2.0.1"
safe-buffer "^5.1.2"
-browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
+browserify-rsa@^4.0.0, browserify-rsa@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
@@ -3004,29 +3277,30 @@ browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
randombytes "^2.0.1"
browserify-sign@^4.0.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
- integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208"
+ integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==
dependencies:
- bn.js "^5.1.1"
- browserify-rsa "^4.0.1"
+ bn.js "^5.2.1"
+ browserify-rsa "^4.1.0"
create-hash "^1.2.0"
create-hmac "^1.1.7"
- elliptic "^6.5.3"
+ elliptic "^6.5.5"
+ hash-base "~3.0"
inherits "^2.0.4"
- parse-asn1 "^5.1.5"
- readable-stream "^3.6.0"
- safe-buffer "^5.2.0"
+ parse-asn1 "^5.1.7"
+ readable-stream "^2.3.8"
+ safe-buffer "^5.2.1"
-browserslist@^4.21.3, browserslist@^4.6.6:
- version "4.21.5"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7"
- integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==
+browserslist@^4.22.2, browserslist@^4.6.6:
+ version "4.23.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab"
+ integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
dependencies:
- caniuse-lite "^1.0.30001449"
- electron-to-chromium "^1.4.284"
- node-releases "^2.0.8"
- update-browserslist-db "^1.0.10"
+ caniuse-lite "^1.0.30001587"
+ electron-to-chromium "^1.4.668"
+ node-releases "^2.0.14"
+ update-browserslist-db "^1.0.13"
bs58@^4.0.0, bs58@^4.0.1:
version "4.0.1"
@@ -3035,11 +3309,6 @@ bs58@^4.0.0, bs58@^4.0.1:
dependencies:
base-x "^3.0.2"
-buffer-from@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
- integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-
buffer-xor@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
@@ -3068,13 +3337,16 @@ builtins@^5.0.1:
dependencies:
semver "^7.0.0"
-call-bind@^1.0.0, call-bind@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
- integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
dependencies:
- function-bind "^1.1.1"
- get-intrinsic "^1.0.2"
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
callsites@^3.0.0:
version "3.1.0"
@@ -3082,9 +3354,9 @@ callsites@^3.0.0:
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
callsites@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.0.0.tgz#8014cea4fedfe681a30e2f7d2d557dd95808a92a"
- integrity sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.1.0.tgz#de72b98612eed4e1e2564c952498677faa9d86c2"
+ integrity sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==
camelcase-keys@^6.2.2:
version "6.2.2"
@@ -3105,10 +3377,10 @@ camelcase@^6.2.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-caniuse-lite@^1.0.30001449:
- version "1.0.30001456"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001456.tgz#734ec1dbfa4f3abe6e435b78ecf40d68e8c32ce4"
- integrity sha512-XFHJY5dUgmpMV25UqaD4kVq2LsiaU5rS8fb0f17pCoXQiQslzmFgnfOxfvo1bTpTqf7dwG/N/05CnLCnOEKmzA==
+caniuse-lite@^1.0.30001587:
+ version "1.0.30001600"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079"
+ integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==
capability@^0.2.5:
version "0.2.5"
@@ -3123,11 +3395,11 @@ cbor@^8.1.0:
nofilter "^3.1.0"
cborg@^1.6.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.10.0.tgz#0fe157961dd47b537ccb84dc9ba681de8b699013"
- integrity sha512-/eM0JCaL99HDHxjySNQJLaolZFVdl6VA0/hEKIoiQPcQzE5LrG5QHdml0HaBt31brgB9dNe1zMr3f8IVrpotRQ==
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.10.2.tgz#83cd581b55b3574c816f82696307c7512db759a1"
+ integrity sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug==
-chalk@^2.0.0:
+chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -3145,14 +3417,14 @@ chalk@^4.0.0, chalk@^4.1.0:
supports-color "^7.1.0"
chalk@^5.0.1:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3"
- integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385"
+ integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
chokidar@^3.5.3:
- version "3.5.3"
- resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
- integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
@@ -3164,7 +3436,7 @@ chokidar@^3.5.3:
optionalDependencies:
fsevents "~2.3.2"
-chrome-trace-event@^1.0.2:
+chrome-trace-event@^1.0.2, chrome-trace-event@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
@@ -3175,9 +3447,9 @@ chunkd@^2.0.1:
integrity sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==
ci-info@^3.3.1:
- version "3.8.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
- integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+ integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
ci-parallel-vars@^1.0.1:
version "1.0.1"
@@ -3192,6 +3464,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
inherits "^2.0.1"
safe-buffer "^5.0.1"
+classnames@^2.2.6:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
+ integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
+
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@@ -3217,6 +3494,11 @@ cli-truncate@^3.1.0:
slice-ansi "^5.0.0"
string-width "^5.0.0"
+client-only@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
+ integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
+
cliui@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
@@ -3271,15 +3553,10 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-color2k@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/color2k/-/color2k-2.0.2.tgz#ac2b4aea11c822a6bcb70c768b5a289f4fffcebb"
- integrity sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w==
-
-commander@^2.20.0:
- version "2.20.3"
- resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
- integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+color2k@^2.0.0, color2k@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/color2k/-/color2k-2.0.3.tgz#a771244f6b6285541c82aa65ff0a0c624046e533"
+ integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==
commander@^7.0.0, commander@^7.2.0:
version "7.2.0"
@@ -3296,10 +3573,10 @@ complex.js@^2.1.1:
resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.1.1.tgz#0675dac8e464ec431fb2ab7d30f41d889fb25c31"
integrity sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==
-compute-scroll-into-view@1.0.20:
- version "1.0.20"
- resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43"
- integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==
+compute-scroll-into-view@3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz#c418900a5c56e2b04b885b54995df164535962b1"
+ integrity sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==
concat-map@0.0.1:
version "0.0.1"
@@ -3320,11 +3597,16 @@ concordance@^5.0.4:
semver "^7.3.2"
well-known-symbols "^2.0.0"
-convert-source-map@^1.5.0, convert-source-map@^1.7.0:
+convert-source-map@^1.5.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
convert-to-spaces@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b"
@@ -3337,6 +3619,11 @@ copy-to-clipboard@3.3.3, copy-to-clipboard@^3.3.3:
dependencies:
toggle-selection "^1.0.6"
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
version "7.1.0"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
@@ -3348,6 +3635,16 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
path-type "^4.0.0"
yaml "^1.10.0"
+cosmiconfig@^8.0.0:
+ version "8.3.6"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3"
+ integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==
+ dependencies:
+ import-fresh "^3.3.0"
+ js-yaml "^4.1.0"
+ parse-json "^5.2.0"
+ path-type "^4.0.0"
+
create-ecdh@^4.0.0:
version "4.0.4"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
@@ -3443,10 +3740,10 @@ csso@^4.2.0:
dependencies:
css-tree "^1.1.2"
-csstype@^3.0.11, csstype@^3.0.2:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
- integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
+csstype@^3.0.11, csstype@^3.0.2, csstype@^3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
currently-unhandled@^0.4.1:
version "0.4.1"
@@ -3455,6 +3752,38 @@ currently-unhandled@^0.4.1:
dependencies:
array-find-index "^1.0.1"
+data-view-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
+ integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2"
+ integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a"
+ integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+date-fns@^3.3.1:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf"
+ integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==
+
date-time@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/date-time/-/date-time-3.1.0.tgz#0d1e934d170579f481ed8df1e2b8ff70ee845e1e"
@@ -3500,15 +3829,25 @@ deep-is@^0.1.3:
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
deepmerge@^4.2.2:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b"
- integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
-define-properties@^1.1.3, define-properties@^1.1.4:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5"
- integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
dependencies:
+ define-data-property "^1.0.1"
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
@@ -3537,9 +3876,9 @@ depd@~1.1.2:
integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
des.js@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
- integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da"
+ integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==
dependencies:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
@@ -3549,6 +3888,11 @@ detect-libc@^1.0.3:
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
+detect-libc@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
+ integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
+
detect-node-es@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493"
@@ -3564,9 +3908,9 @@ diffie-hellman@^5.0.0:
randombytes "^2.0.0"
dijkstrajs@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257"
- integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23"
+ integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==
dir-glob@^3.0.1:
version "3.0.1"
@@ -3634,9 +3978,9 @@ dotenv-expand@^5.1.0:
integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
dotenv@^16.0.3:
- version "16.0.3"
- resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07"
- integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==
+ version "16.4.5"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
+ integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
dotenv@^7.0.0:
version "7.0.0"
@@ -3655,15 +3999,15 @@ electron-fetch@^1.7.2:
dependencies:
encoding "^0.1.13"
-electron-to-chromium@^1.4.284:
- version "1.4.296"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.296.tgz#dbc84a25c25a432a12fbf62903cae4a87461eb8c"
- integrity sha512-i/6Q+Y9bluDa2a0NbMvdtG5TuS/1Fr3TKK8L+7UUL9QjRS5iFJzCC3r70xjyOnLiYG8qGV4/mMpe6HuAbdJW4w==
+electron-to-chromium@^1.4.668:
+ version "1.4.715"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz#bb16bcf2a3537962fccfa746b5c98c5f7404ff46"
+ integrity sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==
-elliptic@^6.5.3:
- version "6.5.4"
- resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
- integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+elliptic@^6.5.3, elliptic@^6.5.5:
+ version "6.5.5"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded"
+ integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==
dependencies:
bn.js "^4.11.9"
brorand "^1.1.0"
@@ -3711,9 +4055,9 @@ entities@^3.0.1:
integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
entities@^4.4.0:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
- integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
err-code@^3.0.1:
version "3.0.1"
@@ -3736,60 +4080,112 @@ error-polyfill@^0.1.3:
o3 "^1.0.3"
u3 "^0.1.1"
-es-abstract@^1.19.0, es-abstract@^1.20.4:
- version "1.21.1"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6"
- integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==
- dependencies:
- available-typed-arrays "^1.0.5"
- call-bind "^1.0.2"
- es-set-tostringtag "^2.0.1"
+es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2:
+ version "1.23.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0"
+ integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ arraybuffer.prototype.slice "^1.0.3"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ data-view-buffer "^1.0.1"
+ data-view-byte-length "^1.0.1"
+ data-view-byte-offset "^1.0.0"
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-set-tostringtag "^2.0.3"
es-to-primitive "^1.2.1"
- function-bind "^1.1.1"
- function.prototype.name "^1.1.5"
- get-intrinsic "^1.1.3"
- get-symbol-description "^1.0.0"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.4"
+ get-symbol-description "^1.0.2"
globalthis "^1.0.3"
gopd "^1.0.1"
- has "^1.0.3"
- has-property-descriptors "^1.0.0"
- has-proto "^1.0.1"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.0.3"
has-symbols "^1.0.3"
- internal-slot "^1.0.4"
- is-array-buffer "^3.0.1"
+ hasown "^2.0.2"
+ internal-slot "^1.0.7"
+ is-array-buffer "^3.0.4"
is-callable "^1.2.7"
- is-negative-zero "^2.0.2"
+ is-data-view "^1.0.1"
+ is-negative-zero "^2.0.3"
is-regex "^1.1.4"
- is-shared-array-buffer "^1.0.2"
+ is-shared-array-buffer "^1.0.3"
is-string "^1.0.7"
- is-typed-array "^1.1.10"
+ is-typed-array "^1.1.13"
is-weakref "^1.0.2"
- object-inspect "^1.12.2"
+ object-inspect "^1.13.1"
object-keys "^1.1.1"
- object.assign "^4.1.4"
- regexp.prototype.flags "^1.4.3"
- safe-regex-test "^1.0.0"
- string.prototype.trimend "^1.0.6"
- string.prototype.trimstart "^1.0.6"
- typed-array-length "^1.0.4"
+ object.assign "^4.1.5"
+ regexp.prototype.flags "^1.5.2"
+ safe-array-concat "^1.1.2"
+ safe-regex-test "^1.0.3"
+ string.prototype.trim "^1.2.9"
+ string.prototype.trimend "^1.0.8"
+ string.prototype.trimstart "^1.0.7"
+ typed-array-buffer "^1.0.2"
+ typed-array-byte-length "^1.0.1"
+ typed-array-byte-offset "^1.0.2"
+ typed-array-length "^1.0.5"
unbox-primitive "^1.0.2"
- which-typed-array "^1.1.9"
+ which-typed-array "^1.1.15"
-es-set-tostringtag@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
- integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
dependencies:
- get-intrinsic "^1.1.3"
- has "^1.0.3"
- has-tostringtag "^1.0.0"
+ get-intrinsic "^1.2.4"
+
+es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-iterator-helpers@^1.0.17:
+ version "1.0.18"
+ resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d"
+ integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.0"
+ es-errors "^1.3.0"
+ es-set-tostringtag "^2.0.3"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ globalthis "^1.0.3"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.0.3"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.7"
+ iterator.prototype "^1.1.2"
+ safe-array-concat "^1.1.2"
-es-shim-unscopables@^1.0.0:
+es-object-atoms@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
- integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+ integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
+ integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.1"
+
+es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+ integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
dependencies:
- has "^1.0.3"
+ hasown "^2.0.0"
es-to-primitive@^1.2.1:
version "1.2.1"
@@ -3801,9 +4197,9 @@ es-to-primitive@^1.2.1:
is-symbol "^1.0.2"
escalade@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
- integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
+ integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
escape-latex@^1.2.0:
version "1.2.0"
@@ -3831,9 +4227,9 @@ escape-string-regexp@^4.0.0:
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-config-prettier@^8.6.0:
- version "8.6.0"
- resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207"
- integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11"
+ integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==
eslint-config-standard-with-typescript@^33.0.0:
version "33.0.0"
@@ -3848,19 +4244,19 @@ eslint-config-standard@17.0.0:
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz#fd5b6cf1dcf6ba8d29f200c461de2e19069888cf"
integrity sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==
-eslint-import-resolver-node@^0.3.7:
- version "0.3.7"
- resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7"
- integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==
+eslint-import-resolver-node@^0.3.9:
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac"
+ integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
dependencies:
debug "^3.2.7"
- is-core-module "^2.11.0"
- resolve "^1.22.1"
+ is-core-module "^2.13.0"
+ resolve "^1.22.4"
-eslint-module-utils@^2.7.4:
- version "2.7.4"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974"
- integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==
+eslint-module-utils@^2.8.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34"
+ integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==
dependencies:
debug "^3.2.7"
@@ -3873,30 +4269,32 @@ eslint-plugin-es@^4.1.0:
regexpp "^3.0.0"
eslint-plugin-import@^2.25.2:
- version "2.27.5"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65"
- integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==
- dependencies:
- array-includes "^3.1.6"
- array.prototype.flat "^1.3.1"
- array.prototype.flatmap "^1.3.1"
+ version "2.29.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643"
+ integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==
+ dependencies:
+ array-includes "^3.1.7"
+ array.prototype.findlastindex "^1.2.3"
+ array.prototype.flat "^1.3.2"
+ array.prototype.flatmap "^1.3.2"
debug "^3.2.7"
doctrine "^2.1.0"
- eslint-import-resolver-node "^0.3.7"
- eslint-module-utils "^2.7.4"
- has "^1.0.3"
- is-core-module "^2.11.0"
+ eslint-import-resolver-node "^0.3.9"
+ eslint-module-utils "^2.8.0"
+ hasown "^2.0.0"
+ is-core-module "^2.13.1"
is-glob "^4.0.3"
minimatch "^3.1.2"
- object.values "^1.1.6"
- resolve "^1.22.1"
- semver "^6.3.0"
- tsconfig-paths "^3.14.1"
+ object.fromentries "^2.0.7"
+ object.groupby "^1.0.1"
+ object.values "^1.1.7"
+ semver "^6.3.1"
+ tsconfig-paths "^3.15.0"
eslint-plugin-n@^15.0.0:
- version "15.6.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz#f7e77f24abb92a550115cf11e29695da122c398c"
- integrity sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==
+ version "15.7.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90"
+ integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==
dependencies:
builtins "^5.0.1"
eslint-plugin-es "^4.1.0"
@@ -3920,25 +4318,28 @@ eslint-plugin-promise@^6.0.0:
integrity sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==
eslint-plugin-react@^7.32.2:
- version "7.32.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10"
- integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==
- dependencies:
- array-includes "^3.1.6"
- array.prototype.flatmap "^1.3.1"
- array.prototype.tosorted "^1.1.1"
+ version "7.34.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997"
+ integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==
+ dependencies:
+ array-includes "^3.1.7"
+ array.prototype.findlast "^1.2.4"
+ array.prototype.flatmap "^1.3.2"
+ array.prototype.toreversed "^1.1.2"
+ array.prototype.tosorted "^1.1.3"
doctrine "^2.1.0"
+ es-iterator-helpers "^1.0.17"
estraverse "^5.3.0"
jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.1.2"
- object.entries "^1.1.6"
- object.fromentries "^2.0.6"
- object.hasown "^1.1.2"
- object.values "^1.1.6"
+ object.entries "^1.1.7"
+ object.fromentries "^2.0.7"
+ object.hasown "^1.1.3"
+ object.values "^1.1.7"
prop-types "^15.8.1"
- resolve "^2.0.0-next.4"
- semver "^6.3.0"
- string.prototype.matchall "^4.0.8"
+ resolve "^2.0.0-next.5"
+ semver "^6.3.1"
+ string.prototype.matchall "^4.0.10"
eslint-plugin-simple-import-sort@^10.0.0:
version "10.0.0"
@@ -3965,10 +4366,10 @@ eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-scope@^7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
- integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
+eslint-scope@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
+ integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
dependencies:
esrecurse "^4.3.0"
estraverse "^5.2.0"
@@ -3997,74 +4398,73 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint-visitor-keys@^3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
- integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@^8.0.1:
- version "8.34.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.34.0.tgz#fe0ab0ef478104c1f9ebc5537e303d25a8fb22d6"
- integrity sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==
- dependencies:
- "@eslint/eslintrc" "^1.4.1"
- "@humanwhocodes/config-array" "^0.11.8"
+ version "8.57.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668"
+ integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.6.1"
+ "@eslint/eslintrc" "^2.1.4"
+ "@eslint/js" "8.57.0"
+ "@humanwhocodes/config-array" "^0.11.14"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
- ajv "^6.10.0"
+ "@ungap/structured-clone" "^1.2.0"
+ ajv "^6.12.4"
chalk "^4.0.0"
cross-spawn "^7.0.2"
debug "^4.3.2"
doctrine "^3.0.0"
escape-string-regexp "^4.0.0"
- eslint-scope "^7.1.1"
- eslint-utils "^3.0.0"
- eslint-visitor-keys "^3.3.0"
- espree "^9.4.0"
- esquery "^1.4.0"
+ eslint-scope "^7.2.2"
+ eslint-visitor-keys "^3.4.3"
+ espree "^9.6.1"
+ esquery "^1.4.2"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
find-up "^5.0.0"
glob-parent "^6.0.2"
globals "^13.19.0"
- grapheme-splitter "^1.0.4"
+ graphemer "^1.4.0"
ignore "^5.2.0"
- import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
is-path-inside "^3.0.3"
- js-sdsl "^4.1.4"
js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
minimatch "^3.1.2"
natural-compare "^1.4.0"
- optionator "^0.9.1"
- regexpp "^3.2.0"
+ optionator "^0.9.3"
strip-ansi "^6.0.1"
- strip-json-comments "^3.1.0"
text-table "^0.2.0"
-espree@^9.4.0:
- version "9.4.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd"
- integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==
+espree@^9.6.0, espree@^9.6.1:
+ version "9.6.1"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
dependencies:
- acorn "^8.8.0"
+ acorn "^8.9.0"
acorn-jsx "^5.3.2"
- eslint-visitor-keys "^3.3.0"
+ eslint-visitor-keys "^3.4.1"
esprima@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-esquery@^1.4.0:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.2.tgz#c6d3fee05dd665808e2ad870631f221f5617b1d1"
- integrity sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==
+esquery@^1.4.2:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+ integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
dependencies:
estraverse "^5.1.0"
@@ -4114,19 +4514,19 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-diff@^1.1.2, fast-diff@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
- integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
+ integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
fast-fifo@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.1.0.tgz#17d1a3646880b9891dfa0c54e69c5fef33cad779"
- integrity sha512-Kl29QoNbNvn4nhDsLYjyIAaIqaJB6rBx5p3sL9VjaefJ+eMFBWVZiaoguaoZfzEKr5RhAti0UgM8703akGPJ6g==
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
+ integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
-fast-glob@^3.2.11, fast-glob@^3.2.9:
- version "3.2.12"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
- integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
+fast-glob@^3.2.9, fast-glob@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -4145,9 +4545,9 @@ fast-levenshtein@^2.0.6:
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fastq@^1.6.0:
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
- integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==
+ version "1.17.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
dependencies:
reusify "^1.0.4"
@@ -4203,22 +4603,23 @@ find-up@^6.0.0:
path-exists "^5.0.0"
flat-cache@^3.0.4:
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
- integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
dependencies:
- flatted "^3.1.0"
+ flatted "^3.2.9"
+ keyv "^4.5.3"
rimraf "^3.0.2"
-flatted@^3.1.0:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
- integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
+flatted@^3.2.9:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
+ integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
-focus-lock@^0.11.6:
- version "0.11.6"
- resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.11.6.tgz#e8821e21d218f03e100f7dc27b733f9c4f61e683"
- integrity sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==
+focus-lock@^1.3.2:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-1.3.4.tgz#a143aa327224df2e83414f87e8a3328cb5a62156"
+ integrity sha512-Gv0N3mvej3pD+HWkNryrF8sExzEHqhQ6OSFxD4DPxm9n5HGCaHme98ZMBZroNEAJcsdtHxk+skvThGKyUeoEGA==
dependencies:
tslib "^2.0.3"
@@ -4229,10 +4630,10 @@ for-each@^0.3.3:
dependencies:
is-callable "^1.1.3"
-fraction.js@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950"
- integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==
+fraction.js@4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.4.tgz#b2bac8249a610c3396106da97c5a71da75b94b1c"
+ integrity sha512-pwiTgt0Q7t+GHZA4yaLjObx4vXmmdcS0iSJ19o8d/goUGgItX9UZWKWNnLHehxviD8wU2IWRsnR8cD5+yOJP2Q==
framer-motion@^8.5.5:
version "8.5.5"
@@ -4270,26 +4671,26 @@ fs@^0.0.1-security:
integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==
fsevents@~2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
- integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
-function-bind@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
- integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-function.prototype.name@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
- integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
+function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
+ integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
dependencies:
call-bind "^1.0.2"
- define-properties "^1.1.3"
- es-abstract "^1.19.0"
- functions-have-names "^1.2.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ functions-have-names "^1.2.3"
-functions-have-names@^1.2.2:
+functions-have-names@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
@@ -4304,14 +4705,16 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f"
- integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
dependencies:
- function-bind "^1.1.1"
- has "^1.0.3"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
has-symbols "^1.0.3"
+ hasown "^2.0.0"
get-iterator@^1.0.2:
version "1.0.2"
@@ -4328,13 +4731,14 @@ get-port@^4.2.0:
resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.2.0.tgz#e37368b1e863b7629c43c5a323625f95cf24b119"
integrity sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==
-get-symbol-description@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
- integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+get-symbol-description@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5"
+ integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.1.1"
+ call-bind "^1.0.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
@@ -4368,9 +4772,9 @@ globals@^11.1.0:
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^13.19.0, globals@^13.2.0:
- version "13.20.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
- integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
+ version "13.24.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
dependencies:
type-fest "^0.20.2"
@@ -4394,13 +4798,13 @@ globby@^11.0.1, globby@^11.1.0:
slash "^3.0.0"
globby@^13.1.1:
- version "13.1.3"
- resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff"
- integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==
+ version "13.2.2"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592"
+ integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==
dependencies:
dir-glob "^3.0.1"
- fast-glob "^3.2.11"
- ignore "^5.2.0"
+ fast-glob "^3.3.0"
+ ignore "^5.2.4"
merge2 "^1.4.1"
slash "^4.0.0"
@@ -4412,14 +4816,14 @@ gopd@^1.0.1:
get-intrinsic "^1.1.3"
graceful-fs@^4.2.4:
- version "4.2.10"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
- integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
-grapheme-splitter@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
- integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
hamt-sharding@^2.0.0:
version "2.0.1"
@@ -4449,36 +4853,29 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-has-property-descriptors@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
- integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
dependencies:
- get-intrinsic "^1.1.1"
+ es-define-property "^1.0.0"
-has-proto@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
- integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+has-proto@^1.0.1, has-proto@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
has-symbols@^1.0.2, has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
-has-tostringtag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
- integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
- dependencies:
- has-symbols "^1.0.2"
-
-has@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
- integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
- function-bind "^1.1.1"
+ has-symbols "^1.0.3"
hash-base@^3.0.0:
version "3.1.0"
@@ -4489,6 +4886,14 @@ hash-base@^3.0.0:
readable-stream "^3.6.0"
safe-buffer "^5.2.0"
+hash-base@~3.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
hash.js@^1.0.0, hash.js@^1.0.3:
version "1.1.7"
resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
@@ -4497,6 +4902,13 @@ hash.js@^1.0.0, hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
hey-listen@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68"
@@ -4531,11 +4943,11 @@ hosted-git-info@^4.0.1:
lru-cache "^6.0.0"
htmlnano@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-2.0.3.tgz#50ee639ed63357d4a6c01309f52a35892e4edc2e"
- integrity sha512-S4PGGj9RbdgW8LhbILNK7W9JhmYP8zmDY7KDV/8eCiJBQJlbmltp5I0gv8c5ntLljfdxxfmJ+UJVSqyH4mb41A==
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-2.1.0.tgz#67b31b3cd3fad23f0b610ca628fdb48382209c3c"
+ integrity sha512-jVGRE0Ep9byMBKEu0Vxgl8dhXYOUk0iNQ2pjsG+BcRB0u0oDF5A9p/iBGMg/PGKYUyMD0OAGu8dVT5Lzj8S58g==
dependencies:
- cosmiconfig "^7.0.1"
+ cosmiconfig "^8.0.0"
posthtml "^0.16.5"
timsort "^0.3.0"
@@ -4568,11 +4980,9 @@ iconv-lite@^0.6.2:
safer-buffer ">= 2.1.2 < 3.0.0"
idb-keyval@^6.0.3, idb-keyval@^6.2.0:
- version "6.2.0"
- resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.0.tgz#3af94a3cc0689d6ee0bc9e045d2a3340ea897173"
- integrity sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==
- dependencies:
- safari-14-idb-fix "^3.0.0"
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33"
+ integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==
ieee754@^1.1.13, ieee754@^1.2.1:
version "1.2.1"
@@ -4584,12 +4994,12 @@ ignore-by-default@^2.1.0:
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-2.1.0.tgz#c0e0de1a99b6065bdc93315a6f728867981464db"
integrity sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==
-ignore@^5.1.1, ignore@^5.2.0:
- version "5.2.4"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
- integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
+ignore@^5.1.1, ignore@^5.2.0, ignore@^5.2.4:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
+ integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
-import-fresh@^3.0.0, import-fresh@^3.2.1:
+import-fresh@^3.2.1, import-fresh@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
@@ -4620,7 +5030,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -4647,13 +5057,13 @@ interface-store@^2.0.1, interface-store@^2.0.2:
resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-2.0.2.tgz#83175fd2b0c501585ed96db54bb8ba9d55fce34c"
integrity sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg==
-internal-slot@^1.0.3, internal-slot@^1.0.4:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
- integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
+internal-slot@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
+ integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
dependencies:
- get-intrinsic "^1.2.0"
- has "^1.0.3"
+ es-errors "^1.3.0"
+ hasown "^2.0.0"
side-channel "^1.0.4"
invariant@^2.2.4:
@@ -4798,9 +5208,9 @@ ipfs-utils@^9.0.2:
stream-to-it "^0.2.2"
irregular-plurals@^3.3.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.4.0.tgz#4be22a18af7c428e6480163d0de555e343b876db"
- integrity sha512-YXxECO/W6N9aMBVKMKKZ8TXESgq7EFrp3emCGGUcrYY1cgJIeZjoB75MTu8qi+NAKntS9NwPU8VdcQ3r6E6aWQ==
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b"
+ integrity sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==
is-arguments@^1.0.4:
version "1.1.1"
@@ -4810,20 +5220,26 @@ is-arguments@^1.0.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-array-buffer@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a"
- integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==
+is-array-buffer@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
+ integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
dependencies:
call-bind "^1.0.2"
- get-intrinsic "^1.1.3"
- is-typed-array "^1.1.10"
+ get-intrinsic "^1.2.1"
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+is-async-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
+ integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
is-bigint@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
@@ -4851,14 +5267,21 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
-is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0:
- version "2.11.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
- integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
+is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0:
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
+ integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+ dependencies:
+ hasown "^2.0.0"
+
+is-data-view@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f"
+ integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
dependencies:
- has "^1.0.3"
+ is-typed-array "^1.1.13"
-is-date-object@^1.0.1:
+is-date-object@^1.0.1, is-date-object@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
@@ -4880,6 +5303,13 @@ is-extglob@^2.1.1:
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+is-finalizationregistry@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6"
+ integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==
+ dependencies:
+ call-bind "^1.0.2"
+
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
@@ -4890,7 +5320,7 @@ is-fullwidth-code-point@^4.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
-is-generator-function@^1.0.7:
+is-generator-function@^1.0.10, is-generator-function@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
@@ -4916,10 +5346,15 @@ is-json@^2.0.1:
resolved "https://registry.yarnpkg.com/is-json/-/is-json-2.0.1.tgz#6be166d144828a131d686891b983df62c39491ff"
integrity sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==
-is-negative-zero@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
- integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+is-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
+ integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
+
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
is-number-object@^1.0.4:
version "1.0.7"
@@ -4971,12 +5406,17 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-shared-array-buffer@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
- integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+is-set@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
+ integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
+
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
+ integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
dependencies:
- call-bind "^1.0.2"
+ call-bind "^1.0.7"
is-string@^1.0.5, is-string@^1.0.7:
version "1.0.7"
@@ -4992,22 +5432,23 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies:
has-symbols "^1.0.2"
-is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9:
- version "1.1.10"
- resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
- integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
+is-typed-array@^1.1.13, is-typed-array@^1.1.3:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
+ integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
dependencies:
- available-typed-arrays "^1.0.5"
- call-bind "^1.0.2"
- for-each "^0.3.3"
- gopd "^1.0.1"
- has-tostringtag "^1.0.0"
+ which-typed-array "^1.1.14"
is-unicode-supported@^1.2.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714"
integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==
+is-weakmap@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
+ integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
+
is-weakref@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
@@ -5015,6 +5456,24 @@ is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
+is-weakset@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007"
+ integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==
+ dependencies:
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -5102,16 +5561,22 @@ it-to-stream@^1.0.0:
p-fifo "^1.0.0"
readable-stream "^3.6.0"
+iterator.prototype@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0"
+ integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
+ dependencies:
+ define-properties "^1.2.1"
+ get-intrinsic "^1.2.1"
+ has-symbols "^1.0.3"
+ reflect.getprototypeof "^1.0.4"
+ set-function-name "^2.0.1"
+
javascript-natural-sort@^0.7.1:
version "0.7.1"
resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59"
integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==
-js-sdsl@^4.1.4:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.3.0.tgz#aeefe32a451f7af88425b11fdb5f58c90ae1d711"
- integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==
-
js-sha256@^0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
@@ -5147,6 +5612,11 @@ jsesc@^2.5.1:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
json-parse-even-better-errors@^2.3.0:
version "2.3.1"
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
@@ -5162,35 +5632,37 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
-json5@^1.0.1:
+json5@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
dependencies:
minimist "^1.2.0"
-json5@^2.2.0, json5@^2.2.1, json5@^2.2.2:
+json5@^2.2.0, json5@^2.2.1, json5@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
jsonc-parser@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76"
- integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a"
+ integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==
"jsx-ast-utils@^2.4.1 || ^3.0.0":
- version "3.3.3"
- resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea"
- integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==
+ version "3.3.5"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a"
+ integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==
dependencies:
- array-includes "^3.1.5"
- object.assign "^4.1.3"
+ array-includes "^3.1.6"
+ array.prototype.flat "^1.3.1"
+ object.assign "^4.1.4"
+ object.values "^1.1.6"
keypom-js@^1.4.7:
- version "1.4.7"
- resolved "https://registry.yarnpkg.com/keypom-js/-/keypom-js-1.4.7.tgz#0dce51f29432a63c205a5cc03d1d672c8f905031"
- integrity sha512-tY6QFAKQCEsPgB9tkfc9+yqmVVzZNJOmfQoxewl4uAsuqw1qcAnaPM/NYb15BHsFZlJ7QDnhw8TWvaFHDxvetQ==
+ version "1.4.9"
+ resolved "https://registry.yarnpkg.com/keypom-js/-/keypom-js-1.4.9.tgz#360079f2e371b971d8f2a1c5ddb1b9d5a234ec1a"
+ integrity sha512-xyBmDuG8u4vD9EtL/kRIqj5eAl1wsOJ7ajAOAFiKuJAcF2zZMB/XOWMVdnkqKF3zQgSujPEu/AL0UycuBU7A+A==
dependencies:
"@near-wallet-selector/core" "^7.9.1"
"@types/react" "^18.0.26"
@@ -5206,6 +5678,13 @@ keypom-js@^1.4.7:
typescript "^4.8.4"
util "^0.12.5"
+keyv@^4.5.3:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
@@ -5219,84 +5698,90 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
-lightningcss-darwin-arm64@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz#56ab071e932f845dbb7667f44f5b78441175a343"
- integrity sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==
-
-lightningcss-darwin-x64@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz#c867308b88859ba61a2c46c82b1ca52ff73a1bd0"
- integrity sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==
-
-lightningcss-linux-arm-gnueabihf@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz#0f921dc45f2e5c3aea70fab98844ac0e5f2f81be"
- integrity sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==
-
-lightningcss-linux-arm64-gnu@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz#027f9df9c7f4ffa127c37a71726245a5794d7ba2"
- integrity sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==
-
-lightningcss-linux-arm64-musl@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz#85ea987da868524eac6db94f8e1eaa23d0b688a3"
- integrity sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==
-
-lightningcss-linux-x64-gnu@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz#02bec89579ab4153dccc0def755d1fd9e3ee7f3c"
- integrity sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==
-
-lightningcss-linux-x64-musl@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz#e36a5df8193ae961d22974635e4c100a1823bb8c"
- integrity sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==
-
-lightningcss-win32-x64-msvc@1.19.0:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz#0854dbd153035eca1396e2227c708ad43655a61c"
- integrity sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==
-
-lightningcss@^1.16.1:
- version "1.19.0"
- resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.19.0.tgz#fbbad0975de66252e38d96b5bdd2a62f2dd0ffbf"
- integrity sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==
+lightningcss-darwin-arm64@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.24.1.tgz#551735defa1e092ecf91244ca081f65f10ebd5f0"
+ integrity sha512-1jQ12jBy+AE/73uGQWGSafK5GoWgmSiIQOGhSEXiFJSZxzV+OXIx+a9h2EYHxdJfX864M+2TAxWPWb0Vv+8y4w==
+
+lightningcss-darwin-x64@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.24.1.tgz#5acb1338ac0aae38e405efd854ed97ba11509eea"
+ integrity sha512-R4R1d7VVdq2mG4igMU+Di8GPf0b64ZLnYVkubYnGG0Qxq1KaXQtAzcLI43EkpnoWvB/kUg8JKCWH4S13NfiLcQ==
+
+lightningcss-freebsd-x64@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.24.1.tgz#ff692c41ed0bbf37ab5a239db4c2fc04c11195e6"
+ integrity sha512-z6NberUUw5ALES6Ixn2shmjRRrM1cmEn1ZQPiM5IrZ6xHHL5a1lPin9pRv+w6eWfcrEo+qGG6R9XfJrpuY3e4g==
+
+lightningcss-linux-arm-gnueabihf@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.24.1.tgz#ba41556f4422a6a889553ad897898a314386153e"
+ integrity sha512-NLQLnBQW/0sSg74qLNI8F8QKQXkNg4/ukSTa+XhtkO7v3BnK19TS1MfCbDHt+TTdSgNEBv0tubRuapcKho2EWw==
+
+lightningcss-linux-arm64-gnu@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.24.1.tgz#6b569b6078634233bc470c4179dd67e535f22d73"
+ integrity sha512-AQxWU8c9E9JAjAi4Qw9CvX2tDIPjgzCTrZCSXKELfs4mCwzxRkHh2RCxX8sFK19RyJoJAjA/Kw8+LMNRHS5qEg==
+
+lightningcss-linux-arm64-musl@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.24.1.tgz#644abd32c09c87228bfb5dda21e8d3f75da6f731"
+ integrity sha512-JCgH/SrNrhqsguUA0uJUM1PvN5+dVuzPIlXcoWDHSv2OU/BWlj2dUYr3XNzEw748SmNZPfl2NjQrAdzaPOn1lA==
+
+lightningcss-linux-x64-gnu@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.24.1.tgz#0633f2daa2b6a2806abd497337346c2941865eec"
+ integrity sha512-TYdEsC63bHV0h47aNRGN3RiK7aIeco3/keN4NkoSQ5T8xk09KHuBdySltWAvKLgT8JvR+ayzq8ZHnL1wKWY0rw==
+
+lightningcss-linux-x64-musl@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.24.1.tgz#6ed1714737e4af2249ed10f431bc8137bd6cc4c7"
+ integrity sha512-HLfzVik3RToot6pQ2Rgc3JhfZkGi01hFetHt40HrUMoeKitLoqUUT5owM6yTZPTytTUW9ukLBJ1pc3XNMSvlLw==
+
+lightningcss-win32-x64-msvc@1.24.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.24.1.tgz#bd6b562d902e0f92904ac3754c722d9e63e00480"
+ integrity sha512-joEupPjYJ7PjZtDsS5lzALtlAudAbgIBMGJPNeFe5HfdmJXFd13ECmEM+5rXNxYVMRHua2w8132R6ab5Z6K9Ow==
+
+lightningcss@^1.22.1:
+ version "1.24.1"
+ resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.24.1.tgz#8b86a5ee6e6ae9e035ff92892bd047b8d687581e"
+ integrity sha512-kUpHOLiH5GB0ERSv4pxqlL0RYKnOXtgGtVe7shDGfhS0AZ4D1ouKFYAcLcZhql8aMspDNzaUCumGHZ78tb2fTg==
dependencies:
detect-libc "^1.0.3"
optionalDependencies:
- lightningcss-darwin-arm64 "1.19.0"
- lightningcss-darwin-x64 "1.19.0"
- lightningcss-linux-arm-gnueabihf "1.19.0"
- lightningcss-linux-arm64-gnu "1.19.0"
- lightningcss-linux-arm64-musl "1.19.0"
- lightningcss-linux-x64-gnu "1.19.0"
- lightningcss-linux-x64-musl "1.19.0"
- lightningcss-win32-x64-msvc "1.19.0"
+ lightningcss-darwin-arm64 "1.24.1"
+ lightningcss-darwin-x64 "1.24.1"
+ lightningcss-freebsd-x64 "1.24.1"
+ lightningcss-linux-arm-gnueabihf "1.24.1"
+ lightningcss-linux-arm64-gnu "1.24.1"
+ lightningcss-linux-arm64-musl "1.24.1"
+ lightningcss-linux-x64-gnu "1.24.1"
+ lightningcss-linux-x64-musl "1.24.1"
+ lightningcss-win32-x64-msvc "1.24.1"
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
-lmdb@2.5.2:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-2.5.2.tgz#37e28a9fb43405f4dc48c44cec0e13a14c4a6ff1"
- integrity sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==
+lmdb@2.8.5:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/lmdb/-/lmdb-2.8.5.tgz#ce191110c755c0951caa062722e300c703973837"
+ integrity sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==
dependencies:
- msgpackr "^1.5.4"
- node-addon-api "^4.3.0"
- node-gyp-build-optional-packages "5.0.3"
- ordered-binary "^1.2.4"
+ msgpackr "^1.9.5"
+ node-addon-api "^6.1.0"
+ node-gyp-build-optional-packages "5.1.1"
+ ordered-binary "^1.4.1"
weak-lru-cache "^1.2.2"
optionalDependencies:
- "@lmdb/lmdb-darwin-arm64" "2.5.2"
- "@lmdb/lmdb-darwin-x64" "2.5.2"
- "@lmdb/lmdb-linux-arm" "2.5.2"
- "@lmdb/lmdb-linux-arm64" "2.5.2"
- "@lmdb/lmdb-linux-x64" "2.5.2"
- "@lmdb/lmdb-win32-x64" "2.5.2"
+ "@lmdb/lmdb-darwin-arm64" "2.8.5"
+ "@lmdb/lmdb-darwin-x64" "2.8.5"
+ "@lmdb/lmdb-linux-arm" "2.8.5"
+ "@lmdb/lmdb-linux-arm64" "2.8.5"
+ "@lmdb/lmdb-linux-x64" "2.8.5"
+ "@lmdb/lmdb-win32-x64" "2.8.5"
load-json-file@^7.0.0:
version "7.0.1"
@@ -5365,6 +5850,11 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
+luxon@^3.4.4:
+ version "3.4.4"
+ resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af"
+ integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==
+
map-age-cleaner@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
@@ -5390,19 +5880,19 @@ matcher@^5.0.0:
escape-string-regexp "^5.0.0"
mathjs@^11.5.1:
- version "11.5.1"
- resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-11.5.1.tgz#34198c17a9bc563bb83255cdbecb824a6b38e1a4"
- integrity sha512-9r35KHkpywim2hfYhJS3QHnKS7u61CODQcYPbJZ6Rov2jXDOAun07mM+8a7SRsJKfiMxtWWMJeiHQXTEnnHyoQ==
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-11.12.0.tgz#e933e5941930d44763ddfc5bfb08b90059449b2c"
+ integrity sha512-UGhVw8rS1AyedyI55DGz9q1qZ0p98kyKPyc9vherBkoueLntPfKtPBh14x+V4cdUWK0NZV2TBwqRFlvadscSuw==
dependencies:
- "@babel/runtime" "^7.20.13"
+ "@babel/runtime" "^7.23.2"
complex.js "^2.1.1"
decimal.js "^10.4.3"
escape-latex "^1.2.0"
- fraction.js "^4.2.0"
+ fraction.js "4.3.4"
javascript-natural-sort "^0.7.1"
seedrandom "^3.0.5"
tiny-emitter "^2.1.0"
- typed-function "^4.1.0"
+ typed-function "^4.1.1"
md5-hex@^3.0.1:
version "3.0.1"
@@ -5537,26 +6027,26 @@ ms@^2.1.1, ms@^2.1.3:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-msgpackr-extract@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.0.tgz#5b5c5fbfff25be5ee5b5a82a9cbe02e37f72bed0"
- integrity sha512-oy6KCk1+X4Bn5m6Ycq5N1EWl9npqG/cLrE8ga8NX7ZqfqYUUBS08beCQaGq80fjbKBySur0E6x//yZjzNJDt3A==
+msgpackr-extract@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz#e05ec1bb4453ddf020551bcd5daaf0092a2c279d"
+ integrity sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==
dependencies:
node-gyp-build-optional-packages "5.0.7"
optionalDependencies:
- "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.0"
- "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.0"
- "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.0"
- "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.0"
- "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.0"
- "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.0"
-
-msgpackr@^1.5.4:
- version "1.8.3"
- resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.8.3.tgz#78c1b91359f72707f4abeaca40cc423bd2d75185"
- integrity sha512-m2JefwcKNzoHYXkH/5jzHRxAw7XLWsAdvu0FOJ+OLwwozwOV/J6UA62iLkfIMbg7G8+dIuRwgg6oz+QoQ4YkoA==
+ "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.2"
+ "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.2"
+ "@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.2"
+ "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.2"
+ "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.2"
+ "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.2"
+
+msgpackr@^1.9.5, msgpackr@^1.9.9:
+ version "1.10.1"
+ resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.10.1.tgz#51953bb4ce4f3494f0c4af3f484f01cfbb306555"
+ integrity sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==
optionalDependencies:
- msgpackr-extract "^3.0.0"
+ msgpackr-extract "^3.0.2"
multiaddr-to-uri@^8.0.0:
version "8.0.0"
@@ -5593,9 +6083,9 @@ mustache@^4.0.0:
integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==
nanoid@^3.0.2, nanoid@^3.1.20, nanoid@^3.1.23:
- version "3.3.4"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
- integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
native-abort-controller@^1.0.3:
version "1.0.4"
@@ -5670,42 +6160,39 @@ near-seed-phrase@^0.2.0:
near-hd-key "^1.2.1"
tweetnacl "^1.0.2"
-node-addon-api@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
- integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
+node-addon-api@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76"
+ integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==
-node-addon-api@^4.3.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
- integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
+node-addon-api@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.0.tgz#71f609369379c08e251c558527a107107b5e0fdb"
+ integrity sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==
node-fetch@^2.6.1, node-fetch@^2.6.8:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
- integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
dependencies:
whatwg-url "^5.0.0"
-node-gyp-build-optional-packages@5.0.3:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.3.tgz#92a89d400352c44ad3975010368072b41ad66c17"
- integrity sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==
-
node-gyp-build-optional-packages@5.0.7:
version "5.0.7"
resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz#5d2632bbde0ab2f6e22f1bbac2199b07244ae0b3"
integrity sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==
-node-gyp-build@^4.3.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055"
- integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==
+node-gyp-build-optional-packages@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz#52b143b9dd77b7669073cbfe39e3f4118bfc603c"
+ integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==
+ dependencies:
+ detect-libc "^2.0.1"
-node-releases@^2.0.8:
- version "2.0.10"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f"
- integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==
+node-releases@^2.0.14:
+ version "2.0.14"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
+ integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
nofilter@^3.1.0:
version "3.1.0"
@@ -5761,60 +6248,71 @@ object-assign@^4.1.1:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
-object-inspect@^1.12.2, object-inspect@^1.9.0:
- version "1.12.3"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
- integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
+object-inspect@^1.13.1:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
+ integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
-object.assign@^4.1.3, object.assign@^4.1.4:
- version "4.1.4"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
- integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+object.assign@^4.1.4, object.assign@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
+ integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
has-symbols "^1.0.3"
object-keys "^1.1.1"
-object.entries@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23"
- integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==
+object.entries@^1.1.7:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41"
+ integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
-object.fromentries@^2.0.6:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73"
- integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==
+object.fromentries@^2.0.7:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
+ integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
-object.hasown@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92"
- integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==
+object.groupby@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e"
+ integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==
dependencies:
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
-object.values@^1.1.6:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d"
- integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==
+object.hasown@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc"
+ integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+
+object.values@^1.1.6, object.values@^1.1.7:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
+ integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
once@^1.3.0:
version "1.4.0"
@@ -5823,22 +6321,22 @@ once@^1.3.0:
dependencies:
wrappy "1"
-optionator@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
- integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+optionator@^0.9.3:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
+ integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
dependencies:
+ "@aashutoshrathi/word-wrap" "^1.2.3"
deep-is "^0.1.3"
fast-levenshtein "^2.0.6"
levn "^0.4.1"
prelude-ls "^1.2.1"
type-check "^0.4.0"
- word-wrap "^1.2.3"
-ordered-binary@^1.2.4:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.4.0.tgz#6bb53d44925f3b8afc33d1eed0fa15693b211389"
- integrity sha512-EHQ/jk4/a9hLupIKxTfUsQRej1Yd/0QLQs3vGvIqg5ZtCYSzNhkzHoZc7Zf4e4kUlDaC3Uw8Q/1opOLNN2OKRQ==
+ordered-binary@^1.4.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ordered-binary/-/ordered-binary-1.5.1.tgz#94ccbf14181711081ee23931db0dc3f58aaa0df6"
+ integrity sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==
p-defer@^1.0.0:
version "1.0.0"
@@ -5951,24 +6449,24 @@ parcel-resolver-typescript-module@^0.1.8:
deepmerge "^4.2.2"
parcel@^2.8.3:
- version "2.8.3"
- resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.8.3.tgz#1ff71d7317274fd367379bc7310a52c6b75d30c2"
- integrity sha512-5rMBpbNE72g6jZvkdR5gS2nyhwIXaJy8i65osOqs/+5b7zgf3eMKgjSsDrv6bhz3gzifsba6MBJiZdBckl+vnA==
- dependencies:
- "@parcel/config-default" "2.8.3"
- "@parcel/core" "2.8.3"
- "@parcel/diagnostic" "2.8.3"
- "@parcel/events" "2.8.3"
- "@parcel/fs" "2.8.3"
- "@parcel/logger" "2.8.3"
- "@parcel/package-manager" "2.8.3"
- "@parcel/reporter-cli" "2.8.3"
- "@parcel/reporter-dev-server" "2.8.3"
- "@parcel/utils" "2.8.3"
+ version "2.12.0"
+ resolved "https://registry.yarnpkg.com/parcel/-/parcel-2.12.0.tgz#60529c268c2ce0754b225af835f1519da1364298"
+ integrity sha512-W+gxAq7aQ9dJIg/XLKGcRT0cvnStFAQHPaI0pvD0U2l6IVLueUAm3nwN7lkY62zZNmlvNx6jNtE4wlbS+CyqSg==
+ dependencies:
+ "@parcel/config-default" "2.12.0"
+ "@parcel/core" "2.12.0"
+ "@parcel/diagnostic" "2.12.0"
+ "@parcel/events" "2.12.0"
+ "@parcel/fs" "2.12.0"
+ "@parcel/logger" "2.12.0"
+ "@parcel/package-manager" "2.12.0"
+ "@parcel/reporter-cli" "2.12.0"
+ "@parcel/reporter-dev-server" "2.12.0"
+ "@parcel/reporter-tracer" "2.12.0"
+ "@parcel/utils" "2.12.0"
chalk "^4.1.0"
commander "^7.0.0"
get-port "^4.2.0"
- v8-compile-cache "^2.0.0"
parent-module@^1.0.0:
version "1.0.1"
@@ -5977,23 +6475,24 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
-parse-asn1@^5.0.0, parse-asn1@^5.1.5:
- version "5.1.6"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
- integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+parse-asn1@^5.0.0, parse-asn1@^5.1.7:
+ version "5.1.7"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06"
+ integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==
dependencies:
- asn1.js "^5.2.0"
- browserify-aes "^1.0.0"
- evp_bytestokey "^1.0.0"
- pbkdf2 "^3.0.3"
- safe-buffer "^5.1.1"
+ asn1.js "^4.10.1"
+ browserify-aes "^1.2.0"
+ evp_bytestokey "^1.0.3"
+ hash-base "~3.0"
+ pbkdf2 "^3.1.2"
+ safe-buffer "^5.2.1"
parse-duration@^1.0.0:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.0.3.tgz#b6681f5edcc2689643b34c09ea63f86f58a35814"
- integrity sha512-o6NAh12na5VvR6nFejkU0gpQ8jmOY9Y9sTU2ke3L3G/d/3z8jqmbBbeyBGHU73P4JLXfc7tJARygIK3WGIkloA==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.0.tgz#5192084c5d8f2a3fd676d04a451dbd2e05a1819c"
+ integrity sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==
-parse-json@^5.0.0:
+parse-json@^5.0.0, parse-json@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
@@ -6043,7 +6542,7 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-pbkdf2@^3.0.3, pbkdf2@^3.0.9:
+pbkdf2@^3.0.3, pbkdf2@^3.0.9, pbkdf2@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
@@ -6084,6 +6583,11 @@ pngjs@^5.0.0:
resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
+possible-typed-array-names@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
+ integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
+
postcss-value-parser@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
@@ -6131,9 +6635,9 @@ prettier-linter-helpers@^1.0.0:
fast-diff "^1.1.2"
prettier@^2.8.3:
- version "2.8.4"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.4.tgz#34dd2595629bfbb79d344ac4a91ff948694463c3"
- integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==
+ version "2.8.8"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+ integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
pretty-ms@^7.0.1:
version "7.0.1"
@@ -6142,12 +6646,17 @@ pretty-ms@^7.0.1:
dependencies:
parse-ms "^2.1.0"
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
-prop-types@^15.6.2, prop-types@^15.8.1:
+prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
@@ -6157,9 +6666,9 @@ prop-types@^15.6.2, prop-types@^15.8.1:
react-is "^16.13.1"
protobufjs@^6.10.2:
- version "6.11.3"
- resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.3.tgz#637a527205a35caa4f3e2a9a4a13ddffe0e7af74"
- integrity sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==
+ version "6.11.4"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa"
+ integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==
dependencies:
"@protobufjs/aspromise" "^1.1.2"
"@protobufjs/base64" "^1.1.2"
@@ -6188,9 +6697,9 @@ public-encrypt@^4.0.0:
safe-buffer "^5.1.2"
punycode@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
- integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
qr.js@0.0.0:
version "0.0.0"
@@ -6198,9 +6707,9 @@ qr.js@0.0.0:
integrity sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==
qrcode@^1.5.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb"
- integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170"
+ integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==
dependencies:
dijkstrajs "^1.0.1"
encode-utf8 "^1.0.3"
@@ -6251,6 +6760,17 @@ react-clientside-effect@^1.2.6:
dependencies:
"@babel/runtime" "^7.12.13"
+react-datepicker@^6.2.0:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-6.5.0.tgz#e797f149450807213c4a2a2237ab574b63b0b4ef"
+ integrity sha512-VXufB/CH04O9K/puRxr7BGBD+2Hf9mSSwG9HMa6ZP+LXckCpibllOPuRYxk4kW8W22AfLps4MY04NJAgk4JpJg==
+ dependencies:
+ "@floating-ui/react" "^0.26.2"
+ classnames "^2.2.6"
+ date-fns "^3.3.1"
+ prop-types "^15.7.2"
+ react-onclickoutside "^6.13.0"
+
react-dom@18.2.0, react-dom@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
@@ -6269,22 +6789,35 @@ react-fast-compare@3.2.0:
resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb"
integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==
-react-focus-lock@^2.9.2:
- version "2.9.4"
- resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.9.4.tgz#4753f6dcd167c39050c9d84f9c63c71b3ff8462e"
- integrity sha512-7pEdXyMseqm3kVjhdVH18sovparAzLg5h6WvIx7/Ck3ekjhrrDMEegHSa3swwC8wgfdd7DIdUVRGeiHT9/7Sgg==
+react-fast-compare@3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49"
+ integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==
+
+react-focus-lock@^2.9.4:
+ version "2.11.2"
+ resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.11.2.tgz#dcc9a0dde630f0b9c694b823066f1b954c024422"
+ integrity sha512-DDTbEiov0+RthESPVSTIdAWPPKic+op3sCcP+icbMRobvQNt7LuAlJ3KoarqQv5sCgKArru3kXmlmFTa27/CdQ==
dependencies:
"@babel/runtime" "^7.0.0"
- focus-lock "^0.11.6"
+ focus-lock "^1.3.2"
prop-types "^15.6.2"
react-clientside-effect "^1.2.6"
use-callback-ref "^1.3.0"
use-sidecar "^1.1.2"
react-hook-form@^7.43.0:
- version "7.43.1"
- resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.43.1.tgz#0d0d7822f3f7fc05ffc41d5f012b49b90fcfa0f0"
- integrity sha512-+s3+s8LLytRMriwwuSqeLStVjRXFGxgjjx2jED7Z+wz1J/88vpxieRQGvJVvzrzVxshZ0BRuocFERb779m2kNg==
+ version "7.51.1"
+ resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.1.tgz#3ce5f8b5ef41903b4054a641cef8c0dc8bf8ae85"
+ integrity sha512-ifnBjl+kW0ksINHd+8C/Gp6a4eZOdWyvRv0UBaByShwU8JbVx5hTcTWEcd5VdybvmPTATkVVXk9npXArHmo56w==
+
+react-input-mask@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/react-input-mask/-/react-input-mask-2.0.4.tgz#9ade5cf8196f4a856dbf010820fe75a795f3eb14"
+ integrity sha512-1hwzMr/aO9tXfiroiVCx5EtKohKwLk/NT8QlJXHQ4N+yJJFyUuMT+zfTpLBwX/lK3PkuMlievIffncpMZ3HGRQ==
+ dependencies:
+ invariant "^2.2.4"
+ warning "^4.0.2"
react-is@^16.13.1, react-is@^16.7.0:
version "16.13.1"
@@ -6298,15 +6831,20 @@ react-native-fetch-api@^3.0.0:
dependencies:
p-defer "^3.0.0"
+react-onclickoutside@^6.13.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz#e165ea4e5157f3da94f4376a3ab3e22a565f4ffc"
+ integrity sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==
+
react-qr-code@^2.0.11:
- version "2.0.11"
- resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.11.tgz#444c759a2100424972e17135fbe0e32eaffa19e8"
- integrity sha512-P7mvVM5vk9NjGdHMt4Z0KWeeJYwRAtonHTghZT2r+AASinLUUKQ9wfsGH2lPKsT++gps7hXmaiMGRvwTDEL9OA==
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.12.tgz#98f99e9ad5ede46d73ab819e2dd9925c5f5d7a2d"
+ integrity sha512-k+pzP5CKLEGBRwZsDPp98/CAJeXlsYRHM2iZn1Sd5Th/HnKhIZCSg27PXO58zk8z02RaEryg+60xa4vyywMJwg==
dependencies:
prop-types "^15.8.1"
qr.js "0.0.0"
-react-qr-reader@3.0.0-beta-1:
+react-qr-reader@^3.0.0-beta-1:
version "3.0.0-beta-1"
resolved "https://registry.yarnpkg.com/react-qr-reader/-/react-qr-reader-3.0.0-beta-1.tgz#e04a20876409313439959d8e0ea6df3ba6e36d68"
integrity sha512-5HeFH9x/BlziRYQYGK2AeWS9WiKYZtGGMs9DXy3bcySTX3C9UJL9EwcPnWw8vlf7JP4FcrAlr1SnZ5nsWLQGyw==
@@ -6320,39 +6858,39 @@ react-refresh@^0.9.0:
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.9.0.tgz#71863337adc3e5c2f8a6bfddd12ae3bfe32aafbf"
integrity sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==
-react-remove-scroll-bar@^2.3.3:
- version "2.3.4"
- resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9"
- integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==
+react-remove-scroll-bar@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c"
+ integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==
dependencies:
react-style-singleton "^2.2.1"
tslib "^2.0.0"
-react-remove-scroll@^2.5.5:
- version "2.5.5"
- resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77"
- integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==
+react-remove-scroll@^2.5.6:
+ version "2.5.9"
+ resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.9.tgz#6a38e7d46043abc2c6b0fb39db650b9f2e38be3e"
+ integrity sha512-bvHCLBrFfM2OgcrpPY2YW84sPdS2o2HKWJUf1xGyGLnSoEnOTOBpahIarjRuYtN0ryahCeP242yf+5TrBX/pZA==
dependencies:
- react-remove-scroll-bar "^2.3.3"
+ react-remove-scroll-bar "^2.3.6"
react-style-singleton "^2.2.1"
tslib "^2.1.0"
use-callback-ref "^1.3.0"
use-sidecar "^1.1.2"
react-router-dom@^6.8.0:
- version "6.8.1"
- resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.1.tgz#7e136b67d9866f55999e9a8482c7008e3c575ac9"
- integrity sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==
+ version "6.22.3"
+ resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.3.tgz#9781415667fd1361a475146c5826d9f16752a691"
+ integrity sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==
dependencies:
- "@remix-run/router" "1.3.2"
- react-router "6.8.1"
+ "@remix-run/router" "1.15.3"
+ react-router "6.22.3"
-react-router@6.8.1:
- version "6.8.1"
- resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.1.tgz#e362caf93958a747c649be1b47cd505cf28ca63e"
- integrity sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==
+react-router@6.22.3:
+ version "6.22.3"
+ resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.3.tgz#9d9142f35e08be08c736a2082db5f0c9540a885e"
+ integrity sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==
dependencies:
- "@remix-run/router" "1.3.2"
+ "@remix-run/router" "1.15.3"
react-style-singleton@^2.2.1:
version "2.2.1"
@@ -6389,19 +6927,23 @@ read-pkg@^5.2.0:
parse-json "^5.0.0"
type-fest "^0.6.0"
-readable-stream@^3.4.0:
- version "3.6.1"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.1.tgz#f9f9b5f536920253b3d26e7660e7da4ccff9bb62"
- integrity sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==
+readable-stream@^2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+ integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
-readable-stream@^3.5.0, readable-stream@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
@@ -6429,21 +6971,40 @@ redent@^3.0.0:
indent-string "^4.0.0"
strip-indent "^3.0.0"
-regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.7:
+reflect.getprototypeof@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859"
+ integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.1"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ globalthis "^1.0.3"
+ which-builtin-type "^1.1.3"
+
+regenerator-runtime@^0.13.7:
version "0.13.11"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
-regexp.prototype.flags@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac"
- integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+regexp.prototype.flags@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
+ integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.3"
- functions-have-names "^1.2.2"
+ call-bind "^1.0.6"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ set-function-name "^2.0.1"
-regexpp@^3.0.0, regexpp@^3.2.0:
+regexpp@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
@@ -6475,21 +7036,21 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-resolve@^1.10.0, resolve@^1.19.0, resolve@^1.22.1:
- version "1.22.1"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
- integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+resolve@^1.10.0, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.4:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
dependencies:
- is-core-module "^2.9.0"
+ is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
-resolve@^2.0.0-next.4:
- version "2.0.0-next.4"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660"
- integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==
+resolve@^2.0.0-next.5:
+ version "2.0.0-next.5"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
+ integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
dependencies:
- is-core-module "^2.9.0"
+ is-core-module "^2.13.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -6533,32 +7094,42 @@ run-parallel@^1.1.9:
queue-microtask "^1.2.2"
rxjs@^7.8.0:
- version "7.8.0"
- resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4"
- integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==
+ version "7.8.1"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
+ integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
dependencies:
tslib "^2.1.0"
-safari-14-idb-fix@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz#450fc049b996ec7f3fd9ca2f89d32e0761583440"
- integrity sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==
+safe-array-concat@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
+ integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
+ dependencies:
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
+ has-symbols "^1.0.3"
+ isarray "^2.0.5"
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-safe-regex-test@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
- integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex-test@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
+ integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
dependencies:
- call-bind "^1.0.2"
- get-intrinsic "^1.1.3"
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
is-regex "^1.1.4"
-"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0:
+"safer-buffer@>= 2.1.2 < 3.0.0":
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -6575,20 +7146,20 @@ seedrandom@^3.0.5:
resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
-"semver@2 || 3 || 4 || 5", semver@^5.7.0, semver@^5.7.1:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
- integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+"semver@2 || 3 || 4 || 5":
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
-semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8:
- version "7.3.8"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
- integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
+semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8, semver@^7.5.2:
+ version "7.6.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
+ integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
dependencies:
lru-cache "^6.0.0"
@@ -6604,6 +7175,28 @@ set-blocking@^2.0.0:
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.1, set-function-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+
setprototypeof@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
@@ -6629,14 +7222,15 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-side-channel@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
- integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+side-channel@^1.0.4, side-channel@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
dependencies:
- call-bind "^1.0.0"
- get-intrinsic "^1.0.2"
- object-inspect "^1.9.0"
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
signal-exit@^3.0.7:
version "3.0.7"
@@ -6661,20 +7255,12 @@ slice-ansi@^5.0.0:
ansi-styles "^6.0.0"
is-fullwidth-code-point "^4.0.0"
-source-map-support@~0.5.20:
- version "0.5.21"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
- integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
source-map@^0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
-source-map@^0.6.0, source-map@^0.6.1:
+source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -6693,9 +7279,9 @@ spdx-correct@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-exceptions@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
- integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66"
+ integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
spdx-expression-parse@^3.0.0:
version "3.0.1"
@@ -6706,9 +7292,9 @@ spdx-expression-parse@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
- version "3.0.12"
- resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779"
- integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==
+ version "3.0.17"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c"
+ integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==
sprintf-js@~1.0.2:
version "1.0.3"
@@ -6775,37 +7361,51 @@ string-width@^5.0.0:
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
-string.prototype.matchall@^4.0.8:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3"
- integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
- get-intrinsic "^1.1.3"
+string.prototype.matchall@^4.0.10:
+ version "4.0.11"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a"
+ integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
has-symbols "^1.0.3"
- internal-slot "^1.0.3"
- regexp.prototype.flags "^1.4.3"
- side-channel "^1.0.4"
-
-string.prototype.trimend@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
- integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
+ internal-slot "^1.0.7"
+ regexp.prototype.flags "^1.5.2"
+ set-function-name "^2.0.2"
+ side-channel "^1.0.6"
+
+string.prototype.trim@^1.2.9:
+ version "1.2.9"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
+ integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.0"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimend@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
+ integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
-string.prototype.trimstart@^1.0.6:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
- integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
+string.prototype.trimstart@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
dependencies:
- call-bind "^1.0.2"
- define-properties "^1.1.4"
- es-abstract "^1.20.4"
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
string_decoder@^1.1.1, string_decoder@^1.3.0:
version "1.3.0"
@@ -6814,6 +7414,13 @@ string_decoder@^1.1.1, string_decoder@^1.3.0:
dependencies:
safe-buffer "~5.2.0"
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -6822,9 +7429,9 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
ansi-regex "^5.0.1"
strip-ansi@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
- integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
dependencies:
ansi-regex "^6.0.1"
@@ -6840,15 +7447,15 @@ strip-indent@^3.0.0:
dependencies:
min-indent "^1.0.0"
-strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-stylis@4.1.3:
- version "4.1.3"
- resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7"
- integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==
+stylis@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
+ integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
supertap@^3.0.1:
version "3.0.1"
@@ -6898,12 +7505,18 @@ svgo@^2.4.0, svgo@^2.8.0:
stable "^0.1.8"
swr@^2.0.3:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/swr/-/swr-2.0.4.tgz#e68a5cc2e87b2a7f5f7ebf8a472cea24fc1c5fce"
- integrity sha512-4GUiTjknRUVuw4MWUHR7mzJ9G/DWL+yZz/TgWDfiA0OZ9tL6qyrTkN2wPeboBpL3OJTkej3pexh3mWCnv8cFkQ==
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/swr/-/swr-2.2.5.tgz#063eea0e9939f947227d5ca760cc53696f46446b"
+ integrity sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==
dependencies:
+ client-only "^0.0.1"
use-sync-external-store "^1.2.0"
+tabbable@^6.0.1:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
+ integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
+
temp-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
@@ -6914,16 +7527,6 @@ term-size@^2.2.1:
resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==
-terser@^5.2.0:
- version "5.16.4"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.4.tgz#51284b440b93242291a98f2a9903c024cfb70e6e"
- integrity sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==
- dependencies:
- "@jridgewell/source-map" "^0.3.2"
- acorn "^8.5.0"
- commander "^2.20.0"
- source-map-support "~0.5.20"
-
text-encoding-utf-8@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13"
@@ -6958,9 +7561,9 @@ tiny-emitter@^2.1.0:
integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
tiny-invariant@^1.0.6:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642"
- integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
+ integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
to-fast-properties@^2.0.0:
version "2.0.0"
@@ -6999,13 +7602,13 @@ ts-custom-error@^3.0.0:
resolved "https://registry.yarnpkg.com/ts-custom-error/-/ts-custom-error-3.3.1.tgz#8bd3c8fc6b8dc8e1cb329267c45200f1e17a65d1"
integrity sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==
-tsconfig-paths@^3.14.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
- integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
+tsconfig-paths@^3.15.0:
+ version "3.15.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4"
+ integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==
dependencies:
"@types/json5" "^0.0.29"
- json5 "^1.0.1"
+ json5 "^1.0.2"
minimist "^1.2.6"
strip-bom "^3.0.0"
@@ -7020,9 +7623,9 @@ tslib@^1.8.1:
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
- integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
+ integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
tslint-config-prettier@^1.18.0:
version "1.18.0"
@@ -7036,6 +7639,11 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
+tweetnacl-util@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
tweetnacl@1.0.3, tweetnacl@^1.0.1, tweetnacl@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
@@ -7073,19 +7681,54 @@ type-fest@^0.8.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
-typed-array-length@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
- integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+typed-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
+ integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
dependencies:
- call-bind "^1.0.2"
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
+ integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
+ dependencies:
+ call-bind "^1.0.7"
for-each "^0.3.3"
- is-typed-array "^1.1.9"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
-typed-function@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-4.1.0.tgz#da4bdd8a6d19a89e22732f75e4a410860aaf9712"
- integrity sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==
+typed-array-byte-offset@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
+ integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-length@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
+ integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
+
+typed-function@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-4.1.1.tgz#38ce3cae31f4f513bcb263563fdad27b2afa73e8"
+ integrity sha512-Pq1DVubcvibmm8bYcMowjVnnMwPVMeh0DIdA8ad8NZY2sJgapANJmiigSUwlt+EgXxpfIv8MWrQXTIzkfYZLYQ==
typescript@^4.8.4, typescript@^4.9.5:
version "4.9.5"
@@ -7114,10 +7757,15 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
-update-browserslist-db@^1.0.10:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3"
- integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+update-browserslist-db@^1.0.13:
+ version "1.0.13"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
+ integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
dependencies:
escalade "^3.1.1"
picocolors "^1.0.0"
@@ -7130,9 +7778,9 @@ uri-js@^4.2.2:
punycode "^2.1.0"
use-callback-ref@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5"
- integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693"
+ integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==
dependencies:
tslib "^2.0.0"
@@ -7149,7 +7797,7 @@ use-sync-external-store@^1.2.0:
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
-util-deprecate@^1.0.1:
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
@@ -7166,14 +7814,9 @@ util@^0.12.3, util@^0.12.5:
which-typed-array "^1.1.2"
utility-types@^3.10.0:
- version "3.10.0"
- resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b"
- integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==
-
-v8-compile-cache@^2.0.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
- integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c"
+ integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==
validate-npm-package-license@^3.0.1:
version "3.0.4"
@@ -7188,6 +7831,18 @@ varint@^6.0.0:
resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0"
integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==
+vm-browserify@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+ integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
+
+warning@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
+ integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
+ dependencies:
+ loose-envify "^1.0.0"
+
weak-lru-cache@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz#fdbb6741f36bae9540d12f480ce8254060dccd19"
@@ -7203,9 +7858,9 @@ web-encoding@1.1.5:
"@zxing/text-encoding" "0.9.0"
web-streams-polyfill@^3.1.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6"
- integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b"
+ integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==
webidl-conversions@^3.0.0:
version "3.0.1"
@@ -7236,22 +7891,49 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5"
is-symbol "^1.0.3"
+which-builtin-type@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b"
+ integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==
+ dependencies:
+ function.prototype.name "^1.1.5"
+ has-tostringtag "^1.0.0"
+ is-async-function "^2.0.0"
+ is-date-object "^1.0.5"
+ is-finalizationregistry "^1.0.2"
+ is-generator-function "^1.0.10"
+ is-regex "^1.1.4"
+ is-weakref "^1.0.2"
+ isarray "^2.0.5"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.1"
+ which-typed-array "^1.1.9"
+
+which-collection@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
+ integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
+ dependencies:
+ is-map "^2.0.3"
+ is-set "^2.0.3"
+ is-weakmap "^2.0.2"
+ is-weakset "^2.0.3"
+
which-module@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
- integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+ integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
-which-typed-array@^1.1.2, which-typed-array@^1.1.9:
- version "1.1.9"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6"
- integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==
+which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2, which-typed-array@^1.1.9:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
+ integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
dependencies:
- available-typed-arrays "^1.0.5"
- call-bind "^1.0.2"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
for-each "^0.3.3"
gopd "^1.0.1"
- has-tostringtag "^1.0.0"
- is-typed-array "^1.1.10"
+ has-tostringtag "^1.0.2"
which@^2.0.1:
version "2.0.2"
@@ -7260,11 +7942,6 @@ which@^2.0.1:
dependencies:
isexe "^2.0.0"
-word-wrap@^1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
- integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
-
wrap-ansi@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
@@ -7296,11 +7973,6 @@ write-file-atomic@^4.0.1:
imurmurhash "^0.1.4"
signal-exit "^3.0.7"
-xxhash-wasm@^0.4.2:
- version "0.4.2"
- resolved "https://registry.yarnpkg.com/xxhash-wasm/-/xxhash-wasm-0.4.2.tgz#752398c131a4dd407b5132ba62ad372029be6f79"
- integrity sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==
-
y18n@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
@@ -7362,9 +8034,9 @@ yargs@^15.3.1:
yargs-parser "^18.1.2"
yargs@^17.5.1:
- version "17.6.2"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541"
- integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
dependencies:
cliui "^8.0.1"
escalade "^3.1.1"
@@ -7385,6 +8057,6 @@ yocto-queue@^1.0.0:
integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
zod@^3.20.2:
- version "3.20.6"
- resolved "https://registry.yarnpkg.com/zod/-/zod-3.20.6.tgz#2f2f08ff81291d47d99e86140fedb4e0db08361a"
- integrity sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==
+ version "3.22.4"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff"
+ integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==