From 370b5af30cf5f42775bd78ea0e53c5c47f9ffe09 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 3 Jun 2024 01:25:52 +0200 Subject: [PATCH 01/29] Registration --- .../occupi-mobile/hooks/useColorScheme.ts | 1 + .../occupi-mobile/hooks/useColorScheme.web.ts | 8 ++ frontend/occupi-mobile/hooks/useThemeColor.ts | 22 ++++ .../occupi-mobile3/screens/Login/SignUp.tsx | 105 +++++++++++++----- 4 files changed, 111 insertions(+), 25 deletions(-) create mode 100644 frontend/occupi-mobile/hooks/useColorScheme.ts create mode 100644 frontend/occupi-mobile/hooks/useColorScheme.web.ts create mode 100644 frontend/occupi-mobile/hooks/useThemeColor.ts 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/screens/Login/SignUp.tsx b/frontend/occupi-mobile3/screens/Login/SignUp.tsx index e5b87840..99a89e27 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,7 +42,7 @@ 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'; @@ -122,21 +123,67 @@ 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) + setTimeout(() => { + setLoading(false); + if (_data.email !== 'tester@deloitte.co.za') { + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Deloitte email verification failed. + + ); + }, + }); + reset(); + } else { + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Verification successful + + ); + }, + }); + reset(); + router.push('/verify-otp') + } + }, 3000); + + // try { + // const response = await fetch('https://192.168.137.1:8080/auth/register', { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json' + // }, + // body: JSON.stringify({ + // email: "example", + // password: "12345" + // }) + // }); + + // const data = await response.json(); + + // if (response.ok) { + // Alert.alert('Success', 'User registered successfully!'); + // } else { + // Alert.alert('Error', data.message || 'Something went wrong!'); + // } + // } catch (error) { + // Alert.alert('Error', error.message); + // } } else { toast.show({ placement: 'bottom right', @@ -151,7 +198,7 @@ const SignUpForm = () => { } // Implement your own onSubmit and navigation logic here. // Navigate to appropriate location - router.replace('/verify-otp'); + // router.replace('/verify-otp'); }; const handleKeyPress = () => { @@ -173,10 +220,10 @@ const SignUpForm = () => { const GradientButton = ({ onPress, text }) => ( @@ -184,7 +231,7 @@ const SignUpForm = () => { ); - + const styles = StyleSheet.create({ buttonContainer: { borderRadius: 15, @@ -448,10 +495,18 @@ const SignUpForm = () => { )} /> - + + {loading ? ( + + ) : ( + + )} ); }; @@ -543,7 +598,7 @@ function SignUpFormComponent() { export default function SignUp() { return ( - Date: Mon, 3 Jun 2024 01:26:09 +0200 Subject: [PATCH 02/29] Login --- .../screens/Login/OtpVerification.tsx | 12 ++- .../occupi-mobile3/screens/Login/SignIn.tsx | 100 +++++++++++++----- 2 files changed, 81 insertions(+), 31 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx index 618cf99b..44340202 100644 --- a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx +++ b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx @@ -120,6 +120,7 @@ const OTPVerification = () => { const toast = useToast(); const onSubmit = async (_data: OTPSchemaType) => { + console.log('here'); const pinValues = refList.map((ref) => ref?.current?.value); const pin = pinValues.join(''); const Count = otpInput.filter((value) => value !== '').length; @@ -128,18 +129,19 @@ const OTPVerification = () => { return; } setValidationError(null); - + console.log('here'); toast.show({ - placement: 'bottom right', + placement: 'top', render: ({ id }) => ( - OTP sent successfully + Signup successful ), }); reset(); - router.push('/home'); + console.log('here'); + router.push('/login'); }; // const handleverify = async () => { @@ -230,7 +232,7 @@ const OTPVerification = () => { {remainingTime} seconds remaining diff --git a/frontend/occupi-mobile3/screens/Login/SignIn.tsx b/frontend/occupi-mobile3/screens/Login/SignIn.tsx index 40f379bb..e44e5118 100644 --- a/frontend/occupi-mobile3/screens/Login/SignIn.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignIn.tsx @@ -89,23 +89,64 @@ const SignInForm = () => { resolver: zodResolver(signInSchema), }); const [isEmailFocused, setIsEmailFocused] = useState(false); + const [loading, setLoading] = 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. + setLoading(true) + setTimeout(() => { + setLoading(false); + if (_data.email !== 'tester@deloitte.co.za' || _data.password !== 'Test@1234') { + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Invalid credentials + + ); + }, + }); + reset(); + } else { + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Login successful + + ); + }, + }); + reset(); + router.push('/home') + } + }, 3000); + + // try { + // const response = await fetch('https://192.168.137.1:8080/auth/register', { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json' + // }, + // body: JSON.stringify({ + // email: "example", + // password: "12345" + // }) + // }); + + // const data = await response.json(); + + // if (response.ok) { + // Alert.alert('Success', 'User registered successfully!'); + // } else { + // Alert.alert('Error', data.message || 'Something went wrong!'); + // } + // } catch (error) { + // Alert.alert('Error', error.message); + // } }; const handleKeyPress = () => { @@ -123,10 +164,10 @@ const SignInForm = () => { const GradientButton = ({ onPress, text }) => ( @@ -134,7 +175,7 @@ const SignInForm = () => { ); - + const styles = StyleSheet.create({ buttonContainer: { borderRadius: 15, @@ -203,7 +244,7 @@ const SignInForm = () => { - Password + Password { onChange={onChange} > - + Remember me @@ -283,10 +324,17 @@ const SignInForm = () => { - + {loading ? ( + + ) : ( + + )} ); }; @@ -310,7 +358,7 @@ const Main = () => { bg="$white" justifyContent="$center" > - + { <>
- + ); }; From 6ba1ca8ac129c5d3497e02f66c65a8f55dc460aa Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 3 Jun 2024 01:26:21 +0200 Subject: [PATCH 03/29] Checkin --- .../screens/Dashboard/Bookings.tsx | 139 +++++++++--------- .../screens/Dashboard/Dashboard.tsx | 52 ++++++- 2 files changed, 115 insertions(+), 76 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx b/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx index 5199bd0c..dd833df0 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { StatusBar, useColorScheme } from 'react-native'; +import { StatusBar, useColorScheme, ScrollView } from 'react-native'; import { StyleSheet, Text, @@ -16,6 +16,7 @@ import { 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(); @@ -34,8 +35,8 @@ const Bookings = () => { return ( <> - - + + Offices @@ -56,77 +57,77 @@ const Bookings = () => { - - - - 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 + + + - - - - Meeting Room 1 - 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 + + + - - - - Meeting Room 2 - 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 - - - + + + + Conference Room + Boasting sunset views, long desk and a large TV. + + + + + Closes at: 6pm + + + - + ); diff --git a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx index 59405e01..93adf1ec 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx @@ -1,12 +1,15 @@ import React, { useEffect, useState } from 'react'; import { StatusBar, useColorScheme } from 'react-native'; import Navbar from "../../components/NavBar"; -import { - StyleSheet, - Text, - View, +import { + StyleSheet, + Text, + View, Image, Card, + Toast, + useToast, + ToastTitle, Button, ButtonText, Icon, @@ -17,11 +20,41 @@ import { router } from 'expo-router'; const Dashboard = () => { const colorScheme = useColorScheme(); const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); + const [checkedIn, setCheckedIn] = useState(false); + const toast = useToast(); useEffect(() => { setIsDarkMode(colorScheme === 'dark'); }, [colorScheme]); + const checkIn = () => { + setCheckedIn(!checkedIn); + if (checkedIn === false) { + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Travel safe + + ); + }, + }); + } else { + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Check in successful. Have a productive day! + + ); + }, + }); + } + + } + const backgroundColor = isDarkMode ? '#1C1C1E' : 'white'; const textColor = isDarkMode ? 'white' : 'black'; const cardBackgroundColor = isDarkMode ? '#2C2C2E' : '#F3F3F3'; @@ -51,15 +84,20 @@ const Dashboard = () => { Office analytics - + {/* */} + {checkedIn ? ( + + ) : ( + + )} logo - + /> + ); }; From 4c84cf7e2ea967e4c082a9645e7ec058c05e34f8 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 3 Jun 2024 01:26:43 +0200 Subject: [PATCH 04/29] backend routing update for mobile --- occupi-backend/go.mod | 1 + occupi-backend/go.sum | 2 ++ occupi-backend/pkg/router/router.go | 11 +++++++++++ 3 files changed, 14 insertions(+) diff --git a/occupi-backend/go.mod b/occupi-backend/go.mod index 9434acc9..5a11ba97 100644 --- a/occupi-backend/go.mod +++ b/occupi-backend/go.mod @@ -25,6 +25,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 3dbdeb35..0a186adf 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= diff --git a/occupi-backend/pkg/router/router.go b/occupi-backend/pkg/router/router.go index f522cd42..56d8ce95 100644 --- a/occupi-backend/pkg/router/router.go +++ b/occupi-backend/pkg/router/router.go @@ -2,11 +2,13 @@ package router import ( "encoding/gob" + "time" "github.com/COS301-SE-2024/occupi/occupi-backend/pkg/authenticator" "github.com/COS301-SE-2024/occupi/occupi-backend/pkg/handlers" "github.com/COS301-SE-2024/occupi/occupi-backend/pkg/middleware" "github.com/COS301-SE-2024/occupi/occupi-backend/pkg/models" + "github.com/gin-contrib/cors" "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" @@ -34,6 +36,15 @@ func OccupiRouter(router *gin.Engine, db *mongo.Client) { router.Static("/app/dashboard", "./web/dashboard") router.Static("/documentation", "./web/documentation") + router.Use(cors.New(cors.Config{ + AllowOrigins: []string{"http://localhost:5173", "http://192.168.137.1:19000"}, + AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, + AllowHeaders: []string{"Origin", "Content-Type", "Accept", "Authorization"}, + ExposeHeaders: []string{"Content-Length"}, + AllowCredentials: true, + MaxAge: 12 * time.Hour, + })) + ping := router.Group("/ping") { ping.GET("", func(ctx *gin.Context) { ctx.JSON(200, gin.H{"message": "pong -> I am alive and kicking"}) }) From 03f394e9cbfe11237f1cfdcee6aa1ca9a7d8841e Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 3 Jun 2024 03:06:42 +0200 Subject: [PATCH 05/29] Bookings --- .../screens/Dashboard/Bookings.tsx | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx b/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx index dd833df0..d39455fc 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx @@ -1,11 +1,14 @@ import React, { useEffect, useState } from 'react'; -import { StatusBar, useColorScheme, ScrollView } from 'react-native'; +import { StatusBar, useColorScheme, ScrollView, Alert } from 'react-native'; import { StyleSheet, Text, View, Image, Card, + Toast, + useToast, + ToastTitle, Button, ButtonText, Icon, @@ -21,6 +24,9 @@ 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'); @@ -33,6 +39,35 @@ const Bookings = () => { const notAvailableButtonBackgroundColor = isDarkMode ? '#3A3A3C' : 'lightgrey'; const fullyBookedButtonBackgroundColor = isDarkMode ? '#7F1D1D' : 'orangered'; + const handleBooking = (roomName : string) => { + 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 ( <> @@ -53,7 +88,11 @@ const Bookings = () => { Closes at: 7pm - + {isBooked ? ( + + ) : ( + + )} @@ -81,7 +120,7 @@ const Bookings = () => { Closes at: 6pm - + From 71784a6fa58bea0b78f6a5c656adc5163166656e Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 3 Jun 2024 03:06:53 +0200 Subject: [PATCH 06/29] Checkin --- frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx index 93adf1ec..cc61f474 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx @@ -35,7 +35,7 @@ const Dashboard = () => { render: ({ id }) => { return ( - Travel safe + Travel safe. Have a lovely day further! ); }, @@ -86,9 +86,9 @@ const Dashboard = () => { Office analytics {/* */} {checkedIn ? ( - + ) : ( - + )} Date: Mon, 3 Jun 2024 03:07:42 +0200 Subject: [PATCH 07/29] otp verification flow --- frontend/occupi-mobile3/screens/Login/OtpVerification.tsx | 2 +- frontend/occupi-mobile3/screens/Login/SignIn.tsx | 2 +- frontend/occupi-mobile3/screens/Login/SignUp.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx index 44340202..04eac198 100644 --- a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx +++ b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx @@ -42,7 +42,7 @@ const OTPSchema = z.object({ type OTPSchemaType = z.infer; const OTPVerification = () => { - const [email, setemail] = useState('kamo@gmail.com'); + const [email, setemail] = useState('sabrina@deloitte.co.za'); const [otp, setOtp] = useState(''); // const [otpSent, setOtpSent] = useState(false); diff --git a/frontend/occupi-mobile3/screens/Login/SignIn.tsx b/frontend/occupi-mobile3/screens/Login/SignIn.tsx index e44e5118..8d285b12 100644 --- a/frontend/occupi-mobile3/screens/Login/SignIn.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignIn.tsx @@ -97,7 +97,7 @@ const SignInForm = () => { setLoading(true) setTimeout(() => { setLoading(false); - if (_data.email !== 'tester@deloitte.co.za' || _data.password !== 'Test@1234') { + if (_data.email !== 'sabrina@deloitte.co.za' || _data.password !== 'Test@1234') { toast.show({ placement: 'top', render: ({ id }) => { diff --git a/frontend/occupi-mobile3/screens/Login/SignUp.tsx b/frontend/occupi-mobile3/screens/Login/SignUp.tsx index 99a89e27..1541a8b0 100644 --- a/frontend/occupi-mobile3/screens/Login/SignUp.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignUp.tsx @@ -134,7 +134,7 @@ const SignUpForm = () => { setLoading(true) setTimeout(() => { setLoading(false); - if (_data.email !== 'tester@deloitte.co.za') { + if (_data.email !== 'sabrina@deloitte.co.za') { toast.show({ placement: 'top', render: ({ id }) => { From 5a414057ae46fd8a2786135b3153a1790ed3d84c Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 3 Jun 2024 03:08:26 +0200 Subject: [PATCH 08/29] profile editing ux additions --- frontend/occupi-mobile3/screens/Profile/Profile.tsx | 12 ++++++------ frontend/occupi-mobile3/screens/Profile/Settings.tsx | 10 ++++++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Profile/Profile.tsx b/frontend/occupi-mobile3/screens/Profile/Profile.tsx index b268df75..5e7e9b97 100644 --- a/frontend/occupi-mobile3/screens/Profile/Profile.tsx +++ b/frontend/occupi-mobile3/screens/Profile/Profile.tsx @@ -87,7 +87,7 @@ const Profile = () => { Full name { Non-Binary */} setSelectedGenderIndex(index)}> - + {/* */} Male @@ -135,14 +135,14 @@ const Profile = () => { - + {/* */} Email Address { Employee ID { Number { const [notificationsEnabled, setNotificationsEnabled] = useState(true); + const [name, setName] = useState("Sabrina Carpenter") // const { colorMode, toggleColorMode } = useColorMode(); const navigation = useNavigation(); let colorScheme = useColorScheme(); // console.log(colorScheme); + const handleNameChange = () => { + setName("Sabrina Palmer"); + router.push('/profile'); + }; + const toggleNotifications = () => { setNotificationsEnabled(!notificationsEnabled); }; @@ -63,7 +69,7 @@ const Settings = () => { }; const data = [ - { title: 'My account', description: 'Make changes to your account', iconName: 'user', onPress: () => handleNavigate('profile') }, + { 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') }, @@ -107,7 +113,7 @@ const Settings = () => { - Sabrina Carpenter + {name} {/* handleNavigate('EditProfileScreen')} /> */} Chief Executive Officer From 94347a09b9d553c4730e1a588bc9748a1efa5b24 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 3 Jun 2024 03:08:39 +0200 Subject: [PATCH 09/29] Minor welcome page fix --- .../screens/Login/SplashScreen.tsx | 2 +- .../occupi-mobile3/screens/Login/Welcome.tsx | 80 +++++++++---------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index d4391b16..df226444 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -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('/onboarding1'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount diff --git a/frontend/occupi-mobile3/screens/Login/Welcome.tsx b/frontend/occupi-mobile3/screens/Login/Welcome.tsx index 1f42006c..23f222c2 100644 --- a/frontend/occupi-mobile3/screens/Login/Welcome.tsx +++ b/frontend/occupi-mobile3/screens/Login/Welcome.tsx @@ -25,48 +25,48 @@ const GradientButton = ({ onPress, 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(); + // 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]); + // // 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 spin = spinValue.interpolate({ + // inputRange: [0, 1], + // outputRange: ['0deg', '360deg'], + // }); - const animatedStyle = { - transform: [{ rotate: spin }, { scale: scaleValue }], - }; + // const animatedStyle = { + // transform: [{ rotate: spin }, { scale: scaleValue }], + // }; const Welcome = () => { @@ -77,7 +77,7 @@ const Welcome = () => { alt="logo" source={require('../../screens/Login/assets/images/Occupi/logo-white.png')} style={{ width: 200, height: 200 }} - style={[styles.logo, animatedStyle]} + // style={[styles.logo, animatedStyle]} mb="$12" mt="$12" /> From 274187ecf2158206a540692358d13824971ce336 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 3 Jun 2024 10:48:18 +0200 Subject: [PATCH 10/29] dashboarc and profile0 --- .../occupi-mobile3/screens/Dashboard/Dashboard.tsx | 11 ++++++----- frontend/occupi-mobile3/screens/Profile/Profile.tsx | 10 +++++----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx index cc61f474..c638e0c4 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx @@ -28,25 +28,26 @@ const Dashboard = () => { }, [colorScheme]); const checkIn = () => { - setCheckedIn(!checkedIn); if (checkedIn === false) { + setCheckedIn(true); toast.show({ placement: 'top', render: ({ id }) => { return ( - Travel safe. Have a lovely day further! + Check in successful. Have a productive day! ); }, }); } else { + setCheckedIn(false); toast.show({ placement: 'top', render: ({ id }) => { return ( - Check in successful. Have a productive day! + Travel safe. Have a lovely day further! ); }, @@ -86,9 +87,9 @@ const Dashboard = () => { Office analytics {/* */} {checkedIn ? ( - + ) : ( - + )} { // 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 [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); @@ -116,7 +116,7 @@ const Profile = () => { Non-Binary */} setSelectedGenderIndex(index)}> - {/* */} + Male @@ -135,7 +135,7 @@ const Profile = () => { - {/* */} + From 13d78936d262674d800c8bfd3e123578381c89ae Mon Sep 17 00:00:00 2001 From: Michael-u21546551 Date: Mon, 3 Jun 2024 11:28:57 +0200 Subject: [PATCH 11/29] Create lint-test-mobile.yml --- .github/workflows/lint-test-mobile.yml | 52 ++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/lint-test-mobile.yml diff --git a/.github/workflows/lint-test-mobile.yml b/.github/workflows/lint-test-mobile.yml new file mode 100644 index 00000000..a30a8e95 --- /dev/null +++ b/.github/workflows/lint-test-mobile.yml @@ -0,0 +1,52 @@ +name: Lint and Test Mobile + +on: + pull_request: + branches: + - develop + paths: [ + "frontend/occupi-mobile/**" + ] + + workflow_dispatch: + +defaults: + run: + working-directory: frontend/occupi-mobile + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Install Dependencies + run: npm install + + - name: Lint Code + run: npm run lint + + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Install Dependencies + run: npm install + + - name: Run Tests + run: npm test From c37b60f4b911ac97107719b37e926221be7379dd Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 3 Jun 2024 12:34:21 +0200 Subject: [PATCH 12/29] chore: Remove lint-test-mobile workflow --- .github/workflows/lint-test-mobile.yml | 52 -------------------------- 1 file changed, 52 deletions(-) delete mode 100644 .github/workflows/lint-test-mobile.yml diff --git a/.github/workflows/lint-test-mobile.yml b/.github/workflows/lint-test-mobile.yml deleted file mode 100644 index a30a8e95..00000000 --- a/.github/workflows/lint-test-mobile.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Lint and Test Mobile - -on: - pull_request: - branches: - - develop - paths: [ - "frontend/occupi-mobile/**" - ] - - workflow_dispatch: - -defaults: - run: - working-directory: frontend/occupi-mobile - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 18 - - - name: Install Dependencies - run: npm install - - - name: Lint Code - run: npm run lint - - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 18 - - - name: Install Dependencies - run: npm install - - - name: Run Tests - run: npm test From 5e196bc30cc6758cfb28f2d0059cb8f653dc758c Mon Sep 17 00:00:00 2001 From: cmokou Date: Wed, 5 Jun 2024 11:30:56 +0200 Subject: [PATCH 13/29] chore: Add OTPVerification screen to RootLayout and update app.json and package.json --- frontend/occupi-mobile3/app.json | 13 +- frontend/occupi-mobile3/app/_layout.tsx | 1 + frontend/occupi-mobile3/bun.lockb | Bin 0 -> 766007 bytes frontend/occupi-mobile3/components/NavBar.tsx | 50 +-- frontend/occupi-mobile3/package.json | 4 +- .../screens/Dashboard/Bookings.tsx | 252 ++++++------- .../screens/Dashboard/Dashboard.tsx | 182 +++++----- .../screens/Login/CreatePassword.tsx | 62 ++-- .../screens/Login/ForgotPassword.tsx | 37 +- .../screens/Login/Onboarding1.tsx | 133 ++++--- .../screens/Login/Onboarding2.tsx | 133 ++++--- .../screens/Login/Onboarding3.tsx | 133 ++++--- .../screens/Login/OtpVerification.tsx | 254 ++++++-------- .../occupi-mobile3/screens/Login/SignIn.tsx | 330 ++++++++++-------- .../occupi-mobile3/screens/Login/SignUp.tsx | 38 +- .../screens/Login/SplashScreen.tsx | 15 +- .../occupi-mobile3/screens/Login/Welcome.tsx | 186 +++++----- .../screens/Profile/Profile.tsx | 179 +++++----- .../screens/Profile/Settings.tsx | 161 ++++----- 19 files changed, 1128 insertions(+), 1035 deletions(-) create mode 100644 frontend/occupi-mobile3/bun.lockb 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..e61d0ca6 100644 --- a/frontend/occupi-mobile3/app/_layout.tsx +++ b/frontend/occupi-mobile3/app/_layout.tsx @@ -46,6 +46,7 @@ export default function RootLayout() { + ); diff --git a/frontend/occupi-mobile3/bun.lockb b/frontend/occupi-mobile3/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..cc87f171b038c00952cf8e90ca771239c485c341 GIT binary patch literal 766007 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 eFXaR<)?Xr!C}v$ENB}a(j2Z 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

a^RP57ldW~_Gaqq_OJe{-SZER9!i?~1Lb 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 { 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/package.json b/frontend/occupi-mobile3/package.json index d9e664ef..fbb8d141 100644 --- a/frontend/occupi-mobile3/package.json +++ b/frontend/occupi-mobile3/package.json @@ -34,12 +34,13 @@ "@testing-library/react-native": "^12.5.1", "@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-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-random": "^14.0.1", "expo-router": "~3.5.14", @@ -64,6 +65,7 @@ "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", diff --git a/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx b/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx index d39455fc..0c31427d 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Bookings.tsx @@ -1,23 +1,19 @@ import React, { useEffect, useState } from 'react'; -import { StatusBar, useColorScheme, ScrollView, Alert } 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'; @@ -27,7 +23,6 @@ const Bookings = () => { const [isBooked, setisBooked] = useState(false); const toast = useToast(); - useEffect(() => { setIsDarkMode(colorScheme === 'dark'); }, [colorScheme]); @@ -35,136 +30,75 @@ 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 : string) => { + 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. - - ); - }, - }); - } - } - ] + "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. - - - - - Closes at: 7pm - {isBooked ? ( - - ) : ( - - )} - - - - - - - Conference Room - 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 - - - - - - - - Meeting Room 2 - 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: 6pm - - - - - - - - Conference Room - Boasting sunset views, long desk and a large TV. + + Closes at: {room.closesAt} + - - - - Closes at: 6pm - - - - - - - Conference Room - Boasting sunset views, long desk and a large TV. - - - - - Closes at: 6pm - - - + ))} @@ -172,4 +106,76 @@ const Bookings = () => { ); }; -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 c638e0c4..16a50afc 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx @@ -1,106 +1,106 @@ import React, { useEffect, useState } from 'react'; import { StatusBar, useColorScheme } from 'react-native'; -import Navbar from "../../components/NavBar"; +import Navbar from '../../components/NavBar'; import { - StyleSheet, - Text, - View, - Image, - Card, - Toast, - useToast, - ToastTitle, - Button, - ButtonText, - Icon, - ArrowRightIcon + 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 [checkedIn, setCheckedIn] = useState(false); - const toast = useToast(); + 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 checkIn = () => { - if (checkedIn === false) { - setCheckedIn(true); - toast.show({ - placement: 'top', - render: ({ id }) => { - return ( - - Check in successful. Have a productive day! - - ); - }, - }); - } else { - setCheckedIn(false); - toast.show({ - placement: 'top', - render: ({ id }) => { - return ( - - Travel safe. Have a lovely day further! - - ); - }, - }); - } - + 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! + + ), + }); } + }; - const backgroundColor = isDarkMode ? '#1C1C1E' : 'white'; - const textColor = isDarkMode ? 'white' : 'black'; - const cardBackgroundColor = isDarkMode ? '#2C2C2E' : '#F3F3F3'; + 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 - + 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/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 04eac198..d53aef0b 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, Text, StyleSheet, Alert } from 'react-native'; +import { VStack, Box, HStack, Image, FormControl, Input, Button, Heading } 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 } 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 '../Login/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'), @@ -41,51 +21,52 @@ const OTPSchema = z.object({ type OTPSchemaType = z.infer; -const OTPVerification = () => { - const [email, setemail] = useState('sabrina@deloitte.co.za'); - - const [otp, setOtp] = useState(''); - // const [otpSent, setOtpSent] = useState(false); +const OTPVerification = ({ route }) => { + const { email } = route?.params || {}; const [remainingTime, setRemainingTime] = useState(60); // 1 minute - + const [otpSent, setOtpSent] = useState(false); const timerRef = useRef(null); + const router = useRouter(); 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]); + }, [remainingTime, otpSent]); const generateOtp = async (): Promise => { - const randomBytes = await Random.getRandomBytesAsync(3); + const randomBytes = await Random.getRandomBytesAsync(6); 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 - }); + const sendOtp = async () => { + const generatedOtp = await generateOtp(); + setRemainingTime(60); + setOtpSent(true); + + await SecureStore.setItemAsync('user_otp', generatedOtp); + + // Send the OTP via email (example using Expo MailComposer) + const isAvailable = await MailComposer.isAvailableAsync(); + if (isAvailable) { + await MailComposer.composeAsync({ + recipients: [email], + subject: 'Your OTP Code', + body: `Your OTP code is ${generatedOtp}`, + }); + } else { + Alert.alert('MailComposer is not available'); + } }; const { @@ -115,12 +96,9 @@ const OTPVerification = () => { ]; const [inputFocus, setInputFocus] = useState(-1); - const [validationError, setValidationError] = useState(null); // State to hold validation error message - - const toast = useToast(); + const [validationError, setValidationError] = useState(null); const onSubmit = async (_data: OTPSchemaType) => { - console.log('here'); const pinValues = refList.map((ref) => ref?.current?.value); const pin = pinValues.join(''); const Count = otpInput.filter((value) => value !== '').length; @@ -129,31 +107,28 @@ const OTPVerification = () => { return; } setValidationError(null); - console.log('here'); - toast.show({ - placement: 'top', - render: ({ id }) => ( - - Signup successful - - ), - }); - reset(); - console.log('here'); - router.push('/login'); + const storedOtp = await SecureStore.getItemAsync('user_otp'); + if (pin === storedOtp) { + Alert.alert('Signup successful'); + reset(); + router.push('/login'); + } else { + Alert.alert('Invalid OTP'); + } }; - // const handleverify = async () => { - // router.push('/home'); - // } + useEffect(() => { + // Automatically send OTP when component mounts + sendOtp(); + }, []); const GradientButton = ({ onPress, text }) => ( @@ -161,23 +136,6 @@ 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 ( @@ -202,7 +160,7 @@ const OTPVerification = () => { py="$8" px="$4" flex={1} - maxWidth={508} + maxWidth={wp('90%')} > @@ -219,22 +177,15 @@ const OTPVerification = () => { {validationError} )} - {/* - - */} - - - - - {errors?.OTP?.message} - - + {errors?.OTP && ( + + {errors.OTP.message} + + )} {remainingTime} seconds remaining - + +
@@ -264,15 +215,14 @@ function PinInput({ ml="$2" key={index} variant="outline" - w={50} - h={50} + w={wp('12%')} + h={hp('6%')} mt="$5" backgroundColor="#f2f2f2" borderColor="#f2f2f2" borderRadius="$2xl" > - { @@ -313,6 +262,10 @@ function PinInput({ } function MainText({ email }: { email: string }) { + if (!email) { + return Email is missing; + } + const obfuscatedEmail = email.replace(/(.{2})(.*)(?=@)/, (gp1, gp2, gp3) => { for (let i = 0; i < gp3.length; i++) { @@ -323,14 +276,14 @@ function MainText({ email }: { email: string }) { return ( - occupi + occupi We sent you an email code @@ -347,7 +300,7 @@ function MainText({ email }: { email: string }) { color: '$textDark400', }, }} - fontSize="$20" + fontSize={wp('5%')} fontWeight="$light" > We have sent the OTP code to @@ -359,10 +312,10 @@ function MainText({ email }: { email: string }) { color: '$textDark400', }, }} - fontSize="$20" - fontWeight="$light" + fontSize={wp('5%')} + fontWeight="$light" > - {' ' + email} + {' ' + obfuscatedEmail} @@ -391,42 +344,33 @@ function AccountLink() { color: '$textDark400', }, }} - fontSize="$sm" + fontSize={wp('4%')} > Already have an account? - - + + Login - + ); } -// interface ResendLinkProps { -// sendOtp: () => void; -// } - -// function ResendLink({ sendOtp }: ResendLinkProps) { -// return ( -// -// -// Didn't receive the OTP? -// -// -// Resend OTP -// -// -// ); -// } +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%'), + }, +}); export default OTPVerification; diff --git a/frontend/occupi-mobile3/screens/Login/SignIn.tsx b/frontend/occupi-mobile3/screens/Login/SignIn.tsx index 8d285b12..5dfd2c4b 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 } 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 @@ -90,63 +75,110 @@ const SignInForm = () => { }); 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) => { - setLoading(true) - setTimeout(() => { - setLoading(false); - if (_data.email !== 'sabrina@deloitte.co.za' || _data.password !== 'Test@1234') { - toast.show({ - placement: 'top', - render: ({ id }) => { - return ( - - Invalid credentials - - ); - }, - }); - reset(); + 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 ( - - Login successful + + Biometric authentication failed + {result.error && {result.error.message}} ); }, }); - reset(); - router.push('/home') } - }, 3000); - - // try { - // const response = await fetch('https://192.168.137.1:8080/auth/register', { - // method: 'POST', - // headers: { - // 'Content-Type': 'application/json' - // }, - // body: JSON.stringify({ - // email: "example", - // password: "12345" - // }) - // }); - - // const data = await response.json(); + } 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 + + ); + }, + }); + } + }; - // if (response.ok) { - // Alert.alert('Success', 'User registered successfully!'); - // } else { - // Alert.alert('Error', data.message || 'Something went wrong!'); - // } - // } catch (error) { - // Alert.alert('Error', error.message); - // } + const onSubmit = (_data: SignInSchemaType) => { + setLoading(true); + setTimeout(() => { + setLoading(false); + if (_data.email !== 'sabrina@deloitte.co.za' || _data.password !== 'Test@1234') { + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Invalid credentials + + ); + }, + }); + reset(); + } else { + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + Login successful + + ); + }, + }); + reset(); + router.push('/home'); + } + }, 3000); }; const handleKeyPress = () => { @@ -154,12 +186,8 @@ const SignInForm = () => { handleSubmit(onSubmit)(); }; - const [showPassword, setShowPassword] = useState(false); - const handleState = () => { - setShowPassword((showState) => { - return !showState; - }); + setShowPassword((showState) => !showState); }; const GradientButton = ({ onPress, text }) => ( @@ -179,21 +207,31 @@ 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" /> - - )} - /> @@ -242,8 +277,8 @@ const SignInForm = () => { - - + + Password { rules={{ validate: async (value) => { try { - await signInSchema.parseAsync({ - password: value, - }); + await signInSchema.parseAsync({ password: value }); return true; } catch (error: any) { return error.message; @@ -263,7 +296,7 @@ const SignInForm = () => { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { {errors?.password?.message} - - { - Remember me + Remember me )} /> @@ -341,71 +372,67 @@ const SignInForm = () => { 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 + + + ); }; @@ -414,7 +441,6 @@ const SignIn = () => { <>
- ); }; diff --git a/frontend/occupi-mobile3/screens/Login/SignUp.tsx b/frontend/occupi-mobile3/screens/Login/SignUp.tsx index 1541a8b0..e24e5f93 100644 --- a/frontend/occupi-mobile3/screens/Login/SignUp.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignUp.tsx @@ -49,12 +49,13 @@ 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%'), }, }, }); @@ -109,8 +110,6 @@ function SideContainerWeb() { ); } - - const SignUpForm = () => { const { control, @@ -235,16 +234,16 @@ 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%'), } }); @@ -273,10 +272,10 @@ const SignUpForm = () => { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { }, }} render={({ field: { onChange, onBlur, value } }) => ( - + { Terms of Use {' '} - {/* &{' '} */} @@ -559,7 +557,7 @@ function SignUpFormComponent() { Register for Occupi. Predict. Plan. Perfect. diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index df226444..7553c6a1 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -10,6 +10,7 @@ import { import { styled } from '@gluestack-style/react'; import { ViewPager } from '@ui-kitten/components'; 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/Profile/Profile.tsx b/frontend/occupi-mobile3/screens/Profile/Profile.tsx index e3965885..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("sabrina@deloitte.co.za"); - const [employeeId, setEmployeeId] = useState("31115087"); - const [phoneNumber, setPhoneNumber] = useState("082 083 3988"); - 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 + { style={colorScheme === 'dark' ? styles.inputdark : styles.inputlight} placeholder={name} placeholderTextColor={COLORS.gray} - placeholder={name} onChangeText={setName} /> Date of birth - - {date.toLocaleDateString()} + + + {date.toLocaleDateString()} + { /> Gender - {/* setSelectedGenderIndex(index)} - style={styles.radioGroup} - > - Male - Female - Non-Binary - */} setSelectedGenderIndex(index)}> - - + + Male - + Female - + Other @@ -138,13 +170,11 @@ const Profile = () => { - Email Address @@ -153,7 +183,6 @@ const Profile = () => { style={colorScheme === 'dark' ? styles.inputdark : styles.inputlight} placeholder={employeeId} placeholderTextColor={COLORS.gray} - // placeholder={employeeId} onChangeText={setEmployeeId} /> @@ -162,7 +191,6 @@ const Profile = () => { style={colorScheme === 'dark' ? styles.inputdark : styles.inputlight} placeholder={phoneNumber} placeholderTextColor={COLORS.gray} - // placeholder={phoneNumber} onChangeText={setPhoneNumber} /> @@ -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 3ec2d0b2..cafc0eff 100644 --- a/frontend/occupi-mobile3/screens/Profile/Settings.tsx +++ b/frontend/occupi-mobile3/screens/Profile/Settings.tsx @@ -10,25 +10,24 @@ 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 [name, setName] = useState("Sabrina Carpenter") - // const { colorMode, toggleColorMode } = useColorMode(); + const [name, setName] = useState('Sabrina Carpenter'); const navigation = useNavigation(); let colorScheme = useColorScheme(); - // console.log(colorScheme); const handleNameChange = () => { - setName("Sabrina Palmer"); + setName('Sabrina Palmer'); router.push('/profile'); }; @@ -38,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: () => handleNameChange()}, - { 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') }, @@ -82,7 +84,10 @@ const Settings = () => { ]; const renderListItem = ({ item }) => ( - + @@ -98,50 +103,48 @@ const Settings = () => { ); - - return ( <> - - -
- - -
- - - {name} - {/* 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', @@ -155,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', @@ -182,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', @@ -229,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', }, }); From a112ad68e4af7a39a650ecfc078a504e6e789b15 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Wed, 5 Jun 2024 11:38:37 +0200 Subject: [PATCH 14/29] chore: Update Babel configuration for mobile app --- .../__tests__/Dashboard_Test/Bookings.test.js | 32 -- .../Dashboard_Test/Dashboard.test.js | 30 -- .../Login_Test/CreatePassword.test.js | 116 ---- .../Login_Test/ForgotPassword.test.js | 67 --- .../__tests__/Login_Test/Onboarding1.test.js | 33 -- .../__tests__/Login_Test/Onboarding2.test.js | 33 -- .../__tests__/Login_Test/Onboarding3.test.js | 33 -- .../Login_Test/OtpVerification.test.js | 65 --- .../__tests__/Login_Test/SignIn.test.js | 69 --- .../__tests__/Login_Test/SignUp.test.js | 94 ---- .../__tests__/Login_Test/SplashScreen.test.js | 26 - .../__tests__/Login_Test/Welcome.test.js | 63 --- .../__tests__/Profile_Test/Profile.test.js | 88 --- .../__tests__/Profile_Test/Settings.test.js | 103 ---- frontend/occupi-mobile3/babel.config.js | 8 +- frontend/occupi-mobile3/jest.setup.js | 1 + frontend/occupi-mobile3/package-lock.json | 507 +++++++++--------- frontend/occupi-mobile3/package.json | 14 +- .../Dashboard/__tests__/Bookings.test.tsx | 64 +++ .../occupi-mobile3/screens/Login/SignUp.tsx | 104 ++-- .../screens/Login/SplashScreen.tsx | 3 +- 21 files changed, 400 insertions(+), 1153 deletions(-) delete mode 100644 frontend/occupi-mobile3/__tests__/Dashboard_Test/Bookings.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Dashboard_Test/Dashboard.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/CreatePassword.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/ForgotPassword.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/Onboarding1.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/Onboarding2.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/Onboarding3.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/OtpVerification.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/SignIn.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/SignUp.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/SplashScreen.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Login_Test/Welcome.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Profile_Test/Profile.test.js delete mode 100644 frontend/occupi-mobile3/__tests__/Profile_Test/Settings.test.js create mode 100644 frontend/occupi-mobile3/jest.setup.js create mode 100644 frontend/occupi-mobile3/screens/Dashboard/__tests__/Bookings.test.tsx 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 8c5eb846..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 '../'; -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 c8d16aa5..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 '../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 b469e442..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/CreatePassword.test.js +++ /dev/null @@ -1,116 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import { useToast } from '@gluestack-ui/themed'; -import { useForm } from 'react-hook-form'; -import CreatePassword from '../CreatePassword'; - -jest.mock('react-hook-form', () => ({ - ...jest.requireActual('react-hook-form'), - useForm: jest.fn(), -})); - -jest.mock('@gluestack-ui/themed', () => ({ - useToast: jest.fn(), -})); - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), -})); - -describe('CreatePassword', () => { - let control; - let handleSubmit; - let reset; - let formState; - - beforeEach(() => { - control = jest.fn(); - handleSubmit = jest.fn(); - reset = jest.fn(); - formState = { errors: {} }; - - (useForm as jest.Mock).mockReturnValue({ - control, - handleSubmit, - reset, - formState, - }); - }); - - it('renders correctly', () => { - const { getByPlaceholderText } = render(); - expect(getByPlaceholderText('Password')).toBeTruthy(); - expect(getByPlaceholderText('Confirm Password')).toBeTruthy(); - }); - - it('shows error message if passwords do not match', async () => { - const mockToast = { show: jest.fn() }; - (useToast as jest.Mock).mockReturnValue(mockToast); - - const { getByPlaceholderText, getByText } = render(); - const passwordInput = getByPlaceholderText('Password'); - const confirmPasswordInput = getByPlaceholderText('Confirm Password'); - const submitButton = getByText('Update Password'); - - fireEvent.changeText(passwordInput, 'Password1!'); - fireEvent.changeText(confirmPasswordInput, 'Password2!'); - fireEvent.press(submitButton); - - 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 if passwords match', async () => { - const mockToast = { show: jest.fn() }; - const mockRouter = require('expo-router').useRouter(); - (useToast as jest.Mock).mockReturnValue(mockToast); - - const { getByPlaceholderText, getByText } = render(); - const passwordInput = getByPlaceholderText('Password'); - const confirmPasswordInput = getByPlaceholderText('Confirm Password'); - const submitButton = getByText('Update Password'); - - fireEvent.changeText(passwordInput, 'Password1!'); - fireEvent.changeText(confirmPasswordInput, 'Password1!'); - fireEvent.press(submitButton); - - await waitFor(() => { - expect(mockToast.show).toHaveBeenCalledWith( - expect.objectContaining({ - render: expect.any(Function), - }) - ); - expect(mockRouter.replace).toHaveBeenCalledWith('/'); - }); - - const toastRender = mockToast.show.mock.calls[0][0].render; - const toastComponent = toastRender({ id: 'mockId' }); - const toastText = render(toastComponent).getByText('Password updated successfully'); - expect(toastText).toBeTruthy(); - }); - - it('toggles password visibility', () => { - const { getByPlaceholderText, getByTestId } = render(); - const passwordInput = getByPlaceholderText('Password'); - const toggleButton = getByTestId('toggle-password-visibility'); - - fireEvent.press(toggleButton); - expect(passwordInput.props.secureTextEntry).toBe(false); - - fireEvent.press(toggleButton); - expect(passwordInput.props.secureTextEntry).toBe(true); - }); -}); \ No newline at end of file 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 747ff264..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/ForgotPassword.test.js +++ /dev/null @@ -1,67 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import ForgotPassword from '../ForgotPassword'; // Adjust the import path accordingly -import { useToast } from '@gluestack-ui/themed'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -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 as jest.Mock).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 7d70371e..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding1.test.js +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Onboarding1 from './Onboarding1'; - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), -})); - -describe('Onboarding1', () => { - 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('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 push = require('expo-router').useRouter().push; - const { getByText } = render(); - const button = getByText('Next'); - - fireEvent.press(button); - expect(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 572d7c0f..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding2.test.js +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Onboarding2 from './Onboarding2'; - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), -})); - -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 push = require('expo-router').useRouter().push; - const { getByText } = render(); - const button = getByText('Next'); - - fireEvent.press(button); - expect(push).toHaveBeenCalledWith('/onboarding3'); - }); -}); \ No newline at end of file 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 ce8286b0..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/Onboarding3.test.js +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; -import { render, fireEvent } from '@testing-library/react-native'; -import Onboarding3 from './Onboarding3'; - -jest.mock('expo-router', () => ({ - useRouter: () => ({ - replace: jest.fn(), - push: jest.fn(), - }), -})); - -describe('Onboarding3', () => { - 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('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 push = require('expo-router').useRouter().push; - const { getByText } = render(); - const button = getByText('Next'); - - fireEvent.press(button); - expect(push).toHaveBeenCalledWith('/welcome'); - }); -}); \ No newline at end of file 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 641e26d8..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/OtpVerification.test.js +++ /dev/null @@ -1,65 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import OTPVerification from '../OTPVerification'; // Adjust the import path accordingly -import { useToast } from '@gluestack-ui/themed'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -jest.mock('@gluestack-ui/themed', () => ({ - useToast: jest.fn(), -})); - -describe('OTPVerification Component', () => { - it('renders correctly', () => { - const { getByText, getByPlaceholderText } = render(); - - expect(getByText('We sent you an email code')).toBeTruthy(); - expect(getByText('Verify')).toBeTruthy(); - }); - - it('shows error message when OTP is less than 6 characters', async () => { - const { getByText, getByPlaceholderText } = render(); - - const otpInput = getByPlaceholderText('OTP'); - const verifyButton = getByText('Verify'); - - fireEvent.changeText(otpInput, '12345'); - fireEvent.press(verifyButton); - - await waitFor(() => { - expect(getByText('OTP must be at least 6 characters in length')).toBeTruthy(); - }); - }); - - it('shows success message and navigates to home screen on valid OTP', async () => { - const mockToast = { show: jest.fn() }; - (useToast as jest.Mock).mockReturnValue(mockToast); - - const { getByText, getByPlaceholderText } = render(); - - const otpInput = getByPlaceholderText('OTP'); - const verifyButton = getByText('Verify'); - - fireEvent.changeText(otpInput, '123456'); - fireEvent.press(verifyButton); - - 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('OTP sent successfully'); - expect(toastText).toBeTruthy(); - }); -}); 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 1d4adb7a..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/SignIn.test.js +++ /dev/null @@ -1,69 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import SignIn from '../SignIn'; // Adjust the import path accordingly -import { useToast } from '@gluestack-ui/themed'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - }, -})); - -jest.mock('@gluestack-ui/themed', () => ({ - useToast: jest.fn(), -})); - -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 as jest.Mock).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 6196f48c..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/SignUp.test.js +++ /dev/null @@ -1,94 +0,0 @@ -import React from 'react'; -import { render, fireEvent, waitFor } from '@testing-library/react-native'; -import SignUp from '../SignUp'; // Adjust the import path accordingly -import { useToast } from '@gluestack-ui/themed'; -import { router } from 'expo-router'; - -jest.mock('expo-router', () => ({ - router: { - push: jest.fn(), - replace: jest.fn(), - }, -})); - -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 as jest.Mock).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 as jest.Mock).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 289472f1..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 '../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 2 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 f056078d..00000000 --- a/frontend/occupi-mobile3/__tests__/Login_Test/Welcome.test.js +++ /dev/null @@ -1,63 +0,0 @@ -// import React from 'react'; -// import { render, fireEvent } from '@testing-library/react-native'; -// import { LinearGradient } from 'expo-linear-gradient'; -// import Onboarding3, { GradientButton } from '../Onboarding3'; // Adjust the import path accordingly -// import { router } from 'expo-router'; - -// jest.mock('expo-router', () => ({ -// router: { -// push: jest.fn(), -// }, -// })); - -// jest.mock('expo-linear-gradient', () => ({ -// LinearGradient: jest.fn().mockImplementation(({ children }) => children), -// })); - -// describe('Onboarding3 Component', () => { -// it('renders correctly', () => { -// const { getByText, getByAltText } = render(); - -// expect(getByText("Log in. Let's Plan.")).toBeTruthy(); -// expect(getByText('Predict. Plan. Perfect.')).toBeTruthy(); -// expect(getByText('Login')).toBeTruthy(); -// expect(getByText('Register')).toBeTruthy(); -// expect(getByAltText('logo')).toBeTruthy(); -// }); - -// it('navigates to login screen on login button press', () => { -// const { getByText } = render(); - -// const loginButton = getByText('Login'); -// fireEvent.press(loginButton); - -// expect(router.push).toHaveBeenCalledWith('/login'); -// }); - -// it('navigates to signup screen on register text press', () => { -// const { getByText } = render(); - -// const registerText = getByText('Register'); -// fireEvent.press(registerText); - -// expect(router.push).toHaveBeenCalledWith('/signup'); -// }); -// }); - -// describe('GradientButton Component', () => { -// it('renders correctly with given text', () => { -// const { getByText } = render( {}} text="Test Button" />); - -// expect(getByText('Test Button')).toBeTruthy(); -// }); - -// it('calls onPress when pressed', () => { -// const mockOnPress = jest.fn(); -// const { getByText } = render(); - -// const button = getByText('Test Button'); -// fireEvent.press(button); - -// expect(mockOnPress).toHaveBeenCalled(); -// }); -// }); 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 b4a6030b..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 '../Profile'; // Adjust the import path accordingly -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 c8716faf..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 '../path/to/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/babel.config.js b/frontend/occupi-mobile3/babel.config.js index 9d89e131..4f3810d3 100644 --- a/frontend/occupi-mobile3/babel.config.js +++ b/frontend/occupi-mobile3/babel.config.js @@ -1,6 +1,10 @@ module.exports = function (api) { api.cache(true); return { - presets: ['babel-preset-expo'], - }; + "presets": [ + '@babel/preset-env', + '@babel/preset-react', + '@babel/preset-flow', + ] + } }; 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 6557f3ca..333460f2 100644 --- a/frontend/occupi-mobile3/package-lock.json +++ b/frontend/occupi-mobile3/package-lock.json @@ -70,10 +70,15 @@ }, "devDependencies": { "@babel/core": "^7.24.6", + "@babel/preset-env": "^7.24.6", + "@babel/preset-flow": "^7.24.6", + "@babel/preset-react": "^7.24.6", + "@babel/preset-typescript": "^7.24.6", "@types/jest": "^29.5.4", "@types/react": "~18.2.79", "@types/react-test-renderer": "^18.0.1", - "jest": "^29.2.1", + "babel-jest": "^29.7.0", + "jest": "^29.7.0", "jest-expo": "~51.0.2", "metro": "^0.80.9", "react-test-renderer": "18.2.0", @@ -85,6 +90,7 @@ "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, "engines": { "node": ">=10" }, @@ -182,7 +188,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/types": "^7.24.6" }, @@ -491,7 +497,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -507,7 +513,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -522,7 +528,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", @@ -539,7 +545,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -720,7 +726,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==", - "peer": true, + "dev": true, "engines": { "node": ">=6.9.0" }, @@ -743,7 +749,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==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -755,6 +761,7 @@ "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, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -766,7 +773,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -845,7 +852,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -860,7 +867,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -875,6 +882,7 @@ "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, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -886,6 +894,7 @@ "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, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -991,6 +1000,7 @@ "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, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1019,7 +1029,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1049,7 +1059,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", @@ -1083,7 +1093,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1112,7 +1122,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1128,7 +1138,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", @@ -1195,7 +1205,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1211,7 +1221,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1226,7 +1236,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1242,7 +1252,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1288,7 +1298,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" @@ -1320,7 +1330,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1350,7 +1360,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1366,7 +1376,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1381,7 +1391,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1413,7 +1423,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.24.6", "@babel/helper-module-transforms": "^7.24.6", @@ -1431,7 +1441,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1462,7 +1472,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1492,7 +1502,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1525,7 +1535,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/helper-replace-supers": "^7.24.6" @@ -1541,7 +1551,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1619,7 +1629,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1723,7 +1733,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" @@ -1739,7 +1749,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1830,7 +1840,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1862,7 +1872,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.6" }, @@ -1877,7 +1887,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1908,7 +1918,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6" @@ -1924,7 +1934,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/compat-data": "^7.24.6", "@babel/helper-compilation-targets": "^7.24.6", @@ -2035,7 +2045,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==", - "peer": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -2186,7 +2196,7 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "devOptional": true + "dev": true }, "node_modules/@egjs/hammerjs": { "version": "2.0.17", @@ -4802,7 +4812,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==", - "devOptional": true, + "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -4818,7 +4828,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "devOptional": true, + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -4831,7 +4841,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "devOptional": true, + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -4843,7 +4853,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "devOptional": true, + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -4858,7 +4868,7 @@ "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, + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -4870,7 +4880,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -4879,7 +4889,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -4896,7 +4906,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4911,7 +4921,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4927,7 +4937,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4939,13 +4949,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -4954,7 +4964,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4966,7 +4976,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", @@ -5013,7 +5023,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5028,7 +5038,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5044,7 +5054,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5056,13 +5066,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -5071,7 +5081,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5108,7 +5118,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "devOptional": true, + "dev": true, "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" @@ -5121,7 +5131,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "devOptional": true, + "dev": true, "dependencies": { "jest-get-type": "^29.6.3" }, @@ -5149,7 +5159,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -5164,7 +5174,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "devOptional": true, + "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", @@ -5207,7 +5217,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5222,7 +5232,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5238,7 +5248,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5250,13 +5260,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -5265,7 +5275,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5288,7 +5298,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", @@ -5302,7 +5312,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", @@ -5317,7 +5327,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", @@ -5332,7 +5342,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", @@ -5358,7 +5368,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5373,7 +5383,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5389,7 +5399,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5401,13 +5411,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -5416,7 +5426,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5428,7 +5438,7 @@ "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, + "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -9253,7 +9263,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -9266,7 +9276,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==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -9275,7 +9285,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==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -9285,7 +9295,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==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -9310,7 +9320,7 @@ "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "devOptional": true, + "dev": true, "dependencies": { "@types/node": "*" } @@ -9418,16 +9428,6 @@ "@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", @@ -9926,7 +9926,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", @@ -9947,7 +9947,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -9962,7 +9962,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9978,7 +9978,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -9990,13 +9990,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -10005,7 +10005,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -10017,7 +10017,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==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", @@ -10033,7 +10033,7 @@ "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, + "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -10049,7 +10049,7 @@ "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==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", @@ -10113,7 +10113,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==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", @@ -10152,7 +10152,7 @@ "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==", - "devOptional": true, + "dev": true, "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" @@ -10211,6 +10211,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "engines": { "node": ">=8" }, @@ -10556,7 +10557,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -10573,6 +10574,7 @@ "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, "engines": { "node": ">= 6" } @@ -10629,7 +10631,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" } @@ -10646,6 +10648,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -10708,7 +10711,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==", - "devOptional": true + "dev": true }, "node_modules/clean-stack": { "version": "2.2.0", @@ -10797,7 +10800,7 @@ "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "devOptional": true, + "dev": true, "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" @@ -10807,7 +10810,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==", - "devOptional": true + "dev": true }, "node_modules/color": { "version": "4.2.3", @@ -11042,7 +11045,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -11063,7 +11066,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11078,7 +11081,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11094,7 +11097,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11106,13 +11109,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -11121,7 +11124,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -11430,7 +11433,7 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "devOptional": true, + "dev": true, "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -11652,7 +11655,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -11660,7 +11663,8 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -11684,7 +11688,8 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true }, "node_modules/dom-accessibility-api": { "version": "0.5.16", @@ -11808,7 +11813,7 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=12" }, @@ -12159,6 +12164,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12266,7 +12272,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -12275,7 +12281,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -12868,7 +12874,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==", - "devOptional": true + "dev": true }, "node_modules/fast-loops": { "version": "1.1.3", @@ -13351,7 +13357,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8.0.0" } @@ -13694,7 +13700,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "devOptional": true + "dev": true }, "node_modules/http-cache-semantics": { "version": "4.1.1", @@ -13852,7 +13858,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "devOptional": true, + "dev": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -14022,6 +14028,7 @@ "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, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -14141,7 +14148,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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -14476,7 +14483,7 @@ "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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -14485,7 +14492,7 @@ "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, + "dev": true, "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", @@ -14501,7 +14508,7 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "devOptional": true, + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -14513,7 +14520,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "devOptional": true, + "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -14527,7 +14534,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -14536,7 +14543,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -14548,7 +14555,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==", - "devOptional": true, + "dev": true, "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -14562,7 +14569,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -14571,7 +14578,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "devOptional": true, + "dev": true, "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -14601,7 +14608,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -14627,7 +14634,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==", - "devOptional": true, + "dev": true, "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", @@ -14641,7 +14648,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "devOptional": true, + "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -14664,7 +14671,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=10" }, @@ -14676,7 +14683,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" }, @@ -14688,7 +14695,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -14697,7 +14704,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "devOptional": true, + "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -14709,7 +14716,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "devOptional": true, + "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14724,7 +14731,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==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", @@ -14755,7 +14762,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -14770,7 +14777,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14786,7 +14793,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -14798,13 +14805,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -14813,7 +14820,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -14825,7 +14832,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", @@ -14858,7 +14865,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -14873,7 +14880,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14889,7 +14896,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -14901,13 +14908,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -14916,7 +14923,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -14928,7 +14935,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", @@ -14973,7 +14980,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -14988,7 +14995,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15004,7 +15011,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -15016,13 +15023,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -15031,7 +15038,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15121,7 +15128,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "devOptional": true, + "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, @@ -15133,7 +15140,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==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", @@ -15149,7 +15156,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -15164,7 +15171,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15180,7 +15187,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -15192,13 +15199,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -15207,7 +15214,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15293,7 +15300,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==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", @@ -15318,7 +15325,7 @@ "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==", - "devOptional": true, + "dev": true, "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" @@ -15505,7 +15512,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" }, @@ -15522,7 +15529,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==", - "devOptional": true, + "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -15531,7 +15538,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "devOptional": true, + "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", @@ -15551,7 +15558,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==", - "devOptional": true, + "dev": true, "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" @@ -15564,7 +15571,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -15579,7 +15586,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15595,7 +15602,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -15607,13 +15614,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -15622,7 +15629,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15634,7 +15641,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", @@ -15666,7 +15673,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -15681,7 +15688,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15697,7 +15704,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -15709,13 +15716,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -15724,7 +15731,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -15733,7 +15740,7 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "devOptional": true, + "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15743,7 +15750,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15755,7 +15762,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -15788,7 +15795,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -15803,7 +15810,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15819,7 +15826,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -15831,13 +15838,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -15846,7 +15853,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -15858,7 +15865,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", @@ -15889,7 +15896,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -15904,7 +15911,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -15920,7 +15927,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -15932,13 +15939,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -15947,7 +15954,7 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "devOptional": true, + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -15959,7 +15966,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -16398,7 +16405,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "devOptional": true, + "dev": true, "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", @@ -16417,7 +16424,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -16432,7 +16439,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -16448,7 +16455,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==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -16460,13 +16467,13 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true + "dev": 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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -16475,7 +16482,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==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -16528,6 +16535,7 @@ "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, "bin": { "jiti": "bin/jiti.js" } @@ -16756,7 +16764,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==", - "devOptional": true + "dev": true }, "node_modules/json-schema-deref-sync": { "version": "0.13.0", @@ -17045,6 +17053,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, "engines": { "node": ">=10" } @@ -17315,7 +17324,7 @@ "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, + "dev": true, "dependencies": { "semver": "^7.5.3" }, @@ -17330,7 +17339,7 @@ "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "devOptional": true, + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -18221,7 +18230,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "devOptional": true + "dev": true }, "node_modules/ncp": { "version": "2.0.0", @@ -18473,6 +18482,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, "engines": { "node": ">= 6" } @@ -18710,7 +18720,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -18865,7 +18875,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==", - "devOptional": true, + "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -18877,7 +18887,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "devOptional": true, + "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -18890,7 +18900,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "devOptional": true, + "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -18902,7 +18912,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "devOptional": true, + "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -18917,7 +18927,7 @@ "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, + "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -19063,6 +19073,7 @@ "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, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -19079,6 +19090,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -19097,6 +19109,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -19131,6 +19144,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, "engines": { "node": ">=14" }, @@ -19283,7 +19297,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "devOptional": true, + "dev": true, "funding": [ { "type": "individual", @@ -20010,6 +20024,7 @@ "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==", + "dev": true, "dependencies": { "react-is": "^18.2.0", "react-shallow-renderer": "^16.15.0", @@ -20022,12 +20037,14 @@ "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==" + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true }, "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, "dependencies": { "pify": "^2.3.0" } @@ -20036,6 +20053,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -20058,6 +20076,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -20069,6 +20088,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -20140,7 +20160,7 @@ "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "peer": true, + "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } @@ -20275,7 +20295,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==", - "devOptional": true, + "dev": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -20961,7 +20981,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "devOptional": true, + "dev": true, "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" @@ -21086,7 +21106,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -21122,7 +21142,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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" }, @@ -21316,6 +21336,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -21352,6 +21373,7 @@ "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, "dependencies": { "is-glob": "^4.0.3" }, @@ -21363,6 +21385,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -21551,7 +21574,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==", - "devOptional": true, + "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -21852,7 +21875,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "devOptional": true, + "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22100,7 +22123,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==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", diff --git a/frontend/occupi-mobile3/package.json b/frontend/occupi-mobile3/package.json index d9e664ef..612b7c6b 100644 --- a/frontend/occupi-mobile3/package.json +++ b/frontend/occupi-mobile3/package.json @@ -8,11 +8,14 @@ "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web", - "test": "jest --watchAll", + "test": "jest", "lint": "expo lint" }, "jest": { - "preset": "jest-expo" + "preset": "jest-expo", + "transformIgnorePatterns": [ + "node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg)" + ] }, "dependencies": { "@eva-design/eva": "^2.2.0", @@ -77,10 +80,15 @@ }, "devDependencies": { "@babel/core": "^7.24.6", + "@babel/preset-env": "^7.24.6", + "@babel/preset-flow": "^7.24.6", + "@babel/preset-react": "^7.24.6", + "@babel/preset-typescript": "^7.24.6", "@types/jest": "^29.5.4", "@types/react": "~18.2.79", "@types/react-test-renderer": "^18.0.1", - "jest": "^29.2.1", + "babel-jest": "^29.7.0", + "jest": "^29.7.0", "jest-expo": "~51.0.2", "metro": "^0.80.9", "react-test-renderer": "18.2.0", 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/Login/SignUp.tsx b/frontend/occupi-mobile3/screens/Login/SignUp.tsx index 1541a8b0..ba6050eb 100644 --- a/frontend/occupi-mobile3/screens/Login/SignUp.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignUp.tsx @@ -103,7 +103,7 @@ 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')} /> ); @@ -132,58 +132,58 @@ const SignUpForm = () => { if (_data.password === _data.confirmpassword) { setPwMatched(true); setLoading(true) - setTimeout(() => { - setLoading(false); - if (_data.email !== 'sabrina@deloitte.co.za') { - toast.show({ - placement: 'top', - render: ({ id }) => { - return ( - - Deloitte email verification failed. - - ); - }, - }); - reset(); - } else { - toast.show({ - placement: 'top', - render: ({ id }) => { - return ( - - Verification successful - - ); - }, - }); - reset(); - router.push('/verify-otp') - } - }, 3000); + // setTimeout(() => { + // setLoading(false); + // if (_data.email !== 'sabrina@deloitte.co.za') { + // toast.show({ + // placement: 'top', + // render: ({ id }) => { + // return ( + // + // Deloitte email verification failed. + // + // ); + // }, + // }); + // reset(); + // } else { + // toast.show({ + // placement: 'top', + // render: ({ id }) => { + // return ( + // + // Verification successful + // + // ); + // }, + // }); + // reset(); + // router.push('/verify-otp') + // } + // }, 3000); - // try { - // const response = await fetch('https://192.168.137.1:8080/auth/register', { - // method: 'POST', - // headers: { - // 'Content-Type': 'application/json' - // }, - // body: JSON.stringify({ - // email: "example", - // password: "12345" - // }) - // }); + try { + const response = await fetch('https://192.168.137.:8080/auth/register', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + email: "example", + password: "12345" + }) + }); - // const data = await response.json(); + const data = await response.json(); - // if (response.ok) { - // Alert.alert('Success', 'User registered successfully!'); - // } else { - // Alert.alert('Error', data.message || 'Something went wrong!'); - // } - // } catch (error) { - // Alert.alert('Error', error.message); - // } + if (response.ok) { + Alert.alert('Success', 'User registered successfully!'); + } else { + Alert.alert('Error', data.message || 'Something went wrong!'); + } + } catch (error) { + Alert.alert('Error', error.message); + } } else { toast.show({ placement: 'bottom right', @@ -267,7 +267,7 @@ const SignUpForm = () => { try { await signUpSchema.parseAsync({ email: value }); return true; - } catch (error: any) { + } catch (error) { return error.message; } }, @@ -355,7 +355,7 @@ const SignUpForm = () => { password: value, }); return true; - } catch (error: any) { + } catch (error ) { return error.message; } }, diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index df226444..383d11e2 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -1,8 +1,7 @@ import React, { useState, useEffect, useRef } from 'react'; import { Animated, StyleSheet, View } from 'react-native'; import { LinearGradient } from 'expo-linear-gradient'; -import { - Box, +import { Box, Image, Center, Heading, From 637fddd34ee3cacbf84c4df95311f46ac19018c1 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Fri, 7 Jun 2024 02:43:24 +0200 Subject: [PATCH 15/29] login and part of register --- frontend/occupi-mobile3/babel.config.js | 8 +- frontend/occupi-mobile3/package-lock.json | 925 ++++-------------- frontend/occupi-mobile3/package.json | 17 +- .../screens/Login/OtpVerification.tsx | 63 +- .../occupi-mobile3/screens/Login/SignIn.tsx | 90 +- .../occupi-mobile3/screens/Login/SignUp.tsx | 82 +- .../screens/Login/SplashScreen.tsx | 2 +- occupi-backend/cmd/occupi-backend/main.go | 2 +- occupi-backend/pkg/router/router.go | 2 +- 9 files changed, 296 insertions(+), 895 deletions(-) diff --git a/frontend/occupi-mobile3/babel.config.js b/frontend/occupi-mobile3/babel.config.js index 4f3810d3..24a5bd7a 100644 --- a/frontend/occupi-mobile3/babel.config.js +++ b/frontend/occupi-mobile3/babel.config.js @@ -1,10 +1,6 @@ module.exports = function (api) { api.cache(true); - return { - "presets": [ - '@babel/preset-env', - '@babel/preset-react', - '@babel/preset-flow', - ] + return { + presets: ['babel-preset-expo'], } }; diff --git a/frontend/occupi-mobile3/package-lock.json b/frontend/occupi-mobile3/package-lock.json index 333460f2..df2aaca7 100644 --- a/frontend/occupi-mobile3/package-lock.json +++ b/frontend/occupi-mobile3/package-lock.json @@ -27,12 +27,14 @@ "@testing-library/react-native": "^12.5.1", "@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-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-random": "^14.0.1", "expo-router": "~3.5.14", @@ -57,6 +59,7 @@ "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", @@ -70,15 +73,10 @@ }, "devDependencies": { "@babel/core": "^7.24.6", - "@babel/preset-env": "^7.24.6", - "@babel/preset-flow": "^7.24.6", - "@babel/preset-react": "^7.24.6", - "@babel/preset-typescript": "^7.24.6", "@types/jest": "^29.5.4", "@types/react": "~18.2.79", "@types/react-test-renderer": "^18.0.1", - "babel-jest": "^29.7.0", - "jest": "^29.7.0", + "jest": "^29.2.1", "jest-expo": "~51.0.2", "metro": "^0.80.9", "react-test-renderer": "18.2.0", @@ -184,18 +182,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "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, - "dependencies": { - "@babel/types": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", @@ -493,70 +479,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "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, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", - "@babel/plugin-transform-optional-chaining": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "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, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", @@ -722,18 +644,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "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, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -769,21 +679,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.6.tgz", @@ -848,36 +743,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1025,22 +890,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "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, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", @@ -1055,24 +904,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "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, - "dependencies": { - "@babel/helper-environment-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-remap-async-to-generator": "^7.24.6", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", @@ -1089,21 +920,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", @@ -1118,39 +934,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "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, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "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, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-transform-classes": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", @@ -1201,69 +984,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "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, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "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, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", @@ -1294,22 +1014,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", @@ -1326,170 +1030,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-literals": { "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==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "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, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "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==", - "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-simple-access": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "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, - "dependencies": { - "@babel/helper-hoist-variables": "^7.24.6", - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-identifier": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "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, - "dependencies": { - "@babel/helper-module-transforms": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "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==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "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==", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1498,14 +1044,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { + "node_modules/@babel/plugin-transform-modules-commonjs": { "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, + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "dependencies": { + "@babel/helper-module-transforms": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1514,31 +1060,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "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==", + "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==", "dependencies": { - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-object-super": { + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "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, + "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==", "dependencies": { "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-replace-supers": "^7.24.6" + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1547,14 +1090,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { + "node_modules/@babel/plugin-transform-object-rest-spread": { "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, + "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==", "dependencies": { + "@babel/helper-compilation-targets": "^7.24.6", "@babel/helper-plugin-utils": "^7.24.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1625,21 +1169,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.6.tgz", @@ -1729,37 +1258,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.6.tgz", @@ -1836,21 +1334,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.6.tgz", @@ -1868,37 +1351,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "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, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", @@ -1914,117 +1366,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "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, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "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, - "dependencies": { - "@babel/compat-data": "^7.24.6", - "@babel/helper-compilation-targets": "^7.24.6", - "@babel/helper-plugin-utils": "^7.24.6", - "@babel/helper-validator-option": "^7.24.6", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.6", - "@babel/plugin-syntax-import-attributes": "^7.24.6", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.6", - "@babel/plugin-transform-async-generator-functions": "^7.24.6", - "@babel/plugin-transform-async-to-generator": "^7.24.6", - "@babel/plugin-transform-block-scoped-functions": "^7.24.6", - "@babel/plugin-transform-block-scoping": "^7.24.6", - "@babel/plugin-transform-class-properties": "^7.24.6", - "@babel/plugin-transform-class-static-block": "^7.24.6", - "@babel/plugin-transform-classes": "^7.24.6", - "@babel/plugin-transform-computed-properties": "^7.24.6", - "@babel/plugin-transform-destructuring": "^7.24.6", - "@babel/plugin-transform-dotall-regex": "^7.24.6", - "@babel/plugin-transform-duplicate-keys": "^7.24.6", - "@babel/plugin-transform-dynamic-import": "^7.24.6", - "@babel/plugin-transform-exponentiation-operator": "^7.24.6", - "@babel/plugin-transform-export-namespace-from": "^7.24.6", - "@babel/plugin-transform-for-of": "^7.24.6", - "@babel/plugin-transform-function-name": "^7.24.6", - "@babel/plugin-transform-json-strings": "^7.24.6", - "@babel/plugin-transform-literals": "^7.24.6", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", - "@babel/plugin-transform-member-expression-literals": "^7.24.6", - "@babel/plugin-transform-modules-amd": "^7.24.6", - "@babel/plugin-transform-modules-commonjs": "^7.24.6", - "@babel/plugin-transform-modules-systemjs": "^7.24.6", - "@babel/plugin-transform-modules-umd": "^7.24.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", - "@babel/plugin-transform-new-target": "^7.24.6", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", - "@babel/plugin-transform-numeric-separator": "^7.24.6", - "@babel/plugin-transform-object-rest-spread": "^7.24.6", - "@babel/plugin-transform-object-super": "^7.24.6", - "@babel/plugin-transform-optional-catch-binding": "^7.24.6", - "@babel/plugin-transform-optional-chaining": "^7.24.6", - "@babel/plugin-transform-parameters": "^7.24.6", - "@babel/plugin-transform-private-methods": "^7.24.6", - "@babel/plugin-transform-private-property-in-object": "^7.24.6", - "@babel/plugin-transform-property-literals": "^7.24.6", - "@babel/plugin-transform-regenerator": "^7.24.6", - "@babel/plugin-transform-reserved-words": "^7.24.6", - "@babel/plugin-transform-shorthand-properties": "^7.24.6", - "@babel/plugin-transform-spread": "^7.24.6", - "@babel/plugin-transform-sticky-regex": "^7.24.6", - "@babel/plugin-transform-template-literals": "^7.24.6", - "@babel/plugin-transform-typeof-symbol": "^7.24.6", - "@babel/plugin-transform-unicode-escapes": "^7.24.6", - "@babel/plugin-transform-unicode-property-regex": "^7.24.6", - "@babel/plugin-transform-unicode-regex": "^7.24.6", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-flow": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.6.tgz", @@ -2041,20 +1382,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-modules": { - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/preset-react": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.6.tgz", @@ -2605,15 +1932,15 @@ } }, "node_modules/@expo/cli": { - "version": "0.18.13", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.13.tgz", - "integrity": "sha512-ZO1fpDK8z6mLeQGuFP6e3cZyCHV55ohZY7/tEyhpft3bwysS680eyFg5SFe+tWNFesnziFrbtI8JaUyhyjqovA==", + "version": "0.18.15", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.15.tgz", + "integrity": "sha512-2eL3fESumExzMGsi2ibNrYWoycBrnJxlAF7GPUGR9qi65SMf8vW+2Eb9mfavydYzi173bDrluN4vf2vDAgxtHg==", "dependencies": { "@babel/runtime": "^7.20.0", "@expo/code-signing-certificates": "0.0.5", - "@expo/config": "~9.0.0", - "@expo/config-plugins": "~8.0.0", - "@expo/devcert": "^1.1.2", + "@expo/config": "~9.0.0-beta.0", + "@expo/config-plugins": "~8.0.0-beta.0", + "@expo/devcert": "^1.0.0", "@expo/env": "~0.3.0", "@expo/image-utils": "^0.5.0", "@expo/json-file": "^8.3.0", @@ -2621,11 +1948,11 @@ "@expo/osascript": "^2.0.31", "@expo/package-manager": "^1.5.0", "@expo/plist": "^0.1.0", - "@expo/prebuild-config": "7.0.4", + "@expo/prebuild-config": "7.0.5", "@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", @@ -3355,15 +2682,15 @@ } }, "node_modules/@expo/metro-config": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.4.tgz", - "integrity": "sha512-vh9WDf/SzE+NYCn6gqbzLKiXtENFlFZdAqyj9nI38RvQ4jw6TJIQ8+ExcdLDT3MOG36Ytg44XX9Zb3OWF6LVxw==", + "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==", "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.5", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", - "@expo/config": "~9.0.0", + "@expo/config": "~9.0.0-beta.0", "@expo/env": "~0.3.0", "@expo/json-file": "~8.3.0", "@expo/spawn-async": "^1.7.2", @@ -3669,9 +2996,9 @@ } }, "node_modules/@expo/osascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.2.tgz", - "integrity": "sha512-/ugqDG+52uzUiEpggS9GPdp9g0U9EQrXcTdluHDmnlGmR2nV/F83L7c+HCUyPnf77QXwkr8gQk16vQTbxBQ5eA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.3.tgz", + "integrity": "sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==", "dependencies": { "@expo/spawn-async": "^1.7.2", "exec-async": "^2.2.0" @@ -3779,16 +3106,16 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.4.tgz", - "integrity": "sha512-E2n3QbwgV8Qa0CBw7BHrWBDWD7l8yw+N/yjvXpSPFFtoZLMSKyegdkJFACh2u+UIRKUSZm8zQwHeZR0rqAxV9g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.5.tgz", + "integrity": "sha512-vkFsYvqFVPwwknlzewiZQJUjXVj3Q0sdtTlhhHH2rDjKBAswUOsNjGyhcg14lMDjcos4ChUukSQqoLEWD9u4GQ==", "dependencies": { - "@expo/config": "~9.0.0", - "@expo/config-plugins": "~8.0.0", + "@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", @@ -10133,9 +9460,9 @@ } }, "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==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-11.0.7.tgz", + "integrity": "sha512-7RuGTlJmm2d+ut4/hUH33DxGdisC/uA47uBmdTjekdVVk0XNC8yolQH7Hx3xUPvJu+Y1ifxyiOIeV4RZf1unyQ==", "dependencies": { "@babel/plugin-proposal-decorators": "^7.12.9", "@babel/plugin-transform-export-namespace-from": "^7.22.11", @@ -10143,7 +9470,7 @@ "@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", + "@react-native/babel-preset": "0.74.83", "babel-plugin-react-native-web": "~0.19.10", "react-refresh": "^0.14.2" } @@ -12294,23 +11621,23 @@ } }, "node_modules/expo": { - "version": "51.0.8", - "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.8.tgz", - "integrity": "sha512-bdTOiMb1f3PChtuqEZ9czUm2gMTmS0r1+H+Pkm2O3PsuLnOgxfIBzL6S37+J4cUocLBaENrmx9SOGKpzhBqXpg==", + "version": "51.0.10", + "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.10.tgz", + "integrity": "sha512-gmw+XInE9Bpg/faVWwLRF6RXYfRKReJB9BhE+3M56irkt//4OQLmpyRzSvG7O0joCm13Acr8JOBgRRu9tKCb+g==", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.18.13", - "@expo/config": "9.0.2", + "@expo/cli": "0.18.15", + "@expo/config": "9.0.1", "@expo/config-plugins": "8.0.4", - "@expo/metro-config": "0.18.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.5", + "expo-font": "~12.0.6", "expo-keep-awake": "~13.0.2", "expo-modules-autolinking": "1.11.1", - "expo-modules-core": "1.12.11", + "expo-modules-core": "1.12.13", "fbemitter": "^3.0.0", "whatwg-url-without-unicode": "8.0.0-3" }, @@ -12319,11 +11646,11 @@ } }, "node_modules/expo-asset": { - "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==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-10.0.7.tgz", + "integrity": "sha512-ql4eDaGJSyulMsfCYXfRrrcZYR31wptEZWGff8ksgxtfEzF9vkFUckkBWFBX1uwkqfP95UYxkgth4nRh3F1XsQ==", "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" @@ -12351,6 +11678,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", @@ -12365,9 +11703,9 @@ } }, "node_modules/expo-font": { - "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==", + "version": "12.0.6", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-12.0.6.tgz", + "integrity": "sha512-eognUxmZi2urCdERA5KuZpXUJO9JomOG/5ZKw9fGUhDi86SQ/6UWw+nMGbtshjWdJ0Vt0zHAdaIYx8aHq2iRzA==", "dependencies": { "fontfaceobserver": "^2.1.0" }, @@ -12405,6 +11743,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", @@ -12538,9 +11887,9 @@ } }, "node_modules/expo-modules-core": { - "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==", + "version": "1.12.13", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.12.13.tgz", + "integrity": "sha512-CpCe6HatZpFa3KwQ04t1FxZWGl96KpV/RH55PGSXLhGhNMQ2MXxK7g9xKuXUDM45hgeNlO3P7BhJJkyFfhe3TQ==", "dependencies": { "invariant": "^2.2.4" } @@ -12812,6 +12161,63 @@ "expo": "*" } }, + "node_modules/expo/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/expo/node_modules/@expo/config": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.1.tgz", + "integrity": "sha512-0tjaXBstTbXmD4z+UMFBkh2SZFwilizSQhW6DlaTMnPG5ezuw93zSFEWAuEC3YzkpVtNQTmYzxAYjxwh6seOGg==", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~8.0.0-beta.0", + "@expo/config-types": "^51.0.0-unreleased", + "@expo/json-file": "^8.3.0", + "getenv": "^1.0.0", + "glob": "7.1.6", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4", + "sucrase": "3.34.0" + } + }, + "node_modules/expo/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/expo/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -14588,9 +13994,9 @@ } }, "node_modules/jackspeak": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", - "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.3.0.tgz", + "integrity": "sha512-glPiBfKguqA7v8JsXO3iLjJWZ9FV1vNpoI0I9hI9Mnk5yetO9uPLSpiCEmiVijAssv2f54HpvtzvAHfhPieiDQ==", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -19671,6 +19077,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", @@ -20156,15 +19574,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", diff --git a/frontend/occupi-mobile3/package.json b/frontend/occupi-mobile3/package.json index f9ec22a9..3e72cf34 100644 --- a/frontend/occupi-mobile3/package.json +++ b/frontend/occupi-mobile3/package.json @@ -8,14 +8,11 @@ "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web", - "test": "jest", + "test": "jest --watchAll", "lint": "expo lint" }, "jest": { - "preset": "jest-expo", - "transformIgnorePatterns": [ - "node_modules/(?!((jest-)?react-native|@react-native(-community)?)|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|react-navigation|@react-navigation/.*|@unimodules/.*|unimodules|sentry-expo|native-base|react-native-svg)" - ] + "preset": "jest-expo" }, "dependencies": { "@eva-design/eva": "^2.2.0", @@ -40,6 +37,7 @@ "expo": "^51.0.9", "expo-blur": "~13.0.2", "expo-constants": "~16.0.1", + "expo-crypto": "^13.0.2", "expo-font": "~12.0.5", "expo-linear-gradient": "^13.0.2", "expo-linking": "~6.3.1", @@ -82,15 +80,10 @@ }, "devDependencies": { "@babel/core": "^7.24.6", - "@babel/preset-env": "^7.24.6", - "@babel/preset-flow": "^7.24.6", - "@babel/preset-react": "^7.24.6", - "@babel/preset-typescript": "^7.24.6", "@types/jest": "^29.5.4", "@types/react": "~18.2.79", "@types/react-test-renderer": "^18.0.1", - "babel-jest": "^29.7.0", - "jest": "^29.7.0", + "jest": "^29.2.1", "jest-expo": "~51.0.2", "metro": "^0.80.9", "react-test-renderer": "18.2.0", @@ -98,4 +91,4 @@ "typescript": "~5.3.3" }, "private": true -} +} \ No newline at end of file diff --git a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx index d53aef0b..2cd85e14 100644 --- a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx +++ b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx @@ -4,7 +4,7 @@ import { VStack, Box, HStack, Image, FormControl, Input, Button, Heading } from import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; -import { useRouter } 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'; @@ -21,12 +21,13 @@ const OTPSchema = z.object({ type OTPSchemaType = z.infer; -const OTPVerification = ({ route }) => { - const { email } = route?.params || {}; +const OTPVerification = () => { + const email = useLocalSearchParams(); const [remainingTime, setRemainingTime] = useState(60); // 1 minute const [otpSent, setOtpSent] = useState(false); const timerRef = useRef(null); const router = useRouter(); + // console.log(email); useEffect(() => { if (remainingTime > 0 && otpSent) { @@ -108,14 +109,15 @@ const OTPVerification = ({ route }) => { } setValidationError(null); - const storedOtp = await SecureStore.getItemAsync('user_otp'); - if (pin === storedOtp) { - Alert.alert('Signup successful'); - reset(); - router.push('/login'); - } else { - Alert.alert('Invalid OTP'); - } + // const storedOtp = await SecureStore.getItemAsync('user_otp'); + // if (pin === storedOtp) { + // Alert.alert('Signup successful'); + // reset(); + // router.push('/login'); + // } else { + // Alert.alert('Invalid OTP'); + // } + }; useEffect(() => { @@ -138,15 +140,15 @@ const OTPVerification = ({ route }) => { ); return ( - - + // + // { py="$8" px="$4" flex={1} - maxWidth={wp('90%')} > @@ -189,7 +190,7 @@ const OTPVerification = ({ route }) => { - + // ); }; @@ -214,7 +215,7 @@ function PinInput({ Email is missing
; - } - - const obfuscatedEmail = email.replace(/(.{2})(.*)(?=@)/, - (gp1, gp2, gp3) => { - for (let i = 0; i < gp3.length; i++) { - gp2 += '*'; - } return gp2; - }); return ( @@ -315,7 +306,7 @@ function MainText({ email }: { email: string }) { fontSize={wp('5%')} fontWeight="$light" > - {' ' + obfuscatedEmail} + {' ' + email} @@ -333,7 +324,7 @@ function AccountLink() { }} mt="auto" space="xs" - alignItems="center" + alignItems="$center" justifyContent="center" > Already have an account? - + Login diff --git a/frontend/occupi-mobile3/screens/Login/SignIn.tsx b/frontend/occupi-mobile3/screens/Login/SignIn.tsx index 5dfd2c4b..51f00b5c 100644 --- a/frontend/occupi-mobile3/screens/Login/SignIn.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignIn.tsx @@ -3,8 +3,8 @@ 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 } from 'react-native'; +import { Ionicons } from '@expo/vector-icons'; +import { TouchableOpacity, View, Alert, KeyboardAvoidingView, Platform, ScrollView } from 'react-native'; import { Center, Button, @@ -93,7 +93,7 @@ const SignInForm = () => { 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({ @@ -148,37 +148,55 @@ const SignInForm = () => { } }; - const onSubmit = (_data: SignInSchemaType) => { + const onSubmit = async (_data: SignInSchemaType) => { setLoading(true); - setTimeout(() => { - setLoading(false); - if (_data.email !== 'sabrina@deloitte.co.za' || _data.password !== 'Test@1234') { + try { + const response = await fetch('http://192.168.0.3: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 ( - - Invalid credentials - - ); - }, - }); - reset(); + placement: 'top', + render: ({ id }) => { + return ( + + {data.message} + + ); + }, + }); + router.push('/home'); } else { + setLoading(false); + // console.log(data); toast.show({ - placement: 'top', - render: ({ id }) => { - return ( - - Login successful - - ); - }, - }); - reset(); - router.push('/home'); + placement: 'top', + render: ({ id }) => { + return ( + + {data.message} + + ); + }, + }); } - }, 3000); + } catch (error) { + console.error('Error:', error); + // setResponse('An error occurred'); + } + // }, 3000); + setLoading(false); }; const handleKeyPress = () => { @@ -357,15 +375,16 @@ const SignInForm = () => { {loading ? ( ) : ( )} + {/* */} ); }; @@ -438,9 +457,12 @@ const Main = () => { const SignIn = () => { return ( - <> +
- + ); }; diff --git a/frontend/occupi-mobile3/screens/Login/SignUp.tsx b/frontend/occupi-mobile3/screens/Login/SignUp.tsx index 1c073578..8ff1c2c1 100644 --- a/frontend/occupi-mobile3/screens/Login/SignUp.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignUp.tsx @@ -104,7 +104,7 @@ 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')} /> ); @@ -130,59 +130,52 @@ const SignUpForm = () => { const onSubmit = async (_data: SignUpSchemaType) => { if (_data.password === _data.confirmpassword) { setPwMatched(true); - setLoading(true) - // setTimeout(() => { - // setLoading(false); - // if (_data.email !== 'sabrina@deloitte.co.za') { - // toast.show({ - // placement: 'top', - // render: ({ id }) => { - // return ( - // - // Deloitte email verification failed. - // - // ); - // }, - // }); - // reset(); - // } else { - // toast.show({ - // placement: 'top', - // render: ({ id }) => { - // return ( - // - // Verification successful - // - // ); - // }, - // }); - // reset(); - // router.push('/verify-otp') - // } - // }, 3000); - + setLoading(true); try { - const response = await fetch('https://192.168.137.:8080/auth/register', { + const response = await fetch('http://192.168.0.3:8080/auth/register', { method: 'POST', headers: { + Accept: 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ - email: "example", - password: "12345" - }) + email: _data.email, + password: _data.password + }), + credentials: "include" }); - const data = await response.json(); - if (response.ok) { - Alert.alert('Success', 'User registered successfully!'); + setLoading(false); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + {data.message} + + ); + }, + }); + router.push({pathname:'/login', params: { email: _data.email}}); } else { - Alert.alert('Error', data.message || 'Something went wrong!'); + setLoading(false); + // console.log(data); + toast.show({ + placement: 'top', + render: ({ id }) => { + return ( + + {data.error.message} + + ); + }, + }); } } catch (error) { - Alert.alert('Error', error.message); - } + console.error('Error:', error); + } + setLoading(false) } else { toast.show({ placement: 'bottom right', @@ -195,9 +188,6 @@ const SignUpForm = () => { }, }); } - // Implement your own onSubmit and navigation logic here. - // Navigate to appropriate location - // router.replace('/verify-otp'); }; const handleKeyPress = () => { @@ -354,7 +344,7 @@ const SignUpForm = () => { password: value, }); return true; - } catch (error ) { + } catch (error) { return error.message; } }, diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index 76c03222..08c48178 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/onboarding1'); // Navigate to Onboarding1 screen + router.navigate('/verify-otp'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount diff --git a/occupi-backend/cmd/occupi-backend/main.go b/occupi-backend/cmd/occupi-backend/main.go index 708a6cf9..2f56bd82 100644 --- a/occupi-backend/cmd/occupi-backend/main.go +++ b/occupi-backend/cmd/occupi-backend/main.go @@ -51,7 +51,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/pkg/router/router.go b/occupi-backend/pkg/router/router.go index 56d8ce95..538b8025 100644 --- a/occupi-backend/pkg/router/router.go +++ b/occupi-backend/pkg/router/router.go @@ -37,7 +37,7 @@ func OccupiRouter(router *gin.Engine, db *mongo.Client) { router.Static("/documentation", "./web/documentation") router.Use(cors.New(cors.Config{ - AllowOrigins: []string{"http://localhost:5173", "http://192.168.137.1:19000"}, + AllowOrigins: []string{"*"}, AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowHeaders: []string{"Origin", "Content-Type", "Accept", "Authorization"}, ExposeHeaders: []string{"Content-Length"}, From 11a49620a13c5f1e3a551f4117121a67c7fe7b44 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Fri, 7 Jun 2024 15:53:31 +0200 Subject: [PATCH 16/29] page resizing --- frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx | 4 ++-- frontend/occupi-mobile3/screens/Login/SignIn.tsx | 2 +- frontend/occupi-mobile3/screens/Login/SplashScreen.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx index 16a50afc..41f565ee 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/Dashboard.tsx @@ -75,7 +75,7 @@ const Dashboard = () => { style={{ width: wp('8%'), height: wp('8%'), flexDirection: 'column', tintColor: isDarkMode ? 'white' : 'black' }} /> - + @@ -96,7 +96,7 @@ const Dashboard = () => { alt="logo" p="$10" source={require('./assets/graph.png')} - style={{ width: wp('100%'), height: hp('30%'), flexDirection: 'column', tintColor: isDarkMode ? 'white' : 'black' }} + style={{ width: wp('100%'), height: hp('31%'), flexDirection: 'column', tintColor: isDarkMode ? 'white' : 'black' }} /> diff --git a/frontend/occupi-mobile3/screens/Login/SignIn.tsx b/frontend/occupi-mobile3/screens/Login/SignIn.tsx index 51f00b5c..32d8f524 100644 --- a/frontend/occupi-mobile3/screens/Login/SignIn.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignIn.tsx @@ -151,7 +151,7 @@ const SignInForm = () => { const onSubmit = async (_data: SignInSchemaType) => { setLoading(true); try { - const response = await fetch('http://192.168.0.3:8080/auth/login', { + const response = await fetch('http://172.20.10.9:8080/auth/login', { method: 'POST', headers: { Accept: 'application/json', diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index 08c48178..76c03222 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/verify-otp'); // Navigate to Onboarding1 screen + router.navigate('/onboarding1'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount From ad427bb388dd7bd40710daf001a6acd730de83d7 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Sat, 8 Jun 2024 14:59:22 +0200 Subject: [PATCH 17/29] otp frontend fix --- .../screens/Login/OtpVerification.tsx | 239 ++++++------------ .../screens/Login/SplashScreen.tsx | 2 +- 2 files changed, 75 insertions(+), 166 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx index 2cd85e14..72609b97 100644 --- a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx +++ b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx @@ -1,5 +1,5 @@ import React, { useRef, useState, useEffect } from 'react'; -import { TouchableOpacity, View, Text, StyleSheet, Alert } from 'react-native'; +import { TouchableOpacity, View, Text, StyleSheet, Alert, TextInput } from 'react-native'; import { VStack, Box, HStack, Image, FormControl, Input, Button, Heading } from '@gluestack-ui/themed'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; @@ -27,6 +27,9 @@ const OTPVerification = () => { const [otpSent, setOtpSent] = useState(false); const timerRef = useRef(null); const router = useRouter(); + const [otp, setOtp] = useState(['', '', '', '', '', '']); + const [inputFocus, setInputFocus] = useState(-1); + const [validationError, setValidationError] = useState(null); // console.log(email); useEffect(() => { @@ -44,32 +47,6 @@ const OTPVerification = () => { }; }, [remainingTime, otpSent]); - const generateOtp = async (): Promise => { - const randomBytes = await Random.getRandomBytesAsync(6); - const otp = Array.from(randomBytes).map(byte => byte % 10).join(''); - return otp; - }; - - const sendOtp = async () => { - const generatedOtp = await generateOtp(); - setRemainingTime(60); - setOtpSent(true); - - await SecureStore.setItemAsync('user_otp', generatedOtp); - - // Send the OTP via email (example using Expo MailComposer) - const isAvailable = await MailComposer.isAvailableAsync(); - if (isAvailable) { - await MailComposer.composeAsync({ - recipients: [email], - subject: 'Your OTP Code', - body: `Your OTP code is ${generatedOtp}`, - }); - } else { - Alert.alert('MailComposer is not available'); - } - }; - const { control, formState: { errors }, @@ -79,52 +56,19 @@ 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); + 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 pin = otp.join(''); + const Count = otp.filter((value) => value !== '').length; + console.log(pin); if (Count < 6) { setValidationError('OTP must be at least 6 characters in length'); return; } setValidationError(null); - - // const storedOtp = await SecureStore.getItemAsync('user_otp'); - // if (pin === storedOtp) { - // Alert.alert('Signup successful'); - // reset(); - // router.push('/login'); - // } else { - // Alert.alert('Invalid OTP'); - // } - }; - useEffect(() => { - // Automatically send OTP when component mounts - sendOtp(); - }, []); - const GradientButton = ({ onPress, text }) => ( { ); + const OTPInput = () => { + const inputRefs = useRef([]); + const handleChangeText = (text, index) => { + const newOtp = [...otp]; + newOtp[index] = text; + setOtp(newOtp); + + if (text && index < 5) { + inputRefs.current[index + 1].focus(); + } + }; + + const handleKeyPress = (e, index) => { + if (e.nativeEvent.key === 'Backspace' && !otp[index] && index > 0) { + inputRefs.current[index - 1].focus(); + } + }; + + useEffect(() => { + // if ( otp[5] == '') { + inputRefs.current[0].focus(); + // } + // console.log(inputRefs.current[0].value) + }, []); + + 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} + /> + ))} + + ); + }; + return ( - // - // { flex={1} > - - - - {validationError && ( - - {validationError} - - )} - {errors?.OTP && ( - - {errors.OTP.message} - - )} - - {remainingTime} seconds remaining - - + + + {remainingTime} seconds remaining + + - // ); }; -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 }) { return ( @@ -348,6 +239,8 @@ function AccountLink() { ); } + + const styles = StyleSheet.create({ buttonContainer: { borderRadius: 15, @@ -362,6 +255,22 @@ const styles = StyleSheet.create({ 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/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index 76c03222..08c48178 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/onboarding1'); // Navigate to Onboarding1 screen + router.navigate('/verify-otp'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount From 6caf399f74a909450680b911ffe12cc2afebe8c7 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Sat, 8 Jun 2024 16:42:16 +0200 Subject: [PATCH 18/29] email parsing froom signup to otp verification --- frontend/occupi-mobile3/app/_layout.tsx | 1 - .../screens/Login/OtpVerification.tsx | 159 ++++++++++++------ .../occupi-mobile3/screens/Login/SignIn.tsx | 2 +- .../occupi-mobile3/screens/Login/SignUp.tsx | 4 +- .../screens/Login/SplashScreen.tsx | 2 +- 5 files changed, 110 insertions(+), 58 deletions(-) diff --git a/frontend/occupi-mobile3/app/_layout.tsx b/frontend/occupi-mobile3/app/_layout.tsx index e61d0ca6..022f965c 100644 --- a/frontend/occupi-mobile3/app/_layout.tsx +++ b/frontend/occupi-mobile3/app/_layout.tsx @@ -46,7 +46,6 @@ export default function RootLayout() { - ); diff --git a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx index 72609b97..8c2f776c 100644 --- a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx +++ b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx @@ -1,6 +1,6 @@ import React, { useRef, useState, useEffect } from 'react'; import { TouchableOpacity, View, Text, StyleSheet, Alert, TextInput } from 'react-native'; -import { VStack, Box, HStack, Image, FormControl, Input, Button, Heading } from '@gluestack-ui/themed'; +import { VStack, Box, HStack, Image, FormControl, Input, Button, Heading, Toast, useToast, ToastTitle } from '@gluestack-ui/themed'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; @@ -22,18 +22,21 @@ const OTPSchema = z.object({ type OTPSchemaType = z.infer; const OTPVerification = () => { - const email = useLocalSearchParams(); + const emailParams = useLocalSearchParams(); + const email = emailParams.email ? String(emailParams.email) : ''; 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); + console.log(email.email); useEffect(() => { - if (remainingTime > 0 && otpSent) { + if (remainingTime > 0 && !otpSent) { timerRef.current = setInterval(() => { setRemainingTime((prevTime) => prevTime - 1); }, 1000); @@ -58,15 +61,63 @@ const OTPVerification = () => { - const onSubmit = async (_data: OTPSchemaType) => { + const onSubmit = async ({email}) => { const pin = otp.join(''); const Count = otp.filter((value) => value !== '').length; - console.log(pin); if (Count < 6) { setValidationError('OTP must be at least 6 characters in length'); return; } setValidationError(null); + console.log(pin); + 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: email, + otp: otp + }), + 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 GradientButton = ({ onPress, text }) => ( @@ -83,49 +134,6 @@ const OTPVerification = () => { ); - const OTPInput = () => { - const inputRefs = useRef([]); - const handleChangeText = (text, index) => { - const newOtp = [...otp]; - newOtp[index] = text; - setOtp(newOtp); - - if (text && index < 5) { - inputRefs.current[index + 1].focus(); - } - }; - - const handleKeyPress = (e, index) => { - if (e.nativeEvent.key === 'Backspace' && !otp[index] && index > 0) { - inputRefs.current[index - 1].focus(); - } - }; - - useEffect(() => { - // if ( otp[5] == '') { - inputRefs.current[0].focus(); - // } - // console.log(inputRefs.current[0].value) - }, []); - - 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} - /> - ))} - - ); - }; - return ( { px="$4" flex={1} > - + - + + Entered OTP: {otp.join('')} {remainingTime} seconds remaining @@ -153,7 +162,7 @@ const OTPVerification = () => { ); }; -function MainText({ email }: { email: string }) { +const MainText = (email : string) => { return ( @@ -197,7 +206,7 @@ function MainText({ email }: { email: string }) { fontSize={wp('5%')} fontWeight="$light" > - {' ' + email} + {' '+email.email} @@ -239,7 +248,51 @@ function AccountLink() { ); } +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(); + } + }; + + 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: { diff --git a/frontend/occupi-mobile3/screens/Login/SignIn.tsx b/frontend/occupi-mobile3/screens/Login/SignIn.tsx index 32d8f524..54b9ebb8 100644 --- a/frontend/occupi-mobile3/screens/Login/SignIn.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignIn.tsx @@ -151,7 +151,7 @@ const SignInForm = () => { const onSubmit = async (_data: SignInSchemaType) => { setLoading(true); try { - const response = await fetch('http://172.20.10.9:8080/auth/login', { + const response = await fetch('http://10.0.0.160:8080/auth/login', { method: 'POST', headers: { Accept: 'application/json', diff --git a/frontend/occupi-mobile3/screens/Login/SignUp.tsx b/frontend/occupi-mobile3/screens/Login/SignUp.tsx index 8ff1c2c1..cf5cf616 100644 --- a/frontend/occupi-mobile3/screens/Login/SignUp.tsx +++ b/frontend/occupi-mobile3/screens/Login/SignUp.tsx @@ -132,7 +132,7 @@ const SignUpForm = () => { setPwMatched(true); setLoading(true); try { - const response = await fetch('http://192.168.0.3:8080/auth/register', { + const response = await fetch('http://10.0.0.160:8080/auth/register', { method: 'POST', headers: { Accept: 'application/json', @@ -157,7 +157,7 @@ const SignUpForm = () => { ); }, }); - router.push({pathname:'/login', params: { email: _data.email}}); + router.push({pathname:'/verify-otp', params: { email: _data.email}}); } else { setLoading(false); // console.log(data); diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index 08c48178..fc2c55fb 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/verify-otp'); // Navigate to Onboarding1 screen + router.navigate('/signup'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount From 93f7585fde299d00fe99198aa0660694511f6249 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Sun, 9 Jun 2024 00:51:34 +0200 Subject: [PATCH 19/29] Full signup and login flow --- .../screens/Login/OtpVerification.tsx | 23 +++++++++++++++---- .../screens/Login/SplashScreen.tsx | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx index 8c2f776c..c702988b 100644 --- a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx +++ b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx @@ -24,6 +24,7 @@ type OTPSchemaType = z.infer; const OTPVerification = () => { 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); @@ -33,7 +34,7 @@ const OTPVerification = () => { const [otp, setOtp] = useState(['', '', '', '', '', '']); const [inputFocus, setInputFocus] = useState(-1); const [validationError, setValidationError] = useState(null); - console.log(email.email); + // console.log(email); useEffect(() => { if (remainingTime > 0 && !otpSent) { @@ -61,7 +62,8 @@ const OTPVerification = () => { - const onSubmit = async ({email}) => { + const onSubmit = async () => { + console.log(email); const pin = otp.join(''); const Count = otp.filter((value) => value !== '').length; if (Count < 6) { @@ -72,7 +74,7 @@ const OTPVerification = () => { console.log(pin); setLoading(true); try { - const response = await fetch('http://10.0.0.160:8080/auth/login', { + const response = await fetch('http://10.0.0.160:8080/auth/verify-otp', { method: 'POST', headers: { Accept: 'application/json', @@ -80,7 +82,7 @@ const OTPVerification = () => { }, body: JSON.stringify({ email: email, - otp: otp + otp: pin }), credentials: "include" }); @@ -154,7 +156,18 @@ const OTPVerification = () => { Entered OTP: {otp.join('')} {remainingTime} seconds remaining - + {loading ? ( + + ) : ( + + )} + diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index fc2c55fb..76c03222 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/signup'); // Navigate to Onboarding1 screen + router.navigate('/onboarding1'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount From 5b20917df138110b17351a8aa04655c6f6d6124e Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Sun, 9 Jun 2024 02:09:33 +0200 Subject: [PATCH 20/29] initial bookroom page --- frontend/occupi-mobile3/app/bookings.tsx | 4 +- .../screens/Dashboard/BookRoom.tsx | 93 +++++++++++++++++++ .../screens/Login/SplashScreen.tsx | 2 +- 3 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx diff --git a/frontend/occupi-mobile3/app/bookings.tsx b/frontend/occupi-mobile3/app/bookings.tsx index 16084b4e..7c4fb628 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/Dashboard/BookRoom"; export default function Home() { return ( - + ); } \ No newline at end of file diff --git a/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx b/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx new file mode 100644 index 00000000..3a911358 --- /dev/null +++ b/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx @@ -0,0 +1,93 @@ +import { React, useEffect, useState } from 'react'; +import { ScrollView, useColorScheme } from 'react-native'; +import { Icon, View, Text, Input, InputField, InputSlot } from '@gluestack-ui/themed'; +import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; +import { Ionicons } from '@expo/vector-icons'; +import Navbar from '../../components/NavBar'; + +const BookRoom = () => { + const colorScheme = useColorScheme(); + const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); + useEffect(() => { + setIsDarkMode(colorScheme === 'dark'); + }, [colorScheme]); + const backgroundColor = isDarkMode ? '#1C1C1E' : '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}, + ]; + + return ( + + + Book + + + + + Categories + + {['Focus', 'Chill', 'Ideas', 'Loud', 'Gamey', 'View'].map((category) => ( + + + + + {category} + + ))} + + Rooms + + {/* Rooms */} + {data.map((room) => ( + + + {room.title} + {room.available} + + + + ))} + + + + ); +}; + +export default BookRoom; diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index 76c03222..2ff5d66e 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/onboarding1'); // Navigate to Onboarding1 screen + router.navigate('/bookings'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount From 3296d953d0d751050daa84b7e1035fad28e9ac9c Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 10 Jun 2024 02:32:18 +0200 Subject: [PATCH 21/29] create booking almost complete --- .../screens/Dashboard/BookRoom.tsx | 150 ++++++++++++------ .../screens/Dashboard/assets/image.png | Bin 0 -> 156388 bytes 2 files changed, 101 insertions(+), 49 deletions(-) create mode 100644 frontend/occupi-mobile3/screens/Dashboard/assets/image.png diff --git a/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx b/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx index 3a911358..62ccfe47 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx @@ -1,91 +1,143 @@ import { React, useEffect, useState } from 'react'; import { ScrollView, useColorScheme } from 'react-native'; -import { Icon, View, Text, Input, InputField, InputSlot } from '@gluestack-ui/themed'; +import { Icon, View, Text, Input, InputField, InputSlotButton, Button, ButtonText, Image } from '@gluestack-ui/themed'; import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; 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 BookRoom = () => { const colorScheme = useColorScheme(); + const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); useEffect(() => { setIsDarkMode(colorScheme === 'dark'); }, [colorScheme]); - const backgroundColor = isDarkMode ? '#1C1C1E' : 'white'; + 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 }, + { 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 - - - + + + Book + + + + /> Categories - - {['Focus', 'Chill', 'Ideas', 'Loud', 'Gamey', 'View'].map((category) => ( - + + {['Focus', 'Chill', 'Ideas', 'Loud', 'Gamey', 'View'].map((category) => ( - + + + + {category} - {category} - - ))} - - Rooms - - {/* Rooms */} - {data.map((room) => ( + ))} + + Rooms + + + {roomPairs.map((pair, index) => ( - - {room.title} - {room.available} - - + {pair.map((room) => ( + + image + + + {room.title} + {room.description} + Closes at: {room.Closesat} + + + + + + + + ))} ))} - + ); }; 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 0000000000000000000000000000000000000000..a66eb997f5a16e1887547c7ea835760651a5189d GIT binary patch literal 156388 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 br9Z^qL7F%O$2D!k00000NkvXXu0mjfKB literal 0 HcmV?d00001 From 874b88f270fafe875d0a6a08be5f349a6917f23c Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 10 Jun 2024 02:38:15 +0200 Subject: [PATCH 22/29] minor colour change --- frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx b/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx index 62ccfe47..9ad7a989 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx @@ -54,6 +54,7 @@ const BookRoom = () => { fontSize={wp('4%')} type="text" returnKeyType="done" + color={textColor} /> Categories From de6d2f1b3c8eeac2267a0c91126b230e9e235e52 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 10 Jun 2024 10:42:07 +0200 Subject: [PATCH 23/29] make booking complete --- .../screens/Dashboard/BookRoom.tsx | 172 ++++++++++++------ 1 file changed, 118 insertions(+), 54 deletions(-) diff --git a/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx b/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx index 9ad7a989..b8eab328 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx +++ b/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx @@ -1,7 +1,8 @@ import { React, useEffect, useState } from 'react'; -import { ScrollView, useColorScheme } from 'react-native'; -import { Icon, View, Text, Input, InputField, InputSlotButton, Button, ButtonText, Image } from '@gluestack-ui/themed'; +import { ScrollView, useColorScheme, TouchableOpacity } from 'react-native'; +import { Icon, View, Text, Input, InputField, InputSlotButton, Button, ButtonText, Image, Box } from '@gluestack-ui/themed'; import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; +import { Octicons } from '@expo/vector-icons'; import { Ionicons } from '@expo/vector-icons'; import Navbar from '../../components/NavBar'; @@ -17,6 +18,10 @@ const BookRoom = () => { 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]); @@ -43,22 +48,22 @@ const BookRoom = () => { const roomPairs = groupDataInPairs(data); return ( - + - + Book - + - Categories - + Categories + {['Focus', 'Chill', 'Ideas', 'Loud', 'Gamey', 'View'].map((category) => ( { ))} - Rooms + + Rooms + + {layout === "row" ? ( + + + + ) : ( + + + + )} + + - - {roomPairs.map((pair, index) => ( - - {pair.map((room) => ( - - image - - - {room.title} - {room.description} - Closes at: {room.Closesat} + {layout === "grid" ? ( + + {roomPairs.map((pair, index) => ( + + {pair.map((room) => ( + + image + + + {room.title} + {room.description} + Closes at: {room.Closesat} + + + + + - + + ))} + + ))} + + ) : ( + + {data.map((room) => ( + + image + + {room.title} + + {room.description} + + + Closes at: {room.Closesat} + + - ))} - - ))} - + + ))} + + )} + ); From dcf02800b4974fc3ef1f2cfba71355d21db77e60 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 10 Jun 2024 11:19:45 +0200 Subject: [PATCH 24/29] View bookings almost complete --- frontend/occupi-mobile3/app/_layout.tsx | 1 + frontend/occupi-mobile3/app/bookings.tsx | 2 +- frontend/occupi-mobile3/app/viewbookings.tsx | 7 + .../{Dashboard => Booking}/BookRoom.tsx | 3 +- .../screens/Booking/ViewBookings.tsx | 184 ++++++++++++++++++ .../screens/Login/SplashScreen.tsx | 2 +- 6 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 frontend/occupi-mobile3/app/viewbookings.tsx rename frontend/occupi-mobile3/screens/{Dashboard => Booking}/BookRoom.tsx (99%) create mode 100644 frontend/occupi-mobile3/screens/Booking/ViewBookings.tsx diff --git a/frontend/occupi-mobile3/app/_layout.tsx b/frontend/occupi-mobile3/app/_layout.tsx index 022f965c..830695a2 100644 --- a/frontend/occupi-mobile3/app/_layout.tsx +++ b/frontend/occupi-mobile3/app/_layout.tsx @@ -40,6 +40,7 @@ export default function RootLayout() { + diff --git a/frontend/occupi-mobile3/app/bookings.tsx b/frontend/occupi-mobile3/app/bookings.tsx index 7c4fb628..cc1e7546 100644 --- a/frontend/occupi-mobile3/app/bookings.tsx +++ b/frontend/occupi-mobile3/app/bookings.tsx @@ -1,4 +1,4 @@ -import BookRoom from "../screens/Dashboard/BookRoom"; +import BookRoom from "../screens/Booking/BookRoom"; export default function Home() { return ( 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/screens/Dashboard/BookRoom.tsx b/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx similarity index 99% rename from frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx rename to frontend/occupi-mobile3/screens/Booking/BookRoom.tsx index b8eab328..9fe9bb8c 100644 --- a/frontend/occupi-mobile3/screens/Dashboard/BookRoom.tsx +++ b/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx @@ -58,6 +58,7 @@ const BookRoom = () => { placeholder="Quick search for an office" fontSize={wp('4%')} type="text" + fontWeight="$light" returnKeyType="done" color={textColor} /> @@ -104,7 +105,7 @@ const BookRoom = () => { {layout === "grid" ? ( - + {roomPairs.map((pair, index) => ( { + 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 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 ( + + + + My bookings + + + + + + Sort by: + + {layout === "row" ? ( + + + + ) : ( + + + + )} + + + + {layout === "grid" ? ( + + {roomPairs.map((pair, index) => ( + + {pair.map((room) => ( + + image + + + {room.title} + {room.description} + Closes at: {room.Closesat} + + + + + + + + ))} + + ))} + + ) : ( + + {data.map((room) => ( + + image + + {room.title} + + {room.description} + + + Closes at: {room.Closesat} + + + + + + + + + ))} + + )} + + + + ); +}; + +export default ViewBookings; diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index 2ff5d66e..23230934 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/bookings'); // Navigate to Onboarding1 screen + router.navigate('/viewbookings'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount From 94f4744696341f21a90c526864bb93ed9d5c7380 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Mon, 10 Jun 2024 13:29:15 +0200 Subject: [PATCH 25/29] added selector and update mock data --- .../components/BookingsSort.tsx | 0 frontend/occupi-mobile3/package-lock.json | 6 + frontend/occupi-mobile3/package.json | 3 +- .../screens/Booking/ViewBookings.tsx | 363 ++++++++++-------- 4 files changed, 209 insertions(+), 163 deletions(-) create mode 100644 frontend/occupi-mobile3/components/BookingsSort.tsx 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/package-lock.json b/frontend/occupi-mobile3/package-lock.json index df2aaca7..69ccc304 100644 --- a/frontend/occupi-mobile3/package-lock.json +++ b/frontend/occupi-mobile3/package-lock.json @@ -53,6 +53,7 @@ "react-dom": "18.2.0", "react-hook-form": "^7.51.5", "react-native": "0.74.1", + "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", @@ -18975,6 +18976,11 @@ "resolved": "https://registry.npmjs.org/react-native-dialogs/-/react-native-dialogs-1.1.2.tgz", "integrity": "sha512-W0y22JpiywLNVYny32Z85h2zETkY9Neh48zndHJ4Byx/vS96Ex/0fhZ55hRS7XER7SBH3SHo5+TBTuX7ECHrLw==" }, + "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", diff --git a/frontend/occupi-mobile3/package.json b/frontend/occupi-mobile3/package.json index 3e72cf34..0e8d060f 100644 --- a/frontend/occupi-mobile3/package.json +++ b/frontend/occupi-mobile3/package.json @@ -60,6 +60,7 @@ "react-dom": "18.2.0", "react-hook-form": "^7.51.5", "react-native": "0.74.1", + "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", @@ -91,4 +92,4 @@ "typescript": "~5.3.3" }, "private": true -} \ No newline at end of file +} diff --git a/frontend/occupi-mobile3/screens/Booking/ViewBookings.tsx b/frontend/occupi-mobile3/screens/Booking/ViewBookings.tsx index a6d14fe2..e070e2c0 100644 --- a/frontend/occupi-mobile3/screens/Booking/ViewBookings.tsx +++ b/frontend/occupi-mobile3/screens/Booking/ViewBookings.tsx @@ -1,184 +1,223 @@ import { React, useEffect, useState } from 'react'; import { ScrollView, useColorScheme, TouchableOpacity } from 'react-native'; -import { Icon, View, Text, Input, InputField, InputSlotButton, Button, ButtonText, Image, Box } from '@gluestack-ui/themed'; +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 { 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 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 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', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + { title: 'HDMI Room', description: 'Boasting sunset views, long desks, and comfy chairs', Time: '7pm', available: true }, + ]; - 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); - const roomPairs = groupDataInPairs(data); - - return ( - - - - My bookings - - - - - - Sort by: - - {layout === "row" ? ( - - - - ) : ( - - - - )} - - - - {layout === "grid" ? ( - - {roomPairs.map((pair, index) => ( - - {pair.map((room) => ( - - image - - - {room.title} - {room.description} - Closes at: {room.Closesat} + 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" ? ( + + + + ) : ( + + + + )} + - ))} - ))} - - ) : ( - - {data.map((room) => ( - - image - - {room.title} - - {room.description} - - - Closes at: {room.Closesat} - - - - - + {layout === "grid" ? ( + + {roomPairs.map((pair, index) => ( + + {pair.map((room) => ( + + image + + + {room.title} + {room.description} + Closes at: {room.Time} + + + + + + + + ))} + + ))} + + ) : ( + + {data.map((room) => ( + + image + + {room.title} + + {room.description} + + + Your booking time: + + {room.Time} + + + - - - ))} - - )} + + + ))} + + )} - - - ); + + + ); }; export default ViewBookings; From e4b4960cb7ec4d781fe73716018f50cae2cb5d29 Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Wed, 12 Jun 2024 11:45:12 +0200 Subject: [PATCH 26/29] route to onboarding on initial startup --- frontend/occupi-mobile3/screens/Login/SplashScreen.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index 23230934..76c03222 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/viewbookings'); // Navigate to Onboarding1 screen + router.navigate('/onboarding1'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount From 150748985d93b5b41ae0425bd13c901ff725ba94 Mon Sep 17 00:00:00 2001 From: cmokou Date: Wed, 12 Jun 2024 18:13:59 +0200 Subject: [PATCH 27/29] chore: Add new screens for office details, booking receipt, and booking details --- frontend/occupi-mobile3/app/_layout.tsx | 3 + .../occupi-mobile3/app/booking-details.tsx | 7 + .../occupi-mobile3/app/booking-receipt.tsx | 7 + .../occupi-mobile3/app/office-details.tsx | 7 + frontend/occupi-mobile3/package-lock.json | 22 ++ frontend/occupi-mobile3/package.json | 3 + .../screens/Booking/BookRoom.tsx | 168 ++++---------- .../screens/Office/BookingDetails.tsx | 149 ++++++++++++ .../screens/Office/BookingReceipt.tsx | 188 +++++++++++++++ .../screens/Office/OfficeDetails.tsx | 215 ++++++++++++++++++ .../screens/Office/availableSlots.json | 9 + .../screens/Office/calendarConfig.js | 70 ++++++ 12 files changed, 728 insertions(+), 120 deletions(-) create mode 100644 frontend/occupi-mobile3/app/booking-details.tsx create mode 100644 frontend/occupi-mobile3/app/booking-receipt.tsx create mode 100644 frontend/occupi-mobile3/app/office-details.tsx create mode 100644 frontend/occupi-mobile3/screens/Office/BookingDetails.tsx create mode 100644 frontend/occupi-mobile3/screens/Office/BookingReceipt.tsx create mode 100644 frontend/occupi-mobile3/screens/Office/OfficeDetails.tsx create mode 100644 frontend/occupi-mobile3/screens/Office/availableSlots.json create mode 100644 frontend/occupi-mobile3/screens/Office/calendarConfig.js diff --git a/frontend/occupi-mobile3/app/_layout.tsx b/frontend/occupi-mobile3/app/_layout.tsx index 830695a2..8d6b75f3 100644 --- a/frontend/occupi-mobile3/app/_layout.tsx +++ b/frontend/occupi-mobile3/app/_layout.tsx @@ -47,6 +47,9 @@ 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/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/package-lock.json b/frontend/occupi-mobile3/package-lock.json index 69ccc304..cee28da8 100644 --- a/frontend/occupi-mobile3/package-lock.json +++ b/frontend/occupi-mobile3/package-lock.json @@ -31,14 +31,17 @@ "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", @@ -11699,6 +11702,7 @@ "version": "17.0.1", "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-17.0.1.tgz", "integrity": "sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw==", + "license": "MIT", "peerDependencies": { "expo": "*" } @@ -11895,6 +11899,15 @@ "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", @@ -11951,6 +11964,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", diff --git a/frontend/occupi-mobile3/package.json b/frontend/occupi-mobile3/package.json index 0e8d060f..5c472f2e 100644 --- a/frontend/occupi-mobile3/package.json +++ b/frontend/occupi-mobile3/package.json @@ -38,14 +38,17 @@ "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", diff --git a/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx b/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx index 9fe9bb8c..d82af800 100644 --- a/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx +++ b/frontend/occupi-mobile3/screens/Booking/BookRoom.tsx @@ -1,10 +1,9 @@ -import { React, useEffect, useState } from 'react'; -import { ScrollView, useColorScheme, TouchableOpacity } from 'react-native'; -import { Icon, View, Text, Input, InputField, InputSlotButton, Button, ButtonText, Image, Box } from '@gluestack-ui/themed'; -import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; -import { Octicons } from '@expo/vector-icons'; -import { Ionicons } from '@expo/vector-icons'; +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 = []; @@ -15,6 +14,7 @@ const groupDataInPairs = (data) => { }; const BookRoom = () => { + const router = useRouter(); const colorScheme = useColorScheme(); const [isDarkMode, setIsDarkMode] = useState(colorScheme === 'dark'); @@ -48,58 +48,36 @@ const BookRoom = () => { const roomPairs = groupDataInPairs(data); return ( - + - - Book + + Book + + + Quick search for an office - - - - Categories - + Categories + {['Focus', 'Chill', 'Ideas', 'Loud', 'Gamey', 'View'].map((category) => ( - - - + + + - {category} + {category} ))} - - Rooms + + Rooms {layout === "row" ? ( - + - + ) : ( - + - + )} @@ -107,102 +85,52 @@ const BookRoom = () => { {layout === "grid" ? ( {roomPairs.map((pair, index) => ( - - {pair.map((room) => ( - - image - + + {pair.map((room, idx) => ( + router.push('OfficeDetails')}> + + {room.title} - {room.description} - Closes at: {room.Closesat} + {room.description} + Closes at: {room.Closesat} - - + + + Available: now + - + ))} ))} ) : ( - {data.map((room) => ( - - image - + {data.map((room, idx) => ( + router.push('OfficeDetails')}> + + {room.title} - {room.description} + {room.description} - - Closes at: {room.Closesat} - - + + Closes at: {room.Closesat} + + + Available: now + - - + ))} )} - ); 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..ad50b27b --- /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..3d8df357 --- /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 From 1d04243facab26c46fd0e9c38f277021f8a1ff4d Mon Sep 17 00:00:00 2001 From: Loading31115 Date: Thu, 13 Jun 2024 03:33:35 +0200 Subject: [PATCH 28/29] mobile pages put together --- frontend/occupi-mobile3/components/NavBar.tsx | 10 +- frontend/occupi-mobile3/package-lock.json | 650 +++++++++++------- frontend/occupi-mobile3/package.json | 5 + .../screens/Booking/BookRoom.tsx | 12 +- .../screens/Booking/ViewBookings.tsx | 119 ++-- .../screens/Login/OtpVerification.tsx | 11 +- .../screens/Login/SplashScreen.tsx | 6 +- .../screens/Office/BookingReceipt.tsx | 4 +- .../screens/Office/OfficeDetails.tsx | 4 +- 9 files changed, 490 insertions(+), 331 deletions(-) diff --git a/frontend/occupi-mobile3/components/NavBar.tsx b/frontend/occupi-mobile3/components/NavBar.tsx index c198c9c1..0c1dd3ff 100644 --- a/frontend/occupi-mobile3/components/NavBar.tsx +++ b/frontend/occupi-mobile3/components/NavBar.tsx @@ -15,19 +15,19 @@ const NavBar = () => { - - + + {room.Date} at + {room.Time} + + +
@@ -203,9 +207,12 @@ const ViewBookings = () => { Your booking time: - - {room.Time} - + + + {room.Date} at + {room.Time} + + diff --git a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx index c702988b..91c2518f 100644 --- a/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx +++ b/frontend/occupi-mobile3/screens/Login/OtpVerification.tsx @@ -1,6 +1,6 @@ import React, { useRef, useState, useEffect } from 'react'; -import { TouchableOpacity, View, Text, StyleSheet, Alert, TextInput } from 'react-native'; -import { VStack, Box, HStack, Image, FormControl, Input, Button, Heading, Toast, useToast, ToastTitle } from '@gluestack-ui/themed'; +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'; @@ -9,7 +9,7 @@ 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 '../Login/assets/images/Occupi/file.png'; +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'; @@ -209,7 +209,6 @@ const MainText = (email : string) => { > We have sent the OTP code to { fontSize={wp('5%')} fontWeight="$light" > - {' '+email.email} + {' '+email} @@ -237,7 +236,7 @@ function AccountLink() { }} mt="auto" space="xs" - alignItems="$center" + alignItems="center" justifyContent="center" > { >
@@ -130,7 +130,7 @@ export default function SplashScreen() { useEffect(() => { const timer = setTimeout(() => { setSelectedIndex(1); // Assuming Onboarding1 is at index 1 - router.navigate('/onboarding1'); // Navigate to Onboarding1 screen + router.navigate('/home'); // Navigate to Onboarding1 screen }, 5000); // 8 seconds return () => clearTimeout(timer); // Clean up timer on component unmount diff --git a/frontend/occupi-mobile3/screens/Office/BookingReceipt.tsx b/frontend/occupi-mobile3/screens/Office/BookingReceipt.tsx index ad50b27b..f9aa32ff 100644 --- a/frontend/occupi-mobile3/screens/Office/BookingReceipt.tsx +++ b/frontend/occupi-mobile3/screens/Office/BookingReceipt.tsx @@ -9,7 +9,7 @@ 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'; +// import Barcode from 'react-native-barcode-builder'; const BookingReceipt = () => { const [selectedIndex, setSelectedIndex] = useState(2); @@ -150,7 +150,7 @@ const BookingReceipt = () => { {/* Barcode */} - + {/* */} ABC-abc-1234 diff --git a/frontend/occupi-mobile3/screens/Office/OfficeDetails.tsx b/frontend/occupi-mobile3/screens/Office/OfficeDetails.tsx index 3d8df357..eea6e5aa 100644 --- a/frontend/occupi-mobile3/screens/Office/OfficeDetails.tsx +++ b/frontend/occupi-mobile3/screens/Office/OfficeDetails.tsx @@ -79,14 +79,14 @@ const OfficeDetails = () => { {/* Image Section */} - + /> */} {/* Details Section */} From dd62f30c49272320d48a2247d1bf88d4ddecf085 Mon Sep 17 00:00:00 2001 From: Kamogelo Moeketse Date: Sun, 16 Jun 2024 00:19:41 +0200 Subject: [PATCH 29/29] removed unecessary babel file --- frontend/occupi-mobile3/.babelrc | 3 --- frontend/occupi-mobile3/screens/Login/SplashScreen.tsx | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 frontend/occupi-mobile3/.babelrc 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/screens/Login/SplashScreen.tsx b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx index 7d30fb1b..e0cc9af7 100644 --- a/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx +++ b/frontend/occupi-mobile3/screens/Login/SplashScreen.tsx @@ -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