diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..8a6be07 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,16 @@ +# OSX +# +.DS_Store + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ + +# Bundle artifacts +*.jsbundle diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 0000000..a493970 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,178 @@ +apply plugin: "com.android.application" +apply plugin: "org.jetbrains.kotlin.android" +apply plugin: "com.facebook.react" + +def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) + reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" + codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() + + // Use Expo CLI to bundle the app, this ensures the Metro config + // works correctly with Expo projects. + cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) + bundleCommand = "export:embed" + + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '../..' + // root = file("../../") + // The folder where the react-native NPM package is. Default is ../../node_modules/react-native + // reactNativeDir = file("../../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen + // codegenDir = file("../../node_modules/@react-native/codegen") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] + + /* Autolinking */ + autolinkLibrariesWithApp() +} + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'org.webkit:android-jsc:+' + +android { + ndkVersion rootProject.ext.ndkVersion + + buildToolsVersion rootProject.ext.buildToolsVersion + compileSdk rootProject.ext.compileSdkVersion + + namespace 'com.brainnel.app' + defaultConfig { + applicationId 'com.brainnel.app' + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0.0" + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true) + } + } + packagingOptions { + jniLibs { + useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) + } + } + androidResources { + ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~' + } +} + +// Apply static values from `gradle.properties` to the `android.packagingOptions` +// Accepts values in comma delimited lists, example: +// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini +["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> + // Split option: 'foo,bar' -> ['foo', 'bar'] + def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); + // Trim all elements in place. + for (i in 0.. 0) { + println "android.packagingOptions.$prop += $options ($options.length)" + // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' + options.each { + android.packagingOptions[prop] += it + } + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + + def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; + def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; + def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; + + if (isGifEnabled) { + // For animated gif support + implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") + } + + if (isWebpEnabled) { + // For webp support + implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") + if (isWebpAnimatedEnabled) { + // Animated webp support + implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") + } + } + + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } +} + +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/android/app/debug.keystore b/android/app/debug.keystore new file mode 100644 index 0000000..364e105 Binary files /dev/null and b/android/app/debug.keystore differ diff --git a/android/app/google-services.json b/android/app/google-services.json new file mode 100644 index 0000000..c81c86c --- /dev/null +++ b/android/app/google-services.json @@ -0,0 +1,47 @@ +{ + "project_info": { + "project_number": "449517618313", + "project_id": "brainnel-7eead", + "storage_bucket": "brainnel-7eead.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:449517618313:android:cdbccb972db9576774b258", + "android_client_info": { + "package_name": "com.brainnel.app" + } + }, + "oauth_client": [ + { + "client_id": "449517618313-s1bmot9r3ic4s0g84ff13b5uasn2l0nv.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.brainnel.app", + "certificate_hash": "5e8f16062ea3cd2c4a0d547876baa6f38cabf625" + } + }, + { + "client_id": "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAONO-Vnqt6JCEEkP8dt7mH025wAEMkIEU" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..551eb41 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,14 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# react-native-reanimated +-keep class com.swmansion.reanimated.** { *; } +-keep class com.facebook.react.turbomodule.** { *; } + +# Add any project specific keep options here: diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..3ec2507 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2eacf22 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/java/com/brainnel/app/MainActivity.kt b/android/app/src/main/java/com/brainnel/app/MainActivity.kt new file mode 100644 index 0000000..81eec90 --- /dev/null +++ b/android/app/src/main/java/com/brainnel/app/MainActivity.kt @@ -0,0 +1,61 @@ +package com.brainnel.app + +import android.os.Build +import android.os.Bundle + +import com.facebook.react.ReactActivity +import com.facebook.react.ReactActivityDelegate +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled +import com.facebook.react.defaults.DefaultReactActivityDelegate + +import expo.modules.ReactActivityDelegateWrapper + +class MainActivity : ReactActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + // Set the theme to AppTheme BEFORE onCreate to support + // coloring the background, status bar, and navigation bar. + // This is required for expo-splash-screen. + setTheme(R.style.AppTheme); + super.onCreate(null) + } + + /** + * Returns the name of the main component registered from JavaScript. This is used to schedule + * rendering of the component. + */ + override fun getMainComponentName(): String = "main" + + /** + * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] + * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] + */ + override fun createReactActivityDelegate(): ReactActivityDelegate { + return ReactActivityDelegateWrapper( + this, + BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, + object : DefaultReactActivityDelegate( + this, + mainComponentName, + fabricEnabled + ){}) + } + + /** + * Align the back button behavior with Android S + * where moving root activities to background instead of finishing activities. + * @see onBackPressed + */ + override fun invokeDefaultOnBackPressed() { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + if (!moveTaskToBack(false)) { + // For non-root activities, use the default implementation to finish them. + super.invokeDefaultOnBackPressed() + } + return + } + + // Use the default back button implementation on Android S + // because it's doing more than [Activity.moveTaskToBack] in fact. + super.invokeDefaultOnBackPressed() + } +} diff --git a/android/app/src/main/java/com/brainnel/app/MainApplication.kt b/android/app/src/main/java/com/brainnel/app/MainApplication.kt new file mode 100644 index 0000000..13e82eb --- /dev/null +++ b/android/app/src/main/java/com/brainnel/app/MainApplication.kt @@ -0,0 +1,57 @@ +package com.brainnel.app + +import android.app.Application +import android.content.res.Configuration + +import com.facebook.react.PackageList +import com.facebook.react.ReactApplication +import com.facebook.react.ReactNativeHost +import com.facebook.react.ReactPackage +import com.facebook.react.ReactHost +import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load +import com.facebook.react.defaults.DefaultReactNativeHost +import com.facebook.react.soloader.OpenSourceMergedSoMapping +import com.facebook.soloader.SoLoader + +import expo.modules.ApplicationLifecycleDispatcher +import expo.modules.ReactNativeHostWrapper + +class MainApplication : Application(), ReactApplication { + + override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( + this, + object : DefaultReactNativeHost(this) { + override fun getPackages(): List { + val packages = PackageList(this).packages + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new MyReactNativePackage()); + return packages + } + + override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" + + override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG + + override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED + override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED + } + ) + + override val reactHost: ReactHost + get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) + + override fun onCreate() { + super.onCreate() + SoLoader.init(this, OpenSourceMergedSoMapping) + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + load() + } + ApplicationLifecycleDispatcher.onApplicationCreate(this) + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) + } +} diff --git a/android/app/src/main/res/drawable-hdpi/splashscreen_logo.png b/android/app/src/main/res/drawable-hdpi/splashscreen_logo.png new file mode 100644 index 0000000..31df827 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/splashscreen_logo.png differ diff --git a/android/app/src/main/res/drawable-mdpi/splashscreen_logo.png b/android/app/src/main/res/drawable-mdpi/splashscreen_logo.png new file mode 100644 index 0000000..ef243aa Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/splashscreen_logo.png differ diff --git a/android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png b/android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png new file mode 100644 index 0000000..e9d5474 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png b/android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png new file mode 100644 index 0000000..d61da15 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png b/android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png new file mode 100644 index 0000000..4aeed11 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png differ diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..883b2a0 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/rn_edit_text_material.xml b/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 0000000..5c25e72 --- /dev/null +++ b/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..3941bea --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..3941bea --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..7fae0cc Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..ac03dbf Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..afa0a4e Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..78aaf45 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..e1173a9 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..c4f6e10 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..7a0f085 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..ff086fd Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..6c2d40b Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..730e3fa Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..f7f1d06 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..3452615 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..b11a322 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000..49a464e Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b51fd15 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/android/app/src/main/res/values-night/colors.xml b/android/app/src/main/res/values-night/colors.xml new file mode 100644 index 0000000..3c05de5 --- /dev/null +++ b/android/app/src/main/res/values-night/colors.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f387b90 --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + #ffffff + #ffffff + #023c69 + #ffffff + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..2354f74 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,5 @@ + + newBrainnelApp + contain + false + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..da52521 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..47ef030 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,42 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext { + buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0' + minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24') + compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35') + targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') + kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25' + + ndkVersion = "26.1.10909125" + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.google.gms:google-services:4.4.1' + classpath('com.android.tools.build:gradle') + classpath('com.facebook.react:react-native-gradle-plugin') + classpath('org.jetbrains.kotlin:kotlin-gradle-plugin') + } +} + +apply plugin: "com.facebook.react.rootproject" + +allprojects { + repositories { + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) + } + maven { + // Android JSC is installed from npm + url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist')) + } + + google() + mavenCentral() + maven { url 'https://www.jitpack.io' } + } +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..04490cd --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,58 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true + +# Enable AAPT2 PNG crunching +android.enablePngCrunchInReleaseBuilds=true + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=true + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true + +# Enable GIF support in React Native images (~200 B increase) +expo.gif.enabled=true +# Enable webp support in React Native images (~85 KB increase) +expo.webp.enabled=true +# Enable animated webp support (~3.4 MB increase) +# Disabled by default because iOS doesn't support animated webp +expo.webp.animated=false + +# Enable network inspector +EX_DEV_CLIENT_NETWORK_INSPECTOR=true + +# Use legacy packaging to compress native libraries in the resulting APK. +expo.useLegacyPackaging=false + +android.extraMavenRepos=[] \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..a4b76b9 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..79eb9d0 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 0000000..f5feea6 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,252 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..9b42019 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..eef8a10 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,38 @@ +pluginManagement { + includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().toString()) +} +plugins { id("com.facebook.react.settings") } + +extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> + if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') { + ex.autolinkLibrariesFromCommand() + } else { + def command = [ + 'node', + '--no-warnings', + '--eval', + 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', + 'react-native-config', + '--json', + '--platform', + 'android' + ].toList() + ex.autolinkLibrariesFromCommand(command) + } +} + +rootProject.name = 'newBrainnelApp' + +dependencyResolutionManagement { + versionCatalogs { + reactAndroidLibs { + from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml"))) + } + } +} + +apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); +useExpoModules() + +include ':app' +includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile()) diff --git a/app.json b/app.json index d8a8027..02dcdac 100644 --- a/app.json +++ b/app.json @@ -59,6 +59,7 @@ }, "plugins": [ "expo-video", + "expo-apple-authentication", [ "expo-build-properties", { diff --git a/app/locales/en/translation.json b/app/locales/en/translation.json index 84004e5..8118232 100644 --- a/app/locales/en/translation.json +++ b/app/locales/en/translation.json @@ -110,6 +110,10 @@ "login_required_subtitle": "Login to use chat features", "login_now": "Login Now" }, + "login":{ + "error":"Login failed, please try again", + "success":"Login successfully" + }, "banner": { "today": "Today", "shipping": { @@ -357,7 +361,8 @@ }, "order.preview": { "login_required": "Please login first", - "payment_failed": "Payment failed", + "payment_failed": "Payment failed, please try again", + "Insufficient_balance": "Insufficient balance", "pay_now": "Pay Now", "payment_method": "Payment Method", "enter_phone": "Please enter phone number", diff --git a/app/locales/fr/translation.json b/app/locales/fr/translation.json index 7e1de0e..8d6ecba 100644 --- a/app/locales/fr/translation.json +++ b/app/locales/fr/translation.json @@ -293,6 +293,7 @@ "order.preview": { "login_required": "Veuillez vous connecter d'abord", "payment_failed": "Le paiement a échoué", + "Insufficient_balance": "Solde insuffisant", "pay_now": "Payer maintenant", "payment_method": "Mode de paiement", "enter_phone": "Veuillez saisir le numéro de téléphone", @@ -324,6 +325,8 @@ }, "login": { "logInOrSignUp": "Se connecter ou s'inscrire", + "error":"Échec de la connexion, veuillez réessayer", + "success":"Connexion réussie", "phoneNumber": "Numéro de téléphone", "enterPassword": "Veuillez réentrer votre mot de passe", "passwordIncorrect": "Mot de passe incorrect, veuillez confirmer votre mot de passe.", diff --git a/app/screens/BalanceScreen/BalanceScreen.tsx b/app/screens/BalanceScreen/BalanceScreen.tsx index 3fb9039..fd35a06 100644 --- a/app/screens/BalanceScreen/BalanceScreen.tsx +++ b/app/screens/BalanceScreen/BalanceScreen.tsx @@ -27,6 +27,7 @@ import BackIcon from "../../components/BackIcon"; import useUserStore from "../../store/user"; import { Transaction, payApi } from "../../services/api/payApi"; import { useTranslation } from "react-i18next"; +import { userApi } from "../../services"; type BalanceScreenNavigationProp = NativeStackNavigationProp< RootStackParamList, @@ -35,7 +36,7 @@ type BalanceScreenNavigationProp = NativeStackNavigationProp< export const BalanceScreen = () => { const { t } = useTranslation(); - const { user } = useUserStore(); + const { user, setUser } = useUserStore(); const navigation = useNavigation(); const [isModalVisible, setIsModalVisible] = useState(false); const [rechargeHistory, setRechargeHistory] = useState([]); @@ -54,21 +55,21 @@ export const BalanceScreen = () => { const fetchRechargeHistory = async (page: number, refresh = false) => { if (loading || (!hasMore && !refresh)) return; - + try { setLoading(true); const response = await payApi.getTransactionHistory(page, pageSize); - + if (response.items.length < pageSize) { setHasMore(false); } - + if (refresh) { setRechargeHistory(response.items); } else { - setRechargeHistory(prev => [...prev, ...response.items]); + setRechargeHistory((prev) => [...prev, ...response.items]); } - + setCurrentPage(page); } catch (error) { console.error("Failed to fetch transaction history:", error); @@ -76,7 +77,7 @@ export const BalanceScreen = () => { setLoading(false); } }; - + const handleLoadMore = () => { if (!loading && hasMore) { fetchRechargeHistory(currentPage + 1); @@ -85,25 +86,23 @@ export const BalanceScreen = () => { useFocusEffect( useCallback(() => { + userApi.getProfile().then((res) => { + setUser(res); + }); fetchRechargeHistory(1, true); }, []) ); - + const renderTransactionItem = ({ item }: { item: Transaction }) => ( - - {item.type} - + {item.type} @@ -111,17 +110,13 @@ export const BalanceScreen = () => { - - {item.timestamp} - - - {item.type} - + {item.timestamp} + {item.type} ); - + const renderFooter = () => { if (!loading) return null; return ( @@ -150,7 +145,9 @@ export const BalanceScreen = () => { item.transaction_id.toString()} + keyExtractor={(item, index) => + item.transaction_id.toString() + index + } onEndReached={handleLoadMore} onEndReachedThreshold={0.5} ListFooterComponent={renderFooter} @@ -174,7 +171,9 @@ export const BalanceScreen = () => { - {user?.balance} + + {user?.balance} + @@ -470,7 +469,7 @@ const styles = StyleSheet.create({ }, loaderContainer: { paddingVertical: 20, - alignItems: 'center', - justifyContent: 'center', + alignItems: "center", + justifyContent: "center", }, }); diff --git a/app/screens/loginList/index.tsx b/app/screens/loginList/index.tsx index 733cc48..2850a4e 100644 --- a/app/screens/loginList/index.tsx +++ b/app/screens/loginList/index.tsx @@ -17,25 +17,32 @@ import type { NativeStackNavigationProp } from "@react-navigation/native-stack"; import fontSize from "../../utils/fontsizeUtils"; import EmailLoginModal from "./EmailLoginModal"; import PhoneLoginModal from "./PhoneLoginModal"; +import { loginApi } from "../../services/api/login"; +import { userApi } from "../../services"; +import useUserStore from "../../store/user"; // 使用标准的ES6模块导入 -import { GoogleSignin, GoogleSigninButton, statusCodes } from '@react-native-google-signin/google-signin'; +// import { +// GoogleSignin, +// statusCodes, +// } from "@react-native-google-signin/google-signin"; const isDevelopment = __DEV__; // 开发模式检测 // 移出条件块,始终尝试配置 Google 登录 -try { - // 配置 Google 登录 - GoogleSignin.configure({ - iosClientId: "YOUR_IOS_CLIENT_ID_HERE.apps.googleusercontent.com", // iOS CLIENT_ID - webClientId: "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", // <-- 更新为此 Web Client ID - scopes: ['profile', 'email'], - offlineAccess: false, // <-- 确保为 false 或移除 - forceCodeForRefreshToken: false, // <-- 确保为 false 或移除 - }); -} catch (error) { - console.log('Google Sign-in模块配置错误:', error); // 稍微修改了日志信息 -} +// try { +// // 配置 Google 登录 +// GoogleSignin.configure({ +// iosClientId: "YOUR_IOS_CLIENT_ID_HERE.apps.googleusercontent.com", // iOS CLIENT_ID +// webClientId: +// "449517618313-av37nffa7rqkefu0ajh5auou3pb0mt51.apps.googleusercontent.com", // <-- 更新为此 Web Client ID +// scopes: ["profile", "email"], +// offlineAccess: false, // <-- 确保为 false 或移除 +// forceCodeForRefreshToken: false, // <-- 确保为 false 或移除 +// }); +// } catch (error) { +// console.log("Google Sign-in模块配置错误:", error); // 稍微修改了日志信息 +// } type RootStackParamList = { Login: undefined; @@ -51,6 +58,7 @@ type LoginScreenProps = { }; export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => { + const { setUser } = useUserStore(); const { t } = useTranslation(); const navigation = useNavigation>(); @@ -97,63 +105,52 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => { // 处理谷歌登录 const handleGoogleLogin = async () => { - try { - // 开发模式下的模拟登录 - // 注释掉开发模式下的模拟登录,以便进行真实登录测试 - /* - if (isDevelopment) { - console.log('开发模式:模拟Google登录成功'); - const mockUserInfo = { - user: { - id: 'dev_user_123', - name: 'Test User', - email: 'test@example.com', - photo: null, - }, - }; - console.log('模拟用户信息:', mockUserInfo); - - // 这里可以处理登录成功后的逻辑 - // 比如导航到主页面或保存用户信息 - // navigation.navigate("MainTabs", { screen: "Home" }); - - return; - } - */ - - // 生产模式下的真实Google登录 (现在开发模式也会执行) - if (!GoogleSignin || typeof GoogleSignin.signIn !== 'function') { - console.log('Google Sign-in模块未正确初始化或配置失败'); - return; - } - - await GoogleSignin.hasPlayServices(); - const userInfo = await GoogleSignin.signIn(); - console.log('Google 登录成功:', userInfo); - - // 这里可以处理登录成功后的逻辑 - // 比如导航到主页面或保存用户信息 - // navigation.navigate("MainTabs", { screen: "Home" }); - - } catch (error: any) { - console.log('Google 登录错误:', error); - - // 开发模式下的错误处理 - if (isDevelopment) { - console.log('开发模式:忽略Google登录错误,但已尝试真实登录'); // 修改日志,表明已尝试真实登录 - return; - } - - if (statusCodes && error.code === statusCodes.SIGN_IN_CANCELLED) { - console.log('用户取消登录'); - } else if (statusCodes && error.code === statusCodes.IN_PROGRESS) { - console.log('登录正在进行中'); - } else if (statusCodes && error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) { - console.log('Play Services 不可用'); - } else { - console.log('其他错误:', error.message); - } - } + // try { + + // if (!GoogleSignin || typeof GoogleSignin.signIn !== "function") { + // console.log("Google Sign-in模块未正确初始化或配置失败"); + // return; + // } + + // await GoogleSignin.hasPlayServices(); + // const userInfo = await GoogleSignin.signIn(); + // console.log("Google 登录成功:", userInfo); + // try { + // const res = await loginApi.googleLogin(userInfo); + // const user = await userApi.getProfile(); + // setUser(user); + // navigation.navigate("MainTabs", { screen: "Home" }); + // } catch (err) { + // console.log("Google 登录失败:", err); + // navigation.navigate("Login"); + // } + + // // 这里可以处理登录成功后的逻辑 + // // 比如导航到主页面或保存用户信息 + // // navigation.navigate("MainTabs", { screen: "Home" }); + // } catch (error: any) { + // console.log("Google 登录错误:", error); + + // // 开发模式下的错误处理 + // if (isDevelopment) { + // console.log("开发模式:忽略Google登录错误,但已尝试真实登录"); // 修改日志,表明已尝试真实登录 + // return; + // } + + // if (statusCodes && error.code === statusCodes.SIGN_IN_CANCELLED) { + // console.log("用户取消登录"); + // } else if (statusCodes && error.code === statusCodes.IN_PROGRESS) { + // console.log("登录正在进行中"); + // } else if ( + // statusCodes && + // error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE + // ) { + // console.log("Play Services 不可用"); + // } else { + // console.log("其他错误:", error.message); + // navigation.navigate("Login"); + // } + // } }; // 处理Facebook登录 @@ -263,7 +260,9 @@ export const LoginScreen = ({ onClose, isModal }: LoginScreenProps) => { /> - {isDevelopment ? '🧪 ' + t("continueWithGoogle") + ' (测试模式)' : t("continueWithGoogle")} + {isDevelopment + ? "🧪 " + t("continueWithGoogle") + " (测试模式)" + : t("continueWithGoogle")} diff --git a/app/screens/previewOrder/perviewOrder.tsx b/app/screens/previewOrder/perviewOrder.tsx index 3e94317..2a224d5 100644 --- a/app/screens/previewOrder/perviewOrder.tsx +++ b/app/screens/previewOrder/perviewOrder.tsx @@ -41,6 +41,7 @@ type RootStackParamList = { }; Pay: { payUrl: string; method: string; order_id: string }; OrderDetails: { orderId?: number }; + PaymentSuccessScreen: any; }; export const PreviewOrder = () => { @@ -58,7 +59,7 @@ export const PreviewOrder = () => { if (!user.user_id) { return Alert.alert(t("order.preview.login_required")); } - if (route.params.payMethod === "Brainnel Pay(Mobile Money)") { + if (route.params.payMethod === "mobile_money") { setShowPhoneInput(true); } else { setShowPhoneInput(false); @@ -105,6 +106,14 @@ export const PreviewOrder = () => { .getPayInfo(data) .then((res) => { if (res.success) { + if (route.params.payMethod === "balance") { + if (res.success) { + navigation.navigate("PaymentSuccessScreen", res); + return; + } else { + Alert.alert(t("order.preview.Insufficient_balance")); + } + } logPreviewOrder( navigation.getState().routes[navigation.getState().index - 1] ?.name as string diff --git a/app/screens/productStatus/OrderDatails.tsx b/app/screens/productStatus/OrderDatails.tsx index 504648a..cbb40bb 100644 --- a/app/screens/productStatus/OrderDatails.tsx +++ b/app/screens/productStatus/OrderDatails.tsx @@ -63,7 +63,7 @@ export const OrderDetails = () => { { OrderDetails: { orderId: string; - status:number + status: number; }; }, "OrderDetails" @@ -71,7 +71,8 @@ export const OrderDetails = () => { >(); const [orderDetails, setOrderDetails] = useState(); const [isLoading, setIsLoading] = useState(true); - const { deleteOrder, changeOrder,updateOrderShippingInfo } = useOrderListStore(); + const { deleteOrder, changeOrder, updateOrderShippingInfo } = + useOrderListStore(); const [showPaymentModal, setShowPaymentModal] = useState(false); const [selectedPayment, setSelectedPayment] = useState(null); const [currentTab, setCurrentTab] = useState("online"); @@ -87,16 +88,22 @@ export const OrderDetails = () => { label: t("order.payment.offline"), options: [ { id: "cash", label: t("order.payment.cash") || "Cash", key: "cash" }, - { id: "bank", label: t("order.payment.bank") || "Bank Transfer", key: "bank" } + { + id: "bank", + label: t("order.payment.bank") || "Bank Transfer", + key: "bank", + }, ], }, ]); const [selectedCurrency, setSelectedCurrency] = useState("USD"); - const [convertedAmount, setConvertedAmount] = useState<{ - converted_amount: number; - item_key: string; - original_amount: number; - }[]>([]); + const [convertedAmount, setConvertedAmount] = useState< + { + converted_amount: number; + item_key: string; + original_amount: number; + }[] + >([]); const [isConverting, setIsConverting] = useState(false); const { user } = useUserStore(); const [isPaymentLoading, setIsPaymentLoading] = useState(false); @@ -123,36 +130,44 @@ export const OrderDetails = () => { } }; - useEffect(() => { + useEffect(() => { getOrderDetails(); - + // 获取支付方式 - payApi.getCountryPaymentMethods().then((res) => { - if (res && res.current_country_methods) { - setPaymentMethods(res.current_country_methods); - - // 更新在线支付选项 - setTabs(prev => { - const updatedTabs = [...prev]; - const onlineTabIndex = updatedTabs.findIndex(tab => tab.id === "online"); - - if (onlineTabIndex !== -1) { - // 将API返回的支付方式转换为选项格式 - const options: PaymentOption[] = res.current_country_methods.map(method => ({ - id: method.key, - label: method.key.charAt(0).toUpperCase() + method.key.slice(1), // 首字母大写 - key: method.key - })); - - updatedTabs[onlineTabIndex].options = options; - } - - return updatedTabs; - }); - } - }).catch(error => { - console.error("获取支付方式失败:", error); - }); + payApi + .getCountryPaymentMethods() + .then((res) => { + if (res && res.current_country_methods) { + setPaymentMethods(res.current_country_methods); + + // 更新在线支付选项 + setTabs((prev) => { + const updatedTabs = [...prev]; + const onlineTabIndex = updatedTabs.findIndex( + (tab) => tab.id === "online" + ); + + if (onlineTabIndex !== -1) { + // 将API返回的支付方式转换为选项格式 + const options: PaymentOption[] = res.current_country_methods.map( + (method) => ({ + id: method.key, + label: + method.key.charAt(0).toUpperCase() + method.key.slice(1), // 首字母大写 + key: method.key, + }) + ); + + updatedTabs[onlineTabIndex].options = options; + } + + return updatedTabs; + }); + } + }) + .catch((error) => { + console.error("获取支付方式失败:", error); + }); }, []); //拨打电话 const callPhone = async (phoneNumber: string) => { @@ -176,9 +191,9 @@ export const OrderDetails = () => { if (paymentId === "paypal" && paymentId !== selectedPayment) { setIsPaypalExpanded(true); setIsConverting(true); - + setSelectedCurrency("USD"); - + const data = { from_currency: orderDetails?.currency || "", to_currency: "USD", @@ -188,7 +203,7 @@ export const OrderDetails = () => { shipping_fee: orderDetails?.shipping_fee || 0, }, }; - + payApi .convertCurrency(data) .then((res) => { @@ -228,7 +243,7 @@ export const OrderDetails = () => { const handlePaymentConfirm = async () => { if (!selectedPayment || !orderDetails?.order_id) return; - + // 如果是mobile_money支付方式,显示电话号码输入模态框 if (selectedPayment === "mobile_money") { // 准备支付参数 @@ -240,65 +255,94 @@ export const OrderDetails = () => { selectedPriceLabel: orderDetails.total_amount + " " + user?.currency, onCloses: () => setShowPaymentModal(false), // 关闭支付模态框 }; - + setPaymentParams(params); setShowPhoneModal(true); return; } - + setIsPaymentLoading(true); const paymentData = { order_id: orderDetails.order_id, payment_method: selectedPayment, currency: selectedPayment === "paypal" ? selectedCurrency : user.currency, - total_amount: selectedPayment === "paypal" - ? convertedAmount.reduce((acc, item) => acc + item.converted_amount, 0) - : orderDetails?.total_amount || 0, - actual_amount: selectedPayment === "paypal" - ? convertedAmount.reduce((acc, item) => acc + item.converted_amount, 0) - : orderDetails?.actual_amount || 0, - shipping_fee: selectedPayment === "paypal" - ? convertedAmount.find(item => item.item_key === "shipping_fee")?.converted_amount || 0 - : orderDetails?.shipping_fee || 0, - domestic_shipping_fee: selectedPayment === "paypal" - ? convertedAmount.find(item => item.item_key === "domestic_shipping_fee")?.converted_amount || 0 - : orderDetails?.domestic_shipping_fee || 0 + total_amount: + selectedPayment === "paypal" + ? convertedAmount.reduce( + (acc, item) => acc + item.converted_amount, + 0 + ) + : orderDetails?.total_amount || 0, + actual_amount: + selectedPayment === "paypal" + ? convertedAmount.reduce( + (acc, item) => acc + item.converted_amount, + 0 + ) + : orderDetails?.actual_amount || 0, + shipping_fee: + selectedPayment === "paypal" + ? convertedAmount.find((item) => item.item_key === "shipping_fee") + ?.converted_amount || 0 + : orderDetails?.shipping_fee || 0, + domestic_shipping_fee: + selectedPayment === "paypal" + ? convertedAmount.find( + (item) => item.item_key === "domestic_shipping_fee" + )?.converted_amount || 0 + : orderDetails?.domestic_shipping_fee || 0, }; try { - await ordersApi.updateOrderPaymentMethod(paymentData) - + await ordersApi.updateOrderPaymentMethod(paymentData); + const payData = { order_id: orderDetails.order_id, method: selectedPayment, - currency: selectedPayment === "paypal" ? selectedCurrency : user.currency, - amount: selectedPayment === "paypal" - ? convertedAmount.reduce((acc, item) => acc + item.converted_amount, 0) - : orderDetails?.total_amount || 0 + currency: + selectedPayment === "paypal" ? selectedCurrency : user.currency, + amount: + selectedPayment === "paypal" + ? convertedAmount.reduce( + (acc, item) => acc + item.converted_amount, + 0 + ) + : orderDetails?.total_amount || 0, }; payApi - .getPayInfo(payData) - .then((res) => { - if (res.success) { + .getPayInfo(payData) + .then((res) => { + if (res.success) { + if (selectedPayment === "balance") { + setIsPaymentLoading(false); + setShowPaymentModal(false); + if (res.success) { + navigation.navigate("PaymentSuccessScreen", res); + return; + } else { + Alert.alert(t("order.preview.Insufficient_balance")); + return; + } + } + + setIsPaymentLoading(false); + setShowPaymentModal(false); + navigation.navigate("Pay", { + payUrl: res.payment_url, + method: selectedPayment, + order_id: orderDetails.order_id, + }); + } else { + Alert.alert(t("error"), t("pay.payment_failed")); + } + }) + .catch((err) => { + Alert.alert(t("error"), t("order.error.payment_update")); setIsPaymentLoading(false); - setShowPaymentModal(false); - navigation.navigate("Pay", { - payUrl: res.payment_url, - method: selectedPayment, - order_id: orderDetails.order_id, - }); - }else{ - Alert.alert(t("error"), t("pay.payment_failed")); - } - }) - .catch((err) => { - Alert.alert(t("error"), t("order.error.payment_update")); - setIsPaymentLoading(false); - }) - .finally(() => { - setIsPaymentLoading(false); - }); - + }) + .finally(() => { + setIsPaymentLoading(false); + }); } catch (error) { Alert.alert(t("error"), t("order.error.payment_update")); setIsPaymentLoading(false); @@ -313,10 +357,7 @@ export const OrderDetails = () => { // 验证电话号码(添加更严格的验证) if (!phoneNumber || phoneNumber.length < 8) { - Alert.alert( - t("error"), - t("order.error.invalid_phone") - ); + Alert.alert(t("error"), t("order.error.invalid_phone")); return; } @@ -332,7 +373,7 @@ export const OrderDetails = () => { actual_amount: paymentParams.amount, shipping_fee: 0, domestic_shipping_fee: 0, - phone: phoneNumber + phone: phoneNumber, }; // 更新订单支付方式 @@ -344,7 +385,7 @@ export const OrderDetails = () => { method: paymentParams.payment_method, currency: paymentParams.currency, amount: paymentParams.amount, - phone: phoneNumber + phone: phoneNumber, }; const response = await payApi.getPayInfo(payData); @@ -419,7 +460,9 @@ export const OrderDetails = () => { - {t("order.status")} + + {t("order.status")} + @@ -430,7 +473,7 @@ export const OrderDetails = () => { t("order.status.waiting_shipment"), t("order.status.in_transit"), t("order.status.waiting_receipt"), - t("order.status.completed") + t("order.status.completed"), ]} /> @@ -441,7 +484,9 @@ export const OrderDetails = () => { - {t("order.information")} + + {t("order.information")} + @@ -451,15 +496,21 @@ export const OrderDetails = () => { - {t("order.create_time")} + + {t("order.create_time")} + {orderDetails.create_time} - {t("order.shipping_type")} + + {t("order.shipping_type")} + - {orderDetails.shipping_type === 0 ? t("order.shipping.sea") : t("order.shipping.air")} + {orderDetails.shipping_type === 0 + ? t("order.shipping.sea") + : t("order.shipping.air")} @@ -470,7 +521,9 @@ export const OrderDetails = () => { - {t("order.delivery_info")} + + {t("order.delivery_info")} + @@ -609,7 +662,9 @@ export const OrderDetails = () => { - {t("order.add_to_cart")} + + {t("order.add_to_cart")} + @@ -620,7 +675,9 @@ export const OrderDetails = () => { - {t("order.price_details")} + + {t("order.price_details")} + {/* @@ -653,7 +710,8 @@ export const OrderDetails = () => { - + ${orderDetails.shipping_fee} {t("order.estimated_shipping")} + + ${orderDetails.shipping_fee}{" "} + {t("order.estimated_shipping")} (COD) @@ -670,7 +728,9 @@ export const OrderDetails = () => { deleteOrder(route.params.orderId); }} > - {t("order.cancel")} + + {t("order.cancel")} + { callPhone("15903995548"); }} > - {t("order.contact_shipping")} + + {t("order.contact_shipping")} + { navigation.goBack(); }} > - {t("order.cancel")} + + {t("order.cancel")} + )} {/* 代收货 */} {orderDetails.order_status === 2 && ( - {}}> - {t("order.check_logistics")} + {}} + > + + {t("order.check_logistics")} + { - updateOrderShippingInfo(route.params.orderId,{ + updateOrderShippingInfo(route.params.orderId, { shipping_status: 0, shipping_info: { shipping_company: "string", shipping_no: "string", - shipping_info: {} - } - }); + shipping_info: {}, + }, + }); navigation.goBack(); }} > - {t("order.confirm_receipt")} + + {t("order.confirm_receipt")} + )} @@ -738,21 +809,32 @@ export const OrderDetails = () => { navigation.goBack(); }} > - {t("order.cancel")} + + {t("order.cancel")} + - {t("order.pay_now")} + + {t("order.pay_now")} + )} {/* 已取消 */} {orderDetails.order_status === 4 && ( - {}}> - {t("order.add_to_cart")} + {}} + > + + {t("order.add_to_cart")} + - {t("order.reorder")} + + {t("order.reorder")} + )} @@ -766,14 +848,16 @@ export const OrderDetails = () => { visible={showPaymentModal} transparent={true} animationType="slide" - onRequestClose={() => setShowPaymentModal(false)} > {t("order.select_payment")} - setShowPaymentModal(false)} style={styles.closeButtonContainer}> + setShowPaymentModal(false)} + style={styles.closeButtonContainer} + > × @@ -782,17 +866,28 @@ export const OrderDetails = () => { {tabs.map((tab) => ( setCurrentTab(tab.id)} > - + {tab.label} ))} - + {currentTab === "online" ? ( <> {tabs @@ -811,7 +906,8 @@ export const OrderDetails = () => { /> - {t("order.balance_remaining") || "Balance remaining"} + {t("order.balance_remaining") || + "Balance remaining"} {"\n"} {user.balance} {user.currency} @@ -824,39 +920,74 @@ export const OrderDetails = () => { style={styles.operatorImage} /> {option.key === "mobile_money" && ( - - {paymentMethods.find(method => method.key === option.key)?.value && - Array.isArray(paymentMethods.find(method => method.key === option.key)?.value) ? ( - (paymentMethods.find(method => method.key === option.key)?.value as string[]).map((item, index) => ( - - - - )) - ) : ( - - {paymentMethods.find(method => method.key === option.key)?.value as string} - - ) - } + + {paymentMethods.find( + (method) => method.key === option.key + )?.value && + Array.isArray( + paymentMethods.find( + (method) => method.key === option.key + )?.value + ) ? ( + ( + paymentMethods.find( + (method) => + method.key === option.key + )?.value as string[] + ).map((item, index) => ( + + + + )) + ) : ( + + { + paymentMethods.find( + (method) => + method.key === option.key + )?.value as string + } + + )} )} )} - onSelectPayment(option.id)}> + onSelectPayment(option.id)} + > {selectedPayment === option.id && ( - + )} @@ -864,71 +995,85 @@ export const OrderDetails = () => { {/* PayPal Currency Selection */} - {selectedPayment === "paypal" && option.id === "paypal" && isPaypalExpanded && ( - - - - {t("order.select_currency") || "Select Currency"} - - - onSelectCurrency("USD")} - > - + + + {t("order.select_currency") || + "Select Currency"} + + + onSelectCurrency("USD")} > - USD - - - onSelectCurrency("EUR")} - > - + USD + + + onSelectCurrency("EUR")} > - EUR - - - - - {/* 显示转换后的金额 */} - {isConverting ? ( - - - - {t("order.converting") || "Converting..."} - - - ) : convertedAmount.length > 0 ? ( - - - {t("order.equivalent_amount") || "Equivalent Amount:"} - - - {convertedAmount - .find((item) => item.item_key === "total_amount") - ?.converted_amount.toFixed(2)}{" "} - {selectedCurrency} - + + EUR + + - ) : null} + + {/* 显示转换后的金额 */} + {isConverting ? ( + + + + {t("order.converting") || "Converting..."} + + + ) : convertedAmount.length > 0 ? ( + + + {t("order.equivalent_amount") || + "Equivalent Amount:"} + + + {convertedAmount + .find( + (item) => + item.item_key === "total_amount" + ) + ?.converted_amount.toFixed(2)}{" "} + {selectedCurrency} + + + ) : null} + - - )} + )} ))} @@ -962,15 +1107,22 @@ export const OrderDetails = () => { {selectedPayment === option.id && ( - + )} @@ -994,7 +1146,8 @@ export const OrderDetails = () => { { ) : ( - {isConverting - ? t("order.converting") || "Converting..." + {isConverting + ? t("order.converting") || "Converting..." : t("order.confirm_payment")} )} @@ -1030,7 +1183,7 @@ export const OrderDetails = () => { const styles = StyleSheet.create({ safeArea: { flex: 1, - backgroundColor: '#fff', + backgroundColor: "#fff", }, safeAreaContent: { flex: 1, @@ -1289,38 +1442,38 @@ const styles = StyleSheet.create({ }, modalOverlay: { flex: 1, - backgroundColor: 'rgba(0, 0, 0, 0.5)', - justifyContent: 'flex-end', + backgroundColor: "rgba(0, 0, 0, 0.5)", + justifyContent: "flex-end", }, modalContent: { - backgroundColor: '#fff', + backgroundColor: "#fff", borderTopLeftRadius: 20, borderTopRightRadius: 20, padding: 20, - maxHeight: '80%', + maxHeight: "80%", }, modalHeader: { - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", marginBottom: 20, }, modalTitle: { fontSize: fontSize(18), - fontWeight: '600', + fontWeight: "600", }, closeButtonContainer: { padding: 5, }, closeButtonText: { fontSize: fontSize(24), - color: '#999', + color: "#999", }, tabContainer: { - flexDirection: 'row', + flexDirection: "row", marginBottom: 15, borderBottomWidth: 1, - borderBottomColor: '#f5f5f5', + borderBottomColor: "#f5f5f5", }, tab: { paddingVertical: 10, @@ -1329,31 +1482,31 @@ const styles = StyleSheet.create({ }, tabActive: { borderBottomWidth: 2, - borderBottomColor: '#FF5100', + borderBottomColor: "#FF5100", }, tabText: { fontSize: fontSize(16), - color: '#666', + color: "#666", }, tabTextActive: { - color: '#FF5100', - fontWeight: '500', + color: "#FF5100", + fontWeight: "500", }, paymentOptions: { maxHeight: 300, }, cardContainer: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', + flexDirection: "row", + alignItems: "center", + justifyContent: "space-between", padding: 15, - backgroundColor: '#F8F8F8', + backgroundColor: "#F8F8F8", borderRadius: 8, marginBottom: 10, }, iconRow: { - flexDirection: 'row', - alignItems: 'center', + flexDirection: "row", + alignItems: "center", flex: 1, }, imageContainer: { @@ -1386,11 +1539,11 @@ const styles = StyleSheet.create({ }, currencyTitle: { fontSize: fontSize(14), - color: '#666', + color: "#666", marginBottom: 10, }, paypalExpandedContainer: { - backgroundColor: '#f8f8f8', + backgroundColor: "#f8f8f8", borderRadius: 8, marginTop: -5, marginBottom: 10, @@ -1401,7 +1554,7 @@ const styles = StyleSheet.create({ padding: 10, }, currencyButtonsContainer: { - flexDirection: 'row', + flexDirection: "row", marginBottom: 10, }, currencyButton: { @@ -1409,30 +1562,30 @@ const styles = StyleSheet.create({ paddingHorizontal: 15, borderRadius: 20, borderWidth: 1, - borderColor: '#ddd', + borderColor: "#ddd", marginRight: 10, }, currencyButtonActive: { - backgroundColor: '#FFF0E8', - borderColor: '#FF5100', + backgroundColor: "#FFF0E8", + borderColor: "#FF5100", }, currencyButtonText: { fontSize: fontSize(14), - color: '#333', + color: "#333", }, currencyButtonTextActive: { - color: '#FF5100', - fontWeight: '600', + color: "#FF5100", + fontWeight: "600", }, convertingContainer: { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'flex-end', + flexDirection: "row", + alignItems: "center", + justifyContent: "flex-end", marginTop: 10, }, convertingText: { fontSize: fontSize(14), - color: '#999', + color: "#999", marginLeft: 10, }, convertedAmountContainer: { @@ -1440,23 +1593,23 @@ const styles = StyleSheet.create({ }, convertedAmountLabel: { fontSize: fontSize(14), - color: '#666', + color: "#666", marginBottom: 5, }, convertedAmountValue: { fontSize: fontSize(16), - fontWeight: '600', - color: '#FF5100', + fontWeight: "600", + color: "#FF5100", }, actionButtonsContainer: { marginTop: 20, paddingTop: 20, borderTopWidth: 1, - borderTopColor: '#f5f5f5', + borderTopColor: "#f5f5f5", }, actionButtons: { - flexDirection: 'row', - justifyContent: 'space-between', + flexDirection: "row", + justifyContent: "space-between", }, cancelButton: { flex: 1, @@ -1464,28 +1617,28 @@ const styles = StyleSheet.create({ marginRight: 10, borderRadius: 25, borderWidth: 1, - borderColor: '#999', - alignItems: 'center', + borderColor: "#999", + alignItems: "center", }, confirmButton: { flex: 1, padding: 15, marginLeft: 10, borderRadius: 25, - backgroundColor: '#FF5100', - alignItems: 'center', + backgroundColor: "#FF5100", + alignItems: "center", }, confirmButtonDisabled: { - backgroundColor: '#ccc', + backgroundColor: "#ccc", }, buttonTextDark: { fontSize: fontSize(16), - color: '#666', + color: "#666", }, buttonTextWhite: { fontSize: fontSize(16), - color: '#fff', - fontWeight: '600', + color: "#fff", + fontWeight: "600", }, operatorImage: { width: 80, diff --git a/app/services/api/login.ts b/app/services/api/login.ts new file mode 100644 index 0000000..41effad --- /dev/null +++ b/app/services/api/login.ts @@ -0,0 +1,6 @@ +import apiService from "./apiClient"; + +export const loginApi = { + googleLogin: (data: any) => + apiService.post("/api/users/auth/callback/google", data), +}; diff --git a/done.txt b/done.txt new file mode 100644 index 0000000..746953a --- /dev/null +++ b/done.txt @@ -0,0 +1,5 @@ +1. 余额支付 (订单详情,支付) +2. 查看物流 +3. 取消订单 +4. 运费计算 +5. 询盘的图搜转成base64 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index f241662..3cbd918 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,6 +39,7 @@ "react-i18next": "^15.4.1", "react-native": "0.76.9", "react-native-dropdown-picker": "^5.4.6", + "react-native-fbsdk-next": "^13.4.1", "react-native-gesture-handler": "~2.20.2", "react-native-image-viewing": "^0.2.2", "react-native-image-zoom-viewer": "^3.0.1", @@ -14505,6 +14506,24 @@ "react-native": "*" } }, + "node_modules/react-native-fbsdk-next": { + "version": "13.4.1", + "resolved": "https://registry.npmmirror.com/react-native-fbsdk-next/-/react-native-fbsdk-next-13.4.1.tgz", + "integrity": "sha512-Cto+oF0FJyvxKDjKyLKI5DgnLCeeRlXvVQb8qw0XesT1Xune1ijDWAnvt9fy6wXJ4G7K510xKkcSUsbK/KyPhg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "expo": ">=47.0.0", + "react-native": ">=0.63.3" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, "node_modules/react-native-gesture-handler": { "version": "2.20.2", "resolved": "https://registry.npmmirror.com/react-native-gesture-handler/-/react-native-gesture-handler-2.20.2.tgz", diff --git a/package.json b/package.json index 9b064c1..8e325d0 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "axios": "^1.8.4", "events": "^3.3.0", "expo": "~52.0.41", + "expo-apple-authentication": "~7.1.3", "expo-auth-session": "~6.0.3", "expo-build-properties": "~0.13.3", "expo-crypto": "~14.0.2", @@ -44,6 +45,7 @@ "react-i18next": "^15.4.1", "react-native": "0.76.9", "react-native-dropdown-picker": "^5.4.6", + "react-native-fbsdk-next": "^13.4.1", "react-native-gesture-handler": "~2.20.2", "react-native-image-viewing": "^0.2.2", "react-native-image-zoom-viewer": "^3.0.1", diff --git a/yarn.lock b/yarn.lock index 77d71b5..3c19938 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,6 +31,13 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.6.0" +"@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4": + version "7.10.4" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.10.4.tgz" + integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.27.1": version "7.27.1" resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz" @@ -40,20 +47,6 @@ js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/code-frame@~7.10.4": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.10.4.tgz" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@7.10.4": - version "7.10.4" - resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.10.4.tgz" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.27.2": version "7.27.2" resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.27.2.tgz" @@ -1418,7 +1411,7 @@ json5 "^2.2.3" write-file-atomic "^2.3.0" -"@expo/metro-config@~0.19.12", "@expo/metro-config@0.19.12": +"@expo/metro-config@0.19.12", "@expo/metro-config@~0.19.12": version "0.19.12" resolved "https://registry.npmmirror.com/@expo/metro-config/-/metro-config-0.19.12.tgz" integrity sha512-fhT3x1ikQWHpZgw7VrEghBdscFPz1laRYa8WcVRB18nTTqorF6S8qPYslkJu1faEziHZS7c2uyDzTYnrg/CKbg== @@ -1825,7 +1818,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -2243,15 +2236,23 @@ hermes-parser "0.23.1" nullthrows "^1.1.1" +"@react-native/normalize-colors@0.76.9": + version "0.76.9" + resolved "https://registry.npmmirror.com/@react-native/normalize-colors/-/normalize-colors-0.76.9.tgz" + integrity sha512-TUdMG2JGk72M9d8DYbubdOlrzTYjw+YMe/xOnLU4viDgWRHsCbtRS9x0IAxRjs3amj/7zmK3Atm8jUPvdAc8qw== + "@react-native/normalize-colors@^0.74.1": version "0.74.89" resolved "https://registry.npmmirror.com/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz" integrity sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg== -"@react-native/normalize-colors@0.76.9": +"@react-native/virtualized-lists@0.76.9": version "0.76.9" - resolved "https://registry.npmmirror.com/@react-native/normalize-colors/-/normalize-colors-0.76.9.tgz" - integrity sha512-TUdMG2JGk72M9d8DYbubdOlrzTYjw+YMe/xOnLU4viDgWRHsCbtRS9x0IAxRjs3amj/7zmK3Atm8jUPvdAc8qw== + resolved "https://registry.npmmirror.com/@react-native/virtualized-lists/-/virtualized-lists-0.76.9.tgz" + integrity sha512-2neUfZKuqMK2LzfS8NyOWOyWUJOWgDym5fUph6fN9qF+LNPjAvnc4Zr9+o+59qjNu/yXwQgVMWNU4+8WJuPVWw== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" "@react-native/virtualized-lists@^0.72.4": version "0.72.8" @@ -2261,14 +2262,6 @@ invariant "^2.2.4" nullthrows "^1.1.1" -"@react-native/virtualized-lists@0.76.9": - version "0.76.9" - resolved "https://registry.npmmirror.com/@react-native/virtualized-lists/-/virtualized-lists-0.76.9.tgz" - integrity sha512-2neUfZKuqMK2LzfS8NyOWOyWUJOWgDym5fUph6fN9qF+LNPjAvnc4Zr9+o+59qjNu/yXwQgVMWNU4+8WJuPVWw== - dependencies: - invariant "^2.2.4" - nullthrows "^1.1.1" - "@react-navigation/bottom-tabs@^6.5.11": version "6.6.1" resolved "https://registry.npmmirror.com/@react-navigation/bottom-tabs/-/bottom-tabs-6.6.1.tgz" @@ -2591,14 +2584,7 @@ resolved "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.14.tgz" integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== -"@types/ramda@^0.27.40": - version "0.27.66" - resolved "https://registry.npmmirror.com/@types/ramda/-/ramda-0.27.66.tgz" - integrity sha512-i2YW+E2U6NfMt3dp0RxNcejox+bxJUNDjB7BpYuRuoHIzv5juPHkJkNgcUOu+YSQEmaWu8cnAo/8r63C0NnuVA== - dependencies: - ts-toolbelt "^6.15.1" - -"@types/ramda@^0.27.44": +"@types/ramda@^0.27.40", "@types/ramda@^0.27.44": version "0.27.66" resolved "https://registry.npmmirror.com/@types/ramda/-/ramda-0.27.66.tgz" integrity sha512-i2YW+E2U6NfMt3dp0RxNcejox+bxJUNDjB7BpYuRuoHIzv5juPHkJkNgcUOu+YSQEmaWu8cnAo/8r63C0NnuVA== @@ -2909,14 +2895,7 @@ ansi-regex@^6.0.1: resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== -ansi-styles@^3.2.0: - version "3.2.1" - resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -3197,6 +3176,13 @@ babel-plugin-react-native-web@~0.19.13: resolved "https://registry.npmmirror.com/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.19.13.tgz" integrity sha512-4hHoto6xaN23LCyZgL9LJZc3olmAxd7b6jDzlZnKXAh4rRAbZRKNBJoOOdp46OBqgy+K0t0guTj5/mhA8inymQ== +babel-plugin-syntax-hermes-parser@0.25.1, babel-plugin-syntax-hermes-parser@^0.25.1: + version "0.25.1" + resolved "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz" + integrity sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ== + dependencies: + hermes-parser "0.25.1" + babel-plugin-syntax-hermes-parser@^0.23.1: version "0.23.1" resolved "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.23.1.tgz" @@ -3204,13 +3190,6 @@ babel-plugin-syntax-hermes-parser@^0.23.1: dependencies: hermes-parser "0.23.1" -babel-plugin-syntax-hermes-parser@^0.25.1, babel-plugin-syntax-hermes-parser@0.25.1: - version "0.25.1" - resolved "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.25.1.tgz" - integrity sha512-IVNpGzboFLfXZUAwkLFcI/bnqVbwky0jP3eBno4HKtqvQJAHBLdgxiG6lQ4to0+Q/YCN3PO0od5NZwIKyY4REQ== - dependencies: - hermes-parser "0.25.1" - babel-plugin-transform-flow-enums@^0.0.2: version "0.0.2" resolved "https://registry.npmmirror.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz" @@ -3362,13 +3341,6 @@ bplist-creator@0.1.0: dependencies: stream-buffers "2.2.x" -bplist-parser@^0.3.1: - version "0.3.2" - resolved "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.3.2.tgz" - integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ== - dependencies: - big-integer "1.6.x" - bplist-parser@0.3.1: version "0.3.1" resolved "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.3.1.tgz" @@ -3376,6 +3348,13 @@ bplist-parser@0.3.1: dependencies: big-integer "1.6.x" +bplist-parser@^0.3.1: + version "0.3.2" + resolved "https://registry.npmmirror.com/bplist-parser/-/bplist-parser-0.3.2.tgz" + integrity sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ== + dependencies: + big-integer "1.6.x" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz" @@ -3526,12 +3505,7 @@ callsites@^3.0.0: resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -3551,16 +3525,7 @@ caniuse-lite@^1.0.30001716: resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz" integrity sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw== -chalk@^2.0.1: - version "2.4.2" - resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.4.2: +chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3657,12 +3622,7 @@ ci-info@^2.0.0: resolved "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -ci-info@^3.3.0: +ci-info@^3.2.0, ci-info@^3.3.0: version "3.9.0" resolved "https://registry.npmmirror.com/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -3751,16 +3711,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-string@^1.6.0, color-string@^1.9.0: version "1.9.1" resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz" @@ -3802,12 +3762,7 @@ command-exists@^1.2.8: resolved "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== -commander@^12.0.0: - version "12.1.0" - resolved "https://registry.npmmirror.com/commander/-/commander-12.1.0.tgz" - integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== - -commander@^12.1.0: +commander@^12.0.0, commander@^12.1.0: version "12.1.0" resolved "https://registry.npmmirror.com/commander/-/commander-12.1.0.tgz" integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== @@ -4097,47 +4052,26 @@ dayjs@^1.8.15: resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@^2.2.0: +debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^2.6.9: - version "2.6.9" - resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: version "4.4.1" resolved "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz" integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: ms "^2.1.3" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: - ms "2.0.0" + ms "^2.1.1" decamelize@^1.2.0: version "1.2.0" @@ -4421,12 +4355,7 @@ entities@^3.0.1: resolved "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== -entities@^4.2.0: - version "4.5.0" - resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -entities@^4.4.0: +entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -4876,6 +4805,11 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" +expo-apple-authentication@~7.1.3: + version "7.1.3" + resolved "https://registry.npmmirror.com/expo-apple-authentication/-/expo-apple-authentication-7.1.3.tgz#3d4ec9fa29ff336eba9b280e7db110639ae7e020" + integrity sha512-TRaF513oDGjGx3hRiAwkMiSnKLN8BIR9Se5Gi3ttz2UUgP9y+tNHV6Ji6/oztJo9ON7zerHg2mn5Y+3B8c2vTQ== + expo-application@~6.0.2: version "6.0.2" resolved "https://registry.npmmirror.com/expo-application/-/expo-application-6.0.2.tgz" @@ -5100,7 +5034,7 @@ fast-glob@^3.2.5, fast-glob@^3.2.9, fast-glob@^3.3.2: merge2 "^1.3.0" micromatch "^4.0.8" -fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -5288,26 +5222,17 @@ fresh@0.5.2: resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.0.0, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== +fs-extra@9.0.0: + version "9.0.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.0.0.tgz" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^2.0.0" + universalify "^1.0.0" -fs-extra@~8.1.0: +fs-extra@^8.1.0, fs-extra@~8.1.0: version "8.1.0" resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== @@ -5316,15 +5241,15 @@ fs-extra@~8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@9.0.0: - version "9.0.0" - resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.0.0.tgz" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== +fs-extra@^9.0.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmmirror.com/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 "^1.0.0" + universalify "^2.0.0" fs-minipass@^2.0.0: version "2.1.0" @@ -5468,43 +5393,7 @@ glob@^10.2.2, glob@^10.3.10, glob@^10.4.2: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.1: - version "7.2.3" - resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.4: - version "7.2.3" - resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.2.0: +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: version "7.2.3" resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5791,7 +5680,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5826,7 +5715,7 @@ internal-slot@^1.1.0: hasown "^2.0.2" side-channel "^1.1.0" -invariant@^2.2.4, invariant@2.2.4: +invariant@2.2.4, invariant@^2.2.4: version "2.2.4" resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -6597,11 +6486,56 @@ lighthouse-logger@^1.0.0: debug "^2.6.9" marky "^1.2.2" +lightningcss-darwin-arm64@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.27.0.tgz#565bd610533941cba648a70e105987578d82f996" + integrity sha512-Gl/lqIXY+d+ySmMbgDf0pgaWSqrWYxVHoc88q+Vhf2YNzZ8DwoRzGt5NZDVqqIW5ScpSnmmjcgXP87Dn2ylSSQ== + lightningcss-darwin-x64@1.27.0: version "1.27.0" resolved "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.27.0.tgz" integrity sha512-0+mZa54IlcNAoQS9E0+niovhyjjQWEMrwW0p2sSdLRhLDc8LMQ/b67z7+B5q4VmjYCMSfnFi3djAAQFIDuj/Tg== +lightningcss-freebsd-x64@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.27.0.tgz#a7c3c4d6ee18dffeb8fa69f14f8f9267f7dc0c34" + integrity sha512-n1sEf85fePoU2aDN2PzYjoI8gbBqnmLGEhKq7q0DKLj0UTVmOTwDC7PtLcy/zFxzASTSBlVQYJUhwIStQMIpRA== + +lightningcss-linux-arm-gnueabihf@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.27.0.tgz#c7c16432a571ec877bf734fe500e4a43d48c2814" + integrity sha512-MUMRmtdRkOkd5z3h986HOuNBD1c2lq2BSQA1Jg88d9I7bmPGx08bwGcnB75dvr17CwxjxD6XPi3Qh8ArmKFqCA== + +lightningcss-linux-arm64-gnu@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.27.0.tgz#cfd9e18df1cd65131da286ddacfa3aee6862a752" + integrity sha512-cPsxo1QEWq2sfKkSq2Bq5feQDHdUEwgtA9KaB27J5AX22+l4l0ptgjMZZtYtUnteBofjee+0oW1wQ1guv04a7A== + +lightningcss-linux-arm64-musl@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.27.0.tgz#6682ff6b9165acef9a6796bd9127a8e1247bb0ed" + integrity sha512-rCGBm2ax7kQ9pBSeITfCW9XSVF69VX+fm5DIpvDZQl4NnQoMQyRwhZQm9pd59m8leZ1IesRqWk2v/DntMo26lg== + +lightningcss-linux-x64-gnu@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.27.0.tgz#714221212ad184ddfe974bbb7dbe9300dfde4bc0" + integrity sha512-Dk/jovSI7qqhJDiUibvaikNKI2x6kWPN79AQiD/E/KeQWMjdGe9kw51RAgoWFDi0coP4jinaH14Nrt/J8z3U4A== + +lightningcss-linux-x64-musl@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.27.0.tgz#247958daf622a030a6dc2285afa16b7184bdf21e" + integrity sha512-QKjTxXm8A9s6v9Tg3Fk0gscCQA1t/HMoF7Woy1u68wCk5kS4fR+q3vXa1p3++REW784cRAtkYKrPy6JKibrEZA== + +lightningcss-win32-arm64-msvc@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.27.0.tgz#64cfe473c264ef5dc275a4d57a516d77fcac6bc9" + integrity sha512-/wXegPS1hnhkeG4OXQKEMQeJd48RDC3qdh+OA8pCuOPCyvnm/yEayrJdJVqzBsqpy1aJklRCVxscpFur80o6iQ== + +lightningcss-win32-x64-msvc@1.27.0: + version "1.27.0" + resolved "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.27.0.tgz#237d0dc87d9cdc9cf82536bcbc07426fa9f3f422" + integrity sha512-/OJLj94Zm/waZShL8nB5jsNj3CfNATLCTyFxZyouilfTmSoLDX7VlVAmhPHoZWVFp4vdmoiEbPEYC8HID3m6yw== + lightningcss@~1.27.0: version "1.27.0" resolved "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.27.0.tgz" @@ -6836,7 +6770,7 @@ metro-cache@0.81.5: flow-enums-runtime "^0.0.6" metro-core "0.81.5" -metro-config@^0.81.0, metro-config@0.81.5: +metro-config@0.81.5, metro-config@^0.81.0: version "0.81.5" resolved "https://registry.npmmirror.com/metro-config/-/metro-config-0.81.5.tgz" integrity sha512-oDRAzUvj6RNRxratFdcVAqtAsg+T3qcKrGdqGZFUdwzlFJdHGR9Z413sW583uD2ynsuOjA2QB6US8FdwiBdNKg== @@ -6850,7 +6784,7 @@ metro-config@^0.81.0, metro-config@0.81.5: metro-core "0.81.5" metro-runtime "0.81.5" -metro-core@^0.81.0, metro-core@0.81.5: +metro-core@0.81.5, metro-core@^0.81.0: version "0.81.5" resolved "https://registry.npmmirror.com/metro-core/-/metro-core-0.81.5.tgz" integrity sha512-+2R0c8ByfV2N7CH5wpdIajCWa8escUFd8TukfoXyBq/vb6yTCsznoA25FhNXJ+MC/cz1L447Zj3vdUfCXIZBwg== @@ -6889,7 +6823,7 @@ metro-resolver@0.81.5: dependencies: flow-enums-runtime "^0.0.6" -metro-runtime@^0.81.0, metro-runtime@0.81.5: +metro-runtime@0.81.5, metro-runtime@^0.81.0: version "0.81.5" resolved "https://registry.npmmirror.com/metro-runtime/-/metro-runtime-0.81.5.tgz" integrity sha512-M/Gf71ictUKP9+77dV/y8XlAWg7xl76uhU7ggYFUwEdOHHWPG6gLBr1iiK0BmTjPFH8yRo/xyqMli4s3oGorPQ== @@ -6897,7 +6831,7 @@ metro-runtime@^0.81.0, metro-runtime@0.81.5: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" -metro-source-map@^0.81.0, metro-source-map@0.81.5: +metro-source-map@0.81.5, metro-source-map@^0.81.0: version "0.81.5" resolved "https://registry.npmmirror.com/metro-source-map/-/metro-source-map-0.81.5.tgz" integrity sha512-Jz+CjvCKLNbJZYJTBeN3Kq9kIJf6b61MoLBdaOQZJ5Ajhw6Pf95Nn21XwA8BwfUYgajsi6IXsp/dTZsYJbN00Q== @@ -6956,7 +6890,7 @@ metro-transform-worker@0.81.5: metro-transform-plugins "0.81.5" nullthrows "^1.1.1" -metro@^0.81.0, metro@0.81.5: +metro@0.81.5, metro@^0.81.0: version "0.81.5" resolved "https://registry.npmmirror.com/metro/-/metro-0.81.5.tgz" integrity sha512-YpFF0DDDpDVygeca2mAn7K0+us+XKmiGk4rIYMz/CRdjFoCGqAei/IQSpV0UrGfQbToSugpMQeQJveaWSH88Hg== @@ -7010,16 +6944,16 @@ micromatch@^4.0.4, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" -"mime-db@>= 1.43.0 < 2": - version "1.54.0" - resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== +"mime-db@>= 1.43.0 < 2": + version "1.54.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz" + integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== + mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.35, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" @@ -7027,16 +6961,16 @@ mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.35, mime-types@~2.1.24, dependencies: mime-db "1.52.0" -mime@^2.4.1: - version "2.6.0" - resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - mime@1.6.0: version "1.6.0" resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.4.1: + version "2.6.0" + resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz" @@ -7059,14 +6993,7 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.5: +minimatch@^9.0.4, minimatch@^9.0.5: version "9.0.5" resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -7106,16 +7033,16 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - minipass@^5.0.0: version "5.0.0" resolved "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz" @@ -7131,26 +7058,21 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" -mkdirp@^1.0.3: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@^2.1.1, ms@^2.1.3, ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz" @@ -7170,16 +7092,16 @@ natural-compare@^1.4.0: resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.5.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz" @@ -7361,13 +7283,6 @@ object.values@^1.1.6, object.values@^1.2.0, object.values@^1.2.1: define-properties "^1.2.1" es-object-atoms "^1.0.0" -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz" @@ -7375,6 +7290,13 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz" @@ -7473,14 +7395,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-limit@^3.1.0: +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -7594,12 +7509,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz" integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== -path-key@^3.0.0: - version "3.1.1" - resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== @@ -7907,6 +7817,11 @@ react-native-dropdown-picker@^5.4.6: resolved "https://registry.npmmirror.com/react-native-dropdown-picker/-/react-native-dropdown-picker-5.4.6.tgz" integrity sha512-T1XBHbE++M6aRU3wFYw3MvcOuabhWZ29RK/Ivdls2r1ZkZ62iEBZknLUPeVLMX3x6iUxj4Zgr3X2DGlEGXeHsA== +react-native-fbsdk-next@^13.4.1: + version "13.4.1" + resolved "https://registry.npmmirror.com/react-native-fbsdk-next/-/react-native-fbsdk-next-13.4.1.tgz" + integrity sha512-Cto+oF0FJyvxKDjKyLKI5DgnLCeeRlXvVQb8qw0XesT1Xune1ijDWAnvt9fy6wXJ4G7K510xKkcSUsbK/KyPhg== + react-native-gesture-handler@~2.20.2: version "2.20.2" resolved "https://registry.npmmirror.com/react-native-gesture-handler/-/react-native-gesture-handler-2.20.2.tgz" @@ -8417,7 +8332,7 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@~5.2.0, safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -8456,6 +8371,13 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" +scheduler@0.24.0-canary-efb381bbf-20230505: + version "0.24.0-canary-efb381bbf-20230505" + resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz" + integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== + dependencies: + loose-envify "^1.1.0" + scheduler@^0.23.2: version "0.23.2" resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz" @@ -8468,13 +8390,6 @@ scheduler@^0.25.0: resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.25.0.tgz" integrity sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA== -scheduler@0.24.0-canary-efb381bbf-20230505: - version "0.24.0-canary-efb381bbf-20230505" - resolved "https://registry.npmmirror.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz" - integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== - dependencies: - loose-envify "^1.1.0" - selfsigned@^2.4.1: version "2.4.1" resolved "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.4.1.tgz" @@ -8483,50 +8398,30 @@ selfsigned@^2.4.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver@^5.3.0: - version "5.7.2" - resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^5.5.0: - version "5.7.2" - resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== +semver@7.x, semver@^7.1.3, semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: + version "7.7.2" + resolved "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== -semver@^5.6.0: +semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.1.0: - version "6.3.1" - resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^6.3.0: +semver@^6.1.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.1.3, semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@7.x: - version "7.7.2" - resolved "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -send@^0.19.0: - version "0.19.1" - resolved "https://registry.npmmirror.com/send/-/send-0.19.1.tgz" - integrity sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg== +send@0.19.0: + version "0.19.0" + resolved "https://registry.npmmirror.com/send/-/send-0.19.0.tgz" + integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" destroy "1.2.0" - encodeurl "~2.0.0" + encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" @@ -8537,15 +8432,15 @@ send@^0.19.0: range-parser "~1.2.1" statuses "2.0.1" -send@0.19.0: - version "0.19.0" - resolved "https://registry.npmmirror.com/send/-/send-0.19.0.tgz" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== +send@^0.19.0: + version "0.19.1" + resolved "https://registry.npmmirror.com/send/-/send-0.19.1.tgz" + integrity sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg== dependencies: debug "2.6.9" depd "2.0.0" destroy "1.2.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" @@ -8779,6 +8674,11 @@ source-map-support@^0.5.16, source-map-support@~0.5.20, source-map-support@~0.5. buffer-from "^1.0.0" source-map "^0.6.0" +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.6.tgz" + integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== + source-map@^0.5.6: version "0.5.7" resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz" @@ -8789,11 +8689,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.6.tgz" - integrity sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== - split-on-first@^1.0.0: version "1.1.0" resolved "https://registry.npmmirror.com/split-on-first/-/split-on-first-1.1.0.tgz" @@ -8854,17 +8749,17 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" -statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stream-buffers@~2.2.0, stream-buffers@2.2.x: +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +stream-buffers@2.2.x, stream-buffers@~2.2.0: version "2.2.0" resolved "https://registry.npmmirror.com/stream-buffers/-/stream-buffers-2.2.0.tgz" integrity sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg== @@ -8874,13 +8769,6 @@ strict-uri-encode@^2.0.0: resolved "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - string-length@^4.0.1: version "4.0.2" resolved "https://registry.npmmirror.com/string-length/-/string-length-4.0.2.tgz" @@ -8983,6 +8871,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + stringify-entities@^3.1.0: version "3.1.0" resolved "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-3.1.0.tgz" @@ -8999,14 +8894,7 @@ stringify-entities@^3.1.0: dependencies: ansi-regex "^5.0.1" -strip-ansi@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^5.2.0: +strip-ansi@^5.0.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -9494,7 +9382,7 @@ universalify@^2.0.0: resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -9579,7 +9467,7 @@ walker@^1.0.7, walker@^1.0.8: dependencies: makeerror "1.0.12" -warn-once@^0.1.0, warn-once@0.1.1: +warn-once@0.1.1, warn-once@^0.1.0: version "0.1.1" resolved "https://registry.npmmirror.com/warn-once/-/warn-once-0.1.1.tgz" integrity sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q== @@ -9800,22 +9688,12 @@ ws@^6.2.3: dependencies: async-limiter "~1.0.0" -ws@^7: - version "7.5.10" - resolved "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -ws@^7.5.10: +ws@^7, ws@^7.5.10: version "7.5.10" resolved "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.11.0: - version "8.18.2" - resolved "https://registry.npmmirror.com/ws/-/ws-8.18.2.tgz" - integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== - -ws@^8.12.1: +ws@^8.11.0, ws@^8.12.1: version "8.18.2" resolved "https://registry.npmmirror.com/ws/-/ws-8.18.2.tgz" integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==