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..0988f57 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,176 @@ +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.anonymous.BrixCafe' + defaultConfig { + applicationId 'com.anonymous.BrixCafe' + 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 + } +} 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/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..1eb50de --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/java/com/anonymous/BrixCafe/MainActivity.kt b/android/app/src/main/java/com/anonymous/BrixCafe/MainActivity.kt new file mode 100644 index 0000000..c833e3b --- /dev/null +++ b/android/app/src/main/java/com/anonymous/BrixCafe/MainActivity.kt @@ -0,0 +1,65 @@ +package com.anonymous.BrixCafe +import expo.modules.splashscreen.SplashScreenManager + +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); + // @generated begin expo-splashscreen - expo prebuild (DO NOT MODIFY) sync-f3ff59a738c56c9a6119210cb55f0b613eb8b6af + SplashScreenManager.registerOnActivity(this) + // @generated end expo-splashscreen + 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/anonymous/BrixCafe/MainApplication.kt b/android/app/src/main/java/com/anonymous/BrixCafe/MainApplication.kt new file mode 100644 index 0000000..99fd2f8 --- /dev/null +++ b/android/app/src/main/java/com/anonymous/BrixCafe/MainApplication.kt @@ -0,0 +1,57 @@ +package com.anonymous.BrixCafe + +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..2d3c3bb --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,6 @@ + + BrixCafe + automatic + 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..6bc0170 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..abbcb8e --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,41 @@ +// 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.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..7531e9e --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,56 @@ +# 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 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 100644 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..9d21a21 --- /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..2f83903 --- /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 = 'BrixCafe' + +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 da93112..a65bcb2 100644 --- a/app.json +++ b/app.json @@ -17,9 +17,10 @@ "backgroundColor": "#ffffff" }, "statusBar": { - "hidden": false, - "barStyle": "dark-content" - } + "hidden": false, + "barStyle": "dark-content" + }, + "package": "com.anonymous.BrixCafe" }, "web": { "bundler": "metro", diff --git a/app/index.tsx b/app/index.tsx index e9458e2..2e47a1a 100644 --- a/app/index.tsx +++ b/app/index.tsx @@ -1,5 +1,90 @@ -import { Redirect } from 'expo-router'; +import React from 'react'; +import { View, Text, Image, StyleSheet, TouchableOpacity } from 'react-native'; +import { router } from 'expo-router'; +import COLORS from './constants/colors'; +import { StatusBar } from 'expo-status-bar'; -export default function Index() { - return ; -} \ No newline at end of file + +const OpeningScreen = () => { + + return ( + + + + Bienvenue chez Brix Café + + + Depuis 2024, Brix Café vous fait vivre une expérience café unique, + inspirée du savoir-faire italien et portée par une passion authentique. + Des grains d’exception, une qualité incomparable. + + + router.push('/screens/auth/SignIn-Screen')}> + Se connecter + + + router.push('/screens/auth/SignUpScreen')}> + Créer un compte + + + ); +}; + +// Styles +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#000000', + alignItems: 'center', + justifyContent: 'center', + paddingHorizontal: 20, + }, + logo: { + width: 120, + height: 120, + marginBottom: 20, + }, + welcomeText: { + fontSize: 26, + fontWeight: 'bold', + color: COLORS.text, + marginBottom: 20, + }, + coffeeImage: { + width: '120%', + height: 150, + marginTop:40, + marginBottom: 30, + }, + descriptionText: { + fontSize: 14, + color: COLORS.text, + textAlign: 'center', + marginBottom: 40, + }, + signInButton: { + backgroundColor: COLORS.primary, + paddingVertical: 15, + paddingHorizontal: 40, + borderRadius: 10, + marginBottom: 20, + width: '80%', + alignItems: 'center', + }, + signUpButton: { + borderWidth: 1, + borderColor: COLORS.primary, + paddingVertical: 15, + paddingHorizontal: 40, + borderRadius: 10, + width: '80%', + alignItems: 'center', + }, + buttonText: { + fontSize: 16, + color: COLORS.text, + fontWeight: 'bold', + }, +}); + +export default OpeningScreen; diff --git a/app/screens/auth/OpeningScreen.tsx b/app/screens/auth/OpeningScreen.tsx index 4ccf9aa..e69de29 100644 --- a/app/screens/auth/OpeningScreen.tsx +++ b/app/screens/auth/OpeningScreen.tsx @@ -1,90 +0,0 @@ -import React from 'react'; -import { View, Text, Image, StyleSheet, TouchableOpacity } from 'react-native'; -import { router } from 'expo-router'; -import COLORS from '../../constants/colors'; -import { StatusBar } from 'expo-status-bar'; - - -const OpeningScreen = () => { - - return ( - - - - Bienvenue chez Brix Café - - - Depuis 2024, Brix Café vous fait vivre une expérience café unique, - inspirée du savoir-faire italien et portée par une passion authentique. - Des grains d’exception, une qualité incomparable. - - - router.push('/screens/auth/SignInScreen')}> - Se connecter - - - router.push('/screens/auth/SignUpScreen')}> - Créer un compte - - - ); -}; - -// Styles -const styles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: '#000000', - alignItems: 'center', - justifyContent: 'center', - paddingHorizontal: 20, - }, - logo: { - width: 120, - height: 120, - marginBottom: 20, - }, - welcomeText: { - fontSize: 26, - fontWeight: 'bold', - color: COLORS.text, - marginBottom: 20, - }, - coffeeImage: { - width: '120%', - height: 150, - marginTop:40, - marginBottom: 30, - }, - descriptionText: { - fontSize: 14, - color: COLORS.text, - textAlign: 'center', - marginBottom: 40, - }, - signInButton: { - backgroundColor: COLORS.primary, - paddingVertical: 15, - paddingHorizontal: 40, - borderRadius: 10, - marginBottom: 20, - width: '80%', - alignItems: 'center', - }, - signUpButton: { - borderWidth: 1, - borderColor: COLORS.primary, - paddingVertical: 15, - paddingHorizontal: 40, - borderRadius: 10, - width: '80%', - alignItems: 'center', - }, - buttonText: { - fontSize: 16, - color: COLORS.text, - fontWeight: 'bold', - }, -}); - -export default OpeningScreen; diff --git a/app/screens/auth/SignIn-Screen.tsx b/app/screens/auth/SignIn-Screen.tsx new file mode 100644 index 0000000..3fc9ea9 --- /dev/null +++ b/app/screens/auth/SignIn-Screen.tsx @@ -0,0 +1,326 @@ +import { useState } from "react"; +import { + View, + Text, + TextInput, + Pressable, + StyleSheet, + Image, + Alert, + TouchableOpacity, +} from "react-native"; +import { Eye, EyeOff } from "lucide-react-native"; +import { router } from "expo-router"; +import { signIn } from "../../../firebase/auth"; // Assure-toi que le chemin est correct +import { Link } from "expo-router"; +import { KeyboardAwareScrollView } from "react-native-keyboard-aware-scroll-view"; // Import the library +import COLORS from "@/app/constants/colors"; + + + +const SignInScreen = () => { + const [form, setForm] = useState({ + email: "", + password: "", + rememberMe: false, + }); + + const [errors, setErrors] = useState({ + email: "", + password: "", + }); + + const [showPassword, setShowPassword] = useState(false); + + const validateForm = () => { + let valid = true; + const newErrors = { email: "", password: "" }; + + if (!form.email) { + newErrors.email = "L'e-mail est requis."; + valid = false; + } + + if (!form.password) { + newErrors.password = "Le mot de passe est requis."; + valid = false; + } + + setErrors(newErrors); + return valid; + }; + + const handleLogin = async () => { + if (!validateForm()) return; + + try { + const { user } = await signIn(form.email, form.password); // Destructure to get user + console.log("Connexion réussie :", user.email); // Access the email directly + router.replace("/screens/user/UserHomeScreen"); // You can route based on role later + } catch (error: any) { + Alert.alert("Erreur", error.message); // Display the error message + } + }; + + return ( + + + router.back()} style={styles.backButton}> + + + + + + Se connecter + + Bienvenue! 👋 + + + + E-mail + { + setForm({ ...form, email: text }); + if (errors.email) setErrors({ ...errors, email: "" }); + }} + /> + {errors.email ? ( + {errors.email} + ) : null} + + + + Mot de passe + + { + setForm({ ...form, password: text }); + if (errors.password) setErrors({ ...errors, password: "" }); + }} + /> + setShowPassword(!showPassword)} + style={styles.eyeIcon} + > + {showPassword ? ( + + ) : ( + + )} + + + {errors.password ? ( + {errors.password} + ) : null} + + + + setForm({ ...form, rememberMe: !form.rememberMe })} + > + + Rester Connecté + + + Mot de passe oublié? + + + + + + Connexion + + + + Nouveau ici? + + Créer un compte + + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: "#fff", + padding: 20, + }, + scrollkeyboard:{ + flexGrow: 1, + backgroundColor:"#fff", + + }, + backButton: { + marginTop: 2, + marginBottom: 0, + }, + backText: { + fontSize: 40, + color: "#000", + }, + logo: { + width: 100, + height: 100, + alignSelf: "center", + marginBottom: 20, + }, + title: { + fontSize: 24, + fontWeight: "bold", + textAlign: "center", + marginBottom: 30, + }, + welcome: { + fontSize: 28, + fontWeight: "bold", + marginBottom: 30, + }, + form: { + gap: 20, + }, + inputGroup: { + gap: 8, + }, + label: { + fontSize: 16, + fontWeight: "500", + color: "#333", + }, + input: { + backgroundColor: "#f5f5f5", + padding: 16, + borderRadius: 8, + borderWidth:1, + borderColor: COLORS.primary, + fontSize: 16, + }, + inputError: { + borderWidth: 1, + borderColor: "#ff4444", + }, + errorText: { + color: "#ff4444", + fontSize: 14, + marginTop: 4, + }, + passwordContainer: { + flexDirection: "row", + alignItems: "center", + backgroundColor: "#f5f5f5", + borderRadius: 8, + }, + passwordInput: { + flex: 1, + padding: 16, + fontSize: 16, + borderTopWidth: 1, + borderLeftWidth: 1, + borderBottomWidth: 1, + borderColor: COLORS.primary, + }, + eyeIcon: { + padding: 17, + borderTopWidth: 1, + borderRightWidth: 1, + borderBottomWidth: 1, + borderColor: COLORS.primary, + + }, + optionsContainer: { + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + marginTop: 8, + }, + rememberMe: { + flexDirection: "row", + alignItems: "center", + gap: 8, + }, + checkbox: { + width: 20, + height: 20, + borderRadius: 4, + borderWidth: 2, + borderColor: "#B17741", + }, + checkboxChecked: { + backgroundColor: "#B17741", + }, + rememberText: { + color: "#333", + fontSize: 14, + }, + forgotPassword: { + padding: 4, + }, + forgotText: { + color: "#B17741", + fontSize: 14, + fontWeight: "500", + }, + loginButton: { + backgroundColor: "#B17741", + padding: 16, + borderRadius: 8, + marginTop: 50, + }, + loginButtonText: { + color: "#fff", + textAlign: "center", + fontSize: 16, + fontWeight: "600", + }, + signupContainer: { + flexDirection: "row", + justifyContent: "center", + alignItems: "center", + marginTop: 20, + }, + signupText: { + color: "#666", + fontSize: 14, + }, + signupLink: { + padding: 4, + }, + signupLinkText: { + color: "#B17741", + fontSize: 14, + fontWeight: "500", + }, +}); + +export default SignInScreen; diff --git a/app/screens/auth/SignInScreen.tsx b/app/screens/auth/SignInScreen.tsx deleted file mode 100644 index d8d86c5..0000000 --- a/app/screens/auth/SignInScreen.tsx +++ /dev/null @@ -1,299 +0,0 @@ -import { useState } from "react"; -import { - View, - Text, - TextInput, - Pressable, - StyleSheet, - Image, - Alert, - TouchableOpacity, -} from "react-native"; -import { Eye, EyeOff } from "lucide-react-native"; -import { router } from "expo-router"; -import { signIn } from "../../../firebase/auth"; // Assure-toi que le chemin est correct -import { Link } from "expo-router"; - - - -const SignInScreen = () => { - const [form, setForm] = useState({ - email: "", - password: "", - rememberMe: false, - }); - - const [errors, setErrors] = useState({ - email: "", - password: "", - }); - - const [showPassword, setShowPassword] = useState(false); - - const validateForm = () => { - let valid = true; - const newErrors = { email: "", password: "" }; - - if (!form.email) { - newErrors.email = "L'e-mail est requis."; - valid = false; - } - - if (!form.password) { - newErrors.password = "Le mot de passe est requis."; - valid = false; - } - - setErrors(newErrors); - return valid; - }; - - const handleLogin = async () => { - if (!validateForm()) return; - - try { - const { user } = await signIn(form.email, form.password); // Destructure to get user - console.log("Connexion réussie :", user.email); // Access the email directly - router.replace("/screens/user/UserHomeScreen"); // You can route based on role later - } catch (error: any) { - Alert.alert("Erreur", error.message); // Display the error message - } - }; - - return ( - - router.back()} style={styles.backButton}> - - - - - - Se connecter - - Bienvenue! 👋 - - - - E-mail - { - setForm({ ...form, email: text }); - if (errors.email) setErrors({ ...errors, email: "" }); - }} - /> - {errors.email ? ( - {errors.email} - ) : null} - - - - Mot de passe - - { - setForm({ ...form, password: text }); - if (errors.password) setErrors({ ...errors, password: "" }); - }} - /> - setShowPassword(!showPassword)} - style={styles.eyeIcon} - > - {showPassword ? ( - - ) : ( - - )} - - - {errors.password ? ( - {errors.password} - ) : null} - - - - setForm({ ...form, rememberMe: !form.rememberMe })} - > - - Rester Connecté - - - Mot de passe oublié? - - - - - - Connexion - - - - Nouveau ici? - - Créer un compte - - - - ); -}; - -const styles = StyleSheet.create({ - container: { - flex: 1, - backgroundColor: "#fff", - padding: 20, - }, - backButton: { - marginTop: 2, - marginBottom: 0, - }, - backText: { - fontSize: 40, - color: "#000", - }, - logo: { - width: 100, - height: 100, - alignSelf: "center", - marginBottom: 20, - }, - title: { - fontSize: 24, - fontWeight: "bold", - textAlign: "center", - marginBottom: 30, - }, - welcome: { - fontSize: 28, - fontWeight: "bold", - marginBottom: 30, - }, - form: { - gap: 20, - }, - inputGroup: { - gap: 8, - }, - label: { - fontSize: 16, - fontWeight: "500", - color: "#333", - }, - input: { - backgroundColor: "#f5f5f5", - padding: 16, - borderRadius: 8, - fontSize: 16, - }, - inputError: { - borderWidth: 1, - borderColor: "#ff4444", - }, - errorText: { - color: "#ff4444", - fontSize: 14, - marginTop: 4, - }, - passwordContainer: { - flexDirection: "row", - alignItems: "center", - backgroundColor: "#f5f5f5", - borderRadius: 8, - }, - passwordInput: { - flex: 1, - padding: 16, - fontSize: 16, - }, - eyeIcon: { - padding: 16, - }, - optionsContainer: { - flexDirection: "row", - justifyContent: "space-between", - alignItems: "center", - marginTop: 8, - }, - rememberMe: { - flexDirection: "row", - alignItems: "center", - gap: 8, - }, - checkbox: { - width: 20, - height: 20, - borderRadius: 4, - borderWidth: 2, - borderColor: "#B17741", - }, - checkboxChecked: { - backgroundColor: "#B17741", - }, - rememberText: { - color: "#333", - fontSize: 14, - }, - forgotPassword: { - padding: 4, - }, - forgotText: { - color: "#B17741", - fontSize: 14, - fontWeight: "500", - }, - loginButton: { - backgroundColor: "#B17741", - padding: 16, - borderRadius: 8, - marginTop: 30, - }, - loginButtonText: { - color: "#fff", - textAlign: "center", - fontSize: 16, - fontWeight: "600", - }, - signupContainer: { - flexDirection: "row", - justifyContent: "center", - alignItems: "center", - marginTop: 20, - }, - signupText: { - color: "#666", - fontSize: 14, - }, - signupLink: { - padding: 4, - }, - signupLinkText: { - color: "#B17741", - fontSize: 14, - fontWeight: "500", - }, -}); - -export default SignInScreen; diff --git a/firebase/auth.ts b/firebase/auth.ts index ff8558f..a475b57 100644 --- a/firebase/auth.ts +++ b/firebase/auth.ts @@ -1,49 +1,25 @@ -// auth.ts -import auth from '@react-native-firebase/auth'; // Importing Firebase Authentication from React Native Firebase -import { FirebaseAuthTypes } from '@react-native-firebase/auth'; +import { getAuth, signInWithEmailAndPassword, createUserWithEmailAndPassword } from "firebase/auth"; +import { app } from "./config"; // ton fichier config Firebase + + + +const auth = getAuth(app); -// Function to handle user sign-in with email and password export const signIn = async (email: string, password: string) => { try { - const userCredential = await auth().signInWithEmailAndPassword(email, password); - return { user: userCredential.user }; // Return the user on success + const userCredential = await signInWithEmailAndPassword(auth, email, password); + return { user: userCredential.user }; } catch (error: any) { - throw new Error(error.message); // Throw an error if sign-in fails + throw new Error(error.message); } }; -// Function to handle user sign-up with email and password + export const signUp = async (email: string, password: string) => { try { - const userCredential = await auth().createUserWithEmailAndPassword(email, password); - const user = userCredential.user; - console.log('User signed up:', user); - return user; - } catch (error) { - console.error('Error signing up:', error); - throw error; + const userCredential = await createUserWithEmailAndPassword(auth, email, password); + return userCredential.user; + } catch (error: any) { + throw new Error(error.message); } }; - -// Function to handle user sign-out -export const signOutUser = async () => { - try { - await auth().signOut(); - console.log('User signed out'); - } catch (error) { - console.error('Error signing out:', error); - throw error; - } -}; - -// Listen for changes in authentication state -export const authStateListener = (callback: (user: FirebaseAuthTypes.User | null) => void) => { - return auth().onAuthStateChanged(user => { - if (user) { - console.log('User is authenticated:', user); - } else { - console.log('No user is signed in.'); - } - callback(user); - }); -}; diff --git a/firebase/config.ts b/firebase/config.ts index b17631f..96f9dbf 100644 --- a/firebase/config.ts +++ b/firebase/config.ts @@ -1,18 +1,16 @@ -// config.ts +// firebase/config.ts import { FirebaseApp, initializeApp } from 'firebase/app'; -// Your web app's Firebase configuration const firebaseConfig = { apiKey: 'AIzaSyDHoF8Eahk60s3APh7WxohL1bya_44v39k', authDomain: 'brix-cafe-2ddf1.firebaseapp.com', projectId: 'brix-cafe-2ddf1', - storageBucket: 'brix-cafe-2ddf1.firebasestorage.app', + storageBucket: 'brix-cafe-2ddf1.appspot.com', messagingSenderId: '577471189504', appId: '1:577471189504:web:7bf8819223bf0d4cf03ee5', measurementId: 'G-FSV5ZQBJS3', }; -// Initialize Firebase const app: FirebaseApp = initializeApp(firebaseConfig); export { app }; diff --git a/firebase/session.ts b/firebase/session.ts new file mode 100644 index 0000000..e092980 --- /dev/null +++ b/firebase/session.ts @@ -0,0 +1,23 @@ +// firebase/session.ts +import { getAuth, onAuthStateChanged, User } from "firebase/auth"; +import AsyncStorage from "@react-native-async-storage/async-storage"; +import { app } from "./config"; + +const auth = getAuth(app); + +export const monitorAuthState = (onUserChange: (user: User | null) => void) => { + onAuthStateChanged(auth, async (user) => { + if (user) { + await AsyncStorage.setItem("user", JSON.stringify(user)); + onUserChange(user); + } else { + await AsyncStorage.removeItem("user"); + onUserChange(null); + } + }); +}; + +export const getStoredUser = async (): Promise => { + const json = await AsyncStorage.getItem("user"); + return json ? JSON.parse(json) : null; +}; diff --git a/package-lock.json b/package-lock.json index f258734..1a07850 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,7 @@ "version": "1.0.0", "dependencies": { "@expo/vector-icons": "^14.0.2", - "@react-native-async-storage/async-storage": "^1.24.0", - "@react-native-firebase/app": "^21.14.0", - "@react-native-firebase/auth": "^21.14.0", + "@react-native-async-storage/async-storage": "1.23.1", "@react-navigation/bottom-tabs": "^7.2.0", "@react-navigation/native": "^7.0.14", "expo": "~52.0.46", @@ -32,6 +30,7 @@ "react-dom": "18.3.1", "react-native": "0.76.9", "react-native-gesture-handler": "~2.20.2", + "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-reanimated": "~3.16.1", "react-native-safe-area-context": "4.12.0", "react-native-screens": "~4.4.0", @@ -3957,9 +3956,9 @@ } }, "node_modules/@react-native-async-storage/async-storage": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.24.0.tgz", - "integrity": "sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==", + "version": "1.23.1", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.23.1.tgz", + "integrity": "sha512-Qd2kQ3yi6Y3+AcUlrHxSLlnBvpdCEMVGFlVBneVOjaFaPU61g1huc38g339ysXspwY1QZA2aNhrk/KlHGO+ewA==", "dependencies": { "merge-options": "^3.0.4" }, @@ -3967,543 +3966,6 @@ "react-native": "^0.0.0-0 || >=0.60 <1.0" } }, - "node_modules/@react-native-firebase/app": { - "version": "21.14.0", - "resolved": "https://registry.npmjs.org/@react-native-firebase/app/-/app-21.14.0.tgz", - "integrity": "sha512-vBNfn7PoQrZfANLJnJiWZSHVu7WG6hjM5w3MDfmG8DLdr8VsAVBUgsn8lGpqobSuno1vTgwDIhR8PYZjMGsuvg==", - "dependencies": { - "firebase": "11.3.1" - }, - "peerDependencies": { - "expo": ">=47.0.0", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/analytics": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.11.tgz", - "integrity": "sha512-zwuPiRE0+hgcS95JZbJ6DFQN4xYFO8IyGxpeePTV51YJMwCf3lkBa6FnZ/iXIqDKcBPMgMuuEZozI0BJWaLEYg==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/analytics-compat": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.17.tgz", - "integrity": "sha512-SJNVOeTvzdqZQvXFzj7yAirXnYcLDxh57wBFROfeowq/kRN1AqOw1tG6U4OiFOEhqi7s3xLze/LMkZatk2IEww==", - "dependencies": { - "@firebase/analytics": "0.10.11", - "@firebase/analytics-types": "0.8.3", - "@firebase/component": "0.6.12", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/app": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.11.1.tgz", - "integrity": "sha512-Vz4DrNLPfDx3RwQf+4klXtu7OUYDO6xz2hlRyFawWskS7YqdtNzkDDxrqH20KDfjCF1lib46/NgchIj1+8h4wQ==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/app-check": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.11.tgz", - "integrity": "sha512-42zIfRI08/7bQqczAy7sY2JqZYEv3a1eNa4fLFdtJ54vNevbBIRSEA3fZgRqWFNHalh5ohsBXdrYgFqaRIuCcQ==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/app-check-compat": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.18.tgz", - "integrity": "sha512-qjozwnwYmAIdrsVGrJk+hnF1WBois54IhZR6gO0wtZQoTvWL/GtiA2F31TIgAhF0ayUiZhztOv1RfC7YyrZGDQ==", - "dependencies": { - "@firebase/app-check": "0.8.11", - "@firebase/app-check-types": "0.5.3", - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/app-compat": { - "version": "0.2.50", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.50.tgz", - "integrity": "sha512-7yD362icKgjoNvFxwth420TNZgqCfuTJ28yQCdpyjC2fXyaZHhAbxVKnHEXGTAaUKSHWxsIy46lBKGi/x/Mflw==", - "dependencies": { - "@firebase/app": "0.11.1", - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/auth": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.9.0.tgz", - "integrity": "sha512-Xz2mbEYauF689qXG/4HppS2+/yGo9R7B6eNUBh3H2+XpAZTGdx8d8TFsW/BMTAK9Q95NB0pb1Bbvfx0lwofq8Q==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^1.18.1" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/auth-compat": { - "version": "0.5.18", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.5.18.tgz", - "integrity": "sha512-dFBev8AMNb2AgIt9afwf/Ku4/0Wq9R9OFSeBB/xjyJt+RfQ9PnNWqU2oFphews23byLg6jle8twRA7iOYfRGRw==", - "dependencies": { - "@firebase/auth": "1.9.0", - "@firebase/auth-types": "0.13.0", - "@firebase/component": "0.6.12", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/component": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.12.tgz", - "integrity": "sha512-YnxqjtohLbnb7raXt2YuA44cC1wA9GiehM/cmxrsoxKlFxBLy2V0OkRSj9gpngAE0UoJ421Wlav9ycO7lTPAUw==", - "dependencies": { - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/data-connect": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.0.tgz", - "integrity": "sha512-inbLq0JyQD/d02Al3Lso0Hc8z1BVpB3dYSMFcQkeKhYyjn5bspLczLdasPbCOEUp8MOkLblLZhJuRs7Q/spFnw==", - "dependencies": { - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/database": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.12.tgz", - "integrity": "sha512-psFl5t6rSFHq3i3fnU1QQlc4BB9Hnhh8TgEqvQlPPm8kDLw8gYxvjqYw3c5CZW0+zKR837nwT6im/wtJUivMKw==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/database-compat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.0.3.tgz", - "integrity": "sha512-uHGQrSUeJvsDfA+IyHW5O4vdRPsCksEzv4T4Jins+bmQgYy20ZESU4x01xrQCn/nzqKHuQMEW99CoCO7D+5NiQ==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/database": "1.0.12", - "@firebase/database-types": "1.0.8", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/database-types": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.8.tgz", - "integrity": "sha512-6lPWIGeufhUq1heofZULyVvWFhD01TUrkkB9vyhmksjZ4XF7NaivQp9rICMk7QNhqwa+uDCaj4j+Q8qqcSVZ9g==", - "dependencies": { - "@firebase/app-types": "0.9.3", - "@firebase/util": "1.10.3" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/firestore": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.7.8.tgz", - "integrity": "sha512-eDvVJ/I5vSmIdGmLHJAK1OcviigIxjjia6i5/AkMFq6vZMt7CBXA0B5Xz9pGRCZ7WewFcsCbK1ZUQoYJ91+Cew==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "@firebase/webchannel-wrapper": "1.0.3", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/firestore-compat": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.43.tgz", - "integrity": "sha512-zxg7YS07XQnTetGs3GADM/eA6HB4vWUp+Av4iugmTbft0fQxuTSnGm7ifctaYuR7VMTPckU9CW+oFC9QUNSYvg==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/firestore": "4.7.8", - "@firebase/firestore-types": "3.0.3", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/functions": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.12.2.tgz", - "integrity": "sha512-iKpFDoCYk/Qm+Qwv5ynRb9/yq64QOt0A0+t9NuekyAZnSoV56kSNq/PmsVmBauar5SlmEjhHk6QKdMBP9S0gXA==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.6.12", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/functions-compat": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.19.tgz", - "integrity": "sha512-uw4tR8NcJCDu86UD63Za8A8SgFgmAVFb1XsGlkuBY7gpLyZWEFavWnwRkZ/8cUwpqUhp/SptXFZ1WFJSnOokLw==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/functions": "0.12.2", - "@firebase/functions-types": "0.6.3", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/installations": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.12.tgz", - "integrity": "sha512-ES/WpuAV2k2YtBTvdaknEo7IY8vaGjIjS3zhnHSAIvY9KwTR8XZFXOJoZ3nSkjN1A5R4MtEh+07drnzPDg9vaw==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/util": "1.10.3", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/installations-compat": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.12.tgz", - "integrity": "sha512-RhcGknkxmFu92F6Jb3rXxv6a4sytPjJGifRZj8MSURPuv2Xu+/AispCXEfY1ZraobhEHTG5HLGsP6R4l9qB5aA==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", - "@firebase/installations-types": "0.5.3", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/messaging": { - "version": "0.12.16", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.16.tgz", - "integrity": "sha512-VJ8sCEIeP3+XkfbJA7410WhYGHdloYFZXoHe/vt+vNVDGw8JQPTQSVTRvjrUprEf5I4Tbcnpr2H34lS6zhCHSA==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.10.3", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/messaging-compat": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.16.tgz", - "integrity": "sha512-9HZZ88Ig3zQ0ok/Pwt4gQcNsOhoEy8hDHoGsV1am6ulgMuGuDVD2gl11Lere2ksL+msM12Lddi2x/7TCqmODZw==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/messaging": "0.12.16", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/performance": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.0.tgz", - "integrity": "sha512-L91PwYuiJdKXKSRqsWNicvTppAJVzKjye03UlegeD6TkpKjb93T8AmJ9B0Mt0bcWHCNtnnRBCdSCvD2U9GZDjw==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0", - "web-vitals": "^4.2.4" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/performance-compat": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.13.tgz", - "integrity": "sha512-pB0SMQj2TLQ6roDcX0YQDWvUnVgsVOl0VnUvyT/VBdCUuQYDHobZsPEuQsoEqmPA44KS/Gl0oyKqf+I8UPtRgw==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/performance": "0.7.0", - "@firebase/performance-types": "0.2.3", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/remote-config": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.5.0.tgz", - "integrity": "sha512-weiEbpBp5PBJTHUWR4GwI7ZacaAg68BKha5QnZ8Go65W4oQjEWqCW/rfskABI/OkrGijlL3CUmCB/SA6mVo0qA==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/installations": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/remote-config-compat": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.12.tgz", - "integrity": "sha512-91jLWPtubIuPBngg9SzwvNCWzhMLcyBccmt7TNZP+y1cuYFNOWWHKUXQ3IrxCLB7WwLqQaEu7fTDAjHsTyBsSw==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/remote-config": "0.5.0", - "@firebase/remote-config-types": "0.4.0", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/storage": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.13.6.tgz", - "integrity": "sha512-BEJLYQzVgAoglRl5VRIRZ91RRBZgS/O37/PSGQJBYNuoLmFZUrtwrlLTOAwG776NlO9VQR+K2j15/36Lr2EqHA==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/storage-compat": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.16.tgz", - "integrity": "sha512-EeMuok/s0r938lEomia8XILEqSYULm7HcYZ/GTZLDWur0kMf2ktuPVZiTdRiwEV3Iki7FtQO5txrQ/0pLRVLAw==", - "dependencies": { - "@firebase/component": "0.6.12", - "@firebase/storage": "0.13.6", - "@firebase/storage-types": "0.8.3", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/util": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.10.3.tgz", - "integrity": "sha512-wfoF5LTy0m2ufUapV0ZnpcGQvuavTbJ5Qr1Ze9OJGL70cSMvhDyjS4w2121XdA3lGZSTOsDOyGhpoDtYwck85A==", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@react-native-firebase/app/node_modules/@firebase/vertexai": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@firebase/vertexai/-/vertexai-1.0.4.tgz", - "integrity": "sha512-Nkf/r4u166b4Id6zrrW0Qtg1KyZpQvvYchtkebamnHtIfY+Qnt51I/sx4Saos/WrmO8SnrSU850LfmJ7pehYXg==", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/component": "0.6.12", - "@firebase/logger": "0.4.4", - "@firebase/util": "1.10.3", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@firebase/app-types": "0.x" - } - }, - "node_modules/@react-native-firebase/app/node_modules/firebase": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-11.3.1.tgz", - "integrity": "sha512-P4YVFM0Bm2d8aO61SCEMF8E1pYgieGLrmr/LFw7vs6sAMebwuwHt+Wug+1qL2fhAHWPwpWbCLsdJH8NQ+4Sw8Q==", - "dependencies": { - "@firebase/analytics": "0.10.11", - "@firebase/analytics-compat": "0.2.17", - "@firebase/app": "0.11.1", - "@firebase/app-check": "0.8.11", - "@firebase/app-check-compat": "0.3.18", - "@firebase/app-compat": "0.2.50", - "@firebase/app-types": "0.9.3", - "@firebase/auth": "1.9.0", - "@firebase/auth-compat": "0.5.18", - "@firebase/data-connect": "0.3.0", - "@firebase/database": "1.0.12", - "@firebase/database-compat": "2.0.3", - "@firebase/firestore": "4.7.8", - "@firebase/firestore-compat": "0.3.43", - "@firebase/functions": "0.12.2", - "@firebase/functions-compat": "0.3.19", - "@firebase/installations": "0.6.12", - "@firebase/installations-compat": "0.2.12", - "@firebase/messaging": "0.12.16", - "@firebase/messaging-compat": "0.2.16", - "@firebase/performance": "0.7.0", - "@firebase/performance-compat": "0.2.13", - "@firebase/remote-config": "0.5.0", - "@firebase/remote-config-compat": "0.2.12", - "@firebase/storage": "0.13.6", - "@firebase/storage-compat": "0.3.16", - "@firebase/util": "1.10.3", - "@firebase/vertexai": "1.0.4" - } - }, - "node_modules/@react-native-firebase/auth": { - "version": "21.14.0", - "resolved": "https://registry.npmjs.org/@react-native-firebase/auth/-/auth-21.14.0.tgz", - "integrity": "sha512-m4BFrq/pC4OlPPLZJjDu0n/3QHM+pE5KlYc7dvnE8zavtlqKclvZ6cchcfm4DsPVqmuQOJ1QQqrYdOfRm3hsHA==", - "dependencies": { - "plist": "^3.1.0" - }, - "peerDependencies": { - "@react-native-firebase/app": "21.14.0", - "expo": ">=47.0.0" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, "node_modules/@react-native/assets-registry": { "version": "0.76.9", "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.9.tgz", @@ -12243,6 +11705,14 @@ "react": "^16.6.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-native-iphone-x-helper": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz", + "integrity": "sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==", + "peerDependencies": { + "react-native": ">=0.42.0" + } + }, "node_modules/react-native-is-edge-to-edge": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.7.tgz", @@ -12252,6 +11722,18 @@ "react-native": "*" } }, + "node_modules/react-native-keyboard-aware-scroll-view": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/react-native-keyboard-aware-scroll-view/-/react-native-keyboard-aware-scroll-view-0.9.5.tgz", + "integrity": "sha512-XwfRn+T/qBH9WjTWIBiJD2hPWg0yJvtaEw6RtPCa5/PYHabzBaWxYBOl0usXN/368BL1XktnZPh8C2lmTpOREA==", + "dependencies": { + "prop-types": "^15.6.2", + "react-native-iphone-x-helper": "^1.0.3" + }, + "peerDependencies": { + "react-native": ">=0.48.4" + } + }, "node_modules/react-native-reanimated": { "version": "3.16.7", "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.16.7.tgz", diff --git a/package.json b/package.json index 4b1f5cd..37d5bd7 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "scripts": { "start": "expo start", "reset-project": "node ./scripts/reset-project.js", - "android": "expo start --android", - "ios": "expo start --ios", + "android": "expo run:android", + "ios": "expo run:ios", "web": "expo start --web", "test": "jest --watchAll", "lint": "expo lint" @@ -16,9 +16,7 @@ }, "dependencies": { "@expo/vector-icons": "^14.0.2", - "@react-native-async-storage/async-storage": "^1.24.0", - "@react-native-firebase/app": "^21.14.0", - "@react-native-firebase/auth": "^21.14.0", + "@react-native-async-storage/async-storage": "1.23.1", "@react-navigation/bottom-tabs": "^7.2.0", "@react-navigation/native": "^7.0.14", "expo": "~52.0.46", @@ -39,6 +37,7 @@ "react-dom": "18.3.1", "react-native": "0.76.9", "react-native-gesture-handler": "~2.20.2", + "react-native-keyboard-aware-scroll-view": "^0.9.5", "react-native-reanimated": "~3.16.1", "react-native-safe-area-context": "4.12.0", "react-native-screens": "~4.4.0",