diff --git a/frontend/occupi-mobile/hooks/useColorScheme.ts b/frontend/occupi-mobile/hooks/useColorScheme.ts new file mode 100644 index 00000000..17e3c63e --- /dev/null +++ b/frontend/occupi-mobile/hooks/useColorScheme.ts @@ -0,0 +1 @@ +export { useColorScheme } from 'react-native'; diff --git a/frontend/occupi-mobile/hooks/useColorScheme.web.ts b/frontend/occupi-mobile/hooks/useColorScheme.web.ts new file mode 100644 index 00000000..6dcd80d3 --- /dev/null +++ b/frontend/occupi-mobile/hooks/useColorScheme.web.ts @@ -0,0 +1,8 @@ +// NOTE: The default React Native styling doesn't support server rendering. +// Server rendered styles should not change between the first render of the HTML +// and the first render on the client. Typically, web developers will use CSS media queries +// to render different styles on the client and server, these aren't directly supported in React Native +// but can be achieved using a styling library like Nativewind. +export function useColorScheme() { + return 'light'; +} diff --git a/frontend/occupi-mobile/hooks/useThemeColor.ts b/frontend/occupi-mobile/hooks/useThemeColor.ts new file mode 100644 index 00000000..ae43b47b --- /dev/null +++ b/frontend/occupi-mobile/hooks/useThemeColor.ts @@ -0,0 +1,22 @@ +/** + * Learn more about light and dark modes: + * https://docs.expo.dev/guides/color-schemes/ + */ + +import { useColorScheme } from 'react-native'; + +import { Colors } from '@/constants/Colors'; + +export function useThemeColor( + props: { light?: string; dark?: string }, + colorName: keyof typeof Colors.light & keyof typeof Colors.dark +) { + const theme = useColorScheme() ?? 'light'; + const colorFromProps = props[theme]; + + if (colorFromProps) { + return colorFromProps; + } else { + return Colors[theme][colorName]; + } +} diff --git a/frontend/occupi-mobile3/.babelrc b/frontend/occupi-mobile3/.babelrc deleted file mode 100644 index f406f678..00000000 --- a/frontend/occupi-mobile3/.babelrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-env", "@babel/preset-react", "@babel/preset-typescript"] -} diff --git a/frontend/occupi-mobile3/__tests__/Dashboard_Test/Bookings.test.js b/frontend/occupi-mobile3/__tests__/Dashboard_Test/Bookings.test.js deleted file mode 100644 index 96d34d66..00000000 --- a/frontend/occupi-mobile3/__tests__/Dashboard_Test/Bookings.test.js +++ /dev/null @@ -1,32 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Bookings from '../../screens/Dashboard/Bookings'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -describe('Bookings Component', () => { - it('renders correctly', () => { - const { getByText } = render(); - - expect(getByText('Offices')).toBeTruthy(); - expect(getByText('Book Table')).toBeTruthy(); - expect(getByText('HDMI Room')).toBeTruthy(); - expect(getByText('Conference Room')).toBeTruthy(); - expect(getByText('Meeting Room 1')).toBeTruthy(); - expect(getByText('Meeting Room 2')).toBeTruthy(); - }); - - it('navigates to bookings screen on button press', () => { - const { getByText } = render(); - - const buttons = getByText('Available now'); - fireEvent.press(buttons); - - expect(router.push).toHaveBeenCalledWith('/bookings'); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Dashboard_Test/Dashboard.test.js b/frontend/occupi-mobile3/__tests__/Dashboard_Test/Dashboard.test.js deleted file mode 100644 index b5ce708f..00000000 --- a/frontend/occupi-mobile3/__tests__/Dashboard_Test/Dashboard.test.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Dashboard from '../../screens/Dashboard/Dashboard'; // Adjust the import path accordingly -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -describe('Dashboard Component', () => { - it('renders correctly', () => { - const { getByText, getByAltText } = render(); - - expect(getByText('Hi Tina 👋')).toBeTruthy(); - expect(getByText('Welcome to Occupi')).toBeTruthy(); - expect(getByText('Office analytics')).toBeTruthy(); - expect(getByAltText('logo')).toBeTruthy(); - }); - - it('navigates to bookings screen on "Book a space" button press', () => { - const { getByText } = render(); - - const bookSpaceButton = getByText('Book a space'); - fireEvent.press(bookSpaceButton); - - expect(router.push).toHaveBeenCalledWith('/bookings'); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/CreatePassword.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/CreatePassword.test.js deleted file mode 100644 index 2e893d66..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/CreatePassword.test.js +++ /dev/null @@ -1,120 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import CreatePassword from '../../screens/Login/CreatePassword'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), - router: { - replace: jest.fn(), - }, -})); - -jest.mock('@gluestack-ui/themed', () => ({ - VStack: 'View', - Box: 'View', - HStack: 'View', - Icon: 'View', - Text: 'Text', - Button: 'View', - Image: 'Image', - Center: 'View', - ArrowLeftIcon: 'View', - FormControl: 'View', - Heading: 'Text', - FormControlHelperText: 'Text', - EyeIcon: 'View', - EyeOffIcon: 'View', - ButtonText: 'Text', - Input: 'TextInput', - useToast: () => ({ - show: jest.fn(), - }), - Toast: 'View', - InputField: 'TextInput', - ToastTitle: 'Text', - FormControlHelper: 'Text', - FormControlError: 'View', - FormControlErrorIcon: 'View', - FormControlErrorText: 'Text', - InputIcon: 'View', - InputSlot: 'View', - ScrollView: 'View', - FormControlLabel: 'View', - FormControlLabelText: 'Text', -})); - -jest.mock('react-hook-form', () => ({ - useForm: () => ({ - control: jest.fn(), - formState: { errors: {} }, - handleSubmit: (fn) => fn, - reset: jest.fn(), - }), - Controller: ({ render }) => render({ field: { onChange: jest.fn(), onBlur: jest.fn(), value: '' } }), -})); - -describe('CreatePassword', () => { - it('renders the main text correctly', () => { - const { getByText } = render(); - expect(getByText('Create new password')).toBeTruthy(); - expect(getByText('Your new password must be different from previous used passwords and must be of at least 8 characters.')).toBeTruthy(); - }); - - it('renders the image correctly', () => { - const { getByRole } = render(); - const image = getByRole('image', { name: 'logo' }); - expect(image).toBeTruthy(); - }); - - it('displays error message when passwords do not match', async () => { - const { getByText, getByPlaceholderText } = render(); - - fireEvent.changeText(getByPlaceholderText('Password'), 'Password1!'); - fireEvent.changeText(getByPlaceholderText('Confirm Password'), 'Password2!'); - - fireEvent.press(getByText('Update Password')); - - await waitFor(() => { - expect(getByText('Passwords do not match')).toBeTruthy(); - }); - }); - - it('navigates to the home screen when passwords match', async () => { - const { getByText, getByPlaceholderText } = render(); - - fireEvent.changeText(getByPlaceholderText('Password'), 'Password1!'); - fireEvent.changeText(getByPlaceholderText('Confirm Password'), 'Password1!'); - - fireEvent.press(getByText('Update Password')); - - await waitFor(() => { - expect(router.replace).toHaveBeenCalledWith('/'); - }); - }); - - it('validates password input correctly', async () => { - const { getByText, getByPlaceholderText, findByText } = render(); - - fireEvent.changeText(getByPlaceholderText('Password'), 'short'); - fireEvent.changeText(getByPlaceholderText('Confirm Password'), 'short'); - - fireEvent.press(getByText('Update Password')); - - expect(await findByText('Must be at least 8 characters in length')).toBeTruthy(); - }); - - it('toggles password visibility', () => { - const { getByPlaceholderText, getByTestId } = render(); - - const passwordInput = getByPlaceholderText('Password'); - const toggleButton = getByTestId('togglePasswordVisibility'); - - fireEvent.press(toggleButton); - - expect(passwordInput.props.secureTextEntry).toBe(false); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/ForgotPassword.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/ForgotPassword.test.js deleted file mode 100644 index f32afa04..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/ForgotPassword.test.js +++ /dev/null @@ -1,69 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import ForgotPassword from '../../screens/Login/ForgotPassword'; // Adjust the import path accordingly -import { useToast } from '@gluestack-ui/themed'; -import { router } from 'expo-router'; - -// Mock the router -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -// Mock the useToast hook -jest.mock('@gluestack-ui/themed', () => ({ - useToast: jest.fn(), -})); - -describe('ForgotPassword Component', () => { - it('renders correctly', () => { - const { getByText, getByPlaceholderText } = render(); - - expect(getByText('Forgot Password?')).toBeTruthy(); - expect(getByText("Not to worry! Enter email address associated with your account and we'll send a link to reset your password.")).toBeTruthy(); - expect(getByPlaceholderText('Email')).toBeTruthy(); - expect(getByText('Send OTP')).toBeTruthy(); - }); - - it('shows error message when email is invalid', async () => { - const { getByText, getByPlaceholderText } = render(); - - const emailInput = getByPlaceholderText('Email'); - const sendOtpButton = getByText('Send OTP'); - - fireEvent.changeText(emailInput, 'invalid-email'); - fireEvent.press(sendOtpButton); - - await waitFor(() => { - expect(getByText('Invalid email address')).toBeTruthy(); - }); - }); - - it('shows success message and navigates to verify-otp screen on valid submission', async () => { - const mockToast = { show: jest.fn() }; - useToast.mockReturnValue(mockToast); - - const { getByText, getByPlaceholderText } = render(); - - const emailInput = getByPlaceholderText('Email'); - const sendOtpButton = getByText('Send OTP'); - - fireEvent.changeText(emailInput, 'test@example.com'); - fireEvent.press(sendOtpButton); - - await waitFor(() => { - expect(mockToast.show).toHaveBeenCalledWith( - expect.objectContaining({ - render: expect.any(Function), - }) - ); - expect(router.push).toHaveBeenCalledWith('/verify-otp'); - }); - - const toastRender = mockToast.show.mock.calls[0][0].render; - const toastComponent = toastRender({ id: 'mockId' }); - const toastText = render(toastComponent).getByText('OTP sent successfully'); - expect(toastText).toBeTruthy(); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding1.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding1.test.js deleted file mode 100644 index 0d04ca01..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding1.test.js +++ /dev/null @@ -1,58 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Onboarding1 from '../../screens/Login/Onboarding1'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), - router: { - push: jest.fn(), - }, -})); - -jest.mock('expo-linear-gradient', () => ({ - LinearGradient: ({ children }) => children, -})); - -jest.mock('@gluestack-style/react', () => ({ - StyledProvider: ({ children }) => children, - useStyled: () => ({}), - StyledText: 'Text', - StyledView: 'View', - StyledImage: 'Image', - StyledButton: 'Button', - // Mock other components if necessary -})); - -jest.mock('@gluestack-ui/themed', () => ({ - Box: 'View', - Image: 'Image', - Center: 'View', - Text: 'Text', - Heading: 'Text', - Button: 'Button', -})); - -describe('Onboarding1', () => { - it('renders the image correctly', () => { - const { getByTestId } = render(); - const image = getByTestId('logo'); - expect(image).toBeTruthy(); - }); - - it('renders the heading and text correctly', () => { - const { getByText } = render(); - expect(getByText('Capacity Prediction')).toBeTruthy(); - expect(getByText('Predictive AI to help you plan when you go to the office better')).toBeTruthy(); - }); - - it('navigates to the onboarding2 screen when the button is pressed', () => { - const { getByText } = render(); - const button = getByText('Next'); - fireEvent.press(button); - expect(router.push).toHaveBeenCalledWith('/onboarding2'); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding2.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding2.test.js deleted file mode 100644 index 86100021..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding2.test.js +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Onboarding2 from '../../screens/Login/Onboarding2'; -import { router } from 'expo-router'; -import { LinearGradient } from 'expo-linear-gradient'; - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), - router: { - push: jest.fn(), - }, -})); - -jest.mock('expo-linear-gradient', () => ({ - LinearGradient: ({ children }) => children, -})); - -jest.mock('@gluestack-style/react', () => ({ - StyledProvider: ({ children }) => children, - useStyled: () => ({}), - StyledText: 'Text', - StyledView: 'View', - StyledImage: 'Image', - StyledButton: 'Button', - // Mock other components if necessary -})); - -jest.mock('@gluestack-ui/themed', () => ({ - Box: 'View', - Image: 'Image', - Center: 'View', - Text: 'Text', - Heading: 'Text', - Button: 'Button', -})); - -describe('Onboarding2', () => { - it('renders the image correctly', () => { - const { getByAltText } = render(); - const image = getByAltText('logo'); - expect(image).toBeTruthy(); - }); - - it('renders the heading and text correctly', () => { - const { getByText } = render(); - expect(getByText('Day to day Occupancy analysis')).toBeTruthy(); - expect(getByText('Uses historical data to provide day to day analysis and statistics')).toBeTruthy(); - }); - - it('navigates to the onboarding3 screen when the button is pressed', () => { - const { getByText } = render(); - const button = getByText('Next'); - fireEvent.press(button); - expect(router.push).toHaveBeenCalledWith('/onboarding3'); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding3.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding3.test.js deleted file mode 100644 index e2a78d61..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding3.test.js +++ /dev/null @@ -1,58 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Onboarding3 from '../../screens/Login/Onboarding3'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), - router: { - push: jest.fn(), - }, -})); - -jest.mock('expo-linear-gradient', () => ({ - LinearGradient: ({ children }) => children, -})); - -jest.mock('@gluestack-style/react', () => ({ - StyledProvider: ({ children }) => children, - useStyled: () => ({}), - StyledText: 'Text', - StyledView: 'View', - StyledImage: 'Image', - StyledButton: 'Button', - // Mock other components if necessary -})); - -jest.mock('@gluestack-ui/themed', () => ({ - Box: 'View', - Image: 'Image', - Center: 'View', - Text: 'Text', - Heading: 'Text', - Button: 'Button', -})); - -describe('Onboarding3', () => { - it('renders the image correctly', () => { - const { getByRole } = render(); - const image = getByRole('image', { name: 'logo' }); - expect(image).toBeTruthy(); - }); - - it('renders the heading and text correctly', () => { - const { getByText } = render(); - expect(getByText('Real time updates')).toBeTruthy(); - expect(getByText('Provides real time updates for occupancy and capacity')).toBeTruthy(); - }); - - it('navigates to the welcome screen when the button is pressed', () => { - const { getByText } = render(); - const button = getByText('Next'); - fireEvent.press(button); - expect(router.push).toHaveBeenCalledWith('/welcome'); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/OtpVerification.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/OtpVerification.test.js deleted file mode 100644 index 0d867e03..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/OtpVerification.test.js +++ /dev/null @@ -1,117 +0,0 @@ -import React from 'react'; -import { render, fireEvent, act } from '@testing-library/react-native'; -import OTPVerification from '../../screens/Login/OTPVerification'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), - router: { - push: jest.fn(), - }, -})); - -jest.mock('expo-linear-gradient', () => ({ - LinearGradient: ({ children }) => children, -})); - -jest.mock('@gluestack-ui/themed', () => ({ - VStack: 'View', - Box: 'View', - HStack: 'View', - Text: 'Text', - Button: 'Button', - Image: 'Image', - Center: 'View', - FormControl: 'View', - Input: 'TextInput', - LinkText: 'Text', - FormControlHelperText: 'Text', - InputField: 'TextInput', - ButtonText: 'Text', - FormControlError: 'View', - FormControlErrorIcon: 'View', - FormControlErrorText: 'Text', - Toast: 'View', - ToastTitle: 'Text', - useToast: () => ({ - show: jest.fn(), - }), - Heading: 'Text', -})); - -jest.mock('expo-random', () => ({ - getRandomBytesAsync: jest.fn().mockResolvedValue(new Uint8Array(3)), -})); - -jest.mock('expo-secure-store', () => ({ - setItemAsync: jest.fn(), -})); - -describe('OTPVerification', () => { - it('renders the main text correctly', () => { - const { getByText } = render(); - expect(getByText('We sent you an email code')).toBeTruthy(); - expect(getByText('We have sent the OTP code to kamo@gmail.com')).toBeTruthy(); - }); - - it('renders the image correctly', () => { - const { getByRole } = render(); - const image = getByRole('image', { name: 'occupi' }); - expect(image).toBeTruthy(); - }); - - it('renders the countdown timer correctly', () => { - const { getByText } = render(); - expect(getByText('60 seconds remaining')).toBeTruthy(); - }); - - it('updates the countdown timer every second', () => { - jest.useFakeTimers(); - const { getByText } = render(); - - act(() => { - jest.advanceTimersByTime(1000); - }); - - expect(getByText('59 seconds remaining')).toBeTruthy(); - - jest.useRealTimers(); - }); - - it('validates OTP input correctly', async () => { - const { getByText, getByPlaceholderText, findByText } = render(); - - const input = getByPlaceholderText(''); - - fireEvent.changeText(input, '1'); - fireEvent.changeText(input, '12'); - fireEvent.changeText(input, '123'); - fireEvent.changeText(input, '1234'); - fireEvent.changeText(input, '12345'); - fireEvent.changeText(input, '123456'); - - const button = getByText('Verify'); - fireEvent.press(button); - - expect(await findByText('OTP must be at least 6 characters in length')).toBeTruthy(); - }); - - it('navigates to the home screen when OTP is correct', async () => { - const { getByText, getAllByPlaceholderText } = render(); - - const inputs = getAllByPlaceholderText(''); - inputs.forEach((input, index) => { - fireEvent.changeText(input, (index + 1).toString()); - }); - - const button = getByText('Verify'); - fireEvent.press(button); - - await act(async () => { - expect(router.push).toHaveBeenCalledWith('/home'); - }); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/SignIn.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/SignIn.test.js deleted file mode 100644 index 99314595..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/SignIn.test.js +++ /dev/null @@ -1,77 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import SignIn from '../../screens/Login/SignIn'; // Adjust the import path accordingly -import { useToast } from '@gluestack-ui/themed'; -import { router } from 'expo-router'; - -// Mock the router -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -// Mock the useToast hook -jest.mock('@gluestack-ui/themed', () => ({ - useToast: jest.fn(), -})); - -// Mock the StyledExpoRouterLink component -jest.mock('../../components/StyledExpoRouterLink', () => { - const MockStyledExpoRouterLink = () => null; - return MockStyledExpoRouterLink; -}); - -describe('SignIn Component', () => { - it('renders correctly', () => { - const { getByText, getByPlaceholderText } = render(); - - expect(getByText('Welcome back to Occupi.')).toBeTruthy(); - expect(getByPlaceholderText('john.doe@gmail.com')).toBeTruthy(); - expect(getByPlaceholderText('Enter your password')).toBeTruthy(); - expect(getByText('Login')).toBeTruthy(); - }); - - it('shows error message when email is invalid', async () => { - const { getByText, getByPlaceholderText } = render(); - - const emailInput = getByPlaceholderText('john.doe@gmail.com'); - const loginButton = getByText('Login'); - - fireEvent.changeText(emailInput, 'invalid-email'); - fireEvent.press(loginButton); - - await waitFor(() => { - expect(getByText('Invalid email address')).toBeTruthy(); - }); - }); - - it('shows success message and navigates to home screen on valid submission', async () => { - const mockToast = { show: jest.fn() }; - useToast.mockReturnValue(mockToast); - - const { getByText, getByPlaceholderText } = render(); - - const emailInput = getByPlaceholderText('john.doe@gmail.com'); - const passwordInput = getByPlaceholderText('Enter your password'); - const loginButton = getByText('Login'); - - fireEvent.changeText(emailInput, 'test@example.com'); - fireEvent.changeText(passwordInput, 'ValidPassword1!'); - fireEvent.press(loginButton); - - await waitFor(() => { - expect(mockToast.show).toHaveBeenCalledWith( - expect.objectContaining({ - render: expect.any(Function), - }) - ); - expect(router.push).toHaveBeenCalledWith('/home'); - }); - - const toastRender = mockToast.show.mock.calls[0][0].render; - const toastComponent = toastRender({ id: 'mockId' }); - const toastText = render(toastComponent).getByText('Signed in successfully'); - expect(toastText).toBeTruthy(); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/SignUp.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/SignUp.test.js deleted file mode 100644 index 7ad5381f..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/SignUp.test.js +++ /dev/null @@ -1,96 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import SignUp from '../../screens/Login/SignUp'; // Adjust the import path accordingly -import { useToast } from '@gluestack-ui/themed'; -import { router } from 'expo-router'; - -// Mock the router -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - replace: jest.fn(), - }, -})); - -// Mock the useToast hook -jest.mock('@gluestack-ui/themed', () => ({ - useToast: jest.fn(), -})); - -describe('SignUp Component', () => { - it('renders correctly', () => { - const { getByText, getByPlaceholderText } = render(); - - expect(getByText('Register for Occupi.')).toBeTruthy(); - expect(getByPlaceholderText('Email')).toBeTruthy(); - expect(getByPlaceholderText('Employee ID')).toBeTruthy(); - expect(getByPlaceholderText('Password')).toBeTruthy(); - expect(getByPlaceholderText('Confirm Password')).toBeTruthy(); - expect(getByText('Signup')).toBeTruthy(); - }); - - it('shows error message when passwords do not match', async () => { - const mockToast = { show: jest.fn() }; - useToast.mockReturnValue(mockToast); - - const { getByPlaceholderText, getByText } = render(); - - const emailInput = getByPlaceholderText('Email'); - const employeeIdInput = getByPlaceholderText('Employee ID'); - const passwordInput = getByPlaceholderText('Password'); - const confirmPasswordInput = getByPlaceholderText('Confirm Password'); - const signupButton = getByText('Signup'); - - fireEvent.changeText(emailInput, 'test@example.com'); - fireEvent.changeText(employeeIdInput, '123456'); - fireEvent.changeText(passwordInput, 'ValidPassword1!'); - fireEvent.changeText(confirmPasswordInput, 'InvalidPassword1!'); - fireEvent.press(signupButton); - - await waitFor(() => { - expect(mockToast.show).toHaveBeenCalledWith( - expect.objectContaining({ - render: expect.any(Function), - }) - ); - }); - - const toastRender = mockToast.show.mock.calls[0][0].render; - const toastComponent = toastRender({ id: 'mockId' }); - const toastText = render(toastComponent).getByText('Passwords do not match'); - expect(toastText).toBeTruthy(); - }); - - it('shows success message and navigates to verify-otp screen on valid submission', async () => { - const mockToast = { show: jest.fn() }; - useToast.mockReturnValue(mockToast); - - const { getByPlaceholderText, getByText } = render(); - - const emailInput = getByPlaceholderText('Email'); - const employeeIdInput = getByPlaceholderText('Employee ID'); - const passwordInput = getByPlaceholderText('Password'); - const confirmPasswordInput = getByPlaceholderText('Confirm Password'); - const signupButton = getByText('Signup'); - - fireEvent.changeText(emailInput, 'test@example.com'); - fireEvent.changeText(employeeIdInput, '123456'); - fireEvent.changeText(passwordInput, 'ValidPassword1!'); - fireEvent.changeText(confirmPasswordInput, 'ValidPassword1!'); - fireEvent.press(signupButton); - - await waitFor(() => { - expect(mockToast.show).toHaveBeenCalledWith( - expect.objectContaining({ - render: expect.any(Function), - }) - ); - expect(router.replace).toHaveBeenCalledWith('/verify-otp'); - }); - - const toastRender = mockToast.show.mock.calls[0][0].render; - const toastComponent = toastRender({ id: 'mockId' }); - const toastText = render(toastComponent).getByText('Email verified'); - expect(toastText).toBeTruthy(); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/SplashScreen.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/SplashScreen.test.js deleted file mode 100644 index b7b9e8fc..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/SplashScreen.test.js +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; -import { render, waitFor } from '@testing-library/react-native'; -import SplashScreen from '../../screens/Login/SplashScreen'; // Adjust the import path accordingly -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -describe('SplashScreen Component', () => { - it('renders correctly', () => { - const { getByAltText } = render(); - - expect(getByAltText('logo')).toBeTruthy(); - }); - - it('navigates to settings screen after 5 seconds', async () => { - render(); - - await waitFor(() => { - expect(router.push).toHaveBeenCalledWith('/settings'); - }, { timeout: 2500 }); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Login_Test/Welcome.test.js b/frontend/occupi-mobile3/__tests__/Login_Test/Welcome.test.js deleted file mode 100644 index 77da986f..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/Welcome.test.js +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Welcome from '../../screens/Login/Welcome'; -import { router } from 'expo-router'; - -// Mock the router -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -describe('Welcome', () => { - it('renders correctly', () => { - const { getByText, getByAltText } = render(); - - // Check if the text elements are rendered - expect(getByText("Log in. Let's Plan.")).toBeTruthy(); - expect(getByText("Predict. Plan. Perfect.")).toBeTruthy(); - expect(getByText("Login")).toBeTruthy(); - expect(getByText("Register")).toBeTruthy(); - - // Check if the logo image is rendered - expect(getByAltText("logo")).toBeTruthy(); - }); - - it('navigates to login screen when Login button is pressed', () => { - const { getByText } = render(); - const loginButton = getByText("Login"); - - fireEvent.press(loginButton); - expect(router.push).toHaveBeenCalledWith('/login'); - }); - - it('navigates to signup screen when Register text is pressed', () => { - const { getByText } = render(); - const registerText = getByText("Register"); - - fireEvent.press(registerText); - expect(router.push).toHaveBeenCalledWith('/signup'); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Profile_Test/Profile.test.js b/frontend/occupi-mobile3/__tests__/Profile_Test/Profile.test.js deleted file mode 100644 index 8f62ae9d..00000000 --- a/frontend/occupi-mobile3/__tests__/Profile_Test/Profile.test.js +++ /dev/null @@ -1,88 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import Profile from '../../screens/Profile/Profile'; -import { router } from 'expo-router'; -import DateTimePickerModal from 'react-native-modal-datetime-picker'; - -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -jest.mock('react-native-modal-datetime-picker', () => { - return { - __esModule: true, - default: jest.fn().mockImplementation(({ onConfirm, onCancel }) => null), - }; -}); - -describe('Profile Component', () => { - it('renders correctly', () => { - const { getByText, getByPlaceholderText } = render(); - - expect(getByText('My account')).toBeTruthy(); - expect(getByPlaceholderText('Sabrina Carpenter')).toBeTruthy(); - expect(getByText('Save')).toBeTruthy(); - }); - - it('navigates to settings screen on back arrow press', () => { - const { getByTestId } = render(); - - const backArrow = getByTestId('back-arrow'); - fireEvent.press(backArrow); - - expect(router.push).toHaveBeenCalledWith('/settings'); - }); - - it('shows date picker on date of birth press', () => { - const { getByText } = render(); - - const dateOfBirth = getByText(new Date(2000, 6, 7).toLocaleDateString()); - fireEvent.press(dateOfBirth); - - expect(DateTimePickerModal).toHaveBeenCalledWith( - expect.objectContaining({ - isVisible: true, - }), - {} - ); - }); - - it('saves profile with updated details', async () => { - const alertMock = jest.spyOn(global, 'alert').mockImplementation(() => {}); - - const { getByText, getByPlaceholderText } = render(); - - fireEvent.changeText(getByPlaceholderText('Sabrina Carpenter'), 'John Doe'); - fireEvent.changeText(getByPlaceholderText('u21546551@tuks.co.za'), 'john.doe@example.com'); - fireEvent.changeText(getByPlaceholderText('21546551'), '12345678'); - fireEvent.changeText(getByPlaceholderText('011 101 1111'), '987 654 3210'); - fireEvent.changeText(getByPlaceholderText('she/her'), 'he/him'); - - const saveButton = getByText('Save'); - fireEvent.press(saveButton); - - await waitFor(() => { - expect(alertMock).toHaveBeenCalledWith( - 'Profile Saved', - expect.stringContaining('Name: John Doe') - ); - }); - - alertMock.mockRestore(); - }); - - it('updates gender selection correctly', () => { - const { getByText } = render(); - - fireEvent.press(getByText('Male')); - expect(getByText('Male')).toBeTruthy(); - - fireEvent.press(getByText('Female')); - expect(getByText('Female')).toBeTruthy(); - - fireEvent.press(getByText('Other')); - expect(getByText('Other')).toBeTruthy(); - }); -}); diff --git a/frontend/occupi-mobile3/__tests__/Profile_Test/Settings.test.js b/frontend/occupi-mobile3/__tests__/Profile_Test/Settings.test.js deleted file mode 100644 index 71f1de6a..00000000 --- a/frontend/occupi-mobile3/__tests__/Profile_Test/Settings.test.js +++ /dev/null @@ -1,103 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import AsyncStorage from '@react-native-async-storage/async-storage'; -import Settings from '../../screens/Profile/Settings'; -import { useNavigation, NavigationContainer } from '@react-navigation/native'; - -jest.mock('@react-native-async-storage/async-storage', () => ({ - clear: jest.fn(), -})); - -jest.mock('@react-navigation/native', () => { - const actualNav = jest.requireActual('@react-navigation/native'); - return { - ...actualNav, - useNavigation: () => ({ - navigate: jest.fn(), - reset: jest.fn(), - }), - }; -}); - -jest.mock('@gluestack-ui/themed', () => ({ - useTheme: jest.fn(() => ({ theme: 'light', toggleTheme: jest.fn() })), - Switch: jest.fn(({ checked, onValueChange }) => ( - - )), - Icon: jest.fn(({ name, fill }) => ( - - )), - Divider: jest.fn(({ style }) => ( - - )), - Box: jest.fn(({ data, renderItem, ItemSeparatorComponent }) => ( - - {data.map((item, index) => ( - - {renderItem({ item })} - {index < data.length - 1 && } - - ))} - - )), -})); - -describe('Settings Component', () => { - const renderSettings = () => ( - - - - ); - - it('renders correctly', () => { - const { getByText, getByAltText } = render(renderSettings()); - - expect(getByAltText('logo')).toBeTruthy(); - expect(getByText('Sabrina Carpenter')).toBeTruthy(); - expect(getByText('Chief Executive Officer')).toBeTruthy(); - expect(getByText('Version 0.1.0')).toBeTruthy(); - }); - - it('navigates to correct screen when list item is pressed', () => { - const { getByText } = render(renderSettings()); - const navigation = useNavigation(); - - fireEvent.press(getByText('My account')); - expect(navigation.navigate).toHaveBeenCalledWith('AccountScreen'); - - fireEvent.press(getByText('Privacy Policy')); - expect(navigation.navigate).toHaveBeenCalledWith('PrivacyPolicyScreen'); - }); - - it('toggles notifications correctly', () => { - const { getByText, getByValue } = render(renderSettings()); - - const notificationsToggle = getByValue(true); // assuming true is the initial value - fireEvent(notificationsToggle, 'valueChange', false); - - expect(notificationsToggle.props.value).toBe(false); - }); - - it('toggles dark mode correctly', () => { - const { getByText, getByValue } = render(renderSettings()); - const themeToggle = getByValue(false); // assuming false is the initial value - - fireEvent(themeToggle, 'valueChange', true); - - expect(themeToggle.props.value).toBe(true); - }); - - it('logs out correctly', async () => { - const { getByText, getByAltText } = render(renderSettings()); - const navigation = useNavigation(); - - fireEvent.press(getByText('Log out')); - fireEvent.press(getByText('OK')); - - expect(AsyncStorage.clear).toHaveBeenCalled(); - expect(navigation.reset).toHaveBeenCalledWith({ - index: 0, - routes: [{ name: 'login' }], - }); - }); -}); diff --git a/frontend/occupi-mobile3/app.json b/frontend/occupi-mobile3/app.json index 16415bb4..cbe6bf6a 100644 --- a/frontend/occupi-mobile3/app.json +++ b/frontend/occupi-mobile3/app.json @@ -13,7 +13,10 @@ "backgroundColor": "#ffffff" }, "ios": { - "supportsTablet": true + "supportsTablet": true, + "infoPlist": { + "NSFaceIDUsageDescription": "Occupi needs to use Face ID to authenticate you" + } }, "android": { "adaptiveIcon": { @@ -27,7 +30,13 @@ "favicon": "./assets/images/favicon.png" }, "plugins": [ - "expo-router" + "expo-router", + [ + "expo-local-authentication", + { + "faceIDPermission": "Allow $(PRODUCT_NAME) to use Face ID." + } + ] ], "experiments": { "typedRoutes": true diff --git a/frontend/occupi-mobile3/app/_layout.tsx b/frontend/occupi-mobile3/app/_layout.tsx index 022f965c..8d6b75f3 100644 --- a/frontend/occupi-mobile3/app/_layout.tsx +++ b/frontend/occupi-mobile3/app/_layout.tsx @@ -40,12 +40,16 @@ export default function RootLayout() { + + + + ); diff --git a/frontend/occupi-mobile3/app/booking-details.tsx b/frontend/occupi-mobile3/app/booking-details.tsx new file mode 100644 index 00000000..ba686551 --- /dev/null +++ b/frontend/occupi-mobile3/app/booking-details.tsx @@ -0,0 +1,7 @@ +import BookingDetails from "../screens/Office/BookingDetails"; + +export default function Home() { + return ( + + ); +} \ No newline at end of file diff --git a/frontend/occupi-mobile3/app/booking-receipt.tsx b/frontend/occupi-mobile3/app/booking-receipt.tsx new file mode 100644 index 00000000..bc3ad195 --- /dev/null +++ b/frontend/occupi-mobile3/app/booking-receipt.tsx @@ -0,0 +1,7 @@ +import BookingReceipt from "../screens/Office/BookingReceipt"; + +export default function Home() { + return ( + + ); +} \ No newline at end of file diff --git a/frontend/occupi-mobile3/app/bookings.tsx b/frontend/occupi-mobile3/app/bookings.tsx index 16084b4e..cc1e7546 100644 --- a/frontend/occupi-mobile3/app/bookings.tsx +++ b/frontend/occupi-mobile3/app/bookings.tsx @@ -1,7 +1,7 @@ -import Bookings from "../screens/Dashboard/Bookings"; +import BookRoom from "../screens/Booking/BookRoom"; export default function Home() { return ( - + ); } \ No newline at end of file diff --git a/frontend/occupi-mobile3/app/office-details.tsx b/frontend/occupi-mobile3/app/office-details.tsx new file mode 100644 index 00000000..4db01f30 --- /dev/null +++ b/frontend/occupi-mobile3/app/office-details.tsx @@ -0,0 +1,7 @@ +import OfficeDetails from "../screens/Office/OfficeDetails"; + +export default function Home() { + return ( + + ); +} \ No newline at end of file diff --git a/frontend/occupi-mobile3/app/viewbookings.tsx b/frontend/occupi-mobile3/app/viewbookings.tsx new file mode 100644 index 00000000..c4b0c5e5 --- /dev/null +++ b/frontend/occupi-mobile3/app/viewbookings.tsx @@ -0,0 +1,7 @@ +import ViewBookings from "../screens/Booking/ViewBookings"; + +export default function Home() { + return ( + + ); +} \ No newline at end of file diff --git a/frontend/occupi-mobile3/babel.config.js b/frontend/occupi-mobile3/babel.config.js index 2b5715c7..24a5bd7a 100644 --- a/frontend/occupi-mobile3/babel.config.js +++ b/frontend/occupi-mobile3/babel.config.js @@ -1,17 +1,6 @@ module.exports = function (api) { api.cache(true); - return { - presets: [ - 'babel-preset-expo', - ['@babel/preset-env', { targets: { node: 'current' }, loose: true }], - '@babel/preset-react', - '@babel/preset-typescript', - ], - plugins: [ - ['@babel/plugin-transform-class-properties', { loose: true }], - ['@babel/plugin-transform-private-methods', { loose: true }], - ['@babel/plugin-transform-private-property-in-object', { loose: true }], - '@babel/plugin-transform-runtime', - ], - }; + return { + presets: ['babel-preset-expo'], + } }; diff --git a/frontend/occupi-mobile3/bun.lockb b/frontend/occupi-mobile3/bun.lockb new file mode 100644 index 00000000..cc87f171 Binary files /dev/null and b/frontend/occupi-mobile3/bun.lockb differ diff --git a/frontend/occupi-mobile3/components/BookingsSort.tsx b/frontend/occupi-mobile3/components/BookingsSort.tsx new file mode 100644 index 00000000..e69de29b diff --git a/frontend/occupi-mobile3/components/NavBar.tsx b/frontend/occupi-mobile3/components/NavBar.tsx index 47091a5a..0c1dd3ff 100644 --- a/frontend/occupi-mobile3/components/NavBar.tsx +++ b/frontend/occupi-mobile3/components/NavBar.tsx @@ -1,32 +1,38 @@ import React from 'react'; -import { StyleSheet } from 'react-native'; +import { StyleSheet } from 'react-native'; import { Text, View, Button, Icon, SearchIcon, CalendarDaysIcon, BellIcon } from '@gluestack-ui/themed'; -import StyledExpoRouterLink from './StyledExpoRouterLink'; import { Feather } from '@expo/vector-icons'; import { FontAwesome6 } from '@expo/vector-icons'; import { router } from 'expo-router'; -import { - Avatar, - AvatarBadge, - AvatarFallbackText, - AvatarImage, - } from "@gluestack-ui/themed" import { BlurView } from 'expo-blur'; import { Appearance, useColorScheme } from 'react-native'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; const NavBar = () => { let colorScheme = useColorScheme(); const styles = getStyles(colorScheme); return ( - - - - - - - {/* - Tinashe Austin - */} + + + + + + ); }; @@ -37,17 +43,13 @@ const getStyles = (colorScheme) => StyleSheet.create({ bottom: 0, left: 0, right: 0, - paddingHorizontal: 16, - paddingBottom: 26, + paddingHorizontal: wp('4%'), + paddingBottom: hp('3%'), flexDirection: 'row', justifyContent: 'space-around', backgroundColor: colorScheme === 'dark' ? 'rgba(0, 0, 0, 0.8)' : 'rgba(255, 255, 255, 0.5)', - // backgroundColor: '#fff', - paddingVertical: 10, + paddingVertical: hp('1%'), borderTopWidth: 1, - // borderLeftWidth: 1, - // borderRightWidth: 1, - // borderRadius: 20, borderTopColor: colorScheme === 'dark' ? '#444' : '#ccc', borderLeftColor: '#ccc', borderRightColor: '#ccc', diff --git a/frontend/occupi-mobile3/jest.setup.js b/frontend/occupi-mobile3/jest.setup.js new file mode 100644 index 00000000..9f28ad21 --- /dev/null +++ b/frontend/occupi-mobile3/jest.setup.js @@ -0,0 +1 @@ +import '@testing-library/jest-native/extend-expect'; diff --git a/frontend/occupi-mobile3/package-lock.json b/frontend/occupi-mobile3/package-lock.json index dc51534b..98328aff 100644 --- a/frontend/occupi-mobile3/package-lock.json +++ b/frontend/occupi-mobile3/package-lock.json @@ -20,21 +20,27 @@ "@legendapp/motion": "^2.3.0", "@react-native-community/datetimepicker": "^8.0.1", "@react-native-picker/picker": "^2.7.6", + "@react-native-segmented-control/segmented-control": "^2.5.2", "@react-navigation/native": "^6.0.2", "@react-navigation/stack": "^6.3.29", "@testing-library/react": "^14.0.0", "@ui-kitten/components": "^5.3.1", "@ui-kitten/eva-icons": "^5.3.1", - "expo": "~51.0.8", + "expo": "^51.0.9", "expo-blur": "~13.0.2", "expo-constants": "~16.0.1", + "expo-crypto": "^13.0.2", + "expo-file-system": "^17.0.1", "expo-font": "~12.0.5", "expo-linear-gradient": "^13.0.2", "expo-linking": "~6.3.1", + "expo-local-authentication": "^14.0.1", "expo-mail-composer": "~13.0.1", + "expo-print": "^13.0.1", "expo-random": "^14.0.1", "expo-router": "~3.5.14", "expo-secure-store": "^13.0.1", + "expo-sharing": "^12.0.1", "expo-splash-screen": "~0.27.4", "expo-status-bar": "~1.12.1", "expo-system-ui": "~3.0.4", @@ -48,17 +54,19 @@ "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.51.5", - "react-native": "^0.74.1", + "react-native": "0.74.1", "react-native-eva-icons": "^1.3.1", "react-native-gesture-handler": "~2.16.1", "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-modal-datetime-picker": "^17.1.0", "react-native-picker-select": "^9.1.3", "react-native-reanimated": "~3.10.1", + "react-native-responsive-layout": "^1.2.0", "react-native-responsive-screen": "^1.4.2", "react-native-safe-area-context": "4.10.1", "react-native-screens": "3.31.1", "react-native-settings-components": "^0.0.2", + "react-native-snap-carousel": "^1.6.1", "react-native-svg": "15.2.0", "react-native-vector-icons": "^10.1.0", "react-native-web": "~0.19.10", @@ -77,6 +85,7 @@ "@testing-library/react-native": "^12.5.1", "@types/jest": "^29.5.4", "@types/react": "~18.2.79", + "@types/react-native-snap-carousel": "^3.8.11", "@types/react-test-renderer": "^18.0.1", "babel-jest": "^29.7.0", "babel-preset-expo": "^9.2.2", @@ -96,8 +105,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -152,9 +159,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", - "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.6", + "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" }, "engines": { @@ -165,7 +171,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -204,9 +209,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.6", + "@babel/types": "^7.24.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -219,7 +223,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", - "license": "MIT", "dependencies": { "@babel/types": "^7.24.6" }, @@ -231,8 +234,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/types": "^7.24.6" }, @@ -244,10 +246,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -260,16 +261,15 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-member-expression-to-functions": "^7.24.6", - "@babel/helper-optimise-call-expression": "^7.24.6", - "@babel/helper-replace-supers": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -283,9 +283,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -316,7 +315,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -325,10 +323,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", - "license": "MIT", "dependencies": { - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -338,9 +335,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -350,9 +346,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -362,9 +358,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -374,13 +370,12 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-module-imports": "^7.24.6", - "@babel/helper-simple-access": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -393,9 +388,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -405,7 +399,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -414,11 +407,10 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-wrap-function": "^7.24.6" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -431,11 +423,10 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-member-expression-to-functions": "^7.24.6", - "@babel/helper-optimise-call-expression": "^7.24.6" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -448,9 +439,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -460,9 +451,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -472,9 +463,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", - "license": "MIT", "dependencies": { - "@babel/types": "^7.24.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -484,7 +474,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -493,7 +482,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -502,7 +490,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -511,11 +498,11 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", - "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.24.6", - "@babel/template": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -538,9 +525,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", - "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -553,7 +539,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", - "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -565,8 +550,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -582,8 +566,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -598,8 +581,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", @@ -616,8 +598,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -808,8 +789,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", + "peer": true, "engines": { "node": ">=6.9.0" }, @@ -833,8 +813,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -846,8 +825,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -859,8 +836,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -944,8 +920,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -960,8 +935,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -976,8 +950,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -989,8 +961,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1104,8 +1074,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1135,8 +1103,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1152,7 +1119,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1167,8 +1133,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", @@ -1186,7 +1151,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", @@ -1203,8 +1167,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1219,9 +1182,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1234,8 +1196,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1251,8 +1212,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", @@ -1269,15 +1229,14 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-replace-supers": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { @@ -1291,10 +1250,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/template": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1307,7 +1265,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1322,8 +1279,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1339,8 +1295,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1355,8 +1310,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1372,8 +1326,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1389,9 +1342,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1421,8 +1373,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" @@ -1438,7 +1389,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", - "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.24.6", "@babel/helper-function-name": "^7.24.6", @@ -1455,8 +1405,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1472,7 +1421,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1487,8 +1435,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1504,8 +1451,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1520,8 +1466,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1537,7 +1482,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", - "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", @@ -1554,8 +1498,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-hoist-variables": "^7.24.6", "@babel/helper-module-transforms": "^7.24.6", @@ -1573,8 +1516,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1590,10 +1532,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1606,8 +1547,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1622,9 +1562,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1638,8 +1577,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1655,10 +1593,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", - "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.24.6" }, @@ -1673,8 +1610,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/helper-replace-supers": "^7.24.6" @@ -1690,8 +1626,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1707,10 +1642,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1724,9 +1658,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1739,10 +1672,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", - "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1755,11 +1687,10 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.6", - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1773,8 +1704,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1884,8 +1814,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" @@ -1901,8 +1830,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1937,9 +1865,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1952,10 +1879,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1968,9 +1894,8 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1983,7 +1908,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1998,8 +1922,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -2032,8 +1955,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -2048,8 +1970,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -2065,7 +1986,6 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", - "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -2081,8 +2001,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -2098,8 +2017,7 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/compat-data": "^7.24.6", "@babel/helper-compilation-targets": "^7.24.6", @@ -2211,8 +2129,7 @@ "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -2302,11 +2219,10 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2316,16 +2232,15 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.6", - "@babel/generator": "^7.24.6", - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-function-name": "^7.24.6", - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-split-export-declaration": "^7.24.6", - "@babel/parser": "^7.24.6", - "@babel/types": "^7.24.6", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2337,10 +2252,9 @@ "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", - "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2351,8 +2265,7 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/@egjs/hammerjs": { "version": "2.0.17", @@ -2801,10 +2714,9 @@ } }, "node_modules/@expo/cli": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.14.tgz", - "integrity": "sha512-ke2IVs3MfIMe2NjXY11Ky9+r0+eav6NUa+cy61wpZNPe5QkwIJ56SdJ4wIMMKFPFhgLsy1vfaqhOcZo96U4wCg==", - "license": "MIT", + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.13.tgz", + "integrity": "sha512-ZO1fpDK8z6mLeQGuFP6e3cZyCHV55ohZY7/tEyhpft3bwysS680eyFg5SFe+tWNFesnziFrbtI8JaUyhyjqovA==", "dependencies": { "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "0.0.5", @@ -2818,11 +2730,11 @@ "@expo/osascript": "^2.0.31", "@expo/package-manager": "^1.5.0", "@expo/plist": "^0.1.0", - "@expo/prebuild-config": "7.0.3", + "@expo/prebuild-config": "7.0.4", "@expo/rudder-sdk-node": "1.1.1", "@expo/spawn-async": "^1.7.2", "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "~0.74.75", + "@react-native/dev-middleware": "0.74.83", "@urql/core": "2.3.6", "@urql/exchange-retry": "0.3.0", "accepts": "^1.3.8", @@ -3735,10 +3647,9 @@ } }, "node_modules/@expo/metro-config": { - "version": "0.18.3", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.3.tgz", - "integrity": "sha512-E4iW+VT/xHPPv+t68dViOsW7egtGIr+sRElcym0iGpC4goLz9WBux/xGzWgxvgvvHEWa21uSZQPM0jWla0OZXg==", - "license": "MIT", + "version": "0.18.4", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.4.tgz", + "integrity": "sha512-vh9WDf/SzE+NYCn6gqbzLKiXtENFlFZdAqyj9nI38RvQ4jw6TJIQ8+ExcdLDT3MOG36Ytg44XX9Zb3OWF6LVxw==", "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", @@ -4044,10 +3955,9 @@ ] }, "node_modules/@expo/osascript": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.3.tgz", - "integrity": "sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==", - "license": "MIT", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.2.tgz", + "integrity": "sha512-/ugqDG+52uzUiEpggS9GPdp9g0U9EQrXcTdluHDmnlGmR2nV/F83L7c+HCUyPnf77QXwkr8gQk16vQTbxBQ5eA==", "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -4210,17 +4120,16 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.3.tgz", - "integrity": "sha512-Kvxy/oQzkxwXLvAmwb+ygxuRn4xUUN2+mVJj3KDe4bRVCNyDPs7wlgdokF3twnWjzRZssUzseMkhp+yHPjAEhA==", - "license": "MIT", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.4.tgz", + "integrity": "sha512-E2n3QbwgV8Qa0CBw7BHrWBDWD7l8yw+N/yjvXpSPFFtoZLMSKyegdkJFACh2u+UIRKUSZm8zQwHeZR0rqAxV9g==", "dependencies": { "@expo/config": "~9.0.0-beta.0", "@expo/config-plugins": "~8.0.0-beta.0", "@expo/config-types": "^51.0.0-unreleased", "@expo/image-utils": "^0.5.0", "@expo/json-file": "^8.3.0", - "@react-native/normalize-colors": "~0.74.83", + "@react-native/normalize-colors": "0.74.83", "debug": "^4.3.1", "fs-extra": "^9.0.0", "resolve-from": "^5.0.0", @@ -5342,8 +5251,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", + "devOptional": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -5355,12 +5263,63 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "devOptional": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "devOptional": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "devOptional": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "devOptional": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -5369,8 +5328,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -5387,8 +5345,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5403,8 +5360,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5420,8 +5376,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5433,25 +5388,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -5460,8 +5403,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5473,8 +5415,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -5521,8 +5462,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5537,8 +5477,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5554,8 +5493,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5567,25 +5505,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -5594,8 +5520,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5634,8 +5559,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -5648,8 +5572,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "jest-get-type": "^29.6.3" }, @@ -5678,8 +5601,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -5694,8 +5616,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -5738,8 +5659,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5754,8 +5674,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5771,8 +5690,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5784,55 +5702,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", - "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@jest/reporters/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -5841,8 +5717,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5866,8 +5741,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -5881,8 +5755,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -5897,8 +5770,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -5923,8 +5795,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -5950,8 +5821,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5966,8 +5836,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5983,8 +5852,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5996,25 +5864,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -6023,8 +5879,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -6032,6 +5887,19 @@ "node": ">=8" } }, + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "devOptional": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", @@ -6853,6 +6721,21 @@ "react-native": "^0.0.0-0 || >=0.60 <1.0" } }, + "node_modules/@react-native-community/art": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@react-native-community/art/-/art-1.2.0.tgz", + "integrity": "sha512-a+ZcRGl/BzLa89yi33Mbn5SHavsEXqKUMdbfLf3U8MDLElndPqUetoJyGkv63+BcPO49UMWiQRP1YUz6/zfJ+A==", + "deprecated": "If you need a similar package, please consider using react-native-svg or @shopify/react-native-skia", + "dependencies": { + "art": "^0.10.3", + "invariant": "^2.2.4", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/@react-native-community/cli": { "version": "13.6.6", "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.6.tgz", @@ -8605,6 +8488,15 @@ "react-native": "*" } }, + "node_modules/@react-native-segmented-control/segmented-control": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@react-native-segmented-control/segmented-control/-/segmented-control-2.5.2.tgz", + "integrity": "sha512-Rm+i7cI/ztZyYLUXzzfiyoe44m3JxAix82qS2Av/DkPWCR1bgfkxtrm6OZ06p4/2hqp4RvtMftxQiHGr/GDPew==", + "peerDependencies": { + "react": ">=16.0", + "react-native": ">=0.62" + } + }, "node_modules/@react-native/assets-registry": { "version": "0.74.83", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.83.tgz", @@ -11095,8 +10987,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -11109,8 +11000,7 @@ "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -11119,8 +11009,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -11130,8 +11019,7 @@ "version": "7.20.6", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -11158,8 +11046,7 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@types/node": "*" } @@ -11281,6 +11168,16 @@ "@types/react": "*" } }, + "node_modules/@types/react-native": { + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.73.0.tgz", + "integrity": "sha512-6ZRPQrYM72qYKGWidEttRe6M5DZBEV5F+MHMHqd4TTYx0tfkcdrUFGdef6CCxY0jXU7wldvd/zA/b0A/kTeJmA==", + "deprecated": "This is a stub types definition. react-native provides its own type definitions, so you do not need this installed.", + "peer": true, + "dependencies": { + "react-native": "*" + } + }, "node_modules/@types/react-test-renderer": { "version": "18.3.0", "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.3.0.tgz", @@ -11752,6 +11649,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/art": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/art/-/art-0.10.3.tgz", + "integrity": "sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ==", + "engines": { + "node": "*" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -11835,8 +11740,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -11857,8 +11761,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11873,8 +11776,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11890,8 +11792,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11903,25 +11804,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -11930,8 +11819,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11943,8 +11831,7 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "license": "BSD-3-Clause", + "devOptional": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -11956,12 +11843,27 @@ "node": ">=8" } }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "devOptional": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -12107,8 +12009,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -12128,68 +12029,27 @@ } }, "node_modules/babel-preset-expo": { - "version": "9.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-9.9.0.tgz", - "integrity": "sha512-Mg5euDpBPi2/N/3eao+hJ0vYONAUVB9qhziGDnTf4MotBDrT4qEOBYdvN1HVBkoL8FtEHTlZ8tU8eAyeScynZw==", - "dev": true, - "license": "MIT", + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-11.0.6.tgz", + "integrity": "sha512-jRi9I5/jT+dnIiNJDjDg+I/pV+AlxrIW/DNbdqYoRWPZA/LHDqD6IJnJXLxbuTcQ+llp+0LWcU7f/kC/PgGpkw==", "dependencies": { "@babel/plugin-proposal-decorators": "^7.12.9", "@babel/plugin-proposal-object-rest-spread": "^7.12.13", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/preset-env": "^7.20.0", - "@babel/preset-react": "^7.22.15", - "babel-plugin-module-resolver": "^5.0.0", - "babel-plugin-react-native-web": "~0.18.10", - "metro-react-native-babel-preset": "0.76.8" - } - }, - "node_modules/babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/preset-env": "^7.20.0", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "~0.74.83", + "babel-plugin-react-native-web": "~0.19.10", + "react-refresh": "^0.14.2" } }, "node_modules/babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -12252,8 +12112,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -12626,8 +12484,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=6" } @@ -12645,8 +12502,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -12707,8 +12562,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=10" } @@ -12726,8 +12580,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -12793,8 +12645,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/clean-stack": { "version": "2.2.0", @@ -12891,8 +12742,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -12902,8 +12752,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/color": { "version": "4.2.3", @@ -13166,8 +13015,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -13188,8 +13036,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -13204,8 +13051,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13221,8 +13067,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -13234,15 +13079,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/create-jest/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -13251,8 +13094,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -13627,8 +13469,7 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -13871,8 +13712,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -13880,9 +13720,7 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -13909,9 +13747,7 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true, - "license": "MIT" + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/dom-accessibility-api": { "version": "0.5.16", @@ -14058,8 +13894,7 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=12" }, @@ -14430,8 +14265,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -14570,8 +14403,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -14584,24 +14416,23 @@ } }, "node_modules/expo": { - "version": "51.0.9", - "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.9.tgz", - "integrity": "sha512-USckGusi4389X/mFy8X8tEA59vgsc5joOILQrTsDPdDJawkUidDAVqY4NIjJxOY7zEq1SfPv/LglJ4cOdtvfsg==", - "license": "MIT", + "version": "51.0.8", + "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.8.tgz", + "integrity": "sha512-bdTOiMb1f3PChtuqEZ9czUm2gMTmS0r1+H+Pkm2O3PsuLnOgxfIBzL6S37+J4cUocLBaENrmx9SOGKpzhBqXpg==", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.18.14", - "@expo/config": "9.0.1", + "@expo/cli": "0.18.13", + "@expo/config": "9.0.2", "@expo/config-plugins": "8.0.4", "@expo/metro-config": "0.18.3", "@expo/vector-icons": "^14.0.0", - "babel-preset-expo": "~11.0.6", - "expo-asset": "~10.0.6", + "babel-preset-expo": "~11.0.7", + "expo-asset": "~10.0.7", "expo-file-system": "~17.0.1", "expo-font": "~12.0.6", "expo-keep-awake": "~13.0.2", "expo-modules-autolinking": "1.11.1", - "expo-modules-core": "1.12.12", + "expo-modules-core": "1.12.11", "fbemitter": "^3.0.0", "whatwg-url-without-unicode": "8.0.0-3" }, @@ -14613,9 +14444,8 @@ "version": "10.0.6", "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-10.0.6.tgz", "integrity": "sha512-waP73/ccn/HZNNcGM4/s3X3icKjSSbEQ9mwc6tX34oYNg+XE5WdwOuZ9wgVVFrU7wZMitq22lQXd2/O0db8bxg==", - "license": "MIT", "dependencies": { - "@react-native/assets-registry": "~0.74.83", + "@react-native/assets-registry": "0.74.83", "expo-constants": "~16.0.0", "invariant": "^2.2.4", "md5-file": "^3.2.3" @@ -14646,6 +14476,17 @@ "expo": "*" } }, + "node_modules/expo-crypto": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-13.0.2.tgz", + "integrity": "sha512-7f/IMPYJZkBM21LNEMXGrNo/0uXSVfZTwufUdpNKedJR0fm5fH4DCSN79ZddlV26nF90PuXjK2inIbI6lb0qRA==", + "dependencies": { + "base64-js": "^1.3.0" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-eas-client": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/expo-eas-client/-/expo-eas-client-0.12.0.tgz", @@ -14662,10 +14503,9 @@ } }, "node_modules/expo-font": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-12.0.6.tgz", - "integrity": "sha512-eognUxmZi2urCdERA5KuZpXUJO9JomOG/5ZKw9fGUhDi86SQ/6UWw+nMGbtshjWdJ0Vt0zHAdaIYx8aHq2iRzA==", - "license": "MIT", + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-12.0.5.tgz", + "integrity": "sha512-h/VkN4jlHYDJ6T6pPgOYTVoDEfBY0CTKQe4pxnPDGQiE6H+DFdDgk+qWVABGpRMH0+zXoHB+AEi3OoQjXIynFA==", "dependencies": { "fontfaceobserver": "^2.1.0" }, @@ -14707,6 +14547,17 @@ "invariant": "^2.2.4" } }, + "node_modules/expo-local-authentication": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/expo-local-authentication/-/expo-local-authentication-14.0.1.tgz", + "integrity": "sha512-kAwUD1wEqj1fhwQgIHlP4H/JV9AcX+NO3BJwhPM2HuCFS0kgx2wvcHisnKBSTRyl8u5Jt4odzMyQkDJystwUTg==", + "dependencies": { + "invariant": "^2.2.4" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-mail-composer": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/expo-mail-composer/-/expo-mail-composer-13.0.1.tgz", @@ -14907,14 +14758,22 @@ } }, "node_modules/expo-modules-core": { - "version": "1.12.12", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.12.12.tgz", - "integrity": "sha512-ls2Ido4Aduo4f9/LPQx66Hp3X2qddVOY5S7kP3/lp/G4ieqfPcUMueGYSeaz76fg/TYXRh2XLv/HGvu8zV6bbQ==", - "license": "MIT", + "version": "1.12.11", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.12.11.tgz", + "integrity": "sha512-CF5G6hZo/6uIUz6tj4dNRlvE5L4lakYukXPqz5ZHQ+6fLk1NQVZbRdpHjMkxO/QSBQcKUzG/ngeytpoJus7poQ==", "dependencies": { "invariant": "^2.2.4" } }, + "node_modules/expo-print": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/expo-print/-/expo-print-13.0.1.tgz", + "integrity": "sha512-o8LuCguGrkyC5RaWEfL5N2J0V9mfbZ3GVzLpaf3KU5RrdYzGEjoiv4xlhVVzh/++hMUqOgnIrtF7tzWYhwu/7g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-random": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/expo-random/-/expo-random-14.0.1.tgz", @@ -14974,6 +14833,15 @@ "expo": "*" } }, + "node_modules/expo-sharing": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/expo-sharing/-/expo-sharing-12.0.1.tgz", + "integrity": "sha512-wBT+WeXwapj/9NWuLJO01vi9bdlchYu/Q/xD8slL/Ls4vVYku8CPqzkTtDFcjLrjtlJqyeHsdQXwKLvORmBIew==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-splash-screen": { "version": "0.27.4", "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.27.4.tgz", @@ -15134,38 +15002,6 @@ "expo": "*" } }, - "node_modules/expo/node_modules/babel-plugin-react-native-web": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.12.tgz", - "integrity": "sha512-eYZ4+P6jNcB37lObWIg0pUbi7+3PKoU1Oie2j0C8UF3cXyXoR74tO2NBjI/FORb2LJyItJZEAmjU5pSaJYEL1w==", - "license": "MIT" - }, - "node_modules/expo/node_modules/babel-preset-expo": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-11.0.6.tgz", - "integrity": "sha512-jRi9I5/jT+dnIiNJDjDg+I/pV+AlxrIW/DNbdqYoRWPZA/LHDqD6IJnJXLxbuTcQ+llp+0LWcU7f/kC/PgGpkw==", - "license": "MIT", - "dependencies": { - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.12.13", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "~0.74.83", - "babel-plugin-react-native-web": "~0.19.10", - "react-refresh": "^0.14.2" - } - }, - "node_modules/expo/node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -15218,8 +15054,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/fast-loops": { "version": "1.1.3", @@ -15742,8 +15577,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8.0.0" } @@ -16131,8 +15965,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/http-cache-semantics": { "version": "4.1.1", @@ -16302,8 +16135,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -16489,8 +16321,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -16620,8 +16450,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=6" } @@ -16988,18 +16817,16 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", + "devOptional": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "license": "BSD-3-Clause", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "devOptional": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -17008,15 +16835,26 @@ "semver": "^6.3.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "devOptional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", + "devOptional": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -17030,8 +16868,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -17069,8 +16906,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -17082,8 +16918,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "license": "BSD-3-Clause", + "devOptional": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -17097,8 +16932,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -17107,8 +16941,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "license": "BSD-3-Clause", + "devOptional": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -17121,7 +16954,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -17139,8 +16971,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -17166,8 +16997,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -17181,8 +17011,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -17205,8 +17034,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=10" }, @@ -17218,8 +17046,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" }, @@ -17231,8 +17058,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=6" } @@ -17241,8 +17067,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "path-key": "^3.0.0" }, @@ -17254,8 +17079,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -17270,8 +17094,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -17302,8 +17125,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -17318,8 +17140,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17335,8 +17156,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -17348,25 +17168,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -17375,8 +17183,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -17388,8 +17195,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -17422,8 +17228,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -17438,8 +17243,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17455,8 +17259,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -17468,15 +17271,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -17485,8 +17286,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -17498,8 +17298,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -17544,8 +17343,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -17560,8 +17358,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17577,8 +17374,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -17590,25 +17386,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -17617,8 +17401,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -17722,8 +17505,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -17735,8 +17517,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -17752,8 +17533,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -17768,8 +17548,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17785,8 +17564,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -17798,15 +17576,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -17815,8 +17591,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -17977,8 +17752,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -18002,9 +17776,8 @@ "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "license": "MIT", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "devOptional": true, "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -18222,8 +17995,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=6" }, @@ -18240,8 +18012,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -18250,8 +18021,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -18271,8 +18041,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -18285,8 +18054,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -18301,8 +18069,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18318,8 +18085,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -18331,25 +18097,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -18358,8 +18112,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -18371,8 +18124,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -18404,8 +18156,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -18420,8 +18171,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18437,8 +18187,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -18450,15 +18199,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -18467,8 +18214,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -18477,8 +18223,7 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -18488,8 +18233,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -18501,8 +18245,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -18535,8 +18278,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -18551,8 +18293,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18568,8 +18309,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -18581,25 +18321,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -18608,8 +18336,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -18635,8 +18362,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -18667,8 +18393,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -18683,8 +18408,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18700,8 +18424,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -18713,15 +18436,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -18730,8 +18451,7 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "license": "ISC", + "devOptional": true, "bin": { "semver": "bin/semver.js" }, @@ -18743,8 +18463,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -19207,8 +18926,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -19227,8 +18945,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -19243,8 +18960,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19260,8 +18976,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -19273,15 +18988,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -19290,8 +19003,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -19348,8 +19060,6 @@ "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -19392,6 +19102,11 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbarcode": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/jsbarcode/-/jsbarcode-3.11.6.tgz", + "integrity": "sha512-G5TKGyKY1zJo0ZQKFM1IIMfy0nF2rs92BLlCz+cU4/TazIc4ZH+X1GYeDRt7TKjrYqmPfTjwTBkU/QnQlsYiuA==" + }, "node_modules/jsc-android": { "version": "250231.0.0", "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", @@ -19632,8 +19347,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/json-schema-deref-sync": { "version": "0.13.0", @@ -19943,8 +19657,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -20202,10 +19914,10 @@ } }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "devOptional": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -20215,10 +19927,10 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "devOptional": true, "bin": { "semver": "bin/semver" } @@ -21600,6 +21312,15 @@ "mkdirp": "bin/cmd.js" } }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "optional": true, + "engines": { + "node": "*" + } + }, "node_modules/moti": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/moti/-/moti-0.29.0.tgz", @@ -21766,8 +21487,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "devOptional": true }, "node_modules/ncp": { "version": "2.0.0", @@ -22078,8 +21798,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 6" } @@ -22363,8 +22081,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -22542,8 +22259,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "find-up": "^4.0.0" }, @@ -22551,12 +22267,11 @@ "node": ">=8" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "license": "MIT", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "devOptional": true, "dependencies": { "find-up": "^3.0.0" }, @@ -22564,12 +22279,11 @@ "node": ">=8" } }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "license": "MIT", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "devOptional": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -22595,8 +22309,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "p-try": "^2.0.0" }, @@ -22607,12 +22320,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "devOptional": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -22779,8 +22491,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -22797,8 +22507,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -22853,8 +22561,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", - "dev": true, - "license": "MIT", "engines": { "node": ">=14" }, @@ -23177,6 +22883,14 @@ "node": ">=0.10.0" } }, + "node_modules/react-addons-shallow-compare": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/react-addons-shallow-compare/-/react-addons-shallow-compare-15.6.3.tgz", + "integrity": "sha512-EDJbgKTtGRLhr3wiGDXK/+AEJ59yqGS+tKE6mue0aNXT6ZMR7VJbbzIiT6akotmHg1BLj46ElJSb+NBMp80XBg==", + "dependencies": { + "object-assign": "^4.1.0" + } + }, "node_modules/react-devtools-core": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.2.0.tgz", @@ -23321,12 +23035,46 @@ } } }, + "node_modules/react-native-barcode-builder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-native-barcode-builder/-/react-native-barcode-builder-2.0.0.tgz", + "integrity": "sha512-hOpP321behSPlpWNGcowN66P9Z2Xv6kQwa2I8SdfSGMFmJlll1b22R63xQSIAi72RC/gZe1cWBBz03J686e9JA==", + "dependencies": { + "@react-native-community/art": "^1.2.0", + "jsbarcode": "^3.8.0" + }, + "peerDependencies": { + "prop-types": "^15.5.0" + } + }, + "node_modules/react-native-calendars": { + "version": "1.1305.0", + "resolved": "https://registry.npmjs.org/react-native-calendars/-/react-native-calendars-1.1305.0.tgz", + "integrity": "sha512-KcT7fhDo8Tx2vx2q6RtyYGHRgKp2siY183czD95U+swytT6m1HAWEX5bZFpl/c4oih0IamAB0qoGOMJCWkYweQ==", + "dependencies": { + "hoist-non-react-statics": "^3.3.1", + "lodash": "^4.17.15", + "memoize-one": "^5.2.1", + "prop-types": "^15.5.10", + "react-native-swipe-gestures": "^1.0.5", + "recyclerlistview": "^4.0.0", + "xdate": "^0.8.0" + }, + "optionalDependencies": { + "moment": "^2.29.4" + } + }, "node_modules/react-native-dialogs": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/react-native-dialogs/-/react-native-dialogs-1.1.2.tgz", "integrity": "sha512-W0y22JpiywLNVYny32Z85h2zETkY9Neh48zndHJ4Byx/vS96Ex/0fhZ55hRS7XER7SBH3SHo5+TBTuX7ECHrLw==", "license": "MIT" }, + "node_modules/react-native-dropdown-select-list": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-native-dropdown-select-list/-/react-native-dropdown-select-list-2.0.5.tgz", + "integrity": "sha512-TepbcagQVUMB6nLuIlVU2ghRpQHAECOeZWe8K04ymW6NqbKbxuczZSDFfdCiABiiQ2dFD+8Dz65y4K7/uUEqGg==" + }, "node_modules/react-native-eva-icons": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/react-native-eva-icons/-/react-native-eva-icons-1.3.1.tgz", @@ -23437,6 +23185,18 @@ "react-native": "*" } }, + "node_modules/react-native-responsive-layout": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-native-responsive-layout/-/react-native-responsive-layout-1.2.0.tgz", + "integrity": "sha512-chzbl5ogy/N94pxnCbLQ3Ru8pS2FTxdPPDzP52reU/rdp2G6bTXvfM00MsUDDEffHrbPtWccBXnrn1CHi1Q9pg==", + "dependencies": { + "prop-types": "^15.6.0" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-native": ">=0.52.2" + } + }, "node_modules/react-native-responsive-screen": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/react-native-responsive-screen/-/react-native-responsive-screen-1.4.2.tgz", @@ -23485,6 +23245,19 @@ "react-native": ">=0.56.0" } }, + "node_modules/react-native-snap-carousel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/react-native-snap-carousel/-/react-native-snap-carousel-1.6.1.tgz", + "integrity": "sha512-0epbcc8im9oLJDnsMvpz5aebSPszyDakSWt7vSNqFpux4yg2kTKlw7ZGVn415nCLEv1XiKjHBHvIhs0oVeAgjQ==", + "dependencies": { + "react-addons-shallow-compare": "latest" + }, + "peerDependencies": { + "react": "*", + "react-addons-shallow-compare": "*", + "react-native": "*" + } + }, "node_modules/react-native-svg": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.2.0.tgz", @@ -23499,23 +23272,6 @@ "react-native": "*" } }, - "node_modules/react-native-svg-transformer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-native-svg-transformer/-/react-native-svg-transformer-1.4.0.tgz", - "integrity": "sha512-ZJ9dpSl8EONXbFQcVoGVr0cAl/7Vm/sKtOH1V6Mf9lcdyeT1/rfww43xgSfQWjmneTNTTXjslM5EoyZTHPfawQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@svgr/core": "^8.1.0", - "@svgr/plugin-jsx": "^8.1.0", - "@svgr/plugin-svgo": "^8.1.0", - "path-dirname": "^1.0.2" - }, - "peerDependencies": { - "react-native": ">=0.59.0", - "react-native-svg": ">=12.0.0" - } - }, "node_modules/react-native-vector-icons": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.1.0.tgz", @@ -23913,11 +23669,9 @@ } }, "node_modules/react-test-renderer": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.3.1.tgz", - "integrity": "sha512-KkAgygexHUkQqtvvx/otwxtuFu5cVjfzTCtjXLH9boS19/Nbtg84zS7wIQn39G8IlrhThBpQsMKkq5ZHZIYFXA==", - "dev": true, - "license": "MIT", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz", + "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", "dependencies": { "react-is": "^18.3.1", "react-shallow-renderer": "^16.15.0", @@ -23930,16 +23684,12 @@ "node_modules/react-test-renderer/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -23948,8 +23698,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -23979,8 +23727,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -23988,6 +23734,17 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/readline": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", @@ -24018,6 +23775,20 @@ "node": ">=0.10.0" } }, + "node_modules/recyclerlistview": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/recyclerlistview/-/recyclerlistview-4.2.0.tgz", + "integrity": "sha512-uuBCi0c+ggqHKwrzPX4Z/mJOzsBbjZEAwGGmlwpD/sD7raXixdAbdJ6BTcAmuWG50Cg4ru9p12M94Njwhr/27A==", + "dependencies": { + "lodash.debounce": "4.0.8", + "prop-types": "15.8.1", + "ts-object-utils": "0.0.5" + }, + "peerDependencies": { + "react": ">= 15.2.1", + "react-native": ">= 0.30.0" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -24060,8 +23831,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.8.4" } @@ -24214,8 +23984,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -24979,8 +24748,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", + "devOptional": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -25114,8 +24882,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" } @@ -25155,8 +24922,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", + "devOptional": true, "engines": { "node": ">=8" }, @@ -25432,8 +25198,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", - "dev": true, - "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -25470,8 +25234,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -25483,8 +25245,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -25688,8 +25448,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", + "devOptional": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -25919,6 +25678,11 @@ "node": ">=10" } }, + "node_modules/ts-object-utils": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/ts-object-utils/-/ts-object-utils-0.0.5.tgz", + "integrity": "sha512-iV0GvHqOmilbIKJsfyfJY9/dNHCs969z3so90dQWsO1eMMozvTpnB1MEaUbb3FYtZTGjv5sIy/xmslEz0Rg2TA==" + }, "node_modules/tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -26079,8 +25843,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "license": "Apache-2.0", + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -26387,8 +26150,7 @@ "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "license": "ISC", + "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", @@ -26805,6 +26567,11 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/xdate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/xdate/-/xdate-0.8.2.tgz", + "integrity": "sha512-sNBlLfOC8S3V0vLDEUianQOXcTsc9j4lfeKU/klHe0RjHAYn0CXsSttumTot8dzalboV8gZbH38B+WcCIBjhFQ==" + }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", diff --git a/frontend/occupi-mobile3/package.json b/frontend/occupi-mobile3/package.json index 089e5924..43095a38 100644 --- a/frontend/occupi-mobile3/package.json +++ b/frontend/occupi-mobile3/package.json @@ -39,21 +39,27 @@ "@legendapp/motion": "^2.3.0", "@react-native-community/datetimepicker": "^8.0.1", "@react-native-picker/picker": "^2.7.6", + "@react-native-segmented-control/segmented-control": "^2.5.2", "@react-navigation/native": "^6.0.2", "@react-navigation/stack": "^6.3.29", "@testing-library/react": "^14.0.0", "@ui-kitten/components": "^5.3.1", "@ui-kitten/eva-icons": "^5.3.1", - "expo": "~51.0.8", + "expo": "^51.0.9", "expo-blur": "~13.0.2", "expo-constants": "~16.0.1", + "expo-crypto": "^13.0.2", + "expo-file-system": "^17.0.1", "expo-font": "~12.0.5", "expo-linear-gradient": "^13.0.2", "expo-linking": "~6.3.1", + "expo-local-authentication": "^14.0.1", "expo-mail-composer": "~13.0.1", + "expo-print": "^13.0.1", "expo-random": "^14.0.1", "expo-router": "~3.5.14", "expo-secure-store": "^13.0.1", + "expo-sharing": "^12.0.1", "expo-splash-screen": "~0.27.4", "expo-status-bar": "~1.12.1", "expo-system-ui": "~3.0.4", @@ -67,17 +73,22 @@ "react": "18.2.0", "react-dom": "18.2.0", "react-hook-form": "^7.51.5", - "react-native": "^0.74.1", + "react-native": "0.74.1", + "react-native-barcode-builder": "^2.0.0", + "react-native-calendars": "^1.1305.0", + "react-native-dropdown-select-list": "^2.0.5", "react-native-eva-icons": "^1.3.1", "react-native-gesture-handler": "~2.16.1", "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-modal-datetime-picker": "^17.1.0", "react-native-picker-select": "^9.1.3", "react-native-reanimated": "~3.10.1", + "react-native-responsive-layout": "^1.2.0", "react-native-responsive-screen": "^1.4.2", "react-native-safe-area-context": "4.10.1", "react-native-screens": "3.31.1", "react-native-settings-components": "^0.0.2", + "react-native-snap-carousel": "^1.6.1", "react-native-svg": "15.2.0", "react-native-vector-icons": "^10.1.0", "react-native-web": "~0.19.10", @@ -96,6 +107,7 @@ "@testing-library/react-native": "^12.5.1", "@types/jest": "^29.5.4", "@types/react": "~18.2.79", + "@types/react-native-snap-carousel": "^3.8.11", "@types/react-test-renderer": "^18.0.1", "babel-jest": "^29.7.0", "babel-preset-expo": "^9.2.2", diff --git a/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx b/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx new file mode 100644 index 00000000..dc126d26 --- /dev/null +++ b/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx @@ -0,0 +1,139 @@ +import React, { useEffect, useState } from 'react'; +import { ScrollView, useColorScheme, TouchableOpacity, View, Text, Image } from 'react-native'; +import { Ionicons, Octicons } from '@expo/vector-icons'; +import { useRouter } from 'expo-router'; +import Navbar from '../../components/NavBar'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; + +const groupDataInPairs = (data) => { + const pairs = []; + for (let i = 0; i < data.length; i += 2) { + pairs.push(data.slice(i, i + 2)); + } + return pairs; +}; + +const BookRoom = () => { + const router = useRouter(); + const colorScheme = useColorScheme(); + + const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); + const [layout, setLayout] = useState("row"); + const toggleLayout = () => { + setLayout((prevLayout) => (prevLayout === "row" ? "grid" : "row")); + }; + useEffect(() => { + setIsDarkMode(colorScheme === 'dark'); + }, [colorScheme]); + const backgroundColor = isDarkMode ? 'black' : 'white'; + const textColor = isDarkMode ? 'white' : 'black'; + const cardBackgroundColor = isDarkMode ? '#2C2C2E' : '#F3F3F3'; + const data = [ + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Closesat: '7pm', available: true }, + ]; + + const roomPairs = groupDataInPairs(data); + + return ( + + + + Book + + + Quick search for an office + + {/* Categories */} + {/* + {['Focus', 'Chill', 'Ideas', 'Loud', 'Gamey', 'View'].map((category) => ( + + + + + {category} + + ))} + */} + + Rooms + + {layout === "row" ? ( + + + + ) : ( + + + + )} + + + + {layout === "grid" ? ( + + {roomPairs.map((pair, index) => ( + + {pair.map((room, idx) => ( + router.push('/office-details')}> + + + + {room.title} + {room.description} + Closes at: {room.Closesat} + + + + Available: now + + + + + + ))} + + ))} + + ) : ( + + {data.map((room, idx) => ( + router.push('/office-details')}> + + + {room.title} + + {room.description} + + + Closes at: {room.Closesat} + + + Available: now + + + + + + + ))} + + )} + + + ); +}; + +export default BookRoom; diff --git a/frontend/occupi-mobile3/screens/Booking/ViewBookings.tsx b/frontend/occupi-mobile3/screens/Booking/ViewBookings.tsx new file mode 100644 index 00000000..fa7a5932 --- /dev/null +++ b/frontend/occupi-mobile3/screens/Booking/ViewBookings.tsx @@ -0,0 +1,230 @@ +import { React, useEffect, useState } from 'react'; +import { ScrollView, useColorScheme, TouchableOpacity } from 'react-native'; +import { Icon, View, Text, Input, InputField, InputSlotButton, Button, ButtonText, Image, Box, ChevronDownIcon } from '@gluestack-ui/themed'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; +import { SimpleLineIcons } from '@expo/vector-icons'; +import { SelectList } from 'react-native-dropdown-select-list' +import RNPickerSelect from 'react-native-picker-select'; +import { Octicons } from '@expo/vector-icons'; +import { Ionicons } from '@expo/vector-icons'; +import Navbar from '../../components/NavBar'; + +const groupDataInPairs = (data) => { + const pairs = []; + for (let i = 0; i < data.length; i += 2) { + pairs.push(data.slice(i, i + 2)); + } + return pairs; +}; + +const ViewBookings = () => { + const colorScheme = useColorScheme(); + const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); + const [layout, setLayout] = useState("row"); + const [selectedSort, setSelectedSort] = useState(""); + const toggleLayout = () => { + setLayout((prevLayout) => (prevLayout === "row" ? "grid" : "row")); + }; + useEffect(() => { + setIsDarkMode(colorScheme === 'dark'); + }, [colorScheme]); + const backgroundColor = isDarkMode ? 'black' : 'white'; + const textColor = isDarkMode ? 'white' : 'black'; + const cardBackgroundColor = isDarkMode ? '#2C2C2E' : '#F3F3F3'; + const sort = [ + { key: '1', value: 'Oldest', }, + { key: '2', value: 'Newest' }, + ] + const data = [ + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Date: '17/06/2024', Time: '07:30-09:30', available: true }, + ]; + + const roomPairs = groupDataInPairs(data); + + return ( + + + + My bookings + + + + + + + Sort by: + + setSelectedSort(value)} + items={[ + { label: 'Oldest', value: 'Oldest' }, + { label: 'Newest', value: 'Newest' }, + ]} + placeholder={{ label: 'Latest', value: null }} + backgroundColor={cardBackgroundColor} + style={{ + inputIOS: { + placeholder: "Latest", + fontSize: 16, + paddingVertical: 8, + borderWidth: 1, + borderRadius: 10, + borderColor: cardBackgroundColor, + paddingRight: 30, // to ensure the text is never behind the icon + color: textColor + }, + inputAndroid: { + borderWidth: 1, + borderRadius: 10, + borderColor: cardBackgroundColor, + paddingRight: 30, // to ensure the text is never behind the icon + color: textColor + }, + }} + Icon={() => { + return ; + }} + /> + + + + {layout === "row" ? ( + + + + ) : ( + + + + )} + + + + {layout === "grid" ? ( + + {roomPairs.map((pair, index) => ( + + {pair.map((room) => ( + + image + + + {room.title} + {room.description} + Your booking time: + + + + + {room.Date} at + {room.Time} + + + + + + + ))} + + ))} + + ) : ( + + {data.map((room) => ( + + image + + {room.title} + + {room.description} + + + Your booking time: + + + {room.Date} at + {room.Time} + + + + + + + + ))} + + )} + + + + ); +}; + +export default ViewBookings; diff --git a/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx b/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx index 0e95f94c..1044ea5d 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx @@ -1,25 +1,27 @@ import React, { useEffect, useState } from 'react'; -import { StatusBar, useColorScheme } from 'react-native'; +import { StatusBar, useColorScheme, ScrollView, Alert, StyleSheet } from 'react-native'; import { - StyleSheet, Text, View, - Image, - Card, + Toast, + useToast, + ToastTitle, Button, ButtonText, Icon, - ArrowRightIcon, Heading, ChevronRightIcon } from '@gluestack-ui/themed'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; import FloorDropdown from '../../components/FloorDropdown'; -import GuestLayout from '../../layouts/GuestLayout'; import Navbar from "../../components/NavBar"; +import { router } from 'expo-router'; const Bookings = () => { const colorScheme = useColorScheme(); const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); + const [isBooked, setisBooked] = useState(false); + const toast = useToast(); useEffect(() => { setIsDarkMode(colorScheme === 'dark'); @@ -28,108 +30,222 @@ const Bookings = () => { const backgroundColor = isDarkMode ? '#1C1C1E' : 'white'; const textColor = isDarkMode ? 'white' : 'black'; const cardBackgroundColor = isDarkMode ? '#2C2C2E' : '#F3F3F3'; - const buttonBackgroundColor = isDarkMode ? 'greenyellow' : 'greenyellow'; + const buttonBackgroundColor = 'greenyellow'; const notAvailableButtonBackgroundColor = isDarkMode ? '#3A3A3C' : 'lightgrey'; const fullyBookedButtonBackgroundColor = isDarkMode ? '#7F1D1D' : 'orangered'; + const handleBooking = (roomName) => { + Alert.alert( + "Book", + `Book ${roomName} on floor 7?`, + [ + { + text: "Cancel", + style: "cancel" + }, + { + text: "OK", + onPress: async () => { + setisBooked(true); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Room has been booked, an email has been sent to you with the details. + + ); + }, + }); + } + } + ] + ); + }; + return ( <> - - + + - - Offices - + + Offices + - - - - HDMI Room - Boasting sunset views, long desk and a large TV. + {[ + { name: 'HDMI Room', status: isBooked ? 'Booked' : 'Book now', closesAt: '7pm', buttonColor: isBooked ? 'orangered' : buttonBackgroundColor }, + { name: 'Conference Room', status: 'Not Available', closesAt: '6pm', buttonColor: notAvailableButtonBackgroundColor }, + { name: 'Meeting Room 1', status: 'Booked', closesAt: '6pm', buttonColor: fullyBookedButtonBackgroundColor }, + { name: 'Meeting Room 2', status: 'Available now', closesAt: '6pm', buttonColor: buttonBackgroundColor }, + { name: 'Conference Room', status: 'Not Available', closesAt: '6pm', buttonColor: notAvailableButtonBackgroundColor }, + { name: 'Conference Room', status: 'Not Available', closesAt: '6pm', buttonColor: notAvailableButtonBackgroundColor }, + ].map((room, index) => ( + + + + {room.name} + Boasting sunset views, long desk and a large TV. + + - - - - Closes at: 7pm - - - - - - - - Conference Room - Boasting sunset views, long desk and a large TV. + + Closes at: {room.closesAt} + - - - - Closes at: 6pm - - - - - Meeting Room 1 - Boasting sunset views, long desk and a large TV. - - - - - Closes at: 6pm - - - + + + + Conference Room + Boasting sunset views, long desk and a large TV. + + + + + Closes at: 6pm + + + - - - - Meeting Room 2 - Boasting sunset views, long desk and a large TV. - - - - - Closes at: 6pm - - - + + + + Meeting Room 1 + Boasting sunset views, long desk and a large TV. + + + + + Closes at: 6pm + + + - - - - Conference Room - Boasting sunset views, long desk and a large TV. - - - - - Closes at: 6pm - - - + + + + Meeting Room 2 + Boasting sunset views, long desk and a large TV. + + + + + Closes at: 6pm + + + - - - - Conference Room - Boasting sunset views, long desk and a large TV. - - - - - Closes at: 6pm - - - + + + + Conference Room + Boasting sunset views, long desk and a large TV. + + + + + Closes at: 6pm + + + + + + + + Conference Room + Boasting sunset views, long desk and a large TV. + + + + + Closes at: 6pm + + + - + ); }; -export default Bookings; \ No newline at end of file +const styles = StyleSheet.create({ + container: { + paddingTop: hp('4%'), + paddingHorizontal: wp('4%'), + flex: 1, + flexDirection: 'column' + }, + header: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginBottom: hp('2%') + }, + heading: { + fontSize: wp('8%'), + fontWeight: 'bold' + }, + button: { + width: wp('36%'), + borderRadius: wp('3%'), + paddingVertical: hp('1%'), + }, + buttonText: { + color: 'dimgrey', + textAlign: 'center' + }, + card: { + width: '100%', + borderRadius: wp('5%'), + padding: wp('3%'), + marginTop: hp('2%'), + height: hp('14%'), + justifyContent: 'space-between' + }, + cardContent: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center' + }, + cardHeading: { + fontSize: wp('5%'), + marginBottom: hp('1%') + }, + cardText: { + fontSize: wp('3.5%') + }, + icon: { + width: wp('6%'), + height: wp('6%') + }, + cardFooter: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center' + }, + footerText: { + fontSize: wp('3.5%') + }, + footerButton: { + height: hp('4%'), + width: wp('33%'), + borderRadius: wp('2%'), + justifyContent: 'center', + alignItems: 'center' + }, + footerButtonText: { + color: 'dimgrey', + fontSize: wp('3.5%'), + fontWeight: 'light' + } +}); + +export default Bookings; diff --git a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx index 59405e01..41f565ee 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx @@ -1,67 +1,106 @@ import React, { useEffect, useState } from 'react'; import { StatusBar, useColorScheme } from 'react-native'; -import Navbar from "../../components/NavBar"; -import { - StyleSheet, - Text, - View, - Image, - Card, - Button, - ButtonText, - Icon, - ArrowRightIcon +import Navbar from '../../components/NavBar'; +import { + StyleSheet, + Text, + View, + Image, + Card, + Toast, + useToast, + ToastTitle, + Button, + ButtonText, + Icon, + ArrowRightIcon, } from '@gluestack-ui/themed'; import { router } from 'expo-router'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; const Dashboard = () => { - const colorScheme = useColorScheme(); - const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); + const colorScheme = useColorScheme(); + const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); + const [checkedIn, setCheckedIn] = useState(false); + const toast = useToast(); - useEffect(() => { - setIsDarkMode(colorScheme === 'dark'); - }, [colorScheme]); + useEffect(() => { + setIsDarkMode(colorScheme === 'dark'); + }, [colorScheme]); - const backgroundColor = isDarkMode ? '#1C1C1E' : 'white'; - const textColor = isDarkMode ? 'white' : 'black'; - const cardBackgroundColor = isDarkMode ? '#2C2C2E' : '#F3F3F3'; + const checkIn = () => { + if (checkedIn === false) { + setCheckedIn(true); + toast.show({ + placement: 'top', + render: ({ id }) => ( + + Check in successful. Have a productive day! + + ), + }); + } else { + setCheckedIn(false); + toast.show({ + placement: 'top', + render: ({ id }) => ( + + Travel safe. Have a lovely day further! + + ), + }); + } + }; - return ( - - - - - Hi Sabrina 👋 - Welcome to Occupi - - logo - - - - - - - - - - - Office analytics - - - logo - + const backgroundColor = isDarkMode ? '#1C1C1E' : 'white'; + const textColor = isDarkMode ? 'white' : 'black'; + const cardBackgroundColor = isDarkMode ? '#2C2C2E' : '#F3F3F3'; + + return ( + + + + + + Hi Sabrina 👋 + + + Welcome to Occupi + - ); + logo + + + + + + + + Office analytics + {checkedIn ? ( + + ) : ( + + )} + + logo + + + ); }; -export default Dashboard; \ No newline at end of file +export default Dashboard; diff --git a/frontend/occupi-mobile3/screens/Dashboard/__tests__/Bookings.test.tsx b/frontend/occupi-mobile3/screens/Dashboard/__tests__/Bookings.test.tsx new file mode 100644 index 00000000..abf9521b --- /dev/null +++ b/frontend/occupi-mobile3/screens/Dashboard/__tests__/Bookings.test.tsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { render, fireEvent, waitFor } from '@testing-library/react-native'; +import Bookings from '../Bookings.tsx'; // Adjust the import to the correct path +import { useToast } from '@gluestack-ui/themed'; +import { Alert } from 'react-native'; + +// Mock useToast hook +jest.mock('@gluestack-ui/themed', () => { + const actual = jest.requireActual('@gluestack-ui/themed'); + return { + ...actual, + useToast: jest.fn(), + }; +}); + +describe('Bookings Component', () => { + it('should render the component correctly', () => { + const { getByText } = render(); + + // Check if the main heading is rendered + expect(getByText('Offices')).toBeTruthy(); + }); + + it('should show a toast message when a room is booked', async () => { + const show = jest.fn(); + useToast.mockReturnValue({ show }); + + const { getByText } = render(); + + fireEvent.press(getByText('Book now')); + + await waitFor(() => { + expect(show).toHaveBeenCalledWith(expect.objectContaining({ + placement: 'top', + render: expect.any(Function), + })); + }); + }); + + it('should open an alert when booking a room', () => { + const alertSpy = jest.spyOn(Alert, 'alert'); + + const { getByText } = render(); + + fireEvent.press(getByText('Book now')); + + expect(alertSpy).toHaveBeenCalledWith( + "Book", + expect.stringContaining("HDMI Room on floor 7?"), + expect.any(Array) + ); + }); + + it('should render the correct text colors based on dark mode', () => { + const { getByText } = render(); + + // Assuming the default mode is light + expect(getByText('Offices').props.style.color).toBe('black'); + + // Simulate dark mode + const { getByText: getByTextDark } = render(); + expect(getByTextDark('Offices').props.style.color).toBe('white'); + }); +}); diff --git a/frontend/occupi-mobile3/screens/Dashboard/assets/image.png b/frontend/occupi-mobile3/screens/Dashboard/assets/image.png new file mode 100644 index 00000000..a66eb997 Binary files /dev/null and b/frontend/occupi-mobile3/screens/Dashboard/assets/image.png differ diff --git a/frontend/occupi-mobile3/screens/Login/CreatePassword.tsx b/frontend/occupi-mobile3/screens/Login/CreatePassword.tsx index 59e16776..4836c52e 100644 --- a/frontend/occupi-mobile3/screens/Login/CreatePassword.tsx +++ b/frontend/occupi-mobile3/screens/Login/CreatePassword.tsx @@ -36,6 +36,7 @@ import { useForm, Controller } from 'react-hook-form'; import { z } from 'zod'; import { Keyboard } from 'react-native'; import { zodResolver } from '@hookform/resolvers/zod'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; import GuestLayout from '../../layouts/GuestLayout'; @@ -47,8 +48,8 @@ import { styled } from '@gluestack-style/react'; const StyledImage = styled(Image, { props: { style: { - height: 40, - width: 320, + height: wp('10%'), + width: wp('80%'), }, }, }); @@ -140,6 +141,35 @@ export default function CreatePassword() { }); }; + const GradientButton = ({ onPress, text }) => ( + + + {text} + + + ); + + const styles = StyleSheet.create({ + buttonContainer: { + borderRadius: 15, + marginTop: hp('2%'), + alignSelf: 'center', + width: wp('90%'), + height: hp('6%'), + }, + buttonText: { + color: 'black', + fontSize: wp('4%'), + textAlign: 'center', + lineHeight: hp('6%'), + } + }); function ScreenText() { return ( @@ -148,18 +178,18 @@ export default function CreatePassword() { logo Create new password - + Your new password must be different from previous used passwords and must be of at least 8 characters. @@ -176,7 +206,6 @@ export default function CreatePassword() { _dark: { bg: '$primary500' }, }} > - ( ( - + text="Update Password" + /> diff --git a/frontend/occupi-mobile3/screens/Login/ForgotPassword.tsx b/frontend/occupi-mobile3/screens/Login/ForgotPassword.tsx index a78b444a..b336c359 100644 --- a/frontend/occupi-mobile3/screens/Login/ForgotPassword.tsx +++ b/frontend/occupi-mobile3/screens/Login/ForgotPassword.tsx @@ -30,11 +30,10 @@ import { useForm, Controller } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Keyboard, StyleSheet } from 'react-native'; - +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; import { AlertTriangle } from 'lucide-react-native'; - import StyledExpoRouterLink from '../../components/StyledExpoRouterLink'; -import { router } from 'expo-router'; +import { useNavigation } from '@react-navigation/native'; const forgotPasswordSchema = z.object({ email: z.string().min(1, 'Email is required').email(), @@ -137,8 +136,9 @@ export default function ForgotPassword() { const [isEmailFocused, setIsEmailFocused] = useState(false); const toast = useToast(); + const navigation = useNavigation(); - const onSubmit = (_data: SignUpSchemaType) => { + const onSubmit = (data: SignUpSchemaType) => { toast.show({ placement: 'bottom right', render: ({ id }) => { @@ -151,8 +151,8 @@ export default function ForgotPassword() { }); reset(); - // Navigate screen to appropriate location - router.push('/verify-otp'); + // Navigate to OTP Verification screen with email as a parameter + navigation.navigate('verify-otp', { email: data.email }); }; const handleKeyPress = () => { @@ -162,10 +162,10 @@ export default function ForgotPassword() { const GradientButton = ({ onPress, text }) => ( @@ -173,25 +173,24 @@ export default function ForgotPassword() { ); - + const styles = StyleSheet.create({ buttonContainer: { borderRadius: 15, - marginTop: 20, + marginTop: hp('2%'), alignSelf: 'center', - width: 360, - height: 50 + width: wp('90%'), + height: hp('6%'), }, buttonText: { color: 'black', - fontSize: 16, + fontSize: wp('4%'), textAlign: 'center', - lineHeight: 50, + lineHeight: hp('6%'), } }); return ( - ( ( - - - {text} - - - ); - + style={styles.buttonContainer} + > + + {text} + + +); const Onboarding1 = () => { return ( - -
- logo - Capacity Prediction - - Predictive AI to help you plan when you go to the office better - - router.push('/onboarding2')} - text="Next" - /> -
-
- ) -} + +
+ logo + Capacity Prediction + + Predictive AI to help you plan when you go to the office better + + router.push('/onboarding2')} + text="Next" + /> +
+
+ ); +}; const styles = StyleSheet.create({ - buttonContainer: { - borderRadius: 15, - marginTop: 20, - alignSelf: 'center', - width: 360, - height: 50 - }, - buttonText: { - color: 'black', - fontSize: 16, - textAlign: 'center', - lineHeight: 50, - } - }); - -export default Onboarding1 \ No newline at end of file + container: { + flex: 1, + backgroundColor: 'white', + padding: wp('4%'), + }, + center: { + height: '100%', + justifyContent: 'center', + }, + image: { + width: wp('70%'), + height: wp('70%'), + marginBottom: hp('3%'), + }, + heading: { + alignSelf: 'flex-start', + paddingLeft: wp('4%'), + marginBottom: hp('2%'), + marginTop: hp('6%'), + fontSize: wp('8%'), + }, + text: { + alignSelf: 'flex-start', + fontSize: wp('5%'), + padding: wp('4%'), + fontWeight: '300', + marginBottom: hp('4%'), + }, + buttonContainer: { + borderRadius: 15, + marginTop: hp('2%'), + alignSelf: 'center', + width: wp('90%'), + height: hp('6%'), + }, + buttonText: { + color: 'black', + fontSize: wp('4%'), + textAlign: 'center', + lineHeight: hp('6%'), + }, +}); + +export default Onboarding1; diff --git a/frontend/occupi-mobile3/screens/Login/Onboarding2.tsx b/frontend/occupi-mobile3/screens/Login/Onboarding2.tsx index 2e60b10d..4fec3366 100644 --- a/frontend/occupi-mobile3/screens/Login/Onboarding2.tsx +++ b/frontend/occupi-mobile3/screens/Login/Onboarding2.tsx @@ -1,68 +1,95 @@ -import React from 'react' +import React from 'react'; import { LinearGradient } from 'expo-linear-gradient'; import { - Button, - Box, - Image, - Center, - Text, - Heading, - } from '@gluestack-ui/themed'; + Button, + Box, + Image, + Center, + Text, + Heading, +} from '@gluestack-ui/themed'; import { StyleSheet, View } from 'react-native'; import { router } from 'expo-router'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; const GradientButton = ({ onPress, text }) => ( - - - {text} - - - ); - + style={styles.buttonContainer} + > + + {text} + + +); const Onboarding2 = () => { return ( - -
- logo - Day to day Occupancy analysis - - Uses historical data to provide day to day analysis and statistics - - router.push('/onboarding3')} - text="Next" - /> -
-
- ) -} + +
+ logo + Day to day Occupancy analysis + + Uses historical data to provide day to day analysis and statistics + + router.push('/onboarding3')} + text="Next" + /> +
+
+ ); +}; const styles = StyleSheet.create({ - buttonContainer: { - borderRadius: 15, - marginTop: 20, - alignSelf: 'center', - width: 360, - height: 50 - }, - buttonText: { - color: 'darkgry', - fontSize: 16, - textAlign: 'center', - lineHeight: 50, - } - }); - -export default Onboarding2 \ No newline at end of file + container: { + flex: 1, + backgroundColor: 'white', + padding: wp('4%'), + }, + center: { + height: '100%', + justifyContent: 'center', + }, + image: { + width: wp('70%'), + height: wp('70%'), + marginBottom: hp('3%'), + }, + heading: { + alignSelf: 'flex-start', + paddingLeft: wp('4%'), + marginBottom: hp('2%'), + marginTop: hp('6%'), + fontSize: wp('8%'), + }, + text: { + alignSelf: 'flex-start', + fontSize: wp('5%'), + padding: wp('4%'), + fontWeight: '300', + marginBottom: hp('4%'), + }, + buttonContainer: { + borderRadius: 15, + marginTop: hp('2%'), + alignSelf: 'center', + width: wp('90%'), + height: hp('6%'), + }, + buttonText: { + color: 'black', + fontSize: wp('4%'), + textAlign: 'center', + lineHeight: hp('6%'), + }, +}); + +export default Onboarding2; diff --git a/frontend/occupi-mobile3/screens/Login/Onboarding3.tsx b/frontend/occupi-mobile3/screens/Login/Onboarding3.tsx index 5e0eb435..d4bd9e1d 100644 --- a/frontend/occupi-mobile3/screens/Login/Onboarding3.tsx +++ b/frontend/occupi-mobile3/screens/Login/Onboarding3.tsx @@ -1,68 +1,95 @@ -import React from 'react' +import React from 'react'; import { LinearGradient } from 'expo-linear-gradient'; import { - Button, - Box, - Image, - Center, - Text, - Heading, - } from '@gluestack-ui/themed'; + Button, + Box, + Image, + Center, + Text, + Heading, +} from '@gluestack-ui/themed'; import { StyleSheet, View } from 'react-native'; import { router } from 'expo-router'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; const GradientButton = ({ onPress, text }) => ( - - - {text} - - - ); - + style={styles.buttonContainer} + > + + {text} + + +); const Onboarding3 = () => { return ( - -
- logo - Real time updates - - Provides real time updates for occupancy and capacity - - router.push('/welcome')} - text="Next" - /> -
-
- ) -} + +
+ logo + Real time updates + + Provides real time updates for occupancy and capacity + + router.push('/welcome')} + text="Next" + /> +
+
+ ); +}; const styles = StyleSheet.create({ - buttonContainer: { - borderRadius: 15, - marginTop: 20, - alignSelf: 'center', - width: 360, - height: 50 - }, - buttonText: { - color: 'black', - fontSize: 16, - textAlign: 'center', - lineHeight: 50, - } - }); - -export default Onboarding3 \ No newline at end of file + container: { + flex: 1, + backgroundColor: 'white', + padding: wp('4%'), + }, + center: { + height: '100%', + justifyContent: 'center', + }, + image: { + width: wp('70%'), + height: wp('70%'), + marginBottom: hp('3%'), + }, + heading: { + alignSelf: 'flex-start', + paddingLeft: wp('4%'), + marginBottom: hp('2%'), + marginTop: hp('6%'), + fontSize: wp('8%'), + }, + text: { + alignSelf: 'flex-start', + fontSize: wp('5%'), + padding: wp('4%'), + fontWeight: '300', + marginBottom: hp('4%'), + }, + buttonContainer: { + borderRadius: 15, + marginTop: hp('2%'), + alignSelf: 'center', + width: wp('90%'), + height: hp('6%'), + }, + buttonText: { + color: 'black', + fontSize: wp('4%'), + textAlign: 'center', + lineHeight: hp('6%'), + }, +}); + +export default Onboarding3; diff --git a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx index 618cf99b..91c2518f 100644 --- a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx +++ b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx @@ -1,39 +1,19 @@ import React, { useRef, useState, useEffect } from 'react'; -import { LinearGradient } from 'expo-linear-gradient'; -import { - VStack, - Box, - HStack, - Text, - Button, - Image, - Center, - FormControl, - Input, - LinkText, - FormControlHelperText, - InputField, - ButtonText, - FormControlError, - FormControlErrorIcon, - FormControlErrorText, - Toast, - ToastTitle, - useToast, - Heading, -} from '@gluestack-ui/themed'; -import Logo from './assets/images/Occupi/file.png'; -import { Alert, StyleSheet } from 'react-native'; -import GuestLayout from '../../layouts/GuestLayout'; -import { z } from 'zod'; -import { AlertTriangle } from 'lucide-react-native'; +import { TouchableOpacity, View, StyleSheet, Alert, TextInput } from 'react-native'; +import { VStack, Box, HStack, Image, FormControl, Input, Button, Heading, Toast, useToast, ToastTitle, Text, } from '@gluestack-ui/themed'; import { useForm } from 'react-hook-form'; +import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import StyledExpoRouterLink from '../../components/StyledExpoRouterLink'; -import { router, useLocalSearchParams } from 'expo-router'; +import { useRouter, useLocalSearchParams } from 'expo-router'; import * as MailComposer from 'expo-mail-composer'; import * as Random from 'expo-random'; import * as SecureStore from 'expo-secure-store'; +import GuestLayout from '../../layouts/GuestLayout'; +import Logo from './assets/images/Occupi/file.png'; +import StyledExpoRouterLink from '@/components/StyledExpoRouterLink'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; +import { AlertTriangle } from 'lucide-react-native'; +import { LinearGradient } from 'expo-linear-gradient'; const OTPSchema = z.object({ OTP: z.string().min(6, 'OTP must be at least 6 characters in length'), @@ -42,51 +22,34 @@ const OTPSchema = z.object({ type OTPSchemaType = z.infer; const OTPVerification = () => { - const [email, setemail] = useState('kamo@gmail.com'); - - const [otp, setOtp] = useState(''); - // const [otpSent, setOtpSent] = useState(false); + const emailParams = useLocalSearchParams(); + const email = emailParams.email ? String(emailParams.email) : ''; + // const email = 'kamo@gmail.com'; const [remainingTime, setRemainingTime] = useState(60); // 1 minute - + const [otpSent, setOtpSent] = useState(false); const timerRef = useRef(null); + const [loading, setLoading] = useState(false); + const router = useRouter(); + const toast = useToast(); + const [otp, setOtp] = useState(['', '', '', '', '', '']); + const [inputFocus, setInputFocus] = useState(-1); + const [validationError, setValidationError] = useState(null); + // console.log(email); useEffect(() => { - let timer: NodeJS.Timeout | null = null; - - if (remainingTime > 0) { - timer = setInterval(() => { - setRemainingTime(remainingTime-1); + if (remainingTime > 0 && !otpSent) { + timerRef.current = setInterval(() => { + setRemainingTime((prevTime) => prevTime - 1); }, 1000); + } else if (remainingTime === 0 && timerRef.current) { + clearInterval(timerRef.current); } - return () => { - if (timer) { - clearInterval(timer); + if (timerRef.current) { + clearInterval(timerRef.current); } }; - }, [remainingTime]); - - const generateOtp = async (): Promise => { - const randomBytes = await Random.getRandomBytesAsync(3); - const otp = Array.from(randomBytes).map(byte => byte % 10).join(''); - return otp; - }; - - - - // Dummy data for registered emails - const registeredEmails = ['example@example.com', 'test@test.com']; - - const checkIfEmailIsRegistered = async (email: string): Promise => { - // Simulating an API call or database query - return new Promise((resolve) => { - setTimeout(() => { - // Check if the email exists in the registeredEmails array - const isRegistered = registeredEmails.includes(email); - resolve(isRegistered); - }, 1000); // Simulating a 1-second delay for demonstration purposes - }); - }; + }, [remainingTime, otpSent]); const { control, @@ -97,61 +60,74 @@ const OTPVerification = () => { resolver: zodResolver(OTPSchema), }); - const [otpInput, setOtpInput] = useState(['', '', '', '', '', '']); - const firstInput = useRef(null); - const secondInput = useRef(null); - const thirdInput = useRef(null); - const fourthInput = useRef(null); - const fifthInput = useRef(null); - const sixthInput = useRef(null); - - const refList = [ - firstInput, - secondInput, - thirdInput, - fourthInput, - fifthInput, - sixthInput, - ]; - - const [inputFocus, setInputFocus] = useState(-1); - const [validationError, setValidationError] = useState(null); // State to hold validation error message - - const toast = useToast(); + - const onSubmit = async (_data: OTPSchemaType) => { - const pinValues = refList.map((ref) => ref?.current?.value); - const pin = pinValues.join(''); - const Count = otpInput.filter((value) => value !== '').length; + const onSubmit = async () => { + console.log(email); + const pin = otp.join(''); + const Count = otp.filter((value) => value !== '').length; if (Count < 6) { setValidationError('OTP must be at least 6 characters in length'); return; } setValidationError(null); - - - toast.show({ - placement: 'bottom right', - render: ({ id }) => ( - - OTP sent successfully - - ), - }); - reset(); - router.push('/home'); + console.log(pin); + setLoading(true); + try { + const response = await fetch('http://10.0.0.160:8080/auth/verify-otp', { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + email: email, + otp: pin + }), + credentials: "include" + }); + const data = await response.json(); + if (response.ok) { + setLoading(false); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + {data.message} + + ); + }, + }); + router.push('/home'); + } else { + setLoading(false); + // console.log(data); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + {data.message} + + ); + }, + }); + } + } catch (error) { + console.error('Error:', error); + // setResponse('An error occurred'); + } + // }, 3000); + setLoading(false); }; - // const handleverify = async () => { - // router.push('/home'); - // } - const GradientButton = ({ onPress, text }) => ( @@ -159,34 +135,8 @@ const OTPVerification = () => { ); - - const styles = StyleSheet.create({ - buttonContainer: { - borderRadius: 15, - marginTop: 20, - alignSelf: 'center', - width: 360, - height: 50 - }, - buttonText: { - color: 'black', - fontSize: 16, - textAlign: 'center', - lineHeight: 50, - } - }); - return ( - - { py="$8" px="$4" flex={1} - maxWidth={508} > - - - - - {validationError && ( - - {validationError} - - )} - {/* - - */} - - - - - {errors?.OTP?.message} - - - - {remainingTime} seconds remaining - + + + Entered OTP: {otp.join('')} + {remainingTime} seconds remaining + {loading ? ( + + ) : ( + + )} + + - ); }; -interface PinInputProps { - refList: React.RefObject[]; - setInputFocus: React.Dispatch>; - focusedIndex: number; - setOtpInput: (otpInput: Array) => void; - otpInput: any; -} - -function PinInput({ - refList, - setInputFocus, - focusedIndex, - setOtpInput, - otpInput, -}: PinInputProps) { - return ( - - {Array.from({ length: 6 }, (_, index) => ( - - { - if (text.length === 1 && index < 5) { - refList[index + 1].current?.focus(); - setInputFocus(index + 1); - } else if (text.length === 0 && index > 0) { - refList[index - 1].current?.focus(); - } - - const updateOtpAtIndex = (index: number, value: string) => { - const newOtpInput = [...otpInput]; - newOtpInput[index] = value; - setOtpInput(newOtpInput); - }; - updateOtpAtIndex(index, text); - }} - /> - - ))} - - ); -} - -function MainText({ email }: { email: string }) { - const obfuscatedEmail = email.replace(/(.{2})(.*)(?=@)/, - (gp1, gp2, gp3) => { - for (let i = 0; i < gp3.length; i++) { - gp2 += '*'; - } return gp2; - }); +const MainText = (email : string) => { return ( - occupi + occupi We sent you an email code @@ -345,22 +204,21 @@ function MainText({ email }: { email: string }) { color: '$textDark400', }, }} - fontSize="$20" + fontSize={wp('5%')} fontWeight="$light" > We have sent the OTP code to - {' ' + email} + {' '+email}
@@ -389,42 +247,95 @@ function AccountLink() { color: '$textDark400', }, }} - fontSize="$sm" + fontSize={wp('4%')} > Already have an account? - - + + Login - + ); } -// interface ResendLinkProps { -// sendOtp: () => void; -// } +const OTPInput = ({ otp, setOtp }) => { + const inputRefs = useRef([]); + + const handleChangeText = (text, index) => { + const newOtp = [...otp]; + newOtp[index] = text; + setOtp(newOtp); + + if (text && index < 5) { + inputRefs.current[index + 1].focus(); + } else if (index === 5) { + inputRefs.current[index].blur(); // Dismiss the keyboard after entering the 6th digit + } + }; + + const handleKeyPress = (e, index) => { + if (e.nativeEvent.key === 'Backspace' && !otp[index] && index > 0) { + inputRefs.current[index - 1].focus(); + } + }; -// function ResendLink({ sendOtp }: ResendLinkProps) { -// return ( -// -// -// Didn't receive the OTP? -// -// -// Resend OTP -// -// -// ); -// } + useEffect(() => { + if (inputRefs.current[0]) { + inputRefs.current[0].focus(); + } + }, []); + + return ( + + {otp.map((digit, index) => ( + handleChangeText(text, index)} + onKeyPress={(e) => handleKeyPress(e, index)} + style={styles.input} + keyboardType="numeric" + maxLength={1} + ref={(ref) => inputRefs.current[index] = ref} + // autoFocus={index === inputRefs.current[index]} // Auto focus the first input on mount + /> + ))} + + ); +}; + +const styles = StyleSheet.create({ + buttonContainer: { + borderRadius: 15, + marginTop: hp('2%'), + alignSelf: 'center', + width: wp('90%'), + height: hp('6%'), + }, + buttonText: { + color: 'black', + fontSize: wp('4%'), + textAlign: 'center', + lineHeight: hp('6%'), + }, + container: { + flexDirection: 'row', + justifyContent: 'space-between', + paddingHorizontal: 20, + marginTop: 20, + marginBottom: 20, + }, + input: { + width: 40, + height: 40, + borderRadius: 10, + borderWidth: 1, + borderColor: '#ccc', + textAlign: 'center', + fontSize: 18, + }, +}); export default OTPVerification; diff --git a/frontend/occupi-mobile3/screens/Login/SignIn.tsx b/frontend/occupi-mobile3/screens/Login/SignIn.tsx index 40f379bb..54b9ebb8 100644 --- a/frontend/occupi-mobile3/screens/Login/SignIn.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignIn.tsx @@ -1,7 +1,10 @@ -import React, { useState } from 'react'; -import { SafeAreaView, StyleSheet } from 'react-native'; +import React, { useState, useEffect } from 'react'; +import { SafeAreaView, StyleSheet, Keyboard } from 'react-native'; import { LinearGradient } from 'expo-linear-gradient'; import { router } from 'expo-router'; +import * as LocalAuthentication from 'expo-local-authentication'; +import { Ionicons } from '@expo/vector-icons'; +import { TouchableOpacity, View, Alert, KeyboardAvoidingView, Platform, ScrollView } from 'react-native'; import { Center, Button, @@ -28,40 +31,22 @@ import { CheckboxIcon, CheckboxLabel, ButtonText, - ButtonIcon, Image, - Divider, - ChevronLeftIcon, Heading, LinkText, InputSlot, FormControlLabel, FormControlLabelText, - FormControlHelperText, } from '@gluestack-ui/themed'; import { useForm, Controller } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { Keyboard } from 'react-native'; import { AlertTriangle, EyeIcon, EyeOffIcon } from 'lucide-react-native'; -import { FingerprintIcon } from 'lucide-react-native'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import { GoogleIcon, FacebookIcon } from './assets/Icons/Social'; import Logo from '../../screens/Login/assets/images/Occupi/file.png'; -import GuestLayout from '../../layouts/GuestLayout'; import StyledExpoRouterLink from '../../components/StyledExpoRouterLink'; -import { styled } from '@gluestack-style/react'; - -const StyledImage = styled(Image, { - props: { - style: { - height: 40, - width: 320, - }, - }, -}); - const signInSchema = z.object({ email: z.string().min(1, 'Email is required').email(), password: z @@ -89,23 +74,129 @@ const SignInForm = () => { resolver: zodResolver(signInSchema), }); const [isEmailFocused, setIsEmailFocused] = useState(false); + const [loading, setLoading] = useState(false); + const [showPassword, setShowPassword] = useState(false); + const [biometricAvailable, setBiometricAvailable] = useState(false); const toast = useToast(); - const onSubmit = (_data: SignInSchemaType) => { - toast.show({ - placement: 'bottom right', - render: ({ id }) => { - return ( - - Signed in successfully - - ); - }, - }); - reset(); - router.push('/home') - // Implement your own onSubmit and navigation logic here. + useEffect(() => { + checkBiometricAvailability(); + }, []); + + const checkBiometricAvailability = async () => { + const isBiometricAvailable = await LocalAuthentication.hasHardwareAsync(); + setBiometricAvailable(isBiometricAvailable); + console.log('Biometric hardware available:', isBiometricAvailable); + }; + + const handleBiometricSignIn = async () => { + const biometricType = await LocalAuthentication.supportedAuthenticationTypesAsync(); + console.log('Supported biometric types:', biometricType); + + if (biometricType.includes(LocalAuthentication.AuthenticationType.FACIAL_RECOGNITION) || biometricType.includes(LocalAuthentication.AuthenticationType.FINGERPRINT)) { + try { + const result = await LocalAuthentication.authenticateAsync({ + promptMessage: 'Login with Biometrics', + cancelLabel: 'Cancel', + fallbackLabel: 'Use Passcode', + disableDeviceFallback: false, + }); + console.log('Biometric authentication result:', result); + if (result.success) { + router.push('/home'); + } else { + console.log('Biometric authentication failed'); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Biometric authentication failed + {result.error && {result.error.message}} + + ); + }, + }); + } + } catch (error) { + console.error('Biometric authentication error:', error); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Biometric authentication error + {error.message} + + ); + }, + }); + } + } else { + console.log('Biometric authentication not available'); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Biometric authentication not available + + ); + }, + }); + } + }; + + const onSubmit = async (_data: SignInSchemaType) => { + setLoading(true); + try { + const response = await fetch('http://10.0.0.160:8080/auth/login', { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + email: _data.email, + password:_data.password + }), + credentials: "include" + }); + const data = await response.json(); + if (response.ok) { + setLoading(false); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + {data.message} + + ); + }, + }); + router.push('/home'); + } else { + setLoading(false); + // console.log(data); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + {data.message} + + ); + }, + }); + } + } catch (error) { + console.error('Error:', error); + // setResponse('An error occurred'); + } + // }, 3000); + setLoading(false); }; const handleKeyPress = () => { @@ -113,20 +204,16 @@ const SignInForm = () => { handleSubmit(onSubmit)(); }; - const [showPassword, setShowPassword] = useState(false); - const handleState = () => { - setShowPassword((showState) => { - return !showState; - }); + setShowPassword((showState) => !showState); }; const GradientButton = ({ onPress, text }) => ( @@ -134,25 +221,35 @@ const SignInForm = () => { ); - + const styles = StyleSheet.create({ buttonContainer: { borderRadius: 15, - marginTop: 20, + marginTop: hp('2%'), alignSelf: 'center', - width: 360, - height: 50 + width: wp('90%'), + height: hp('6%'), }, buttonText: { color: 'black', - fontSize: 16, + fontSize: wp('4%'), textAlign: 'center', - lineHeight: 50, - } + lineHeight: hp('6%'), + }, }); return ( <> + + {biometricAvailable && ( + + + + + + )} + Or + { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { onSubmitEditing={handleKeyPress} returnKeyType="done" /> - - )} - /> @@ -201,9 +295,9 @@ const SignInForm = () => { - - - Password + + + Password { rules={{ validate: async (value) => { try { - await signInSchema.parseAsync({ - password: value, - }); + await signInSchema.parseAsync({ password: value }); return true; } catch (error: any) { return error.message; @@ -222,7 +314,7 @@ const SignInForm = () => { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { {errors?.password?.message} - - { onChange={onChange} > - + - Remember me + Remember me )} /> @@ -283,90 +373,96 @@ const SignInForm = () => { - + {loading ? ( + + ) : ( + + )} + {/* */} ); }; const Main = () => { return ( - <> - - - - - Occupi Logo - - - - Welcome back to Occupi. - - - Predict. Plan. Perfect. - - + + + + Occupi Logo + + + + Welcome back to Occupi. + + + Predict. Plan. Perfect. + + + - - - + - - New to Occupi? - - - Register - - - - + New to Occupi? + + + Register + + + ); }; const SignIn = () => { return ( - <> +
- - + ); }; diff --git a/frontend/occupi-mobile3/screens/Login/SignUp.tsx b/frontend/occupi-mobile3/screens/Login/SignUp.tsx index e5b87840..cf5cf616 100644 --- a/frontend/occupi-mobile3/screens/Login/SignUp.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignUp.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useRef } from 'react'; import Logo from '../../screens/Login/assets/images/Occupi/file.png'; import { Button, @@ -7,6 +7,7 @@ import { HStack, VStack, Text, + View, Link, Divider, Icon, @@ -41,19 +42,20 @@ import { Controller, useForm } from 'react-hook-form'; import { AlertTriangle, EyeIcon, EyeOffIcon } from 'lucide-react-native'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { Keyboard, StyleSheet } from 'react-native'; +import { Keyboard, StyleSheet, Alert, Animated } from 'react-native'; import { LinearGradient } from 'expo-linear-gradient'; import { FacebookIcon, GoogleIcon } from './assets/Icons/Social'; import GuestLayout from '../../layouts/GuestLayout'; import StyledExpoRouterLink from '../../components/StyledExpoRouterLink'; import { router } from 'expo-router'; import { styled } from '@gluestack-style/react'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; const StyledImage = styled(Image, { props: { style: { - height: 40, - width: 320, + height: wp('10%'), + width: wp('80%'), }, }, }); @@ -102,14 +104,12 @@ function SideContainerWeb() { w="$80" alt="gluestack-ui Pro" resizeMode="contain" - source={require('./assets/images/gluestackUiProLogo_web_light.svg')} + // source={require('./assets/images/gluestackUiProLogo_web_light.svg')} /> ); } - - const SignUpForm = () => { const { control, @@ -122,21 +122,60 @@ const SignUpForm = () => { const [isEmailFocused, setIsEmailFocused] = useState(false); const [pwMatched, setPwMatched] = useState(false); const toast = useToast(); + const [data, setData] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const spinValue = useRef(new Animated.Value(0)).current; - const onSubmit = (_data: SignUpSchemaType) => { + const onSubmit = async (_data: SignUpSchemaType) => { if (_data.password === _data.confirmpassword) { setPwMatched(true); - toast.show({ - placement: 'bottom right', - render: ({ id }) => { - return ( - - Email verified - - ); - }, - }); - reset(); + setLoading(true); + try { + const response = await fetch('http://10.0.0.160:8080/auth/register', { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + email: _data.email, + password: _data.password + }), + credentials: "include" + }); + const data = await response.json(); + if (response.ok) { + setLoading(false); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + {data.message} + + ); + }, + }); + router.push({pathname:'/verify-otp', params: { email: _data.email}}); + } else { + setLoading(false); + // console.log(data); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + {data.error.message} + + ); + }, + }); + } + } catch (error) { + console.error('Error:', error); + } + setLoading(false) } else { toast.show({ placement: 'bottom right', @@ -149,9 +188,6 @@ const SignUpForm = () => { }, }); } - // Implement your own onSubmit and navigation logic here. - // Navigate to appropriate location - router.replace('/verify-otp'); }; const handleKeyPress = () => { @@ -173,10 +209,10 @@ const SignUpForm = () => { const GradientButton = ({ onPress, text }) => ( @@ -184,20 +220,20 @@ const SignUpForm = () => { ); - + const styles = StyleSheet.create({ buttonContainer: { borderRadius: 15, - marginTop: 20, + marginTop: hp('2%'), alignSelf: 'center', - width: 360, - height: 50 + width: wp('90%'), + height: hp('6%'), }, buttonText: { color: 'black', - fontSize: 16, + fontSize: wp('4%'), textAlign: 'center', - lineHeight: 50, + lineHeight: hp('6%'), } }); @@ -220,16 +256,16 @@ const SignUpForm = () => { try { await signUpSchema.parseAsync({ email: value }); return true; - } catch (error: any) { + } catch (error) { return error.message; } }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { password: value, }); return true; - } catch (error: any) { + } catch (error) { return error.message; } }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { Terms of Use {' '} - {/* &{' '} */} { )} /> - + + {loading ? ( + + ) : ( + + )} ); }; @@ -492,7 +535,7 @@ function SignUpFormComponent() { Occupi Logo @@ -504,7 +547,7 @@ function SignUpFormComponent() { Register for Occupi. Predict. Plan. Perfect. @@ -543,7 +586,7 @@ function SignUpFormComponent() { export default function SignUp() { return ( - ( { >
@@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/home'); // Navigate to Onboarding1 screen + router.navigate('/login'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount @@ -158,20 +158,20 @@ const styles = StyleSheet.create({ alignItems: 'center', }, logo: { - width: 110, - height: 110, + width: wp('27%'), + height: wp('27%'), }, buttonContainer: { - paddingVertical: 15, - paddingHorizontal: 30, + paddingVertical: hp('2%'), + paddingHorizontal: wp('8%'), borderRadius: 25, - marginTop: 20, + marginTop: hp('2%'), alignSelf: 'center', - width: 150, + width: wp('40%'), }, buttonText: { color: 'white', - fontSize: 16, + fontSize: wp('4%'), textAlign: 'center', }, }); diff --git a/frontend/occupi-mobile3/screens/Login/Welcome.tsx b/frontend/occupi-mobile3/screens/Login/Welcome.tsx index 1f42006c..82fc8f8c 100644 --- a/frontend/occupi-mobile3/screens/Login/Welcome.tsx +++ b/frontend/occupi-mobile3/screens/Login/Welcome.tsx @@ -1,114 +1,100 @@ -import React, { useState, useEffect, useRef } from 'react'; +import React from 'react'; import { LinearGradient } from 'expo-linear-gradient'; import { - Button, - Box, - Image, - Center, - Text, - Heading, - } from '@gluestack-ui/themed'; -import { Animated, StyleSheet, View } from 'react-native'; + Button, + Box, + Image, + Center, + Text, + Heading, +} from '@gluestack-ui/themed'; +import { StyleSheet, View } from 'react-native'; import { router } from 'expo-router'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; const GradientButton = ({ onPress, text }) => ( - - - {text} - - - ); - - const spinValue = useRef(new Animated.Value(0)).current; - const scaleValue = useRef(new Animated.Value(0)).current; - useEffect(() => { - // Spin animation - Animated.loop( - Animated.timing(spinValue, { - toValue: 1, - duration: 5000, - useNativeDriver: true, - }) - ).start(); - - // Scale animation - Animated.loop( - Animated.sequence([ - Animated.timing(scaleValue, { - toValue: 1.2, - duration: 5000, - useNativeDriver: true, - }), - Animated.timing(scaleValue, { - toValue: 0.8, - duration: 5000, - useNativeDriver: true, - }), - Animated.timing(scaleValue, { - toValue: 1, - duration: 5000, - useNativeDriver: true, - }), - ]) - ).start(); - }, [scaleValue, spinValue]); - - const spin = spinValue.interpolate({ - inputRange: [0, 1], - outputRange: ['0deg', '360deg'], - }); - - const animatedStyle = { - transform: [{ rotate: spin }, { scale: scaleValue }], - }; - + style={styles.buttonContainer} + > + + {text} + + +); const Welcome = () => { return ( - -
- logo - Log in. Let's Plan. - - Predict. Plan. Perfect. - - router.push('/login')} - text="Login" - /> - router.push('/signup')}>Register -
-
- ) -} + +
+ logo + Log in. Let's Plan. + Predict. Plan. Perfect. + router.push('/login')} + text="Login" + /> + router.push('/signup')}>Register +
+
+ ); +}; const styles = StyleSheet.create({ - buttonContainer: { - borderRadius: 15, - marginTop: 20, - alignSelf: 'center', - width: 360, - height: 50 - }, - buttonText: { - color: 'black', - fontSize: 16, - textAlign: 'center', - lineHeight: 50, - } - }); - -export default Welcome \ No newline at end of file + container: { + flex: 1, + backgroundColor: 'white', + padding: wp('4%'), + }, + center: { + height: '100%', + justifyContent: 'center', + }, + logo: { + width: wp('50%'), + height: wp('50%'), + marginBottom: hp('3%'), + marginTop: hp('3%'), + }, + heading: { + alignSelf: 'center', + fontSize: wp('8%'), + paddingLeft: wp('4%'), + marginBottom: hp('2%'), + marginTop: hp('4%'), + }, + subHeading: { + alignSelf: 'center', + fontSize: wp('5%'), + padding: wp('4%'), + fontWeight: '300', + marginBottom: hp('6%'), + }, + buttonContainer: { + borderRadius: 15, + marginTop: hp('2%'), + alignSelf: 'center', + width: wp('90%'), + height: hp('6%'), + }, + buttonText: { + color: 'black', + fontSize: wp('4%'), + textAlign: 'center', + lineHeight: hp('6%'), + }, + registerText: { + fontWeight: 'bold', + marginTop: hp('3%'), + fontSize: wp('4%'), + }, +}); + +export default Welcome; diff --git a/frontend/occupi-mobile3/screens/Office/BookingDetails.tsx b/frontend/occupi-mobile3/screens/Office/BookingDetails.tsx new file mode 100644 index 00000000..a8e4a73f --- /dev/null +++ b/frontend/occupi-mobile3/screens/Office/BookingDetails.tsx @@ -0,0 +1,149 @@ +import React, { useState, useEffect } from 'react'; +import { View, Text, Image, TouchableOpacity, TextInput, FlatList, Animated } from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { useNavigation, useRoute } from '@react-navigation/native'; +import { LinearGradient } from 'expo-linear-gradient'; +import { useColorScheme } from 'react-native'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; + +const BookingDetails = () => { + const navigation = useNavigation(); + const route = useRoute(); + const { slot } = route.params; + + const [attendees, setAttendees] = useState(['abcd@gmail.com']); + const [email, setEmail] = useState(''); + const [currentStep, setCurrentStep] = useState(0); + const colorScheme = useColorScheme(); + const isDarkMode = colorScheme === 'dark'; + + const pulseAnim = new Animated.Value(1); + + const animatePulse = () => { + Animated.loop( + Animated.sequence([ + Animated.timing(pulseAnim, { toValue: 1.2, duration: 500, useNativeDriver: true }), + Animated.timing(pulseAnim, { toValue: 1, duration: 500, useNativeDriver: true }), + ]) + ).start(); + }; + + const addAttendee = () => { + if (email && !attendees.includes(email)) { + setAttendees([...attendees, email]); + setEmail(''); + } + }; + + const removeAttendee = (emailToRemove) => { + setAttendees(attendees.filter(email => email !== emailToRemove)); + }; + + const renderAttendee = ({ item }) => ( + + {item} + removeAttendee(item)}> + + + + ); + + const steps = ['Booking details', 'Attendees', 'Receipt']; + + const handleSegmentPress = (index) => { + setCurrentStep(index); + if (index === 0) animatePulse(); + }; + + useEffect(() => { + if (currentStep === 0) animatePulse(); + }, [currentStep]); + + return ( + + {/* Top Section */} + + navigation.goBack()}> + + + {steps[currentStep]} + + + {/* Segmented Control */} + + {steps.map((step, index) => ( + handleSegmentPress(index)}> + + {step} + + + ))} + + + {currentStep === 0 && ( + + {/* Office Image and Details */} + + + The HDMI room + 🏃 Fast 📺 OLED 👥 5 people 🏢 Floor 7 + Check in: 07:30 Check out: 10:30 + Selected Slot: {slot} + + handleSegmentPress(1)}> + + Confirm booking + + + + )} + + {currentStep === 1 && ( + + + + + + item} + style={{ marginHorizontal: wp('5%') }} + /> + handleSegmentPress(2)}> + + Send invites + + + + Skip this step + + + )} + + {currentStep === 2 && ( + + Receipt details go here... + + )} + + ); +}; + +export default BookingDetails; diff --git a/frontend/occupi-mobile3/screens/Office/BookingReceipt.tsx b/frontend/occupi-mobile3/screens/Office/BookingReceipt.tsx new file mode 100644 index 00000000..f9aa32ff --- /dev/null +++ b/frontend/occupi-mobile3/screens/Office/BookingReceipt.tsx @@ -0,0 +1,188 @@ +import React, { useEffect, useRef, useState } from 'react'; +import { View, Text, Image, TouchableOpacity, Animated, Alert } from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import SegmentedControl from '@react-native-segmented-control/segmented-control'; +import { LinearGradient } from 'expo-linear-gradient'; +import { useColorScheme } from 'react-native'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; +import { useNavigation, useRoute } from '@react-navigation/native'; +import * as FileSystem from 'expo-file-system'; +import * as Sharing from 'expo-sharing'; +import * as Print from 'expo-print'; +// import Barcode from 'react-native-barcode-builder'; + +const BookingReceipt = () => { + const [selectedIndex, setSelectedIndex] = useState(2); + const colorScheme = useColorScheme(); + const isDarkMode = colorScheme === 'dark'; + const navigation = useNavigation(); + const route = useRoute(); + const { slot, attendees } = route.params; + + const pulseAnim = useRef(new Animated.Value(1)).current; + + useEffect(() => { + animatePulse(); + }, [selectedIndex]); + + const animatePulse = () => { + Animated.loop( + Animated.sequence([ + Animated.timing(pulseAnim, { toValue: 1.2, duration: 500, useNativeDriver: true }), + Animated.timing(pulseAnim, { toValue: 1, duration: 500, useNativeDriver: true }), + ]) + ).start(); + }; + + const handleSegmentChange = (event) => { + setSelectedIndex(event.nativeEvent.selectedSegmentIndex); + }; + + const generatePDF = async () => { + const htmlContent = ` + + + + + +
+
The HDMI room
+
+

🏃 Fast 📺 OLED 👥 5 people 🏢 Floor 7

+

Check in: 07:30 Check out: 10:30

+

Selected Slot: ${slot}

+

Host: Sabrina Carpenter, Chief Executive Officer

+
+
+ +

ABC-abc-1234

+
+
+ + + `; + + const { uri } = await Print.printToFileAsync({ html: htmlContent }); + return uri; + }; + + const handleDownload = async () => { + try { + const pdfUri = await generatePDF(); + if (pdfUri) { + const permission = await FileSystem.getPermissionsAsync(); + if (permission.granted) { + const newPath = `${FileSystem.documentDirectory}BookingReceipt.pdf`; + await FileSystem.copyAsync({ from: pdfUri, to: newPath }); + await Sharing.shareAsync(newPath); + } else { + Alert.alert('Permission Denied', 'You need to grant storage permissions to download the PDF'); + } + } + } catch (error) { + console.error('Error generating PDF:', error); + } + }; + + const generateBarcodeBase64 = async (value) => { + return new Promise((resolve, reject) => { + // You need to implement barcode generation and convert to base64 here + // For example, using node-barcode or similar library to generate barcode base64 string + // This is a placeholder function + resolve('barcode_base64_string'); + }); + }; + + return ( + + {/* Top Section */} + + navigation.goBack()}> + + + Booking details + + + {/* Segmented Control */} + + + {selectedIndex === 2 && ( + + {/* Office Image and Details */} + + + The HDMI room + + 🏃 Fast + 📺 OLED + 👥 5 people + 🏢 Floor 7 + + + + Check in: 07:30 + + + Check out: 10:30 + + + + + {/* Host Details */} + + + + Sabrina Carpenter + Chief Executive Officer + + + + {/* Barcode */} + + {/* */} + ABC-abc-1234 + + + {/* Download Receipt Button */} + + + Download receipt as PDF + + + + )} + + {selectedIndex === 1 && ( + + {/* Attendees Component */} + Attendees details go here... + + )} + + {selectedIndex === 0 && ( + + {/* Booking Details Component */} + Booking details go here... + + )} + + ); +}; + +export default BookingReceipt; diff --git a/frontend/occupi-mobile3/screens/Office/OfficeDetails.tsx b/frontend/occupi-mobile3/screens/Office/OfficeDetails.tsx new file mode 100644 index 00000000..eea6e5aa --- /dev/null +++ b/frontend/occupi-mobile3/screens/Office/OfficeDetails.tsx @@ -0,0 +1,215 @@ +import React, { useState, useEffect } from 'react'; +import { + View, + Text, + ScrollView, + TouchableOpacity, + Modal, + Image, + useColorScheme, +} from 'react-native'; +import { + Ionicons, + FontAwesome, + MaterialIcons, + MaterialCommunityIcons, +} from '@expo/vector-icons'; +import { Calendar } from 'react-native-calendars'; +import { LinearGradient } from 'expo-linear-gradient'; +import { + widthPercentageToDP as wp, + heightPercentageToDP as hp, +} from 'react-native-responsive-screen'; +import Carousel from 'react-native-snap-carousel'; +import { useNavigation, NavigationProp } from '@react-navigation/native'; +import { Theme } from 'react-native-calendars/src/types'; +import slotsData from './availableSlots.json'; + +type RootStackParamList = { + BookingDetails: undefined; +}; + +const images = [ + { + uri: 'https://cdn-bnokp.nitrocdn.com/QNoeDwCprhACHQcnEmHgXDhDpbEOlRHH/assets/images/optimized/rev-15fa1b1/www.decorilla.com/online-decorating/wp-content/uploads/2022/03/Modern-Office-Interior-with-Open-Floor-Plan-1024x683.jpeg', + }, + { + uri: 'https://cdn-bnokp.nitrocdn.com/QNoeDwCprhACHQcnEmHgXDhDpbEOlRHH/assets/images/optimized/rev-15fa1b1/www.decorilla.com/online-decorating/wp-content/uploads/2022/03/modern-office-design-for-a-large-conference-room-1024x838.jpeg', + }, + { + uri: 'https://cdn-bnokp.nitrocdn.com/QNoeDwCprhACHQcnEmHgXDhDpbEOlRHH/assets/images/optimized/rev-15fa1b1/www.decorilla.com/online-decorating/wp-content/uploads/2022/03/Industrial-style-office-interior-design-Sonia-C-1024x683.jpg', + }, +]; + +const OfficeDetails = () => { + const [modalVisible, setModalVisible] = useState(false); + const colorScheme = useColorScheme(); + const isDarkMode = colorScheme === 'dark'; + const navigation = useNavigation>(); + const [availableSlots, setAvailableSlots] = useState({}); + + useEffect(() => { + // Load the available slots from the JSON file + setAvailableSlots(slotsData.slots); + }, []); + + const handleCheckAvailability = () => { + setModalVisible(true); + }; + + const renderItem = ({ item }: { item: { uri: string } }) => ( + + + + ); + + const handleSlotClick = () => { + navigation.navigate('BookingDetails'); + }; + + return ( + + {/* Top Section */} + + The HDMI room + + + + + + + {/* Image Section */} + {/* */} + + {/* Details Section */} + + The HDMI Room + + 🏃 Fast 📺 OLED 👥 5 people 🏢 Floor 7 + + + + {/* Category Icons */} + Categories + + + + Focus + + + + Chill + + + + Ideas + + + + Loud + + + + Game + + + + {/* Description */} + + Description + + Lorem ipsum dolor sit amet consectetur. Ut lectus rutrum imperdiet enim consectetur egestas sem. Est tellus id nulla morbi. Nibh nulla ut diam morbi cras viverra vivamus risus scelerisque. + + + + {/* Check Availability Button */} + + + Check availability + + + + {/* Modal for Calendar */} + { + setModalVisible(!modalVisible); + }} + > + + Available slots + { + acc[date] = { selected: true, selectedColor: 'green' }; + return acc; + }, {})} + /> + + {Object.keys(availableSlots).map(date => ( + availableSlots[date].map((slot, index) => ( + + {date} at {slot} + + )) + ))} + + setModalVisible(!modalVisible)} + > + Close + + + + + ); +}; + +export default OfficeDetails; + +export const calendarTheme: Theme = { + backgroundColor: '#ffffff', + calendarBackground: '#ffffff', + textSectionTitleColor: '#b6c1cd', + textSectionTitleDisabledColor: '#d9e1e8', + selectedDayBackgroundColor: '#00adf5', + selectedDayTextColor: '#ffffff', + todayTextColor: '#00adf5', + dayTextColor: '#2d4150', + textDisabledColor: '#d9e1e8', + dotColor: '#00adf5', + selectedDotColor: '#ffffff', + arrowColor: 'orange', + disabledArrowColor: '#d9e1e8', + monthTextColor: 'blue', + indicatorColor: 'blue', + textDayFontFamily: 'monospace', + textMonthFontFamily: 'monospace', + textDayHeaderFontFamily: 'monospace', + textDayFontWeight: '300', + textMonthFontWeight: 'bold', + textDayHeaderFontWeight: '300', + textDayFontSize: 16, + textMonthFontSize: 16, + textDayHeaderFontSize: 16, +}; diff --git a/frontend/occupi-mobile3/screens/Office/availableSlots.json b/frontend/occupi-mobile3/screens/Office/availableSlots.json new file mode 100644 index 00000000..8e346275 --- /dev/null +++ b/frontend/occupi-mobile3/screens/Office/availableSlots.json @@ -0,0 +1,9 @@ +{ + "slots": { + "2024-05-20": ["07:30-09:30"], + "2024-05-21": ["10:30-11:30"], + "2024-05-22": ["05:30-09:30", "14:30-17:30"], + "2024-05-23": [] + } + } + \ No newline at end of file diff --git a/frontend/occupi-mobile3/screens/Office/calendarConfig.js b/frontend/occupi-mobile3/screens/Office/calendarConfig.js new file mode 100644 index 00000000..225ff79c --- /dev/null +++ b/frontend/occupi-mobile3/screens/Office/calendarConfig.js @@ -0,0 +1,70 @@ + +export const calendarTheme = { + backgroundColor: '#ffffff', + calendarBackground: '#ffffff', + textSectionTitleColor: '#b6c1cd', + textSectionTitleDisabledColor: '#d9e1e8', + selectedDayBackgroundColor: '#00adf5', + selectedDayTextColor: '#ffffff', + todayTextColor: '#00adf5', + dayTextColor: '#2d4150', + textDisabledColor: '#d9e1e8', + dotColor: '#00adf5', + selectedDotColor: '#ffffff', + arrowColor: 'orange', + disabledArrowColor: '#d9e1e8', + monthTextColor: 'blue', + indicatorColor: 'blue', + textDayFontFamily: 'monospace', + textMonthFontFamily: 'monospace', + textDayHeaderFontFamily: 'monospace', + textDayFontWeight: '300', + textMonthFontWeight: 'bold', + textDayHeaderFontWeight: '300', + textDayFontSize: 16, + textMonthFontSize: 16, + textDayHeaderFontSize: 16, + }; + + export const calendarLocale = { + monthNames: [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ], + monthNamesShort: [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ], + dayNames: [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ], + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], + today: 'Today', + }; + \ No newline at end of file diff --git a/frontend/occupi-mobile3/screens/Profile/Profile.tsx b/frontend/occupi-mobile3/screens/Profile/Profile.tsx index b268df75..5faddd24 100644 --- a/frontend/occupi-mobile3/screens/Profile/Profile.tsx +++ b/frontend/occupi-mobile3/screens/Profile/Profile.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState } from 'react'; import { View, Text, @@ -7,24 +7,35 @@ import { StyleSheet, ScrollView, Alert, -} from "react-native"; -import { SafeAreaView } from "react-native-safe-area-context"; -import { Feather, MaterialIcons } from "@expo/vector-icons"; -import { Radio, RadioGroup, RadioLabel, RadioIndicator, RadioIcon, VStack, CircleIcon, Icon, useColorMode } from "@gluestack-ui/themed"; -import DateTimePickerModal from "react-native-modal-datetime-picker"; +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { Feather, MaterialIcons } from '@expo/vector-icons'; +import { + Radio, + RadioGroup, + RadioLabel, + RadioIndicator, + RadioIcon, + VStack, + CircleIcon, + Icon, + useColorMode, +} from '@gluestack-ui/themed'; +import DateTimePickerModal from 'react-native-modal-datetime-picker'; import { LinearGradient } from 'expo-linear-gradient'; import { router } from 'expo-router'; import { Appearance, useColorScheme } from 'react-native'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; const COLORS = { - white: "#FFFFFF", - black: "#000000", - gray: "#BEBEBE", - primary: "#3366FF", + white: '#FFFFFF', + black: '#000000', + gray: '#BEBEBE', + primary: '#3366FF', }; const FONTS = { - h3: { fontSize: 20, fontWeight: "bold" }, + h3: { fontSize: 20, fontWeight: 'bold' }, body3: { fontSize: 16 }, }; @@ -34,17 +45,13 @@ const SIZES = { radius: 8, }; - - const Profile = () => { - - // this needs integration const [selectedGenderIndex, setSelectedGenderIndex] = useState(1); - const [name, setName] = useState("Sabrina Carpenter"); - const [email, setEmail] = useState("u21546551@tuks.co.za"); - const [employeeId, setEmployeeId] = useState("21546551"); - const [phoneNumber, setPhoneNumber] = useState("011 101 1111"); - const [pronouns, setPronouns] = useState("she/her"); + const [name, setName] = useState('Sabrina Carpenter'); + const [email, setEmail] = useState('sabrina@deloitte.co.za'); + const [employeeId, setEmployeeId] = useState('31115087'); + const [phoneNumber, setPhoneNumber] = useState('082 083 3988'); + const [pronouns, setPronouns] = useState('she/her'); const [date, setDate] = useState(new Date(2000, 6, 7)); const [isDatePickerVisible, setDatePickerVisibility] = useState(false); const { colorMode, toggleColorMode } = useColorMode(); @@ -65,17 +72,29 @@ const Profile = () => { const onSave = () => { Alert.alert( - "Profile Saved", - `Name: ${name}\nDOB: ${date.toLocaleDateString()}\nGender: ${['Male', 'Female', 'N-Bin'][selectedGenderIndex]}\nEmail: ${email}\nEmployee ID: ${employeeId}\nPhone: ${phoneNumber}\nPronouns: ${pronouns}` + 'Profile Saved', + `Name: ${name}\nDOB: ${date.toLocaleDateString()}\nGender: ${ + ['Male', 'Female', 'N-Bin'][selectedGenderIndex] + }\nEmail: ${email}\nEmployee ID: ${employeeId}\nPhone: ${phoneNumber}\nPronouns: ${pronouns}` ); }; return ( - + - router.push('/settings')} /> - My account + router.push('/settings')} + /> + + My account + { Full name Date of birth - - {date.toLocaleDateString()} + + + {date.toLocaleDateString()} + { /> Gender - {/* setSelectedGenderIndex(index)} - style={styles.radioGroup} - > - Male - Female - Non-Binary - */} setSelectedGenderIndex(index)}> - - + + Male - + Female - + Other @@ -138,31 +170,27 @@ const Profile = () => { - Email Address Employee ID Number @@ -171,14 +199,14 @@ const Profile = () => { style={colorScheme === 'dark' ? styles.inputdark : styles.inputlight} placeholder="she/her" placeholderTextColor={COLORS.gray} - placeholder={pronouns} onChangeText={setPronouns} /> Save @@ -202,9 +230,9 @@ const styles = StyleSheet.create({ padding: SIZES.padding, }, header: { - flexDirection: "row", - alignItems: "center", - justifyContent: "space-between", + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', marginBottom: SIZES.padding, }, icon: { @@ -226,46 +254,46 @@ const styles = StyleSheet.create({ inputdark: { height: 44, borderWidth: 1, - borderColor: "#5A5A5A", + borderColor: '#5A5A5A', borderRadius: SIZES.radius, paddingHorizontal: SIZES.padding, marginBottom: SIZES.padding, color: COLORS.white, - backgroundColor: "#5A5A5A" + backgroundColor: '#5A5A5A', }, inputlight: { height: 44, borderWidth: 1, - borderColor: "#f2f2f2", + borderColor: '#f2f2f2', borderRadius: SIZES.radius, paddingHorizontal: SIZES.padding, marginBottom: SIZES.padding, color: COLORS.black, - backgroundColor: "#f2f2f2" + backgroundColor: '#f2f2f2', }, dateInputContainerdark: { - flexDirection: "row", - alignItems: "center", + flexDirection: 'row', + alignItems: 'center', borderWidth: 1, - borderColor: "#5A5A5A", + borderColor: '#5A5A5A', borderRadius: SIZES.radius, paddingHorizontal: SIZES.padding, marginBottom: SIZES.padding, height: 44, color: COLORS.white, - backgroundColor: "#5A5A5A" + backgroundColor: '#5A5A5A', }, dateInputContainerlight: { - flexDirection: "row", - alignItems: "center", + flexDirection: 'row', + alignItems: 'center', borderWidth: 1, - borderColor: "#f2f2f2", + borderColor: '#f2f2f2', borderRadius: SIZES.radius, paddingHorizontal: SIZES.padding, marginBottom: SIZES.padding, height: 44, color: COLORS.black, - backgroundColor: "#f2f2f2" + backgroundColor: '#f2f2f2', }, textdark: { color: COLORS.white, @@ -282,38 +310,25 @@ const styles = StyleSheet.create({ color: COLORS.black, }, radioGroup: { - flexDirection: "row", - justifyContent: "space-between", + flexDirection: 'row', + justifyContent: 'space-between', marginBottom: SIZES.padding, }, - radio: { - flex: 2, - alignItems: "center", - borderWidth: 1, - borderColor: 'grey', - paddingHorizontal: SIZES.padding, - marginBottom: SIZES.padding, - borderRadius: SIZES.radius, - padding: 5, - margin: 10, // Add this line - backgroundColor: 'gray', // Add this line -}, saveButton: { height: 50, borderRadius: 15, marginTop: SIZES.padding, - overflow: "hidden", + overflow: 'hidden', }, saveButtonGradient: { flex: 1, - justifyContent: "center", - alignItems: "center", - + justifyContent: 'center', + alignItems: 'center', }, saveButtonText: { - color: 'darkslategrey', // Change this line + color: 'darkslategrey', ...FONTS.h3, -}, + }, }); export default Profile; diff --git a/frontend/occupi-mobile3/screens/Profile/Settings.tsx b/frontend/occupi-mobile3/screens/Profile/Settings.tsx index a8ca4cf0..cafc0eff 100644 --- a/frontend/occupi-mobile3/screens/Profile/Settings.tsx +++ b/frontend/occupi-mobile3/screens/Profile/Settings.tsx @@ -10,21 +10,26 @@ import { Switch, Divider, Pressable, - useColorMode + useColorMode, } from '@gluestack-ui/themed'; import { useNavigation } from '@react-navigation/native'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { Feather, MaterialIcons } from '@expo/vector-icons'; import { router } from 'expo-router'; -import Navbar from "../../components/NavBar" +import Navbar from '../../components/NavBar'; import { Appearance, useColorScheme } from 'react-native'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; const Settings = () => { const [notificationsEnabled, setNotificationsEnabled] = useState(true); - // const { colorMode, toggleColorMode } = useColorMode(); + const [name, setName] = useState('Sabrina Carpenter'); const navigation = useNavigation(); let colorScheme = useColorScheme(); - // console.log(colorScheme); + + const handleNameChange = () => { + setName('Sabrina Palmer'); + router.push('/profile'); + }; const toggleNotifications = () => { setNotificationsEnabled(!notificationsEnabled); @@ -32,42 +37,45 @@ const Settings = () => { const toggleColorMode = () => { colorScheme = !colorScheme; - } + }; const handleNavigate = (screen) => { navigation.navigate(screen); }; const handleLogout = () => { - Alert.alert( - "Log out", - "Are you sure you want to log out?", - [ - { - text: "Cancel", - style: "cancel" - }, - { - text: "OK", - onPress: () => handleNavigate('login') - // onPress: async () => { - // await AsyncStorage.clear(); - // navigation.reset({ - // index: 0, - // routes: [{ name: 'Login' }] - // }); - // } - } - ] - ); + Alert.alert('Log out', 'Are you sure you want to log out?', [ + { + text: 'Cancel', + style: 'cancel', + }, + { + text: 'OK', + onPress: () => handleNavigate('login'), + }, + ]); }; const data = [ - { title: 'My account', description: 'Make changes to your account', iconName: 'user', onPress: () => handleNavigate('profile') }, - { title: 'Notifications', description: 'Manage your notifications', iconName: 'bell', accessoryRight: () => }, + { title: 'My account', description: 'Make changes to your account', iconName: 'user', onPress: handleNameChange }, + { + title: 'Notifications', + description: 'Manage your notifications', + iconName: 'bell', + accessoryRight: () => ( + + ), + }, { title: 'Privacy Policy', description: 'View privacy policy', iconName: 'lock', onPress: () => handleNavigate('PrivacyPolicyScreen') }, { title: 'Security', description: 'Enhance your security', iconName: 'shield', onPress: () => handleNavigate('SecurityScreen') }, - // { title: 'Dark mode', description: 'Enable or disable dark mode', iconName: 'moon', accessoryRight: () => }, + // { + // title: 'Dark mode', + // description: 'Enable or disable dark mode', + // iconName: 'moon', + // accessoryRight: () => ( + // + // ), + // }, { title: 'Terms and Policies', description: 'View terms and policies', iconName: 'file-text', onPress: () => handleNavigate('TermsPoliciesScreen') }, { title: 'Report a problem', description: 'Report any issues', iconName: 'alert-circle', onPress: () => handleNavigate('ReportProblemScreen') }, { title: 'Support', description: 'Get support', iconName: 'headphones', onPress: () => handleNavigate('SupportScreen') }, @@ -76,7 +84,10 @@ const Settings = () => { ]; const renderListItem = ({ item }) => ( - + @@ -92,50 +103,48 @@ const Settings = () => { ); - - return ( <> - - -
- - -
- - - Sabrina Carpenter - {/* handleNavigate('EditProfileScreen')} /> */} - - Chief Executive Officer + + +
+ + +
+ + + {name} + {/* handleNavigate('EditProfileScreen')} /> */} + + Chief Executive Officer +
-
- - - {data.map((item, index) => ( - - {renderListItem({ item })} - {index < data.length - 1 && } - - ))} - -
- Version 0.1.0 -
-
- + + + {data.map((item, index) => ( + + {renderListItem({ item })} + {index < data.length - 1 && } + + ))} + +
+ Version 0.1.0 +
+
+ ); -} +}; const styles = StyleSheet.create({ container: { flex: 1, paddingTop: 40, - top: 0 + top: 0, }, lightContainer: { backgroundColor: '#fff', @@ -149,23 +158,23 @@ const styles = StyleSheet.create({ }, imageContainer: { position: 'relative', - width: 100, - height: 100, + width: wp('25%'), + height: wp('25%'), alignItems: 'center', justifyContent: 'center', marginBottom: 16, }, profileImage: { - width: 100, - height: 100, - borderRadius: 50, + width: wp('25%'), + height: wp('25%'), + borderRadius: wp('12.5%'), }, cameraIcon: { position: 'absolute', bottom: 0, - left: 70, - width: 24, - height: 24, + left: wp('17.5%'), + width: wp('6%'), + height: wp('6%'), }, profileInfo: { alignItems: 'center', @@ -176,13 +185,13 @@ const styles = StyleSheet.create({ alignItems: 'center', }, profileName: { - fontSize: 25, + fontSize: wp('6%'), fontWeight: 'bold', alignItems: 'center', justifyContent: 'center', }, profileTitle: { - fontSize: 14, + fontSize: wp('3.5%'), }, lightText: { color: 'black', @@ -223,13 +232,13 @@ const styles = StyleSheet.create({ marginLeft: 8, }, title: { - fontSize: 16, + fontSize: wp('4%'), fontWeight: 'bold', marginRight: 60, }, description: { - fontSize: 14, - fontWeight: 'light' + fontSize: wp('3.5%'), + fontWeight: 'light', }, }); diff --git a/occupi-backend/cmd/occupi-backend/main.go b/occupi-backend/cmd/occupi-backend/main.go index 3b4a854e..cd7af4b0 100644 --- a/occupi-backend/cmd/occupi-backend/main.go +++ b/occupi-backend/cmd/occupi-backend/main.go @@ -55,7 +55,7 @@ func main() { } // Listening on the port with TLS - if err := ginRouter.RunTLS(":"+configs.GetPort(), certFile, keyFile); err != nil { + if err := ginRouter.Run(":"+configs.GetPort()); err != nil { logrus.Fatal("Failed to run server: ", err) } } diff --git a/occupi-backend/go.mod b/occupi-backend/go.mod index d17156b1..bcd39151 100644 --- a/occupi-backend/go.mod +++ b/occupi-backend/go.mod @@ -27,6 +27,7 @@ require ( github.com/cloudwego/iasm v0.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/gabriel-vasile/mimetype v1.4.4 // indirect + github.com/gin-contrib/cors v1.7.2 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-jose/go-jose/v4 v4.0.1 // indirect github.com/go-playground/locales v0.14.1 // indirect diff --git a/occupi-backend/go.sum b/occupi-backend/go.sum index 7aad25aa..fc42f50a 100644 --- a/occupi-backend/go.sum +++ b/occupi-backend/go.sum @@ -18,6 +18,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gabriel-vasile/mimetype v1.4.4 h1:QjV6pZ7/XZ7ryI2KuyeEDE8wnh7fHP9YnQy+R0LnH8I= github.com/gabriel-vasile/mimetype v1.4.4/go.mod h1:JwLei5XPtWdGiMFB5Pjle1oEeoSeEuJfJE+TtfvdB/s= +github.com/gin-contrib/cors v1.7.2 h1:oLDHxdg8W/XDoN/8zamqk/Drgt4oVZDvaV0YmvVICQw= +github.com/gin-contrib/cors v1.7.2/go.mod h1:SUJVARKgQ40dmrzgXEVxj2m7Ig1v1qIboQkPDTQ9t2E= github.com/gin-contrib/sessions v1.0.1 h1:3hsJyNs7v7N8OtelFmYXFrulAf6zSR7nW/putcPEHxI= github.com/gin-contrib/sessions v1.0.1/go.mod h1:ouxSFM24/OgIud5MJYQJLpy6AwxQ5EYO9yLhbtObGkM= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=