diff --git a/RiderApp/App.js b/RiderApp/App.js index b77bbc8..aee2c4b 100644 --- a/RiderApp/App.js +++ b/RiderApp/App.js @@ -6,7 +6,7 @@ import * as SplashScreen from "expo-splash-screen"; import React, { useEffect, useState } from "react"; import { Platform, StatusBar } from "react-native"; import FlashMessage from "react-native-flash-message"; -import i18n from "./i18n"; +//import i18n from "./i18n"; import setupApolloClient from "./src/apollo/index"; import { AuthContext } from "./src/context/auth"; import { ConfigurationProvider } from "./src/context/configuration"; @@ -56,7 +56,7 @@ export default function App() { }; async function loadData() { - await i18n.initAsync(); + //await i18n.initAsync(); await Font.loadAsync({ MuseoSans300: require("./assets/font/MuseoSans/MuseoSans300.ttf"), MuseoSans500: require("./assets/font/MuseoSans/MuseoSans500.ttf"), diff --git a/RiderApp/i18n.js b/RiderApp/i18n.js deleted file mode 100644 index e3ac38b..0000000 --- a/RiderApp/i18n.js +++ /dev/null @@ -1,24 +0,0 @@ -import * as Localization from 'expo-localization' -import AsyncStorage from "@react-native-async-storage/async-storage"; -import { Platform } from 'react-native' -import i18n from 'i18n-js' -import { en } from './languages/en' -import { fr } from './languages/fr' -import { km } from './languages/km' -import { zh } from './languages/zh' -import { de } from './languages/de' -import { ar } from './languages/ar' - -i18n.initAsync = async () => { - i18n.fallbacks = true - i18n.translations = { fr, en, km, zh, de, ar } - // i18n.locale = 'km' - if (Platform.OS === 'android') { - const lang = await AsyncStorage.getItem('enatega-language') - i18n.locale = lang || 'en' - } else { - i18n.locale = Localization.locale - } -} - -export default i18n diff --git a/RiderApp/i18next.js b/RiderApp/i18next.js new file mode 100644 index 0000000..fa9ceb0 --- /dev/null +++ b/RiderApp/i18next.js @@ -0,0 +1,44 @@ +import i18next from "i18next"; +import { initReactI18next } from "react-i18next"; +import * as Localization from "expo-localization"; +import { Platform } from "react-native"; +import { en } from "./languages/en"; +import { de } from "./languages/de"; +import { fr } from "./languages/fr"; +import { km } from "./languages/km"; +import { zh } from "./languages/zh"; +import { ar } from "./languages/ar"; +import AsyncStorage from "@react-native-async-storage/async-storage"; +export const languageResources = { + en: { translation: en }, + zh: { translation: zh }, + de: { translation: de }, + fr: { translation: fr }, + km: { translation: km }, + ar: { translation: ar }, +}; + +const i18n = i18next.createInstance(); + +// Configure i18next instance +i18n + .use(initReactI18next) // Ensure initReactI18next is used + .init({ + compatibilityJSON: "v3", + lng: "en", // Default language + fallbackLng: "en", + resources: languageResources, + }); + +// Fetch stored language and set i18next instance accordingly +const getStoredLanguage = async () => { + const lng = await AsyncStorage.getItem("enatega-language"); + i18n.changeLanguage(lng || "en"); // Change language +}; + +// Execute language initialization based on platform +if (Platform.OS === "android" || Platform.OS === "ios") { + getStoredLanguage(); +} + +export default i18n; diff --git a/RiderApp/languages/en.js b/RiderApp/languages/en.js index 816cf22..0d0dc97 100644 --- a/RiderApp/languages/en.js +++ b/RiderApp/languages/en.js @@ -1,154 +1,154 @@ export const en = { - title0: 'Selected Language', - subtitle0: 'English', + title0: "Selected Language", + subtitle0: "English", description0: - 'Select any language of your choice to change the content of the app to your required language.', - title1: 'Tasty', - subtitle1: 'BreakFast', + "Select any language of your choice to change the content of the app to your required language.", + title1: "Tasty", + subtitle1: "BreakFast", description1: - 'Breakfast is everything. The beginning, the first thing. It is the mouthful that is the commitment to a new day, a continuing life.', - title2: 'Refreshing', - subtitle2: 'Drinks', + "Breakfast is everything. The beginning, the first thing. It is the mouthful that is the commitment to a new day, a continuing life.", + title2: "Refreshing", + subtitle2: "Drinks", description2: - 'True silence is the rest of the mind, and is to the spirit what sleep is to the body, nourishment and refreshment.', - title3: 'Delicous', - subtitle3: 'Icecream', + "True silence is the rest of the mind, and is to the spirit what sleep is to the body, nourishment and refreshment.", + title3: "Delicous", + subtitle3: "Icecream", description3: - 'Age does not diminish the extreme disappointment of having a scoop of ice cream fall from the cone', - getStarted: 'Get Started!', - welcome: 'Welcome', - loginBtn: 'Login', - registerBtn: 'Register', - name: 'Name', - phone: 'Phone', - email: 'Email', - emailphone: 'Email or Phone', - username: 'Username', - password: 'Password', - deliveryAddress: 'Delivery Address', - registerText: 'Or Register With', - forgotPassword: 'Forgot Password?', - loginText: 'Or Login With', + "Age does not diminish the extreme disappointment of having a scoop of ice cream fall from the cone", + getStarted: "Get Started!", + welcome: "Welcome", + loginBtn: "Login", + registerBtn: "Register", + name: "Name", + phone: "Phone", + email: "Email", + emailphone: "Email or Phone", + username: "Username", + password: "Password", + deliveryAddress: "Delivery Address", + registerText: "Or Register With", + forgotPassword: "Forgot Password?", + loginText: "Or Login With", deliveryLocation: - 'Turn on location so we could send you endless taste of delicious food.', - locationBtn: 'Turn on Location', - locationPermissionDenied: 'Permission to access location was denied', - cameraRollPermissionDenied: 'Permission to access Camera Roll was denied', - locationOff: 'Turn on location and try again', - titleLanguage: 'Change Language', - titleMenu: 'Menu', - titleOrders: 'My Orders', - NewOrders: 'New Orders', - titleNotifications: 'Notifications', - titleReviews: 'Reviews', - titleSettings: 'Settings', - titleHelp: 'Help', - titleLogout: 'Logout', - titleCart: 'My Cart', - titlePayment: 'Payment', - orderId: 'Order ID', - totalOrderAmount: 'Total Order Amount', - reOrder: 'Reorder', - unReadNotifications: 'No unread notifications', - upload: 'Upload', - saveBtn: 'Save', - emailUs: 'Email us at', - question1: 'Where do we find the food?', - question2: 'How do we contact?', - question3: 'How can I pay the delivery person?', - question4: 'Is the service available in my city?', + "Turn on location so we could send you endless taste of delicious food.", + locationBtn: "Turn on Location", + locationPermissionDenied: "Permission to access location was denied", + cameraRollPermissionDenied: "Permission to access Camera Roll was denied", + locationOff: "Turn on location and try again", + titleLanguage: "Change Language", + titleMenu: "Menu", + titleOrders: "My Orders", + NewOrders: "New Orders", + titleNotifications: "Notifications", + titleReviews: "Reviews", + titleSettings: "Settings", + titleHelp: "Help", + titleLogout: "Logout", + titleCart: "My Cart", + titlePayment: "Payment", + orderId: "Order ID", + totalOrderAmount: "Total Order Amount", + reOrder: "Reorder", + unReadNotifications: "No unread notifications", + upload: "Upload", + saveBtn: "Save", + emailUs: "Email us at", + question1: "Where do we find the food?", + question2: "How do we contact?", + question3: "How can I pay the delivery person?", + question4: "Is the service available in my city?", answer1: - 'You can find the food at your nearest store without paying anything to customer service.Our charges are extremely low as compared to others.', - answer2: 'You can contact us through our email, phone number or our website.', + "You can find the food at your nearest store without paying anything to customer service.Our charges are extremely low as compared to others.", + answer2: "You can contact us through our email, phone number or our website.", answer3: - 'You can pay the delivery person in person or pay online as well through credit or debit card.', + "You can pay the delivery person in person or pay online as well through credit or debit card.", answer4: - 'Currently this service is available in cities Islamabad and Karachi you can contact us to avail this service in your city.', - add: 'ADD', - quantity: 'Quantity', - size: 'Size', - addToCart: 'Add to Cart', - orderNow: 'Order Now', - addToCartMessage: 'Added to cart', - emptyCart: 'No items in cart', - itemTotal: 'Item Total', - delvieryCharges: 'Delivery Charges', - total: 'Total', - contactInfo: 'Contact Info', - deliveryAddressmessage: 'Set delivery address', - proceedCheckout: 'Proceed to Checkout', - paymentText: 'How do you wish to pay?', - checkout: 'Checkout', - header_title1: 'Credit Card/Debit Card', - header_subscript1: 'Pay with Credit or Debit Card', - header_title2: 'PayPal', - header_subscript2: 'Pay online with PayPal', - header_title3: 'Cash on delivery', - header_subscript3: 'Pay when you recieve the item', - thankYou: 'Thank You!', - orderConfirmed: 'Your Order is confirmed', - orderAmount: 'Your Order Amount', - orderDetail: 'Order Detail', - paymentMethod: 'Payment Method', - trackOrder: 'Track Order', - backToMenu: 'Back To Menu', - foodItem: 'Food item', - deliveredTo: 'Delivered to', - writeAReview: 'Write a Review', - orderReceived: 'Order Received', - cancelled: 'Cancelled', - foodPreparing: 'Food is being prepared', - Delivered: 'Delivered', - rateAndReview: 'Rate and Review', - reviewPlaceholder: 'More detailed reviews get more visibility...', - submit: 'Submit', - noWorriesText: 'No worries, let us help you out!', - yourEmail: 'Your Email', - send: 'Send', - apply: 'Apply', - checkEmail: 'Check your email for reset password link', - languageText: 'Please select your required language', - countryCodePickerTranslation: 'eng', - countryCodeSelect: 'Select Country Code', - paymentNotSupported: 'This payment method does not support this Currency', - Orders: 'Orders', - deliveryTime: 'Delivery Time', - myOrders: 'My Orders', - newOrders: 'New Orders', - titleChat: 'Chat', - NoNewOrder: 'No New Order', - Somethingisworng: 'Something is worng', - PENDING: 'PENDING', - ACCEPTED: 'ACCEPTED', - PICKED: 'PICKED', - DELIVERED: 'DELIVERED', - COMPLETED: 'COMPLETED', - YourOrderID: 'Your Order ID', - ProductPage: 'Product Page', - Docs: 'Docs', - Blog: 'Blog', - AboutUs: 'About Us', - Done: 'Done', - Cancel: 'Cancel', - Usernameisrequired: 'Username is required', - Passwordisrequired: 'Password is required', - Loggedin: 'Logged in', - EnteryourEmailandPassword: 'Enter your Email and Password', - EmailorPhone: 'Email or Phone', - Password: 'Password', - NoOrdersAssignedyet: 'No Orders Assigned yet', - Loadingorders: 'Loading orders', - Orderassginedtootherrider: 'Order assgined to other rider', - CustomerDetails: 'Customer Details', - Contact: 'Contact', - DelvieryLocation: 'Delviery Location', - OrderDetails: 'Order Details', - Subtotal: 'Subtotal', - Assigntome: 'Assign to me', - 'About Us': 'About Us', - 'Product Page': 'Product Page', - Order: 'Order', - OrderMarkedAs: 'Order marked as', - titleLogin: 'Login', - Picked: 'Picked' -} + "Currently this service is available in cities Islamabad and Karachi you can contact us to avail this service in your city.", + add: "ADD", + quantity: "Quantity", + size: "Size", + addToCart: "Add to Cart", + orderNow: "Order Now", + addToCartMessage: "Added to cart", + emptyCart: "No items in cart", + itemTotal: "Item Total", + delvieryCharges: "Delivery Charges", + total: "Total", + contactInfo: "Contact Info", + deliveryAddressmessage: "Set delivery address", + proceedCheckout: "Proceed to Checkout", + paymentText: "How do you wish to pay?", + checkout: "Checkout", + header_title1: "Credit Card/Debit Card", + header_subscript1: "Pay with Credit or Debit Card", + header_title2: "PayPal", + header_subscript2: "Pay online with PayPal", + header_title3: "Cash on delivery", + header_subscript3: "Pay when you recieve the item", + thankYou: "Thank You!", + orderConfirmed: "Your Order is confirmed", + orderAmount: "Your Order Amount", + orderDetail: "Order Detail", + paymentMethod: "Payment Method", + trackOrder: "Track Order", + backToMenu: "Back To Menu", + foodItem: "Food item", + deliveredTo: "Delivered to", + writeAReview: "Write a Review", + orderReceived: "Order Received", + cancelled: "Cancelled", + foodPreparing: "Food is being prepared", + Delivered: "Delivered", + rateAndReview: "Rate and Review", + reviewPlaceholder: "More detailed reviews get more visibility...", + submit: "Submit", + noWorriesText: "No worries, let us help you out!", + yourEmail: "Your Email", + send: "Send", + apply: "Apply", + checkEmail: "Check your email for reset password link", + languageText: "Please select your required language", + countryCodePickerTranslation: "eng", + countryCodeSelect: "Select Country Code", + paymentNotSupported: "This payment method does not support this Currency", + Orders: "Orders", + deliveryTime: "Delivery Time", + myOrders: "My Orders", + newOrders: "New Orders", + titleChat: "Chat", + NoNewOrder: "No New Order", + Somethingisworng: "Something is worng", + PENDING: "PENDING", + ACCEPTED: "ACCEPTED", + PICKED: "PICKED", + DELIVERED: "DELIVERED", + COMPLETED: "COMPLETED", + YourOrderID: "Your Order ID", + ProductPage: "Product Page", + Docs: "Docs", + Blog: "Blog", + AboutUs: "About Us", + Done: "Done", + Cancel: "Cancel", + Usernameisrequired: "Username is required", + Passwordisrequired: "Password is required", + Loggedin: "Logged in", + EnteryourEmailandPassword: "Enter your Email and Password", + EmailorPhone: "Email or Phone", + Password: "Password", + NoOrdersAssignedyet: "No Orders Assigned yet", + Loadingorders: "Loading orders", + Orderassginedtootherrider: "Order assgined to other rider", + CustomerDetails: "Customer Details", + Contact: "Contact", + DelvieryLocation: "Delivery Location", + OrderDetails: "Order Details", + Subtotal: "Subtotal", + Assigntome: "Assign to me", + "About Us": "About Us", + "Product Page": "Product Page", + Order: "Order", + OrderMarkedAs: "Order marked as", + titleLogin: "Login", + Picked: "Picked", +}; diff --git a/RiderApp/package-lock.json b/RiderApp/package-lock.json index e0a2d2b..42578de 100644 --- a/RiderApp/package-lock.json +++ b/RiderApp/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@apollo/react-hooks": "^3.1.3", "@expo/vector-icons": "^13.0.0", - "@react-native-async-storage/async-storage": "~1.17.3", + "@react-native-async-storage/async-storage": "^1.17.12", "@react-native-community/masked-view": "0.1.10", "@react-navigation/bottom-tabs": "^5.11.11", "@react-navigation/drawer": "^5.12.5", @@ -31,6 +31,7 @@ "expo-font": "~11.0.1", "expo-localization": "~14.0.0", "expo-location": "~15.0.1", + "expo-modules-autolinking": "^1.5.1", "expo-navigation-bar": "~2.0.1", "expo-notifications": "~0.17.0", "expo-splash-screen": "~0.17.5", @@ -40,10 +41,12 @@ "graphql": "^14.3.1", "graphql-tag": "^2.10.1", "i18n-js": "^3.3.0", + "i18next": "^23.8.2", "patch-package": "^6.5.1", "react": "18.1.0", "react-apollo": "^2.5.8", - "react-native": "0.70.5", + "react-i18next": "^14.0.5", + "react-native": "0.70.8", "react-native-animatable": "^1.3.2", "react-native-flash-message": "^0.1.13", "react-native-gesture-handler": "~2.8.0", @@ -1832,16 +1835,21 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/@babel/template": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", @@ -2602,6 +2610,87 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" }, + "node_modules/@expo/fingerprint": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.6.0.tgz", + "integrity": "sha512-KfpoVRTMwMNJ/Cf5o+Ou8M/Y0EGSTqK+rbi70M2Y0K2qgWNfMJ1gm6sYO9uc8lcTr7YSYM1Rme3dk7QXhpScNA==", + "dependencies": { + "@expo/spawn-async": "^1.5.0", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "find-up": "^5.0.0", + "minimatch": "^3.0.4", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/fingerprint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@expo/fingerprint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@expo/fingerprint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@expo/fingerprint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@expo/fingerprint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/fingerprint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@expo/image-utils": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.3.22.tgz", @@ -2785,9 +2874,9 @@ } }, "node_modules/@expo/json-file": { - "version": "8.2.37", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.2.37.tgz", - "integrity": "sha512-YaH6rVg11JoTS2P6LsW7ybS2CULjf40AbnAHw2F1eDPuheprNjARZMnyHFPkKv7GuxCy+B9GPcbOKgc4cgA80Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.0.tgz", + "integrity": "sha512-yROUeXJXR5goagB8c3muFLCzLmdGOvoPpR5yDNaXrnTp4euNykr9yW0wWhJx4YVRTNOPtGBnEbbJBW+a9q+S6g==", "dependencies": { "@babel/code-frame": "~7.10.4", "json5": "^2.2.2", @@ -3398,36 +3487,35 @@ "integrity": "sha512-F0YfUDjvT+Mtt/R4xdl2X0EYCHMMiJqNLdxHD++jDT5ydEFIyqbCHh51Qx2E211dgZprPKhV7sHmnXKpLuvc5g==" }, "node_modules/@jest/create-cache-key-function": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.5.0.tgz", - "integrity": "sha512-LIDZyZgnZss7uikvBKBB/USWwG+GO8+GnwRWT+YkCGDGsqLQlhm9BC3z6+7+eMs1kUlvXQIWEzBR8Q2Pnvx6lg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz", + "integrity": "sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==", "dependencies": { - "@jest/types": "^29.5.0" + "@jest/types": "^27.5.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { - "@jest/schemas": "^29.4.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^17.0.8", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": { - "version": "17.0.23", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.23.tgz", - "integrity": "sha512-yuogunc04OnzGQCrfHx+Kk883Q4X0aSwmYZhKjI21m+SVYzjIbrWl8dOOwSv5hf2Um2pdCOXWo9isteZTNXUZQ==", + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { "@types/yargs-parser": "*" } @@ -3496,17 +3584,6 @@ "node": ">=8" } }, - "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/@jest/types": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", @@ -3750,15 +3827,15 @@ } }, "node_modules/@react-native-community/cli": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-9.2.1.tgz", - "integrity": "sha512-feMYS5WXXKF4TSWnCXozHxtWq36smyhGaENXlkiRESfYZ1mnCUlPfOanNCAvNvBqdyh9d4o0HxhYKX1g9l6DCQ==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-9.3.2.tgz", + "integrity": "sha512-IAW4X0vmX/xozNpp/JVZaX7MrC85KV0OP2DF4o7lNGOfpUhzJAEWqTfkxFYS+VsRjZHDve4wSTiGIuXwE7FG1w==", "dependencies": { "@react-native-community/cli-clean": "^9.2.1", "@react-native-community/cli-config": "^9.2.1", "@react-native-community/cli-debugger-ui": "^9.0.0", - "@react-native-community/cli-doctor": "^9.2.1", - "@react-native-community/cli-hermes": "^9.2.1", + "@react-native-community/cli-doctor": "^9.3.0", + "@react-native-community/cli-hermes": "^9.3.1", "@react-native-community/cli-plugin-metro": "^9.2.1", "@react-native-community/cli-server-api": "^9.2.1", "@react-native-community/cli-tools": "^9.2.1", @@ -3943,18 +4020,6 @@ "wcwidth": "^1.0.1" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/@react-native-community/cli-platform-ios": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-9.3.0.tgz", - "integrity": "sha512-nihTX53BhF2Q8p4B67oG3RGe1XwggoGBrMb6vXdcu2aN0WeXJOXdBLgR900DAA1O8g7oy1Sudu6we+JsVTKnjw==", - "dependencies": { - "@react-native-community/cli-tools": "^9.2.1", - "chalk": "^4.1.2", - "execa": "^1.0.0", - "glob": "^7.1.3", - "ora": "^5.4.1" - } - }, "node_modules/@react-native-community/cli-doctor/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4077,11 +4142,11 @@ } }, "node_modules/@react-native-community/cli-hermes": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-9.3.1.tgz", - "integrity": "sha512-Mq4PK8m5YqIdaVq5IdRfp4qK09aVO+aiCtd6vjzjNUgk1+1X5cgUqV6L65h4N+TFJYJHcp2AnB+ik1FAYXvYPQ==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-9.3.4.tgz", + "integrity": "sha512-VqTPA7kknCXgtYlRf+sDWW4yxZ6Gtg1Ga+Rdrn1qSKuo09iJ8YKPoQYOu5nqbIYJQAEhorWQyo1VvNgd0wd49w==", "dependencies": { - "@react-native-community/cli-platform-android": "^9.3.1", + "@react-native-community/cli-platform-android": "^9.3.4", "@react-native-community/cli-tools": "^9.2.1", "chalk": "^4.1.2", "hermes-profile-transformer": "^0.0.6", @@ -4089,9 +4154,9 @@ } }, "node_modules/@react-native-community/cli-hermes/node_modules/@react-native-community/cli-platform-android": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-9.3.1.tgz", - "integrity": "sha512-m0bQ6Twewl7OEZoVf79I2GZmsDqh+Gh0bxfxWgwxobsKDxLx8/RNItAo1lVtTCgzuCR75cX4EEO8idIF9jYhew==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-9.3.4.tgz", + "integrity": "sha512-BTKmTMYFuWtMqimFQJfhRyhIWw1m+5N5svR1S5+DqPcyFuSXrpNYDWNSFR8E105xUbFANmsCZZQh6n1WlwMpOA==", "dependencies": { "@react-native-community/cli-tools": "^9.2.1", "chalk": "^4.1.2", @@ -4167,9 +4232,9 @@ } }, "node_modules/@react-native-community/cli-platform-android": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-9.2.1.tgz", - "integrity": "sha512-VamCZ8nido3Q3Orhj6pBIx48itORNPLJ7iTfy3nucD1qISEDih3DOzCaQCtmqdEBgUkNkNl0O+cKgq5A3th3Zg==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-9.3.1.tgz", + "integrity": "sha512-m0bQ6Twewl7OEZoVf79I2GZmsDqh+Gh0bxfxWgwxobsKDxLx8/RNItAo1lVtTCgzuCR75cX4EEO8idIF9jYhew==", "dependencies": { "@react-native-community/cli-tools": "^9.2.1", "chalk": "^4.1.2", @@ -4245,9 +4310,9 @@ } }, "node_modules/@react-native-community/cli-platform-ios": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-9.2.1.tgz", - "integrity": "sha512-dEgvkI6CFgPk3vs8IOR0toKVUjIFwe4AsXFvWWJL5qhrIzW9E5Owi0zPkSvzXsMlfYMbVX0COfVIK539ZxguSg==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-9.3.0.tgz", + "integrity": "sha512-nihTX53BhF2Q8p4B67oG3RGe1XwggoGBrMb6vXdcu2aN0WeXJOXdBLgR900DAA1O8g7oy1Sudu6we+JsVTKnjw==", "dependencies": { "@react-native-community/cli-tools": "^9.2.1", "chalk": "^4.1.2", @@ -4343,19 +4408,19 @@ } }, "node_modules/@react-native-community/cli-plugin-metro": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-9.2.1.tgz", - "integrity": "sha512-byBGBH6jDfUvcHGFA45W/sDwMlliv7flJ8Ns9foCh3VsIeYYPoDjjK7SawE9cPqRdMAD4SY7EVwqJnOtRbwLiQ==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-9.3.3.tgz", + "integrity": "sha512-lPBw6XieNdj2AbWDN0Rc+jNOx8hBgSQyv0gUAm01qtJe4I9FjSMU6nOGTxMpWpICo6TYl/cmPGXOzbfpwxwtkQ==", "dependencies": { "@react-native-community/cli-server-api": "^9.2.1", "@react-native-community/cli-tools": "^9.2.1", "chalk": "^4.1.2", - "metro": "0.72.3", - "metro-config": "0.72.3", - "metro-core": "0.72.3", - "metro-react-native-babel-transformer": "0.72.3", - "metro-resolver": "0.72.3", - "metro-runtime": "0.72.3", + "metro": "0.72.4", + "metro-config": "0.72.4", + "metro-core": "0.72.4", + "metro-react-native-babel-transformer": "0.72.4", + "metro-resolver": "0.72.4", + "metro-runtime": "0.72.4", "readline": "^1.3.0" } }, @@ -4412,6 +4477,109 @@ "node": ">=8" } }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-react-native-babel-preset": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.72.4.tgz", + "integrity": "sha512-YGCVaYe1H5fOFktdDdL9IwAyiXjPh1t2eZZFp3KFJak6fxKpN+q5PPhe1kzMa77dbCAqgImv43zkfGa6i27eyA==", + "dependencies": { + "@babel/core": "^7.14.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.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.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.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-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-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-react-native-babel-transformer": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.72.4.tgz", + "integrity": "sha512-VxM8Cki+/tPAyQRPHEy1bsxAihpxz8cGLdteFo9t0eAJI7/vEegqICxQm4A+RiGQc4f8t2jiwI6YpnDWomI5Gw==", + "dependencies": { + "@babel/core": "^7.14.0", + "babel-preset-fbjs": "^3.4.0", + "hermes-parser": "0.8.0", + "metro-babel-transformer": "0.72.4", + "metro-react-native-babel-preset": "0.72.4", + "metro-source-map": "0.72.4", + "nullthrows": "^1.1.1" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-runtime": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.72.4.tgz", + "integrity": "sha512-EA0ltqyYFpjOdpoRqE2U9FJleqTOIK+ZLRlLaDrx4yz3zTqUZ16W6w71dq+qrwD8BPg7bPKQu7RluU3K6tI79A==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-source-map": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.72.4.tgz", + "integrity": "sha512-P09aMDEPkLo6BM8VYYoTsH/2B1w6t+mrCwNcNJV1zE+57FPiU4fSBlSeM8G9YeYaezDTHimS2JlMozP+2r+trA==", + "dependencies": { + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.72.4", + "nullthrows": "^1.1.1", + "ob1": "0.72.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/ob1": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.72.4.tgz", + "integrity": "sha512-/iPJKpXpVEZS0subUvjew4ept5LTBxj1hD20A4mAj9CJkGGPgvbBlfYtFEBubBkk4dv4Ef5lajsnRBYPxF74cQ==" + }, + "node_modules/@react-native-community/cli-plugin-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==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@react-native-community/cli-plugin-metro/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4845,9 +5013,9 @@ } }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -4862,11 +5030,6 @@ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, "node_modules/@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", @@ -5604,9 +5767,9 @@ } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, "node_modules/async-limiter": { "version": "1.0.1", @@ -7162,9 +7325,9 @@ } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", "bin": { "envinfo": "dist/cli.js" }, @@ -8271,10 +8434,11 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.0.2.tgz", - "integrity": "sha512-skAUXERKw1gtSw8xsvft9DE0KVhBvw4dujAtgCZoG2l513fN7ds+B5+30ZVgZATMC+EjtlmjKXzhp5QS44DCFA==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.10.3.tgz", + "integrity": "sha512-pn4n2Dl4iRh/zUeiChjRIe1C7EqOw1qhccr85viQV7W6l5vgRpY0osE51ij5LKg/kJmGRcJfs12+PwbdTplbKw==", "dependencies": { + "@expo/config": "~8.5.0", "chalk": "^4.1.0", "commander": "^7.2.0", "fast-glob": "^3.2.5", @@ -8285,6 +8449,71 @@ "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, + "node_modules/expo-modules-autolinking/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/expo-modules-autolinking/node_modules/@expo/config": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-8.5.4.tgz", + "integrity": "sha512-ggOLJPHGzJSJHVBC1LzwXwR6qUn8Mw7hkc5zEKRIdhFRuIQ6s2FE4eOvP87LrNfDF7eZGa6tJQYsiHSmZKG+8Q==", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~7.8.2", + "@expo/config-types": "^50.0.0", + "@expo/json-file": "^8.2.37", + "getenv": "^1.0.0", + "glob": "7.1.6", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "semver": "7.5.3", + "slugify": "^1.3.4", + "sucrase": "3.34.0" + } + }, + "node_modules/expo-modules-autolinking/node_modules/@expo/config-plugins": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-7.8.4.tgz", + "integrity": "sha512-hv03HYxb/5kX8Gxv/BTI8TLc9L06WzqAfHRRXdbar4zkLcP2oTzvsLEF4/L/TIpD3rsnYa0KU42d0gWRxzPCJg==", + "dependencies": { + "@expo/config-types": "^50.0.0-alpha.1", + "@expo/fingerprint": "^0.6.0", + "@expo/json-file": "~8.3.0", + "@expo/plist": "^0.1.0", + "@expo/sdk-runtime-versions": "^1.0.0", + "@react-native/normalize-color": "^2.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.1", + "find-up": "~5.0.0", + "getenv": "^1.0.0", + "glob": "7.1.6", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/expo-modules-autolinking/node_modules/@expo/config-types": { + "version": "50.0.0", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-50.0.0.tgz", + "integrity": "sha512-0kkhIwXRT6EdFDwn+zTg9R2MZIAEYGn1MVkyRohAd+C9cXOb5RA8WLQi7vuxKF9m1SMtNAUrf0pO+ENK0+/KSw==" + }, + "node_modules/expo-modules-autolinking/node_modules/@expo/plist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.0.tgz", + "integrity": "sha512-xWD+8vIFif0wKyuqe3fmnmnSouXYucciZXFzS0ZD5OV9eSAS1RGQI5FaGGJ6zxJ4mpdy/4QzbLdBjnYE5vxA0g==", + "dependencies": { + "@xmldom/xmldom": "~0.7.7", + "base64-js": "^1.2.3", + "xmlbuilder": "^14.0.0" + } + }, "node_modules/expo-modules-autolinking/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8344,6 +8573,25 @@ "node": ">=10" } }, + "node_modules/expo-modules-autolinking/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/expo-modules-autolinking/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8363,6 +8611,31 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/expo-modules-autolinking/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-modules-autolinking/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/expo-modules-autolinking/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8382,6 +8655,31 @@ "node": ">= 10.0.0" } }, + "node_modules/expo-modules-autolinking/node_modules/xml2js": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/expo-modules-autolinking/node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/expo-modules-autolinking/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/expo-modules-core": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.1.1.tgz", @@ -8528,6 +8826,51 @@ "expo": "*" } }, + "node_modules/expo/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/expo/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/expo/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/expo/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/expo/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -8543,6 +8886,54 @@ "node": ">=4.8" } }, + "node_modules/expo/node_modules/expo-modules-autolinking": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.0.2.tgz", + "integrity": "sha512-skAUXERKw1gtSw8xsvft9DE0KVhBvw4dujAtgCZoG2l513fN7ds+B5+30ZVgZATMC+EjtlmjKXzhp5QS44DCFA==", + "dependencies": { + "chalk": "^4.1.0", + "commander": "^7.2.0", + "fast-glob": "^3.2.5", + "find-up": "^5.0.0", + "fs-extra": "^9.1.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/expo/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/expo/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -8578,6 +8969,25 @@ "node": ">=0.10.0" } }, + "node_modules/expo/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/expo/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/expo/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -9080,9 +9490,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -9566,6 +9976,14 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -9721,6 +10139,28 @@ "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-3.9.2.tgz", "integrity": "sha512-+Gm8h5HL0emzKhRx2avMKX+nKiVPXeaOZm7Euf2/pbbFcLQoJ3zZYiUykAzoRasijCoWos2Kl1tslmScTgAQKw==" }, + "node_modules/i18next": { + "version": "23.8.2", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.8.2.tgz", + "integrity": "sha512-Z84zyEangrlERm0ZugVy4bIt485e/H8VecGUZkZWrH7BDePG6jT73QdL9EA1tRTTVVMpry/MgWIP1FjEn0DRXA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -10489,9 +10929,9 @@ } }, "node_modules/jest-util/node_modules/@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dependencies": { "@types/yargs-parser": "*" } @@ -10681,13 +11121,13 @@ "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==" }, "node_modules/joi": { - "version": "17.9.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.1.tgz", - "integrity": "sha512-FariIi9j6QODKATGBrEX7HZcja8Bsh3rfdGYy/Sb65sGlZWK/QWesU1ghk7aJWDj95knjXlQfSmzFSPPkLVsfw==", + "version": "17.12.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", + "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@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" } @@ -10719,6 +11159,11 @@ "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250230.2.1.tgz", "integrity": "sha512-KmxeBlRjwoqCnBBKGsihFtvsBHyUFlBxJPK4FzeYcIuBfdjv6jFys44JITAgSTbQD+vIdwMEfyZklsuQX0yI1Q==" }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==" + }, "node_modules/jscodeshift": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.13.1.tgz", @@ -11670,9 +12115,9 @@ } }, "node_modules/metro": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.72.3.tgz", - "integrity": "sha512-Hb3xTvPqex8kJ1hutQNZhQadUKUwmns/Du9GikmWKBFrkiG3k3xstGAyO5t5rN9JSUEzQT6y9SWzSSOGogUKIg==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.72.4.tgz", + "integrity": "sha512-UBqL2fswJjsq2LlfMPV4ArqzLzjyN0nReKRijP3DdSxZiaJDG4NC9sQoVJHbH1HP5qXQMAK/SftyAx1c1kuy+w==", "dependencies": { "@babel/code-frame": "^7.0.0", "@babel/core": "^7.14.0", @@ -11696,23 +12141,24 @@ "image-size": "^0.6.0", "invariant": "^2.2.4", "jest-worker": "^27.2.0", + "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.72.3", - "metro-cache": "0.72.3", - "metro-cache-key": "0.72.3", - "metro-config": "0.72.3", - "metro-core": "0.72.3", - "metro-file-map": "0.72.3", - "metro-hermes-compiler": "0.72.3", - "metro-inspector-proxy": "0.72.3", - "metro-minify-uglify": "0.72.3", - "metro-react-native-babel-preset": "0.72.3", - "metro-resolver": "0.72.3", - "metro-runtime": "0.72.3", - "metro-source-map": "0.72.3", - "metro-symbolicate": "0.72.3", - "metro-transform-plugins": "0.72.3", - "metro-transform-worker": "0.72.3", + "metro-babel-transformer": "0.72.4", + "metro-cache": "0.72.4", + "metro-cache-key": "0.72.4", + "metro-config": "0.72.4", + "metro-core": "0.72.4", + "metro-file-map": "0.72.4", + "metro-hermes-compiler": "0.72.4", + "metro-inspector-proxy": "0.72.4", + "metro-minify-uglify": "0.72.4", + "metro-react-native-babel-preset": "0.72.4", + "metro-resolver": "0.72.4", + "metro-runtime": "0.72.4", + "metro-source-map": "0.72.4", + "metro-symbolicate": "0.72.4", + "metro-transform-plugins": "0.72.4", + "metro-transform-worker": "0.72.4", "mime-types": "^2.1.27", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", @@ -11730,41 +12176,69 @@ } }, "node_modules/metro-babel-transformer": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.72.3.tgz", - "integrity": "sha512-PTOR2zww0vJbWeeM3qN90WKENxCLzv9xrwWaNtwVlhcV8/diNdNe82sE1xIxLFI6OQuAVwNMv1Y7VsO2I7Ejrw==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.72.4.tgz", + "integrity": "sha512-cg1TQUKDkKqrIClrqqIGE8ZDa9kRKSjhBtqPtNYt/ZSywXU41SrldfcI5uzPrzcIrYpH5hnN6OCLRACPgy2vsw==", "dependencies": { "@babel/core": "^7.14.0", "hermes-parser": "0.8.0", - "metro-source-map": "0.72.3", + "metro-source-map": "0.72.4", "nullthrows": "^1.1.1" } }, - "node_modules/metro-cache": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.72.3.tgz", - "integrity": "sha512-++eyZzwkXvijWRV3CkDbueaXXGlVzH9GA52QWqTgAOgSHYp5jWaDwLQ8qpsMkQzpwSyIF4LLK9aI3eA7Xa132A==", + "node_modules/metro-babel-transformer/node_modules/metro-source-map": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.72.4.tgz", + "integrity": "sha512-P09aMDEPkLo6BM8VYYoTsH/2B1w6t+mrCwNcNJV1zE+57FPiU4fSBlSeM8G9YeYaezDTHimS2JlMozP+2r+trA==", "dependencies": { - "metro-core": "0.72.3", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.72.4", + "nullthrows": "^1.1.1", + "ob1": "0.72.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-babel-transformer/node_modules/ob1": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.72.4.tgz", + "integrity": "sha512-/iPJKpXpVEZS0subUvjew4ept5LTBxj1hD20A4mAj9CJkGGPgvbBlfYtFEBubBkk4dv4Ef5lajsnRBYPxF74cQ==" + }, + "node_modules/metro-babel-transformer/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-cache": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.72.4.tgz", + "integrity": "sha512-76fi9OVytiFVSuGQcNoquVOT7AENd0q3n1WmyBeJ7jvl/UrE3/NN3HTWzu2ezG5IxF3cmo5q1ehi0NEpgwaFGg==", + "dependencies": { + "metro-core": "0.72.4", "rimraf": "^2.5.4" } }, "node_modules/metro-cache-key": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.72.3.tgz", - "integrity": "sha512-kQzmF5s3qMlzqkQcDwDxrOaVxJ2Bh6WRXWdzPnnhsq9LcD3B3cYqQbRBS+3tSuXmathb4gsOdhWslOuIsYS8Rg==" + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.72.4.tgz", + "integrity": "sha512-DH3cgN4L7IKNCVBy8LBOXQ4tHDdvh7Vl7jWNkQKMOfHWu1EwsTtXD/+zdV7/be4ls/kHxrD0HbGzpK8XhUAHSw==" }, "node_modules/metro-config": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.72.3.tgz", - "integrity": "sha512-VEsAIVDkrIhgCByq8HKTWMBjJG6RlYwWSu1Gnv3PpHa0IyTjKJtB7wC02rbTjSaemcr82scldf2R+h6ygMEvsw==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.72.4.tgz", + "integrity": "sha512-USv+H14D5RrSpfA5t4t5cbF1CnizgYGz6xJ3HB0r/bDYdJdZTVqB3/mMPft7Z5zHslS00JCG7oE51G1CK/FlKw==", "dependencies": { "cosmiconfig": "^5.0.5", "jest-validate": "^26.5.2", - "metro": "0.72.3", - "metro-cache": "0.72.3", - "metro-core": "0.72.3", - "metro-runtime": "0.72.3" + "metro": "0.72.4", + "metro-cache": "0.72.4", + "metro-core": "0.72.4", + "metro-runtime": "0.72.4" } }, "node_modules/metro-config/node_modules/cosmiconfig": { @@ -11793,6 +12267,15 @@ "node": ">=4" } }, + "node_modules/metro-config/node_modules/metro-runtime": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.72.4.tgz", + "integrity": "sha512-EA0ltqyYFpjOdpoRqE2U9FJleqTOIK+ZLRlLaDrx4yz3zTqUZ16W6w71dq+qrwD8BPg7bPKQu7RluU3K6tI79A==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, "node_modules/metro-config/node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -11814,18 +12297,18 @@ } }, "node_modules/metro-core": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.72.3.tgz", - "integrity": "sha512-KuYWBMmLB4+LxSMcZ1dmWabVExNCjZe3KysgoECAIV+wyIc2r4xANq15GhS94xYvX1+RqZrxU1pa0jQ5OK+/6A==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.72.4.tgz", + "integrity": "sha512-2JNT1nG0UV1uMrQHQOKUSII0sdS6MhVT3mBt2kwfjCvD+jvi1iYhKJ4kYCRlUQw9XNLGZ/B+C0VDQzlf2M3zVw==", "dependencies": { "lodash.throttle": "^4.1.1", - "metro-resolver": "0.72.3" + "metro-resolver": "0.72.4" } }, "node_modules/metro-file-map": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.72.3.tgz", - "integrity": "sha512-LhuRnuZ2i2uxkpFsz1XCDIQSixxBkBG7oICAFyLyEMDGbcfeY6/NexphfLdJLTghkaoJR5ARFMiIxUg9fIY/pA==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.72.4.tgz", + "integrity": "sha512-Mv5WgTsYs5svTR/df6jhq2aD4IkAuwV5TutHW0BfEg1YccQt8/v7q5ZypmUOkjdSS9bFR4r3677jalr/ceFypQ==", "dependencies": { "abort-controller": "^3.0.0", "anymatch": "^3.0.3", @@ -11858,14 +12341,14 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/metro-hermes-compiler": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.72.3.tgz", - "integrity": "sha512-QWDQASMiXNW3j8uIQbzIzCdGYv5PpAX/ZiF4/lTWqKRWuhlkP4auhVY4eqdAKj5syPx45ggpjkVE0p8hAPDZYg==" + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-hermes-compiler/-/metro-hermes-compiler-0.72.4.tgz", + "integrity": "sha512-AY1mAT5FKfDRYCthuKo2XHbuhG5TUV4ZpZlJ8peIgkiWICzfy0tau3yu+3jUD456N90CjMCOmdknji4uKiZ8ww==" }, "node_modules/metro-inspector-proxy": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.72.3.tgz", - "integrity": "sha512-UPFkaq2k93RaOi+eqqt7UUmqy2ywCkuxJLasQ55+xavTUS+TQSyeTnTczaYn+YKw+izLTLllGcvqnQcZiWYhGw==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.72.4.tgz", + "integrity": "sha512-pr+PsbNCZaStWuJRH8oclT170B7NxfgH+UUyTf9/aR+7PjX0gdDabJhPyzA633QgR+EFBaQKZuetHA+f5/cnEQ==", "dependencies": { "connect": "^3.6.5", "debug": "^2.2.0", @@ -11910,9 +12393,9 @@ } }, "node_modules/metro-minify-uglify": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.72.3.tgz", - "integrity": "sha512-dPXqtMI8TQcj0g7ZrdhC8X3mx3m3rtjtMuHKGIiEXH9CMBvrET8IwrgujQw2rkPcXiSiX8vFDbGMIlfxefDsKA==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.72.4.tgz", + "integrity": "sha512-84Rrgie3O7Dqkak9ep/eIpMZkEFzpKD4bngPUNimYqAMCExKL7/aymydB27gKcqwus/BVkAV+aOnFsuOhlgnQg==", "dependencies": { "uglify-es": "^3.1.9" } @@ -11983,10 +12466,21 @@ "@babel/core": "*" } }, - "node_modules/metro-resolver": { + "node_modules/metro-react-native-babel-transformer/node_modules/metro-babel-transformer": { "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.72.3.tgz", - "integrity": "sha512-wu9zSMGdxpKmfECE7FtCdpfC+vrWGTdVr57lDA0piKhZV6VN6acZIvqQ1yZKtS2WfKsngncv5VbB8Y5eHRQP3w==", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.72.3.tgz", + "integrity": "sha512-PTOR2zww0vJbWeeM3qN90WKENxCLzv9xrwWaNtwVlhcV8/diNdNe82sE1xIxLFI6OQuAVwNMv1Y7VsO2I7Ejrw==", + "dependencies": { + "@babel/core": "^7.14.0", + "hermes-parser": "0.8.0", + "metro-source-map": "0.72.3", + "nullthrows": "^1.1.1" + } + }, + "node_modules/metro-resolver": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.72.4.tgz", + "integrity": "sha512-aHxq/jypzGyi9Ic9woe//RymfxpzWliAkyTmBWPHE9ypGoiobstK0me2j5XuSfzASzCU8wcVt20qy870rxTWLw==", "dependencies": { "absolute-path": "^0.0.0" } @@ -12015,15 +12509,7 @@ "vlq": "^1.0.0" } }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-symbolicate": { + "node_modules/metro-source-map/node_modules/metro-symbolicate": { "version": "0.72.3", "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.72.3.tgz", "integrity": "sha512-eXG0NX2PJzJ/jTG4q5yyYeN2dr1cUqUaY7worBB0SP5bRWRc3besfb+rXwfh49wTFiL5qR0oOawkU4ZiD4eHXw==", @@ -12042,6 +12528,53 @@ "node": ">=8.3" } }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.72.4.tgz", + "integrity": "sha512-6ZRo66Q4iKiwaQuHjmogkSCCqaSpJ4QzbHsVHRUe57mFIL34lOLYp7aPfmX7NHCmy061HhDox/kGuYZQRmHB3A==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.72.4", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/metro-symbolicate/node_modules/metro-source-map": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.72.4.tgz", + "integrity": "sha512-P09aMDEPkLo6BM8VYYoTsH/2B1w6t+mrCwNcNJV1zE+57FPiU4fSBlSeM8G9YeYaezDTHimS2JlMozP+2r+trA==", + "dependencies": { + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.72.4", + "nullthrows": "^1.1.1", + "ob1": "0.72.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-symbolicate/node_modules/ob1": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.72.4.tgz", + "integrity": "sha512-/iPJKpXpVEZS0subUvjew4ept5LTBxj1hD20A4mAj9CJkGGPgvbBlfYtFEBubBkk4dv4Ef5lajsnRBYPxF74cQ==" + }, "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", @@ -12051,9 +12584,9 @@ } }, "node_modules/metro-transform-plugins": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.72.3.tgz", - "integrity": "sha512-D+TcUvCKZbRua1+qujE0wV1onZvslW6cVTs7dLCyC2pv20lNHjFr1GtW01jN2fyKR2PcRyMjDCppFd9VwDKnSg==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.72.4.tgz", + "integrity": "sha512-yxB4v/LxQkmN1rjyyeLiV4x+jwCmId4FTTxNrmTYoi0tFPtOBOeSwuqY08LjxZQMJdZOKXqj2bgIewqFXJEkGw==", "dependencies": { "@babel/core": "^7.14.0", "@babel/generator": "^7.14.0", @@ -12063,25 +12596,53 @@ } }, "node_modules/metro-transform-worker": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.72.3.tgz", - "integrity": "sha512-WsuWj9H7i6cHuJuy+BgbWht9DK5FOgJxHLGAyULD5FJdTG9rSMFaHDO5WfC0OwQU5h4w6cPT40iDuEGksM7+YQ==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.72.4.tgz", + "integrity": "sha512-mIvzy6nRQKMALEdF5g8LXPgCOUi/tGESE5dlb7OSMCj2FAFBm3mTLRrpW5phzK/J6Wg+4Vb9PMS+wGbXR261rA==", "dependencies": { "@babel/core": "^7.14.0", "@babel/generator": "^7.14.0", "@babel/parser": "^7.14.0", "@babel/types": "^7.0.0", "babel-preset-fbjs": "^3.4.0", - "metro": "0.72.3", - "metro-babel-transformer": "0.72.3", - "metro-cache": "0.72.3", - "metro-cache-key": "0.72.3", - "metro-hermes-compiler": "0.72.3", - "metro-source-map": "0.72.3", - "metro-transform-plugins": "0.72.3", + "metro": "0.72.4", + "metro-babel-transformer": "0.72.4", + "metro-cache": "0.72.4", + "metro-cache-key": "0.72.4", + "metro-hermes-compiler": "0.72.4", + "metro-source-map": "0.72.4", + "metro-transform-plugins": "0.72.4", "nullthrows": "^1.1.1" } }, + "node_modules/metro-transform-worker/node_modules/metro-source-map": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.72.4.tgz", + "integrity": "sha512-P09aMDEPkLo6BM8VYYoTsH/2B1w6t+mrCwNcNJV1zE+57FPiU4fSBlSeM8G9YeYaezDTHimS2JlMozP+2r+trA==", + "dependencies": { + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.72.4", + "nullthrows": "^1.1.1", + "ob1": "0.72.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "node_modules/metro-transform-worker/node_modules/ob1": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.72.4.tgz", + "integrity": "sha512-/iPJKpXpVEZS0subUvjew4ept5LTBxj1hD20A4mAj9CJkGGPgvbBlfYtFEBubBkk4dv4Ef5lajsnRBYPxF74cQ==" + }, + "node_modules/metro-transform-worker/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==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/metro/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -12166,11 +12727,89 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/metro/node_modules/metro-react-native-babel-preset": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.72.4.tgz", + "integrity": "sha512-YGCVaYe1H5fOFktdDdL9IwAyiXjPh1t2eZZFp3KFJak6fxKpN+q5PPhe1kzMa77dbCAqgImv43zkfGa6i27eyA==", + "dependencies": { + "@babel/core": "^7.14.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.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.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.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-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-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/metro/node_modules/metro-runtime": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.72.4.tgz", + "integrity": "sha512-EA0ltqyYFpjOdpoRqE2U9FJleqTOIK+ZLRlLaDrx4yz3zTqUZ16W6w71dq+qrwD8BPg7bPKQu7RluU3K6tI79A==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "node_modules/metro/node_modules/metro-source-map": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.72.4.tgz", + "integrity": "sha512-P09aMDEPkLo6BM8VYYoTsH/2B1w6t+mrCwNcNJV1zE+57FPiU4fSBlSeM8G9YeYaezDTHimS2JlMozP+2r+trA==", + "dependencies": { + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.72.4", + "nullthrows": "^1.1.1", + "ob1": "0.72.4", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, "node_modules/metro/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/metro/node_modules/ob1": { + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.72.4.tgz", + "integrity": "sha512-/iPJKpXpVEZS0subUvjew4ept5LTBxj1hD20A4mAj9CJkGGPgvbBlfYtFEBubBkk4dv4Ef5lajsnRBYPxF74cQ==" + }, "node_modules/metro/node_modules/serialize-error": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", @@ -13992,20 +14631,41 @@ "react": ">=17.0.0" } }, + "node_modules/react-i18next": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.0.5.tgz", + "integrity": "sha512-5+bQSeEtgJrMBABBL5lO7jPdSNAbeAZ+MlFWDw//7FnVacuVu3l9EeWFzBQvZsKy+cihkbThWOAThEdH8YjGEw==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-native": { - "version": "0.70.5", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.70.5.tgz", - "integrity": "sha512-5NZM80LC3L+TIgQX/09yiyy48S73wMgpIgN5cCv3XTMR394+KpDI3rBZGH4aIgWWuwijz31YYVF5504+9n2Zfw==", + "version": "0.70.8", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.70.8.tgz", + "integrity": "sha512-O3ONJed9W/VEEVWsbZcwyMDhnEvw7v9l9enqWqgbSGLzHfh6HeIGMCNmjz+kRsHnC7AiF47fupWfgYX7hNnhoQ==", "dependencies": { - "@jest/create-cache-key-function": "^29.0.3", - "@react-native-community/cli": "9.2.1", - "@react-native-community/cli-platform-android": "9.2.1", - "@react-native-community/cli-platform-ios": "9.2.1", + "@jest/create-cache-key-function": "^27.0.1", + "@react-native-community/cli": "9.3.2", + "@react-native-community/cli-platform-android": "9.3.1", + "@react-native-community/cli-platform-ios": "9.3.0", "@react-native/assets": "1.0.0", "@react-native/normalize-color": "2.0.0", "@react-native/polyfills": "2.0.0", @@ -14022,7 +14682,7 @@ "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", "pretty-format": "^26.5.2", - "promise": "^8.0.3", + "promise": "^8.3.0", "react-devtools-core": "4.24.0", "react-native-codegen": "^0.70.6", "react-native-gradle-plugin": "^0.70.3", @@ -15047,9 +15707,9 @@ "dev": true }, "node_modules/slugify": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.5.tgz", - "integrity": "sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", "engines": { "node": ">=8.0.0" } @@ -15644,10 +16304,11 @@ } }, "node_modules/sucrase": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.30.0.tgz", - "integrity": "sha512-7d37d3vLF0IeH2dzvHpzDNDxUqpbDHJXTJOAnQ8jvMW04o2Czps6mxtaSnKWpE+hUS/eczqfWPUgQTrazKZPnQ==", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "7.1.6", "lines-and-columns": "^1.1.6", @@ -16541,6 +17202,14 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==" }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -16613,9 +17282,9 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, "node_modules/which-pm-runs": { "version": "1.1.0", diff --git a/RiderApp/package.json b/RiderApp/package.json index 4c30ab2..014d24f 100644 --- a/RiderApp/package.json +++ b/RiderApp/package.json @@ -55,9 +55,11 @@ "graphql": "^14.3.1", "graphql-tag": "^2.10.1", "i18n-js": "^3.3.0", + "i18next": "^23.8.2", "patch-package": "^6.5.1", "react": "18.1.0", "react-apollo": "^2.5.8", + "react-i18next": "^14.0.5", "react-native": "0.70.8", "react-native-animatable": "^1.3.2", "react-native-flash-message": "^0.1.13", diff --git a/RiderApp/src/components/AssignedOrders/AssignedOrders.js b/RiderApp/src/components/AssignedOrders/AssignedOrders.js index 835d1b3..5b11be8 100644 --- a/RiderApp/src/components/AssignedOrders/AssignedOrders.js +++ b/RiderApp/src/components/AssignedOrders/AssignedOrders.js @@ -1,35 +1,36 @@ -import React, { useContext } from 'react' -import { FlatList } from 'react-native' -import Spinner from '../Spinner/Spinner' -import Order from '../Order/Order' -import ConfigurationContext from '../../context/configuration' -import UserContext from '../../context/user' -import TextError from '../Text/TextError/TextError' -import { useNavigation } from '@react-navigation/native' -import { verticalScale } from '../../utilities/scaling' -import i18n from '../../../i18n' +import React, { useContext } from "react"; +import { FlatList } from "react-native"; +import Spinner from "../Spinner/Spinner"; +import Order from "../Order/Order"; +import ConfigurationContext from "../../context/configuration"; +import UserContext from "../../context/user"; +import TextError from "../Text/TextError/TextError"; +import { useNavigation } from "@react-navigation/native"; +import { verticalScale } from "../../utilities/scaling"; +import { useTranslation } from "react-i18next"; export default function Orders() { - const navigation = useNavigation() - const configuration = useContext(ConfigurationContext) + const { t } = useTranslation(); + const navigation = useNavigation(); + const configuration = useContext(ConfigurationContext); const { loadingAssigned, errorAssigned, assignedOrders, refetchAssigned, - networkStatusAssigned - } = useContext(UserContext) + networkStatusAssigned, + } = useContext(UserContext); - if (loadingAssigned) return - if (errorAssigned) return + if (loadingAssigned) return ; + if (errorAssigned) return ; function emptyView() { - return + return ; } return ( item._id} + keyExtractor={(item) => item._id} data={assignedOrders.length > 0 ? assignedOrders.slice().reverse() : []} refreshing={networkStatusAssigned === 4} onRefresh={() => refetchAssigned()} @@ -45,13 +46,13 @@ export default function Orders() { orderDatetime={item.createdAt} paymentMethod={item.payment_method} onPress={() => { - navigation.navigate('OrderDetail', { + navigation.navigate("OrderDetail", { id: item._id, - orderId: item.order_id - }) + orderId: item.order_id, + }); }} /> )} /> - ) + ); } diff --git a/RiderApp/src/components/NewOrders/NewOrders.js b/RiderApp/src/components/NewOrders/NewOrders.js index 8431cc4..f3b2c13 100644 --- a/RiderApp/src/components/NewOrders/NewOrders.js +++ b/RiderApp/src/components/NewOrders/NewOrders.js @@ -7,9 +7,10 @@ import UserContext from '../../context/user' import TextError from '../Text/TextError/TextError' import { useNavigation } from '@react-navigation/native' import { verticalScale } from '../../utilities/scaling' -import i18n from '../../../i18n' +import { useTranslation } from "react-i18next"; export default function Orders() { + const { t } = useTranslation(); const navigation = useNavigation() const configuration = useContext(ConfigurationContext) const { @@ -21,11 +22,11 @@ export default function Orders() { } = useContext(UserContext) function emptyView() { - return + return } if (loadingUnAssigned) return - if (errorUnAssigned) return + if (errorUnAssigned) return return ( { const obj = orderStatuses.filter(x => { return x.key === status @@ -60,7 +60,7 @@ function Order(props) { numberOfLines={2} bold textColor={colors.placeHolderColor}> - {i18n.t('YourOrderID')} + {t('YourOrderID')} {props.orderId} @@ -77,7 +77,7 @@ function Order(props) { bold uppercase style={{ ...alignment.PLxSmall, ...alignment.PRxSmall }}> - {i18n.t(props.orderStatus)} + {t(props.orderStatus)} @@ -100,19 +100,19 @@ function Order(props) { style={alignment.MTmedium} textColor={colors.placeHolderColor} bold> - {i18n.t('totalOrderAmount')} + {t('totalOrderAmount')} - {i18n.t('paymentMethod')} + {t('paymentMethod')} - {i18n.t('deliveryTime')} + {t('deliveryTime')} @@ -140,14 +140,14 @@ function Order(props) { {/* - Your {i18n.t('orderId')} + Your {t('orderId')} {props.orderId} */} {/* - {i18n.t('totalOrderAmount')} - {props.orderAmount} + {t('totalOrderAmount')} - {props.orderAmount} - if (error) return + const { t } = useTranslation(); + const { data, loading, error } = useQuery(PROFILE); + if (loading) return ; + if (error) return ; return ( @@ -31,14 +32,14 @@ function Profile() { - {i18n.t('welcome')} + {t("welcome")} {data.rider.username} - ) + ); } -export default Profile +export default Profile; diff --git a/RiderApp/src/components/Sidebar/Sidebar.js b/RiderApp/src/components/Sidebar/Sidebar.js index 684be34..0994aa9 100644 --- a/RiderApp/src/components/Sidebar/Sidebar.js +++ b/RiderApp/src/components/Sidebar/Sidebar.js @@ -1,7 +1,7 @@ import PropTypes from 'prop-types' import React, { useContext } from 'react' import { Platform, View } from 'react-native' -import i18n from '../../../i18n' +import { useTranslation } from "react-i18next"; import { AuthContext } from '../../context/auth' import { NAVIGATION_SCREEN } from '../../utilities/constant' import NavItem from './NavItem/NavItem' @@ -40,6 +40,7 @@ const datas = [ ] function SidebBar({ navigation }) { + const { t } = useTranslation(); const { logout } = useContext(AuthContext) // if (loading) return @@ -64,7 +65,7 @@ function SidebBar({ navigation }) { } }} icon={data.icon} - title={i18n.t(data.title)} + title={t(data.title)} /> ) @@ -78,7 +79,7 @@ function SidebBar({ navigation }) { navigation.closeDrawer() }} icon={'sign-out'} - title={i18n.t('titleLogout')} + title={t('titleLogout')} /> diff --git a/RiderApp/src/screens/Chat/Chat.js b/RiderApp/src/screens/Chat/Chat.js index b4e0192..1e82a06 100644 --- a/RiderApp/src/screens/Chat/Chat.js +++ b/RiderApp/src/screens/Chat/Chat.js @@ -1,91 +1,97 @@ -import { Feather, FontAwesome } from '@expo/vector-icons' -import { useNavigation } from '@react-navigation/native' -import React, { useCallback, useEffect, useState, useLayoutEffect } from 'react' -import { Keyboard, View } from 'react-native' +import { Feather, FontAwesome } from "@expo/vector-icons"; +import { useNavigation } from "@react-navigation/native"; +import React, { + useCallback, + useEffect, + useState, + useLayoutEffect, +} from "react"; +import { Keyboard, View } from "react-native"; import { Bubble, GiftedChat, InputToolbar, - Send -} from 'react-native-gifted-chat' -import { MainWrapper, TextDefault } from '../../components' -import { alignment } from '../../utilities/alignment' -import colors from '../../utilities/colors' -import { scale } from '../../utilities/scaling' -import useStyle from './styles' -import i18n from '../../../i18n' + Send, +} from "react-native-gifted-chat"; +import { MainWrapper, TextDefault } from "../../components"; +import { alignment } from "../../utilities/alignment"; +import colors from "../../utilities/colors"; +import { scale } from "../../utilities/scaling"; +import useStyle from "./styles"; +import { useTranslation } from "react-i18next"; const UserInfo = { _id: 1, - name: 'Jason', - active: true -} + name: "Jason", + active: true, +}; function Chat() { - const styles = useStyle() - const navigation = useNavigation() - const [messages, setMessages] = useState([]) - const [isTyping, setIsTyping] = useState(false) + const { t } = useTranslation(); + const styles = useStyle(); + const navigation = useNavigation(); + const [messages, setMessages] = useState([]); + const [isTyping, setIsTyping] = useState(false); useEffect(() => { - Keyboard.addListener('keyboardDidShow', _keyboardDidShow) - Keyboard.addListener('keyboardDidHide', _keyboardDidHide) + Keyboard.addListener("keyboardDidShow", _keyboardDidShow); + Keyboard.addListener("keyboardDidHide", _keyboardDidHide); // cleanup function return () => { - Keyboard.removeListener('keyboardDidShow', _keyboardDidShow) - Keyboard.removeListener('keyboardDidHide', _keyboardDidHide) - } - }, []) + Keyboard.removeListener("keyboardDidShow", _keyboardDidShow); + Keyboard.removeListener("keyboardDidHide", _keyboardDidHide); + }; + }, []); - const _keyboardDidShow = () => setIsTyping(true) - const _keyboardDidHide = () => setIsTyping(false) + const _keyboardDidShow = () => setIsTyping(true); + const _keyboardDidHide = () => setIsTyping(false); useEffect(() => { navigation.setOptions({ - headerTitle: i18n.t('titleChat') - }) + headerTitle: t("titleChat"), + }); setMessages([ { _id: 1, - text: 'How can I help you?', + text: "How can I help you?", sent: true, received: true, createdAt: new Date(), user: { _id: 2, - name: 'React Native', - avatar: 'https://placeimg.com/140/140/any' - } - } - ]) - }, [navigation]) + name: "React Native", + avatar: "https://placeimg.com/140/140/any", + }, + }, + ]); + }, [navigation]); const onSend = useCallback((messages = []) => { - setMessages(previousMessages => + setMessages((previousMessages) => GiftedChat.append(previousMessages, messages) - ) - }, []) + ); + }, []); - const renderBubble = props => { + const renderBubble = (props) => { return ( - ) - } + ); + }; - const renderSend = props => ( + const renderSend = (props) => ( - ) - const customtInputToolbar = props => { + ); + const customtInputToolbar = (props) => { return ( - ) - } + ); + }; return ( @@ -167,7 +173,7 @@ function Chat() { color={UserInfo.active ? colors.iconPink : colors.fontSecondColor} /> - {UserInfo.active ? UserInfo.name : 'Offline'} + {UserInfo.active ? UserInfo.name : "Offline"} onSend(messages)} + onSend={(messages) => onSend(messages)} renderAvatar={() => null} renderBubble={renderBubble} renderInputToolbar={customtInputToolbar} @@ -193,20 +199,20 @@ function Chat() { // } timeTextStyle={{ left: { - width: '100%', + width: "100%", color: colors.fontMainColor, fontSize: 11, - textAlign: 'right' + textAlign: "right", }, right: { color: colors.fontMainColor, - fontSize: 11 - } + fontSize: 11, + }, }} /> - ) + ); } -export default Chat +export default Chat; diff --git a/RiderApp/src/screens/Help/Help.js b/RiderApp/src/screens/Help/Help.js index 2a0c80d..2e6b600 100644 --- a/RiderApp/src/screens/Help/Help.js +++ b/RiderApp/src/screens/Help/Help.js @@ -1,36 +1,39 @@ -import { AntDesign } from '@expo/vector-icons' -import { useNavigation } from '@react-navigation/native' -import React, { useLayoutEffect } from 'react' -import { TouchableOpacity, View } from 'react-native' -import i18n from '../../../i18n' -import { MainWrapper, TextDefault } from '../../components' -import colors from '../../utilities/colors' -import { scale, verticalScale } from '../../utilities/scaling' -import styles from './styles' +import { AntDesign } from "@expo/vector-icons"; +import { useNavigation } from "@react-navigation/native"; +import React, { useLayoutEffect } from "react"; +import { TouchableOpacity, View } from "react-native"; +import { useTranslation } from "react-i18next"; +import { MainWrapper, TextDefault } from "../../components"; +import colors from "../../utilities/colors"; +import { scale, verticalScale } from "../../utilities/scaling"; +import styles from "./styles"; const links = [ { - title: 'Product Page', - url: - 'https://enatega.com/enatega-single-vendor/' + title: "Product Page", + url: "https://enatega.com/enatega-single-vendor/", }, - { title: 'Docs', url: 'https://enatega.com/docs/enatega-singlevendor-rider-app-introduction/' }, { - title: 'Blog', + title: "Docs", url: - 'https://enatega.com/blog/' + "https://enatega.com/docs/enatega-singlevendor-rider-app-introduction/", }, - { title: 'About Us', url: 'https://ninjascode.com/our-team/' } -] + { + title: "Blog", + url: "https://enatega.com/blog/", + }, + { title: "About Us", url: "https://ninjascode.com/our-team/" }, +]; function Help() { - const navigation = useNavigation() + const { t } = useTranslation(); + const navigation = useNavigation(); useLayoutEffect(() => { navigation.setOptions({ headerRight: null, - headerTitle: i18n.t('titleHelp') - }) - }, [navigation]) + headerTitle: t("titleHelp"), + }); + }, [navigation]); return ( @@ -38,17 +41,18 @@ function Help() { {links.map(({ title, url }, index) => ( navigation.navigate('HelpBrowser', { title, url })} + onPress={() => navigation.navigate("HelpBrowser", { title, url })} style={styles.itemContainer} - key={index}> + key={index} + > - {i18n.t(title)} + {t(title)} ))} - ) + ); } -export default Help +export default Help; diff --git a/RiderApp/src/screens/HelpBrowser/HelpBrowser.js b/RiderApp/src/screens/HelpBrowser/HelpBrowser.js index c53bd0e..99a69e7 100644 --- a/RiderApp/src/screens/HelpBrowser/HelpBrowser.js +++ b/RiderApp/src/screens/HelpBrowser/HelpBrowser.js @@ -1,20 +1,21 @@ -import { useNavigation, useRoute } from '@react-navigation/native' -import React, { useLayoutEffect } from 'react' -import { WebView } from 'react-native-webview' -import { MainWrapper, Spinner } from '../../components' -import i18n from '../../../i18n' +import { useNavigation, useRoute } from "@react-navigation/native"; +import React, { useLayoutEffect } from "react"; +import { WebView } from "react-native-webview"; +import { MainWrapper, Spinner } from "../../components"; +import { useTranslation } from "react-i18next"; function HelpBrowser() { - const navigation = useNavigation() - const route = useRoute() - const { title, url } = route.params + const { t } = useTranslation(); + const navigation = useNavigation(); + const route = useRoute(); + const { title, url } = route.params; useLayoutEffect(() => { navigation.setOptions({ headerRight: null, - headerTitle: i18n.t(title) - }) - }, [navigation]) + headerTitle: t(title), + }); + }, [navigation]); return ( @@ -24,7 +25,7 @@ function HelpBrowser() { renderLoading={() => } /> - ) + ); } -export default HelpBrowser +export default HelpBrowser; diff --git a/RiderApp/src/screens/Language/Language.js b/RiderApp/src/screens/Language/Language.js index 24b15ff..4665957 100644 --- a/RiderApp/src/screens/Language/Language.js +++ b/RiderApp/src/screens/Language/Language.js @@ -1,68 +1,75 @@ -import AsyncStorage from '@react-native-async-storage/async-storage' -import { useNavigation } from '@react-navigation/native' -import * as Localization from 'expo-localization' -import * as Updates from 'expo-updates' -import React, { useEffect, useLayoutEffect, useState } from 'react' -import { Platform, TouchableOpacity, View } from 'react-native' -import i18n from '../../../i18n' -import { MainWrapper } from '../../components' -import RadioButton from '../../components/FdRadioBtn/RadioBtn' -import TextDefault from '../../components/Text/TextDefault/TextDefault' -import { alignment } from '../../utilities/alignment' -import colors from '../../utilities/colors' -import { scale } from '../../utilities/scaling' -import styles from './styles' +import AsyncStorage from "@react-native-async-storage/async-storage"; +import { useNavigation } from "@react-navigation/native"; +import * as Localization from "expo-localization"; +import * as Updates from "expo-updates"; +import React, { useEffect, useLayoutEffect, useState } from "react"; +import { TouchableOpacity, View, ActivityIndicator } from "react-native"; +import i18n from "../../../i18next"; +import { useTranslation } from "react-i18next"; +import { MainWrapper } from "../../components"; +import RadioButton from "../../components/FdRadioBtn/RadioBtn"; +import TextDefault from "../../components/Text/TextDefault/TextDefault"; +import { alignment } from "../../utilities/alignment"; +import colors from "../../utilities/colors"; +import { scale } from "../../utilities/scaling"; +import styles from "./styles"; const languageTypes = [ - { value: 'English', code: 'en', index: 0 }, - { value: 'français', code: 'fr', index: 1 }, - { value: 'ភាសាខ្មែរ', code: 'km', index: 2 }, - { value: '中文', code: 'zh', index: 3 }, - { value: 'Deutsche', code: 'de', index: 4 }, - { value: 'Arabic', code: 'ar', index: 5 } -] + { value: "English", code: "en", index: 0 }, + { value: "français", code: "fr", index: 1 }, + { value: "ភាសាខ្មែរ", code: "km", index: 2 }, + { value: "中文", code: "zh", index: 3 }, + { value: "Deutsche", code: "de", index: 4 }, + { value: "Arabic", code: "ar", index: 5 }, +]; function Language() { - const navigation = useNavigation() - const [activeRadio, setActiveRadio] = useState(languageTypes[0].index) - // eslint-disable-next-line no-unused-vars - const [languageName, languageNameSetter] = useState('English') + const { t } = useTranslation(); + const navigation = useNavigation(); + const [activeRadio, setActiveRadio] = useState(languageTypes[0].index); + const [languageName, languageNameSetter] = useState("English"); + const [loadinglang, setLoadingLang] = useState(false); useLayoutEffect(() => { navigation.setOptions({ - title: i18n.t('titleLanguage') - }) - }, [navigation]) + title: t("titleLanguage"), + }); + }, [t, navigation]); useEffect(() => { - selectedLanguageFunc() - }, []) + selectedLanguageFunc(); + }, []); async function selectedLanguageFunc() { - const lang = await AsyncStorage.getItem('enatega-language') + const lang = await AsyncStorage.getItem("enatega-language"); if (lang) { - const defLang = languageTypes.findIndex(el => el.code === lang) - const langName = languageTypes[defLang].value - setActiveRadio(defLang) - languageNameSetter(langName) + const defLang = languageTypes.findIndex((el) => el.code === lang); + const langName = languageTypes[defLang].value; + setActiveRadio(defLang); + languageNameSetter(langName); } } async function onSelectedLanguage() { - const languageInd = activeRadio - - if (Platform.OS === 'android') { - const localization = await Localization.getLocalizationAsync() - localization.locale = languageTypes[languageInd].code + try { + setLoadingLang(true); + const languageInd = activeRadio; await AsyncStorage.setItem( - 'enatega-language', + "enatega-language", languageTypes[languageInd].code - ) - try { - Updates.reloadAsync() - } catch (error) { - console.log('err', error) + ); + var lang = await AsyncStorage.getItem("enatega-language"); + if (lang) { + const defLang = languageTypes.findIndex((el) => el.code === lang); + const langName = languageTypes[defLang].value; + languageNameSetter(langName); } + i18n.changeLanguage(lang); + //modalVisibleSetter(false); + } catch (error) { + console.error("Error during language selection:", error); + } finally { + setLoadingLang(false); } } @@ -75,7 +82,8 @@ function Language() { activeOpacity={0.7} key={index} onPress={() => setActiveRadio(item.index)} - style={[styles.radioContainer]}> + style={[styles.radioContainer]} + > + style={alignment.MLsmall} + > {item.value} onSelectedLanguage()} style={{ backgroundColor: colors.tagColor, - width: '72%', + width: "72%", borderRadius: scale(10), - alignSelf: 'center', - alignItems: 'center', + alignSelf: "center", + alignItems: "center", height: scale(40), - justifyContent: 'center' - }}> + justifyContent: "center", + }} + > - {i18n.t('Done')} + {t("Done")} navigation.goBack()} style={{ - width: '72%', - alignSelf: 'center', - alignItems: 'center', + width: "72%", + alignSelf: "center", + alignItems: "center", height: scale(40), - justifyContent: 'center' - }}> + justifyContent: "center", + }} + > - {i18n.t('Cancel')} + {t("Cancel")} + {loadinglang && ( + + + + )} - ) + ); } -export default Language +export default Language; diff --git a/RiderApp/src/screens/Language/languageContext.js b/RiderApp/src/screens/Language/languageContext.js new file mode 100644 index 0000000..78f02a0 --- /dev/null +++ b/RiderApp/src/screens/Language/languageContext.js @@ -0,0 +1,16 @@ +// LanguageContext.js +import React, { createContext, useState, useContext } from 'react'; + +const LanguageContext = createContext(); + +export const LanguageProvider = ({ children }) => { + const [selectedLanguage, setSelectedLanguage] = useState("en"); + + return ( + + {children} + + ); +}; + +export const useLanguage = () => useContext(LanguageContext); \ No newline at end of file diff --git a/RiderApp/src/screens/Login/Login.js b/RiderApp/src/screens/Login/Login.js index c37874b..1c82900 100644 --- a/RiderApp/src/screens/Login/Login.js +++ b/RiderApp/src/screens/Login/Login.js @@ -1,114 +1,117 @@ -import { useMutation } from '@apollo/react-hooks' -import AsyncStorage from '@react-native-async-storage/async-storage' -import { useNavigation } from '@react-navigation/native' -import Constants from 'expo-constants' -import * as Notifications from 'expo-notifications' -import gql from 'graphql-tag' -import React, { useContext, useEffect, useState,useLayoutEffect } from 'react' +import { useMutation } from "@apollo/react-hooks"; +import AsyncStorage from "@react-native-async-storage/async-storage"; +import { useNavigation } from "@react-navigation/native"; +import Constants from "expo-constants"; +import * as Notifications from "expo-notifications"; +import gql from "graphql-tag"; +import React, { useContext, useEffect, useState, useLayoutEffect } from "react"; import { KeyboardAvoidingView, Platform, ScrollView, TouchableOpacity, - View -} from 'react-native' -import { FilledTextField } from 'react-native-material-textfield' -import Logo from '../../../assets/images/Svg/Logo' -import i18n from '../../../i18n' -import { riderLogin } from '../../apollo/mutations' -import { Spinner, TextDefault, WrapperView } from '../../components' -import { FlashMessage } from '../../components/FlashMessage/FlashMessage' -import { AuthContext } from '../../context/auth' -import { alignment } from '../../utilities/alignment' -import colors from '../../utilities/colors' -import { scale } from '../../utilities/scaling' -import useStyle from './styles' + View, +} from "react-native"; +import { FilledTextField } from "react-native-material-textfield"; +import Logo from "../../../assets/images/Svg/Logo"; +import { useTranslation } from "react-i18next"; +import { riderLogin } from "../../apollo/mutations"; +import { Spinner, TextDefault, WrapperView } from "../../components"; +import { FlashMessage } from "../../components/FlashMessage/FlashMessage"; +import { AuthContext } from "../../context/auth"; +import { alignment } from "../../utilities/alignment"; +import colors from "../../utilities/colors"; +import { scale } from "../../utilities/scaling"; +import useStyle from "./styles"; const RIDER_LOGIN = gql` ${riderLogin} -` +`; export default function Login() { - const styles = useStyle() - const navigation = useNavigation() - const [username, setUsername] = useState('rider') - const [password, setPassword] = useState('123123') - const [usernameError, setUsernameError] = useState('') - const [passwordError, setPasswordError] = useState('') + const { t } = useTranslation(); + const styles = useStyle(); + const navigation = useNavigation(); + const [username, setUsername] = useState("rider"); + const [password, setPassword] = useState("123123"); + const [usernameError, setUsernameError] = useState(""); + const [passwordError, setPasswordError] = useState(""); - const { setTokenAsync } = useContext(AuthContext) + const { setTokenAsync } = useContext(AuthContext); - - useLayoutEffect(() => { + useLayoutEffect(() => { navigation.setOptions({ headerRight: null, - headerTitle: i18n.t('titleHelp') - }) - }, [navigation]) + headerTitle: t("titleHelp"), + }); + }, [navigation]); const [mutate, { loading }] = useMutation(RIDER_LOGIN, { onCompleted, - onError - }) + onError, + }); function validateForm() { - let res = true - setUsernameError('') - setPasswordError('') + let res = true; + setUsernameError(""); + setPasswordError(""); if (!username) { - setUsernameError(i18n.t('Usernameisrequired')) - res = false + setUsernameError(t("Usernameisrequired")); + res = false; } if (!password) { - setPasswordError(i18n.t('Passwordisrequired')) - res = false + setPasswordError(t("Passwordisrequired")); + res = false; } - return res + return res; } async function onCompleted(data) { FlashMessage({ - message: i18n.t('Loggedin') - }) - await AsyncStorage.setItem('rider-id', data.riderLogin.userId) - setTokenAsync(data.riderLogin.token) + message: t("Loggedin"), + }); + await AsyncStorage.setItem("rider-id", data.riderLogin.userId); + setTokenAsync(data.riderLogin.token); } function onError({ networkError, graphQLErrors }) { - console.log('errors', networkError, graphQLErrors) - let message = '' + console.log("errors", networkError, graphQLErrors); + let message = ""; if (!!graphQLErrors && graphQLErrors.length) { - message = graphQLErrors[0].message + message = graphQLErrors[0].message; } if (!!networkError) { - message = networkError.result.errors[0].message + message = networkError.result.errors[0].message; } FlashMessage({ - message: message - }) + message: message, + }); } return ( + behavior={Platform.OS === "ios" ? "padding" : "height"} + style={styles.flex} + > + contentContainerStyle={styles.scrollContent} + > - {i18n.t('EnteryourEmailandPassword')} + textColor={colors.placeHolderColor} + > + {t("EnteryourEmailandPassword")} { - setUsername(text.toLowerCase().trim()) + onChangeText={(text) => { + setUsername(text.toLowerCase().trim()); }} /> { - setPassword(text.trim()) + onChangeText={(text) => { + setPassword(text.trim()); }} /> @@ -151,30 +154,31 @@ export default function Login() { { if (validateForm()) { - let notificationToken = null + let notificationToken = null; if (Constants.isDevice) { const { - status: existingStatus - } = await Notifications.getPermissionsAsync() - if (existingStatus === 'granted') { + status: existingStatus, + } = await Notifications.getPermissionsAsync(); + if (existingStatus === "granted") { notificationToken = ( await Notifications.getExpoPushTokenAsync() - ).data + ).data; } } mutate({ variables: { username: username.toLowerCase(), password: password, - notificationToken - } - }) + notificationToken, + }, + }); } }} activeOpacity={0.5} - style={[styles.RContainer]}> + style={[styles.RContainer]} + > - {i18n.t('loginBtn')} + {t("loginBtn")} )} @@ -184,5 +188,5 @@ export default function Login() { - ) + ); } diff --git a/RiderApp/src/screens/NewOrders/NewOrders.js b/RiderApp/src/screens/NewOrders/NewOrders.js index 3225a61..29f11d3 100644 --- a/RiderApp/src/screens/NewOrders/NewOrders.js +++ b/RiderApp/src/screens/NewOrders/NewOrders.js @@ -6,9 +6,10 @@ import UserContext from '../../context/user' import styles from './style' import { TextError, Spinner } from '../../components' import { useNavigation } from '@react-navigation/native' -import i18n from '../../../i18n' +import { useTranslation } from "react-i18next"; export default function Orders() { + const { t } = useTranslation(); const navigation = useNavigation() const configuration = useContext(ConfigurationContext) const { @@ -20,11 +21,11 @@ export default function Orders() { } = useContext(UserContext) function emptyView() { - return + return } if (loadingUnAssigned) return - if (errorUnAssigned) return + if (errorUnAssigned) return return ( diff --git a/RiderApp/src/screens/OrderDetail/OrderDetail.js b/RiderApp/src/screens/OrderDetail/OrderDetail.js index fab3735..5d79128 100644 --- a/RiderApp/src/screens/OrderDetail/OrderDetail.js +++ b/RiderApp/src/screens/OrderDetail/OrderDetail.js @@ -20,7 +20,7 @@ import colors from "../../utilities/colors"; import { linkToMapsApp } from "../../utilities/links"; import { scale } from "../../utilities/scaling"; import styles from "./styles"; -import i18n from "../../../i18n"; +import { useTranslation } from "react-i18next"; const CONFIGURATION = gql` ${configuration} @@ -38,6 +38,7 @@ const LATITUDE_DELTA = 0.0022; const LONGITUDE_DELTA = 0.0021; function OrderDetail() { + const { t } = useTranslation(); const navigation = useNavigation(); const route = useRoute(); const { @@ -71,13 +72,15 @@ function OrderDetail() { useLayoutEffect(() => { if (!selectedOrder) return; navigation.setOptions({ - title: `${i18n.t('Order')} ${selectedOrder.order_id}`, + title: `${t("Order")} ${selectedOrder.order_id}`, }); }, [selectedOrder]); async function onCompleted({ updateOrderStatusRider, assignOrder }) { if (updateOrderStatusRider) { FlashMessage({ - message: `${i18n.t('OrderMarkedAs')} ${i18n.t(updateOrderStatusRider.order_status)}`, + message: `${t("OrderMarkedAs")} ${t( + updateOrderStatusRider.order_status + )}`, }); if (updateOrderStatusRider.order_status === "DELIVERED") { navigation.goBack(); @@ -173,18 +176,16 @@ function OrderDetail() { } if (loadingAssigned || loadingUnAssigned) { - return ; + return ; } if (loadingConfig) { return ; } if (errorConfig) { - return ; + return ; } if (!selectedOrder) { - return ( - - ); + return ; } return ( @@ -203,7 +204,7 @@ function OrderDetail() { textColor={colors.tagColor} style={{ ...alignment.PTxSmall, ...alignment.PBxSmall }} > - {i18n.t('CustomerDetails')} + {t("CustomerDetails")} @@ -215,7 +216,7 @@ function OrderDetail() { textColor={colors.placeHolderColor} style={{ ...alignment.PTxSmall, ...alignment.PBxSmall }} > - {i18n.t('name')} + {t("name")} {selectedOrder.user.name} @@ -229,7 +230,7 @@ function OrderDetail() { textColor={colors.placeHolderColor} style={{ ...alignment.PTxSmall, ...alignment.PBxSmall }} > - {i18n.t('Contact')} + {t("Contact")} {selectedOrder.user.phone} @@ -243,7 +244,7 @@ function OrderDetail() { textColor={colors.placeHolderColor} style={{ ...alignment.PTxSmall, ...alignment.PBxSmall }} > - {i18n.t('DelvieryLocation')} + {t("DelvieryLocation")} - {i18n.t('OrderDetails')} + {t("OrderDetails")} @@ -285,7 +286,7 @@ function OrderDetail() { bolder style={{ ...alignment.PTmedium, ...alignment.PLmedium }} > - {i18n.t('Subtotal')} + {t("Subtotal")} @@ -312,7 +313,7 @@ function OrderDetail() { bolder style={{ ...alignment.PLmedium }} > - {i18n.t('delvieryCharges')} + {t("delvieryCharges")} @@ -332,7 +333,7 @@ function OrderDetail() { - {i18n.t('total')} + {t("total")} @@ -424,7 +425,7 @@ function OrderDetail() { bold style={{ ...alignment.PTxSmall, ...alignment.PBxSmall }} > - {i18n.t('Assigntome')} + {t("Assigntome")} )} @@ -450,7 +451,7 @@ function OrderDetail() { bold style={{ ...alignment.PTxSmall, ...alignment.PBxSmall }} > - {i18n.t('Picked')} + {t("Picked")} )} @@ -469,7 +470,7 @@ function OrderDetail() { bold style={{ ...alignment.PTxSmall, ...alignment.PBxSmall }} > - {i18n.t('Delivered')} + {t("Delivered")} )} diff --git a/RiderApp/src/screens/OrderDetail/styles.js b/RiderApp/src/screens/OrderDetail/styles.js index b9dfbbb..f039eee 100644 --- a/RiderApp/src/screens/OrderDetail/styles.js +++ b/RiderApp/src/screens/OrderDetail/styles.js @@ -1,197 +1,198 @@ -import { Dimensions, StyleSheet } from 'react-native' -import { alignment } from '../../utilities/alignment' -import colors from '../../utilities/colors' -import { scale, verticalScale } from '../../utilities/scaling' -const { height } = Dimensions.get('window') +import { Dimensions, StyleSheet } from "react-native"; +import { alignment } from "../../utilities/alignment"; +import colors from "../../utilities/colors"; +import { scale, verticalScale } from "../../utilities/scaling"; +const { height } = Dimensions.get("window"); export default { flex: { flex: 1, - backgroundColor: colors.themeBackground + backgroundColor: colors.themeBackground, }, line: { - width: '80%', + width: "80%", height: StyleSheet.hairlineWidth, backgroundColor: colors.horizontalLine, - alignSelf: 'center', + alignSelf: "center", ...alignment.MTmedium, - ...alignment.MBmedium + ...alignment.MBmedium, }, customerCard: { - width: '100%', + width: "100%", height: height * 0.4, - justifyContent: 'center', - alignItems: 'center' + justifyContent: "center", + alignItems: "center", }, customerSubCard: { - width: '85%', - height: '90%', + width: "85%", + height: "90%", borderWidth: 2, - borderStyle: 'dashed', - backgroundColor: '#F3FAFE', + borderStyle: "dashed", + backgroundColor: "#F3FAFE", borderRadius: scale(10), - borderColor: colors.horizontalLine + borderColor: colors.horizontalLine, }, customerHeader: { - width: '100%', - height: '30%', - justifyContent: 'center', - alignItems: 'center' + width: "100%", + height: "30%", + justifyContent: "center", + alignItems: "center", }, customerContent: { flex: 1, - justifyContent: 'flex-start' + justifyContent: "flex-start", }, customerSubContent: { - width: '80%', - height: '95%', - justifyContent: 'space-around' + width: "80%", + height: "95%", + justifyContent: "space-around", }, customerContentRow: { - width: '100%', - height: '50%', - flexDirection: 'row', - paddingLeft: '8%' + width: "100%", + height: "50%", + flexDirection: "row", + paddingLeft: "8%", }, customerImgContainer: { - width: '20%', - height: '100%', - justifyContent: 'center', - alignItems: 'center' + width: "20%", + height: "100%", + justifyContent: "center", + alignItems: "center", }, customerTextContainer: { flex: 1, - justifyContent: 'center' + justifyContent: "center", }, customerAddContainer: { - justifyContent: 'center', - width: '90%' + flex: 1, + justifyContent: "center", + width: "90%", }, orderContainer: { - width: '100%', + width: "100%", flexGrow: 1, - justifyContent: 'center', - alignItems: 'center', + justifyContent: "center", + alignItems: "center", ...alignment.PTxSmall, - ...alignment.PBxSmall + ...alignment.PBxSmall, }, orderSubContainer: { - width: '85%', + width: "85%", minHeight: height * 0.3, borderWidth: 2, - borderStyle: 'dashed', + borderStyle: "dashed", borderRadius: scale(20), - backgroundColor: '#F3FAFE', - borderColor: colors.horizontalLine + backgroundColor: "#F3FAFE", + borderColor: colors.horizontalLine, }, orderHeader: { - width: '100%', + width: "100%", height: height * 0.08, - justifyContent: 'center', - alignItems: 'center' + justifyContent: "center", + alignItems: "center", }, orderContent: { - width: '100%', - alignItems: 'center' + width: "100%", + alignItems: "center", }, orderSubContent: { - width: '90%', - flexDirection: 'row' + width: "90%", + flexDirection: "row", }, orderTextLeftContainer: { - width: '10%', - justifyContent: 'center', - alignItems: 'center' + width: "10%", + justifyContent: "center", + alignItems: "center", }, orderTextCenterContainer: { - width: '65%', - justifyContent: 'center', - alignItems: 'flex-start' + width: "65%", + justifyContent: "center", + alignItems: "flex-start", }, orderTextRightContainer: { - width: '25%', - justifyContent: 'center', - alignItems: 'flex-end' + width: "25%", + justifyContent: "center", + alignItems: "flex-end", }, orderSpacer: { - width: '100%', - height: height * 0.02 + width: "100%", + height: height * 0.02, }, orderRow: { - width: '100%', + width: "100%", height: height * 0.05, - alignItems: 'center' + alignItems: "center", }, orderRow2: { - width: '100%', + width: "100%", height: height * 0.07, - alignItems: 'center', - ...alignment.PBlarge + alignItems: "center", + ...alignment.PBlarge, }, orderSubRow: { - width: '90%', - height: '100%', - flexDirection: 'row' + width: "90%", + height: "100%", + flexDirection: "row", }, orderTextLeft: { - width: '50%', - height: '100%', - paddingLeft: '5%', - justifyContent: 'center', - alignItems: 'flex-start' + width: "50%", + height: "100%", + paddingLeft: "5%", + justifyContent: "center", + alignItems: "flex-start", }, orderTextRight: { - width: '50%', - height: '100%', - alignItems: 'flex-end', - justifyContent: 'center' + width: "50%", + height: "100%", + alignItems: "flex-end", + justifyContent: "center", }, actionContainer: { - width: '100%', + width: "100%", height: height * 0.1, - justifyContent: 'center', - alignItems: 'center', + justifyContent: "center", + alignItems: "center", ...alignment.MTmedium, - ...alignment.MBlarge + ...alignment.MBlarge, }, actionSubContainer: { - width: '90%', - height: '80%', - flexDirection: 'row', - justifyContent: 'space-around', - alignItems: 'center', + width: "90%", + height: "80%", + flexDirection: "row", + justifyContent: "space-around", + alignItems: "center", borderRadius: scale(10), - ...alignment.MBlarge + ...alignment.MBlarge, }, cancelBtnStyle: { - width: '80%', - height: '70%', - justifyContent: 'center', - alignItems: 'center', - borderRadius: scale(10) + width: "80%", + height: "70%", + justifyContent: "center", + alignItems: "center", + borderRadius: scale(10), }, acceptBtnStyle: { backgroundColor: colors.tagColor, - width: '80%', - height: '70%', - justifyContent: 'center', - alignItems: 'center', - borderRadius: scale(10) + width: "80%", + height: "70%", + justifyContent: "center", + alignItems: "center", + borderRadius: scale(10), }, removeBtnStyle: { backgroundColor: colors.tagColor, - width: '45%', - height: '70%', - justifyContent: 'center', - alignItems: 'center' + width: "45%", + height: "70%", + justifyContent: "center", + alignItems: "center", }, baseSpacer: { - marginTop: verticalScale(15) + marginTop: verticalScale(15), }, mapContainer: { - width: '85%', - alignSelf: 'center', - height: verticalScale(200) - } -} + width: "85%", + alignSelf: "center", + height: verticalScale(200), + }, +}; diff --git a/RiderApp/src/screens/Orders/Orders.js b/RiderApp/src/screens/Orders/Orders.js index 442b058..a6157f6 100644 --- a/RiderApp/src/screens/Orders/Orders.js +++ b/RiderApp/src/screens/Orders/Orders.js @@ -1,33 +1,34 @@ -import React, { useEffect, useState, useLayoutEffect } from 'react' -import { useNavigation } from '@react-navigation/native' +import React, { useEffect, useState, useLayoutEffect } from "react"; +import { useNavigation } from "@react-navigation/native"; import { ImageBackground, StatusBar, TouchableOpacity, - View -} from 'react-native' -import i18n from '../../../i18n' -import { AssignedOrders, NewOrders, TextDefault } from '../../components' -import colors from '../../utilities/colors' -import useStyle from './style' + View, +} from "react-native"; +import { useTranslation } from "react-i18next"; +import { AssignedOrders, NewOrders, TextDefault } from "../../components"; +import colors from "../../utilities/colors"; +import useStyle from "./style"; -const BACKGROUND_IMAGE = require('../../../assets/images/ui/BG.png') +const BACKGROUND_IMAGE = require("../../../assets/images/ui/BG.png"); export default function Orders() { - const styles = useStyle() - const [isNewOrderSelected, setIsNewOrderSelected] = useState(false) - const navigation = useNavigation() + const { t } = useTranslation(); + const styles = useStyle(); + const [isNewOrderSelected, setIsNewOrderSelected] = useState(false); + const navigation = useNavigation(); useEffect(() => { - StatusBar.setBarStyle('light-content') - }, [isNewOrderSelected]) + StatusBar.setBarStyle("light-content"); + }, [isNewOrderSelected]); useLayoutEffect(() => { navigation.setOptions({ headerRight: null, - headerTitle: i18n.t('Orders') - }) - }, [navigation]) + headerTitle: t("Orders"), + }); + }, [t, navigation]); return ( @@ -41,11 +42,12 @@ export default function Orders() { { backgroundColor: !isNewOrderSelected ? colors.buttonBackgroundPink - : 'transparent' - } - ]}> + : "transparent", + }, + ]} + > - {i18n.t('myOrders')} + {t("myOrders")} + : "transparent", + }, + ]} + > - {i18n.t('newOrders')} + {t("newOrders")} {!isNewOrderSelected ? : } - ) + ); } diff --git a/RiderApp/src/utilities/alignment.js b/RiderApp/src/utilities/alignment.js index 1c2b7a5..b71b3d5 100644 --- a/RiderApp/src/utilities/alignment.js +++ b/RiderApp/src/utilities/alignment.js @@ -1,135 +1,135 @@ -import { scale } from './scaling' +import { scale } from "./scaling"; -const XSMALL = 5 -const SMALL = 10 -const MEDIUM = 15 -const LARGE = 20 +const XSMALL = 5; +const SMALL = 10; +const MEDIUM = 15; +const LARGE = 20; export const alignment = { MxSmall: { - margin: scale(XSMALL) + margin: scale(XSMALL), }, MBxSmall: { - marginBottom: scale(XSMALL) + marginBottom: scale(XSMALL), }, MTxSmall: { - marginTop: scale(XSMALL) + marginTop: scale(XSMALL), }, MRxSmall: { - marginRight: scale(XSMALL) + marginRight: scale(XSMALL), }, MLxSmall: { - marginLeft: scale(XSMALL) + marginLeft: scale(XSMALL), }, Msmall: { - margin: scale(SMALL) + margin: scale(SMALL), }, MBsmall: { - marginBottom: scale(SMALL) + marginBottom: scale(SMALL), }, MTsmall: { - marginTop: scale(SMALL) + marginTop: scale(SMALL), }, MRsmall: { - marginRight: scale(SMALL) + marginRight: scale(SMALL), }, MLsmall: { - marginLeft: scale(SMALL) + marginLeft: scale(SMALL), }, Mmedium: { - margin: scale(MEDIUM) + margin: scale(MEDIUM), }, MBmedium: { - marginBottom: scale(MEDIUM) + marginBottom: scale(MEDIUM), }, MTmedium: { - marginTop: scale(MEDIUM) + marginTop: scale(MEDIUM), }, MRmedium: { - marginRight: scale(MEDIUM) + marginRight: scale(MEDIUM), }, MLmedium: { - marginLeft: scale(MEDIUM) + marginLeft: scale(MEDIUM), }, Mlarge: { - margin: scale(LARGE) + margin: scale(LARGE), }, MBlarge: { - marginBottom: scale(LARGE) + marginBottom: scale(LARGE), }, MTlarge: { - marginTop: scale(LARGE) + marginTop: scale(LARGE), }, MRlarge: { - marginRight: scale(LARGE) + marginRight: scale(LARGE), }, MLlarge: { - marginLeft: scale(LARGE) + marginLeft: scale(LARGE), }, // Padding PxSmall: { - padding: scale(XSMALL) + padding: scale(XSMALL), }, PBxSmall: { - paddingBottom: scale(XSMALL) + paddingBottom: scale(XSMALL), }, PTxSmall: { - paddingTop: scale(XSMALL) + paddingTop: scale(XSMALL), }, PRxSmall: { - paddingRight: scale(XSMALL) + paddingRight: scale(XSMALL), }, PLxSmall: { - paddingLeft: scale(XSMALL) + paddingLeft: scale(XSMALL), }, Psmall: { - padding: scale(SMALL) + padding: scale(SMALL), }, PBsmall: { - paddingBottom: scale(SMALL) + paddingBottom: scale(SMALL), }, PTsmall: { - paddingTop: scale(SMALL) + paddingTop: scale(SMALL), }, PRsmall: { - paddingRight: scale(SMALL) + paddingRight: scale(SMALL), }, PLsmall: { - paddingLeft: scale(SMALL) + paddingLeft: scale(SMALL), }, Pmedium: { - padding: scale(MEDIUM) + padding: scale(MEDIUM), }, PBmedium: { - paddingBottom: scale(MEDIUM) + paddingBottom: scale(MEDIUM), }, PTmedium: { - paddingTop: scale(MEDIUM) + paddingTop: scale(MEDIUM), }, PRmedium: { - paddingRight: scale(MEDIUM) + paddingRight: scale(MEDIUM), }, PLmedium: { - paddingLeft: scale(MEDIUM) + paddingLeft: scale(MEDIUM), }, Plarge: { - padding: scale(LARGE) + padding: scale(LARGE), }, PBlarge: { - paddingBottom: scale(LARGE) + paddingBottom: scale(LARGE), }, PTlarge: { - paddingTop: scale(LARGE) + paddingTop: scale(LARGE), }, PRlarge: { - paddingRight: scale(LARGE) + paddingRight: scale(LARGE), }, PLlarge: { - paddingLeft: scale(LARGE) - } -} + paddingLeft: scale(LARGE), + }, +};