diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..139742de1649a92ebbd8ecc4a38db9420a3cecc6 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,53 @@ +image: node:latest + +stages: + - build + - test + - deploy + +build-job: + stage: build + script: + - echo "Building application..." +# - npm install -g eas-cli +# - npm ci +# - EXPO_TOKEN=$EAS_TOKEN eas build --platform android --platform ios --profile production --non-interactive + - echo "Application successfully built." + +test-job: + stage: test + script: + - echo "Running unit tests..." + - echo "Unit tests complete" + +deploy-job: + stage: deploy + environment: production + script: + - echo "Deploying application..." +# - curl -o builds/my-app.apk "$(eas build:status --json | jq -r '.artifacts.buildUrl')" + - echo "Application successfully deployed." +# artifacts: +# paths: +# - builds/my-app.apk + rules: + - if: '$CI_COMMIT_BRANCH == "main"' + dependencies: + - build-job + + +# # à supprimer à l'avenir +# # deploy-job-test: +# # stage: deploy +# # environment: production +# # script: +# # - echo "Deploying application..." +# # - curl -o builds/my-app.apk "$(eas build:status --json | jq -r '.artifacts.buildUrl')" +# # - echo "Application successfully deployed." +# # artifacts: +# # paths: +# # - builds/my-app.apk +# # rules: +# # - if: '$CI_COMMIT_BRANCH == "develop"' +# # dependencies: +# # - build-job \ No newline at end of file diff --git a/App.tsx b/App.tsx index 2633a5c53b4b0793c035e273e18c5c191533a240..4b3b1c00d3e7960846bc4969b9106cd7d09e05ae 100644 --- a/App.tsx +++ b/App.tsx @@ -3,17 +3,38 @@ import {I18nextProvider, useTranslation} from "react-i18next"; import i18n from "./translation/i18n"; // Importez l'instance déjà initialisée import { SafeAreaProvider } from "react-native-safe-area-context"; import StackNavigator from "./routes/StackNavigator"; -import Question from "./screens/Question/Question"; +import { useEffect } from 'react'; +import * as SplashScreen from 'expo-splash-screen'; +import {QueryClient, QueryClientProvider} from "@tanstack/react-query"; +const queryClient = new QueryClient(); + export default function App() { - LogBox.ignoreAllLogs(true); + // LogBox.ignoreAllLogs(true); + useEffect(() => { + async function prepare() { + try { + await SplashScreen.preventAutoHideAsync(); // affichage + + // Chargement des fonts, appels API externes, etc... + + // On fait une pause 2 sec pour simuler un chargement lent + await new Promise(resolve => setTimeout(resolve, 2000)); + + } catch (e) { console.warn(e); } finally { + await SplashScreen.hideAsync(); // masquage + } + } prepare(); }, []); + const { t } = useTranslation(); return ( - <SafeAreaProvider> - <I18nextProvider i18n={i18n}> - <StackNavigator/> - </I18nextProvider> - </SafeAreaProvider> + <QueryClientProvider client={queryClient}> + <SafeAreaProvider> + <I18nextProvider i18n={i18n}> + <StackNavigator/> + </I18nextProvider> + </SafeAreaProvider> + </QueryClientProvider> ); } diff --git a/app.json b/app.json index 74d20a723fc8508cdff49ce848df7a8e10300ff3..c930458a7a7a4c98a26c08f93a60de55ca561be3 100644 --- a/app.json +++ b/app.json @@ -3,12 +3,13 @@ "name": "vili", "slug": "vili", "version": "1.0.0", + "newArchEnabled": true, "orientation": "portrait", "icon": "./assets/icon.png", "userInterfaceStyle": "light", "splash": { - "image": "./assets/splash.png", - "resizeMode": "contain", + "image": "./assets/splashscreen.png", + "resizeMode": "cover", "backgroundColor": "#ffffff" }, "ios": { @@ -22,6 +23,11 @@ }, "web": { "favicon": "./assets/favicon.png" + }, + "extra": { + "eas": { + "projectId": "8ee47c40-1e74-451c-972a-e1cc75ab11ff" + } } } } diff --git a/assets/BackgroundQuestion.png b/assets/BackgroundQuestion.png new file mode 100644 index 0000000000000000000000000000000000000000..fa5cdaa069e93679016f12bd8b8989e1b15ed607 Binary files /dev/null and b/assets/BackgroundQuestion.png differ diff --git a/assets/FondDuo.png b/assets/FondDuo.png new file mode 100644 index 0000000000000000000000000000000000000000..a2abf1e8d90e9daf13cc5217a54b9ae861103cc2 Binary files /dev/null and b/assets/FondDuo.png differ diff --git a/assets/GoBackNavigation.png b/assets/GoBackNavigation.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce5f9c1812181299641b7ecf871b5f404a0d05f Binary files /dev/null and b/assets/GoBackNavigation.png differ diff --git a/assets/GoHomeNavigation.png b/assets/GoHomeNavigation.png new file mode 100644 index 0000000000000000000000000000000000000000..68b716cb9fcb970acf527989ac09384f53062bf9 Binary files /dev/null and b/assets/GoHomeNavigation.png differ diff --git a/assets/ImageGenerateQuiz.png b/assets/ImageGenerateQuiz.png new file mode 100644 index 0000000000000000000000000000000000000000..47a561544bbad44158e1165cf92d583942b2527f Binary files /dev/null and b/assets/ImageGenerateQuiz.png differ diff --git a/assets/MenuBackground.png b/assets/MenuBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9ece3d28dbf3b8b4e92329d3e6486d13561184 Binary files /dev/null and b/assets/MenuBackground.png differ diff --git a/assets/Name.png b/assets/Name.png new file mode 100644 index 0000000000000000000000000000000000000000..48c1d284cce9aa4a66f1d8cfd47f84b5cfa72d2c Binary files /dev/null and b/assets/Name.png differ diff --git a/assets/ProfilBaseImage.png b/assets/ProfilBaseImage.png new file mode 100644 index 0000000000000000000000000000000000000000..123c902c001c1d4dd715c364adb55b21d129860d Binary files /dev/null and b/assets/ProfilBaseImage.png differ diff --git a/assets/TitleApp.png b/assets/TitleApp.png new file mode 100644 index 0000000000000000000000000000000000000000..40dba7c972a9121502a2e3fa6bac3af9072cea51 Binary files /dev/null and b/assets/TitleApp.png differ diff --git a/assets/add.png b/assets/add.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca8aad752ac7e6f52cb5fd353a3955526ea037c Binary files /dev/null and b/assets/add.png differ diff --git a/assets/icon.png b/assets/icon.png index a0b1526fc7b78680fd8d733dbc6113e1af695487..faee7622c57c0e59493f8dffdf1998d64e14b981 100644 Binary files a/assets/icon.png and b/assets/icon.png differ diff --git a/assets/splashscreen.png b/assets/splashscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..7fb90c52530abcbaf7a7f980aeef669199e6d076 Binary files /dev/null and b/assets/splashscreen.png differ diff --git a/assets/stars.png b/assets/stars.png new file mode 100644 index 0000000000000000000000000000000000000000..09c430621cb58984d1b88f1e46e5d71c2b9a3284 Binary files /dev/null and b/assets/stars.png differ diff --git a/assets/uWin.png b/assets/uWin.png new file mode 100644 index 0000000000000000000000000000000000000000..9456efb9f5b9be207760a222ab4871ea3d73eac8 Binary files /dev/null and b/assets/uWin.png differ diff --git a/components/Multiplayer/ModalCreateLobby.tsx b/components/Multiplayer/ModalCreateLobby.tsx new file mode 100644 index 0000000000000000000000000000000000000000..831538c03dcaecd042919dbb6a30e31cd89a5493 --- /dev/null +++ b/components/Multiplayer/ModalCreateLobby.tsx @@ -0,0 +1,97 @@ +import { Modal, View, Text, TextInput, StyleSheet } from "react-native"; +import WhiteButton from "../buttons/WhiteButton"; +import BlueButton from "../buttons/BlueButton"; +import { useState } from "react"; + +interface Props { + showModal: boolean; + onClosePressed: () => void; + onPlayPressed: (nbPlayer: number) => void; +} + +export default function ModalCreateLobby({showModal, onClosePressed, onPlayPressed}: Props) { + const [nbPlayer, setNbPlayer] = useState<number>(1); + return ( + <Modal visible={showModal} animationType="slide" transparent={true}> + <View style={styles.centeredView}> + <View style={styles.modalView}> + <Text style={styles.title}>CREATE A LOBBY</Text> + <View style={styles.inputGroup}> + <Text>NUMBER OF PLAYER</Text> + <TextInput style={styles.input} defaultValue={nbPlayer.toString()} onChangeText={(text) => setNbPlayer(Number(text))}/> + </View> + <View style={styles.buttonGroup}> + <View style={styles.button}> + <WhiteButton text="CLOSE" onPress={onClosePressed} isDisabled={false}/> + </View> + <View style={styles.button}> + <BlueButton text="PLAY" onPress={() => onPlayPressed(nbPlayer)} isDisabled={false}/> + </View> + </View> + </View> + </View> + </Modal> + ); +} + +const styles = StyleSheet.create({ + centeredView: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: 'rgba(0, 0, 0, 0.5)' + }, + modalView: { + display: 'flex', + justifyContent: 'space-between', + height: 400, + width: '90%', + margin: '10%', + padding: '5%', + backgroundColor: 'white', + borderRadius: 20, + alignItems: 'center', + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.25, + shadowRadius: 4, + elevation: 5, + }, + buttonGroup: { + flexDirection: 'row', + justifyContent: 'space-between', + width: '100%', + }, + button: { + width: '45%', + }, + title: { + fontSize: 40, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + alignSelf: "center", // Centre uniquement le titre + textAlign: 'center', + }, + inputGroup: { + width: '100%', + marginBottom: 20, + }, + input: { + width: "100%", + height: 70, + backgroundColor: "white", + borderColor: "#2ec7ff", + borderWidth: 3, + borderRadius: 8, + paddingLeft: 10, + elevation: 5, + shadowColor: "#000", + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + }, +}); \ No newline at end of file diff --git a/components/Multiplayer/ModalInvitePlayer.tsx b/components/Multiplayer/ModalInvitePlayer.tsx new file mode 100644 index 0000000000000000000000000000000000000000..de1e14c9a6b0bf469f19a9e37e74e695260e6870 --- /dev/null +++ b/components/Multiplayer/ModalInvitePlayer.tsx @@ -0,0 +1,75 @@ +import { Modal, View, Text, StyleSheet, Image } from "react-native"; +import WhiteButton from "../buttons/WhiteButton"; + +interface Props { + showModal: boolean; + onClosePressed: () => void; + roomId?: string; +} + +export default function ModalInvitePlayer({showModal, onClosePressed, roomId}: Props) { + return ( + <Modal visible={showModal} animationType="slide" transparent={true}> + <View style={styles.centeredView}> + <View style={styles.modalView}> + <Text style={styles.title}>JOIN</Text> + <Image source={require('../../assets/favicon.png')}/> + <Text style={styles.or}>OR</Text> + <Text style={styles.link}>Room ID: {roomId}</Text> + <View style={styles.buttonGroup}> + <WhiteButton text="CLOSE" onPress={onClosePressed} isDisabled={false}/> + </View> + </View> + </View> + </Modal> + ); +} + +const styles = StyleSheet.create({ + centeredView: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: 'rgba(0, 0, 0, 0.5)' + }, + modalView: { + display: 'flex', + justifyContent: 'space-between', + height: '50%', + width: '90%', + margin: '10%', + padding: '5%', + backgroundColor: 'white', + borderRadius: 20, + alignItems: 'center', + shadowColor: '#000', + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.25, + shadowRadius: 4, + elevation: 5, + }, + buttonGroup: { + flexDirection: 'row', + justifyContent: 'space-between', + width: '100%', + }, + title: { + fontSize: 40, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + alignSelf: "center", + textAlign: 'center', + }, + or: { + fontSize: 32, + }, + link: { + color: '#0000EE', + fontSize: 22, + fontWeight: "bold", + } +}); \ No newline at end of file diff --git a/components/PlayQuiz/AboutAQuiz.tsx b/components/PlayQuiz/AboutAQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ed0162622452fc1ef302a33e4310012f2b7c3ec5 --- /dev/null +++ b/components/PlayQuiz/AboutAQuiz.tsx @@ -0,0 +1,58 @@ +import React from "react"; +import { View, Text, StyleSheet } from "react-native"; +import {Quiz} from "../../models/Quiz"; +import {QuizInformations} from "../../models/QuizInformations"; +import {RunInformations} from "../../models/RunInformations"; + +interface Props { + runInformations?: RunInformations; + quizInformations?: QuizInformations; +} +export default function AboutAQuiz({runInformations, quizInformations} : Props) { + return ( + <View style={styles.container}> + <Text style={styles.title}>About this quiz</Text> + <View style={styles.separator} /> + <View style={styles.infoContainer}> + <Text style={styles.text}>Category : {quizInformations ? quizInformations.category.name : "?"}</Text> + {/*<Text style={styles.text}>Question : {quizInformations ? quizInformations.o : "?"}/{quiz ? quiz.questionCount : "?"}</Text>*/} + <Text style={styles.text}>Score : {runInformations ? runInformations.score : "?"}</Text> + </View> + + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + backgroundColor: "white", // Fond blanc + borderRadius: 10, // Coins arrondis + padding: 20, // Espacement intérieur + shadowColor: "#000", // Couleur de l'ombre + shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre + shadowOpacity: 0.25, // Opacité de l'ombre + shadowRadius: 3.84, // Flou de l'ombre + elevation: 5, // Ombre pour Android + marginVertical: 10, // Espacement vertical + }, + title: { + fontSize: 18, + fontWeight: "bold", + marginBottom: 10, // Espacement entre le titre et le séparateur + }, + separator: { + height: 3, // Épaisseur de la ligne + backgroundColor: "#ddd", // Couleur de la ligne + marginBottom: 15, // Espacement entre la ligne et le contenu + }, + text: { + fontSize: 16, + fontWeight: "bold", + marginBottom: 10, // Espacement entre la catégorie et les informations + }, + infoContainer: { + flexDirection: "column", // Aligne les éléments horizontalement + justifyContent: "space-between", // Aligne les éléments verticalement + gap: 10, // Espacement entre les informations + }, +}); diff --git a/components/PlayQuiz/InputPlayQuiz.tsx b/components/PlayQuiz/InputPlayQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4a4d5cf08ae498fb6ec8fa48b2c37f72551e964e --- /dev/null +++ b/components/PlayQuiz/InputPlayQuiz.tsx @@ -0,0 +1,62 @@ +import React from "react"; +import { TextInput, View, StyleSheet, Text } from "react-native"; + +interface Props { + title?: string; + setText: (text: string) => void; + noTitle?: boolean; + placeholder?: string; + numeric?: boolean; + defaultValue?: string; + isSecure?: boolean; +} + +export default function InputPlayQuiz({ title, setText, noTitle, placeholder, numeric, defaultValue, isSecure=false }: Props) { + return ( + <View style={styles.container}> + {!noTitle && title && <Text style={styles.title}>{title}</Text>} + <TextInput + style={styles.input} + placeholder={placeholder || ""} + placeholderTextColor="#bebebe" + keyboardType={numeric ? "numeric" : "default"} // Clavier conditionnel + onChangeText={(text) => { + setText(text); + }} + defaultValue={defaultValue} + secureTextEntry={isSecure} + /> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "column", + alignItems: "flex-start", + width: "100%", + }, + input: { + width: "100%", + height: 70, + backgroundColor: "white", + borderColor: "#2ec7ff", + borderWidth: 3, + borderRadius: 8, + paddingLeft: 10, + elevation: 5, + shadowColor: "#000", + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + }, + title: { + fontSize: 20, + fontWeight: "bold", + marginBottom: 5, + color: "#333", + textAlign: "left", + width: "100%", + }, +}); diff --git a/components/PlayQuiz/PlayQuizMod.tsx b/components/PlayQuiz/PlayQuizMod.tsx new file mode 100644 index 0000000000000000000000000000000000000000..803b11740fd6799932d11dfa7db19a44e2ccc81e --- /dev/null +++ b/components/PlayQuiz/PlayQuizMod.tsx @@ -0,0 +1,9 @@ +import {View, Text} from "react-native"; + +export default function PlayQuizMod() { + return ( + <View> + <Text>PlayQuizMod</Text> + </View> + ) +} \ No newline at end of file diff --git a/components/PlayQuiz/RunStartedList.tsx b/components/PlayQuiz/RunStartedList.tsx new file mode 100644 index 0000000000000000000000000000000000000000..34da38583da6b151ca2c3c9db5536301a31968d4 --- /dev/null +++ b/components/PlayQuiz/RunStartedList.tsx @@ -0,0 +1,130 @@ +import React from "react"; +import { FlatList, View, Text, StyleSheet, TouchableOpacity, ActivityIndicator } from "react-native"; +import {RunsInformationsAllRuns} from "../../models/RunsInformationsAllRuns"; + + + +/** + * QuizList : Un composant affichant une liste de quiz avec leur titre, nombre de questions, et catégorie. + * + * @component + * + * @param navigation - Propriété de navigation utilisée pour naviguer vers l'écran "InformationsOfQuiz". + * @param quizList - Liste des quiz à afficher. Peut être null ou undefined. + * @param isLoadingData - Boolean indiquant si les données sont en cours de chargement. + * + * @example + * <QuizList + * navigation={navigation} + * quizList={quizzes} + * isLoadingData={isLoading} + * /> + * + * @description + * - Ce composant gère trois états : + * 1. Chargement : Affiche un spinner si `isLoadingData` est true. + * 2. Liste des quiz : Affiche une liste interactive des quiz si `quizList` contient des éléments. + * 3. Liste vide : Affiche un message si `quizList` est vide. + * + * - Chaque quiz affiche : + * - Son code en tant que titre. + * - Son nombre total de questions. + * - Sa catégorie, affichée en majuscules. + * + * @returns Un composant React contenant une liste interactive de quiz ou des messages en fonction de l'état. + */ +interface Props { + runList: RunsInformationsAllRuns[] | undefined; + onRunPressed:(runInfo: RunsInformationsAllRuns) => void; + isLoadingData: boolean; +} +export default function RunStartedList({ runList, isLoadingData, onRunPressed }: Props) { + const renderQuizItem = ({ item }: { item: RunsInformationsAllRuns }) => ( + <TouchableOpacity style={styles.quizItem} onPress={() => onRunPressed(item)}> + <Text style={styles.quizTitle}>{item.quiz.name ? item.quiz.name : item.id}</Text> + <Text style={styles.quizDetails}>{item.quiz.category ? item.quiz.category.name : "Community quiz"}</Text> + </TouchableOpacity> + ); + + return ( + <View style={styles.container}> + {isLoadingData ? ( + <View style={styles.loadingContainer}> + <ActivityIndicator size="large" color="#2b73fe" /> + <Text style={styles.loadingText}>Loading quizzes...</Text> + </View> + ) : runList && runList.length > 0 ? ( + <FlatList + data={runList} + renderItem={renderQuizItem} + keyExtractor={(item) => item.id} + showsVerticalScrollIndicator={true} + contentContainerStyle={styles.listContent} + /> + ) : ( + <Text style={styles.emptyMessage}>No quizzes available.</Text> + )} + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: "white", + padding: 10, + borderRadius: 10, + borderColor: "#fafafa", + borderWidth: 3, + elevation: 5, // Ombre pour Android + shadowColor: "#000", // Ombre pour iOS + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + width: "100%", // Assurez-vous que le conteneur occupe toute la largeur + }, + listContent: { + }, + quizItem: { + backgroundColor: "#f3f3f3", + padding: 15, + borderRadius: 10, + marginVertical: 5, + elevation: 3, // Ombre pour Android + shadowColor: "#000", // Ombre pour iOS + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.2, + shadowRadius: 2, + width: "100%", + alignSelf: "center", // Centre les éléments dans leur conteneur + }, + quizTitle: { + fontSize: 22, + fontWeight: "bold", + color: "#000", + marginBottom: 5, + textAlign: "center", + }, + quizDetails: { + fontSize: 18, + color: "#555", + textAlign: "center", + }, + emptyMessage: { + fontSize: 18, + color: "#888", + textAlign: "center", + marginTop: 20, + }, + loadingContainer: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, + loadingText: { + fontSize: 16, + color: "#555", + marginTop: 10, + textAlign: "center", + }, +}); diff --git a/components/PlayQuiz/SelectListBoxCategory.tsx b/components/PlayQuiz/SelectListBoxCategory.tsx new file mode 100644 index 0000000000000000000000000000000000000000..95715e1670eafdd2140aebc8788a4d80e28cff98 --- /dev/null +++ b/components/PlayQuiz/SelectListBoxCategory.tsx @@ -0,0 +1,84 @@ +import { View, StyleSheet, Text } from "react-native"; +import { SelectList } from "react-native-dropdown-select-list"; +import React from "react"; +import { Category } from "../../models/Quiz"; + +interface Props { + data: Category[], // La liste des catégories + setSelected: (val: Category) => void, // Fonction pour gérer la sélection d'une catégorie + title: string, // Titre affiché au-dessus de la liste +} + +export default function SelectListBoxCategory({ data, setSelected, title }: Props) { + // Transformer les données dans le format attendu + const transformedData = data.map((category) => ({ + key: category.id.toString(), // Sauvegarde l'ID en tant que clé + value: category.name, // Affiche le nom + })); + + return ( + <View style={styles.container}> + <View style={styles.dropdownContainer}> + <Text style={styles.title}>{title}</Text> + <SelectList + setSelected={(key: string) => { + // Trouver la catégorie sélectionnée à partir de son ID + const selectedCategory = data.find((category) => category.id.toString() === key); + if (selectedCategory) { + setSelected(selectedCategory); + } + }} + data={transformedData} // Données transformées pour SelectList + save="key" // Sauvegarde la clé (ID) + dropdownStyles={styles.dropdownStyles} + boxStyles={styles.boxStyles} + inputStyles={styles.inputStyles} + /> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + alignItems: "center", + width: "100%", + }, + dropdownContainer: { + width: "100%", + }, + title: { + fontSize: 20, + fontWeight: "bold", + marginBottom: 5, + color: "#333", + textAlign: "left", + }, + dropdownStyles: { + position: "absolute", + width: "100%", + top: 40, + zIndex: 2, + backgroundColor: "white", + borderColor: "black", + borderWidth: 1, + borderRadius: 8, + }, + boxStyles: { + backgroundColor: "white", + borderColor: "#bebebe", + borderWidth: 2, + borderRadius: 8, + height: 70, + alignItems: "center", + elevation: 5, + shadowColor: "#000", + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + }, + inputStyles: { + fontSize: 18, + color: "black", + }, +}); diff --git a/components/PlayQuiz/SelectListBoxString.tsx b/components/PlayQuiz/SelectListBoxString.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5bca1d5d01701c01dea451389bc92ac08f4687a1 --- /dev/null +++ b/components/PlayQuiz/SelectListBoxString.tsx @@ -0,0 +1,74 @@ +import { View, StyleSheet, Text } from "react-native"; +import { SelectList } from "react-native-dropdown-select-list"; +import React from "react"; + +interface Props { + data: any, + setSelected: (val: string) => void, + title: string, + +} + +export default function SelectListBoxString({data, setSelected, title} : Props) { + + return ( + <View style={styles.container}> + <View style={styles.dropdownContainer}> + <Text style={styles.title}>{title}</Text> + <SelectList + setSelected={(val: any) => setSelected(val)} + data={data} + save="value" + dropdownStyles={styles.dropdownStyles} // Applique un style personnalisé au menu déroulant + boxStyles={styles.boxStyles} // Applique un style personnalisé au champ de saisie + inputStyles={styles.inputStyles} + /> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + alignItems: "center", + width: '100%', + }, + dropdownContainer: { + width: "100%", + }, + title: { + fontSize: 20, + fontWeight: "bold", // Met le texte en gras + marginBottom: 5, // Ajoute un espace entre le titre et la boîte déroulante + color: "#333", // Couleur du texte + textAlign: "left", // Aligne le texte à gauche + }, + dropdownStyles: { + position: "absolute", // Rend le dropdown flottant + width: "100%", // Ajustez la largeur du dropdown + top: 40, // Ajustez la position verticale + zIndex: 2, // Assure que le menu apparaît au-dessus + backgroundColor: "white", // Ajoute une couleur de fond + borderColor: "black", // Optionnel : bordure de couleur + borderWidth: 1, // Optionnel : épaisseur de la bordure + borderRadius: 8, // Optionnel : coins arrondis + }, + boxStyles: { + backgroundColor: "white", + borderColor: "#bebebe", + borderWidth: 2, + borderRadius: 8, + height: 70, // Hauteur augmentée + alignItems: "center", + elevation: 5, + // Ombre pour iOS + shadowColor: "#000", + shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre en bas + shadowOpacity: 0.25, // Opacité de l'ombre + shadowRadius: 3.84, // Flou de l'ombre + }, + inputStyles: { + fontSize: 18, // Taille du texte augmentée + color: "black", // Couleur du texte + }, +}); diff --git a/components/PlayQuiz/SelectMode.tsx b/components/PlayQuiz/SelectMode.tsx new file mode 100644 index 0000000000000000000000000000000000000000..17a6535d44a7c4c268542903f95ff77d8f48a6cf --- /dev/null +++ b/components/PlayQuiz/SelectMode.tsx @@ -0,0 +1,74 @@ +import { View, Text, StyleSheet, TouchableOpacity } from "react-native"; +import { SelectModeType } from "../../models/SelectModeType"; + +interface Props { + mode: SelectModeType; + setMode: (mode: SelectModeType) => void; +} + +export default function SelectMode({ mode, setMode }: Props) { + return ( + <View style={styles.container}> + <View style={styles.buttonContainer}> + <TouchableOpacity onPress={() => setMode("play")} style={{marginLeft: '10%'}}> + <Text style={[styles.text, mode === "play" && styles.activeText]}>Play a quiz</Text> + </TouchableOpacity> + <View style={[styles.bar, mode === "play" ? styles.activeBar : styles.inactiveBar]} /> + </View> + + <View style={styles.buttonContainer}> + <TouchableOpacity onPress={() => setMode("join")} style={{marginRight: '10%'}}> + <Text style={[styles.text, mode === "join" && styles.activeText]}>Join a quiz</Text> + </TouchableOpacity> + <View style={[styles.bar, mode === "join" ? styles.activeBar : styles.inactiveBar]} /> + </View> + + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: 'flex', + width: '100%', + height: '10%', + flexDirection: 'row', + backgroundColor: '#f3f3f3', + borderRadius: 10, + justifyContent: 'space-around', + alignItems: 'center', + // Ombre pour Android + elevation: 5, + // Ombre pour iOS + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre en bas + shadowOpacity: 0.25, // Opacité de l'ombre + shadowRadius: 3.84, // Flou de l'ombre + }, + buttonContainer: { + display: 'flex', + flexDirection: 'column', + width: '40%', + alignItems: 'center', + gap: "5%", + }, + text: { + fontSize: 25, + color: '#bebebe', + }, + activeText: { + color: '#2ec7ff', + }, + bar: { + width: '100%', + height: 4, + marginTop: 4, + borderRadius: 10, + }, + activeBar: { + backgroundColor: '#2ec7ff', // Couleur pour le bouton actif + }, + inactiveBar: { + backgroundColor: '#bebebe', // Couleur grise pour les boutons inactifs + }, +}); diff --git a/components/PlayingQuiz/ComfirmModal.tsx b/components/PlayingQuiz/ComfirmModal.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4b91e825ff3c9e79afc85b554ce4075b5b494881 --- /dev/null +++ b/components/PlayingQuiz/ComfirmModal.tsx @@ -0,0 +1,105 @@ +import React from "react"; +import { + Modal, + View, + Text, + StyleSheet, + TouchableOpacity, + TouchableWithoutFeedback, +} from "react-native"; +import Icon from "react-native-vector-icons/MaterialIcons"; +import BlueButton from "../buttons/BlueButton"; // Pour l'icône de fermeture + +interface Props { + visible: boolean; + onClose: () => void; + onConfirm: () => void; +} + +export default function ConfirmModal({ visible, onClose, onConfirm }: Props) { + return ( + <Modal + animationType="slide" + transparent={true} + visible={visible} + onRequestClose={onClose} // Ferme la modal en cas d'interaction système + > + <TouchableWithoutFeedback onPress={onClose}> + <View/> + </TouchableWithoutFeedback> + <View style={styles.modalContainer}> + <TouchableOpacity style={styles.closeButton} onPress={onClose}> + <Icon name="close" size={24} color="#000" /> + </TouchableOpacity> + <Text style={styles.title}>WOULD YOU LIKE TO RETURN TO THE MENU ?</Text> + <View style={styles.separator} /> + <View style={styles.buttonContainer}> + <BlueButton text={"CONFIRM"} onPress={onConfirm} isDisabled={false}/> + </View> + </View> + </Modal> + ); +} + +const styles = StyleSheet.create({ + overlay: { + flex: 1, + backgroundColor: "rgba(0, 0, 0, 0.5)", + }, + modalContainer: { + position: "absolute", + top: "40%", + left: "10%", + right: "10%", + backgroundColor: "white", + borderRadius: 10, + padding: 20, + alignItems: "center", + elevation: 5, + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.25, + shadowRadius: 4, + }, + closeButton: { + position: "absolute", + top: 10, + right: 10, + zIndex: 1, + }, + title: { + fontSize: 16, + fontWeight: "bold", + color: "#000", + textAlign: "center", + marginVertical: 20, + }, + separator: { + width: "100%", + height: 2, + backgroundColor: "#bebebe", + marginVertical: 10, + }, + confirmButton: { + backgroundColor: "#1FA9FF", + borderRadius: 8, + paddingVertical: 10, + paddingHorizontal: 20, + alignItems: "center", + justifyContent: "center", + marginTop: 10, + width: "80%", + }, + confirmButtonText: { + color: "#fff", + fontSize: 16, + fontWeight: "bold", + }, + buttonContainer: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + width: "80%", + marginTop: 10, + }, +}); diff --git a/components/PlayingQuiz/EndQuiz/EndQuizListPlayer.tsx b/components/PlayingQuiz/EndQuiz/EndQuizListPlayer.tsx new file mode 100644 index 0000000000000000000000000000000000000000..819fabeaea65c23577a6e39aa4a746c224d2bb45 --- /dev/null +++ b/components/PlayingQuiz/EndQuiz/EndQuizListPlayer.tsx @@ -0,0 +1,86 @@ +import React from "react"; +import { FlatList, View, Text, StyleSheet, Image } from "react-native"; +import {User} from "../../../models/User"; + +interface Props { + users: User[]; + maxScore: number; +} + +export default function EndQuizListPlayer({ users, maxScore }: Props) { + const renderUser = ({ item, index }: { item: User; index: number }) => ( + <View style={[styles.userContainer, index === 0 && styles.firstPlace]}> + <Image + source={require("../../../assets/ProfilBaseImage.png")} // Replace with actual profile picture if available + style={styles.avatar} + /> + <View style={styles.infoContainer}> + <Text style={[styles.username, index === 0 && styles.firstPlaceText]}> + {item.username.toUpperCase()} + </Text> + <Text style={styles.score}> + {10 + index}/{maxScore} {/* Adjust score logic as needed */} + </Text> + </View> + </View> + ); + + return ( + <View style={styles.container}> + <FlatList + data={users} + renderItem={renderUser} + keyExtractor={(item) => item.id.toString()} + showsVerticalScrollIndicator={false} + /> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + width: "100%", + padding: 20, + backgroundColor: "#fff", + borderRadius: 20, + }, + userContainer: { + flexDirection: "row", + alignItems: "center", + backgroundColor: "#f9f9f9", + borderRadius: 10, + padding: 15, + marginBottom: 10, + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 3, + elevation: 2, + }, + firstPlace: { + // backgroundColor: "#ffe700", + // shadowColor: "#ff9900", + // shadowOpacity: 0.3, + }, + avatar: { + width: 40, + height: 40, + borderRadius: 25, + marginRight: 15, + }, + infoContainer: { + flex: 1, + }, + username: { + fontSize: 18, + fontWeight: "bold", + color: "#333", + }, + firstPlaceText: { + // color: "#ff9900", + }, + score: { + fontSize: 16, + color: "#666", + }, +}); diff --git a/components/PlayingQuiz/EndQuiz/UserScore.tsx b/components/PlayingQuiz/EndQuiz/UserScore.tsx new file mode 100644 index 0000000000000000000000000000000000000000..65836228e260ddff5bbf4f40f77a89320e37072b --- /dev/null +++ b/components/PlayingQuiz/EndQuiz/UserScore.tsx @@ -0,0 +1,79 @@ +import { View, Text, StyleSheet, Image } from "react-native"; +import {User} from "../../../models/User"; + +interface Props { + user: User; + score: number; + maxScore: number; + isFirst: boolean; +} + +export default function UserScore({ user, score, maxScore, isFirst }: Props) { + + function shortenString(input: string): string { + if (input.length <= 5) { + return input; // Si la chaîne est déjà de 4 caractères ou moins, on la retourne telle quelle + } + return `${input.slice(0, 5)}...`; // Garde les 4 premiers caractères et ajoute "..." + } + + return ( + <View style={styles.container}> + <View style={[styles.avatarContainer, isFirst && styles.firstAvatar]}> + <Image + source={require('../../../assets/ProfilBaseImage.png')} // URL de l'avatar ou placeholder + style={styles.avatar} + /> + </View> + <Text style={styles.userName}>{shortenString(user.username.toUpperCase())}</Text> + <Text style={styles.userScore}> + {score}/{maxScore} + </Text> + </View> + ); +} + + + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "space-around", + marginHorizontal: 10, + }, + avatarContainer: { + width: 70, + height: 70, + borderRadius: 50, + backgroundColor: "#d9e3f0", // Fond gris clair + alignItems: "center", + justifyContent: "center", + }, + firstAvatar: { + width: 90, + height: 90, + // borderWidth: 3, // Ajoute une bordure pour le premier utilisateur + // borderColor: "#FFD700", // Couleur or pour marquer le premier + }, + avatar: { + width: "100%", + height: "100%", + resizeMode: "cover", + }, + userName: { + fontSize: 16, + fontWeight: "bold", + color: "#000", + marginTop: 5, + textAlign: "center", + }, + userScore: { + fontSize: 14, + fontWeight: "500", + color: "#333", + textAlign: "center", + marginTop: 5, + }, +}); diff --git a/components/PlayingQuiz/GoHomeButton.tsx b/components/PlayingQuiz/GoHomeButton.tsx new file mode 100644 index 0000000000000000000000000000000000000000..56f24766d57a1d56f8d761fc9d18eedac4bc3d0e --- /dev/null +++ b/components/PlayingQuiz/GoHomeButton.tsx @@ -0,0 +1,21 @@ +import {Image, StyleSheet, TouchableOpacity} from "react-native"; +import {NavigationProp} from "@react-navigation/native"; + +interface Props{ + navigation: NavigationProp<any> + onPress: (bool:boolean) => void +} + + +export default function GoHomeButton({navigation, onPress}: Props){ + const handleGoHomeButtonPressed = () =>{ + onPress(true); + } + + return ( + <TouchableOpacity onPress={handleGoHomeButtonPressed}> + <Image source={require('../../assets/GoHomeNavigation.png')} /> + </TouchableOpacity> + ) +} + diff --git a/components/Profil/LineOfUserStat.tsx b/components/Profil/LineOfUserStat.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9a718af9ebb75ce9a47cbdd863943a198e93b842 --- /dev/null +++ b/components/Profil/LineOfUserStat.tsx @@ -0,0 +1,45 @@ +import {View, Text, StyleSheet} from "react-native"; + +export interface Props { + title: string; + value: string; + isLast?: boolean; +} + +export default function LineOfUserStat({title, value, isLast}: Props) { + return ( + <> + <View style={styles.container}> + <Text style={styles.textTitle}>{title} :</Text> + <Text style={styles.textValue}>{value}</Text> + </View> + {!isLast &&<View style={styles.separator} />} + </> + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + width: "85%", + }, + textTitle: { + fontWeight: "bold", + fontSize: 20, + color: "#555", + }, + textValue: { + fontStyle: "normal", + fontWeight: "bold", + fontSize: 20, + color: "#00B3F4", + }, + separator: { + width: "90%", + height: 1, + backgroundColor: "#000", + marginVertical: 10, // Espacement entre la ligne et les stats + }, +}); \ No newline at end of file diff --git a/components/Profil/StatsOfUsers.tsx b/components/Profil/StatsOfUsers.tsx new file mode 100644 index 0000000000000000000000000000000000000000..157097eaccb4b5a472041f919b3b7c13ce190a93 --- /dev/null +++ b/components/Profil/StatsOfUsers.tsx @@ -0,0 +1,41 @@ +import React from "react"; +import {View, Text, StyleSheet} from "react-native"; +import LineOfUserStat from "./LineOfUserStat"; +import {User} from "../../models/User"; + +interface Props { + user?: User; +} + +export default function StatsOfUsers({user}: Props) { + return ( + <View style={styles.container}> + <LineOfUserStat title="Quizzes created" value={user?.stats ? user.stats.quizzesCreated.toString() : "?"} /> + <LineOfUserStat title="Quizzes played" value={user?.stats ? user.stats.quizzesPlayed.toString() : "?"} /> + <LineOfUserStat title="Correct answers" value={user?.stats ? user.stats.correctAnswers.toString() : "?"} /> + <LineOfUserStat title="Total responses" value={user?.stats ? user.stats.totalAnswers.toString() : "?"} isLast={true}/> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + width: "80%", + height: "45%", + marginTop: "10%", + justifyContent: "space-around", + alignItems: "center", + backgroundColor: "#f9f9f9", + borderRadius: 15, + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 4, + }, + shadowOpacity: 0.3, + shadowRadius: 5, + elevation: 5, + paddingVertical: 15, + }, +}); \ No newline at end of file diff --git a/components/buttons/AnswerButton.tsx b/components/buttons/AnswerButton.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5b861da586b2e3dc37366d3ea982c9ac136b67ba --- /dev/null +++ b/components/buttons/AnswerButton.tsx @@ -0,0 +1,83 @@ +import {TouchableOpacity, Text, StyleSheet, View, Image} from "react-native"; +import {ButtonsStyles} from "../../styles/ButtonsStyles"; +import {TextsStyles} from "../../styles/TextsStyles"; +import React from "react"; + +interface Props{ + text: string; + handleButtonPressed:() => void; + buttonStyle?: any; + buttonText?: any; + indicator?: number | undefined; +} + +/** + * AnswerButton : Un bouton par défaut, il possède déjà un style mais on peut le surcharger grâce à la propriété buttonStyle + * @param text - Texte du bouton + * @param handleButtonPressed - Fonction qui sera exécutée lorsque le bouton sera pressé + * @param buttonStyle - Surcharge du style du bouton + * @param buttonText - Surcharge du style du texte du bouton + */ +export default function AnswerButton({text, handleButtonPressed, buttonStyle, buttonText, indicator}: Props){ + return( + <View style={styles.containerButton}> + <TouchableOpacity onPress={handleButtonPressed} style={[styles.defaultButton,buttonStyle]}> + {indicator !== undefined && ( + <View style={styles.indicator}> + <Text style={styles.indicatorText}>{indicator}</Text> + </View> + )} + { + text.includes('data:image') ? + <Image + style={[styles.answerImage]} + source={{uri: text}} + /> + : + text.includes('data:audio') ? + <Text style={[TextsStyles.defaultButtonText, buttonText]}>sound: not supported</Text> + : + <Text style={[TextsStyles.defaultButtonText, buttonText]}>{text}</Text> + } + </TouchableOpacity> + </View> + ) +} + +const styles = StyleSheet.create({ + defaultButton: { + backgroundColor: "#45128C", + padding: 10, + alignItems: "center", + justifyContent: 'center', + borderRadius: 10, + }, + indicator: { + position: "absolute", + top: "-16%", + left: "5%", + width: 25, + height: 25, + borderRadius: 15, + backgroundColor: "#D3D3D3", + justifyContent: "center", + alignItems: "center", + zIndex: 1, + }, + indicatorText: { + color: "#000", + fontWeight: "bold", + fontSize: 14, + }, + containerButton: { + height: 150, + width: '100%', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + }, + answerImage: { + width: '100%', + height: '100%', + }, +}) \ No newline at end of file diff --git a/components/buttons/AnswerButtonImage.tsx b/components/buttons/AnswerButtonImage.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8716144bd818a697248cf67eddd8e6a29e1b0cb3 --- /dev/null +++ b/components/buttons/AnswerButtonImage.tsx @@ -0,0 +1,73 @@ +import {TouchableOpacity, Text, StyleSheet, View, Image} from "react-native"; +import {ButtonsStyles} from "../../styles/ButtonsStyles"; +import {TextsStyles} from "../../styles/TextsStyles"; + +interface Props{ + url: string; + handleButtonPressed:() => void; + buttonStyle?: any; + indicator?: number | undefined; +} + +/** + * AnswerButtonImage : Un bouton par défaut, il possède déjà un style mais on peut le surcharger grâce à la propriété buttonStyle + * @param url - Texte du bouton + * @param handleButtonPressed - Fonction qui sera exécutée lorsque le bouton sera pressé + * @param buttonStyle - Surcharge du style du bouton + * @param buttonText - Surcharge du style du texte du bouton + */ +export default function AnswerButtonImage({url, handleButtonPressed, buttonStyle, indicator}: Props){ + return( + <View style={styles.containerButton}> + <TouchableOpacity onPress={handleButtonPressed} style={[styles.defaultButton,buttonStyle]}> + {indicator !== undefined && ( + <View style={styles.indicator}> + <Text style={styles.indicatorText}>{indicator}</Text> + </View> + )} + <Image + style={[styles.answerImage]} + source={{uri: url}} + /> + </TouchableOpacity> + </View> + ) +} + +const styles = StyleSheet.create({ + defaultButton: { + backgroundColor: "#45128C", + padding: 10, + alignItems: "center", + justifyContent: 'center', + borderRadius: 10, + }, + indicator: { + position: "absolute", + top: "-16%", + left: "5%", + width: 25, + height: 25, + borderRadius: 15, + backgroundColor: "#D3D3D3", + justifyContent: "center", + alignItems: "center", + zIndex: 1, + }, + indicatorText: { + color: "#000", + fontWeight: "bold", + fontSize: 14, + }, + answerImage: { + width: '100%', + height: '100%', + }, + containerButton: { + height: 150, + width: '100%', + display: 'flex', + alignItems: 'center', + justifyContent: 'center' + } +}) \ No newline at end of file diff --git a/components/buttons/BlueButton.tsx b/components/buttons/BlueButton.tsx new file mode 100644 index 0000000000000000000000000000000000000000..21e78e70a5037352e82f88a5578add164d825409 --- /dev/null +++ b/components/buttons/BlueButton.tsx @@ -0,0 +1,48 @@ +import { View, Text, StyleSheet, TouchableOpacity, GestureResponderEvent } from "react-native"; + +interface Props { + onPress: ((event: GestureResponderEvent) => void) | undefined; + text: string; + buttonStyle?: any; + isDisabled: boolean; +} + +export default function BlueButton({ onPress, text, buttonStyle, isDisabled }: Props) { + return ( + <TouchableOpacity + style={[ + styles.container, + isDisabled ? styles.disabledContainer : styles.enabledContainer, + buttonStyle, + ]} + onPress={onPress} + disabled={isDisabled} + > + <Text style={[styles.text, isDisabled && styles.disabledText]}>{text}</Text> + </TouchableOpacity> + ); +} + +const styles = StyleSheet.create({ + container: { + width: "100%", + height: 70, + alignItems: "center", + justifyContent: "center", + borderRadius: 10, + }, + enabledContainer: { + backgroundColor: "#2b73fe", // Couleur bleue par défaut + }, + disabledContainer: { + backgroundColor: "#b0b0b0", // Gris désactivé + }, + text: { + fontSize: 28, + color: "white", + fontWeight: "bold", + }, + disabledText: { + color: "#d0d0d0", // Texte grisé pour un bouton désactivé + }, +}); diff --git a/components/DefaultButton.tsx b/components/buttons/DefaultButton.tsx similarity index 88% rename from components/DefaultButton.tsx rename to components/buttons/DefaultButton.tsx index d4aaa4f740682dfc0d14a4acfa7295cc7ddf1b69..cd0fe2ab6b173a9a9c9d7884e3a92090de0fada6 100644 --- a/components/DefaultButton.tsx +++ b/components/buttons/DefaultButton.tsx @@ -1,6 +1,6 @@ import {TouchableOpacity, Text} from "react-native"; -import {ButtonsStyles} from "../styles/ButtonsStyles"; -import {TextsStyles} from "../styles/TextsStyles"; +import {ButtonsStyles} from "../../styles/ButtonsStyles"; +import {TextsStyles} from "../../styles/TextsStyles"; interface Props{ text: string; diff --git a/components/buttons/MenuButton.tsx b/components/buttons/MenuButton.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a7d38f70e20c8b2a431374cd224be233a39696d4 --- /dev/null +++ b/components/buttons/MenuButton.tsx @@ -0,0 +1,32 @@ +import React from "react"; +import {TouchableOpacity, StyleSheet, Text} from "react-native"; + +interface Props{ + text: string + handleButtonPressed:() => void; +} +/** + * MenuButton : Bouton du menu principal + * @param text - Texte du bouton + * @param handleButtonPressed - Fonction qui sera exécutée lorsque le bouton sera pressé + */ +export default function MenuButton({text, handleButtonPressed}: Props) { + return ( + <TouchableOpacity onPress={handleButtonPressed}> + <Text style={styles.textStyle}>{text}</Text> + </TouchableOpacity> + ); +} + +const styles = StyleSheet.create({ + container: { + display: 'flex', + width: '100%', + height: '100%', + }, + textStyle: { + color: '#2ec7ff', + fontSize: 50, + fontWeight: 'bold', + } +}); \ No newline at end of file diff --git a/components/buttons/WhiteButton.tsx b/components/buttons/WhiteButton.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a7025577445843fc3a3c8b2f6a9840caa5dd162b --- /dev/null +++ b/components/buttons/WhiteButton.tsx @@ -0,0 +1,50 @@ +import { View, Text, StyleSheet, TouchableOpacity, GestureResponderEvent } from "react-native"; + +interface Props { + onPress: ((event: GestureResponderEvent) => void) | undefined; + text: string; + buttonStyle?: any; + isDisabled: boolean; +} + +export default function WhiteButton({ onPress, text, buttonStyle, isDisabled }: Props) { + return ( + <TouchableOpacity + style={[ + styles.container, + isDisabled ? styles.disabledContainer : styles.enabledContainer, + buttonStyle, + ]} + onPress={onPress} + disabled={isDisabled} + > + <Text style={[styles.text, isDisabled && styles.disabledText]}>{text}</Text> + </TouchableOpacity> + ); +} + +const styles = StyleSheet.create({ + container: { + width: "100%", + height: 70, + alignItems: "center", + justifyContent: "center", + borderRadius: 10, + borderWidth: 5, + borderColor: "#508bff", + }, + enabledContainer: { + backgroundColor: "white", // Couleur bleue par défaut + }, + disabledContainer: { + backgroundColor: "#b0b0b0", // Gris désactivé + }, + text: { + fontSize: 28, + color: "#508bff", + fontWeight: "bold", + }, + disabledText: { + color: "#d0d0d0", // Texte grisé pour un bouton désactivé + }, +}); diff --git a/components/comboBox/ComboBox.tsx b/components/comboBox/ComboBox.tsx index d89f42523b0928bd77946059024c5b404f3eb6b5..12ed9f3660f0190815b086285b217c77d43213d2 100644 --- a/components/comboBox/ComboBox.tsx +++ b/components/comboBox/ComboBox.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { View, Text, StyleSheet, Modal, TouchableOpacity, TextInput, Platform } from 'react-native'; import { Picker } from '@react-native-picker/picker'; -import DefaultButton from "../DefaultButton"; +import DefaultButton from "../buttons/DefaultButton"; interface Props { options: string[]; diff --git a/components/lists/QuizList.tsx b/components/lists/QuizList.tsx new file mode 100644 index 0000000000000000000000000000000000000000..81051a6c0ef0f9ed7e65e530c17672ee4e880d19 --- /dev/null +++ b/components/lists/QuizList.tsx @@ -0,0 +1,143 @@ +import React from "react"; +import { FlatList, View, Text, StyleSheet, TouchableOpacity, ActivityIndicator } from "react-native"; +import {Quiz} from "../../models/Quiz"; +import { NavigationProp } from "@react-navigation/native"; + + + +/** + * QuizList : Un composant affichant une liste de quiz avec leur titre, nombre de questions, et catégorie. + * + * @component + * + * @param navigation - Propriété de navigation utilisée pour naviguer vers l'écran "InformationsOfQuiz". + * @param quizList - Liste des quiz à afficher. Peut être null ou undefined. + * @param isLoadingData - Boolean indiquant si les données sont en cours de chargement. + * + * @example + * <QuizList + * navigation={navigation} + * quizList={quizzes} + * isLoadingData={isLoading} + * /> + * + * @description + * - Ce composant gère trois états : + * 1. Chargement : Affiche un spinner si `isLoadingData` est true. + * 2. Liste des quiz : Affiche une liste interactive des quiz si `quizList` contient des éléments. + * 3. Liste vide : Affiche un message si `quizList` est vide. + * + * - Chaque quiz affiche : + * - Son code en tant que titre. + * - Son nombre total de questions. + * - Sa catégorie, affichée en majuscules. + * + * @returns Un composant React contenant une liste interactive de quiz ou des messages en fonction de l'état. + */ +interface Props { + quizList: Quiz[] | null | undefined; + isLoadingData: boolean; + nextPage?: () => void; + onQuizPressed:(quiz: Quiz) => void; +} +export default function QuizList({ quizList, isLoadingData, nextPage, onQuizPressed }: Props) { + if (quizList) { + } + const renderQuizItem = ({ item }: { item: Quiz }) => ( + <TouchableOpacity style={styles.quizItem} onPress={() => onQuizPressed(item)}> + <Text style={styles.quizTitle}>{item.name}</Text> + <Text style={styles.quizDetails}> + {item.questionCount} QUESTIONS | {item.difficulty.name} | {item.author.username} + </Text> + </TouchableOpacity> + ); + + return ( + <View style={styles.container}> + {isLoadingData ? ( + <View style={styles.loadingContainer}> + <ActivityIndicator size="large" color="#2b73fe" /> + <Text style={styles.loadingText}>Loading quizzes...</Text> + </View> + ) : quizList && quizList.length > 0 ? ( + <FlatList + data={quizList} + renderItem={renderQuizItem} + keyExtractor={(item,index) => item.id+ ""+ index} + showsVerticalScrollIndicator={true} + contentContainerStyle={styles.listContent} + onEndReached={() => { + if (nextPage) { + nextPage(); + } + }} + + onEndReachedThreshold={0.5} + /> + ) : ( + <Text style={styles.emptyMessage}>No quizzes available.</Text> + )} + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: "white", + padding: 10, + borderRadius: 10, + borderColor: "#fafafa", + borderWidth: 3, + elevation: 5, // Ombre pour Android + shadowColor: "#000", // Ombre pour iOS + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + width: "100%", // Assurez-vous que le conteneur occupe toute la largeur + }, + listContent: { + }, + quizItem: { + backgroundColor: "#f3f3f3", + padding: 15, + borderRadius: 10, + marginVertical: 5, + elevation: 3, // Ombre pour Android + shadowColor: "#000", // Ombre pour iOS + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.2, + shadowRadius: 2, + width: "100%", + alignSelf: "center", // Centre les éléments dans leur conteneur + }, + quizTitle: { + fontSize: 22, + fontWeight: "bold", + color: "#000", + marginBottom: 5, + textAlign: "center", + }, + quizDetails: { + fontSize: 18, + color: "#555", + textAlign: "center", + }, + emptyMessage: { + fontSize: 18, + color: "#888", + textAlign: "center", + marginTop: 20, + }, + loadingContainer: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, + loadingText: { + fontSize: 16, + color: "#555", + marginTop: 10, + textAlign: "center", + }, +}); diff --git a/components/loading/LoadingIndicator.tsx b/components/loading/LoadingIndicator.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2520955dc86444de44ffffcfc59c6fece6e491a0 --- /dev/null +++ b/components/loading/LoadingIndicator.tsx @@ -0,0 +1,22 @@ +import React from "react"; +import { View, StyleSheet, ActivityIndicator } from "react-native"; + +export default function LoadingIndicator() { + return ( + <View style={styles.container}> + <ActivityIndicator size="large" color="#2b73fe" /> + </View> + ); +} + + +const styles = StyleSheet.create({ + container: { + display: "flex", // Change le type de flex pour que la vue soit centrée + width: "100%", // Prend toute la largeur de l'écran + height: "100%", // Prend toute la hauteur de l'écran + ...StyleSheet.absoluteFillObject, // Prend toute la surface de l'écran + justifyContent: "center", // Centre verticalement + alignItems: "center", // Centre horizontalement + }, +}); diff --git a/components/navigation/HeaderNavigation.tsx b/components/navigation/HeaderNavigation.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1b17e9c5d42618238fb224a081fc38f9ce5adfd2 --- /dev/null +++ b/components/navigation/HeaderNavigation.tsx @@ -0,0 +1,46 @@ +import { View, StyleSheet, Image, TouchableOpacity } from "react-native"; +import { NavigationProp } from "@react-navigation/native"; +import ConfirmModal from "../PlayingQuiz/ComfirmModal"; + +interface Props { + navigation: NavigationProp<any>; + buttonGoBack: boolean +} + +/** + * HeaderNavigation : Header qui permet de remonter à l'écran précédent + * @param navigation - navigation + * @param buttonGoBack - boolean qui dit si le bouton de retour doit être affiché + */ +export default function HeaderNavigation({ navigation, buttonGoBack }: Props) { + return ( + <View style={styles.container}> + {buttonGoBack && ( // Affiche le bouton uniquement si buttonGoBack est true + <TouchableOpacity onPress={() => navigation.goBack()} style={styles.goBackContainer}> + <Image source={require('../../assets/GoBackNavigation.png')} /> + </TouchableOpacity> + )} + <Image source={require('../../assets/TitleApp.png')} style={styles.titleImage} /> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + flexDirection: 'row', // Alignement en ligne + alignItems: 'center', // Centrer les éléments verticalement + justifyContent: 'center', // Centrer les éléments horizontalement + width: '100%', + height: 60, // Ajustez en fonction de votre design + position: 'relative', // Pour positionner l'élément de gauche + }, + goBackContainer: { + position: 'absolute', // Place l'élément indépendamment + left: 10, // Décalé à gauche + }, + titleImage: { + width: 170, // Ajustez en fonction de la taille de l'image + height: 80, + resizeMode: 'contain', // Pour conserver les proportions + }, +}); diff --git a/components/progressBar/ProgressBar.tsx b/components/progressBar/ProgressBar.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fbf4cb5950ec6ab8394cdc2190a6336d6ef640fd --- /dev/null +++ b/components/progressBar/ProgressBar.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import { View, StyleSheet } from "react-native"; +import * as Progress from "react-native-progress"; + +interface Props { + progress: number; // Valeur entre 0 et 1 représentant la progression +} + +export default function ProgressBar({ progress }: Props) { + // Limite la progression entre 0 et 1 + const clampedProgress = Math.min(Math.max(progress, 0), 1); + + // Calcul de la couleur en fonction de la progression + const interpolateColor = () => { + const startColor = { r: 43, g: 115, b: 254 }; // #45128C (bleu-violet) + const endColor = { r: 255, g: 0, b: 0 }; // Rouge + + const r = Math.floor(startColor.r + (endColor.r - startColor.r) * clampedProgress); + const g = Math.floor(startColor.g + (endColor.g - startColor.g) * clampedProgress); + const b = Math.floor(startColor.b + (endColor.b - startColor.b) * clampedProgress); + + return `rgb(${r}, ${g}, ${b})`; + }; + + return ( + <View style={styles.container}> + <Progress.Bar + progress={clampedProgress} + width={null} // Occupe toute la largeur disponible + height={25} // Épaisseur de la barre + color={interpolateColor()} // Couleur dynamique + borderRadius={15} // Bords arrondis + unfilledColor="#e0e0e0" // Couleur de fond + borderWidth={0} // Supprime la bordure + /> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + width: "100%", + padding: 10, // Ajoute un espace autour de la barre + }, +}); diff --git a/eas.json b/eas.json new file mode 100644 index 0000000000000000000000000000000000000000..5da8fba7ea28b84bd308080e969f89ea2d0195c7 --- /dev/null +++ b/eas.json @@ -0,0 +1,21 @@ +{ + "cli": { + "version": ">= 13.4.2", + "appVersionSource": "remote" + }, + "build": { + "development": { + "developmentClient": true, + "distribution": "internal" + }, + "preview": { + "distribution": "internal" + }, + "production": { + "autoIncrement": true + } + }, + "submit": { + "production": {} + } +} diff --git a/helper/QuizHelper.ts b/helper/QuizHelper.ts index 090314d53e2c6aebff95a5e6b772a9c5fe64e668..85b113777a44c1ab6a95d3b239b33139501226e6 100644 --- a/helper/QuizHelper.ts +++ b/helper/QuizHelper.ts @@ -1,50 +1,15 @@ -// src/helpers/QuizHelper.ts +import {Question} from '../models/Question'; -import QuizModel from "../model/QuizModel"; -import QuestionModel from "../model/QuestionModel"; -import he from "he"; +export const shuffleAnswersOfQuiz = (question: Question): Question => { + const shuffledAnswers = [...question.answers]; -interface ApiQuestion { - category: string; - correct_answer: string; - difficulty: string; - incorrect_answers: string[]; - question: string; - type: string; -} - -interface ApiResponse { - response_code: number; - results: ApiQuestion[]; -} - -// Fonction pour transformer les données API en QuizModel -export const transformToQuizModel = (data: ApiResponse): QuizModel => { - const questions: QuestionModel[] = data.results.map((item) => { - return { - question: he.decode(item.question), - answer: shuffleAnswers([...item.incorrect_answers.map((ans) => he.decode(ans)), he.decode(item.correct_answer)]), - correctAnswer: item.correct_answer, - multiple: item.type === "multiple", - }; - }); + for (let i = shuffledAnswers.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [shuffledAnswers[i], shuffledAnswers[j]] = [shuffledAnswers[j], shuffledAnswers[i]]; + } return { - id: `quiz-${Date.now()}`, // Génère un ID unique pour chaque quiz - name: `Quiz - ${data.results[0]?.category || "General Knowledge"}`, - category: he.decode(data.results[0]?.category) || "General Knowledge", - questions: questions, - nbQuestions: questions.length, - nbActualQuestion: 1, - score: 0, + ...question, + answers: shuffledAnswers, }; -}; - -// Fonction utilitaire pour mélanger les réponses -const shuffleAnswers = (answers: string[]): string[] => { - for (let i = answers.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [answers[i], answers[j]] = [answers[j], answers[i]]; - } - return answers; -}; +}; \ No newline at end of file diff --git a/helper/UserHelper.ts b/helper/UserHelper.ts new file mode 100644 index 0000000000000000000000000000000000000000..cfacf0f7b548d75793c77a58c98c95c154aeb5ae --- /dev/null +++ b/helper/UserHelper.ts @@ -0,0 +1,10 @@ +import User from "../models/User"; + +export const transformToUserModel = (data: any): User => { + const user: User = { + id: data.id, + email: data.email, + username: data.username, + } + return user; +}; \ No newline at end of file diff --git a/hooks/UseCookie.ts b/hooks/UseCookie.ts new file mode 100644 index 0000000000000000000000000000000000000000..050d762989f50be1e63c9adbe084e684b18d0add --- /dev/null +++ b/hooks/UseCookie.ts @@ -0,0 +1,55 @@ +import { useState, useEffect, useCallback } from 'react'; +import AsyncStorage from '@react-native-async-storage/async-storage'; + +const useCookie = (cookieName: string) => { + const [error, setError] = useState<Error | null>(null); + + // Fonction pour sauvegarder le cookie + const saveCookie = useCallback(async (value: string, expirationInDays = 7) => { + try { + await AsyncStorage.setItem(cookieName, value); + setError(null); + } catch (e) { + if(e instanceof Error) { + setError(e); + } + setError(new Error('An error occurred while saving the cookie')); + } + }, [cookieName]); + + // Fonction pour supprimer le cookie + const removeCookie = useCallback(async () => { + try { + await AsyncStorage.removeItem(cookieName); + setError(null); + } catch (e) { + if(e instanceof Error) { + setError(e); + } + setError(new Error('An error occurred while removing the cookie')); + } + }, [cookieName]); + + const getCookie = useCallback(async () => { + try { + const value = await AsyncStorage.getItem(cookieName); + setError(null); + return value; + } catch (e) { + if(e instanceof Error) { + setError(e); + } + setError(new Error('An error occurred while getting the cookie')); + } + }, [cookieName]); + + + return { + error, + saveCookie, + removeCookie, + getCookie, + }; +}; + +export default useCookie; \ No newline at end of file diff --git a/model/QuestionModel.ts b/model/QuestionModel.ts deleted file mode 100644 index 48893ef2af8f154e8df7104625839fd640a37da9..0000000000000000000000000000000000000000 --- a/model/QuestionModel.ts +++ /dev/null @@ -1,6 +0,0 @@ -export default interface QuestionModel { - question: string; - answer: string[]; - correctAnswer: string; - multiple: boolean; -} \ No newline at end of file diff --git a/model/QuizModel.ts b/model/QuizModel.ts deleted file mode 100644 index fd2a7205d1203f56dc4f8af13d773a0d97ce4c43..0000000000000000000000000000000000000000 --- a/model/QuizModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -import QuestionModel from "./QuestionModel"; - -export default interface QuizModel { - id: string; - name: string; - category: string; - questions: QuestionModel[]; - nbQuestions: number; - nbActualQuestion: number; - score: number; -} diff --git a/models/Answer.ts b/models/Answer.ts new file mode 100644 index 0000000000000000000000000000000000000000..9bc373ec31d61c58f42a71b207e146b3ef1f00cc --- /dev/null +++ b/models/Answer.ts @@ -0,0 +1,6 @@ +export interface Answer { + id: number; + text: string; + isCorrect?: boolean; + questionId: number; +} \ No newline at end of file diff --git a/models/EDifficulty.ts b/models/EDifficulty.ts new file mode 100644 index 0000000000000000000000000000000000000000..640dee4aca4fda57bc23fe9b812c7f1bc72134dd --- /dev/null +++ b/models/EDifficulty.ts @@ -0,0 +1,5 @@ +export enum EDifficulty { + Easy = "easy", + Medium = "medium", + Hard = "hard", +} \ No newline at end of file diff --git a/models/Question.ts b/models/Question.ts new file mode 100644 index 0000000000000000000000000000000000000000..7b7793215a25db91f8a7ff680085eec56562a5c8 --- /dev/null +++ b/models/Question.ts @@ -0,0 +1,13 @@ +import {Answer} from "./Answer"; +import {Category} from "./Quiz"; + +export interface Question { + id: number; + text: string; + type: string; + categoryId: number; + quizId: string; + order: number; + answers: Answer[]; + category: Category; +} \ No newline at end of file diff --git a/models/Quiz.ts b/models/Quiz.ts new file mode 100644 index 0000000000000000000000000000000000000000..83a628419c4ef3a5d1557ef0f42d4cd17c2d40dd --- /dev/null +++ b/models/Quiz.ts @@ -0,0 +1,36 @@ +import {Question} from "./Question"; +export interface QuizCommunityResponse { + quizzes: Quiz[]; + total: number; +} +export interface Difficulty { + id: number; + name: string; +} + +export interface Category { + id: number; + name: string; +} + +interface Author { + id: number; + username: string; +} + + +export interface Quiz { + id: string; + name: string; + description: string; + score: number; + questionIndex: number; + questionCount: number; + categoryId: number; + difficultyId: number; + author: Author, + authorId: number, + category?: Category, + difficulty: Difficulty, + questions: Question[], +} \ No newline at end of file diff --git a/models/QuizGenerateAnswer.ts b/models/QuizGenerateAnswer.ts new file mode 100644 index 0000000000000000000000000000000000000000..3992ebea68f573e857963b7c82608a8318c4bee0 --- /dev/null +++ b/models/QuizGenerateAnswer.ts @@ -0,0 +1,4 @@ +export interface QuizGenerateAnswer { + id: string; + quizId: string; +} \ No newline at end of file diff --git a/models/QuizInformations.ts b/models/QuizInformations.ts new file mode 100644 index 0000000000000000000000000000000000000000..32b9aed99bff2ee685625fe520a5092270172bcf --- /dev/null +++ b/models/QuizInformations.ts @@ -0,0 +1,17 @@ +import {Category, Difficulty} from "./Quiz"; +import {User} from "./User"; + +export interface QuizInformations { + id: number; + name: string; + description: string; + isCommunity: boolean; + questionCount: number; + categoryId: number; + difficultyId: number; + authorId?: User; + createdAt: string; + updatedAt: string; + category: Category; + difficulty: Difficulty; +} \ No newline at end of file diff --git a/models/Response/AllRunsResponse.ts b/models/Response/AllRunsResponse.ts new file mode 100644 index 0000000000000000000000000000000000000000..8e7c71ceff2654461f8b9d7449932ac94daa7bfc --- /dev/null +++ b/models/Response/AllRunsResponse.ts @@ -0,0 +1,5 @@ +import {RunsInformationsAllRuns} from "../RunsInformationsAllRuns"; + +export interface AllRunsResponse{ + runs: RunsInformationsAllRuns[]; +} \ No newline at end of file diff --git a/models/Response/AnswerResponse.ts b/models/Response/AnswerResponse.ts new file mode 100644 index 0000000000000000000000000000000000000000..ab22c33d77756549e0c94b6f824115ba22cf25ee --- /dev/null +++ b/models/Response/AnswerResponse.ts @@ -0,0 +1,16 @@ +import {Answer} from "../Answer"; +import {Category} from "../Quiz"; + +export interface AnswerResponse { + score: number; + answers:{ + id: number; + text: string; + type:string; + categoryId: number; + quizId: string; + order: number; + answers: Answer[]; + } + category: Category; +} \ No newline at end of file diff --git a/models/Response/AnswerWsResponse.ts b/models/Response/AnswerWsResponse.ts new file mode 100644 index 0000000000000000000000000000000000000000..41d72db73366819090f8461760ecc9413f3f7743 --- /dev/null +++ b/models/Response/AnswerWsResponse.ts @@ -0,0 +1,5 @@ +import {Answer} from "../Answer"; + +export interface AnswerWsResponse { + answers: Answer[]; +} \ No newline at end of file diff --git a/models/Response/QuestionResponse.ts b/models/Response/QuestionResponse.ts new file mode 100644 index 0000000000000000000000000000000000000000..ccfd9abec3973b8482f57893f0fbae9f5a711cad --- /dev/null +++ b/models/Response/QuestionResponse.ts @@ -0,0 +1,5 @@ +import {Question} from "../Question"; + +export interface QuestionResponse { + question: Question; +} \ No newline at end of file diff --git a/models/Response/RunsInformationResponse.ts b/models/Response/RunsInformationResponse.ts new file mode 100644 index 0000000000000000000000000000000000000000..a02f92a99a562756b41f5b4eb29af24628883f1f --- /dev/null +++ b/models/Response/RunsInformationResponse.ts @@ -0,0 +1,5 @@ +import {RunInformations} from "../RunInformations"; + +export interface RunsInformationResponse { + runs: RunInformations[]; +} \ No newline at end of file diff --git a/models/RunInformations.ts b/models/RunInformations.ts new file mode 100644 index 0000000000000000000000000000000000000000..c7b74f0e17d31a1a0346c2a4f5842fcd31a41048 --- /dev/null +++ b/models/RunInformations.ts @@ -0,0 +1,14 @@ +import {Category, Difficulty} from "./Quiz"; +import {User} from "./User"; + +export interface RunInformations { + id: string; + quizId: string; + originalQuizId: string; + score: number; + questionIndex: number; + startDate: string; + lastChange: string; + quizUserId: number; + roomId?: number; +} \ No newline at end of file diff --git a/models/RunsInformationsAllRuns.tsx b/models/RunsInformationsAllRuns.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0022d662d4d2bca44e16e01da7ef9e9e1561c7ae --- /dev/null +++ b/models/RunsInformationsAllRuns.tsx @@ -0,0 +1,21 @@ +import {Category, Difficulty} from "./Quiz"; + +export interface QuizInfoRun{ + category: Category; + difficulty: Difficulty; + name?: string; + questionCount: string; + description: string; +} +export interface RunsInformationsAllRuns{ + id: string; + quizId: string; + originalQuizId: string; + score: number; + questionIndex: number; + startDate: string; + lastChange: string; + quizUserId: number; + roomId: number; + quiz: QuizInfoRun; +} \ No newline at end of file diff --git a/models/SelectModeType.ts b/models/SelectModeType.ts new file mode 100644 index 0000000000000000000000000000000000000000..826e0b8907de246d4b9839ad9632dda45b9d759d --- /dev/null +++ b/models/SelectModeType.ts @@ -0,0 +1,3 @@ +export type SelectModeType = "play" | "join"; +export type ProfilSelectModeType = "login" | "signup"; +export type OnlineSelectModeType = "create" | "join"; \ No newline at end of file diff --git a/models/User.ts b/models/User.ts new file mode 100644 index 0000000000000000000000000000000000000000..506d8f03dd326eb6485bf2005f23c8e4887e6da5 --- /dev/null +++ b/models/User.ts @@ -0,0 +1,18 @@ +interface Stats { + quizzesCreated: number; + quizzesPlayed: number; + correctAnswers: number; + totalAnswers: number; +} +export interface User { + id: number; + email: string; + username: string; + stats?: Stats; +} + +export enum UserConnectionState { + LOADING = "Loading", + NOT_CONNECTED = "NotConnected", + CONNECTED = "Connected", +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 02eb398dbc92836f58f81752d674cfe1e578d4ba..2a605a2226b077d10f3560a61b36c7d1b97e4f1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,27 +8,57 @@ "name": "vili", "version": "1.0.0", "dependencies": { - "@react-native-picker/picker": "2.7.5", + "@react-native-async-storage/async-storage": "1.23.1", + "@react-native-cookies/cookies": "^6.2.1", + "@react-native-picker/picker": "^2.9.0", + "@react-navigation/bottom-tabs": "^6.6.1", "@react-navigation/native": "^6.1.18", "@react-navigation/native-stack": "^6.11.0", - "expo": "~51.0.39", - "expo-status-bar": "~1.12.1", + "@tanstack/react-query": "^5.62.8", + "@tanstack/react-query-devtools": "^5.62.8", + "axios": "^1.7.9", + "dotenv": "^16.4.7", + "expo": "~52.0.14", + "expo-splash-screen": "^0.29.13", + "expo-status-bar": "~2.0.0", "he": "^1.2.0", "i18n-js": "^4.5.0", "i18next": "^23.16.5", - "react": "18.2.0", + "react": "^18.3.1", "react-i18next": "^15.1.1", - "react-native": "0.74.5", - "react-native-safe-area-context": "4.10.5", - "react-native-screens": "3.31.1" + "react-native": "0.76.3", + "react-native-dropdown-select-list": "^2.0.5", + "react-native-progress": "^5.0.1", + "react-native-safe-area-context": "^4.12.0", + "react-native-screens": "~4.1.0", + "react-native-sse": "^1.2.1", + "react-native-vector-icons": "^10.2.0", + "react-query": "^3.39.3", + "rxjs": "^7.8.1", + "socket.io-client": "^4.8.1" }, "devDependencies": { "@babel/core": "^7.20.0", "@types/he": "^1.2.3", - "@types/react": "~18.2.45", + "@types/react": "~18.3.12", + "@types/react-native-vector-icons": "^6.4.18", "typescript": "~5.3.3" } }, + "node_modules/@0no-co/graphql.web": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.11.tgz", + "integrity": "sha512-xuSJ9WXwTmtngWkbdEoopMo6F8NLtjy84UNAMsAr5C3/2SgAL/dEU10TMqTIsipqPQ8HA/7WzeqQ9DEQxSvPPA==", + "license": "MIT", + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + } + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -96,13 +126,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -123,20 +153,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", - "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", @@ -175,13 +191,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", - "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.1.1", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -192,9 +208,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -207,18 +223,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", @@ -317,19 +321,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", - "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", @@ -484,12 +475,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -582,25 +573,6 @@ "@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", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -650,23 +622,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-logical-assignment-operators instead.", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@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-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", @@ -684,15 +639,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -701,19 +657,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "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==", "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, + "peer": true, "engines": { "node": ">=6.9.0" }, @@ -721,61 +670,52 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", + "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", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "node_modules/@babel/plugin-syntax-bigint": { + "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==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@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==", + "node_modules/@babel/plugin-syntax-class-properties": { + "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==", "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.9.0" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" }, "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", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "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==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -859,7 +799,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -870,6 +809,30 @@ "@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", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", @@ -957,6 +920,36 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "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-top-level-await": { + "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==", + "license": "MIT", + "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-typescript": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", @@ -1009,7 +1002,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-remap-async-to-generator": "^7.25.9", @@ -1075,7 +1067,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" @@ -1222,13 +1213,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", - "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { @@ -1274,7 +1264,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" @@ -1339,7 +1328,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1384,14 +1372,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", - "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1473,7 +1460,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1489,7 +1475,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1539,7 +1524,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -1555,7 +1539,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" @@ -1731,7 +1714,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" @@ -1875,9 +1857,9 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", - "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", + "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", @@ -2076,9 +2058,9 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", - "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", @@ -2177,10 +2159,29 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse--for-generate-function-map": { + "name": "@babel/traverse", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.3.tgz", + "integrity": "sha512-yTmc8J+Sj8yLzwr4PD5Xb/WF3bOYu2C2OoSZPzbuqRm4n98XirsbzaX+GloeO376UnSYIYJ4NCanwV5/ugZkwA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -2203,67 +2204,61 @@ } }, "node_modules/@expo/cli": { - "version": "0.18.31", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.18.31.tgz", - "integrity": "sha512-v9llw9fT3Uv+TCM6Xllo54t672CuYtinEQZ2LPJ2EJsCwuTc4Cd2gXQaouuIVD21VoeGQnr5JtJuWbF97sBKzQ==", + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.1.tgz", + "integrity": "sha512-tpkFzlTYb/sNh8WqeTCa2ZVKMDkPgMggvY3tZeTfxeAO5olVXddKV+0U5zhHSd7pGM2w2fhEJNKI4Ub7IfyDmA==", "license": "MIT", "dependencies": { + "@0no-co/graphql.web": "^1.0.8", "@babel/runtime": "^7.20.0", - "@expo/code-signing-certificates": "0.0.5", - "@expo/config": "~9.0.0-beta.0", - "@expo/config-plugins": "~8.0.8", - "@expo/devcert": "^1.0.0", - "@expo/env": "~0.3.0", - "@expo/image-utils": "^0.5.0", - "@expo/json-file": "^8.3.0", - "@expo/metro-config": "0.18.11", + "@expo/code-signing-certificates": "^0.0.5", + "@expo/config": "~10.0.4", + "@expo/config-plugins": "~9.0.10", + "@expo/devcert": "^1.1.2", + "@expo/env": "~0.4.0", + "@expo/image-utils": "^0.6.0", + "@expo/json-file": "^9.0.0", + "@expo/metro-config": "~0.19.0", "@expo/osascript": "^2.0.31", "@expo/package-manager": "^1.5.0", - "@expo/plist": "^0.1.0", - "@expo/prebuild-config": "7.0.9", - "@expo/rudder-sdk-node": "1.1.1", + "@expo/plist": "^0.2.0", + "@expo/prebuild-config": "^8.0.17", + "@expo/rudder-sdk-node": "^1.1.1", "@expo/spawn-async": "^1.7.2", "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.74.85", - "@urql/core": "2.3.6", - "@urql/exchange-retry": "0.3.0", + "@react-native/dev-middleware": "0.76.3", + "@urql/core": "^5.0.6", + "@urql/exchange-retry": "^1.3.0", "accepts": "^1.3.8", - "arg": "5.0.2", + "arg": "^5.0.2", "better-opn": "~3.0.2", "bplist-creator": "0.0.7", "bplist-parser": "^0.3.1", "cacache": "^18.0.2", "chalk": "^4.0.0", "ci-info": "^3.3.0", + "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", "env-editor": "^0.4.1", "fast-glob": "^3.3.2", - "find-yarn-workspace-root": "~2.0.0", "form-data": "^3.0.1", - "freeport-async": "2.0.0", + "freeport-async": "^2.0.0", "fs-extra": "~8.1.0", "getenv": "^1.0.0", - "glob": "^7.1.7", - "graphql": "15.8.0", - "graphql-tag": "^2.10.1", - "https-proxy-agent": "^5.0.1", - "internal-ip": "4.3.0", + "glob": "^10.4.2", + "internal-ip": "^4.3.0", "is-docker": "^2.0.0", "is-wsl": "^2.1.1", - "js-yaml": "^3.13.1", - "json-schema-deref-sync": "^0.13.0", "lodash.debounce": "^4.0.8", - "md5hex": "^1.0.0", "minimatch": "^3.0.4", - "node-fetch": "^2.6.7", "node-forge": "^1.3.1", - "npm-package-arg": "^7.0.0", - "open": "^8.3.0", - "ora": "3.4.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", "picomatch": "^3.0.1", - "pretty-bytes": "5.6.0", - "progress": "2.0.3", + "pretty-bytes": "^5.6.0", + "pretty-format": "^29.7.0", + "progress": "^2.0.3", "prompts": "^2.3.2", "qrcode-terminal": "0.11.0", "require-from-string": "^2.0.2", @@ -2272,17 +2267,17 @@ "resolve-from": "^5.0.0", "resolve.exports": "^2.0.2", "semver": "^7.6.0", - "send": "^0.18.0", + "send": "^0.19.0", "slugify": "^1.3.4", "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", - "tar": "^6.0.5", + "tar": "^6.2.1", "temp-dir": "^2.0.0", "tempy": "^0.7.1", "terminal-link": "^2.1.1", - "text-table": "^0.2.0", - "url-join": "4.0.0", + "undici": "^6.18.2", + "unique-string": "~2.0.0", "wrap-ansi": "^7.0.0", "ws": "^8.12.1" }, @@ -2290,6 +2285,50 @@ "expo-internal": "build/bin/cli" } }, + "node_modules/@expo/cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@expo/cli/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/cli/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@expo/cli/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -2313,39 +2352,40 @@ } }, "node_modules/@expo/config": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-9.0.4.tgz", - "integrity": "sha512-g5ns5u1JSKudHYhjo1zaSfkJ/iZIcWmUmIQptMJZ6ag1C0ShL2sj8qdfU8MmAMuKLOgcIfSaiWlQnm4X3VJVkg==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-10.0.6.tgz", + "integrity": "sha512-xXkfPElrtxznkOZxFASJ7OPa6E9IHSjcZwj5BQ6XUF2dz5M7AFa2h5sXM8AalSaDU5tEBSgoUOjTh5957TlR8g==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~8.0.8", - "@expo/config-types": "^51.0.3", - "@expo/json-file": "^8.3.0", + "@expo/config-plugins": "~9.0.10", + "@expo/config-types": "^52.0.0", + "@expo/json-file": "^9.0.0", + "deepmerge": "^4.3.1", "getenv": "^1.0.0", - "glob": "7.1.6", + "glob": "^10.4.2", "require-from-string": "^2.0.2", "resolve-from": "^5.0.0", + "resolve-workspace-root": "^2.0.0", "semver": "^7.6.0", "slugify": "^1.3.4", - "sucrase": "3.34.0" + "sucrase": "3.35.0" } }, "node_modules/@expo/config-plugins": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-8.0.11.tgz", - "integrity": "sha512-oALE1HwnLFthrobAcC9ocnR9KXLzfWEjgIe4CPe+rDsfC6GDs8dGYCXfRFoCEzoLN4TGYs9RdZ8r0KoCcNrm2A==", + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-9.0.11.tgz", + "integrity": "sha512-zufuPQWkeEpXfMWFx2lWStoN43p6cO13p8n2KMIEK6jJMC/kkfldYyl8gYtEEYAL1nFfOf/W2pIXXPQ2sggnSw==", "license": "MIT", "dependencies": { - "@expo/config-types": "^51.0.3", - "@expo/json-file": "~8.3.0", - "@expo/plist": "^0.1.0", + "@expo/config-types": "^52.0.0", + "@expo/json-file": "~9.0.0", + "@expo/plist": "^0.2.0", "@expo/sdk-runtime-versions": "^1.0.0", "chalk": "^4.1.2", - "debug": "^4.3.1", - "find-up": "~5.0.0", + "debug": "^4.3.5", "getenv": "^1.0.0", - "glob": "7.1.6", + "glob": "^10.4.2", "resolve-from": "^5.0.0", "semver": "^7.5.4", "slash": "^3.0.0", @@ -2354,22 +2394,45 @@ "xml2js": "0.6.0" } }, + "node_modules/@expo/config-plugins/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/@expo/config-plugins/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", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "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" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config-plugins/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2388,9 +2451,9 @@ } }, "node_modules/@expo/config-types": { - "version": "51.0.3", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-51.0.3.tgz", - "integrity": "sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==", + "version": "52.0.1", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-52.0.1.tgz", + "integrity": "sha512-vD8ZetyKV7U29lR6+NJohYeoLYTH+eNYXJeNiSOrWCz0witJYY11meMmEnpEaVbN89EfC6uauSUOa6wihtbyPQ==", "license": "MIT" }, "node_modules/@expo/config/node_modules/@babel/code-frame": { @@ -2402,22 +2465,45 @@ "@babel/highlight": "^7.10.4" } }, + "node_modules/@expo/config/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/@expo/config/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", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "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" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2509,9 +2595,9 @@ } }, "node_modules/@expo/env": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.3.0.tgz", - "integrity": "sha512-OtB9XVHWaXidLbHvrVDeeXa09yvTl3+IQN884sO6PhIi2/StXfgSH/9zC7IvzrDB8kW3EBJ1PPLuCUJ2hxAT7Q==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.4.0.tgz", + "integrity": "sha512-g2JYFqck3xKIwJyK+8LxZ2ENZPWtRgjFWpeht9abnKgzXVXBeSNECFBkg+WQjQocSIdxXhEWM6hz4ZAe7Tc4ng==", "license": "MIT", "dependencies": { "chalk": "^4.0.0", @@ -2521,10 +2607,43 @@ "getenv": "^1.0.0" } }, + "node_modules/@expo/fingerprint": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.11.3.tgz", + "integrity": "sha512-9lgXmcIePvZ7Wef63XtvuN3HfCUevF4E4tQPdEbH9/dUWwpOvvwQ3KT4OJ9jdh8JJ3nTdO9eDQ/8k8xr1aQ5Kg==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "arg": "^5.0.2", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "find-up": "^5.0.0", + "getenv": "^1.0.0", + "minimatch": "^3.0.4", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/image-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.5.1.tgz", - "integrity": "sha512-U/GsFfFox88lXULmFJ9Shfl2aQGcwoKPF7fawSCLixIKtMCpsI+1r0h+5i0nQnmt9tHuzXZDL8+Dg1z6OhkI9A==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.6.3.tgz", + "integrity": "sha512-v/JbCKBrHeudxn1gN1TgfPE/pWJSlLPrl29uXJBgrJFQVkViQvUHQNDhaS+UEa9wYI5HHh7XYmtzAehyG4L+GA==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -2532,20 +2651,11 @@ "fs-extra": "9.0.0", "getenv": "^1.0.0", "jimp-compact": "0.16.1", - "node-fetch": "^2.6.0", "parse-png": "^2.1.0", "resolve-from": "^5.0.0", "semver": "^7.6.0", - "tempy": "0.3.0" - } - }, - "node_modules/@expo/image-utils/node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", - "license": "MIT", - "engines": { - "node": ">=4" + "temp-dir": "~2.0.0", + "unique-string": "~2.0.0" } }, "node_modules/@expo/image-utils/node_modules/fs-extra": { @@ -2596,50 +2706,6 @@ "node": ">=10" } }, - "node_modules/@expo/image-utils/node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@expo/image-utils/node_modules/tempy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", - "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", - "license": "MIT", - "dependencies": { - "temp-dir": "^1.0.0", - "type-fest": "^0.3.1", - "unique-string": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@expo/image-utils/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=6" - } - }, - "node_modules/@expo/image-utils/node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", - "license": "MIT", - "dependencies": { - "crypto-random-string": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@expo/image-utils/node_modules/universalify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", @@ -2650,13 +2716,13 @@ } }, "node_modules/@expo/json-file": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.3.tgz", - "integrity": "sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-9.0.0.tgz", + "integrity": "sha512-M+55xFVrFzDcgMDf+52lPDLjKB5xwRfStWlv/b/Vu2OLgxGZLWpxoPYjlRoHqxjPbCQIi2ZCbobK+0KuNhsELg==", "license": "MIT", "dependencies": { "@babel/code-frame": "~7.10.4", - "json5": "^2.2.2", + "json5": "^2.2.3", "write-file-atomic": "^2.3.0" } }, @@ -2670,31 +2736,40 @@ } }, "node_modules/@expo/metro-config": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.18.11.tgz", - "integrity": "sha512-/uOq55VbSf9yMbUO1BudkUM2SsGW1c5hr9BnhIqYqcsFv0Jp5D3DtJ4rljDKaUeNLbwr6m7pqIrkSMq5NrYf4Q==", + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.19.5.tgz", + "integrity": "sha512-wl5lVgXq4FN4kBJHNyU5U9J5hH8S8rYXrp/pgbwA+J/smQfiElYKMYomTGbHUb4LQ0VnmlX6/kI4x/zJk+mq7w==", "license": "MIT", "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-beta.0", - "@expo/env": "~0.3.0", - "@expo/json-file": "~8.3.0", + "@expo/config": "~10.0.4", + "@expo/env": "~0.4.0", + "@expo/json-file": "~9.0.0", "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "debug": "^4.3.2", - "find-yarn-workspace-root": "~2.0.0", "fs-extra": "^9.1.0", "getenv": "^1.0.0", - "glob": "^7.2.3", + "glob": "^10.4.2", "jsc-safe-url": "^0.2.4", - "lightningcss": "~1.19.0", + "lightningcss": "~1.27.0", + "minimatch": "^3.0.4", "postcss": "~8.4.32", "resolve-from": "^5.0.0" } }, + "node_modules/@expo/metro-config/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/@expo/metro-config/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -2710,6 +2785,41 @@ "node": ">=10" } }, + "node_modules/@expo/metro-config/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/metro-config/node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@expo/metro-config/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -2732,9 +2842,9 @@ } }, "node_modules/@expo/osascript": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.3.tgz", - "integrity": "sha512-aOEkhPzDsaAfolSswObGiYW0Pf0ROfR9J2NBRLQACdQ6uJlyAMiPF45DVEVknAU9juKh0y8ZyvC9LXqLEJYohA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.1.4.tgz", + "integrity": "sha512-LcPjxJ5FOFpqPORm+5MRLV0CuYWMthJYV6eerF+lQVXKlvgSn3EOqaHC3Vf3H+vmB0f6G4kdvvFtg40vG4bIhA==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2", @@ -2745,21 +2855,21 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.5.2.tgz", - "integrity": "sha512-IuA9XtGBilce0q8cyxtWINqbzMB1Fia0Yrug/O53HNuRSwQguV/iqjV68bsa4z8mYerePhcFgtvISWLAlNEbUA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.6.1.tgz", + "integrity": "sha512-4rT46wP/94Ll+CWXtFKok1Lbo9XncSUtErFOo/9/3FVughGbIfdG4SKZOAWIpr9wxwEfkyhHfAP9q71ONlWODw==", "license": "MIT", "dependencies": { - "@expo/json-file": "^8.3.0", + "@expo/json-file": "^9.0.0", "@expo/spawn-async": "^1.7.2", "ansi-regex": "^5.0.0", "chalk": "^4.0.0", "find-up": "^5.0.0", - "find-yarn-workspace-root": "~2.0.0", "js-yaml": "^3.13.1", - "micromatch": "^4.0.2", - "npm-package-arg": "^7.0.0", + "micromatch": "^4.0.8", + "npm-package-arg": "^11.0.0", "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0", "split": "^1.0.1", "sudo-prompt": "9.1.1" } @@ -2771,9 +2881,9 @@ "license": "MIT" }, "node_modules/@expo/plist": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.3.tgz", - "integrity": "sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.2.0.tgz", + "integrity": "sha512-F/IZJQaf8OIVnVA6XWUeMPC3OH6MV00Wxf0WC0JhTQht2QgjyHUa3U5Gs3vRtDq8tXNsZneOQRDVwpaOnd4zTQ==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "~0.7.7", @@ -2782,27 +2892,30 @@ } }, "node_modules/@expo/prebuild-config": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz", - "integrity": "sha512-9i6Cg7jInpnGEHN0jxnW0P+0BexnePiBzmbUvzSbRXpdXihYUX2AKMu73jgzxn5P1hXOSkzNS7umaY+BZ+aBag==", + "version": "8.0.23", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-8.0.23.tgz", + "integrity": "sha512-Zf01kFiN2PISmLb0DhIAJh76v3J2oYUKSjiAtGZLOH0HUz59by/qdyU4mGHWdeyRdCCrLUA21Rct2MBykvRMsg==", "license": "MIT", "dependencies": { - "@expo/config": "~9.0.0-beta.0", - "@expo/config-plugins": "~8.0.8", - "@expo/config-types": "^51.0.3", - "@expo/image-utils": "^0.5.0", - "@expo/json-file": "^8.3.0", - "@react-native/normalize-colors": "0.74.85", + "@expo/config": "~10.0.4", + "@expo/config-plugins": "~9.0.10", + "@expo/config-types": "^52.0.0", + "@expo/image-utils": "^0.6.0", + "@expo/json-file": "^9.0.0", + "@react-native/normalize-colors": "0.76.5", "debug": "^4.3.1", "fs-extra": "^9.0.0", "resolve-from": "^5.0.0", "semver": "^7.6.0", "xml2js": "0.6.0" - }, - "peerDependencies": { - "expo-modules-autolinking": ">=0.8.1" } }, + "node_modules/@expo/prebuild-config/node_modules/@react-native/normalize-colors": { + "version": "0.76.5", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.5.tgz", + "integrity": "sha512-6QRLEok1r55gLqj+94mEWUENuU5A6wsr2OoXpyq/CgQ7THWowbHtru/kRGRr6o3AQXrVnZheR60JNgFcpNYIug==", + "license": "MIT" + }, "node_modules/@expo/prebuild-config/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -2897,9 +3010,9 @@ } }, "node_modules/@expo/xcpretty": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.1.tgz", - "integrity": "sha512-sqXgo1SCv+j4VtYEwl/bukuOIBrVgx6euIoCat3Iyx5oeoXwEA2USCoeL0IPubflMxncA2INkqJ/Wr3NGrSgzw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", + "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", "license": "BSD-3-Clause", "dependencies": { "@babel/code-frame": "7.10.4", @@ -2938,30 +3051,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", - "license": "MIT", - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3067,101 +3156,108 @@ "node": ">=12" } }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "license": "MIT", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", "dependencies": { - "@jest/types": "^29.6.3" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/create-cache-key-function/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" + "p-limit": "^2.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/@jest/environment/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { @@ -3181,65 +3277,72 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/fake-timers/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "license": "MIT", + "node_modules/@jest/transform/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "license": "ISC", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "license": "MIT", "dependencies": { + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -3369,193 +3472,173 @@ "node": ">=14" } }, - "node_modules/@react-native-community/cli": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-13.6.9.tgz", - "integrity": "sha512-hFJL4cgLPxncJJd/epQ4dHnMg5Jy/7Q56jFvA3MHViuKpzzfTCJCB+pGY54maZbtym53UJON9WTGpM3S81UfjQ==", + "node_modules/@react-native-async-storage/async-storage": { + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz", + "integrity": "sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA==", "license": "MIT", "dependencies": { - "@react-native-community/cli-clean": "13.6.9", - "@react-native-community/cli-config": "13.6.9", - "@react-native-community/cli-debugger-ui": "13.6.9", - "@react-native-community/cli-doctor": "13.6.9", - "@react-native-community/cli-hermes": "13.6.9", - "@react-native-community/cli-server-api": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "@react-native-community/cli-types": "13.6.9", - "chalk": "^4.1.2", - "commander": "^9.4.1", - "deepmerge": "^4.3.0", - "execa": "^5.0.0", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0", - "graceful-fs": "^4.1.3", - "prompts": "^2.4.2", - "semver": "^7.5.2" - }, - "bin": { - "rnc-cli": "build/bin.js" + "merge-options": "^3.0.4" }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native-community/cli-clean": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz", - "integrity": "sha512-7Dj5+4p9JggxuVNOjPbduZBAP1SUgNhLKVw5noBUzT/3ZpUZkDM+RCSwyoyg8xKWoE4OrdUAXwAFlMcFDPKykA==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.60 <1.0" } }, - "node_modules/@react-native-community/cli-clean/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@react-native-cookies/cookies": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@react-native-cookies/cookies/-/cookies-6.2.1.tgz", + "integrity": "sha512-D17wCA0DXJkGJIxkL74Qs9sZ3sA+c+kCoGmXVknW7bVw/W+Vv1m/7mWTNi9DLBZSRddhzYw8SU0aJapIaM/g5w==", "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-clean/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" + "invariant": "^2.2.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react-native": ">= 0.60.2" } }, - "node_modules/@react-native-community/cli-clean/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/@react-native-picker/picker": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-2.9.0.tgz", + "integrity": "sha512-khEhIW/uhfMqq/+tvg4rEAiPGT8GX+Y6QydlP2TSMSmRHoSJK+ShXvXZXSr4Sii4imkj4BwvLunGywwtQDODqg==", "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/@react-native-community/cli-clean/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/@react-native/assets-registry": { + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.3.tgz", + "integrity": "sha512-7Fnc3lzCFFpnoyL1egua6d/qUp0KiIpeSLbfOMln4nI2g2BMzyFHdPjJnpLV2NehmS0omOOkrfRqK5u1F/MXzA==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/@react-native-community/cli-clean/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.3.tgz", + "integrity": "sha512-mZ7jmIIg4bUnxCqY3yTOkoHvvzsDyrZgfnIKiTGm5QACrsIGa5eT3pMFpMm2OpxGXRDrTMsYdPXE2rCyDX52VQ==", "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "@react-native/codegen": "0.76.3" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@react-native-community/cli-clean/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" + "node_modules/@react-native/babel-preset": { + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.3.tgz", + "integrity": "sha512-zi2nPlQf9q2fmfPyzwWEj6DU96v8ziWtEfG7CTAX2PG/Vjfsr94vn/wWrCdhBVvLRQ6Kvd/MFAuDYpxmQwIiVQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.76.3", + "babel-plugin-syntax-hermes-parser": "^0.25.1", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-config": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-13.6.9.tgz", - "integrity": "sha512-rFfVBcNojcMm+KKHE/xqpqXg8HoKl4EC7bFHUrahMJ+y/tZll55+oX/PGG37rzB8QzP2UbMQ19DYQKC1G7kXeg==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "cosmiconfig": "^5.1.0", - "deepmerge": "^4.3.0", - "fast-glob": "^3.3.2", - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli-debugger-ui": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.9.tgz", - "integrity": "sha512-TkN7IdFmGPPvTpAo3nCAH9uwGCPxWBEAwpqEZDrq0NWllI7Tdie8vDpGdrcuCcKalmhq6OYnkXzeBah7O1Ztpw==", - "license": "MIT", - "dependencies": { - "serve-static": "^1.13.1" + "peerDependencies": { + "@babel/core": "*" } }, - "node_modules/@react-native-community/cli-doctor": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-13.6.9.tgz", - "integrity": "sha512-5quFaLdWFQB+677GXh5dGU9I5eg2z6Vg4jOX9vKnc9IffwyIFAyJfCZHrxLSRPDGNXD7biDQUdoezXYGwb6P/A==", + "node_modules/@react-native/codegen": { + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.3.tgz", + "integrity": "sha512-oJCH/jbYeGmFJql8/y76gqWCCd74pyug41yzYAjREso1Z7xL88JhDyKMvxEnfhSdMOZYVl479N80xFiXPy3ZYA==", "license": "MIT", "dependencies": { - "@react-native-community/cli-config": "13.6.9", - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-platform-apple": "13.6.9", - "@react-native-community/cli-platform-ios": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "command-exists": "^1.2.8", - "deepmerge": "^4.3.0", - "envinfo": "^7.10.0", - "execa": "^5.0.0", - "hermes-profile-transformer": "^0.0.6", - "node-stream-zip": "^1.9.1", - "ora": "^5.4.1", - "semver": "^7.5.2", - "strip-ansi": "^5.2.0", - "wcwidth": "^1.0.1", - "yaml": "^2.2.1" + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.23.1", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@react-native/community-cli-plugin": { + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.3.tgz", + "integrity": "sha512-vgsLixHS24jR0d0QqPykBWFaC+V8x9cM3cs4oYXw3W199jgBNGP9MWcUJLazD2vzrT/lUTVBVg0rBeB+4XR6fg==", "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "@react-native/dev-middleware": "0.76.3", + "@react-native/metro-babel-transformer": "0.76.3", + "chalk": "^4.0.0", + "execa": "^5.1.1", + "invariant": "^2.2.4", + "metro": "^0.81.0", + "metro-config": "^0.81.0", + "metro-core": "^0.81.0", + "node-fetch": "^2.2.0", + "readline": "^1.3.0", + "semver": "^7.1.3" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@react-native-community/cli-server-api": "*" + }, + "peerDependenciesMeta": { + "@react-native-community/cli-server-api": { + "optional": true + } } }, - "node_modules/@react-native-community/cli-doctor/node_modules/execa": { + "node_modules/@react-native/community-cli-plugin/node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", @@ -3578,7 +3661,7 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/get-stream": { + "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", @@ -3590,7 +3673,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/is-stream": { + "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", @@ -3602,23 +3685,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/mimic-fn": { + "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", @@ -3627,7 +3694,7 @@ "node": ">=6" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/npm-run-path": { + "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", @@ -3639,7 +3706,7 @@ "node": ">=8" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/onetime": { + "node_modules/@react-native/community-cli-plugin/node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", @@ -3654,1136 +3721,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "node_modules/@react-native/community-cli-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ora/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-hermes": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-13.6.9.tgz", - "integrity": "sha512-GvwiwgvFw4Ws+krg2+gYj8sR3g05evmNjAHkKIKMkDTJjZ8EdyxbkifRUs1ZCq3TMZy2oeblZBXCJVOH4W7ZbA==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "hermes-profile-transformer": "^0.0.6" - } - }, - "node_modules/@react-native-community/cli-platform-android": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.9.tgz", - "integrity": "sha512-9KsYGdr08QhdvT3Ht7e8phQB3gDX9Fs427NJe0xnoBh+PDPTI2BD5ks5ttsH8CzEw8/P6H8tJCHq6hf2nxd9cw==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.2.4", - "logkitty": "^0.7.1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-android/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.9.tgz", - "integrity": "sha512-KoeIHfhxMhKXZPXmhQdl6EE+jGKWwoO9jUVWgBvibpVmsNjo7woaG/tfJMEWfWF3najX1EkQAoJWpCDBMYWtlA==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-tools": "13.6.9", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.0.12", - "ora": "^5.4.1" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-apple/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-platform-ios": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.9.tgz", - "integrity": "sha512-CiUcHlGs8vE0CAB4oi1f+dzniqfGuhWPNrDvae2nm8dewlahTBwIcK5CawyGezjcJoeQhjBflh9vloska+nlnw==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-platform-apple": "13.6.9" - } - }, - "node_modules/@react-native-community/cli-server-api": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-13.6.9.tgz", - "integrity": "sha512-W8FSlCPWymO+tlQfM3E0JmM8Oei5HZsIk5S0COOl0MRi8h0NmHI4WSTF2GCfbFZkcr2VI/fRsocoN8Au4EZAug==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-debugger-ui": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "compression": "^1.7.1", - "connect": "^3.6.5", - "errorhandler": "^1.5.1", - "nocache": "^3.0.1", - "pretty-format": "^26.6.2", - "serve-static": "^1.13.1", - "ws": "^6.2.2" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "license": "MIT", - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/@react-native-community/cli-tools": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-13.6.9.tgz", - "integrity": "sha512-OXaSjoN0mZVw3nrAwcY1PC0uMfyTd9fz7Cy06dh+EJc+h0wikABsVRzV8cIOPrVV+PPEEXE0DBrH20T2puZzgQ==", - "license": "MIT", - "dependencies": { - "appdirsjs": "^1.2.4", - "chalk": "^4.1.2", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "mime": "^2.4.1", - "node-fetch": "^2.6.0", - "open": "^6.2.0", - "ora": "^5.4.1", - "semver": "^7.5.2", - "shell-quote": "^1.7.3", - "sudo-prompt": "^9.0.0" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "license": "MIT", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/sudo-prompt": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", - "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", - "license": "MIT" - }, - "node_modules/@react-native-community/cli-types": { - "version": "13.6.9", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-13.6.9.tgz", - "integrity": "sha512-RLxDppvRxXfs3hxceW/mShi+6o5yS+kFPnPqZTaMKKR5aSg7LwDpLQW4K2D22irEG8e6RKDkZUeH9aL3vO2O0w==", - "license": "MIT", - "dependencies": { - "joi": "^17.2.1" - } - }, - "node_modules/@react-native-community/cli/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/@react-native-community/cli/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native-community/cli/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native-picker/picker": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/@react-native-picker/picker/-/picker-2.7.5.tgz", - "integrity": "sha512-vhMaOLkXSUb+YKVbukMJToU4g+89VMhBG2U9+cLYF8X8HtFRidrHjohGqT8/OyesDuKIXeLIP+UFYI9Q9CRA9Q==", - "license": "MIT", - "peerDependencies": { - "react": "*", - "react-native": "*" - } - }, - "node_modules/@react-native/assets-registry": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.74.87.tgz", - "integrity": "sha512-1XmRhqQchN+pXPKEKYdpJlwESxVomJOxtEnIkbo7GAlaN2sym84fHEGDXAjLilih5GVPpcpSmFzTy8jx3LtaFg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.87.tgz", - "integrity": "sha512-+vJYpMnENFrwtgvDfUj+CtVJRJuUnzAUYT0/Pb68Sq9RfcZ5xdcCuUgyf7JO+akW2VTBoJY427wkcxU30qrWWw==", - "license": "MIT", - "dependencies": { - "@react-native/codegen": "0.74.87" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.87.tgz", - "integrity": "sha512-hyKpfqzN2nxZmYYJ0tQIHG99FQO0OWXp/gVggAfEUgiT+yNKas1C60LuofUsK7cd+2o9jrpqgqW4WzEDZoBlTg==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.20.0", - "@babel/plugin-proposal-async-generator-functions": "^7.0.0", - "@babel/plugin-proposal-class-properties": "^7.18.0", - "@babel/plugin-proposal-export-default-from": "^7.0.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", - "@babel/plugin-proposal-numeric-separator": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.20.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.0", - "@babel/plugin-syntax-export-default-from": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.18.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", - "@babel/plugin-syntax-optional-chaining": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-async-to-generator": "^7.20.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.20.0", - "@babel/plugin-transform-flow-strip-types": "^7.20.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-react-jsx-self": "^7.0.0", - "@babel/plugin-transform-react-jsx-source": "^7.0.0", - "@babel/plugin-transform-runtime": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-sticky-regex": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.5.0", - "@babel/plugin-transform-unicode-regex": "^7.0.0", - "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "0.74.87", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.74.87.tgz", - "integrity": "sha512-GMSYDiD+86zLKgMMgz9z0k6FxmRn+z6cimYZKkucW4soGbxWsbjUAZoZ56sJwt2FJ3XVRgXCrnOCgXoH/Bkhcg==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.0", - "glob": "^7.1.1", - "hermes-parser": "0.19.1", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.87.tgz", - "integrity": "sha512-EgJG9lSr8x3X67dHQKQvU6EkO+3ksVlJHYIVv6U/AmW9dN80BEFxgYbSJ7icXS4wri7m4kHdgeq2PQ7/3vvrTQ==", - "license": "MIT", - "dependencies": { - "@react-native-community/cli-server-api": "13.6.9", - "@react-native-community/cli-tools": "13.6.9", - "@react-native/dev-middleware": "0.74.87", - "@react-native/metro-babel-transformer": "0.74.87", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "metro": "^0.80.3", - "metro-config": "^0.80.3", - "metro-core": "^0.80.3", - "node-fetch": "^2.2.0", - "querystring": "^0.2.1", - "readline": "^1.3.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/debugger-frontend": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.87.tgz", - "integrity": "sha512-MN95DJLYTv4EqJc+9JajA3AJZSBYJz2QEJ3uWlHrOky2vKrbbRVaW1ityTmaZa2OXIvNc6CZwSRSE7xCoHbXhQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/@react-native/dev-middleware": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.87.tgz", - "integrity": "sha512-7TmZ3hTHwooYgIHqc/z87BMe1ryrIqAUi+AF7vsD+EHCGxHFdMjSpf1BZ2SUPXuLnF2cTiTfV2RwhbPzx0tYIA==", - "license": "MIT", - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.74.87", - "@rnx-kit/chromium-edge-launcher": "^1.0.0", - "chrome-launcher": "^0.15.2", - "connect": "^3.6.5", - "debug": "^2.2.0", - "node-fetch": "^2.2.0", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "selfsigned": "^2.4.1", - "serve-static": "^1.13.1", - "temp-dir": "^2.0.0", - "ws": "^6.2.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" } }, "node_modules/@react-native/debugger-frontend": { - "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz", - "integrity": "sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.3.tgz", + "integrity": "sha512-pMHQ3NpPB28RxXciSvm2yD+uDx3pkhzfuWkc7VFgOduyzPSIr0zotUiOJzsAtrj8++bPbOsAraCeQhCqoOTWQw==", "license": "BSD-3-Clause", "engines": { "node": ">=18" } }, "node_modules/@react-native/dev-middleware": { - "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz", - "integrity": "sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.3.tgz", + "integrity": "sha512-b+2IpW40z1/S5Jo5JKrWPmucYU/PzeGyGBZZ/SJvmRnBDaP3txb9yIqNZAII1EWsKNhedh8vyRO5PSuJ9Juqzw==", "license": "MIT", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.74.85", - "@rnx-kit/chromium-edge-launcher": "^1.0.0", + "@react-native/debugger-frontend": "0.76.3", "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^2.2.0", - "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", "open": "^7.0.3", "selfsigned": "^2.4.1", "serve-static": "^1.13.1", - "temp-dir": "^2.0.0", - "ws": "^6.2.2" + "ws": "^6.2.3" }, "engines": { "node": ">=18" @@ -4804,22 +3779,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/@react-native/dev-middleware/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@react-native/dev-middleware/node_modules/ws": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", @@ -4830,32 +3789,32 @@ } }, "node_modules/@react-native/gradle-plugin": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.74.87.tgz", - "integrity": "sha512-T+VX0N1qP+U9V4oAtn7FTX7pfsoVkd1ocyw9swYXgJqU2fK7hC9famW7b3s3ZiufPGPr1VPJe2TVGtSopBjL6A==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.3.tgz", + "integrity": "sha512-t0aYZ8ND7+yc+yIm6Yp52bInneYpki6RSIFZ9/LMUzgMKvEB62ptt/7sfho9QkKHCNxE1DJSWIqLIGi/iHHkyg==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.74.87.tgz", - "integrity": "sha512-M5Evdn76CuVEF0GsaXiGi95CBZ4IWubHqwXxV9vG9CC9kq0PSkoM2Pn7Lx7dgyp4vT7ccJ8a3IwHbe+5KJRnpw==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.3.tgz", + "integrity": "sha512-pubJFArMMrdZiytH+W95KngcSQs+LsxOBsVHkwgMnpBfRUxXPMK4fudtBwWvhnwN76Oe+WhxSq7vOS5XgoPhmw==", "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.87.tgz", - "integrity": "sha512-UsJCO24sNax2NSPBmV1zLEVVNkS88kcgAiYrZHtYSwSjpl4WZ656tIeedBfiySdJ94Hr3kQmBYLipV5zk0NI1A==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.3.tgz", + "integrity": "sha512-b2zQPXmW7avw/7zewc9nzMULPIAjsTwN03hskhxHUJH5pzUf7pIklB3FrgYPZrRhJgzHiNl3tOPu7vqiKzBYPg==", "license": "MIT", "dependencies": { - "@babel/core": "^7.20.0", - "@react-native/babel-preset": "0.74.87", - "hermes-parser": "0.19.1", + "@babel/core": "^7.25.2", + "@react-native/babel-preset": "0.76.3", + "hermes-parser": "0.23.1", "nullthrows": "^1.1.1" }, "engines": { @@ -4866,15 +3825,15 @@ } }, "node_modules/@react-native/normalize-colors": { - "version": "0.74.85", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz", - "integrity": "sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.3.tgz", + "integrity": "sha512-Yrpmrh4IDEupUUM/dqVxhAN8QW1VEUR3Qrk2lzJC1jB2s46hDe0hrMP2vs12YJqlzshteOthjwXQlY0TgIzgbg==", "license": "MIT" }, "node_modules/@react-native/virtualized-lists": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.74.87.tgz", - "integrity": "sha512-lsGxoFMb0lyK/MiplNKJpD+A1EoEUumkLrCjH4Ht+ZlG8S0BfCxmskLZ6qXn3BiDSkLjfjI/qyZ3pnxNBvkXpQ==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.3.tgz", + "integrity": "sha512-wTGv9pVh3vAOWb29xFm+J9VRe9dUcUcb9FyaMLT/Hxa88W4wqa5ZMe1V9UvrrBiA1G5DKjv8/1ZcDsJhyugVKA==", "license": "MIT", "dependencies": { "invariant": "^2.2.4", @@ -4894,6 +3853,24 @@ } } }, + "node_modules/@react-navigation/bottom-tabs": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.6.1.tgz", + "integrity": "sha512-9oD4cypEBjPuaMiu9tevWGiQ4w/d6l3HNhcJ1IjXZ24xvYDSs0mqjUcdt8SWUolCvRrYc/DmNBLlT83bk0bHTw==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^1.3.31", + "color": "^4.2.3", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" + } + }, "node_modules/@react-navigation/core": { "version": "6.4.17", "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.17.tgz", @@ -4965,35 +3942,6 @@ "nanoid": "^3.1.23" } }, - "node_modules/@rnx-kit/chromium-edge-launcher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rnx-kit/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", - "integrity": "sha512-lzD84av1ZQhYUS+jsGqJiCMaJO2dn9u+RTT9n9q6D3SaKVwWqv+7AoRKqBu19bkwyE+iFRl1ymr40QS90jVFYg==", - "license": "Apache-2.0", - "dependencies": { - "@types/node": "^18.0.0", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=14.15" - } - }, - "node_modules/@rnx-kit/chromium-edge-launcher/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@segment/loosely-validate-event": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", @@ -5003,27 +3951,6 @@ "join-component": "^1.1.0" } }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "license": "BSD-3-Clause" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "license": "BSD-3-Clause" - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -5048,6 +3975,115 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@tanstack/query-core": { + "version": "5.62.8", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.62.8.tgz", + "integrity": "sha512-4fV31vDsUyvNGrKIOUNPrZztoyL187bThnoQOvAXEVlZbSiuPONpfx53634MKKdvsDir5NyOGm80ShFaoHS/mw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-devtools": { + "version": "5.61.4", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.61.4.tgz", + "integrity": "sha512-21Tw+u8E3IJJj4A/Bct4H0uBaDTEu7zBrR79FeSyY+mS2gx5/m316oDtJiKkILc819VSTYt+sFzODoJNcpPqZQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.62.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.62.8.tgz", + "integrity": "sha512-8TUstKxF/fysHonZsWg/hnlDVgasTdHx6Q+f1/s/oPKJBJbKUWPZEHwLTMOZgrZuroLMiqYKJ9w69Abm8mWP0Q==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.62.8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-query-devtools": { + "version": "5.62.8", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.62.8.tgz", + "integrity": "sha512-SwjXjQTRONd9WPeKVQQ9framG7YNqPV8PS+EGNVNXAyz2XThulMRCvZnh2+3DggnjcYM7YcpnuoZ4RH7q13p0g==", + "license": "MIT", + "dependencies": { + "@tanstack/query-devtools": "5.61.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@tanstack/react-query": "^5.62.8", + "react": "^18 || ^19" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "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==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/he": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.3.tgz", @@ -5071,12 +4107,11 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-coverage": "*", "@types/istanbul-lib-report": "*" } }, @@ -5106,9 +4141,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.79", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", - "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -5116,6 +4151,27 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-native": { + "version": "0.70.19", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.70.19.tgz", + "integrity": "sha512-c6WbyCgWTBgKKMESj/8b4w+zWcZSsCforson7UdXtXMecG3MxCinYi6ihhrHVPyUrVzORsvEzK8zg32z4pK6Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-native-vector-icons": { + "version": "6.4.18", + "resolved": "https://registry.npmjs.org/@types/react-native-vector-icons/-/react-native-vector-icons-6.4.18.tgz", + "integrity": "sha512-YGlNWb+k5laTBHd7+uZowB9DpIK3SXUneZqAiKQaj1jnJCZM0x71GDim5JCTMi4IFkhc9m8H/Gm28T5BjyivUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "@types/react-native": "^0.70" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -5123,9 +4179,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "license": "MIT", "dependencies": { "@types/yargs-parser": "*" @@ -5138,29 +4194,26 @@ "license": "MIT" }, "node_modules/@urql/core": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", - "integrity": "sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.0.8.tgz", + "integrity": "sha512-1GOnUw7/a9bzkcM0+U8U5MmxW2A7FE5YquuEmcJzTtW5tIs2EoS4F2ITpuKBjRBbyRjZgO860nWFPo1m4JImGA==", "license": "MIT", "dependencies": { - "@graphql-typed-document-node/core": "^3.1.0", - "wonka": "^4.0.14" - }, - "peerDependencies": { - "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "@0no-co/graphql.web": "^1.0.5", + "wonka": "^6.3.2" } }, "node_modules/@urql/exchange-retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz", - "integrity": "sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.0.tgz", + "integrity": "sha512-FLt+d81gP4oiHah4hWFDApimc+/xABWMU1AMYsZ1PVB0L0YPtrMCjbOp9WMM7hBzy4gbTDrG24sio0dCfSh/HQ==", "license": "MIT", "dependencies": { - "@urql/core": ">=2.3.1", - "wonka": "^4.0.14" + "@urql/core": "^5.0.0", + "wonka": "^6.3.2" }, "peerDependencies": { - "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + "@urql/core": "^5.0.0" } }, "node_modules/@xmldom/xmldom": { @@ -5210,18 +4263,6 @@ "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -5256,17 +4297,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-fragments": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", - "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", - "license": "MIT", - "dependencies": { - "colorette": "^1.0.7", - "slice-ansi": "^2.0.0", - "strip-ansi": "^5.0.0" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5322,12 +4352,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/appdirsjs": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", - "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", - "license": "MIT" - }, "node_modules/application-config-path": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.1.tgz", @@ -5349,22 +4373,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -5374,28 +4382,6 @@ "node": ">=8" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -5414,15 +4400,6 @@ "node": ">=4" } }, - "node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -5444,38 +4421,100 @@ "node": ">= 4.0.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "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==", + "license": "BSD-3-Clause", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "license": "MIT", - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -5496,72 +4535,47 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-react-compiler": { - "version": "0.0.0-experimental-592953e-20240517", - "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-592953e-20240517.tgz", - "integrity": "sha512-OjG1SVaeQZaJrqkMFJatg8W/MTow8Ak5rx2SI0ETQBO1XvOk/XZGMbltNCPdFJLKghBYoBjC+Y3Ap/Xr7B01mA==", - "license": "MIT", - "dependencies": { - "@babel/generator": "7.2.0", - "@babel/types": "^7.19.0", - "chalk": "4", - "invariant": "^2.2.4", - "pretty-format": "^24", - "zod": "^3.22.4", - "zod-validation-error": "^2.1.0" - } + "node_modules/babel-plugin-react-native-web": { + "version": "0.19.13", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz", + "integrity": "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==", + "license": "MIT" }, - "node_modules/babel-plugin-react-compiler/node_modules/@babel/generator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.0.tgz", - "integrity": "sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==", + "node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz", + "integrity": "sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.2.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.10", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "hermes-parser": "0.25.1" } }, - "node_modules/babel-plugin-react-compiler/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } + "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "license": "MIT" }, - "node_modules/babel-plugin-react-compiler/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" } }, - "node_modules/babel-plugin-react-native-web": { - "version": "0.19.13", - "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz", - "integrity": "sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ==", - "license": "MIT" - }, "node_modules/babel-plugin-transform-flow-enums": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", @@ -5571,10 +4585,36 @@ "@babel/plugin-syntax-flow": "^7.12.1" } }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/babel-preset-expo": { - "version": "11.0.15", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-11.0.15.tgz", - "integrity": "sha512-rgiMTYwqIPULaO7iZdqyL7aAff9QLOX6OWUtLZBlOrOTreGY1yHah/5+l8MvI6NVc/8Zj5LY4Y5uMSnJIuzTLw==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-12.0.3.tgz", + "integrity": "sha512-1695e8y3U/HjifKx33vcNnFMSUSXwPWwhFxRlL6NRx2TENN6gySH82gPOWgxcra6gi+EJgXx52xG3PcqTjwW6w==", "license": "MIT", "dependencies": { "@babel/plugin-proposal-decorators": "^7.12.9", @@ -5583,10 +4623,37 @@ "@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.87", - "babel-plugin-react-compiler": "0.0.0-experimental-592953e-20240517", - "babel-plugin-react-native-web": "~0.19.10", + "@react-native/babel-preset": "0.76.3", + "babel-plugin-react-native-web": "~0.19.13", "react-refresh": "^0.14.2" + }, + "peerDependencies": { + "babel-plugin-react-compiler": "^19.0.0-beta-9ee70a1-20241017", + "react-compiler-runtime": "^19.0.0-beta-8a03594-20241020" + }, + "peerDependenciesMeta": { + "babel-plugin-react-compiler": { + "optional": true + }, + "react-compiler-runtime": { + "optional": true + } + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/balanced-match": { @@ -5627,6 +4694,23 @@ "node": ">=12.0.0" } }, + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/big-integer": { "version": "1.6.52", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", @@ -5645,30 +4729,12 @@ "node": "*" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC", + "peer": true }, "node_modules/bplist-creator": { "version": "0.0.7", @@ -5713,6 +4779,22 @@ "node": ">=8" } }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, "node_modules/browserslist": { "version": "4.24.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", @@ -5806,12 +4888,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "license": "MIT" - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -5894,25 +4970,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -5947,15 +5004,12 @@ } }, "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/caniuse-lite": { @@ -6030,6 +5084,32 @@ "node": ">=12.13.0" } }, + "node_modules/chromium-edge-launcher": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", + "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "node_modules/chromium-edge-launcher/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -6105,9 +5185,9 @@ } }, "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "license": "MIT", "engines": { "node": ">=0.8" @@ -6127,6 +5207,19 @@ "node": ">=6" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -6145,11 +5238,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "license": "MIT" + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "node_modules/combined-stream": { "version": "1.0.8", @@ -6333,9 +5430,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -6364,74 +5461,65 @@ "node": ">=8" } }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/dag-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", - "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", - "license": "MIT" - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "license": "MIT", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", + "peer": true, "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "license": "MIT", + "peer": true, "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true, "license": "MIT" }, "node_modules/debug": { @@ -6451,15 +5539,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -6502,40 +5581,14 @@ }, "node_modules/defaults": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "clone": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-lazy-prop": { @@ -6547,23 +5600,6 @@ "node": ">=8" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/del": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", @@ -6632,6 +5668,12 @@ "node": ">=0.10" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6644,10 +5686,69 @@ "node": ">=8" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz", + "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -6657,12 +5758,12 @@ } }, "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "license": "BSD-2-Clause", "dependencies": { - "dotenv": "^16.4.4" + "dotenv": "^16.4.5" }, "engines": { "node": ">=12" @@ -6713,25 +5814,69 @@ "once": "^1.4.0" } }, - "node_modules/env-editor": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "node_modules/engine.io-client": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz", + "integrity": "sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.12" }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/eol": { @@ -6758,143 +5903,6 @@ "stackframe": "^1.3.4" } }, - "node_modules/errorhandler": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", - "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.7", - "escape-html": "~1.0.3" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -6988,9 +5996,9 @@ } }, "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "license": "MIT", "dependencies": { "nice-try": "^1.0.4", @@ -7055,94 +6063,126 @@ } }, "node_modules/expo": { - "version": "51.0.39", - "resolved": "https://registry.npmjs.org/expo/-/expo-51.0.39.tgz", - "integrity": "sha512-Cs/9xopyzJrpXWbyVUZnr37rprdFJorRgfSp6cdBfvbjxZeKnw2MEu7wJwV/s626i5lZTPGjZPHUF9uQvt51cg==", + "version": "52.0.15", + "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.15.tgz", + "integrity": "sha512-7eGv8y/aslaHvKH8XVvx0XpvJIQiJZ63kBHcdjtAmy+7KCMQp4lwmrnCzYhVdROe1i/GmHF2UwYfHXIYgC1WEw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.18.31", - "@expo/config": "9.0.4", - "@expo/config-plugins": "8.0.11", - "@expo/metro-config": "0.18.11", - "@expo/vector-icons": "^14.0.3", - "babel-preset-expo": "~11.0.15", - "expo-asset": "~10.0.10", - "expo-file-system": "~17.0.1", - "expo-font": "~12.0.10", - "expo-keep-awake": "~13.0.2", - "expo-modules-autolinking": "1.11.3", - "expo-modules-core": "1.12.26", + "@expo/cli": "0.22.1", + "@expo/config": "~10.0.6", + "@expo/config-plugins": "~9.0.11", + "@expo/fingerprint": "0.11.3", + "@expo/metro-config": "0.19.5", + "@expo/vector-icons": "^14.0.0", + "babel-preset-expo": "~12.0.3", + "expo-asset": "~11.0.1", + "expo-constants": "~17.0.3", + "expo-file-system": "~18.0.4", + "expo-font": "~13.0.1", + "expo-keep-awake": "~14.0.1", + "expo-modules-autolinking": "2.0.3", + "expo-modules-core": "2.1.1", "fbemitter": "^3.0.0", + "web-streams-polyfill": "^3.3.2", "whatwg-url-without-unicode": "8.0.0-3" }, "bin": { "expo": "bin/cli" + }, + "peerDependencies": { + "@expo/dom-webview": "*", + "@expo/metro-runtime": "*", + "react": "*", + "react-native": "*", + "react-native-webview": "*" + }, + "peerDependenciesMeta": { + "@expo/dom-webview": { + "optional": true + }, + "@expo/metro-runtime": { + "optional": true + }, + "react-native-webview": { + "optional": true + } } }, "node_modules/expo-asset": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-10.0.10.tgz", - "integrity": "sha512-0qoTIihB79k+wGus9wy0JMKq7DdenziVx3iUkGvMAy2azscSgWH6bd2gJ9CGnhC6JRd3qTMFBL0ou/fx7WZl7A==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.0.1.tgz", + "integrity": "sha512-WatvD7JVC89EsllXFYcS/rji3ajVzE2B/USo0TqedsETixwyVCQfrrvCdCPQyuKghrxVNEj8bQ/Qbea/RZLYjg==", "license": "MIT", "dependencies": { - "expo-constants": "~16.0.0", + "@expo/image-utils": "^0.6.0", + "expo-constants": "~17.0.0", "invariant": "^2.2.4", "md5-file": "^3.2.3" }, "peerDependencies": { - "expo": "*" + "expo": "*", + "react": "*", + "react-native": "*" } }, "node_modules/expo-constants": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-16.0.2.tgz", - "integrity": "sha512-9tNY3OVO0jfiMzl7ngb6IOyR5VFzNoN5OOazUWoeGfmMqVB5kltTemRvKraK9JRbBKIw+SOYLEmF0sEqgFZ6OQ==", + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-17.0.3.tgz", + "integrity": "sha512-lnbcX2sAu8SucHXEXxSkhiEpqH+jGrf+TF+MO6sHWIESjwOUVVYlT8qYdjR9xbxWmqFtrI4KV44FkeJf2DaFjQ==", "license": "MIT", "dependencies": { - "@expo/config": "~9.0.0", - "@expo/env": "~0.3.0" + "@expo/config": "~10.0.4", + "@expo/env": "~0.4.0" }, "peerDependencies": { - "expo": "*" + "expo": "*", + "react-native": "*" } }, "node_modules/expo-file-system": { - "version": "17.0.1", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-17.0.1.tgz", - "integrity": "sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.4.tgz", + "integrity": "sha512-aAWEDwnu0XHOBYvQ9Q0+QIa+483vYJaC4IDsXyWQ73Rtsg273NZh5kYowY+cAocvoSmA99G6htrLBn11ax2bTQ==", "license": "MIT", + "dependencies": { + "web-streams-polyfill": "^3.3.2" + }, "peerDependencies": { - "expo": "*" + "expo": "*", + "react-native": "*" } }, "node_modules/expo-font": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-12.0.10.tgz", - "integrity": "sha512-Q1i2NuYri3jy32zdnBaHHCya1wH1yMAsI+3CCmj9zlQzlhsS9Bdwcj2W3c5eU5FvH2hsNQy4O+O1NnM6o/pDaQ==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-13.0.1.tgz", + "integrity": "sha512-8JE47B+6cLeKWr5ql8gU6YsPHjhrz1vMrTqYMm72No/8iW8Sb/uL4Oc0dpmbjq3hLLXBY0xPBQOgU7FQ6Y04Vg==", "license": "MIT", "dependencies": { "fontfaceobserver": "^2.1.0" }, "peerDependencies": { - "expo": "*" + "expo": "*", + "react": "*" } }, "node_modules/expo-keep-awake": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-13.0.2.tgz", - "integrity": "sha512-kKiwkVg/bY0AJ5q1Pxnm/GvpeB6hbNJhcFsoOWDh2NlpibhCLaHL826KHUM+WsnJRbVRxJ+K9vbPRHEMvFpVyw==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-14.0.1.tgz", + "integrity": "sha512-c5mGCAIk2YM+Vsdy90BlEJ4ZX+KG5Au9EkJUIxXWlpnuKmDAJ3N+5nEZ7EUO1ZTheqoSBeAo4jJ8rTWPU+JXdw==", "license": "MIT", "peerDependencies": { - "expo": "*" + "expo": "*", + "react": "*" } }, "node_modules/expo-modules-autolinking": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.11.3.tgz", - "integrity": "sha512-oYh8EZEvYF5TYppxEKUTTJmbr8j7eRRnrIxzZtMvxLTXoujThVPMFS/cbnSnf2bFm1lq50TdDNABhmEi7z0ngQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-2.0.3.tgz", + "integrity": "sha512-Q/ALJ54eS7Cr7cmbP+unEDTkHFQivQerWWrqZxuXOrSFYGCYU22+/xAZXaJOpZwseOVsP74zSkoRY/wBimVs7w==", "license": "MIT", "dependencies": { + "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0", "fast-glob": "^3.2.5", @@ -7192,19 +6232,35 @@ } }, "node_modules/expo-modules-core": { - "version": "1.12.26", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.12.26.tgz", - "integrity": "sha512-y8yDWjOi+rQRdO+HY+LnUlz8qzHerUaw/LUjKPU/mX8PRXP4UUPEEp5fjAwBU44xjNmYSHWZDwet4IBBE+yQUA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-2.1.1.tgz", + "integrity": "sha512-yQzYCLR2mre4BNMXuqkeJ0oSNgmGEMI6BcmIzeNZbC2NFEjiaDpKvlV9bclYCtyVhUEVNbJcEPYMr6c1Y4eR4w==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" } }, + "node_modules/expo-splash-screen": { + "version": "0.29.18", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.29.18.tgz", + "integrity": "sha512-bTBY+LF6YtYen2j60yGNh2SX/tG4UXZAyBCMMriOSiZZ7LSCs3ARyEufaSiWk+ckWShTeMqItOnaAN/CAF8MJA==", + "license": "MIT", + "dependencies": { + "@expo/prebuild-config": "^8.0.23" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-status-bar": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.12.1.tgz", - "integrity": "sha512-/t3xdbS8KB0prj5KG5w7z+wZPFlPtkgs95BsmrP/E7Q0xHXTcDcQ6Cu2FkFuRM+PKTb17cJDnLkawyS5vDLxMA==", - "license": "MIT" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-2.0.0.tgz", + "integrity": "sha512-vxxdpvpNDMTEc5uTiIrbTvySKKUsOACmfl8OZuUdjNle05oGqwtq3v5YObwym/njSByjoyuZX8UpXBZnxvarwQ==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } }, "node_modules/exponential-backoff": { "version": "3.1.1", @@ -7234,27 +6290,11 @@ "node": ">=8.6.0" } }, - "node_modules/fast-xml-parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", - "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } + "node_modules/fast-json-stable-stringify": { + "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==", + "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", @@ -7394,15 +6434,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "license": "Apache-2.0", - "dependencies": { - "micromatch": "^4.0.2" - } - }, "node_modules/flow-enums-runtime": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", @@ -7410,29 +6441,40 @@ "license": "MIT" }, "node_modules/flow-parser": { - "version": "0.252.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.252.0.tgz", - "integrity": "sha512-z8hKPUjZ33VLn4HVntifqmEhmolUMopysnMNzazoDqo1GLUkBsreLNsxETlKJMPotUWStQnen6SGvUNe1j4Hlg==", + "version": "0.255.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.255.0.tgz", + "integrity": "sha512-7QHV2m2mIMh6yIMaAPOVbyNEW77IARwO69d4DgvfDCjuORiykdMLf7XBjF7Zeov7Cpe1OXJ8sB6/aaCE3xuRBw==", "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/fontfaceobserver": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "license": "BSD-2-Clause" }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -7533,43 +6575,16 @@ "license": "MIT", "optional": true, "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, + "darwin" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7593,23 +6608,13 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, "node_modules/get-port": { @@ -7633,23 +6638,6 @@ "node": ">=6" } }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/getenv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", @@ -7701,22 +6689,6 @@ "node": ">=4" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -7737,57 +6709,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/graphql": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", - "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", - "license": "MIT", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/graphql-tag": { - "version": "2.12.6", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", - "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7797,57 +6724,6 @@ "node": ">=8" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -7870,60 +6746,36 @@ } }, "node_modules/hermes-estree": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.19.1.tgz", - "integrity": "sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", + "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", "license": "MIT" }, "node_modules/hermes-parser": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.19.1.tgz", - "integrity": "sha512-Vp+bXzxYJWrpEuJ/vXxUsLnt0+y4q9zyi4zUlkLqD8FKv4LjIfOvP69R/9Lty3dCyKh0E2BU7Eypqr63/rKT/A==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.19.1" - } - }, - "node_modules/hermes-profile-transformer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", - "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", + "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", "license": "MIT", "dependencies": { - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=8" + "hermes-estree": "0.23.1" } }, "node_modules/hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "lru-cache": "^10.0.1" }, "engines": { - "node": ">=10" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "license": "ISC" }, "node_modules/html-parse-stringify": { @@ -7960,19 +6812,6 @@ "node": ">= 0.8" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -8136,20 +6975,6 @@ "node": ">=6" } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -8177,74 +7002,18 @@ "node": ">= 0.10" } }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "license": "MIT" }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-core-module": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", @@ -8260,36 +7029,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "license": "MIT", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -8323,81 +7062,18 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-invalid-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", - "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", - "license": "MIT", - "dependencies": { - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-invalid-path/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { - "is-extglob": "^1.0.0" + "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -8407,21 +7083,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -8440,6 +7101,15 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -8452,37 +7122,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -8492,87 +7131,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-valid-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", - "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", - "license": "MIT", - "dependencies": { - "is-invalid-path": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -8606,6 +7164,31 @@ "node": ">=0.10.0" } }, + "node_modules/istanbul-lib-coverage": { + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -8638,48 +7221,38 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-node/node_modules/@jest/types": { + "node_modules/jest-get-type": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-environment-node/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "license": "MIT", + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, "node_modules/jest-message-util": { @@ -8702,73 +7275,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-message-util/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/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==", - "license": "MIT" - }, "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", @@ -8783,39 +7289,13 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-mock/node_modules/@jest/types": { + "node_modules/jest-regex-util": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util": { @@ -8835,41 +7315,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-util/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-util/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -8899,73 +7344,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-validate/node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/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==", - "license": "MIT" - }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -9002,25 +7392,18 @@ "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", "license": "MIT" }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "license": "BSD-3-Clause", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, "node_modules/join-component": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==", "license": "MIT" }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9103,36 +7486,6 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "license": "MIT" }, - "node_modules/json-schema-deref-sync": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz", - "integrity": "sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==", - "license": "MIT", - "dependencies": { - "clone": "^2.1.2", - "dag-map": "~1.0.0", - "is-valid-path": "^0.1.1", - "lodash": "^4.17.13", - "md5": "~2.2.0", - "memory-cache": "~0.2.0", - "traverse": "~0.6.6", - "valid-url": "~1.0.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/json-schema-deref-sync/node_modules/md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", - "license": "BSD-3-Clause", - "dependencies": { - "charenc": "~0.0.1", - "crypt": "~0.0.1", - "is-buffer": "~1.1.1" - } - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9207,9 +7560,9 @@ "license": "MIT" }, "node_modules/lightningcss": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.19.0.tgz", - "integrity": "sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.27.0.tgz", + "integrity": "sha512-8f7aNmS1+etYSLHht0fQApPc2kNO8qGRutifN5rVIc6Xo6ABsEbqOr758UwI7ALVbTt4x1fllKt0PYgzD9S3yQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^1.0.3" @@ -9222,20 +7575,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.19.0", - "lightningcss-darwin-x64": "1.19.0", - "lightningcss-linux-arm-gnueabihf": "1.19.0", - "lightningcss-linux-arm64-gnu": "1.19.0", - "lightningcss-linux-arm64-musl": "1.19.0", - "lightningcss-linux-x64-gnu": "1.19.0", - "lightningcss-linux-x64-musl": "1.19.0", - "lightningcss-win32-x64-msvc": "1.19.0" + "lightningcss-darwin-arm64": "1.27.0", + "lightningcss-darwin-x64": "1.27.0", + "lightningcss-freebsd-x64": "1.27.0", + "lightningcss-linux-arm-gnueabihf": "1.27.0", + "lightningcss-linux-arm64-gnu": "1.27.0", + "lightningcss-linux-arm64-musl": "1.27.0", + "lightningcss-linux-x64-gnu": "1.27.0", + "lightningcss-linux-x64-musl": "1.27.0", + "lightningcss-win32-arm64-msvc": "1.27.0", + "lightningcss-win32-x64-msvc": "1.27.0" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz", - "integrity": "sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz", + "integrity": "sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ==", "cpu": [ "arm64" ], @@ -9253,9 +7608,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz", - "integrity": "sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz", + "integrity": "sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg==", "cpu": [ "x64" ], @@ -9272,10 +7627,30 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz", + "integrity": "sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz", - "integrity": "sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz", + "integrity": "sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA==", "cpu": [ "arm" ], @@ -9293,9 +7668,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz", - "integrity": "sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz", + "integrity": "sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A==", "cpu": [ "arm64" ], @@ -9313,9 +7688,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz", - "integrity": "sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz", + "integrity": "sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg==", "cpu": [ "arm64" ], @@ -9333,9 +7708,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz", - "integrity": "sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz", + "integrity": "sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A==", "cpu": [ "x64" ], @@ -9353,9 +7728,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz", - "integrity": "sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz", + "integrity": "sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA==", "cpu": [ "x64" ], @@ -9372,10 +7747,30 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz", + "integrity": "sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz", - "integrity": "sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz", + "integrity": "sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw==", "cpu": [ "x64" ], @@ -9479,192 +7874,39 @@ } }, "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/logkitty": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", - "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", - "license": "MIT", - "dependencies": { - "ansi-fragments": "^0.2.1", - "dayjs": "^1.8.15", - "yargs": "^15.1.0" - }, - "bin": { - "logkitty": "bin/logkitty.js" - } - }, - "node_modules/logkitty/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/logkitty/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/logkitty/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logkitty/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/logkitty/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" }, - "node_modules/logkitty/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.8.0" } }, - "node_modules/logkitty/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "license": "ISC" - }, - "node_modules/logkitty/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/logkitty/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "license": "ISC", + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/loose-envify": { @@ -9731,6 +7973,16 @@ "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "license": "Apache-2.0" }, + "node_modules/match-sorter": { + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.4.tgz", + "integrity": "sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.8", + "remove-accents": "0.5.0" + } + }, "node_modules/md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -9757,11 +8009,12 @@ "node": ">=0.10" } }, - "node_modules/md5hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", - "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==", - "license": "MIT" + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0", + "peer": true }, "node_modules/memoize-one": { "version": "5.2.1", @@ -9769,11 +8022,17 @@ "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", "license": "MIT" }, - "node_modules/memory-cache": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", - "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", - "license": "BSD-2-Clause" + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -9791,18 +8050,18 @@ } }, "node_modules/metro": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.12.tgz", - "integrity": "sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.0.tgz", + "integrity": "sha512-kzdzmpL0gKhEthZ9aOV7sTqvg6NuTxDV8SIm9pf9sO8VVEbKrQk5DNcwupOUjgPPFAuKUc2NkT0suyT62hm2xg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", + "@babel/types": "^7.25.2", "accepts": "^1.3.7", "chalk": "^4.0.0", "ci-info": "^2.0.0", @@ -9812,24 +8071,24 @@ "error-stack-parser": "^2.0.6", "flow-enums-runtime": "^0.0.6", "graceful-fs": "^4.2.4", - "hermes-parser": "0.23.1", + "hermes-parser": "0.24.0", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.6.3", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.80.12", - "metro-cache": "0.80.12", - "metro-cache-key": "0.80.12", - "metro-config": "0.80.12", - "metro-core": "0.80.12", - "metro-file-map": "0.80.12", - "metro-resolver": "0.80.12", - "metro-runtime": "0.80.12", - "metro-source-map": "0.80.12", - "metro-symbolicate": "0.80.12", - "metro-transform-plugins": "0.80.12", - "metro-transform-worker": "0.80.12", + "metro-babel-transformer": "0.81.0", + "metro-cache": "0.81.0", + "metro-cache-key": "0.81.0", + "metro-config": "0.81.0", + "metro-core": "0.81.0", + "metro-file-map": "0.81.0", + "metro-resolver": "0.81.0", + "metro-runtime": "0.81.0", + "metro-source-map": "0.81.0", + "metro-symbolicate": "0.81.0", + "metro-transform-plugins": "0.81.0", + "metro-transform-worker": "0.81.0", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", @@ -9843,102 +8102,102 @@ "metro": "src/cli.js" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-babel-transformer": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz", - "integrity": "sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz", + "integrity": "sha512-Dc0QWK4wZIeHnyZ3sevWGTnnSkIDDn/SWyfrn99zbKbDOCoCYy71PAn9uCRrP/hduKLJQOy+tebd63Rr9D8tXg==", "license": "MIT", "dependencies": { - "@babel/core": "^7.20.0", + "@babel/core": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.23.1", + "hermes-parser": "0.24.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", - "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", + "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", "license": "MIT" }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", - "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", + "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", "license": "MIT", "dependencies": { - "hermes-estree": "0.23.1" + "hermes-estree": "0.24.0" } }, "node_modules/metro-cache": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.12.tgz", - "integrity": "sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.0.tgz", + "integrity": "sha512-DyuqySicHXkHUDZFVJmh0ygxBSx6pCKUrTcSgb884oiscV/ROt1Vhye+x+OIHcsodyA10gzZtrVtxIFV4l9I4g==", "license": "MIT", "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", - "metro-core": "0.80.12" + "metro-core": "0.81.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-cache-key": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.12.tgz", - "integrity": "sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.0.tgz", + "integrity": "sha512-qX/IwtknP9bQZL78OK9xeSvLM/xlGfrs6SlUGgHvrxtmGTRSsxcyqxR+c+7ch1xr05n62Gin/O44QKg5V70rNQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-config": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.12.tgz", - "integrity": "sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.0.tgz", + "integrity": "sha512-6CinEaBe3WLpRlKlYXXu8r1UblJhbwD6Gtnoib5U8j6Pjp7XxMG9h/DGMeNp9aGLDu1OieUqiXpFo7O0/rR5Kg==", "license": "MIT", "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.6.3", - "metro": "0.80.12", - "metro-cache": "0.80.12", - "metro-core": "0.80.12", - "metro-runtime": "0.80.12" + "metro": "0.81.0", + "metro-cache": "0.81.0", + "metro-core": "0.81.0", + "metro-runtime": "0.81.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-core": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.12.tgz", - "integrity": "sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.0.tgz", + "integrity": "sha512-CVkM5YCOAFkNMvJai6KzA0RpztzfEKRX62/PFMOJ9J7K0uq/UkOFLxcgpcncMIrfy0PbfEj811b69tjULUQe1Q==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.80.12" + "metro-resolver": "0.81.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-file-map": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.12.tgz", - "integrity": "sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.0.tgz", + "integrity": "sha512-zMDI5uYhQCyxbye/AuFx/pAbsz9K+vKL7h1ShUXdN2fz4VUPiyQYRsRqOoVG1DsiCgzd5B6LW0YW77NFpjDQeg==", "license": "MIT", "dependencies": { "anymatch": "^3.0.3", @@ -9954,7 +8213,7 @@ "walker": "^1.0.7" }, "engines": { - "node": ">=18" + "node": ">=18.18" }, "optionalDependencies": { "fsevents": "^2.3.2" @@ -9976,81 +8235,73 @@ "license": "MIT" }, "node_modules/metro-minify-terser": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz", - "integrity": "sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.0.tgz", + "integrity": "sha512-U2ramh3W822ZR1nfXgIk+emxsf5eZSg10GbQrT0ZizImK8IZ5BmJY+BHRIkQgHzWFpExOVxC7kWbGL1bZALswA==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "terser": "^5.15.0" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-resolver": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.12.tgz", - "integrity": "sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.0.tgz", + "integrity": "sha512-Uu2Q+buHhm571cEwpPek8egMbdSTqmwT/5U7ZVNpK6Z2ElQBBCxd7HmFAslKXa7wgpTO2FAn6MqGeERbAtVDUA==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-runtime": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.12.tgz", - "integrity": "sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.0.tgz", + "integrity": "sha512-6oYB5HOt37RuGz2eV4A6yhcl+PUTwJYLDlY9vhT+aVjbUWI6MdBCf69vc4f5K5Vpt+yOkjy+2LDwLS0ykWFwYw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.0", "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-source-map": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.12.tgz", - "integrity": "sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.0.tgz", + "integrity": "sha512-TzsVxhH83dyxg4A4+L1nzNO12I7ps5IHLjKGZH3Hrf549eiZivkdjYiq/S5lOB+p2HiQ+Ykcwtmcja95LIC62g==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0", + "@babel/traverse": "^7.25.3", + "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", + "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.80.12", + "metro-symbolicate": "0.81.0", "nullthrows": "^1.1.1", - "ob1": "0.80.12", + "ob1": "0.81.0", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "engines": { - "node": ">=18" - } - }, - "node_modules/metro-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": ">=18.18" } }, "node_modules/metro-symbolicate": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz", - "integrity": "sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.0.tgz", + "integrity": "sha512-C/1rWbNTPYp6yzID8IPuQPpVGzJ2rbWYBATxlvQ9dfK5lVNoxcwz77hjcY8ISLsRRR15hyd/zbjCNKPKeNgE1Q==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.80.12", + "metro-source-map": "0.81.0", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "through2": "^2.0.1", @@ -10060,57 +8311,48 @@ "metro-symbolicate": "src/index.js" }, "engines": { - "node": ">=18" - } - }, - "node_modules/metro-symbolicate/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" + "node": ">=18.18" } }, "node_modules/metro-transform-plugins": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz", - "integrity": "sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.0.tgz", + "integrity": "sha512-uErLAPBvttGCrmGSCa0dNHlOTk3uJFVEVWa5WDg6tQ79PRmuYRwzUgLhVzn/9/kyr75eUX3QWXN79Jvu4txt6Q==", "license": "MIT", "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.3", "flow-enums-runtime": "^0.0.6", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro-transform-worker": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz", - "integrity": "sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.0.tgz", + "integrity": "sha512-HrQ0twiruhKy0yA+9nK5bIe3WQXZcC66PXTvRIos61/EASLAP2DzEmW7IxN/MGsfZegN2UzqL2CG38+mOB45vg==", "license": "MIT", "dependencies": { - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.0", - "@babel/parser": "^7.20.0", - "@babel/types": "^7.20.0", + "@babel/core": "^7.25.2", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.3", + "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "metro": "0.80.12", - "metro-babel-transformer": "0.80.12", - "metro-cache": "0.80.12", - "metro-cache-key": "0.80.12", - "metro-minify-terser": "0.80.12", - "metro-source-map": "0.80.12", - "metro-transform-plugins": "0.80.12", + "metro": "0.81.0", + "metro-babel-transformer": "0.81.0", + "metro-cache": "0.81.0", + "metro-cache-key": "0.81.0", + "metro-minify-terser": "0.81.0", + "metro-source-map": "0.81.0", + "metro-transform-plugins": "0.81.0", "nullthrows": "^1.1.1" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/metro/node_modules/ci-info": { @@ -10129,18 +8371,18 @@ } }, "node_modules/metro/node_modules/hermes-estree": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", - "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", + "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", "license": "MIT" }, "node_modules/metro/node_modules/hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", - "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", + "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", "license": "MIT", "dependencies": { - "hermes-estree": "0.23.1" + "hermes-estree": "0.24.0" } }, "node_modules/metro/node_modules/ms": { @@ -10149,15 +8391,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/metro/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/metro/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -10216,16 +8449,22 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==", + "license": "MIT" + }, "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, "node_modules/mime-db": { @@ -10420,6 +8659,15 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "license": "ISC", + "dependencies": { + "big-integer": "^1.6.16" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -10465,15 +8713,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "license": "MIT" }, - "node_modules/nocache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", - "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -10533,19 +8772,6 @@ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, - "node_modules/node-stream-zip": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/antelle" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -10556,24 +8782,30 @@ } }, "node_modules/npm-package-arg": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", - "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "license": "ISC", "dependencies": { - "hosted-git-info": "^3.0.2", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm-package-arg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/npm-run-path": { @@ -10597,6 +8829,19 @@ "node": ">=4" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/nullthrows": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", @@ -10604,15 +8849,15 @@ "license": "MIT" }, "node_modules/ob1": { - "version": "0.80.12", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.12.tgz", - "integrity": "sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==", + "version": "0.81.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.0.tgz", + "integrity": "sha512-6Cvrkxt1tqaRdWqTAMcVYEiO5i1xcF9y7t06nFdjFqkfPsEloCf8WwhXdwBpNUkVYSQlSGS7cDgVQR86miBfBQ==", "license": "MIT", "dependencies": { "flow-enums-runtime": "^0.0.6" }, "engines": { - "node": ">=18" + "node": ">=18.18" } }, "node_modules/object-assign": { @@ -10624,44 +8869,11 @@ "node": ">=0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==", + "license": "MIT" }, "node_modules/on-finished": { "version": "2.3.0", @@ -10706,17 +8918,16 @@ } }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10810,15 +9021,6 @@ "node": ">=4" } }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -10828,17 +9030,6 @@ "node": ">=0.10.0" } }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -11166,19 +9357,10 @@ "node": ">=4.0.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -11196,7 +9378,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -11216,56 +9398,46 @@ } }, "node_modules/pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", - "license": "MIT", - "dependencies": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } - }, - "node_modules/pretty-format/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-format/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/pretty-format/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==", "license": "MIT" }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -11314,6 +9486,12 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -11359,16 +9537,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/queue": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", @@ -11423,9 +9591,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -11506,47 +9674,48 @@ "license": "MIT" }, "node_modules/react-native": { - "version": "0.74.5", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.74.5.tgz", - "integrity": "sha512-Bgg2WvxaGODukJMTZFTZBNMKVaROHLwSb8VAGEdrlvKwfb1hHg/3aXTUICYk7dwgAnb+INbGMwnF8yeAgIUmqw==", + "version": "0.76.3", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.3.tgz", + "integrity": "sha512-0TUhgmlouRNf6yuDIIAdbQl0g1VsONgCMsLs7Et64hjj5VLMCA7np+4dMrZvGZ3wRNqzgeyT9oWJsUm49AcwSQ==", "license": "MIT", "dependencies": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "13.6.9", - "@react-native-community/cli-platform-android": "13.6.9", - "@react-native-community/cli-platform-ios": "13.6.9", - "@react-native/assets-registry": "0.74.87", - "@react-native/codegen": "0.74.87", - "@react-native/community-cli-plugin": "0.74.87", - "@react-native/gradle-plugin": "0.74.87", - "@react-native/js-polyfills": "0.74.87", - "@react-native/normalize-colors": "0.74.87", - "@react-native/virtualized-lists": "0.74.87", + "@react-native/assets-registry": "0.76.3", + "@react-native/codegen": "0.76.3", + "@react-native/community-cli-plugin": "0.76.3", + "@react-native/gradle-plugin": "0.76.3", + "@react-native/js-polyfills": "0.76.3", + "@react-native/normalize-colors": "0.76.3", + "@react-native/virtualized-lists": "0.76.3", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", + "babel-jest": "^29.7.0", + "babel-plugin-syntax-hermes-parser": "^0.23.1", "base64-js": "^1.5.1", "chalk": "^4.0.0", + "commander": "^12.0.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", + "glob": "^7.1.1", "invariant": "^2.2.4", "jest-environment-node": "^29.6.3", "jsc-android": "^250231.0.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.3", - "metro-source-map": "^0.80.3", + "metro-runtime": "^0.81.0", + "metro-source-map": "^0.81.0", "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", - "pretty-format": "^26.5.2", + "pretty-format": "^29.7.0", "promise": "^8.3.0", - "react-devtools-core": "^5.0.0", + "react-devtools-core": "^5.3.1", "react-refresh": "^0.14.0", - "react-shallow-renderer": "^16.15.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.24.0-canary-efb381bbf-20230505", + "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", - "ws": "^6.2.2", + "ws": "^6.2.3", "yargs": "^17.6.2" }, "bin": { @@ -11557,7 +9726,7 @@ }, "peerDependencies": { "@types/react": "^18.2.6", - "react": "18.2.0" + "react": "^18.2.0" }, "peerDependenciesMeta": { "@types/react": { @@ -11565,10 +9734,28 @@ } } }, + "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==", + "license": "MIT" + }, + "node_modules/react-native-progress": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-native-progress/-/react-native-progress-5.0.1.tgz", + "integrity": "sha512-TYfJ4auAe5vubDma2yfFvt7ktSI+UCfysqJnkdHEcLXqAitRFOozgF/cLgN5VNi/iLdaf3ga1ETi2RF4jVZ/+g==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react-native-svg": "*" + } + }, "node_modules/react-native-safe-area-context": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.10.5.tgz", - "integrity": "sha512-Wyb0Nqw2XJ6oZxW/cK8k5q7/UAhg/wbEG6UVf89rQqecDZTDA5ic//P9J6VvJRVZerzGmxWQpVuM7f+PRYUM4g==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.12.0.tgz", + "integrity": "sha512-ukk5PxcF4p3yu6qMZcmeiZgowhb5AsKRnil54YFUUAXVIS7PJcMHGGC+q44fCiBg44/1AJk5njGMez1m9H0BVQ==", "license": "MIT", "peerDependencies": { "react": "*", @@ -11576,9 +9763,9 @@ } }, "node_modules/react-native-screens": { - "version": "3.31.1", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.31.1.tgz", - "integrity": "sha512-8fRW362pfZ9y4rS8KY5P3DFScrmwo/vu1RrRMMx0PNHbeC9TLq0Kw1ubD83591yz64gLNHFLTVkTJmWeWCXKtQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.1.0.tgz", + "integrity": "sha512-tCBwe7fRMpoi/nIgZxE86N8b2SH8d5PlfGaQO8lgqlXqIyvwqm3u1HJCaA0tsacPyzhW7vVtRfQyq9e1j0S2gA==", "license": "MIT", "dependencies": { "react-freeze": "^1.0.0", @@ -11589,59 +9776,110 @@ "react-native": "*" } }, - "node_modules/react-native/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "node_modules/react-native-sse": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-native-sse/-/react-native-sse-1.2.1.tgz", + "integrity": "sha512-zejanlScF+IB9tYnbdry0MT34qjBXbiV/E72qGz33W/tX1bx8MXsbB4lxiuPETc9v/008vYZ60yjIstW22VlVg==", + "license": "MIT" + }, + "node_modules/react-native-svg": { + "version": "15.10.1", + "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.10.1.tgz", + "integrity": "sha512-Hqz/doQciVFK/Df2v+wsW96oY5jxlta7rZ31KQYo78dlgvAHEaGr6paEOAMvlIruw7EHNQ0Vc1ZmJPJF2kfIPQ==", "license": "MIT", + "peer": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" + "css-select": "^5.1.0", + "css-tree": "^1.1.3", + "warn-once": "0.1.1" }, - "engines": { - "node": ">= 10.14.2" + "peerDependencies": { + "react": "*", + "react-native": "*" } }, - "node_modules/react-native/node_modules/@react-native/normalize-colors": { - "version": "0.74.87", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.87.tgz", - "integrity": "sha512-Xh7Nyk/MPefkb0Itl5Z+3oOobeG9lfLb7ZOY2DKpFnoCE1TzBmib9vMNdFaLdSxLIP+Ec6icgKtdzYg8QUPYzA==", - "license": "MIT" - }, - "node_modules/react-native/node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/react-native-vector-icons": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/react-native-vector-icons/-/react-native-vector-icons-10.2.0.tgz", + "integrity": "sha512-n5HGcxUuVaTf9QJPs/W22xQpC2Z9u0nb0KgLPnVltP8vdUvOp6+R26gF55kilP/fV4eL4vsAHUqUjewppJMBOQ==", "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "prop-types": "^15.7.2", + "yargs": "^16.1.1" + }, + "bin": { + "fa-upgrade.sh": "bin/fa-upgrade.sh", + "fa5-upgrade": "bin/fa5-upgrade.sh", + "fa6-upgrade": "bin/fa6-upgrade.sh", + "generate-icon": "bin/generate-icon.js" + } + }, + "node_modules/react-native-vector-icons/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/react-native/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", + "node_modules/react-native-vector-icons/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "@types/yargs-parser": "*" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/react-native/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "node_modules/react-native-vector-icons/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">= 10" + "node": ">=10" + } + }, + "node_modules/react-native-vector-icons/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.23.1.tgz", + "integrity": "sha512-uNLD0tk2tLUjGFdmCk+u/3FEw2o+BAwW4g+z2QVlxJrzZYOOPADroEcNtTPt5lNiScctaUmnsTkVEnOwZUOLhA==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.23.1" + } + }, + "node_modules/react-native/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" } }, "node_modules/react-native/node_modules/promise": { @@ -11653,18 +9891,24 @@ "asap": "~2.0.6" } }, - "node_modules/react-native/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, "node_modules/react-native/node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "license": "MIT" }, + "node_modules/react-native/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/react-native/node_modules/ws": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", @@ -11674,6 +9918,32 @@ "async-limiter": "~1.0.0" } }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -11683,19 +9953,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-shallow-renderer": { - "version": "16.15.0", - "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", - "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1", - "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -11776,39 +10033,20 @@ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.8.4" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpu-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", - "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "license": "MIT", "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", - "regjsparser": "^0.11.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -11823,9 +10061,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", - "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "license": "BSD-2-Clause", "dependencies": { "jsesc": "~3.0.2" @@ -11834,6 +10072,12 @@ "regjsparser": "bin/parser" } }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, "node_modules/remove-trailing-slash": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", @@ -11858,12 +10102,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "license": "ISC" - }, "node_modules/requireg": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", @@ -11912,10 +10150,16 @@ "node": ">=8" } }, + "node_modules/resolve-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", + "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", + "license": "MIT" + }, "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "license": "MIT", "engines": { "node": ">=10" @@ -11983,30 +10227,15 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "license": "MIT", + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "tslib": "^2.1.0" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -12027,23 +10256,6 @@ ], "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -12082,15 +10294,15 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", + "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", @@ -12120,16 +10332,13 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/send/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, "node_modules/send/node_modules/on-finished": { @@ -12201,18 +10410,6 @@ "node": ">= 0.8" } }, - "node_modules/serve-static/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/serve-static/node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -12267,44 +10464,6 @@ "node": ">= 0.8" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -12359,24 +10518,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -12415,6 +10556,21 @@ "node": ">= 5.10.0" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -12430,63 +10586,50 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=4" + "node": ">=10.0.0" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "license": "MIT", "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", - "license": "MIT", + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, "engines": { - "node": ">=8.0.0" + "node": ">=10.0.0" } }, "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { @@ -12717,55 +10860,6 @@ "node": ">=8" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -12827,12 +10921,6 @@ "node": ">=0.10.0" } }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "license": "MIT" - }, "node_modules/structured-headers": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", @@ -12840,14 +10928,14 @@ "license": "MIT" }, "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "7.1.6", + "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", @@ -12858,7 +10946,16 @@ "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/sucrase/node_modules/commander": { @@ -12871,21 +10968,35 @@ } }, "node_modules/sucrase/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", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "license": "ISC", "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" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -13096,9 +11207,9 @@ } }, "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -13119,11 +11230,19 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "license": "MIT" + "node_modules/test-exclude": { + "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==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } }, "node_modules/thenify": { "version": "3.3.1", @@ -13213,32 +11332,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, - "node_modules/traverse": { - "version": "0.6.10", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.10.tgz", - "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==", - "license": "MIT", - "dependencies": { - "gopd": "^1.0.1", - "typedarray.prototype.slice": "^1.0.3", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -13272,99 +11365,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", - "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-errors": "^1.3.0", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-offset": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typescript": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -13405,19 +11405,13 @@ "node": "*" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/undici": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=18.17" } }, "node_modules/undici-types": { @@ -13511,6 +11505,16 @@ "node": ">= 4.0.0" } }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -13550,12 +11554,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==", - "license": "MIT" - }, "node_modules/use-latest-callback": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.1.tgz", @@ -13589,18 +11587,13 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" - }, "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/vary": { @@ -13651,6 +11644,15 @@ "defaults": "^1.0.3" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -13711,51 +11713,10 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "license": "ISC" - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wonka": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", - "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.4.tgz", + "integrity": "sha512-CjpbqNtBGNAeyNS/9W6q3kSkKE52+FjIj7AkFlLr11s/VWGUu6a2CdYSdGxocIhIVjaW/zchesBQUKPVU69Cqg==", "license": "MIT" }, "node_modules/wrap-ansi": { @@ -13908,6 +11869,14 @@ "node": ">=8.0" } }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -13932,18 +11901,6 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, - "node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -13982,27 +11939,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-2.1.0.tgz", - "integrity": "sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.18.0" - } } } } diff --git a/package.json b/package.json index a7b18426d17afeca9a0e8aea6933a6421ae63c75..fd3a2bf9088f4150929498d11e1f5854e6b360de 100644 --- a/package.json +++ b/package.json @@ -9,24 +9,40 @@ "web": "expo start --web" }, "dependencies": { - "@react-native-picker/picker": "2.7.5", + "@react-native-async-storage/async-storage": "1.23.1", + "@react-native-cookies/cookies": "^6.2.1", + "@react-native-picker/picker": "^2.9.0", + "@react-navigation/bottom-tabs": "^6.6.1", "@react-navigation/native": "^6.1.18", "@react-navigation/native-stack": "^6.11.0", - "expo": "~51.0.39", - "expo-status-bar": "~1.12.1", + "@tanstack/react-query": "^5.62.8", + "@tanstack/react-query-devtools": "^5.62.8", + "axios": "^1.7.9", + "dotenv": "^16.4.7", + "expo": "~52.0.14", + "expo-splash-screen": "^0.29.13", + "expo-status-bar": "~2.0.0", "he": "^1.2.0", "i18n-js": "^4.5.0", "i18next": "^23.16.5", - "react": "18.2.0", + "react": "^18.3.1", "react-i18next": "^15.1.1", - "react-native": "0.74.5", - "react-native-safe-area-context": "4.10.5", - "react-native-screens": "3.31.1" + "react-native": "0.76.3", + "react-native-dropdown-select-list": "^2.0.5", + "react-native-progress": "^5.0.1", + "react-native-safe-area-context": "^4.12.0", + "react-native-screens": "~4.1.0", + "react-native-sse": "^1.2.1", + "react-native-vector-icons": "^10.2.0", + "react-query": "^3.39.3", + "rxjs": "^7.8.1", + "socket.io-client": "^4.8.1" }, "devDependencies": { "@babel/core": "^7.20.0", "@types/he": "^1.2.3", - "@types/react": "~18.2.45", + "@types/react": "~18.3.12", + "@types/react-native-vector-icons": "^6.4.18", "typescript": "~5.3.3" }, "private": true diff --git a/routes/StackNavigator.tsx b/routes/StackNavigator.tsx index e6d9420f38e81b52dcc7b765032c40a2d6bf5f45..410e49bd0fb3790b6caa4b01fc39d0ec76a53e5f 100644 --- a/routes/StackNavigator.tsx +++ b/routes/StackNavigator.tsx @@ -1,20 +1,46 @@ import {createNativeStackNavigator} from "@react-navigation/native-stack"; import {NavigationContainer} from "@react-navigation/native"; -import Home from "../screens/Home"; -import Question from "../screens/Question/Question"; -import CreationQuiz from "../screens/CreationQuiz/CreationQuiz"; -import FinQuiz from "../screens/FinQuiz/FinQuiz"; +import Home from "../screens/Home/Home"; +import GenerateQuiz from "../screens/Home/PlayQuiz/GenerateQuiz/GenerateQuiz"; +import EndQuiz from "../screens/PlayingQuiz/EndQuiz/EndQuiz"; +import PlayingQuiz from "../screens/PlayingQuiz/PlayingQuiz"; +import TabNavigator from "./TabNavigation"; +import Multiplayer from "../screens/Multiplayer/Multiplayer"; +import MultiplayerCommunity from "../screens/Multiplayer/MultiplayerCommunity/MultiplayerCommunity"; +import OnlineQuiz from "../screens/Multiplayer/OnlineQuiz/OnlineQuiz"; +import OngoingQuizzes from "../screens/Multiplayer/OngoingQuizzes/OngoingQuizzes"; +import Lobby from "../screens/Multiplayer/Lobby/Lobby"; +import PlayQuiz from "../screens/Home/PlayQuiz/PlayQuiz"; +import MyQuizzes from "../screens/Home/MyQuizzes/MyQuizzes"; +import InformationsOfQuiz from "../screens/Community/InformationsOfQuiz/InformationsOfQuiz"; +import EndQuizMulti from "../screens/PlayingQuiz/EndQuizMulti/EndQuizMulti"; +import MultiInformationsOfQuiz from "../screens/Multiplayer/MultiplayerCommunity/InformationsOfQuiz/MultiInformationsOfQuiz"; +import InformationsOfRuns from "../screens/Home/MyQuizzes/InformationsOfRuns"; +import PlayingQuizMultiMode from "../screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiMode"; const Stack = createNativeStackNavigator(); export default function StackNavigator() { return ( <NavigationContainer> - <Stack.Navigator initialRouteName="Home"> + <Stack.Navigator initialRouteName="TabNavigator"> + <Stack.Screen name="TabNavigator" component={TabNavigator} options={{ headerShown: false }}/> <Stack.Screen name="Home" component={Home} options={{ headerShown: false }}/> - <Stack.Screen name="CreateQuiz" component={CreationQuiz} options={{ headerShown: false }}/> - <Stack.Screen name="Question" component={Question} options={{ headerShown: false }}/> - <Stack.Screen name="FinQuiz" component={FinQuiz} options={{ headerShown: false }}/> + <Stack.Screen name="GenerateQuiz" component={GenerateQuiz} options={{ headerShown: false }}/> + <Stack.Screen name="PlayingQuiz" component={PlayingQuiz} options={{ headerShown: false }}/> + <Stack.Screen name="PlayQuiz" component={PlayQuiz} options={{ headerShown: false }}/> + <Stack.Screen name="EndQuiz" component={EndQuiz} options={{ headerShown: false }}/> + <Stack.Screen name="EndQuizMulti" component={EndQuizMulti} options={{ headerShown: false }}/> + <Stack.Screen name="MyQuizzes" component={MyQuizzes} options={{ headerShown: false }}/> + <Stack.Screen name="InformationsOfQuiz" component={InformationsOfQuiz} options={{ headerShown: false }}/> + <Stack.Screen name="InformationsOfRuns" component={InformationsOfRuns} options={{ headerShown: false }}/> + <Stack.Screen name="PlayingQuizMultiMode" component={PlayingQuizMultiMode} options={{ headerShown: false }}/> + <Stack.Screen name="Multiplayer" component={Multiplayer} options={{ headerShown: false }}/> + <Stack.Screen name="MultiplayerCommunity" component={MultiplayerCommunity} options={{ headerShown: false }}/> + <Stack.Screen name="OnlineQuiz" component={OnlineQuiz} options={{ headerShown: false }}/> + <Stack.Screen name="OngoingQuizzes" component={OngoingQuizzes} options={{ headerShown: false }}/> + <Stack.Screen name="Lobby" component={Lobby} options={{ headerShown: false }}/> + <Stack.Screen name="MultiInformationsOfQuiz" component={MultiInformationsOfQuiz} options={{ headerShown: false }}/> </Stack.Navigator> </NavigationContainer> ); diff --git a/routes/TabNavigation.tsx b/routes/TabNavigation.tsx new file mode 100644 index 0000000000000000000000000000000000000000..bc58c3e2f9538893ea40e2bf156b87ddf1545d1f --- /dev/null +++ b/routes/TabNavigation.tsx @@ -0,0 +1,65 @@ +import * as React from "react"; +import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; +import Home from "../screens/Home/Home"; +import Icon from "react-native-vector-icons/MaterialIcons"; +import Profil from "../screens/Profil/Profil"; +import Community from "../screens/Community/Community"; +import Multiplayer from "../screens/Multiplayer/Multiplayer"; + +const Tab = createBottomTabNavigator(); + +export default function TabNavigator() { + return ( + <Tab.Navigator + initialRouteName="Home" + screenOptions={({ route }) => ({ + headerShown: false, + tabBarActiveTintColor: "#383b41", + tabBarInactiveTintColor: "#c1c7d0", + tabBarShowLabel: false, + tabBarStyle: { + height: 100, // Augmenter la hauteur de la barre pour plus d'espace + backgroundColor: "#f4f5f7", + }, + tabBarLabelStyle: { + fontSize: 16, // Tu peux aussi ajuster la taille du texte ici + }, + tabBarIcon: ({ color, size }) => { + // Définir des icônes pour chaque route + let iconName; + if (route.name === "Home") { + iconName = "home"; + } else if (route.name === "MyQuizzes") { + iconName = "person"; // Icône pour Stats + } else if (route.name === "Profil") { + iconName = "person"; + iconName = "person"; + } else if (route.name === "Community") { + iconName = "people"; + } + // else if (route.name === "Multiplayer") { + // iconName = "diversity-2"; + // } + return <Icon name={iconName ?? ''} size={64} color={color} />; + }, + })} + > + <Tab.Screen + name="Home" + component={Home} + /> + <Tab.Screen + name="Community" + component={Community} + /> + {/* <Tab.Screen + name="Multiplayer" + component={Multiplayer} + /> */} + <Tab.Screen + name="Profil" + component={Profil} + /> + </Tab.Navigator> + ); +} diff --git a/screens/Community/Community.tsx b/screens/Community/Community.tsx new file mode 100644 index 0000000000000000000000000000000000000000..73afe99eec82b2eb0634d6845110e68d8629b380 --- /dev/null +++ b/screens/Community/Community.tsx @@ -0,0 +1,50 @@ +import {View, Text} from "react-native"; +import TemplateQuizList from "../../templates/TemplateQuizList"; +import {NavigationProp} from "@react-navigation/native"; +import {useEffect, useState} from "react"; +import {useQuizService} from "../../services/QuizService"; +import HttpError from "../../services/HttpError"; +import {useInfiniteQuery} from "@tanstack/react-query"; +import { Quiz } from "../../models/Quiz"; + +interface Props { + navigation: NavigationProp<any> +} +export default function Community({navigation}: Props) { + const {getCommunityQuiz} = useQuizService(); + const [input, setInput] = useState<string>("") + const [loading, setLoading] = useState<boolean>(false) + + const fetchCommunityQuizzes = async ({pageParam = 1}) => { + const quizzes = await getCommunityQuiz(pageParam,7); + if (HttpError.isHttpError(quizzes)) { + console.error("Error while fetching community quizzes:", quizzes); + return []; + } + return quizzes; + } + + const onQuizPressed = (quiz: Quiz) => { + navigation.navigate("InformationsOfQuiz", { quiz: quiz }); + }; + + + const { + data, + fetchNextPage, + } = useInfiniteQuery({ + queryKey: ["communityQuizzes"], + queryFn: fetchCommunityQuizzes, + initialPageParam: 0, + getNextPageParam: (lastPage, allPages) => { + // Si la dernière page a moins de 7 quizzes, il n'y a plus de page suivante + if (lastPage.length < 7) return undefined; + + // On augmente skip de 7 pour la prochaine requête + return allPages.length * 7; + }}); + + return ( + <TemplateQuizList title={"Community"} setTextInInput={setInput} quizList={data?.pages.flat() ?? []} navigation={navigation} buttonGoBack={false} isLoadingData={loading} nextPage={fetchNextPage} onQuizPressed={onQuizPressed}/> + ); +} \ No newline at end of file diff --git a/screens/Community/InformationsOfQuiz/InformationsOfQuiz.tsx b/screens/Community/InformationsOfQuiz/InformationsOfQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..379dffcd9519290924dcb7064acf124640eeaf3e --- /dev/null +++ b/screens/Community/InformationsOfQuiz/InformationsOfQuiz.tsx @@ -0,0 +1,179 @@ +import React from "react"; +import {View, Text, StyleSheet, TouchableOpacity, Dimensions} from "react-native"; +import TemplateMenu from "../../../templates/TemplateMenu"; +import {NavigationProp, RouteProp} from "@react-navigation/native"; +import {Quiz} from "../../../models/Quiz"; +import { useQuizService } from "../../../services/QuizService"; + +type RoutePropsType = { + InformationsOfQuiz: { + quiz: Quiz; + }; +}; +interface Props { + navigation: NavigationProp<any>; + route: RouteProp<RoutePropsType, "InformationsOfQuiz">; +} +const { width, height } = Dimensions.get('window'); + +export default function InformationsOfQuiz({ navigation, route }: Props) { + const { quiz } = route.params; + const { createRun } = useQuizService(); + + const onPlay = async () => { + const quizId = quiz.id.toString(); + const runId = await createRun(quizId); + navigation.navigate('PlayingQuiz', { runId: runId, quizId: quizId }); + } + + const QuizStatistic = ({ label, value }: { label: string, value: string }) => ( + <View style={styles.statItem}> + <Text style={styles.statLabel}>{label}</Text> + <Text style={styles.statValue}>{value || "Loading..."}</Text> + </View> + ); + + return ( + <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}> + <View style={styles.container}> + <Text style={styles.quizTitle}>{quiz.name}</Text> + + <View style={styles.infoCard}> + <View style={styles.statsContainer}> + {/*<QuizStatistic*/} + {/* label="Current Score"*/} + {/* value={quiz.score ? quiz.score.toString() : "Loading..."}*/} + {/*/>*/} + {/*<QuizStatistic*/} + {/* label="Progress"*/} + {/* value={`${quiz.questionIndex}/${quiz.questionCount}`}*/} + {/*/>*/} + <QuizStatistic + label="Difficulty" + value={quiz.difficulty.name} + /> + </View> + <View style={styles.descriptionContainer}> + <Text style={styles.descriptionLabel}>Description</Text> + <Text style={styles.descriptionText}> + {quiz.description} + </Text> + </View> + </View> + + {/*<View style={styles.aboutContainer}>*/} + {/* <Text style={styles.aboutTitle}>About this quiz :</Text>*/} + {/* <Text style={styles.aboutDetails}>{quiz.questionCount} questions, {quiz.difficulty.name}</Text>*/} + {/* <Text style={styles.aboutDetails}>By : {quiz.authorId && "Unknown"}</Text>*/} + {/*</View>*/} + + <TouchableOpacity style={styles.playButton} onPress={onPlay}> + <Text style={styles.playButtonText}>PLAY</Text> + </TouchableOpacity> + </View> + </TemplateMenu> + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + paddingHorizontal: 20, + paddingVertical: 20, + justifyContent: "flex-start", + }, + descriptionContainer: { + marginTop: 8, + }, + descriptionLabel: { + fontSize: 16, + fontWeight: "600", + color: "#666", + marginBottom: 8, + }, + descriptionText: { + fontSize: 15, + color: "#4a4a4a", + lineHeight: 22, + }, + infoCard: { + height: '65%', + backgroundColor: "white", + borderRadius: width * 0.04, + paddingHorizontal: '5%', + shadowColor: "#000", + shadowOffset: { width: 0, height: width * 0.01 }, + shadowOpacity: 0.1, + shadowRadius: width * 0.03, + elevation: 5, + }, + statsContainer: { + height: '15%', + justifyContent: 'space-around', + }, + quizTitle: { + fontSize: 24, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + }, + quizDescription: { + fontSize: 16, + color: "#555", + marginBottom: 20, + height: "15%", + }, + aboutContainer: { + height: "50%", + backgroundColor: "white", + borderRadius: 10, + padding: 15, + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.2, + shadowRadius: 3, + elevation: 5, + }, + aboutTitle: { + fontSize: 18, + fontWeight: "bold", + marginBottom: 10, + color: "#000", + }, + statItem: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingVertical: '3%', + borderBottomWidth: 1, + borderBottomColor: '#f0f0f0', + }, + statLabel: { + fontSize: width * 0.04, + color: "#666", + fontWeight: "500", + }, + statValue: { + fontSize: 16, + color: "#2d2d2d", + fontWeight: "600", + }, + aboutDetails: { + fontSize: 16, + color: "#555", + marginBottom: 10, + }, + playButton: { + backgroundColor: "#007BFF", + paddingVertical: 15, + borderRadius: 10, + alignItems: "center", + justifyContent: "center", + marginTop: 20, + }, + playButtonText: { + fontSize: 18, + fontWeight: "bold", + color: "white", + }, +}); diff --git a/screens/CreationQuiz/CreationQuiz.tsx b/screens/CreationQuiz/CreationQuiz.tsx deleted file mode 100644 index 46c1061ef21b82b3055f10cacfbca2a512bee736..0000000000000000000000000000000000000000 --- a/screens/CreationQuiz/CreationQuiz.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import TemplateScreen from "../../templates/TemplateScreen"; -import CreationQuizBody from "./CreationQuizBody"; - -export default function CreationQuiz({navigation}: any) { - return ( - <TemplateScreen childrenBot={<CreationQuizBody navigation={navigation}></CreationQuizBody>}></TemplateScreen> - ) -} - diff --git a/screens/CreationQuiz/CreationQuizHeader.tsx b/screens/CreationQuiz/CreationQuizHeader.tsx deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/screens/FinQuiz/FinQuiz.tsx b/screens/FinQuiz/FinQuiz.tsx deleted file mode 100644 index 3320e8265ea1362f33b30bccfe15004dc8fba8ff..0000000000000000000000000000000000000000 --- a/screens/FinQuiz/FinQuiz.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { View, StyleSheet, Image, Text } from "react-native"; -import DefaultButton from "../../components/DefaultButton"; -import { TextsStyles } from "../../styles/TextsStyles"; -import { ButtonsStyles } from "../../styles/ButtonsStyles"; - -interface Props { - navigation: any; - route: any; -} - -export default function FinQuiz({ navigation, route }: Props) { - const { score, quiz } = route.params; - const handleButtonRePlayPressed = () => { - quiz.nbActualQuestion = 1; - quiz.score = 0; - navigation.reset({ - index: 0, - routes: [ - { - name: "Question", - params: {quiz: quiz}, - }, - ] - }); - } - - const handleButtonHomePressed = () => { - navigation.navigate('Home'); - } - - return ( - <View style={styles.container}> - <Image source={require('../../assets/FondTemplate.png')} style={styles.image}/> - <Text style={TextsStyles.titleText}>Score : {score}</Text> - <Text style={TextsStyles.subtitleText}>{((score/quiz.nbQuestions)*100 > 50 ) ? "Congratulations, you won!" : "Too bad, you lost!"}</Text> - <View style={styles.buttonContainer}> - <DefaultButton text={"Play again"} handleButtonPressed={handleButtonRePlayPressed} buttonStyle={ButtonsStyles.defaultButton}></DefaultButton> - <DefaultButton text={"Go to home"} handleButtonPressed={handleButtonHomePressed}></DefaultButton> - </View> - </View> - ) -} - -const styles = StyleSheet.create({ - container: { - display: 'flex', - width: '100%', - height: '100%', - alignItems: 'center', - justifyContent: 'center', - gap: 10, - }, - buttonContainer: { - width: '80%', - margin: '10%', - gap: 20 - }, - image: { - width: '100%', - height: '100%', - position: 'absolute', - }, -}); - diff --git a/screens/Home.tsx b/screens/Home.tsx deleted file mode 100644 index e682b2570f2ce46316cc52be14d6dd54f8a701e6..0000000000000000000000000000000000000000 --- a/screens/Home.tsx +++ /dev/null @@ -1,133 +0,0 @@ -import {StyleSheet, View, Text, Modal, TextInput, Image} from "react-native"; -import DefaultButton from "../components/DefaultButton"; -import {TextsStyles} from "../styles/TextsStyles"; -import {useTranslation} from "react-i18next"; -import { useState } from "react"; -import { ButtonsStyles } from "../styles/ButtonsStyles"; - -interface Props { - navigation: any; -} -export default function Home({navigation}: Props) { - const [modalVisible, setModalVisible] = useState(false); - - // const handleButtonPlayPressed = () => { - // setModalVisible(true); - // } - - const {t} = useTranslation(); - const handleButtonCreateQuizPressed = () => { - navigation.navigate("CreateQuiz"); - } - - const handleButtonValidatePressed = () => { - setModalVisible(false); - } - return ( - <View> - <Image source={require('../assets/FondTemplate.png')} style={styles.image}/> - <View style={styles.container}> - <View style={styles.titleContainer}> - <Text style={styles.titleText}>{"SKITSKOLA"}</Text> - </View> - - <View style={styles.buttonContainer}> - <View style={styles.ButtonsStyle}> - {/* <DefaultButton text={t("app.screens.home.play")} handleButtonPressed={handleButtonPlayPressed}></DefaultButton> */} - <DefaultButton text={t("app.screens.home.createQuiz")} handleButtonPressed={handleButtonCreateQuizPressed} buttonStyle={ButtonsStyles.movingButton} buttonText={TextsStyles.defaultText}></DefaultButton> - </View> - </View> - {/* <Modal - animationType="slide" - transparent={true} - visible={modalVisible} - onRequestClose={() => { - setModalVisible(!modalVisible); - }}> - <View style={styles.centeredView}> - <View style={styles.modalView}> - <Text style={TextsStyles.subtitleText}>Rejoindre Quiz</Text> - <TextInput placeholder="code de la partie" style={styles.codeTextInput} keyboardType="numeric"/> - <DefaultButton text="V" handleButtonPressed={handleButtonValidatePressed} buttonStyle={styles.button}></DefaultButton> - </View> - </View> - </Modal> */} - </View> - </View> - ) -} - -const styles = StyleSheet.create({ - container: { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - width: '100%', - height: '100%', - }, - buttonContainer: { - flex: 1, - alignItems: 'center', - justifyContent: 'flex-start', - width: '100%', - paddingVertical: '5%' - }, - titleContainer: { - display : 'flex', - flexDirection: 'column', - justifyContent: 'flex-end', - alignItems: 'center', - width: '100%', - height: '40%', - }, - ButtonsStyle: { - display : 'flex', - flexDirection: 'column', - justifyContent: 'flex-start', - alignItems: 'center', - gap: 20, - width: '80%', - height: '60%', - marginBottom: "20%", - }, - centeredView: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - modalView: { - height: 250, - width: 320, - margin: 20, - backgroundColor: 'white', - borderRadius: 20, - padding: 35, - alignItems: 'center', - borderWidth: 2, - borderColor: 'black', - borderStyle: 'solid', - }, - codeTextInput: { - borderWidth: 2, - borderColor: 'black', - borderStyle: 'solid', - height: 40, - width: 200, - marginTop: 30, - marginBottom: 20, - padding: 10, - }, - button: { - width: 50, - height: 50, - }, - image: { - width: '100%', - height: '100%', - position: 'absolute', - }, - titleText: { - fontSize: 30, - fontStyle: 'italic' - } -}); \ No newline at end of file diff --git a/screens/Home/Home.tsx b/screens/Home/Home.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4fb5203e02fd3bcdafbdc58aa594baf9e8f1f824 --- /dev/null +++ b/screens/Home/Home.tsx @@ -0,0 +1,32 @@ +import { View, StyleSheet, Text } from "react-native"; +import TemplateMono from "../../templates/TemplateMono"; +import HomeChild from "./HomeChild"; +import TemplateMenu from "../../templates/TemplateMenu"; +import {NavigationProp} from "@react-navigation/native"; +import {Quiz} from "../../models/Quiz"; + +interface Props { + navigation: NavigationProp<any>; +} + +export default function Home({navigation}: Props) { + + return ( + <View style={styles.containerGlobal}> + <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack={false}> + <View> + <HomeChild navigation={navigation}/> + </View> + </TemplateMenu> + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, +}); \ No newline at end of file diff --git a/screens/Home/HomeChild.tsx b/screens/Home/HomeChild.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fa17672944597e3f9eccbfd86f29b60196aeeaa1 --- /dev/null +++ b/screens/Home/HomeChild.tsx @@ -0,0 +1,92 @@ +import { View, StyleSheet, Image, Modal, TextInput } from "react-native"; +import DefaultButton from "../../components/buttons/DefaultButton"; +import {useTranslation} from "react-i18next"; +import { useState } from "react"; +import { TextsStyles } from "../../styles/TextsStyles"; +import MenuButton from "../../components/buttons/MenuButton"; +import {NavigationProp} from "@react-navigation/native"; +import {useQuizService} from "../../services/QuizService"; +import HttpError from "../../services/HttpError"; + +interface Props { + navigation: NavigationProp<any>; +} + +/** + * HomeChild : Enfant de l'écran Home, il contient le menu principal + * @param navigation - navigation + */ +export default function HomeChild({navigation}: Props) { + const [modalVisible, setModalVisible] = useState(false); + const {t} = useTranslation(); + const {getRandomQuiz} = useQuizService(); + + const handleButtonQuickGamePressed = async () => { + const quizData = await getRandomQuiz() + if (quizData instanceof HttpError) { + console.error("Error while fetching random quiz:", quizData); + return; + } + navigation.reset({ + index: 0, + routes: [ + { + name: "PlayingQuiz", + params: {runId: quizData.id, quizId: quizData.quizId}, + }, + ] + + }); + } + const handleButtonMyQuizzesPressed = () => { + navigation.navigate("MyQuizzes"); + // navigation.navigate("PlayingQuiz", {runId: "1", quizId: "1"}); + } + + const handleButtonGeneratePressed = () => { + navigation.navigate("PlayQuiz"); + } + + return ( + <View style={styles.containerGlobal}> + <View style={styles.imageContainer}> + <Image source={require('../../assets/TitleApp.png')} style={styles.image} /> + </View> + <View style={styles.buttonContainer}> + <MenuButton text={"QUICK GAME"} handleButtonPressed={handleButtonQuickGamePressed}/> + <MenuButton text={"PLAY"} handleButtonPressed={handleButtonGeneratePressed}/> + <MenuButton text={"MY QUIZZES"} handleButtonPressed={handleButtonMyQuizzesPressed}/> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + justifyContent: 'flex-start', + alignItems: 'center', + }, + image: { + }, + button: { + borderRadius: 40, + height: '35%', + marginTop: '5%' + }, + imageContainer: { + display: 'flex', + alignItems: 'center', + marginTop: '15%', + marginBottom: '35%', + }, + buttonContainer: { + width: '100%', + display: 'flex', + flexDirection: 'column', + paddingLeft: '8%', + gap: '9%', + } +}); \ No newline at end of file diff --git a/screens/Home/MyQuizzes/InformationsOfRuns.tsx b/screens/Home/MyQuizzes/InformationsOfRuns.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6a461fdc502682ff48f9c636f8725d9548df79d1 --- /dev/null +++ b/screens/Home/MyQuizzes/InformationsOfRuns.tsx @@ -0,0 +1,176 @@ +import React from "react"; +import {View, Text, StyleSheet, TouchableOpacity, Dimensions} from "react-native"; +import TemplateMenu from "../../../templates/TemplateMenu"; +import {NavigationProp, RouteProp} from "@react-navigation/native"; +import {RunsInformationsAllRuns} from "../../../models/RunsInformationsAllRuns"; + +type RoutePropsType = { + InformationsOfRuns: { + runInformations: RunsInformationsAllRuns; + }; +}; +interface Props { + navigation: NavigationProp<any>; + route: RouteProp<RoutePropsType, "InformationsOfRuns">; +} + +const { width, height } = Dimensions.get('window'); + +export default function InformationsOfRuns({ navigation, route }: Props) { + const { runInformations, } = route.params; + + const onPlay = () => { + navigation.reset({ + index: 0, + routes: [ + { + name: "PlayingQuiz", + params: {runId: runInformations?.id, quizId: runInformations?.quizId }, + }, + ] + }); + } + const QuizStatistic = ({ label, value }: { label: string, value: string }) => ( + <View style={styles.statItem}> + <Text style={styles.statLabel}>{label}</Text> + <Text style={styles.statValue}>{value || "Loading..."}</Text> + </View> + ); + + return ( + <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}> + <View style={styles.container}> + <Text style={styles.quizTitle}>{runInformations.quiz.name ? runInformations.quiz.name : "Loading..."}</Text> + <View style={styles.infoCard}> + <View style={styles.statsContainer}> + <QuizStatistic + label="Current Score" + value={runInformations?.score.toString()} + /> + <QuizStatistic + label="Progress" + value={`${runInformations.questionIndex}/${runInformations?.quiz.questionCount}`} + /> + <QuizStatistic + label="Difficulty" + value={runInformations?.quiz.difficulty.name} + /> + </View> + <View style={styles.descriptionContainer}> + <Text style={styles.descriptionLabel}>Description</Text> + <Text style={styles.descriptionText}> + {runInformations.quiz.description} + </Text> + </View> + </View> + + <TouchableOpacity style={styles.playButton} onPress={onPlay}> + <Text style={styles.playButtonText}>PLAY</Text> + </TouchableOpacity> + </View> + </TemplateMenu> + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + paddingHorizontal: 20, + paddingVertical: 20, + justifyContent: "flex-start", + }, + descriptionContainer: { + marginTop: 8, + }, + descriptionLabel: { + fontSize: 16, + fontWeight: "600", + color: "#666", + marginBottom: 8, + }, + descriptionText: { + fontSize: 15, + color: "#4a4a4a", + lineHeight: 22, + }, + quizTitle: { + fontSize: 24, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + }, + quizDescription: { + fontSize: 16, + color: "#555", + marginBottom: 20, + height: "15%", + }, + aboutContainer: { + height: "50%", + backgroundColor: "white", + borderRadius: 10, + padding: 15, + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.2, + shadowRadius: 3, + elevation: 5, + }, + statsContainer: { + height: '40%', + justifyContent: 'space-around', + }, + statValue: { + fontSize: 16, + color: "#2d2d2d", + fontWeight: "600", + }, + infoCard: { + height: '65%', + backgroundColor: "white", + borderRadius: width * 0.04, + padding: '5%', + shadowColor: "#000", + shadowOffset: { width: 0, height: width * 0.01 }, + shadowOpacity: 0.1, + shadowRadius: width * 0.03, + elevation: 5, + }, + statItem: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + paddingVertical: '3%', + borderBottomWidth: 1, + borderBottomColor: '#f0f0f0', + }, + statLabel: { + fontSize: width * 0.04, + color: "#666", + fontWeight: "500", + }, + aboutTitle: { + fontSize: 18, + fontWeight: "bold", + marginBottom: 10, + color: "#000", + }, + aboutDetails: { + fontSize: 16, + color: "#555", + marginBottom: 10, + }, + playButton: { + backgroundColor: "#007BFF", + paddingVertical: 15, + borderRadius: 10, + alignItems: "center", + justifyContent: "center", + marginTop: 20, + }, + playButtonText: { + fontSize: 18, + fontWeight: "bold", + color: "white", + }, +}); diff --git a/screens/Home/MyQuizzes/MyQuizzes.tsx b/screens/Home/MyQuizzes/MyQuizzes.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d7d94bcb74781ea7bdc5d780285f2546da061fb8 --- /dev/null +++ b/screens/Home/MyQuizzes/MyQuizzes.tsx @@ -0,0 +1,37 @@ +import {NavigationProp} from "@react-navigation/native"; +import React, {useEffect, useState} from "react"; +import TemplateRunList from "../../../templates/TemplateRunList"; +import {useQuizService} from "../../../services/QuizService"; +import HttpError from "../../../services/HttpError"; +import {AllRunsResponse} from "../../../models/Response/AllRunsResponse"; +import {RunsInformationsAllRuns} from "../../../models/RunsInformationsAllRuns"; + +interface Props { + navigation: NavigationProp<any> +} +export default function MyQuizzes({navigation}: Props) { + const [runList, setRunList] = useState<AllRunsResponse | undefined>(undefined) + const [input, setInput] = useState<string>("") + const {getAllRuns} = useQuizService(); + + const getRuns = async () => { + const runs = await getAllRuns(); + if(HttpError.isHttpError(runs)) { + console.log("Error while getting runs:", runs); + return + } + setRunList(runs); + } + + useEffect(() => { + getRuns(); + },[]); + + const onQuizPressed = (runInfo: RunsInformationsAllRuns) => { + navigation.navigate("InformationsOfRuns", { runInformations: runInfo }); + }; + + return ( + <TemplateRunList title={"My quizzes"} setTextInInput={setInput} runList={runList?.runs} navigation={navigation} buttonGoBack={true} isLoadingData={false} onRunPressed={onQuizPressed}/> + ); +} \ No newline at end of file diff --git a/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuiz.tsx b/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0d95d503d6e26f1942c76f46449b1f31ebdc52f8 --- /dev/null +++ b/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuiz.tsx @@ -0,0 +1,9 @@ +import TemplateScreen from "../../../../templates/TemplateScreen"; +import GenerateQuizBody from "./GenerateQuizBody"; + +export default function GenerateQuiz({navigation}: any) { + return ( + <TemplateScreen childrenBot={<GenerateQuizBody navigation={navigation}></GenerateQuizBody>}></TemplateScreen> + ) +} + diff --git a/screens/CreationQuiz/CreationQuizBody.tsx b/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuizBody.tsx similarity index 54% rename from screens/CreationQuiz/CreationQuizBody.tsx rename to screens/Home/PlayQuiz/GenerateQuiz/GenerateQuizBody.tsx index 82c00479dd0644e9ca29cd73bba53f52c08e964f..a50e17d0ea5ee1ad781f410edbf47657a99f0649 100644 --- a/screens/CreationQuiz/CreationQuizBody.tsx +++ b/screens/Home/PlayQuiz/GenerateQuiz/GenerateQuizBody.tsx @@ -1,7 +1,11 @@ -import ComboBox from "../../components/comboBox/ComboBox"; -import DefaultButton from "../../components/DefaultButton"; -import {StyleSheet, View, Text} from "react-native"; +import ComboBox from "../../../../components/comboBox/ComboBox"; +import DefaultButton from "../../../../components/buttons/DefaultButton"; +import {StyleSheet, View} from "react-native"; import {useState} from "react"; +import {useTranslation} from "react-i18next"; +import {useQuizService} from "../../../../services/QuizService"; +import {EDifficulty} from "../../../../models/EDifficulty"; +import {getIdOfCategory} from "../../../../helper/QuizHelper"; const optionsDifficulty = [ 'easy', 'medium', 'hard']; const optionsQuestions = ['1', '50']; @@ -24,20 +28,23 @@ interface Props { navigation: any; } -export default function CreationQuizBody({navigation}:Props) { +export default function GenerateQuizBody({navigation}:Props) { const [isModalVisible, setIsModalVisible] = useState(false); const [difficulty, setDifficulty] = useState('easy'); const [nbQuestions, setNbQuestions] = useState('1'); - const [theme, setTheme] = useState('General Knowledge'); + const [theme, setTheme] = useState<string>('General Knowledge'); + const {t} = useTranslation(); + const {generateQuiz} = useQuizService(); - const handleAddQuizPressed = () => { + const handleAddQuizPressed = async () => { + const quizGenerated = await generateQuiz(parseInt(nbQuestions), getIdOfCategory(theme), difficulty); navigation.reset({ index: 0, routes: [ { - name: "Question", - params: {nbQuestionParam: nbQuestions, difficultyParam: difficulty, themeParam: theme}, + name: "PlayingQuiz", + params: {quizRecovered: quizGenerated}, }, ] }); @@ -46,12 +53,12 @@ export default function CreationQuizBody({navigation}:Props) { return ( <View style={styles.container}> <View style={styles.comboBoxContainer}> - <ComboBox title={"Difficulty"} options={optionsDifficulty} selectOption={setDifficulty} type={0}/> - <ComboBox title={"Nb. of questions"} options={optionsQuestions} selectOption={setNbQuestions} type={1}/> - <ComboBox title={"Theme"} options={optionsTheme} selectOption={setTheme} type={0}/> + <ComboBox title={t("app.screens.creationQuiz.difficulty")} options={optionsDifficulty} selectOption={setDifficulty} type={0}/> + <ComboBox title={t("app.screens.creationQuiz.nbQuestions")} options={optionsQuestions} selectOption={setNbQuestions} type={1}/> + <ComboBox title={t("app.screens.creationQuiz.theme")} options={optionsTheme} selectOption={setTheme} type={0}/> </View> <View style={styles.buttonContainer}> - <DefaultButton text={"Add Quiz "} handleButtonPressed={handleAddQuizPressed} buttonStyle={styles.buttonStyle}/> + <DefaultButton text={t("app.screens.creationQuiz.addQuiz")} handleButtonPressed={handleAddQuizPressed} buttonStyle={styles.buttonStyle}/> </View> </View> diff --git a/screens/Home/PlayQuiz/PlayQuiz.tsx b/screens/Home/PlayQuiz/PlayQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..02c949fedd8e8a20125a2916ea953a3b945eded7 --- /dev/null +++ b/screens/Home/PlayQuiz/PlayQuiz.tsx @@ -0,0 +1,31 @@ +import {NavigationProp} from "@react-navigation/native"; +import TemplateMenu from "../../../templates/TemplateMenu"; +import {StyleSheet, View} from "react-native"; +import HomeChild from "../HomeChild"; +import React from "react"; +import PlayQuizChild from "./PlayQuizChild"; + +interface Props{ + navigation: NavigationProp<any> +} +export default function PlayQuiz({navigation}: Props) { + + return ( + <View style={styles.containerGlobal}> + <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}> + <View> + <PlayQuizChild navigation={navigation}/> + </View> + </TemplateMenu> + </View> + ) +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, +}); \ No newline at end of file diff --git a/screens/Home/PlayQuiz/PlayQuizChild.tsx b/screens/Home/PlayQuiz/PlayQuizChild.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4c982b375672694033527e2bfdd35bf2226017f1 --- /dev/null +++ b/screens/Home/PlayQuiz/PlayQuizChild.tsx @@ -0,0 +1,44 @@ +import {Text, View, StyleSheet, TouchableWithoutFeedback, Keyboard} from "react-native"; +import {NavigationProp} from "@react-navigation/native"; +import SelectMode from "../../../components/PlayQuiz/SelectMode"; +import React, {useState} from "react"; +import {SelectModeType} from "../../../models/SelectModeType"; +import PlayQuizGenerateQuiz from "./PlayQuizGenerateQuiz"; +import PlayQuizJoinQuiz from "./PlayQuizJoinQuiz"; + +interface Props { + navigation: NavigationProp<any> +} + +export default function PlayQuizChild({navigation}: Props){ + const [mode, setMode] = useState<SelectModeType>("play"); + + return ( + <TouchableWithoutFeedback onPress={Keyboard.dismiss}> + <View style={styles.containerGlobal}> + <View style={styles.contentContainer}> + <SelectMode mode={mode} setMode={setMode}/> + {mode === "play" ? ( + <PlayQuizGenerateQuiz navigation={navigation}/> + ) : ( + <PlayQuizJoinQuiz navigation={navigation}/> + )} + </View> + </View> + </TouchableWithoutFeedback> + ) +} +const styles = StyleSheet.create({ + containerGlobal: { + width: '100%', + height: '100%', + alignItems: 'center', + justifyContent: 'center', + }, + contentContainer: { + display: 'flex', + width: '95%', + height: '100%', + flexDirection: 'column', + }, +}); \ No newline at end of file diff --git a/screens/Home/PlayQuiz/PlayQuizGenerateQuiz.tsx b/screens/Home/PlayQuiz/PlayQuizGenerateQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8f7277583bffb79ae4b036f39cc4bcf6600fc18d --- /dev/null +++ b/screens/Home/PlayQuiz/PlayQuizGenerateQuiz.tsx @@ -0,0 +1,110 @@ +import { Text,View, StyleSheet } from "react-native"; +import SelectListBoxString from "../../../components/PlayQuiz/SelectListBoxString"; +import React, {useEffect, useState} from "react"; +import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz"; +import BlueButton from "../../../components/buttons/BlueButton"; +import {useQuizService} from "../../../services/QuizService"; +import {NavigationProp} from "@react-navigation/native"; +import {Category} from "../../../models/Quiz"; +import SelectListBoxCategory from "../../../components/PlayQuiz/SelectListBoxCategory"; +import HttpError from "../../../services/HttpError"; + +const difficulty = [ + { key: "easy", value: "easy" }, + { key: "medium", value: "medium" }, + { key: "hard", value: "hard" }, +]; + +interface Props { + navigation: NavigationProp<any>; +} + +export default function PlayQuizGenerateQuiz({navigation}: Props) { + const [difficutlyChoose, setDifficutlyChoose] = React.useState(""); + const [nbQuestions, setNbQuestions] = React.useState("10"); + const [buttonIsDisabled, setButtonIsDisabled] = React.useState(true); + const [categories, setCategories] = useState<Category[]>([]); + const [categoryChoose, setCategoryChoose] = React.useState<Category | null>(null); + + const {generateQuiz, getCategories} = useQuizService(); + const fetchingCategories = async () => { + const categories = await getCategories(); + let categoriesTemp: Category[] = []; + categories.map((category: Category) => { + categoriesTemp.push({'name': category.name, 'id': category.id}); + }); + setCategories(categoriesTemp); + } + + useEffect(() => { + fetchingCategories(); + }, []); + + useEffect(() => { + if(nbQuestions === "" || difficutlyChoose === "" || categoryChoose === null) + { + setButtonIsDisabled(true); + } + else + { + setButtonIsDisabled(false); + } + + }, [difficutlyChoose,categoryChoose,nbQuestions]); + + const handlePlayButtonPress = async () => { + const quizGenerated = await generateQuiz(parseInt(nbQuestions), categoryChoose ? categoryChoose.id : 10 , difficutlyChoose); + if(HttpError.isHttpError(quizGenerated)) { + return; + } + navigation.reset({ + index: 0, + routes: [ + { + name: "PlayingQuiz", + params: {runId: quizGenerated.id, quizId: quizGenerated.quizId}, + }, + ] + }); + }; + + return ( + <View style={styles.container}> + <View style={styles.contentContainer}> + <View style={styles.fieldContainer}> + <SelectListBoxString title="CHOOSE A DIFFICULTY" data={difficulty} setSelected={setDifficutlyChoose} /> + <SelectListBoxCategory title="CHOOSE A CATEGORY" data={categories} setSelected={setCategoryChoose} /> + <InputPlayQuiz title="CHOOSE A NUMBER OF QUESTIONS" setText={setNbQuestions} numeric={true} defaultValue={nbQuestions}/> + </View> + <View style={styles.buttonPlayContainer}> + <BlueButton onPress={handlePlayButtonPress} text={"PLAY"} isDisabled={buttonIsDisabled}/> + </View> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + width: "100%", + height: "75%", + justifyContent: "space-between", + }, + contentContainer: { + flex: 1, // Prend toute la hauteur disponible + flexDirection: "column", + justifyContent: "space-between", + }, + fieldContainer: { + width: "100%", + flexDirection: "column", + justifyContent: "space-between", + marginTop: 20, + gap: 20, + }, + buttonPlayContainer: { + alignItems: "center", + paddingVertical: 20, + }, +}); diff --git a/screens/Home/PlayQuiz/PlayQuizJoinQuiz.tsx b/screens/Home/PlayQuiz/PlayQuizJoinQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e123a2302f4aea6df268225df83c2dc1dfdb23f6 --- /dev/null +++ b/screens/Home/PlayQuiz/PlayQuizJoinQuiz.tsx @@ -0,0 +1,111 @@ +import { StyleSheet, View, Text } from "react-native"; +import AboutAQuiz from "../../../components/PlayQuiz/AboutAQuiz"; +import BlueButton from "../../../components/buttons/BlueButton"; +import React, { useEffect } from "react"; +import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz"; +import {Quiz} from "../../../models/Quiz"; +import { useQuizService } from "../../../services/QuizService"; +import HttpError from "../../../services/HttpError"; +import {NavigationProp} from "@react-navigation/native"; +import {RunInformations} from "../../../models/RunInformations"; +import {QuizInformations} from "../../../models/QuizInformations"; + +interface Props { + navigation: NavigationProp<any>; +} +export default function PlayQuizJoinQuiz({navigation}: Props) { + const [codeQuiz, setCodeQuiz] = React.useState(""); + const [quiz, setQuiz] = React.useState<Quiz>(); + const [error, setError] = React.useState<string>(""); + const [runInformations, setRunInformations] = React.useState<RunInformations>(); + const [quizInformations, setQuizInformations] = React.useState<QuizInformations>(); + + const { getRunsInfo, getQuizInformations } = useQuizService(); + + useEffect(() => { + fetchRuns(); + }, [codeQuiz]); + + const fetchRuns = async () => { + + if(codeQuiz === "") return; + if(codeQuiz.length < 6 ) + { + setError("A quiz contains 6 characters"); + return; + } + + const runFetched = await getRunsInfo(codeQuiz); + if (runFetched instanceof HttpError) { + setError("The quiz does not exist"); + return; + } + const quizInformations = await getQuizInformations(runFetched.quizId); + if (quizInformations instanceof HttpError) { + setError("The quiz does not exist"); + return; + } + + setError(""); + setQuizInformations(quizInformations); + setRunInformations(runFetched); + }; + + const handlePlayButtonPress = () => { + navigation.reset({ + index: 0, + routes: [ + { + name: "PlayingQuiz", + params: {runId: runInformations?.id, quizId: runInformations?.quizId }, + }, + ] + }); + }; + + return ( + <View style={styles.container}> + <View style={styles.contentContainer}> + <View style={styles.fieldContainer}> + {error ? <Text style={styles.errorText}>{error}</Text> : null} + <InputPlayQuiz placeholder={"Enter quiz ID"} setText={setCodeQuiz} noTitle={true} /> + <AboutAQuiz runInformations={runInformations} quizInformations={quizInformations} /> + </View> + <View style={styles.buttonPlayContainer}> + <BlueButton onPress={handlePlayButtonPress} text={"PLAY"} isDisabled={codeQuiz==="" || error!==""}/> + </View> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + width: "100%", + height: "75%", + justifyContent: "space-between", + }, + contentContainer: { + flex: 1, // Prend toute la hauteur disponible + flexDirection: "column", + justifyContent: "space-between", + }, + fieldContainer: { + width: "100%", + flexDirection: "column", + justifyContent: "space-between", + marginTop: 20, + gap: 20, + }, + buttonPlayContainer: { + alignItems: "center", + paddingVertical: 20, + }, + errorText: { + color: "red", + fontSize: 16, + marginBottom: 5, + textAlign: "left", // Aligne le texte à gauche + }, +}); diff --git a/screens/Multiplayer/Lobby/Lobby.tsx b/screens/Multiplayer/Lobby/Lobby.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8aaff52363402c3ce8ece045efce8350d9518ea5 --- /dev/null +++ b/screens/Multiplayer/Lobby/Lobby.tsx @@ -0,0 +1,207 @@ +import {View, Text, StyleSheet, Image, FlatList} from "react-native"; +import {NavigationProp, RouteProp} from "@react-navigation/native"; +import React, {useEffect, useState} from "react"; +import { TouchableOpacity } from "react-native"; +import {User} from "../../../models/User"; +import {io, Socket} from "socket.io-client"; +import useCookie from "../../../hooks/UseCookie"; +import {useMultiService} from "../../../services/MultiService"; +import HttpError from "../../../services/HttpError"; +import TemplateMenu from "../../../templates/TemplateMenu"; +import BlueButton from "../../../components/buttons/BlueButton"; +import WhiteButton from "../../../components/buttons/WhiteButton"; +import ModalInvitePlayer from "../../../components/Multiplayer/ModalInvitePlayer"; +import EventSource from "react-native-sse"; +interface Props { + navigation: NavigationProp<any>; + route: RouteProp<RoutePropsType, "Lobby">; +} + +type RoutePropsType = { + Lobby: { + quizId?: string; + roomId?: string; + nbPlayers: number; + isHost: boolean; + }; +}; + +type CustomEventType = "userJoined" | "nextQuestion" + + +export default function Lobby({navigation, route}: Props) { + const { quizId, roomId, nbPlayers, isHost} = route.params; + + const [players, setPlayers] = useState<User[]>([{ id: 0, username: 'Invite', email: 'invite@email.com'}]); + const [socket, setSocket] = useState<Socket | null>(null); + const [roomIdCreated, setRoomIdCreated] = useState<string | undefined>(roomId); + const [runId, setRunId] = useState<string>(""); + const [showModal, setShowModal] = useState<boolean>(false); + + const {createParty} = useMultiService(); + + const userInvite = { id: 0, username: 'Invite', email: 'invite@email.com'} + let goodId = roomId; + const initSSE = async () => { + console.log("Init SSE for quiz ID:", quizId); + if(isHost && quizId) { + const response = await createParty(quizId); + if (HttpError.isHttpError(response)) { + console.error("Failed to create party:", response.message); + return; + } + console.log("Created party with ID:", response); + goodId = response; + setRoomIdCreated(response); + } + console.log("User try to joined party with ID:", goodId); + console.log(`https://klebert-host.com:33037/party/join/${goodId}`) + + const es = new EventSource<CustomEventType>(`https://klebert-host.com:33037/party/join/${goodId}`); + + es.addEventListener("userJoined", (event) => { + console.log("User joined event data:", event.data); + if(!event.data) return; + + const newUsers: User[] = JSON.parse(event.data); + + setPlayers((prevPlayers) => { + const ids = new Set(prevPlayers.map((player) => player.id)); + const filteredNewUsers = newUsers.filter((user) => !ids.has(user.id)); + return [...prevPlayers, ...filteredNewUsers]; + }); + + + }); + + es.addEventListener("error", (err) => { + console.error("Error with SSE:", err); + }); + + return () => es.close(); + }; + + useEffect(() => { + initSSE(); + }, []); + + const item = ({ item }: { item: User }) => { + return ( + <> + {item.username === 'Invite' ? + <View style={styles.PlayerItem}> + <TouchableOpacity style={styles.imagePlayer} onPress={onInvitePressed}> + <Image source={require('../../../assets/add.png')} /> + </TouchableOpacity> + <Text style={styles.textPlayer}>Invite</Text> + </View> + : + <View style={styles.PlayerItem}> + <Image source={require('../../../assets/ProfilBaseImage.png')} style={styles.imagePlayer} /> + <Text style={styles.textPlayer}>{item.username}</Text> + </View> + } + </> + + ) + } + + + const onLeavePressed = () => { + navigation.navigate("TabNavigator"); + }; + + const onPlayPressed = () => { + navigation.navigate("PlayingQuizMultiMode", {runId: runId, socket: socket, roomId: roomIdCreated}); + }; + + const onCancelPressed = () => { + navigation.navigate("TabNavigator"); + }; + + const onInvitePressed = () => { + setShowModal(true); + }; + + return ( + <View> + <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}> + <View style={styles.containerLobby}> + <Text style={styles.title}>{'BMW OFFICIAL QUIZ (I’m leaking oil)'}</Text> + <View style={styles.containerPlayers}> + <FlatList + data={players} + renderItem={item} + numColumns={3} + keyExtractor={(item) => item.id.toString()} + showsVerticalScrollIndicator={true} + /> + </View> + {isHost ? + <View style={styles.buttonGroup}> + <View style={styles.button}> + <BlueButton text="PLAY" onPress={onPlayPressed} isDisabled={false}/> + </View> + <View style={styles.button}> + <WhiteButton text="CANCEL" onPress={onCancelPressed} isDisabled={false}/> + </View> + </View> + : + <View style={styles.buttonGroup}> + <WhiteButton text="LEAVE" onPress={onLeavePressed} isDisabled={false}/> + </View> + } + </View> + </TemplateMenu> + <ModalInvitePlayer showModal={showModal} onClosePressed={() => setShowModal(false)} roomId={roomIdCreated} /> + </View> + ) +} + +const styles = StyleSheet.create({ + containerPlayers: { + height: '65%', + width: '100%', + }, + PlayerItem: { + width: '30%', + aspectRatio: 1, + justifyContent: 'center', + alignItems: 'center', + margin: 5, + }, + imagePlayer: { + width: '80%', + height: '80%', + }, + textPlayer: { + fontSize: 20, + textAlign: 'center', + }, + container: { + display: "flex", + height: "100%", + width: "100%", + justifyContent: "center", + alignItems: "center", + }, + title: { + fontSize: 32, + textAlign: 'center', + color: '#00B3F4', + marginBottom: 20, + }, + buttonGroup: { + flexDirection: 'row', + justifyContent: 'space-evenly', + width: '100%', + }, + button: { + width: '45%', + }, + containerLobby: { + height: '87%', + display: 'flex', + justifyContent: 'space-around', + } +}); diff --git a/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiMode.tsx b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiMode.tsx new file mode 100644 index 0000000000000000000000000000000000000000..78c1760b98b0afb0b4e00bc52ca97547349364c4 --- /dev/null +++ b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiMode.tsx @@ -0,0 +1,84 @@ +import {NavigationProp, RouteProp} from "@react-navigation/native"; +import {useQuizService} from "../../../../services/QuizService"; +import React, {useEffect, useState} from "react"; +import {QuizInformations} from "../../../../models/QuizInformations"; +import {Question} from "../../../../models/Question"; +import TemplateDuo from "../../../../templates/TemplateDuo"; +import HttpError from "../../../../services/HttpError"; +import PlayingQuizMultiModeHeader from "./PlayingQuizMultiModeHeader"; +import PlayingQuizMultiModeBody from "./PlayingQuizMultiModeBody"; +import {Socket} from "socket.io-client"; +import {QuestionResponse} from "../../../../models/Response/QuestionResponse"; +import {RunInformations} from "../../../../models/RunInformations"; + + +type RoutePropsType = { + PlayingQuizMultiMode: { + runId: string; + socket: Socket; + roomId: string; + }; +}; + +interface Props { + route: RouteProp<RoutePropsType, "PlayingQuizMultiMode">; + navigation: NavigationProp<any>; +} + +export default function PlayingQuizMultiMode({route, navigation}:Props) { + const {runId, socket, roomId} = route.params; + const { getQuizInformations, getRunsInfo } = useQuizService(); + const [quizInformations, setQuizInformations] = useState<QuizInformations | undefined>(undefined); + const [runInformations, setRunInformations] = useState<RunInformations>(); + const [actualQuestion, setActualQuestion] = useState<QuestionResponse | undefined>(undefined); + const [score, setScore] = useState(0); + + const initSocket = async () => { + socket.on("gameStarted", (data) => { + console.log("Game started:", data); + }); + + socket.on("newQuestion", (data) => { + const question: QuestionResponse = data as QuestionResponse + setActualQuestion(question); + // console.log(JSON.stringify(question, null, 2)); // Beautifie le JSON avec 2 espaces d'indentation + }); + + } + + const fetchRuns = async () => { + if(runId === undefined) return; + const runFetched = await getRunsInfo(runId); + if (runFetched instanceof HttpError) { + console.log("Error fetching runs info", runFetched); + return; + } + const quizInformationsFetched = await getQuizInformations(runFetched.quizId); + if (quizInformationsFetched instanceof HttpError) { + console.log("Error fetching quiz info", quizInformationsFetched); + return; + } + setQuizInformations(quizInformationsFetched); + setRunInformations(runFetched); + }; + + useEffect(() => { + console.log("PlayingQuizMultiMode starting"); + initSocket(); + fetchRuns(); + setTimeout(() => { + socket.emit("startGame") + },500); + + setTimeout(() => { + socket.emit("nextQuestion"); + },2000); + }, []); + + return ( + <TemplateDuo + childrenHeader={<PlayingQuizMultiModeHeader quizInformations={quizInformations} runId={runId} actualQuestion={actualQuestion} score={score} navigation={navigation}></PlayingQuizMultiModeHeader>} + childrenBody={<PlayingQuizMultiModeBody runId={runId} actualQuestion={actualQuestion} socket={socket} fetchActualQuestion={()=>{}} roomId={roomId} navigation={navigation}></PlayingQuizMultiModeBody>} + /> + ); +} \ No newline at end of file diff --git a/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeBody.tsx b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeBody.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f7cda1aa97ab7842d496b165befd1bafc5d4fab2 --- /dev/null +++ b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeBody.tsx @@ -0,0 +1,229 @@ +import {QuizInformations} from "../../../../models/QuizInformations"; +import {Question} from "../../../../models/Question"; +import {NavigationProp} from "@react-navigation/native"; +import React, {useEffect, useState} from "react"; +import {useQuizService} from "../../../../services/QuizService"; +import {Answer} from "../../../../models/Answer"; +import HttpError from "../../../../services/HttpError"; +import AnswerButton from "../../../../components/buttons/AnswerButton"; +import {ActivityIndicator, View, Text, StyleSheet} from "react-native"; +import BlueButton from "../../../../components/buttons/BlueButton"; +import {ButtonsStyles} from "../../../../styles/ButtonsStyles"; +import {QuestionResponse} from "../../../../models/Response/QuestionResponse"; +import {RunInformations} from "../../../../models/RunInformations"; +import {Socket} from "socket.io-client"; +import {AnswerWsResponse} from "../../../../models/Response/AnswerWsResponse"; + + +interface Props { + runId?: string; + actualQuestion?: QuestionResponse; + fetchActualQuestion: () => void; + socket: Socket; + roomId: string; + navigation: NavigationProp<any>; +} + +enum QuizState { + ANSWERING= "Answering", + LOADING= "Loading", + SHOWING_RESULTS= "ShowingResults", +} + +const getStyleOfAnswerButtonText = (answerId: number, selectedAnswerIndex: number | null, correctAnswerId: number | null, quizState: QuizState) => { + if(quizState === QuizState.LOADING) + { + return styles.loadingText; + } + if(quizState === QuizState.ANSWERING) + { + return styles.answerText; + + } + if(quizState === QuizState.SHOWING_RESULTS) + { + if(answerId === correctAnswerId) return styles.correctText; + if(answerId !== correctAnswerId && selectedAnswerIndex === answerId) return styles.incorrectText; + } + return styles.answerText; +} + +const getStyleOfAnswerButton = (answerId: number, selectedAnswerIndex: number | null, correctAnswerId: number | null, quizState: QuizState) => { + if(quizState === QuizState.LOADING) + { + return styles.loadingAnswer; + } + if(quizState === QuizState.ANSWERING) + { + if(selectedAnswerIndex === null) return styles.answerButton; + if(selectedAnswerIndex === answerId) return styles.selectedAnswer; + + } + if(quizState === QuizState.SHOWING_RESULTS) + { + if(answerId === correctAnswerId) return styles.correctAnswer; + if(answerId !== correctAnswerId && selectedAnswerIndex === answerId) return styles.incorrectAnswer; + } + return styles.answerButton; +} + +export default function PlayingQuizMultiModeBody({runId, actualQuestion, fetchActualQuestion, roomId, socket, navigation }: Props) { + const [selectedAnswerId, setSelectedAnswerId] = useState<number | null>(null); + const [quizState, setQuizState] = useState(QuizState.ANSWERING); + const [correctAnswerId, setCorrectAnswerId] = useState<number | null>(null); + const [isLastQuestion, setIsLastQuestion] = useState(false); + const [quizInformations, setQuizInformations] = useState<QuizInformations>(); + const [runInformations, setRunInformations] = useState<RunInformations>(); + const {answerQuestion, getRunsInfo, getQuizInformations} = useQuizService(); + const getCorrectAnswer = (answers: Answer[]): Answer => { + const correctAnswer = answers.find((answer) => answer.isCorrect); + if (!correctAnswer) return answers[0]; + return correctAnswer; + }; + + const initSocket = async () => { + console.log("init socket in body"); + socket.on("answersRevealed", (data: AnswerWsResponse) => { + const correctAnswerIdFetched = getCorrectAnswer(data.answers).id; + console.log("correctAnswerIdFetched", correctAnswerIdFetched); + setCorrectAnswerId(correctAnswerIdFetched); + setQuizState(QuizState.SHOWING_RESULTS); + }); + // socket.on("score", (data) => { + // console.log("Score:", data); + // }); + } + + useEffect(() => { + initSocket(); + }, []); + + + + const onValidation = async () => { + + if(selectedAnswerId === null || actualQuestion === undefined) return; + setQuizState(QuizState.LOADING); + socket.emit("submitAnswer", { + roomId, + runId, + questionId: actualQuestion.question.id, + answerId: selectedAnswerId, + }); + + setTimeout(() => { + socket.emit("revealAnswer", {runId: runId}); + },500); + }; + const onContinue = () => { + socket.emit("nextQuestion"); + setQuizState(QuizState.ANSWERING); + setCorrectAnswerId(null); + setSelectedAnswerId(null); + } + + const onAnsweredButtonClicked = (answerId: number) => { + if(quizState === QuizState.SHOWING_RESULTS || quizState === QuizState.LOADING) { + return; + } + setSelectedAnswerId(answerId); + } + + return ( + <View style={styles.buttonContainer}> + {actualQuestion ? ( + <> + {actualQuestion.question.answers.map((answer, index) => ( + <AnswerButton + key={index} + text={answer.text} + handleButtonPressed={() => onAnsweredButtonClicked(answer.id)} + buttonStyle={getStyleOfAnswerButton(answer.id, selectedAnswerId, correctAnswerId, quizState)} + buttonText={getStyleOfAnswerButtonText(answer.id, selectedAnswerId, correctAnswerId, quizState)} + /> + ))} + <View style={styles.playButtonContainer}> + <BlueButton onPress={() => quizState === QuizState.ANSWERING ? onValidation() : onContinue()} text={quizState === QuizState.ANSWERING ? "CONFIRM" : "CONTINUE"} buttonStyle={{borderRadius: 50}} isDisabled={false}/> + </View> + </> + ) : ( + <View style={styles.loadingContainer}> + <ActivityIndicator size="large" color="#2b73fe" /> + <Text style={styles.loadingText}>Loading...</Text> + </View> + )} + </View> + ); + +} + +const styles = StyleSheet.create({ + buttonContainer: { + display: 'flex', + flex: 1, + alignItems: 'center', + justifyContent: 'flex-start', + width: '100%', + marginVertical: '3%', + }, + loadingContainer: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, + playButtonContainer: { + marginTop: 20, // Ajoute un espacement au-dessus du bouton Play + width: '80%', // S'assure que le bouton prend toute la largeur disponible + alignItems: 'center', // Centre le bouton horizontalement + }, + correctAnswer: { + ...ButtonsStyles.answerButton, + borderColor: 'green', + borderWidth: 2, + }, + incorrectAnswer: { + ...ButtonsStyles.answerButton, + borderColor: 'red', + borderWidth: 2, + }, + loadingAnswer: { + ...ButtonsStyles.answerButton, + backgroundColor: '#4F6367', + borderWidth: 2, + }, + selectedAnswer: { + ...ButtonsStyles.answerButton, + borderColor: 'grey', + borderWidth: 2, + }, + answerText: { + color: 'black', + textAlign: 'center', + }, + correctText: { + fontWeight: 'bold', + color: 'green', + }, + incorrectText: { + fontWeight: 'bold', + color: 'red', + }, + loadingText: { + color: 'black', + textAlign: 'center', + }, + answerButton: { + backgroundColor: "#F3F3F3", + height: '15%', + alignItems: 'center', + width: '80%', + marginVertical: '3%', + justifyContent: "center", + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.25, + shadowRadius: 3.5, + elevation: 5, + }, +}); + diff --git a/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeHeader.tsx b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeHeader.tsx new file mode 100644 index 0000000000000000000000000000000000000000..427c8cdf405bdc174a46e3d4c8d0d7e0360e2440 --- /dev/null +++ b/screens/Multiplayer/Lobby/PlayingQuizMultiMode/PlayingQuizMultiModeHeader.tsx @@ -0,0 +1,97 @@ +import {QuizInformations} from "../../../../models/QuizInformations"; +import {Question} from "../../../../models/Question"; +import {NavigationProp} from "@react-navigation/native"; +import {useTranslation} from "react-i18next"; +import {useState} from "react"; +import {View, Text, StyleSheet} from "react-native"; +import GoHomeButton from "../../../../components/PlayingQuiz/GoHomeButton"; +import {TextsStyles} from "../../../../styles/TextsStyles"; +import ConfirmModal from "../../../../components/PlayingQuiz/ComfirmModal"; +import {QuestionResponse} from "../../../../models/Response/QuestionResponse"; + +interface Props { + quizInformations?: QuizInformations; + runId?: string; + actualQuestion?: QuestionResponse; + score: number; + navigation: NavigationProp<any> +} + +export default function PlayingQuizMultiModeHeader({quizInformations, runId, actualQuestion, score, navigation}: Props) { + const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false); + const {t} = useTranslation(); + + + const handleConfirmModalConfirm = () => { + navigation.reset({ + index: 0, + routes: [ + { + name: "TabNavigator", + }, + ] + }); + } + + return ( + <View style={styles.container}> + <View style={styles.header}> + <GoHomeButton navigation={navigation} onPress={setIsConfirmModalVisible}/> + <Text style={styles.codeQuizText}>ID QUIZZ : {runId}</Text> + </View> + <View style={styles.questionAndScoreContainer}> + <View style={styles.InformationsContainer}> + <Text style={TextsStyles.titleText}>{t("app.screens.question.question")}</Text> + <Text style={TextsStyles.titleText}>{actualQuestion ? actualQuestion.question.order + 1 :"?"}/{quizInformations ? quizInformations.questionCount : "?"}</Text> + </View> + <View style={styles.InformationsContainer}> + <Text style={TextsStyles.titleText}>{t("app.screens.question.score")}</Text> + <Text style={TextsStyles.titleText}>{score}/{quizInformations ? quizInformations.questionCount : "?"}</Text> + </View> + </View> + <View style={styles.QuizQuestionContainer}> + <Text style={TextsStyles.subtitleText}>{actualQuestion ? actualQuestion.question.text : "Loading..."}</Text> + </View> + <ConfirmModal visible={isConfirmModalVisible} onClose={()=>setIsConfirmModalVisible(false)} onConfirm={handleConfirmModalConfirm}/> + + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + marginHorizontal: '5%', + }, + questionAndScoreContainer: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-around', + alignItems: 'center', + marginVertical: '2%', + }, + InformationsContainer: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + gap: '5%', + }, + QuizNumContainer: { + }, + QuizQuestionContainer: { + marginVertical: "2.5%", + }, + infoQuizContainer: { + marginBottom: '5%', + }, + codeQuizText: { + fontSize: 18, + color: '#000000', + }, + header: { + display: "flex", + flexDirection: "row", + justifyContent: "flex-start", + gap: '5%', + } +}); \ No newline at end of file diff --git a/screens/Multiplayer/Multiplayer.tsx b/screens/Multiplayer/Multiplayer.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4b406870c10ad8f88a3d65ca38aa1f2c99d3fa9f --- /dev/null +++ b/screens/Multiplayer/Multiplayer.tsx @@ -0,0 +1,29 @@ +import { NavigationProp } from "@react-navigation/native"; +import { View, StyleSheet } from "react-native"; +import TemplateMenu from "../../templates/TemplateMenu"; +import MultiplayerChild from "./MultiplayerChild"; + +interface Props { + navigation: NavigationProp<any>; +} + +export default function Home({navigation}: Props) { + return ( + <View style={styles.containerGlobal}> + <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack={false}> + <View> + <MultiplayerChild navigation={navigation}/> + </View> + </TemplateMenu> + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, +}); \ No newline at end of file diff --git a/screens/Multiplayer/MultiplayerChild.tsx b/screens/Multiplayer/MultiplayerChild.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c766368440f243d60ba3af21ee80c5a078040600 --- /dev/null +++ b/screens/Multiplayer/MultiplayerChild.tsx @@ -0,0 +1,112 @@ +import {Image, StyleSheet, Text, View} from "react-native"; +import {useTranslation} from "react-i18next"; +import React, {useEffect, useState} from "react"; +import MenuButton from "../../components/buttons/MenuButton"; +import {NavigationProp} from "@react-navigation/native"; +import HttpError from "../../services/HttpError"; +import {useUserService} from "../../services/UserService"; +import {UserConnectionState} from "../../models/User"; +import LoadingIndicator from "../../components/loading/LoadingIndicator"; +import Connection from "../Profil/Connection/Connection"; + +interface Props { + navigation: NavigationProp<any>; +} + + +/** + * HomeChild : Enfant de l'écran Home, il contient le menu principal + * @param navigation - navigation + */ +export default function MultiplayerChild({navigation}: Props) { + const [modalVisible, setModalVisible] = useState(false); + const {t} = useTranslation(); + const [userConnectionState, setUserConnectionState] = useState(UserConnectionState.LOADING); + const { getInformationsUser, logoutUser } = useUserService(); + + const getUser = async () => { + setUserConnectionState(UserConnectionState.LOADING); + const user = await getInformationsUser(); + if(user instanceof HttpError){ + setUserConnectionState(UserConnectionState.NOT_CONNECTED); + return; + } + setUserConnectionState(UserConnectionState.CONNECTED); + } + + useEffect(() => { + getUser(); + }, []); + + const handleButtonCommunityPressed = async () => { + navigation.navigate("MultiplayerCommunity"); + } + + const handleOnlineQuizPressed = () => { + navigation.navigate("OnlineQuiz"); + } + + const handleButtonOngoingQuizzesPressed = () => { + navigation.navigate("OngoingQuizzes"); + } + + return ( + <View style={styles.containerGlobal}> + {userConnectionState === UserConnectionState.LOADING && ( + <LoadingIndicator/> + )} + {userConnectionState === UserConnectionState.CONNECTED && ( + <> + <View style={styles.imageContainer}> + <Image source={require('../../assets/TitleApp.png')} style={styles.image} /> + </View> + <View style={styles.buttonContainer}> + <MenuButton text={"COMMUNITY"} handleButtonPressed={handleButtonCommunityPressed}/> + <MenuButton text={"PLAY AN ONLINE QUIZ"} handleButtonPressed={handleOnlineQuizPressed}/> + <MenuButton text={"ONGOING QUIZZES"} handleButtonPressed={handleButtonOngoingQuizzesPressed}/> + </View> + </> + )} + {userConnectionState === UserConnectionState.NOT_CONNECTED && ( + <Connection title={"Multiplayer"} navigation={navigation}/> + )} + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + justifyContent: 'flex-start', + alignItems: 'center', + }, + image: { + }, + title: { + fontSize: 40, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + alignSelf: "center", // Centre uniquement le titre + }, + button: { + borderRadius: 40, + height: '35%', + marginTop: '5%' + }, + imageContainer: { + display: 'flex', + alignItems: 'center', + marginTop: '15%', + marginBottom: '25%', + }, + buttonContainer: { + width: '100%', + display: 'flex', + flexDirection: 'column', + paddingLeft: '8%', + gap: '9%', + } +}); \ No newline at end of file diff --git a/screens/Multiplayer/MultiplayerCommunity/InformationsOfQuiz/MultiInformationsOfQuiz.tsx b/screens/Multiplayer/MultiplayerCommunity/InformationsOfQuiz/MultiInformationsOfQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ca222f47e03c8f964d490505860612c2e9190dd4 --- /dev/null +++ b/screens/Multiplayer/MultiplayerCommunity/InformationsOfQuiz/MultiInformationsOfQuiz.tsx @@ -0,0 +1,112 @@ +import React, { useState } from "react"; +import { View, Text, StyleSheet, TouchableOpacity } from "react-native"; +import TemplateMenu from "../../../../templates/TemplateMenu"; +import {NavigationProp, RouteProp} from "@react-navigation/native"; +import {Quiz} from "../../../../models/Quiz"; +import ModalCreateLobby from "../../../../components/Multiplayer/ModalCreateLobby"; + +type RoutePropsType = { + InformationsOfQuiz: { + quiz: Quiz; + }; +}; +interface Props { + navigation: NavigationProp<any>; + route: RouteProp<RoutePropsType, "InformationsOfQuiz">; +} + +export default function MultiInformationsOfQuiz({ navigation, route }: Props) { + const { quiz } = route.params; + const [showModal, setShowModal] = useState<boolean>(false); + + const onCreateLobbyPressed = () => { + setShowModal(true); + }; + + const onClosePressed = () => { + setShowModal(false); + }; + + const onPlayPressed = async (nbPlayer: number) => { + setShowModal(false); + navigation.navigate("Lobby", {quizId: quiz.id, roomId: null, nbPlayer: nbPlayer, isHost: true}); + }; + + return ( + <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}> + <View style={styles.container}> + <Text style={styles.quizTitle}>{quiz.name}</Text> + <Text style={styles.quizDescription}>{quiz.description && "No Description"}</Text> + + + <View style={styles.aboutContainer}> + <Text style={styles.aboutTitle}>About this quiz :</Text> + <Text style={styles.aboutDetails}>{quiz.questionCount} questions, {quiz.difficulty.name}</Text> + <Text style={styles.aboutDetails}>By : {quiz.authorId && "Unknown"}</Text> + </View> + + <TouchableOpacity style={styles.playButton} onPress={onCreateLobbyPressed}> + <Text style={styles.playButtonText}>CREATE LOBBY</Text> + </TouchableOpacity> + </View> + <ModalCreateLobby onClosePressed={onClosePressed} onPlayPressed={onPlayPressed} showModal={showModal}/> + </TemplateMenu> + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + paddingHorizontal: 20, + paddingVertical: 20, + justifyContent: "flex-start", + }, + quizTitle: { + fontSize: 24, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + }, + quizDescription: { + fontSize: 16, + color: "#555", + marginBottom: 20, + height: "15%", + }, + aboutContainer: { + height: "50%", + backgroundColor: "white", + borderRadius: 10, + padding: 15, + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.2, + shadowRadius: 3, + elevation: 5, + }, + aboutTitle: { + fontSize: 18, + fontWeight: "bold", + marginBottom: 10, + color: "#000", + }, + aboutDetails: { + fontSize: 16, + color: "#555", + marginBottom: 10, + }, + playButton: { + backgroundColor: "#007BFF", + paddingVertical: 15, + borderRadius: 10, + alignItems: "center", + justifyContent: "center", + marginTop: 20, + }, + playButtonText: { + fontSize: 18, + fontWeight: "bold", + color: "white", + }, +}); diff --git a/screens/Multiplayer/MultiplayerCommunity/MultiplayerCommunity.tsx b/screens/Multiplayer/MultiplayerCommunity/MultiplayerCommunity.tsx new file mode 100644 index 0000000000000000000000000000000000000000..dbc402b7f8224dada3195d8ca4c4e8736e5d7c7b --- /dev/null +++ b/screens/Multiplayer/MultiplayerCommunity/MultiplayerCommunity.tsx @@ -0,0 +1,75 @@ +import {View, Text, Modal, TextInput, StyleSheet} from "react-native"; +import TemplateQuizList from "../../../templates/TemplateQuizList"; +import {NavigationProp} from "@react-navigation/native"; +import React, {useState} from "react"; +import {useQuizService} from "../../../services/QuizService"; +import HttpError from "../../../services/HttpError"; +import {useInfiniteQuery} from "@tanstack/react-query"; +import { Quiz } from "../../../models/Quiz"; +import WhiteButton from "../../../components/buttons/WhiteButton"; +import BlueButton from "../../../components/buttons/BlueButton"; +import ModalCreateLobby from "../../../components/Multiplayer/ModalCreateLobby"; + +interface Props { + navigation: NavigationProp<any> +} +export default function MultiplayerCommunity({navigation}: Props) { + const {getCommunityQuiz, getRandomQuiz} = useQuizService(); + const [input, setInput] = useState<string>("") + const [loading, setLoading] = useState<boolean>(false) + + const fetchCommunityQuizzes = async ({pageParam = 1}) => { + const quizzes = await getCommunityQuiz(pageParam,7);//TODO: changer pour get les quiz community public + if (HttpError.isHttpError(quizzes)) { + console.error("Error while fetching community quizzes:", quizzes); + return []; + } + return quizzes; + } + + const onQuizPressed = (quiz: Quiz) => { + navigation.navigate("MultiInformationsOfQuiz", {quiz: quiz}); + }; + + const { + data, + fetchNextPage, + } = useInfiniteQuery({ + queryKey: ["communityQuizzes"], + queryFn: fetchCommunityQuizzes, + initialPageParam: 0, + getNextPageParam: (lastPage, allPages) => { + // Si la dernière page a moins de 7 quizzes, il n'y a plus de page suivante + if (lastPage.length < 7) return undefined; + + // On augmente skip de 7 pour la prochaine requête + return allPages.length * 7; + }}); + + + + return ( + <View style={styles.containerGlobal}> + {/* <View style={styles.templateQuizListContainer}> */} + <TemplateQuizList title={"Community"} setTextInInput={setInput} quizList={data?.pages.flat() ?? []} navigation={navigation} buttonGoBack={true} isLoadingData={loading} nextPage={fetchNextPage} onQuizPressed={onQuizPressed}/> + {/* </View> */} + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, + templateQuizListContainer: { + height: '90%', + }, + buttonContainer: { + height: '10%', + width: '95%', + marginLeft: '2.5%', + } +}); \ No newline at end of file diff --git a/screens/Multiplayer/OngoingQuizzes/OngoingQuizzes.tsx b/screens/Multiplayer/OngoingQuizzes/OngoingQuizzes.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6374b8b2e05d2d02263e68269df9a2dc7f0cbdaa --- /dev/null +++ b/screens/Multiplayer/OngoingQuizzes/OngoingQuizzes.tsx @@ -0,0 +1,80 @@ +import {View, StyleSheet} from "react-native"; +import TemplateQuizList from "../../../templates/TemplateQuizList"; +import {NavigationProp} from "@react-navigation/native"; +import {useEffect, useState} from "react"; +import {useQuizService} from "../../../services/QuizService"; +import HttpError from "../../../services/HttpError"; +import {useInfiniteQuery} from "@tanstack/react-query"; +import { Quiz } from "../../../models/Quiz"; +import BlueButton from "../../../components/buttons/BlueButton"; + +interface Props { + navigation: NavigationProp<any> +} +export default function Community({navigation}: Props) { + const {getCommunityQuiz} = useQuizService(); + const [input, setInput] = useState<string>("") + const [loading, setLoading] = useState<boolean>(false) + const [CurrentQuiz, setCurrentQuiz] = useState<Quiz | null>(null); + + const fetchCommunityQuizzes = async ({pageParam = 1}) => { + const quizzes = await getCommunityQuiz(pageParam,7); + if (HttpError.isHttpError(quizzes)) { + console.error("Error while fetching community quizzes:", quizzes); + return []; + } + return quizzes; + } + + const onQuizPressed = (quiz: Quiz) => { + setCurrentQuiz(quiz); + }; + + const onJoinPressed = () => { + navigation.navigate("Lobby"); + }; + + //TODO: changer la fonction de fetch + const { + data, + fetchNextPage, + } = useInfiniteQuery({ + queryKey: ["communityQuizzes"], + queryFn: fetchCommunityQuizzes, + initialPageParam: 0, + getNextPageParam: (lastPage, allPages) => { + // Si la dernière page a moins de 7 quizzes, il n'y a plus de page suivante + if (lastPage.length < 7) return undefined; + + // On augmente skip de 7 pour la prochaine requête + return allPages.length * 7; + }}); + + return ( + <View> + <View style={styles.templateQuizListContainer}> + <TemplateQuizList title={"Ongoing Quizzes"} setTextInInput={setInput} quizList={data?.pages.flat() ?? []} navigation={navigation} buttonGoBack={true} isLoadingData={loading} nextPage={fetchNextPage} onQuizPressed={onQuizPressed}/> + </View> + <View style={styles.buttonContainer}> + <BlueButton text="JOINa" onPress={onJoinPressed} isDisabled={false}/> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, + templateQuizListContainer: { + height: '90%', + }, + buttonContainer: { + height: '10%', + width: '95%', + marginLeft: '2.5%', + } +}); \ No newline at end of file diff --git a/screens/Multiplayer/OnlineQuiz/OnlineCreateLobby.tsx b/screens/Multiplayer/OnlineQuiz/OnlineCreateLobby.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7f7e8eeb8dc8e32c94dd46d32f4be9a3f893fdfe --- /dev/null +++ b/screens/Multiplayer/OnlineQuiz/OnlineCreateLobby.tsx @@ -0,0 +1,111 @@ +import { View, StyleSheet } from "react-native"; +import React, {useEffect, useState} from "react"; +import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz"; +import {useQuizService} from "../../../services/QuizService"; +import {NavigationProp} from "@react-navigation/native"; +import BlueButton from "../../../components/buttons/BlueButton"; +import SelectListBoxString from "../../../components/PlayQuiz/SelectListBoxString"; +import SelectListBoxCategory from "../../../components/PlayQuiz/SelectListBoxCategory"; +import { Category } from "../../../models/Quiz"; +import HttpError from "../../../services/HttpError"; + +const difficulty = [ + { key: "easy", value: "easy" }, + { key: "medium", value: "medium" }, + { key: "hard", value: "hard" }, +]; + + +interface Props { + navigation: NavigationProp<any>; +} + +export default function OnlineCreateLobby({navigation}: Props) { + const [difficutlyChoose, setDifficutlyChoose] = React.useState(""); + const [categories, setCategories] = useState<Category[]>([]); + const [categoryChoose, setCategoryChoose] = React.useState<Category | null>(null); + const [nbQuestions, setNbQuestions] = React.useState("10"); + const [nbPlayers, setNbPlayers] = React.useState("2"); + const [buttonIsDisabled, setButtonIsDisabled] = React.useState(true); + const {generateQuiz, getCategories} = useQuizService(); + + const fetchingCategories = async () => { + const categories = await getCategories(); + let categoriesTemp: Category[] = []; + categories.map((category: Category) => { + categoriesTemp.push({'name': category.name, 'id': category.id}); + }); + setCategories(categoriesTemp); + } + + useEffect(() => { + fetchingCategories(); + }, []); + + useEffect(() => { + if(nbQuestions === "" || difficutlyChoose === "" || categoryChoose === null) + { + setButtonIsDisabled(true); + } + else + { + setButtonIsDisabled(false); + } + + }, [difficutlyChoose,categoryChoose,nbQuestions]); + + const handlePlayButtonPress = async () => { + const quizGenerated = await generateQuiz(parseInt(nbQuestions), categoryChoose ? categoryChoose.id : 10, difficutlyChoose); + if(HttpError.isHttpError(quizGenerated)) { + return; + } + + navigation.navigate("Lobby", { + quizId: quizGenerated.quizId, + roomId: null, + nbPlayers: parseInt(nbPlayers), + isHost: true, + }); + }; + + return ( + <View style={styles.container}> + <View style={styles.contentContainer}> + <View style={styles.fieldContainer}> + <SelectListBoxString title="CHOOSE A DIFFICULTY" data={difficulty} setSelected={setDifficutlyChoose} /> + <SelectListBoxCategory title="CHOOSE A CATEGORY" data={categories} setSelected={setCategoryChoose} /> + <InputPlayQuiz title="CHOOSE A NUMBER OF QUESTIONS" setText={setNbQuestions} numeric={true} defaultValue={nbQuestions}/> + <InputPlayQuiz title="NUMBER OF PLAYERS" setText={setNbPlayers} numeric={true} defaultValue={nbPlayers}/> + </View> + <View style={styles.buttonPlayContainer}> + <BlueButton onPress={handlePlayButtonPress} text={"CREATE LOBBY"} isDisabled={buttonIsDisabled}/> + </View> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + width: "100%", + height: "75%", + justifyContent: "space-between", + }, + contentContainer: { + flex: 1, // Prend toute la hauteur disponible + flexDirection: "column", + justifyContent: "space-between", + }, + fieldContainer: { + width: "100%", + flexDirection: "column", + justifyContent: "space-between", + marginTop: 20, + gap: 20, + }, + buttonPlayContainer: { + alignItems: "center", + paddingVertical: 20, + }, +}); diff --git a/screens/Multiplayer/OnlineQuiz/OnlinePlayQuiz.tsx b/screens/Multiplayer/OnlineQuiz/OnlinePlayQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c91647d21dd31fc2c030d1a80d1f8b78514b54aa --- /dev/null +++ b/screens/Multiplayer/OnlineQuiz/OnlinePlayQuiz.tsx @@ -0,0 +1,85 @@ +import { StyleSheet, View, Text } from "react-native"; +import React from "react"; +import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz"; +import { useQuizService } from "../../../services/QuizService"; +import HttpError from "../../../services/HttpError"; +// import {getIdOfCategory} from "../../../helper/QuizHelper"; +import {NavigationProp} from "@react-navigation/native"; +import BlueButton from "../../../components/buttons/BlueButton"; + +interface Props { + navigation: NavigationProp<any>; +} +export default function OnlinePlayQuiz({navigation}: Props) { + const [codeQuiz, setCodeQuiz] = React.useState(""); + const [error, setError] = React.useState<string>(""); + const {getRunsInfo} = useQuizService(); + + const checkRoomExist = async () : Promise<boolean> => { + const runFetched = await getRunsInfo(codeQuiz); + if(runFetched instanceof HttpError) { + return false; + } + return true; + } + + const joinLobby = async () => { + const response = await checkRoomExist() + if(!response) { + setError("The room does not exist"); + return; + } + setError(""); + navigation.navigate("Lobby", { + quizId: null, + roomId: codeQuiz, + nbPlayers: 10, + isHost: false, + }); + }; + + return ( + <View style={styles.container}> + <View style={styles.contentContainer}> + <View style={styles.fieldContainer}> + {error ? <Text style={styles.errorText}>{error}</Text> : null} + <InputPlayQuiz placeholder={"Enter room ID"} setText={setCodeQuiz} noTitle={true} /> + </View> + <View style={styles.buttonPlayContainer}> + <BlueButton onPress={joinLobby} text={"JOIN"} isDisabled={codeQuiz==="" || error!==""}/> + </View> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: "flex", + width: "100%", + height: "75%", + justifyContent: "space-between", + }, + contentContainer: { + flex: 1, // Prend toute la hauteur disponible + flexDirection: "column", + justifyContent: "space-between", + }, + fieldContainer: { + width: "100%", + flexDirection: "column", + justifyContent: "space-between", + marginTop: 20, + gap: 20, + }, + buttonPlayContainer: { + alignItems: "center", + paddingVertical: 20, + }, + errorText: { + color: "red", + fontSize: 16, + marginBottom: 5, + textAlign: "left", // Aligne le texte à gauche + }, +}); diff --git a/screens/Multiplayer/OnlineQuiz/OnlineQuiz.tsx b/screens/Multiplayer/OnlineQuiz/OnlineQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7b3ce82c7d007890274026f273d037ec68fb4de6 --- /dev/null +++ b/screens/Multiplayer/OnlineQuiz/OnlineQuiz.tsx @@ -0,0 +1,28 @@ +import { NavigationProp } from "@react-navigation/native"; +import { View, StyleSheet } from "react-native"; +import TemplateMenu from "../../../templates/TemplateMenu"; +import OnlineQuizChild from "./OnlineQuizChild"; + +interface Props{ + navigation: NavigationProp<any> +} +export default function OnlineQuiz({navigation}: Props) { + return ( + <View style={styles.containerGlobal}> + <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={true}> + <View> + <OnlineQuizChild navigation={navigation}/> + </View> + </TemplateMenu> + </View> + ) +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, +}); \ No newline at end of file diff --git a/screens/Multiplayer/OnlineQuiz/OnlineQuizChild.tsx b/screens/Multiplayer/OnlineQuiz/OnlineQuizChild.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ce6258b0faf716885913e009cf565fb600260d9f --- /dev/null +++ b/screens/Multiplayer/OnlineQuiz/OnlineQuizChild.tsx @@ -0,0 +1,44 @@ +import { NavigationProp } from "@react-navigation/native"; +import { useState } from "react"; +import { OnlineSelectModeType, SelectModeType } from "../../../models/SelectModeType"; +import { TouchableWithoutFeedback, View, StyleSheet, Keyboard } from "react-native"; +import OnlineSelectMode from "./OnlineSelectMode"; +import OnlineCreateLobby from "./OnlineCreateLobby"; +import OnlinePlayQuiz from "./OnlinePlayQuiz"; + +interface Props { + navigation: NavigationProp<any> +} + +export default function OnlineQuizChild({navigation}: Props){ + const [mode, setMode] = useState<OnlineSelectModeType>("create"); + + return ( + <TouchableWithoutFeedback onPress={Keyboard.dismiss}> + <View style={styles.containerGlobal}> + <View style={styles.contentContainer}> + <OnlineSelectMode mode={mode} setMode={setMode}/> + {mode === "create" ? ( + <OnlineCreateLobby navigation={navigation}/> + ) : ( + <OnlinePlayQuiz navigation={navigation}/> + )} + </View> + </View> + </TouchableWithoutFeedback> + ) +} +const styles = StyleSheet.create({ + containerGlobal: { + width: '100%', + height: '100%', + alignItems: 'center', + justifyContent: 'center', + }, + contentContainer: { + display: 'flex', + width: '95%', + height: '100%', + flexDirection: 'column', + }, +}); \ No newline at end of file diff --git a/screens/Multiplayer/OnlineQuiz/OnlineSelectMode.tsx b/screens/Multiplayer/OnlineQuiz/OnlineSelectMode.tsx new file mode 100644 index 0000000000000000000000000000000000000000..cc4522640d44e3d16132801687df1facc86c8c7b --- /dev/null +++ b/screens/Multiplayer/OnlineQuiz/OnlineSelectMode.tsx @@ -0,0 +1,75 @@ +import { View, Text, StyleSheet, TouchableOpacity } from "react-native"; +import { OnlineSelectModeType } from "../../../models/SelectModeType"; + +interface Props { + mode: OnlineSelectModeType; + setMode: (mode: OnlineSelectModeType) => void; +} + +export default function OnlineSelectMode({ mode, setMode }: Props) { + return ( + <View style={styles.container}> + <View style={styles.buttonContainer}> + <TouchableOpacity onPress={() => setMode("create")}> + <Text style={[styles.text, mode === "create" && styles.activeText]}>CREATE A LOBBY</Text> + </TouchableOpacity> + <View style={[styles.bar, mode === "create" ? styles.activeBar : styles.inactiveBar]} /> + </View> + + <View style={styles.buttonContainer}> + <TouchableOpacity onPress={() => setMode("join")}> + <Text style={[styles.text, mode === "join" && styles.activeText]}>JOIN A ROOM</Text> + </TouchableOpacity> + <View style={[styles.bar, mode === "join" ? styles.activeBar : styles.inactiveBar]} /> + </View> + + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: 'flex', + width: '100%', + height: '12%', + flexDirection: 'row', + backgroundColor: '#f3f3f3', + borderRadius: 10, + justifyContent: 'space-around', + alignItems: 'center', + // Ombre pour Android + elevation: 5, + // Ombre pour iOS + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre en bas + shadowOpacity: 0.25, // Opacité de l'ombre + shadowRadius: 3.84, // Flou de l'ombre + }, + buttonContainer: { + display: 'flex', + flexDirection: 'column', + width: '45%', + alignItems: 'center', + gap: "2%", + }, + text: { + fontSize: 18, + color: '#bebebe', + textAlign: 'center', + }, + activeText: { + color: '#2ec7ff', + }, + bar: { + width: '100%', + height: '4%', + marginTop: '4%', + borderRadius: 10, + }, + activeBar: { + backgroundColor: '#2ec7ff', // Couleur pour le bouton actif + }, + inactiveBar: { + backgroundColor: '#bebebe', // Couleur grise pour les boutons inactifs + }, +}); diff --git a/screens/PlayingQuiz/EndQuiz/EndQuiz.tsx b/screens/PlayingQuiz/EndQuiz/EndQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..bb73a9b5f86249c4efcdbbad26605a727d144c7f --- /dev/null +++ b/screens/PlayingQuiz/EndQuiz/EndQuiz.tsx @@ -0,0 +1,39 @@ +import {NavigationProp, RouteProp} from "@react-navigation/native"; +import { View, StyleSheet, Image, Text } from "react-native"; +import EndQuizChild from "./EndQuizChild"; +import TemplateMenu from "../../../templates/TemplateMenu"; +import {Quiz} from "../../../models/Quiz"; +import {QuizInformations} from "../../../models/QuizInformations"; + +type RoutePropsType = { + EndQuizChild: { + quizInformations: QuizInformations; + score: number; + }; +}; +interface Props { + route: RouteProp<RoutePropsType, "EndQuizChild">; + navigation: NavigationProp<any>; +} + +export default function EndQuiz({route,navigation}: Props) { + const { quizInformations, score } = route.params; + return ( + <View style={styles.containerGlobal}> + <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack={false}> + <View> + <EndQuizChild navigation={navigation} quizInformations={quizInformations} score={score}/> + </View> + </TemplateMenu> + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, +}); diff --git a/screens/PlayingQuiz/EndQuiz/EndQuizChild.tsx b/screens/PlayingQuiz/EndQuiz/EndQuizChild.tsx new file mode 100644 index 0000000000000000000000000000000000000000..767dce5d464e3021c374d85446df81ae57f3da69 --- /dev/null +++ b/screens/PlayingQuiz/EndQuiz/EndQuizChild.tsx @@ -0,0 +1,117 @@ +import { View, Image, Text, StyleSheet } from "react-native"; +import DefaultButton from "../../../components/buttons/DefaultButton"; +import { NavigationProp, RouteProp } from "@react-navigation/native"; +import {Quiz} from "../../../models/Quiz"; +import {useQuizService} from "../../../services/QuizService"; +import HttpError from "../../../services/HttpError"; +import {QuizInformations} from "../../../models/QuizInformations"; + + + +interface Props { + navigation: NavigationProp<any>; + quizInformations: QuizInformations; + score: number; +} + +export default function EndQuizChild({ navigation, quizInformations, score }: Props) { + + const {restartQuiz, remainingQuiz, createRun} = useQuizService() + + const handleRestartPress = async () => { + const quizId = quizInformations.id.toString(); + const runId = await createRun(quizId); + navigation.navigate('PlayingQuiz', {runId: runId, quizId: quizId}); + }; + + const handleBackToMenu = () => { + navigation.navigate('TabNavigator'); + }; + + return ( + <View style={styles.container}> + <View style={styles.containerHeader}> + <Image source={require('../../../assets/TitleApp.png')}/> + </View> + <View style={styles.containerBody}> + <Text style={styles.TextBodyTitle}>{((score/quizInformations.questionCount)*100 > 50 ) ? 'Victory' : 'Defeat'}</Text> + <Text style={styles.TextBody}>you finish the test with a score of {`${score}/${quizInformations.questionCount}`} ! </Text> + <Image source={require('../../../assets/uWin.png')} /> + <DefaultButton text="RESTART" handleButtonPressed={handleRestartPress} buttonStyle={styles.whiteButton} buttonText={styles.whiteButtonText}></DefaultButton> + <DefaultButton text="BACK TO MENU" handleButtonPressed={handleBackToMenu} buttonStyle={styles.blueButton} buttonText={styles.blueButtonText}></DefaultButton> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + height: '100%', + width: '100%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'space-around' + }, + containerHeader: { + height: '10%', + width: '100%', + alignItems: 'center', + }, + containerBody: { + height: '80%', + width: '90%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'space-around', + backgroundColor: '#F3F3F3', + borderRadius: 40, + padding: '10%', + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + + elevation: 5, + }, + TextBodyTitle: { + textAlign: 'center', + fontSize: 24, + fontWeight: 'bold', + }, + TextBody: { + textAlign: 'center', + fontSize: 22, + fontWeight: 'bold', + }, + whiteButton: { + height: '12%', + width: '80%', + backgroundColor: '#FFFFFF', + borderColor: '#2B73FE', + borderWidth: 4, + borderRadius: 10, + padding: 0 + }, + whiteButtonText: { + fontSize: 24, + fontWeight: 'bold', + color: '#2B73FE', + }, + blueButton: { + height: '12%', + width: '80%', + backgroundColor: '#2B73FE', + borderRadius: 10, + padding: 0 + }, + blueButtonText: { + fontSize: 24, + fontWeight: 'bold', + color: '#FFFFFF', + }, +}); \ No newline at end of file diff --git a/screens/PlayingQuiz/EndQuizMulti/EndQuizMulti.tsx b/screens/PlayingQuiz/EndQuizMulti/EndQuizMulti.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1945637e5a85c3473285e25902d0c195fcd5c9a5 --- /dev/null +++ b/screens/PlayingQuiz/EndQuizMulti/EndQuizMulti.tsx @@ -0,0 +1,41 @@ +import {NavigationProp, RouteProp} from "@react-navigation/native"; +import { View, StyleSheet, Image, Text } from "react-native"; +import TemplateMenu from "../../../templates/TemplateMenu"; +import {Quiz} from "../../../models/Quiz"; +import EndQuizChild from "../EndQuiz/EndQuizChild"; +import EndQuizMultiChild from "./EndQuizMultiChild"; + +type RoutePropsType = { + EndQuizChild: { + quiz: Quiz; + }; +}; +interface Props { + route: RouteProp<RoutePropsType, "EndQuizChild">; + navigation: NavigationProp<any>; +} + +export default function EndQuizMulti({route,navigation}: Props) { + const { quiz } = route.params; + return ( + <View style={styles.containerGlobal}> + <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack={false}> + <View> + <EndQuizMultiChild navigation={navigation} quiz={quiz}/> + </View> + </TemplateMenu> + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, +}); + + + diff --git a/screens/PlayingQuiz/EndQuizMulti/EndQuizMultiChild.tsx b/screens/PlayingQuiz/EndQuizMulti/EndQuizMultiChild.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b53eb9f21dcc69cbbfb1e87017ab6ae8b80b1152 --- /dev/null +++ b/screens/PlayingQuiz/EndQuizMulti/EndQuizMultiChild.tsx @@ -0,0 +1,128 @@ +import { View, Image, Text, StyleSheet } from "react-native"; +import DefaultButton from "../../../components/buttons/DefaultButton"; +import { NavigationProp, RouteProp } from "@react-navigation/native"; +import {Quiz} from "../../../models/Quiz"; +import {useQuizService} from "../../../services/QuizService"; +import HttpError from "../../../services/HttpError"; +import UserScore from "../../../components/PlayingQuiz/EndQuiz/UserScore"; +import EndQuizListPlayer from "../../../components/PlayingQuiz/EndQuiz/EndQuizListPlayer"; + + + +interface Props { + navigation: NavigationProp<any>; + quiz: Quiz; +} + +export default function EndQuizMultiChild({ navigation, quiz }: Props) { + + const userTest = {id: 1, email: "user1@email.com", username: "user1", stats: undefined}; + + const handleBackToMenu = () => { + navigation.navigate('TabNavigator'); + }; + + return ( + <View style={styles.container}> + <View style={styles.containerHeader}> + <Image source={require('../../../assets/TitleApp.png')}/> + </View> + <View style={styles.containerBody}> + <Image + source={require('../../../assets/stars.png')} // URL de l'avatar ou placeholder + style={styles.stars} + /> + <View style={styles.usersContainer}> + <UserScore user={userTest} score={10} maxScore={quiz.questionCount} isFirst={false}/> + <UserScore user={userTest} score={10} maxScore={quiz.questionCount} isFirst={true}/> + <UserScore user={userTest} score={10} maxScore={quiz.questionCount} isFirst={false}/> + </View> + <EndQuizListPlayer users={[userTest, userTest]} maxScore={quiz.questionCount}/> + + {/*<DefaultButton text="RESTART" handleButtonPressed={handleRestartPress} buttonStyle={styles.whiteButton} buttonText={styles.whiteButtonText}></DefaultButton>*/} + <DefaultButton text="BACK TO MENU" handleButtonPressed={handleBackToMenu} buttonStyle={styles.blueButton} buttonText={styles.blueButtonText}></DefaultButton> + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + height: '100%', + width: '100%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'space-around' + }, + usersContainer: { + display: 'flex', + width: '100%', + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-around', + }, + containerHeader: { + height: '10%', + width: '100%', + alignItems: 'center', + }, + containerBody: { + height: '80%', + width: '90%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'space-around', + backgroundColor: '#F3F3F3', + borderRadius: 40, + padding: '5%', + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + elevation: 5, + }, + TextBodyTitle: { + textAlign: 'center', + fontSize: 24, + fontWeight: 'bold', + }, + TextBody: { + textAlign: 'center', + fontSize: 22, + fontWeight: 'bold', + }, + whiteButton: { + height: '12%', + width: '80%', + backgroundColor: '#FFFFFF', + borderColor: '#2B73FE', + borderWidth: 4, + borderRadius: 10, + padding: 0 + }, + whiteButtonText: { + fontSize: 24, + fontWeight: 'bold', + color: '#2B73FE', + }, + blueButton: { + height: '12%', + width: '80%', + backgroundColor: '#2B73FE', + borderRadius: 10, + padding: 0 + }, + blueButtonText: { + fontSize: 24, + fontWeight: 'bold', + color: '#FFFFFF', + }, + stars: { + resizeMode: "cover", + }, +}); \ No newline at end of file diff --git a/screens/PlayingQuiz/PlayingQuiz.tsx b/screens/PlayingQuiz/PlayingQuiz.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3f9134b0615578fad97fe7c688691c228204bc3b --- /dev/null +++ b/screens/PlayingQuiz/PlayingQuiz.tsx @@ -0,0 +1,64 @@ +import PlayingQuizHeader from "./PlayingQuizHeader"; +import React, {useEffect, useState} from "react"; +import TemplateDuo from "../../templates/TemplateDuo"; +import {NavigationProp, RouteProp} from "@react-navigation/native"; +import {QuizInformations} from "../../models/QuizInformations"; +import {useQuizService} from "../../services/QuizService"; +import HttpError from "../../services/HttpError"; +import {Question} from "../../models/Question"; +import PlayingQuizBody from "./PlayingQuizBody"; +import { shuffleAnswersOfQuiz } from "../../helper/QuizHelper"; + + +type RoutePropsType = { + PlayingQuiz: { + runId: string; + quizId: string; + }; +}; + +interface Props { + route: RouteProp<RoutePropsType, "PlayingQuiz">; + navigation: NavigationProp<any>; +} + +export default function PlayingQuiz({route, navigation}:Props) { + const {runId, quizId} = route.params; + const { getQuizInformations, getActualQuestionOfAQuiz } = useQuizService(); + const [quizInformations, setQuizInformations] = useState<QuizInformations | undefined>(undefined); + const [actualQuestion, setActualQuestion] = useState<Question | undefined>(undefined); + const [score, setScore] = useState(0); + + const fetchQuizInformations = async () => { + const quizInformationsFetched = await getQuizInformations(quizId); + if (HttpError.isHttpError(quizInformationsFetched)) { + return; + } + + setQuizInformations(quizInformationsFetched); + } + + const fetchActualQuestion = async () => { + const actualQuestionFetched = await getActualQuestionOfAQuiz(runId); + if (HttpError.isHttpError(actualQuestionFetched)) { + return; + } + const actualQuestionFetchedShuffle = shuffleAnswersOfQuiz(actualQuestionFetched); + setActualQuestion(actualQuestionFetchedShuffle); + } + + useEffect(() => { + fetchQuizInformations(); + }, []); + + useEffect(() => { + fetchActualQuestion(); + }, [quizId]); + + return ( + <TemplateDuo + childrenHeader={<PlayingQuizHeader quizInformations={quizInformations} runId={runId} actualQuestion={actualQuestion} score={score} navigation={navigation}></PlayingQuizHeader>} + childrenBody={<PlayingQuizBody score={score} quizInformations={quizInformations} runId={runId} actualQuestion={actualQuestion} fetchActualQuestion={fetchActualQuestion} setScore={setScore} navigation={navigation}></PlayingQuizBody>} + /> + ); +} \ No newline at end of file diff --git a/screens/PlayingQuiz/PlayingQuizBody.tsx b/screens/PlayingQuiz/PlayingQuizBody.tsx new file mode 100644 index 0000000000000000000000000000000000000000..619e3b7c2e91e2879e7c388106b136af79b794c5 --- /dev/null +++ b/screens/PlayingQuiz/PlayingQuizBody.tsx @@ -0,0 +1,250 @@ +import {View, StyleSheet, Text, ActivityIndicator, ScrollView} from "react-native"; +import DefaultButton from "../../components/buttons/DefaultButton"; +import { ButtonsStyles } from "../../styles/ButtonsStyles"; +import React, { useState, useEffect, SetStateAction, Dispatch } from "react"; +import { useQuizService } from "../../services/QuizService"; +import {NavigationProp} from "@react-navigation/native"; +import HttpError from "../../services/HttpError"; +import BlueButton from "../../components/buttons/BlueButton"; +import {Question} from "../../models/Question"; +import {Answer} from "../../models/Answer"; +import {Quiz} from "../../models/Quiz"; +import AnswerButton from "../../components/buttons/AnswerButton"; +import {QuizInformations} from "../../models/QuizInformations"; +import AnswerButtonImage from "../../components/buttons/AnswerButtonImage"; + +interface Props { + quizInformations?: QuizInformations; + runId?: string; + actualQuestion: Question; + fetchActualQuestion: () => void; + score: number; + setScore: (score: number) => void; + navigation: NavigationProp<any>; +} + +enum QuizState { + ANSWERING= "Answering", + LOADING= "Loading", + SHOWING_RESULTS= "ShowingResults", +} + +const getStyleOfAnswerButtonText = (answerId: number, selectedAnswerIndex: number | null, correctAnswerId: number | null, quizState: QuizState) => { + if(quizState === QuizState.LOADING) + { + return styles.loadingText; + } + if(quizState === QuizState.ANSWERING) + { + return styles.answerText; + + } + if(quizState === QuizState.SHOWING_RESULTS) + { + if(answerId === correctAnswerId) return styles.correctText; + if(answerId !== correctAnswerId && selectedAnswerIndex === answerId) return styles.incorrectText; + } + return styles.answerText; +} + +const getStyleOfAnswerButton = (answerId: number, selectedAnswerIndex: number | null, correctAnswerId: number | null, quizState: QuizState) => { + if(quizState === QuizState.LOADING) + { + return styles.loadingAnswer; + } + if(quizState === QuizState.ANSWERING) + { + if(selectedAnswerIndex === null) return styles.answerButton; + if(selectedAnswerIndex === answerId) return styles.selectedAnswer; + + } + if(quizState === QuizState.SHOWING_RESULTS) + { + if(answerId === correctAnswerId) return styles.correctAnswer; + if(answerId !== correctAnswerId && selectedAnswerIndex === answerId) return styles.incorrectAnswer; + } + return styles.answerButton; +} + +export default function PlayingQuizBody({ quizInformations, runId, actualQuestion, fetchActualQuestion, score, setScore, navigation }: Props) { + const [selectedAnswerId, setSelectedAnswerId] = useState<number | null>(null); + const [quizState, setQuizState] = useState(QuizState.ANSWERING); + const [correctAnswerId, setCorrectAnswerId] = useState<number | null>(null); + const [isLastQuestion, setIsLastQuestion] = useState(false); + + const {answerQuestion} = useQuizService(); + const getCorrectAnswer = (answers: Answer[]): Answer => { + const correctAnswer = answers.find((answer) => answer.isCorrect); + if (!correctAnswer) throw new Error("No correct answer found"); + return correctAnswer; + }; + const onValidation = async () => { + if(selectedAnswerId === null) return; + setQuizState(QuizState.LOADING); + const answerId = actualQuestion.answers.find((answer) => answer.id === selectedAnswerId)?.id; + if(!answerId || !runId) return; + const answereFetched = await answerQuestion(runId, actualQuestion.id, answerId); + + if (HttpError.isHttpError(answereFetched)) { + return; + } + setScore(answereFetched.score); + const correctAnswerIdFetched = getCorrectAnswer(answereFetched.answers.answers).id; + setCorrectAnswerId(correctAnswerIdFetched); + setQuizState(QuizState.SHOWING_RESULTS); + + if (quizInformations === undefined) return; + // Check si c'est la dernière question + if(answereFetched.answers.order === quizInformations.questionCount - 1) { + setIsLastQuestion(true); + return; + } + + }; + const onContinue = () => { + if(isLastQuestion) { + navigation.reset({ + index: 0, + routes: [ + { + name: "EndQuiz", + params: {quizInformations: quizInformations, score: score}, + }, + ] + }); + return; + } + fetchActualQuestion(); + setQuizState(QuizState.ANSWERING); + setSelectedAnswerId(null); + setCorrectAnswerId(null); + } + + const onAnsweredButtonClicked = (answerId: number) => { + if(quizState === QuizState.SHOWING_RESULTS || quizState === QuizState.LOADING) { + return; + } + setSelectedAnswerId(answerId); + } + + return ( + <View style={styles.buttonContainer}> + {actualQuestion ? ( + <> + <ScrollView + style={styles.buttonListContainer} + contentContainerStyle={styles.buttonListContentContainer} + > + {actualQuestion.answers.map((answer, index) => ( + actualQuestion.type === "image" ? + <AnswerButtonImage + key={index} + url={answer.text} + handleButtonPressed={() => onAnsweredButtonClicked(answer.id)} + buttonStyle={getStyleOfAnswerButton(answer.id, selectedAnswerId, correctAnswerId, quizState)} + /> + : + <AnswerButton + key={index} + text={answer.text} + handleButtonPressed={() => onAnsweredButtonClicked(answer.id)} + buttonStyle={getStyleOfAnswerButton(answer.id, selectedAnswerId, correctAnswerId, quizState)} + buttonText={getStyleOfAnswerButtonText(answer.id, selectedAnswerId, correctAnswerId, quizState)} + /> + ))} + {/* </View> */} + </ScrollView> + <View style={styles.playButtonContainer}> + <BlueButton onPress={() => quizState === QuizState.ANSWERING ? onValidation() : onContinue()} text={quizState === QuizState.ANSWERING ? "CONFIRM" : "CONTINUE"} buttonStyle={{borderRadius: 50}} isDisabled={false}/> + </View> + </> + ) : ( + <View style={styles.loadingContainer}> + <ActivityIndicator size="large" color="#2b73fe" /> + <Text style={styles.loadingText}>Loading...</Text> + </View> + )} + </View> + ); + +} + +const styles = StyleSheet.create({ + buttonContainer: { + display: 'flex', + flex: 1, + alignItems: 'center', + justifyContent: 'flex-start', + width: '100%', + marginVertical: '3%', + }, + loadingContainer: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, + playButtonContainer: { + marginTop: 20, // Ajoute un espacement au-dessus du bouton Play + width: '80%', // S'assure que le bouton prend toute la largeur disponible + alignItems: 'center', // Centre le bouton horizontalement + }, + correctAnswer: { + ...ButtonsStyles.answerButton, + borderColor: 'green', + borderWidth: 2, + }, + incorrectAnswer: { + ...ButtonsStyles.answerButton, + borderColor: 'red', + borderWidth: 2, + }, + loadingAnswer: { + ...ButtonsStyles.answerButton, + backgroundColor: '#4F6367', + borderWidth: 2, + }, + selectedAnswer: { + ...ButtonsStyles.answerButton, + borderColor: 'grey', + borderWidth: 2, + }, + answerText: { + color: 'black', + textAlign: 'center', + }, + correctText: { + fontWeight: 'bold', + color: 'green', + }, + incorrectText: { + fontWeight: 'bold', + color: 'red', + }, + loadingText: { + color: 'black', + textAlign: 'center', + }, + answerButton: { + backgroundColor: "#F3F3F3", + height: '75%', + alignItems: 'center', + width: '80%', + marginVertical: '3%', + justifyContent: "center", + shadowColor: "#000", + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.25, + shadowRadius: 3.5, + elevation: 5, + }, + buttonListContainer: { + maxHeight: '80%', + width: '100%', + }, + buttonListContentContainer: { + display: 'flex', + justifyContent: 'flex-start', + alignItems: 'center' + } +}); + diff --git a/screens/PlayingQuiz/PlayingQuizHeader.tsx b/screens/PlayingQuiz/PlayingQuizHeader.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c03c6d08648ab9def1de43428bfb1d4a41d6605b --- /dev/null +++ b/screens/PlayingQuiz/PlayingQuizHeader.tsx @@ -0,0 +1,97 @@ +import { View, StyleSheet, Text } from "react-native"; +import { TextsStyles } from "../../styles/TextsStyles"; +import {Quiz} from "../../models/Quiz"; +import {useTranslation} from "react-i18next"; +import DefaultButton from "../../components/buttons/DefaultButton"; +import GoHomeButton from "../../components/PlayingQuiz/GoHomeButton"; +import {NavigationProp} from "@react-navigation/native"; +import ConfirmModal from "../../components/PlayingQuiz/ComfirmModal"; +import {useState} from "react"; +import {QuizInformations} from "../../models/QuizInformations"; +import {Question} from "../../models/Question"; + +interface Props { + quizInformations?: QuizInformations; + runId?: string; + actualQuestion?: Question; + score: number; + navigation: NavigationProp<any> +} + +export default function PlayingQuizHeader({quizInformations, runId, actualQuestion, score, navigation}: Props) { + const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false); + const {t} = useTranslation(); + + const handleConfirmModalConfirm = () => { + navigation.reset({ + index: 0, + routes: [ + { + name: "TabNavigator", + }, + ] + }); + } + + return ( + <View style={styles.container}> + <View style={styles.header}> + <GoHomeButton navigation={navigation} onPress={setIsConfirmModalVisible}/> + <Text style={styles.codeQuizText}>ID QUIZZ : {runId}</Text> + </View> + <View style={styles.questionAndScoreContainer}> + <View style={styles.InformationsContainer}> + <Text style={TextsStyles.titleText}>{t("app.screens.question.question")}</Text> + <Text style={TextsStyles.titleText}>{actualQuestion ? actualQuestion.order + 1 :"?"}/{quizInformations ? quizInformations.questionCount : "?"}</Text> + </View> + <View style={styles.InformationsContainer}> + <Text style={TextsStyles.titleText}>{t("app.screens.question.score")}</Text> + <Text style={TextsStyles.titleText}>{score}/{quizInformations ? quizInformations.questionCount : "?"}</Text> + </View> + </View> + <View style={styles.QuizQuestionContainer}> + <Text style={TextsStyles.subtitleText}>{actualQuestion ? actualQuestion.text : "Loading..."}</Text> + </View> + <ConfirmModal visible={isConfirmModalVisible} onClose={()=>setIsConfirmModalVisible(false)} onConfirm={handleConfirmModalConfirm}/> + + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + marginHorizontal: '5%', + }, + questionAndScoreContainer: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-around', + alignItems: 'center', + marginVertical: '2%', + }, + InformationsContainer: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + alignItems: 'center', + gap: '5%', + }, + QuizNumContainer: { + }, + QuizQuestionContainer: { + marginVertical: "2.5%", + }, + infoQuizContainer: { + marginBottom: '5%', + }, + codeQuizText: { + fontSize: 18, + color: '#000000', + }, + header: { + display: "flex", + flexDirection: "row", + justifyContent: "flex-start", + gap: '5%', + } +}); \ No newline at end of file diff --git a/screens/Profil/Connection/Connection.tsx b/screens/Profil/Connection/Connection.tsx new file mode 100644 index 0000000000000000000000000000000000000000..34e5023ac2687f3f774f2b6cff98ed649c212375 --- /dev/null +++ b/screens/Profil/Connection/Connection.tsx @@ -0,0 +1,72 @@ +import {Keyboard, StyleSheet, Text, TouchableOpacity, TouchableWithoutFeedback, View} from "react-native"; +import ProfilSelectMode from "../ProfilSelectMode"; +import React, {useState} from "react"; +import {ProfilSelectModeType} from "../../../models/SelectModeType"; +import {NavigationProp} from "@react-navigation/native"; +import ConnectionLogin from "./ConnectionLogin"; +import ConnectionSignup from "./ConnectionSignup"; + +interface Props { + title: string; + navigation: NavigationProp<any>; +} + +export default function Connection({title, navigation}: Props) { + const [mode, setMode] = useState<ProfilSelectModeType>("login"); + + return ( + <TouchableWithoutFeedback onPress={Keyboard.dismiss}> + <View style={styles.container}> + <Text style={styles.title}>{title}</Text> + <View style={styles.containerModal}> + <ProfilSelectMode mode={mode} setMode={setMode} /> + {mode === "login" ? ( + <ConnectionLogin navigation={navigation} /> + ) : ( + <ConnectionSignup navigation={navigation} /> + )} + </View> + </View> + </TouchableWithoutFeedback> + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: "center", + alignItems: "center", + height: "100%", + width: "100%", + }, + title: { + fontSize: 40, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + alignSelf: "center", // Centre uniquement le titre + }, + backgroundShadow: { + height: "100%", + width: "100%", + backgroundColor: "#000000", + opacity: 0.55, + position: "absolute", + }, + containerModal: { + height: 600, + width: "90%", + backgroundColor: "#D9D9D9", + borderRadius: 40, + padding: '7%', + }, + closeButton: { + position: "absolute", + top: '1%', + right: '1%', + zIndex: 1, + backgroundColor: "white", + borderRadius: 10, + margin: '5%', + }, +}); \ No newline at end of file diff --git a/screens/Profil/Connection/ConnectionLogin.tsx b/screens/Profil/Connection/ConnectionLogin.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0dcd82493f9d1224c74afc5da444637a4f69ae1e --- /dev/null +++ b/screens/Profil/Connection/ConnectionLogin.tsx @@ -0,0 +1,84 @@ +import { TextInput, View, StyleSheet, Text } from "react-native"; +import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz"; +import React, { useState } from "react"; +import {useUserService} from "../../../services/UserService"; +import HttpError from "../../../services/HttpError"; +import {NavigationProp} from "@react-navigation/native"; +import BlueButton from "../../../components/buttons/BlueButton"; + +interface Props { + navigation: NavigationProp<any>; +} +export default function ConnectionLogin({navigation}: Props) { + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState<string | null>(null); + const { loginUser } = useUserService(); + + const handleSubmitPressed = async () => { + if (email === "" || password === "") { + setError("Please fill in all fields"); + return; + } + const login = await loginUser(email, password); + if(login instanceof HttpError){ + setError(login.message); + return; + } + setError(null); + navigation.reset({ + routes: [{name: "TabNavigator"}], + }); + }; + + return ( + <View style={styles.container}> + {error && <Text style={styles.errorText}>{error}</Text>} + <View style={styles.containerForm}> + <InputPlayQuiz placeholder="EMAIL..." setText={setEmail} noTitle={true} /> + <InputPlayQuiz placeholder="PASSWORD..." setText={setPassword} noTitle={true} isSecure={true}/> + </View> + <BlueButton text="LOGIN" onPress={handleSubmitPressed} buttonStyle={styles.SubmitButton} isDisabled={false}/> + </View> + ); +} + +const styles = StyleSheet.create({ + containerForm: { + height: 'auto', + width: '100%', + display: 'flex', + flexDirection: 'column', + justifyContent: 'flex-start', + rowGap: '7%', + marginTop: "3%", + marginBottom: "auto", // Espacement entre le texte d'erreur et les inputs + }, + container:{ + height: 475, + paddingTop: '5%', + display: 'flex', + justifyContent: 'space-between' + }, + textInput: { + height: '20%', + width: '100%', + backgroundColor: '#FFFFFF', + borderWidth: 4, + borderColor: '#1fa9ff', + borderRadius: 10, + color: '#DFDFDF', + fontWeight: 'bold', + }, + SubmitButton: { + height: '15%', + width: '100%', + backgroundColor: '#2b73fe', + borderRadius: 10, + }, + errorText: { + color: 'red', + fontSize: 16, + textAlign: 'center', // Centrer le message d'erreur + }, +}); diff --git a/screens/Profil/Connection/ConnectionSignup.tsx b/screens/Profil/Connection/ConnectionSignup.tsx new file mode 100644 index 0000000000000000000000000000000000000000..542012f28b24c0760ce4579e6c79f961dd0c06b1 --- /dev/null +++ b/screens/Profil/Connection/ConnectionSignup.tsx @@ -0,0 +1,103 @@ +import {TextInput, View, StyleSheet, Text} from "react-native"; +import DefaultButton from "../../../components/buttons/DefaultButton"; +import InputPlayQuiz from "../../../components/PlayQuiz/InputPlayQuiz"; +import React, {useState} from "react"; +import {useUserService} from "../../../services/UserService"; +import HttpError from "../../../services/HttpError"; +import {NavigationProp} from "@react-navigation/native"; +import BlueButton from "../../../components/buttons/BlueButton"; + +interface Props { + navigation: NavigationProp<any>; +} +export default function ConnectionSignup({navigation}: Props) { + + const [email, setEmail] = useState(""); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [repeatPassword, setRepeatPassword] = useState(""); + const [error, setError] = useState<string | null>(null); + const { registerUser } = useUserService(); + + const handleSubmitPressed = async () => { + if (email === "" || username === "" || password === "" || repeatPassword === "") { + setError("Please fill in all fields"); + return; + } + if(password.length < 8){ + setError("Password must be at least 8 characters long"); + return; + } + if(password !== repeatPassword){ + setError("Passwords do not match"); + return; + } + const register = await registerUser(username, password, email); + if(register instanceof HttpError){ + setError(register.message); + return; + } + setError(null); + navigation.reset({ + routes: [{name: "TabNavigator"}], + }); + } + + return ( + <View style={styles.container}> + {error && <Text style={styles.errorText}>{error}</Text>} + <View style={styles.containerForm}> + <InputPlayQuiz placeholder="USERNAME..." setText={setUsername} noTitle={true}/> + <InputPlayQuiz placeholder="EMAIL..." setText={setEmail} noTitle={true}/> + <InputPlayQuiz placeholder="PASSWORD..." setText={setPassword} noTitle={true} isSecure={true}/> + <InputPlayQuiz placeholder="REPEAT PASSWORD..." setText={setRepeatPassword} noTitle={true} isSecure={true}/> + </View> + <BlueButton text="SIGNUP" onPress={handleSubmitPressed} buttonStyle={styles.SubmitButton} isDisabled={false}/> + </View> + ) +} + +const styles = StyleSheet.create({ + containerForm: { + height: 'auto', + width: '100%', + display: 'flex', + flexDirection: 'column', + justifyContent: 'flex-start', + rowGap: '5%', + marginTop: "3%", + }, + container:{ + height: 475, + paddingTop: '5%', + display: 'flex', + justifyContent: 'space-between' + }, + textInput: { + height: '20%', + width: '100%', + backgroundColor: '#FFFFFF', + borderWidth: 4, + borderColor: '#1fa9ff', + borderRadius: 10, + color: '#DFDFDF', + fontWeight: 'bold' + }, + SubmitButton: { + height: '15%', + width: '100%', + backgroundColor: '#2b73fe', + borderRadius: 10, + }, + SubmitText: { + fontSize: 20, + fontWeight: 'bold', + color: '#FFFFFF', + }, + errorText: { + color: 'red', + fontSize: 16, + marginBottom: 10, // Espacement entre le texte d'erreur et les inputs + textAlign: 'center', // Centrer le message d'erreur + }, +}); \ No newline at end of file diff --git a/screens/Profil/Profil.tsx b/screens/Profil/Profil.tsx new file mode 100644 index 0000000000000000000000000000000000000000..87201d9a3f7e9a710d405cf8142fa7d8215a7385 --- /dev/null +++ b/screens/Profil/Profil.tsx @@ -0,0 +1,29 @@ +import { View, StyleSheet } from "react-native"; +import TemplateMenu from "../../templates/TemplateMenu"; +import { NavigationProp } from "@react-navigation/native"; +import ProfilChild from "./ProfilChild"; + +interface Props { + navigation: NavigationProp<any>; +} + +export default function Profil({navigation}: Props) { + return ( + <View style={styles.containerGlobal}> + <TemplateMenu navigation={navigation} headerNavigation={false} buttonGoBack> + <View> + <ProfilChild navigation={navigation}/> + </View> + </TemplateMenu> + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + flexDirection: 'column', + }, +}); \ No newline at end of file diff --git a/screens/Profil/ProfilChild.tsx b/screens/Profil/ProfilChild.tsx new file mode 100644 index 0000000000000000000000000000000000000000..bb601bf40937aeb53835e4b2c7bbff197d431d68 --- /dev/null +++ b/screens/Profil/ProfilChild.tsx @@ -0,0 +1,138 @@ +import { NavigationProp } from "@react-navigation/native"; +import { View, StyleSheet, Image, Text, TouchableOpacity } from "react-native"; +import React, { useEffect, useState } from "react"; +import { ProfilSelectModeType } from "../../models/SelectModeType"; +import { useUserService } from "../../services/UserService"; +import HttpError from "../../services/HttpError"; +import Icon from "react-native-vector-icons/MaterialIcons"; +import {User, UserConnectionState} from "../../models/User"; +import StatsOfUsers from "../../components/Profil/StatsOfUsers"; +import LoadingIndicator from "../../components/loading/LoadingIndicator"; +import Connection from "./Connection/Connection"; + +interface Props { + navigation: NavigationProp<any>; +} + + + +export default function ProfilChild({ navigation }: Props) { + const [isLogged, setIsLogged] = useState(false); + const [modalVisible, setModalVisible] = useState(false); + const [mode, setMode] = useState<ProfilSelectModeType>("login"); + const [user, setUser] = useState<User | undefined>(undefined); + const [userConnectionState, setUserConnectionState] = useState(UserConnectionState.LOADING); + const { getInformationsUser, logoutUser } = useUserService(); + + + const getUser = async () => { + setUserConnectionState(UserConnectionState.LOADING); + const user = await getInformationsUser(); + if(user instanceof HttpError){ + setUser(undefined); + setUserConnectionState(UserConnectionState.NOT_CONNECTED); + return; + } + setUserConnectionState(UserConnectionState.CONNECTED); + setUser(user); + } + + useEffect(() => { + getUser(); + }, []); + + // Pour s'adapter quand l'état de connexion change + useEffect(() => { + getUser(); + }, [isLogged]); + + const handleLogout = async () => { + const result = await logoutUser(); + if (!(result instanceof HttpError)) { + setUser(undefined); // Réinitialise l'utilisateur après la déconnexion + } + navigation.reset({ + routes: [{name: "TabNavigator"}], + }); + }; + + return ( + <View style={styles.containerGlobal}> + {userConnectionState === UserConnectionState.LOADING && ( + <LoadingIndicator/> + )} + {userConnectionState === UserConnectionState.CONNECTED && ( + <> + <View style={styles.containerPlayerInfos}> + <Image source={require('../../assets/TitleApp.png')} style={styles.titleImage} /> + <Image source={require('../../assets/ProfilBaseImage.png')} style={styles.profilImage} /> + <Text style={styles.pseudoText}>{user ? user.username : "?"}</Text> + </View> + <StatsOfUsers user={user}/> + <TouchableOpacity style={styles.logoutButton} onPress={handleLogout}> + <Icon name="logout" size={40} color="#FF0000" /> + </TouchableOpacity> + </> + )} + {userConnectionState === UserConnectionState.NOT_CONNECTED && ( + <Connection title={"Profil"} navigation={navigation} /> + )} + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: "flex", + width: "100%", + height: "100%", + justifyContent: "flex-start", + alignItems: "center", + }, + containerPlayerInfos: { + width: "100%", + display: "flex", + alignItems: "center", + }, + title: { + fontSize: 40, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + alignSelf: "center", // Centre uniquement le titre + }, + titleImage: { + width: "45%", + resizeMode: "contain", + }, + profilImage: { + width: "45%", + aspectRatio: 1, + }, + pseudoText: { + fontSize: 35, + fontWeight: "bold", + color: "#00B3F4", + }, + containerPlayerStats: { + width: "100%", + padding: "5%", + }, + statsText: { + fontSize: 17, + fontWeight: "bold", + }, + logoutButton: { + position: "absolute", + bottom: 20, + right: 20, + backgroundColor: "#FFF", + borderRadius: 50, + padding: 10, + elevation: 5, // Ombre pour Android + shadowColor: "#000", // Ombre pour iOS + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.2, + shadowRadius: 2, + }, +}); diff --git a/screens/Profil/ProfilSelectMode.tsx b/screens/Profil/ProfilSelectMode.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0abae694d28da789c7a72b5196adebe7a4743f66 --- /dev/null +++ b/screens/Profil/ProfilSelectMode.tsx @@ -0,0 +1,74 @@ +import { View, Text, StyleSheet, TouchableOpacity } from "react-native"; +import { ProfilSelectModeType } from "../../models/SelectModeType"; + +interface Props { + mode: ProfilSelectModeType; + setMode: (mode: ProfilSelectModeType) => void; +} + +export default function ProfilSelectMode({ mode, setMode }: Props) { + return ( + <View style={styles.container}> + <View style={styles.buttonContainer}> + <TouchableOpacity onPress={() => setMode("login")} style={{marginLeft: '10%'}}> + <Text style={[styles.text, mode === "login" && styles.activeText]}>LOGIN</Text> + </TouchableOpacity> + <View style={[styles.bar, mode === "login" ? styles.activeBar : styles.inactiveBar]} /> + </View> + + <View style={styles.buttonContainer}> + <TouchableOpacity onPress={() => setMode("signup")} style={{marginRight: '10%'}}> + <Text style={[styles.text, mode === "signup" && styles.activeText]}>SIGNUP</Text> + </TouchableOpacity> + <View style={[styles.bar, mode === "signup" ? styles.activeBar : styles.inactiveBar]} /> + </View> + + </View> + ); +} + +const styles = StyleSheet.create({ + container: { + display: 'flex', + width: '100%', + height: '15%', + flexDirection: 'row', + backgroundColor: '#f3f3f3', + borderRadius: 10, + justifyContent: 'space-around', + alignItems: 'center', + // Ombre pour Android + elevation: 5, + // Ombre pour iOS + shadowColor: '#000', + shadowOffset: { width: 0, height: 4 }, // Décalage de l'ombre en bas + shadowOpacity: 0.25, // Opacité de l'ombre + shadowRadius: 3.84, // Flou de l'ombre + }, + buttonContainer: { + display: 'flex', + flexDirection: 'column', + width: '40%', + alignItems: 'center', + gap: "5%", + }, + text: { + fontSize: 25, + color: '#bebebe', + }, + activeText: { + color: '#2b73fe', + }, + bar: { + width: '100%', + height: '4%', + marginTop: '4%', + borderRadius: 10, + }, + activeBar: { + backgroundColor: '#2b73fe', // Couleur pour le bouton actif + }, + inactiveBar: { + backgroundColor: '#bebebe', // Couleur grise pour les boutons inactifs + }, +}); diff --git a/screens/Question/Question.tsx b/screens/Question/Question.tsx deleted file mode 100644 index 17653978e0fe54530f5b2b64a9443f4de698b6eb..0000000000000000000000000000000000000000 --- a/screens/Question/Question.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import TemplateScreen from "../../templates/TemplateScreen"; -import QuestionBody from "./QuestionBody"; -import QuestionHeader from "./QuestionHeader"; -import {useEffect, useState} from "react"; -import {transformToQuizModel} from "../../helper/QuizHelper"; -import QuizModel from "../../model/QuizModel"; - -const optionsTheme = [ - "General Knowledge", - "Entertainment: Books", - "Entertainment: Film", - "Entertainment: Music", - "Entertainment: Musicals & Theatres", - "Entertainment: Television", - "Entertainment: Video Games", - "Entertainment: Board Games", - "Science & Nature", - "Science: Computers", - "Science: Mathematics", - "Mythology", - "Sports", - "Geography"] - -interface Props { - route: any; - navigation: any; -} - -export default function Question({route, navigation}:Props) { - const getIdOfCategory = (category: string) => { - for (let i = 0; i < optionsTheme.length; i++) { - if (optionsTheme[i] === category) { - return i+9; - } - } - } - - const [isAlreadyPlayed, setIsAlreadyPlayed] = useState(false); - const [quiz, setQuiz] = useState<QuizModel>(); - const nbQuestions = "10"; - const difficulty = "easy"; - const theme = "General Knowledge"; - - const { - nbQuestionParam = "10", - difficultyParam = "easy", - themeParam = "General Knowledge", - quiz: quizFromParams, // Quiz passé via la navigation - } = route.params || {}; - const nbQuestionsToDisplay = nbQuestionParam ? nbQuestionParam : nbQuestions; - const difficultyToDisplay = difficultyParam ? difficultyParam : difficulty; - const themeToDisplay = themeParam ? getIdOfCategory(themeParam) : getIdOfCategory(theme); - - - - - const fetchQuestion = async () => { - try { - const response = await fetch(`https://opentdb.com/api.php?amount=${nbQuestionsToDisplay}&difficulty=${difficultyToDisplay}&category=${themeToDisplay}`); - const data = await response.json(); - const quiz = transformToQuizModel(data); - setQuiz(quiz); - } catch (error) { - console.error(error); - } - }; - - useEffect(() => { - if (quizFromParams) { - setTimeout(() => { - setQuiz(quizFromParams); - }, 0); - } else { - fetchQuestion(); - } - }, [quizFromParams]); - - - const handleAnswer = async (selectedAnswerIndex: number) => { - if (!quiz) return; - - const currentQuestion = quiz.questions[quiz.nbActualQuestion-1]; - const correctAnswer = currentQuestion.correctAnswer; - const selectedAnswer = currentQuestion.answer[selectedAnswerIndex]; - - // Vérifier si la réponse est correcte - if (selectedAnswer === correctAnswer) { - setQuiz((prevQuiz) => { - if (prevQuiz) { - return { ...prevQuiz, score: prevQuiz.score + 1 }; - } - return prevQuiz; - }); - } - - // Attendre 2 secondes avant de passer à la question suivante - await new Promise((resolve) => setTimeout(resolve, 2000)); - - // Passer à la question suivante - setQuiz((prevQuiz) => { - if (prevQuiz && prevQuiz.nbActualQuestion < prevQuiz.nbQuestions) { - setIsAlreadyPlayed(false); - return { ...prevQuiz, nbActualQuestion: prevQuiz.nbActualQuestion + 1 }; - } - navigation.navigate("FinQuiz", { score: prevQuiz?.score, quiz: quiz }); - return prevQuiz; // Fin du quiz si toutes les questions ont été posées - }); - }; - - return ( - <TemplateScreen - childrenTop={<QuestionHeader quiz={quiz} ></QuestionHeader>} - childrenBot={<QuestionBody quiz={quiz} onAnswerSelected={handleAnswer} isAlreadyPlayed={isAlreadyPlayed} setIsAlreadyPlayed={setIsAlreadyPlayed}></QuestionBody>} - /> - ); -} \ No newline at end of file diff --git a/screens/Question/QuestionBody.tsx b/screens/Question/QuestionBody.tsx deleted file mode 100644 index 26c3c2fac526e23ba7d2fedd65646a965c80cf35..0000000000000000000000000000000000000000 --- a/screens/Question/QuestionBody.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { View, StyleSheet } from "react-native"; -import DefaultButton from "../../components/DefaultButton"; -import { ButtonsStyles } from "../../styles/ButtonsStyles"; -import { TextsStyles } from "../../styles/TextsStyles"; -import QuizModel from "../../model/QuizModel"; -import { useState, useEffect } from "react"; -import { setEnabled } from "react-native/Libraries/Performance/Systrace"; - -interface Props { - quiz?: QuizModel; - onAnswerSelected: (index: number) => void; - isAlreadyPlayed: boolean; - setIsAlreadyPlayed: (isAlreadyPlayed: boolean) => void; -} - -export default function QuestionBody({ quiz, onAnswerSelected, isAlreadyPlayed, setIsAlreadyPlayed }: Props) { - const [selectedAnswerIndex, setSelectedAnswerIndex] = useState<number | null>(null); - const [isCorrect, setIsCorrect] = useState<boolean | null>(null); - - useEffect(() => { - if (quiz) { - setSelectedAnswerIndex(null); - setIsCorrect(null); - } - }, [quiz?.nbActualQuestion]); - - if (!quiz) return null; - - const currentQuestion = quiz.questions[quiz.nbActualQuestion - 1]; - - const handleAnswerPress = (index: number) => { - if (!isAlreadyPlayed) { - const isAnswerCorrect = currentQuestion.correctAnswer === currentQuestion.answer[index]; - setSelectedAnswerIndex(index); - setIsCorrect(isAnswerCorrect); - - onAnswerSelected(index); - - setIsAlreadyPlayed(true); - } - }; - - const getButtonStyle = (index: number) => { - if (selectedAnswerIndex === null) return ButtonsStyles.answerButton; - - if (index === selectedAnswerIndex) { - return isCorrect ? styles.correctAnswer : styles.incorrectAnswer; - } - if (currentQuestion.correctAnswer === currentQuestion.answer[index]) { - return styles.correctAnswer; - } - return ButtonsStyles.answerButton; - }; - - const getTextStyle = (index: number) => { - if (selectedAnswerIndex === null) return TextsStyles.defaultText; - - if (index === selectedAnswerIndex) { - return isCorrect ? styles.correctText : styles.incorrectText; - } - if (currentQuestion.correctAnswer === currentQuestion.answer[index]) { - return styles.correctText; - } - return TextsStyles.defaultText; - }; - - return ( - <View style={styles.buttonContainer}> - {currentQuestion.answer.map((answer, index) => ( - <DefaultButton - key={index} - text={answer} - handleButtonPressed={() => handleAnswerPress(index)} - buttonStyle={getButtonStyle(index)} - buttonText={getTextStyle(index)} // Applique le style de texte dynamique - /> - ))} - </View> - ); -} - -const styles = StyleSheet.create({ - buttonContainer: { - display: 'flex', - flex: 1, - alignItems: 'center', - justifyContent: 'flex-start', - width: '100%', - marginVertical: '10%', - }, - correctAnswer: { - ...ButtonsStyles.answerButton, - borderColor: 'green', - borderWidth: 2, - }, - incorrectAnswer: { - ...ButtonsStyles.answerButton, - borderColor: 'red', - borderWidth: 2, - }, - correctText: { - fontWeight: 'bold', - color: 'green', - }, - incorrectText: { - fontWeight: 'bold', - color: 'red', - }, -}); diff --git a/screens/Question/QuestionHeader.tsx b/screens/Question/QuestionHeader.tsx deleted file mode 100644 index a06798d4e456a00acce6b622eb2b856fcfdd88f3..0000000000000000000000000000000000000000 --- a/screens/Question/QuestionHeader.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { View, StyleSheet, Text } from "react-native"; -import { TextsStyles } from "../../styles/TextsStyles"; -import QuizModel from "../../model/QuizModel"; - -interface Props { - quiz?: QuizModel; -} - -export default function QuestionHeader({quiz}: Props) { - return ( - <View style={styles.container}> - <View style={styles.infoQuizContainer}> - <Text style={TextsStyles.infoQuizText}>SCORE : {quiz ? quiz.score : 0}</Text> - <Text style={TextsStyles.infoQuizText}>CATEGORY : {quiz ? quiz.category : "?"}</Text> - </View> - <View style={styles.QuizNumContainer}> - <Text style={TextsStyles.titleText}>QUESTION {quiz ? quiz.nbActualQuestion : "?"}/{quiz ? quiz.nbQuestions : "?"}</Text> - </View> - <View style={styles.QuizQuestionContainer}> - <Text style={TextsStyles.subtitleText}>{quiz ? quiz.questions[quiz.nbActualQuestion - 1].question : "Loading..."}</Text> - </View> - </View> - ); -} - -const styles = StyleSheet.create({ - container: { - marginVertical: "10%", - marginHorizontal: "5%", - }, - QuizNumContainer: { - marginVertical: "2.5%", - }, - QuizQuestionContainer: { - marginVertical: "2.5%", - }, - infoQuizContainer: { - marginBottom: '5%', - }, -}); \ No newline at end of file diff --git a/services/HttpError.ts b/services/HttpError.ts new file mode 100644 index 0000000000000000000000000000000000000000..82fd80fe26237035f4aefcdf35e5ae2033de997c --- /dev/null +++ b/services/HttpError.ts @@ -0,0 +1,14 @@ +export default class HttpError extends Error { + statusCode: number; + + constructor(statusCode: number, message: string) { + super(message); // Appelle le constructeur de Error + this.statusCode = statusCode; + this.name = "HttpError"; // Nom de l'erreur + } + + // Méthode pour vérifier si une erreur est un HttpError + static isHttpError(error: unknown): error is HttpError { + return error instanceof HttpError; + } +} diff --git a/services/MultiService.ts b/services/MultiService.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0de634c0a7254082968608c5a25bfe4fa12f067 --- /dev/null +++ b/services/MultiService.ts @@ -0,0 +1,36 @@ +import axios from "axios"; +import {QuestionResponse} from "../models/Response/QuestionResponse"; +import HttpError from "./HttpError"; + +export const useMultiService = () => { + const url = "https://klebert-host.com:33037" + + const createParty = async (quizId: string) : Promise<string | HttpError> => { + console.log("Create party with ID :", quizId); + console.log(url+"/party"); + const requestBody = { + quizId: quizId, + }; + + try { + const response = await axios.post(`${url}/party`, requestBody, { + withCredentials: true, + }); + console.log("Response data:", response.data.id); + return response.data.id; + } catch (error: any) { + console.log("Error while create party:", error); + + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + return { + createParty: createParty, + } + +} \ No newline at end of file diff --git a/services/QuizService.ts b/services/QuizService.ts new file mode 100644 index 0000000000000000000000000000000000000000..f742340858a31006ceb2f82de8d951c8f8dc4b20 --- /dev/null +++ b/services/QuizService.ts @@ -0,0 +1,346 @@ +import HttpError from "./HttpError"; +import {QuizCommunityResponse} from "../models/Quiz"; +import axios from "axios"; +import {Answer} from "../models/Answer"; +import {Question} from "../models/Question"; +import {AnswerResponse} from "../models/Response/AnswerResponse"; +import {QuizInformations} from "../models/QuizInformations"; +import {QuestionResponse} from "../models/Response/QuestionResponse"; +import {QuizGenerateAnswer} from "../models/QuizGenerateAnswer"; +import {RunInformations} from "../models/RunInformations"; +import {AllRunsResponse} from "../models/Response/AllRunsResponse"; + +export const useQuizService = () => { + const url = "https://klebert-host.com:33037"; // Remplace par l'URL de ton endpoint API + + const generateQuiz = async (amount: number, category: number, difficulty: string) : Promise<QuizGenerateAnswer | HttpError> => { + const requestBody = { + amount, + category, + difficulty: difficulty.toLowerCase(), + }; + + try { + const response = await axios.post<QuizGenerateAnswer>(`${url}/quiz/generate`, requestBody, { + headers: { + "Content-Type": "application/json", + }, + }); + const runId = response.data.id; + return {id: runId, quizId: response.data.quizId}; + } catch (error: any) { + console.log("Error while generating quiz:", error); + + if (error.response) { + // Gestion des erreurs HTTP + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + // Gestion des erreurs réseau ou autres + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + const getActualQuestionOfAQuiz = async (quizId: string): Promise<Question | HttpError> => { + const requestBody = { + id: quizId, + }; + + try { + const response = await axios.post<QuestionResponse>(`${url}/run/question`, requestBody, { + headers: { + "Content-Type": "application/json", + }, + }); + + return response.data.question; + } catch (error: any) { + console.log("Error while remaining quiz:", error); + + if (error.response) { + // Gestion des erreurs HTTP + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + // Gestion des erreurs réseau ou autres + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + const getQuizInformations = async (quizId: string): Promise<QuizInformations | HttpError> => { + + try { + const response = await axios.get<QuizInformations>(`${url}/quiz/info/`+quizId, { + headers: { + "Content-Type": "application/json", + }, + }); + return response.data; + } catch (error: any) { + console.log("Error while getQuizInformations quiz:", error); + + if (error.response) { + // Gestion des erreurs HTTP + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + // Gestion des erreurs réseau ou autres + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + const answerQuestion = async (quizId: string, questionId: number, answerId: number): Promise<AnswerResponse | HttpError> => { + const requestBody = { + id: quizId, + questionID: questionId, + answerID: answerId, + }; + + try { + const response = await axios.post<AnswerResponse>(`${url}/run/answer`, requestBody, { + headers: { + "Content-Type": "application/json", + }, + }); + + return response.data; + } catch (error: any) { + console.log("Error while remaining quiz:", error); + + if (error.response) { + // Gestion des erreurs HTTP + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + // Gestion des erreurs réseau ou autres + return new HttpError(500, "Unexpected error: " + error.message); + } + } + }; + + // const remainingQuiz = async (id: string): Promise<Quiz | HttpError> => { + // const requestBody = { + // id, + // }; + // + // try { + // const response = await axios.post<Quiz>(`${url}/quiz/remaining`, requestBody, { + // headers: { + // "Content-Type": "application/json", + // }, + // }); + // + // // Récupération des données retournées par l'API + // return shuffleAnswersOfQuiz(response.data); + // } catch (error: any) { + // console.log("Error while remaining quiz:", error); + // + // if (error.response) { + // // Gestion des erreurs HTTP + // return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + // } else { + // // Gestion des erreurs réseau ou autres + // return new HttpError(500, "Unexpected error: " + error.message); + // } + // } + // }; + + const getAnswerQuiz = async ( + codeQuiz: string, + questionID: number, + answerID: number + ): Promise<Answer[] | HttpError> => { + try { + const requestBody = { + id: codeQuiz, + questionID: questionID, + answerID: answerID, + }; + + const response = await axios.post(`${url}/quiz/answer`, requestBody, { + headers: { + "Content-Type": "application/json", + }, + }); + + const answers: Answer[] = response.data.answers.map((answer: any) => ({ + id: answer.id, + text: answer.text, + isCorrect: answer.isCorrect, + questionId: answer.questionId, + })); + + return answers; + } catch (error: any) { + console.log("Error while fetching answers:", error); + + if (error.response) { + // Gestion des erreurs HTTP + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + // Gestion des erreurs réseau ou autres + return new HttpError(500, "Unexpected error: " + error.message); + } + } + }; + + const getRandomQuiz = async (): Promise<QuizGenerateAnswer | HttpError> => { + const categories = await getCategories(); + const difficulties = ['easy', 'medium', 'hard']; + const requestBody = { + amount: 10, + category: categories[Math.floor(Math.random() * categories.length)].id, + difficulty: difficulties[Math.floor(Math.random() * difficulties.length)], + }; + + try { + const response = await axios.post<QuizGenerateAnswer>(`${url}/quiz/generate`, requestBody, { + headers: { + "Content-Type": "application/json", + }, + }); + const runId = response.data.id; + // Récupération du run ID + return {id: runId, quizId: response.data.quizId}; + } catch (error: any) { + console.log("Error while generating random quiz:", error); + + if (error.response) { + // Gestion des erreurs HTTP + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + // Gestion des erreurs réseau ou autres + return new HttpError(500, "Unexpected error: " + error.message); + } + } + }; + + const getCommunityQuiz = async (skip: number, take: number) => { + try { + const response = await axios.get<QuizCommunityResponse>(`${url}/quiz/paginated?skip=${skip}&take=${take}`, { + withCredentials: true, // Inclut les cookies pour une session authentifiée + }); + + return response.data.quizzes; + } catch (error: any) { + + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + }; + + const restartQuiz = async (id: string) : Promise<boolean | HttpError> => { + try { + const requestBody = { + id + }; + + await axios.patch(`${url}/quiz/restart`, requestBody, { + withCredentials: true, + }); + + return true; + } catch (error: any) { + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + const getCategories = async () => { + try { + const response = await axios.get(`${url}/quiz/categories`, { + headers: { + "Content-Type": "application/json", + }, + }); + return response.data; + } catch (error: any) { + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + }; + + const getRunsInfo = async (id: string): Promise<RunInformations | HttpError> => { + try { + const response = await axios.get<RunInformations>(`${url}/run/info/`+id, { + headers: { + "Content-Type": "application/json", + }, + }); + return response.data; + } catch (error: any) { + console.log("Error while getQuizInformations quiz:", error); + + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + const getAllRuns = async (): Promise<AllRunsResponse | HttpError> => { + try { + const response = await axios.get<AllRunsResponse>(`${url}/run/userRuns`, { + headers: { + "Content-Type": "application/json", + }, + }); + + return response.data; + } catch (error: any) { + console.log("Error while getAllRuns:", error); + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + const createRun = async (quizId: string): Promise<string | HttpError> => { + try { + const response = await axios.post(`${url}/run/start`, { + quizId: quizId, + }, { + headers: { + "Content-Type": "application/json", + }, + }); + + return response.data.id; + } catch (error: any) { + console.log("Error while getQuizInformations quiz:", error); + + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + return { + generateQuiz: generateQuiz, + getAnswerQuiz: getAnswerQuiz, + // remainingQuiz: remainingQuiz, + getRandomQuiz: getRandomQuiz, + getCommunityQuiz: getCommunityQuiz, + restartQuiz: restartQuiz, + getCategories: getCategories, + answerQuestion: answerQuestion, + getActualQuestionOfAQuiz: getActualQuestionOfAQuiz, + getQuizInformations: getQuizInformations, + getRunsInfo: getRunsInfo, + getAllRuns: getAllRuns, + createRun: createRun, + } +} \ No newline at end of file diff --git a/services/UserService.ts b/services/UserService.ts new file mode 100644 index 0000000000000000000000000000000000000000..22675d434a9d311879d3cbdd854073d09c5f11bb --- /dev/null +++ b/services/UserService.ts @@ -0,0 +1,135 @@ +import HttpError from "./HttpError"; +import axios from "axios"; +import {transformToUserModel} from "../helper/UserHelper"; +import AsyncStorage from "@react-native-async-storage/async-storage"; +import useCookie from "../hooks/UseCookie"; +import {User} from "../models/User"; + +export const useUserService = () => { + const url = "https://klebert-host.com:33037"; + const { saveCookie, removeCookie } = useCookie('access_token'); + + + const loginUser = async (login: string, password: string): Promise<boolean | HttpError> => { + try { + const requestBody = { + login: login, + password: password, + }; + + const response =await axios.post(`${url}/auth/login`, requestBody, { + withCredentials: true, // Autorise Axios à inclure les cookies + }); + + const cookies = response.headers['set-cookie']; + if (cookies) { + const accessToken = cookies + .find(cookie => cookie.startsWith('access_token=')) + ?.split(';')[0] + ?.split('=')[1]; + + if (accessToken) { + saveCookie(accessToken); + } + } + + return true; + } catch (error: any) { + + if (error.response) { + // Si le mot de passe ou le login est incorrect + if (error.response.status === 401) { + return new HttpError(401, "Invalid login or password"); + } + + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + // Erreur réseau ou autre + return new HttpError(500, "Unexpected error: " + error.message); + } + } + }; + + const getInformationsUser = async (): Promise<User | HttpError> => { + try { + const response = await axios.get<User>(`${url}/user/me`, { + withCredentials: true, // Inclut les cookies dans la requête + }); + + return response.data; + } catch (error: any) { + if (error.response.status === 401) { + return new HttpError(401, "No user logged in"); + } + + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + }; + + const logoutUser = async (): Promise<boolean | HttpError> => { + try { + removeCookie(); + await axios.post(`${url}/auth/logout`, null, { + withCredentials: true, // Inclut les cookies dans la requête + }); + return true; + } catch (error: any) { + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message || "HTTP error"); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + } + + const registerUser = async ( + username: string, + password: string, + email: string + ): Promise<boolean | HttpError> => { + try { + const requestBody = { + username: username, + email: email, + password: password, + }; + + // Enregistrement de l'utilisateur + await axios.post(`${url}/user`, requestBody, { + withCredentials: true, + }); + + // Connexion après enregistrement + const loginResult = await loginUser(username, password); + + if (loginResult instanceof HttpError) { + return loginResult; // Retourne l'erreur de connexion si échec + } + + return true; // Succès + } catch (error: any) { + if(error.response.status === 400) { + return new HttpError(400, "User already exists"); + } + if (error.response) { + return new HttpError(error.response.status, error.response.data?.message); + } else { + return new HttpError(500, "Unexpected error: " + error.message); + } + } + }; + + + + + return { + loginUser: loginUser, + getInformationsUser: getInformationsUser, + logoutUser: logoutUser, + registerUser: registerUser + }; +} diff --git a/styles/ButtonsStyles.ts b/styles/ButtonsStyles.ts index 769f771bd0e17a544e1f01d34389d39d8c92e64e..679e720b75f7e36b6dce1b7ba21c2b23971d789d 100644 --- a/styles/ButtonsStyles.ts +++ b/styles/ButtonsStyles.ts @@ -1,15 +1,22 @@ import { StyleSheet } from "react-native"; export const ButtonsStyles = StyleSheet.create( { defaultButton: { - backgroundColor: "grey", + backgroundColor: "#45128C", padding: 10, alignItems: "center", + justifyContent: 'center', + borderRadius: 10, + }, + whiteButton: { + backgroundColor: "#45128C", + padding: 10, + alignItems: "center", + justifyContent: 'center', borderRadius: 10, - width: "100%", }, answerButton: { backgroundColor: "#F3F3F3", - height: '20%', + height: '75%', alignItems: 'center', width: '80%', marginVertical: '3%', diff --git a/styles/TextsStyles.ts b/styles/TextsStyles.ts index a6bdfb948ecbe5bb8451eccb167cbdaed17644d8..84e6ba3f23cff930d99054f4a364f3d716ad5f7c 100644 --- a/styles/TextsStyles.ts +++ b/styles/TextsStyles.ts @@ -2,18 +2,22 @@ import { StyleSheet } from "react-native"; export const TextsStyles = StyleSheet.create( { defaultText: { color: 'black', - fontSize: 20, + fontSize: 17, }, defaultButtonText: { color: "white", - fontSize: 20, + fontSize: 17, + }, + whiteButtonText: { + color: "white", + fontSize: 17, }, titleText: { fontSize: 24, fontWeight: "bold", }, subtitleText: { - fontSize: 24, + fontSize: 21, }, infoQuizText: { fontSize: 18, diff --git a/templates/TemplateDuo.tsx b/templates/TemplateDuo.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c347a2d41658b3bdf03fc5b9c313f700ca5dfe3f --- /dev/null +++ b/templates/TemplateDuo.tsx @@ -0,0 +1,47 @@ +import {ImageBackground, Text, View, StyleSheet, SafeAreaView} from "react-native"; + +interface Props{ + childrenHeader?: React.ReactNode + childrenBody?: React.ReactNode +} + +export default function TemplateDuo({childrenHeader, childrenBody}: Props) { + return ( + <View style={styles.container}> + <ImageBackground source={require('../assets/BackgroundQuestion.png')} style={styles.image}> + <SafeAreaView> + <View style={styles.containerHeader}> + {childrenHeader} + </View> + <View style={styles.containerBody}> + {childrenBody} + </View> + </SafeAreaView> + </ImageBackground> + </View> + ); +} + + +const styles = StyleSheet.create({ + container: { + display: 'flex', + width: '100%', + height: '100%', + }, + containerHeader: { + width: '100%', + height: '30%', + }, + containerBody: { + width: '100%', + height: '70%', + backgroundColor: '#FFFFFF', + borderTopLeftRadius: 46, + borderTopRightRadius: 46 + }, + image: { + height: '100%', + width: '100%', + } +}); \ No newline at end of file diff --git a/templates/TemplateMenu.tsx b/templates/TemplateMenu.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d58ffa21ac441543347847e5fe1517c16e1a8140 --- /dev/null +++ b/templates/TemplateMenu.tsx @@ -0,0 +1,47 @@ +import {ImageBackground, Text, View, StyleSheet, SafeAreaView} from "react-native"; +import HeaderNavigation from "../components/navigation/HeaderNavigation"; +import {NavigationProp} from "@react-navigation/native"; + +interface Props{ + children: React.ReactNode + navigation: NavigationProp<any>; + headerNavigation: boolean; + buttonGoBack: boolean +} + +/** + * TemplateMenu : Template du menu principal + * @param children - Contenu du menu + * @param navigation - Navigation + * @param headerNavigation - Si le menu est en haut de page + * @param buttonGoBack - boolean qui dit si le bouton de retour doit être affiché + */ +export default function TemplateMenu({children, navigation, headerNavigation, buttonGoBack}: Props) { + return ( + <View style={styles.container}> + + <ImageBackground source={require('../assets/MenuBackground.png')} style={styles.image}> + <SafeAreaView> + {headerNavigation && <HeaderNavigation navigation={navigation} buttonGoBack={buttonGoBack}/>} + <View style={styles.container}> + {children} + </View> + </SafeAreaView> + </ImageBackground> + + </View> + ); +} + + +const styles = StyleSheet.create({ + container: { + display: 'flex', + width: '100%', + height: '100%', + }, + image: { + height: '100%', + width: '100%', + } +}); \ No newline at end of file diff --git a/templates/TemplateMono.tsx b/templates/TemplateMono.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1c781dc80c6d1e648244da719eca9cf625a3a782 --- /dev/null +++ b/templates/TemplateMono.tsx @@ -0,0 +1,48 @@ +import { View, Image, StyleSheet } from "react-native"; + +interface Props{ + children?: React.ReactNode +} + +export default function TemplateMono({children} : Props) { + return( + <View style={styles.containerGlobal}> + <View style={styles.containerHeader}> + <Image source={require('../assets/Name.png')} style={styles.image}/> + </View> + <View style={styles.containerBody}> + {children} + </View> + </View> + ); +} + +const styles = StyleSheet.create({ + containerGlobal: { + display: 'flex', + width: '100%', + height: '100%', + }, + containerHeader: { + height: '12%', + width: '100%', + justifyContent: 'flex-end', + alignItems: 'center', + backgroundColor: '#fff', + shadowColor: '#171717', + shadowOffset: { width: 0, height: 4 }, + shadowOpacity: 0.2, + shadowRadius: 3, + elevation: 5, + zIndex: 1, + }, + containerBody: { + height: '88%', + width: '100%', + backgroundColor: '#FFFFFF' + }, + image: { + height: '60%', + width: '60%', + } +}); \ No newline at end of file diff --git a/templates/TemplateQuizList.tsx b/templates/TemplateQuizList.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3b07229920264258b16b9a7265b3431c3ff27529 --- /dev/null +++ b/templates/TemplateQuizList.tsx @@ -0,0 +1,77 @@ +import React from "react"; +import {View, Text, StyleSheet} from "react-native"; +import TemplateMenu from "./TemplateMenu"; +import {NavigationProp} from "@react-navigation/native"; +import InputPlayQuiz from "../components/PlayQuiz/InputPlayQuiz"; +import QuizList from "../components/lists/QuizList"; +import {Quiz} from "../models/Quiz"; + +interface Props { + navigation: NavigationProp<any> + title: string + setTextInInput: (text: string) => void + quizList: Quiz[] | null | undefined + buttonGoBack: boolean + isLoadingData: boolean +} + +/** + * TemplateQuizList : Un composant principal pour afficher une liste de quiz. + * Il inclut un menu, un titre, un champ d'entrée pour les recherches et une liste de quiz. + * + * @param navigation - L'objet de navigation pour naviguer entre les écrans + * @param title - Le titre affiché en haut de la liste + * @param setTextInInput - Fonction pour gérer les modifications dans le champ d'entrée + * @param quizList - La liste des quiz à afficher + * @param buttonGoBack - boolean qui dit si le bouton de retour doit être affiché + */ + +interface Props { + navigation: NavigationProp<any> + title: string + setTextInInput: (text: string) => void + quizList: Quiz[] | null | undefined + buttonGoBack: boolean + isLoadingData: boolean + nextPage?: () => void; + onQuizPressed:(quiz: Quiz) => void; +} + +export default function TemplateQuizList({navigation, title, setTextInInput, quizList, buttonGoBack, isLoadingData, nextPage, onQuizPressed }: Props) { + return ( + <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={buttonGoBack}> + <View style={styles.globalContainer}> + <Text style={styles.title}>{title}</Text> + <View style={styles.contentContainer}> + <InputPlayQuiz setText={setTextInInput} noTitle={true} /> + <QuizList quizList={quizList} isLoadingData={isLoadingData} nextPage={nextPage} onQuizPressed={onQuizPressed}/> + </View> + </View> + </TemplateMenu> + ); +} + +const styles = StyleSheet.create({ + globalContainer: { + display: "flex", + height: "100%", + width: "100%", + paddingHorizontal: "3%", // Ajoute une marge de 5% à gauche et à droite + alignItems: "center", // Centre tous les enfants horizontalement + }, + title: { + fontSize: 40, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + alignSelf: "center", // Centre uniquement le titre + }, + contentContainer: { + display: "flex", + flexDirection: "column", + width: "100%", // Utilise tout l'espace restant à l'intérieur de `globalContainer` + height: "75%", + alignItems: "center", // Centre tous les enfants horizontalement + gap: "2%", + }, +}); diff --git a/templates/TemplateRunList.tsx b/templates/TemplateRunList.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8a542abd5218231cf9e7fd9bb1e14f998bcf3835 --- /dev/null +++ b/templates/TemplateRunList.tsx @@ -0,0 +1,67 @@ +import React from "react"; +import {View, Text, StyleSheet} from "react-native"; +import TemplateMenu from "./TemplateMenu"; +import {NavigationProp} from "@react-navigation/native"; +import RunStartedList from "../components/PlayQuiz/RunStartedList"; +import {RunsInformationsAllRuns} from "../models/RunsInformationsAllRuns"; + + +/** + * TemplateQuizList : Un composant principal pour afficher une liste de quiz. + * Il inclut un menu, un titre, un champ d'entrée pour les recherches et une liste de quiz. + * + * @param navigation - L'objet de navigation pour naviguer entre les écrans + * @param title - Le titre affiché en haut de la liste + * @param setTextInInput - Fonction pour gérer les modifications dans le champ d'entrée + * @param quizList - La liste des quiz à afficher + * @param buttonGoBack - boolean qui dit si le bouton de retour doit être affiché + */ + +interface Props { + navigation: NavigationProp<any> + title: string + setTextInInput: (text: string) => void + runList: RunsInformationsAllRuns[] | undefined + buttonGoBack: boolean + isLoadingData: boolean + nextPage?: () => void; + onRunPressed:(runInfo: RunsInformationsAllRuns) => void; +} + +export default function TemplateRunList({navigation, title, setTextInInput, runList, buttonGoBack, isLoadingData, onRunPressed }: Props) { + return ( + <TemplateMenu navigation={navigation} headerNavigation={true} buttonGoBack={buttonGoBack}> + <View style={styles.globalContainer}> + <Text style={styles.title}>{title}</Text> + <View style={styles.contentContainer}> + <RunStartedList runList={runList} isLoadingData={isLoadingData} onRunPressed={onRunPressed}/> + </View> + </View> + </TemplateMenu> + ); +} + +const styles = StyleSheet.create({ + globalContainer: { + display: "flex", + height: "100%", + width: "100%", + paddingHorizontal: "3%", // Ajoute une marge de 5% à gauche et à droite + alignItems: "center", // Centre tous les enfants horizontalement + }, + title: { + fontSize: 40, + fontWeight: "bold", + color: "#00b3f4", + marginBottom: 10, + alignSelf: "center", // Centre uniquement le titre + }, + contentContainer: { + display: "flex", + flexDirection: "column", + width: "100%", // Utilise tout l'espace restant à l'intérieur de `globalContainer` + height: "75%", + alignItems: "center", // Centre tous les enfants horizontalement + gap: "2%", + }, +}); diff --git a/translation/languages/en.json b/translation/languages/en.json index cd0578e96078a1a0fdc382024d4c5aa9af4a44db..078e5e267c328d69ed04a14a664d3e4f480d8b9e 100644 --- a/translation/languages/en.json +++ b/translation/languages/en.json @@ -4,7 +4,27 @@ "home": { "welcome": "Welcome to Vili", "play": "Play", - "createQuiz": "Create a Quiz" + "createQuiz": "Create a Quiz", + "joinQuiz": "Join a Quiz", + "codeQuiz": "Quiz Code" + }, + "question": { + "score" : "SCORE", + "category" : "CATEGORY", + "question" : "QUESTION" + }, + "endQuiz": { + "win": "Congratulations, you won !", + "lose":"Congratulations, you won !", + "replay": "Play again", + "goHome": "Go to home", + "score": "Score" + }, + "creationQuiz": { + "difficulty": "Difficulty", + "nbQuestions": "Nb. of questions", + "theme": "Theme", + "addQuiz": "Add a Quiz" } } } diff --git a/translation/languages/fr.json b/translation/languages/fr.json index 3cd4cfe19c949731f01a0b23b580250cbdd7c4a5..0d8f29815983fd6469541e89a5cf0a2abd362f96 100644 --- a/translation/languages/fr.json +++ b/translation/languages/fr.json @@ -4,7 +4,27 @@ "home": { "welcome": "Bienvenue sur Vili", "play": "Jouer", - "createQuiz": "Créer un Quizz" + "createQuiz": "Créer un Quizz", + "joinQuiz": "Rejoindre un Quizz", + "codeQuiz": "Code de la partie" + }, + "question": { + "score" : "SCORE", + "category" : "CATEGORIE", + "question" : "QUESTION" + }, + "endQuiz": { + "win": "Félicitations, vous avez gagné !", + "lose":"Dommage, tu as perdu !", + "replay": "Rejouer", + "goHome": "Retour à l'accueil", + "score": "Score" + }, + "creationQuiz": { + "difficulty": "Difficulté", + "nbQuestions": "Nb. de questions", + "theme": "Thème", + "addQuiz": "Ajouter un Quiz" } } }