├── android ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── values-night │ │ │ │ │ └── colors.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-hdpi │ │ │ │ │ └── splashscreen_image.png │ │ │ │ ├── drawable-mdpi │ │ │ │ │ └── splashscreen_image.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ └── splashscreen_image.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ └── splashscreen_image.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ │ └── splashscreen_image.png │ │ │ │ ├── drawable │ │ │ │ │ ├── splashscreen.xml │ │ │ │ │ └── rn_edit_text_material.xml │ │ │ │ ├── values │ │ │ │ │ ├── colors.xml │ │ │ │ │ ├── strings.xml │ │ │ │ │ └── styles.xml │ │ │ │ └── mipmap-anydpi-v26 │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── inx │ │ │ │ │ └── inx │ │ │ │ │ ├── MainApplication.kt │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ └── debug │ │ │ └── AndroidManifest.xml │ ├── debug.keystore │ ├── proguard-rules.pro │ └── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── .gitignore ├── react-settings-plugin │ ├── src │ │ └── main │ │ │ └── kotlin │ │ │ └── expo │ │ │ └── plugins │ │ │ └── ReactSettingsPlugin.kt │ └── build.gradle.kts ├── build.gradle ├── gradle.properties ├── settings.gradle ├── gradlew.bat └── gradlew ├── .gitattributes ├── assets ├── icon.png ├── splash.png ├── favicon.png └── adaptive-icon.png ├── src ├── assets │ ├── images │ │ ├── splash.png │ │ ├── header_2.svg │ │ └── header.svg │ ├── fonts │ │ ├── Nunito │ │ │ ├── Nunito-Black.ttf │ │ │ ├── Nunito-Bold.ttf │ │ │ ├── Nunito-Light.ttf │ │ │ ├── Nunito-Italic.ttf │ │ │ ├── Nunito-Medium.ttf │ │ │ ├── Nunito-Regular.ttf │ │ │ ├── Nunito-BoldItalic.ttf │ │ │ ├── Nunito-ExtraBold.ttf │ │ │ ├── Nunito-ExtraLight.ttf │ │ │ ├── Nunito-SemiBold.ttf │ │ │ ├── Nunito-BlackItalic.ttf │ │ │ ├── Nunito-LightItalic.ttf │ │ │ ├── Nunito-MediumItalic.ttf │ │ │ ├── Nunito-ExtraBoldItalic.ttf │ │ │ ├── Nunito-SemiBoldItalic.ttf │ │ │ └── Nunito-ExtraLightItalic.ttf │ │ └── Manrope │ │ │ ├── Manrope-Bold.ttf │ │ │ ├── Manrope-Light.ttf │ │ │ ├── Manrope-Medium.ttf │ │ │ ├── Manrope-Regular.ttf │ │ │ ├── Manrope-SemiBold.ttf │ │ │ ├── Manrope-ExtraBold.ttf │ │ │ └── Manrope-ExtraLight.ttf │ └── icons │ │ ├── dot-green.svg │ │ ├── back_2.svg │ │ ├── back.svg │ │ ├── down-gray.svg │ │ ├── up-gray.svg │ │ ├── up.svg │ │ ├── forward-gray.svg │ │ ├── forward.svg │ │ ├── down.svg │ │ ├── cross.svg │ │ ├── plus.svg │ │ ├── filter.svg │ │ ├── menu.svg │ │ ├── st-subscription.svg │ │ ├── dot_on.svg │ │ ├── apple.svg │ │ ├── st-str.svg │ │ ├── signal.svg │ │ ├── chat_1.svg │ │ ├── lock.svg │ │ ├── chat_2.svg │ │ ├── keepup_1.svg │ │ ├── keepup_2.svg │ │ ├── st-download.svg │ │ ├── calendar-heart.svg │ │ ├── st-chat.svg │ │ ├── friend-except.svg │ │ ├── add-friend.svg │ │ ├── home_2.svg │ │ ├── home_1.svg │ │ ├── notifications_1.svg │ │ ├── notifications_2.svg │ │ ├── st-language.svg │ │ ├── st-dark.svg │ │ ├── friends.svg │ │ ├── st-profile.svg │ │ ├── search.svg │ │ ├── wallet_1.svg │ │ ├── google.svg │ │ ├── wallet_2.svg │ │ ├── st-guideline.svg │ │ ├── edit_avatar.svg │ │ ├── st-active.svg │ │ ├── world.svg │ │ ├── st-notifications.svg │ │ ├── calendar.svg │ │ ├── st-terms.svg │ │ ├── st-location.svg │ │ ├── st-wallet.svg │ │ ├── edit.svg │ │ ├── geoloc.svg │ │ ├── st-sos.svg │ │ ├── v-threedot.svg │ │ ├── specific-friends.svg │ │ ├── friend_1.svg │ │ ├── msg-plus.svg │ │ ├── st-privacy.svg │ │ ├── pending-friend.svg │ │ ├── st-how.svg │ │ ├── friend_2.svg │ │ ├── st-apps.svg │ │ ├── st-publiccontent.svg │ │ ├── st-blocked.svg │ │ ├── h-threedot.svg │ │ ├── heart-star.svg │ │ ├── add-friend-rounded.svg │ │ ├── default.svg │ │ ├── st-ads.svg │ │ ├── st-cookies.svg │ │ ├── st-access.svg │ │ ├── sad.svg │ │ ├── settings_1.svg │ │ ├── settings_2.svg │ │ └── st-defaultsettings.svg ├── contexts │ └── AuthContext.tsx ├── screens │ ├── theme.ts │ ├── HomeScreen.tsx │ └── LoginScreen.tsx └── navigation │ ├── MainNavigator.tsx │ └── RootLayout.tsx ├── babel.config.js ├── tsconfig.json ├── .gitignore ├── App.tsx ├── eas.json ├── app.json ├── LICENSE └── package.json /android/app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/assets/icon.png -------------------------------------------------------------------------------- /assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/assets/splash.png -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/assets/favicon.png -------------------------------------------------------------------------------- /assets/adaptive-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/assets/adaptive-icon.png -------------------------------------------------------------------------------- /android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/debug.keystore -------------------------------------------------------------------------------- /src/assets/images/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/images/splash.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'], 5 | }; 6 | }; 7 | -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-Black.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-Bold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-Light.ttf -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /src/assets/fonts/Manrope/Manrope-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Manrope/Manrope-Bold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Manrope/Manrope-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Manrope/Manrope-Light.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-Italic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-Medium.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-Regular.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Manrope/Manrope-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Manrope/Manrope-Medium.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Manrope/Manrope-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Manrope/Manrope-Regular.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Manrope/Manrope-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Manrope/Manrope-SemiBold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-BoldItalic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-ExtraBold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-ExtraLight.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-SemiBold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Manrope/Manrope-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Manrope/Manrope-ExtraBold.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Manrope/Manrope-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Manrope/Manrope-ExtraLight.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-BlackItalic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-LightItalic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-MediumItalic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-ExtraBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-ExtraBoldItalic.ttf -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-SemiBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-SemiBoldItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/assets/fonts/Nunito/Nunito-ExtraLightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/src/assets/fonts/Nunito/Nunito-ExtraLightItalic.ttf -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/drawable-hdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/drawable-mdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/drawable-xhdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/drawable-xxhdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/drawable-xxxhdpi/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/splashscreen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NFTknight/ReactNative-Expo-OAuth/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /src/assets/icons/dot-green.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Android/IntelliJ 6 | # 7 | build/ 8 | .idea 9 | .gradle 10 | local.properties 11 | *.iml 12 | *.hprof 13 | .cxx/ 14 | 15 | # Bundle artifacts 16 | *.jsbundle 17 | -------------------------------------------------------------------------------- /src/assets/icons/back_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff 3 | #ffffff 4 | #023c69 5 | #ffffff 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | inx 3 | contain 4 | false 5 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/react-settings-plugin/src/main/kotlin/expo/plugins/ReactSettingsPlugin.kt: -------------------------------------------------------------------------------- 1 | package expo.plugins 2 | 3 | import org.gradle.api.Plugin 4 | import org.gradle.api.initialization.Settings 5 | 6 | class ReactSettingsPlugin : Plugin { 7 | override fun apply(settings: Settings) { 8 | // Do nothing, just register the plugin. 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "expo/tsconfig.base", 3 | "compilerOptions": { 4 | "strict": true, 5 | "baseUrl": "./", 6 | "paths": { 7 | "@components/*": ["src/components/*"], 8 | "@screens/*": ["src/screens/*"], 9 | "@assets/*": ["src/assets/*"], 10 | } 11 | }, 12 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 13 | "exclude": ["node_modules"] 14 | } 15 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/icons/down-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/up-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/up.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/forward-gray.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/forward.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/down.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /android/react-settings-plugin/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.jetbrains.kotlin.gradle.tasks.KotlinCompile 2 | 3 | plugins { 4 | kotlin("jvm") version "1.9.24" 5 | id("java-gradle-plugin") 6 | } 7 | 8 | repositories { 9 | mavenCentral() 10 | } 11 | 12 | gradlePlugin { 13 | plugins { 14 | create("reactSettingsPlugin") { 15 | id = "com.facebook.react.settings" 16 | implementationClass = "expo.plugins.ReactSettingsPlugin" 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/assets/icons/cross.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files 2 | 3 | # dependencies 4 | node_modules/ 5 | 6 | # Expo 7 | .expo/ 8 | dist/ 9 | web-build/ 10 | 11 | # Native 12 | *.orig.* 13 | *.jks 14 | *.p8 15 | *.p12 16 | *.key 17 | *.mobileprovision 18 | 19 | # Metro 20 | .metro-health-check* 21 | 22 | # debug 23 | npm-debug.* 24 | yarn-debug.* 25 | yarn-error.* 26 | 27 | # macOS 28 | .DS_Store 29 | *.pem 30 | 31 | # local env files 32 | .env*.local 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | -------------------------------------------------------------------------------- /src/assets/icons/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/filter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/assets/icons/st-subscription.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # react-native-reanimated 11 | -keep class com.swmansion.reanimated.** { *; } 12 | -keep class com.facebook.react.turbomodule.** { *; } 13 | 14 | # Add any project specific keep options here: 15 | -------------------------------------------------------------------------------- /src/assets/icons/dot_on.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /App.tsx: -------------------------------------------------------------------------------- 1 | import 'expo-dev-client'; 2 | import { StatusBar } from 'expo-status-bar'; 3 | import { SafeAreaView } from 'react-native-safe-area-context'; 4 | import ErrorBoundary from 'react-native-error-boundary'; 5 | import RootLayout from 'src/navigation/RootLayout'; 6 | 7 | export default function App() { 8 | 9 | return ( 10 | { console.log('ErrorBoundary: ', err) }}> 11 | 12 | 16 | 17 | 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/assets/icons/apple.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/st-str.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /eas.json: -------------------------------------------------------------------------------- 1 | { 2 | "cli": { 3 | "version": ">= 10.0.3" 4 | }, 5 | "build": { 6 | "development": { 7 | "developmentClient": true, 8 | "distribution": "internal", 9 | "env": { 10 | "APP_VARIANT": "development" 11 | } 12 | }, 13 | "preview": { 14 | "distribution": "internal", 15 | "android": { 16 | "buildType": "apk", 17 | "gradleCommand": ":app:assembleRelease" 18 | }, 19 | "env": { 20 | "APP_VARIANT": "preview", 21 | "EXPO_PUBLIC_OAUTH_CLIENT_ID": "325383681920-7a07vdh9blosali2n0piknd3usqf1ain.apps.googleusercontent.com" 22 | } 23 | }, 24 | "production": {} 25 | }, 26 | "submit": { 27 | "production": {} 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/contexts/AuthContext.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | 3 | interface AuthContextProps { 4 | loggedInUser: any; 5 | setLoggedInUser: (user: any) => void; 6 | } 7 | 8 | const AuthContext = React.createContext({ 9 | loggedInUser: null, 10 | setLoggedInUser: () => { }, 11 | }); 12 | 13 | export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { 14 | const [loggedInUser, setLoggedInUser] = useState(null); 15 | 16 | return ( 17 | 21 | {children} 22 | 23 | ); 24 | }; 25 | 26 | export const useAuth = () => React.useContext(AuthContext); 27 | 28 | export default AuthContext; -------------------------------------------------------------------------------- /src/assets/icons/signal.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "inx", 4 | "slug": "inxexpo", 5 | "version": "1.0.0", 6 | "orientation": "portrait", 7 | "icon": "./assets/icon.png", 8 | "userInterfaceStyle": "light", 9 | "splash": { 10 | "image": "./assets/splash.png", 11 | "resizeMode": "contain", 12 | "backgroundColor": "#ffffff" 13 | }, 14 | "ios": { 15 | "supportsTablet": true 16 | }, 17 | "android": { 18 | "adaptiveIcon": { 19 | "foregroundImage": "./assets/adaptive-icon.png", 20 | "backgroundColor": "#ffffff" 21 | }, 22 | "package": "com.inx.inx" 23 | }, 24 | "web": { 25 | "favicon": "./assets/favicon.png" 26 | }, 27 | "extra": { 28 | "eas": { 29 | "projectId": "46b61cb7-3f1b-425c-bb50-bcd2ad768c93" 30 | } 31 | }, 32 | "owner": "cryptoknight_888", 33 | "scheme": "inx" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 14 | 17 | -------------------------------------------------------------------------------- /src/assets/icons/chat_1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/lock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/assets/icons/chat_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/keepup_1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/keepup_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/st-download.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/icons/calendar-heart.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/st-chat.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icons/friend-except.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icons/add-friend.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/icons/home_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 NFT Knight 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/assets/icons/home_1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/assets/icons/notifications_1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/notifications_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/st-language.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/assets/icons/st-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/assets/icons/friends.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/screens/theme.ts: -------------------------------------------------------------------------------- 1 | import type {DoobooTheme} from 'dooboo-ui'; 2 | 3 | export const colors = { 4 | success: '#00BA90', 5 | darkGray: '#00000070', 6 | mediumGray: '#00000030', 7 | lightGray: '#CFCED0', 8 | }; 9 | 10 | export type Colors = typeof colors; 11 | 12 | export const light = { 13 | background: '#FFFFFF', 14 | paper: '#EAEBF4', 15 | primary: '#393D7A', 16 | accent: '#B446BF', 17 | link: '#393D7A', 18 | heading: '#393D7A', 19 | titleText: '#000000', 20 | subText: '#404040', 21 | text: '#000000', 22 | textContrast: '#D3D8E8', 23 | disabled: colors.mediumGray, 24 | border: '#EDEDED', 25 | placeholder: '#999999', 26 | }; 27 | 28 | export type CustomAppTheme = typeof light & DoobooTheme; 29 | 30 | export const dark = { 31 | background: '#232323', 32 | paper: '#2C2C2C', 33 | primary: '#8A96DC', 34 | accent: '#8A96DC', 35 | link: '#E0E0E0', 36 | heading: '#FFFFFF', 37 | titleText: '#8A96DC', 38 | subText: '#D3D8E8', 39 | text: '#D3D8E8', 40 | textContrast: '#000000', 41 | disabled: colors.mediumGray, 42 | border: '#333333', 43 | placeholder: '#444444', 44 | }; 45 | 46 | export const theme = { 47 | light, 48 | dark, 49 | }; 50 | -------------------------------------------------------------------------------- /src/assets/icons/st-profile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icons/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/wallet_1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/google.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/icons/wallet_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/st-guideline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/navigation/MainNavigator.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState, useRef } from "react"; 2 | import { Platform } from "react-native"; 3 | import FontAwesome from "@expo/vector-icons/FontAwesome"; 4 | import { useFonts } from 'expo-font'; 5 | import AppLoading from 'expo-app-loading'; 6 | import * as SplashScreen from "expo-splash-screen"; 7 | import { NavigationContainer } from "@react-navigation/native"; 8 | import { createNativeStackNavigator } from "@react-navigation/native-stack"; 9 | import { useNavigation } from '@react-navigation/native'; 10 | import HomeScreen from "@screens/HomeScreen"; 11 | import LoginScreen from "@screens/LoginScreen"; 12 | 13 | // Prevent the splash screen from auto-hiding before asset loading is complete. 14 | SplashScreen.preventAutoHideAsync(); 15 | const Stack = createNativeStackNavigator(); 16 | 17 | const MainNavigator = () => { 18 | const navigation = useNavigation(); 19 | 20 | return ( 21 | 24 | 29 | 34 | 35 | ); 36 | } 37 | 38 | export default MainNavigator; -------------------------------------------------------------------------------- /src/assets/icons/edit_avatar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/icons/st-active.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/assets/icons/world.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/assets/icons/st-notifications.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icons/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/icons/st-terms.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/assets/icons/st-location.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icons/st-wallet.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icons/edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/icons/geoloc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/icons/st-sos.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/icons/v-threedot.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/assets/icons/specific-friends.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/icons/friend_1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icons/msg-plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/assets/icons/st-privacy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/icons/pending-friend.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "inx", 3 | "version": "1.0.0", 4 | "main": "expo/AppEntry.js", 5 | "scripts": { 6 | "start": "expo start", 7 | "android": "expo run:android", 8 | "ios": "expo run:ios", 9 | "web": "expo start --web" 10 | }, 11 | "dependencies": { 12 | "@emotion/native": "^11.11.0", 13 | "@expo/vector-icons": "^14.0.2", 14 | "@expo/webpack-config": "^0.12.52", 15 | "@react-native-async-storage/async-storage": "1.23.1", 16 | "@react-native-seoul/masonry-list": "^1.4.2", 17 | "@react-navigation/native": "^6.1.18", 18 | "@react-navigation/native-stack": "^6.11.0", 19 | "dooboo-ui": "^0.2.35", 20 | "expo": "~51.0.21", 21 | "expo-app-loading": "^1.1.2", 22 | "expo-auth-session": "~5.5.2", 23 | "expo-checkbox": "~3.0.0", 24 | "expo-crypto": "~13.0.2", 25 | "expo-dev-client": "~4.0.20", 26 | "expo-device": "~6.0.2", 27 | "expo-font": "~12.0.7", 28 | "expo-image": "~1.12.13", 29 | "expo-linear-gradient": "~13.0.2", 30 | "expo-splash-screen": "~0.27.5", 31 | "expo-status-bar": "~1.12.1", 32 | "expo-web-browser": "~13.0.3", 33 | "react": "18.2.0", 34 | "react-dom": "^18.2.0", 35 | "react-native": "0.74.5", 36 | "react-native-error-boundary": "^1.2.4", 37 | "react-native-loading-spinner-overlay": "^3.0.1", 38 | "react-native-safe-area-context": "4.10.5", 39 | "react-native-screens": "3.31.1", 40 | "react-native-web": "~0.19.10" 41 | }, 42 | "devDependencies": { 43 | "@babel/core": "^7.20.0", 44 | "@types/react": "~18.2.45", 45 | "typescript": "^5.1.3" 46 | }, 47 | "private": true 48 | } 49 | -------------------------------------------------------------------------------- /src/assets/icons/st-how.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/icons/friend_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/assets/icons/st-apps.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/assets/icons/st-publiccontent.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/icons/st-blocked.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/assets/icons/h-threedot.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | buildToolsVersion = findProperty('android.buildToolsVersion') ?: '34.0.0' 6 | minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '23') 7 | compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '34') 8 | targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') 9 | kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.23' 10 | 11 | ndkVersion = "26.1.10909125" 12 | } 13 | repositories { 14 | google() 15 | mavenCentral() 16 | } 17 | dependencies { 18 | classpath('com.android.tools.build:gradle') 19 | classpath('com.facebook.react:react-native-gradle-plugin') 20 | classpath('org.jetbrains.kotlin:kotlin-gradle-plugin') 21 | } 22 | } 23 | 24 | apply plugin: "com.facebook.react.rootproject" 25 | 26 | allprojects { 27 | repositories { 28 | maven { 29 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 30 | url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) 31 | } 32 | maven { 33 | // Android JSC is installed from npm 34 | url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist')) 35 | } 36 | 37 | google() 38 | mavenCentral() 39 | maven { url 'https://www.jitpack.io' } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/navigation/RootLayout.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState, useRef } from "react"; 2 | import { Platform } from "react-native"; 3 | import { AuthProvider, useAuth } from "../contexts/AuthContext"; 4 | import FontAwesome from "@expo/vector-icons/FontAwesome"; 5 | import { useFonts } from 'expo-font'; 6 | import AppLoading from 'expo-app-loading'; 7 | import * as SplashScreen from "expo-splash-screen"; 8 | import { NavigationContainer } from "@react-navigation/native"; 9 | import MainNavigator from "./MainNavigator"; 10 | 11 | // Prevent the splash screen from auto-hiding before asset loading is complete. 12 | SplashScreen.preventAutoHideAsync(); 13 | 14 | const RootLayout = () => { 15 | const [loaded, error] = useFonts({ 16 | 'nunito': require('@assets/fonts/Nunito/Nunito-Regular.ttf'), 17 | 'nunito-md': require('@assets/fonts/Nunito/Nunito-Medium.ttf'), 18 | 'nunito-sb': require('@assets/fonts/Nunito/Nunito-SemiBold.ttf'), 19 | 'nunito-b': require('@assets/fonts/Nunito/Nunito-Bold.ttf'), 20 | 'manrope': require('@assets/fonts/Manrope/Manrope-Regular.ttf'), 21 | 'manrope-md': require('@assets/fonts/Manrope/Manrope-Medium.ttf'), 22 | 'manrope-sb': require('@assets/fonts/Manrope/Manrope-SemiBold.ttf'), 23 | 'manrope-b': require('@assets/fonts/Nunito/Nunito-Bold.ttf'), 24 | ...FontAwesome.font 25 | }); 26 | 27 | // Expo Router uses Error Boundaries to catch errors in the navigation tree. 28 | useEffect(() => { 29 | if (error) throw error; 30 | }, [error]); 31 | useEffect(() => { 32 | if (loaded) { 33 | SplashScreen.hideAsync(); 34 | } 35 | }, [loaded]); 36 | if (!loaded) return null; 37 | 38 | return ( 39 | 40 | 41 | 42 | 43 | 44 | ); 45 | } 46 | 47 | export default RootLayout; -------------------------------------------------------------------------------- /src/assets/icons/heart-star.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/assets/icons/add-friend-rounded.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/rn_edit_text_material.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 22 | 23 | 24 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/assets/icons/default.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/assets/icons/st-ads.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/assets/icons/st-cookies.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/inx/inx/MainApplication.kt: -------------------------------------------------------------------------------- 1 | package com.inx.inx 2 | 3 | import android.app.Application 4 | import android.content.res.Configuration 5 | 6 | import com.facebook.react.PackageList 7 | import com.facebook.react.ReactApplication 8 | import com.facebook.react.ReactNativeHost 9 | import com.facebook.react.ReactPackage 10 | import com.facebook.react.ReactHost 11 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load 12 | import com.facebook.react.defaults.DefaultReactNativeHost 13 | import com.facebook.soloader.SoLoader 14 | 15 | import expo.modules.ApplicationLifecycleDispatcher 16 | import expo.modules.ReactNativeHostWrapper 17 | 18 | class MainApplication : Application(), ReactApplication { 19 | 20 | override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( 21 | this, 22 | object : DefaultReactNativeHost(this) { 23 | override fun getPackages(): List { 24 | // Packages that cannot be autolinked yet can be added manually here, for example: 25 | // packages.add(new MyReactNativePackage()); 26 | return PackageList(this).packages 27 | } 28 | 29 | override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" 30 | 31 | override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG 32 | 33 | override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED 34 | override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED 35 | } 36 | ) 37 | 38 | override val reactHost: ReactHost 39 | get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) 40 | 41 | override fun onCreate() { 42 | super.onCreate() 43 | SoLoader.init(this, false) 44 | if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { 45 | // If you opted-in for the New Architecture, we load the native entry point for this app. 46 | load() 47 | } 48 | ApplicationLifecycleDispatcher.onApplicationCreate(this) 49 | } 50 | 51 | override fun onConfigurationChanged(newConfig: Configuration) { 52 | super.onConfigurationChanged(newConfig) 53 | ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/assets/icons/st-access.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/assets/icons/sad.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/inx/inx/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.inx.inx 2 | 3 | import android.os.Build 4 | import android.os.Bundle 5 | 6 | import com.facebook.react.ReactActivity 7 | import com.facebook.react.ReactActivityDelegate 8 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled 9 | import com.facebook.react.defaults.DefaultReactActivityDelegate 10 | 11 | import expo.modules.ReactActivityDelegateWrapper 12 | 13 | class MainActivity : ReactActivity() { 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | // Set the theme to AppTheme BEFORE onCreate to support 16 | // coloring the background, status bar, and navigation bar. 17 | // This is required for expo-splash-screen. 18 | setTheme(R.style.AppTheme); 19 | super.onCreate(null) 20 | } 21 | 22 | /** 23 | * Returns the name of the main component registered from JavaScript. This is used to schedule 24 | * rendering of the component. 25 | */ 26 | override fun getMainComponentName(): String = "main" 27 | 28 | /** 29 | * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] 30 | * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] 31 | */ 32 | override fun createReactActivityDelegate(): ReactActivityDelegate { 33 | return ReactActivityDelegateWrapper( 34 | this, 35 | BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, 36 | object : DefaultReactActivityDelegate( 37 | this, 38 | mainComponentName, 39 | fabricEnabled 40 | ){}) 41 | } 42 | 43 | /** 44 | * Align the back button behavior with Android S 45 | * where moving root activities to background instead of finishing activities. 46 | * @see onBackPressed 47 | */ 48 | override fun invokeDefaultOnBackPressed() { 49 | if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { 50 | if (!moveTaskToBack(false)) { 51 | // For non-root activities, use the default implementation to finish them. 52 | super.invokeDefaultOnBackPressed() 53 | } 54 | return 55 | } 56 | 57 | // Use the default back button implementation on Android S 58 | // because it's doing more than [Activity.moveTaskToBack] in fact. 59 | super.invokeDefaultOnBackPressed() 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/assets/icons/settings_1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/assets/icons/settings_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m 13 | org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | # AndroidX package structure to make it clearer which packages are bundled with the 21 | # Android operating system, and which are packaged with your app's APK 22 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 23 | android.useAndroidX=true 24 | 25 | # Automatically convert third-party libraries to use AndroidX 26 | android.enableJetifier=true 27 | 28 | # Enable AAPT2 PNG crunching 29 | android.enablePngCrunchInReleaseBuilds=true 30 | 31 | # Use this property to specify which architecture you want to build. 32 | # You can also override it from the CLI using 33 | # ./gradlew -PreactNativeArchitectures=x86_64 34 | reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 35 | 36 | # Use this property to enable support to the new architecture. 37 | # This will allow you to use TurboModules and the Fabric render in 38 | # your application. You should enable this flag either if you want 39 | # to write custom TurboModules/Fabric components OR use libraries that 40 | # are providing them. 41 | newArchEnabled=false 42 | 43 | # Use this property to enable or disable the Hermes JS engine. 44 | # If set to false, you will be using JSC instead. 45 | hermesEnabled=true 46 | 47 | # Enable GIF support in React Native images (~200 B increase) 48 | expo.gif.enabled=true 49 | # Enable webp support in React Native images (~85 KB increase) 50 | expo.webp.enabled=true 51 | # Enable animated webp support (~3.4 MB increase) 52 | # Disabled by default because iOS doesn't support animated webp 53 | expo.webp.animated=false 54 | 55 | # Enable network inspector 56 | EX_DEV_CLIENT_NETWORK_INSPECTOR=true 57 | 58 | # Use legacy packaging to compress native libraries in the resulting APK. 59 | expo.useLegacyPackaging=false 60 | -------------------------------------------------------------------------------- /src/assets/icons/st-defaultsettings.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def version = providers.exec { 3 | commandLine("node", "-e", "console.log(require('react-native/package.json').version);") 4 | }.standardOutput.asText.get().trim() 5 | def (_, reactNativeMinor, reactNativePatch) = version.split("-")[0].tokenize('.').collect { it.toInteger() } 6 | 7 | includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile().toString()) 8 | if(reactNativeMinor == 74 && reactNativePatch <= 3){ 9 | includeBuild("react-settings-plugin") 10 | } 11 | } 12 | 13 | plugins { id("com.facebook.react.settings") } 14 | 15 | def getRNMinorVersion() { 16 | def version = providers.exec { 17 | commandLine("node", "-e", "console.log(require('react-native/package.json').version);") 18 | }.standardOutput.asText.get().trim() 19 | 20 | def coreVersion = version.split("-")[0] 21 | def (major, minor, patch) = coreVersion.tokenize('.').collect { it.toInteger() } 22 | 23 | return minor 24 | } 25 | 26 | if (getRNMinorVersion() >= 75) { 27 | extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> 28 | if (System.getenv('EXPO_UNSTABLE_CORE_AUTOLINKING') == '1') { 29 | println('\u001B[32mUsing expo-modules-autolinking as core autolinking source\u001B[0m') 30 | def command = [ 31 | 'node', 32 | '--no-warnings', 33 | '--eval', 34 | 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', 35 | 'react-native-config', 36 | '--json', 37 | '--platform', 38 | 'android' 39 | ].toList() 40 | ex.autolinkLibrariesFromCommand(command) 41 | } else { 42 | ex.autolinkLibrariesFromCommand() 43 | } 44 | } 45 | } 46 | 47 | rootProject.name = 'inx' 48 | 49 | dependencyResolutionManagement { 50 | versionCatalogs { 51 | reactAndroidLibs { 52 | from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml"))) 53 | } 54 | } 55 | } 56 | 57 | apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); 58 | useExpoModules() 59 | 60 | if (getRNMinorVersion() < 75) { 61 | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); 62 | applyNativeModulesSettingsGradle(settings) 63 | } 64 | 65 | include ':app' 66 | 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()) 67 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 1>&2 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 48 | echo. 1>&2 49 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 50 | echo location of your Java installation. 1>&2 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 1>&2 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 62 | echo. 1>&2 63 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 64 | echo location of your Java installation. 1>&2 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /src/assets/images/header_2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /src/assets/images/header.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | apply plugin: "org.jetbrains.kotlin.android" 3 | apply plugin: "com.facebook.react" 4 | 5 | def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath() 6 | 7 | static def versionToNumber(major, minor, patch) { 8 | return patch * 100 + minor * 10000 + major * 1000000 9 | } 10 | 11 | def getRNVersion() { 12 | def version = providers.exec { 13 | workingDir(projectDir) 14 | commandLine("node", "-e", "console.log(require('react-native/package.json').version);") 15 | }.standardOutput.asText.get().trim() 16 | 17 | def coreVersion = version.split("-")[0] 18 | def (major, minor, patch) = coreVersion.tokenize('.').collect { it.toInteger() } 19 | 20 | return versionToNumber( 21 | major, 22 | minor, 23 | patch 24 | ) 25 | } 26 | def rnVersion = getRNVersion() 27 | 28 | /** 29 | * This is the configuration block to customize your React Native Android app. 30 | * By default you don't need to apply any configuration, just uncomment the lines you need. 31 | */ 32 | react { 33 | entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) 34 | reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() 35 | hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" 36 | 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() 37 | 38 | // Use Expo CLI to bundle the app, this ensures the Metro config 39 | // works correctly with Expo projects. 40 | cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) 41 | bundleCommand = "export:embed" 42 | 43 | /* Folders */ 44 | // The root of your project, i.e. where "package.json" lives. Default is '..' 45 | // root = file("../") 46 | // The folder where the react-native NPM package is. Default is ../node_modules/react-native 47 | // reactNativeDir = file("../node_modules/react-native") 48 | // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen 49 | // codegenDir = file("../node_modules/@react-native/codegen") 50 | 51 | /* Variants */ 52 | // The list of variants to that are debuggable. For those we're going to 53 | // skip the bundling of the JS bundle and the assets. By default is just 'debug'. 54 | // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. 55 | // debuggableVariants = ["liteDebug", "prodDebug"] 56 | 57 | /* Bundling */ 58 | // A list containing the node command and its flags. Default is just 'node'. 59 | // nodeExecutableAndArgs = ["node"] 60 | 61 | // 62 | // The path to the CLI configuration file. Default is empty. 63 | // bundleConfig = file(../rn-cli.config.js) 64 | // 65 | // The name of the generated asset file containing your JS bundle 66 | // bundleAssetName = "MyApplication.android.bundle" 67 | // 68 | // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' 69 | // entryFile = file("../js/MyApplication.android.js") 70 | // 71 | // A list of extra flags to pass to the 'bundle' commands. 72 | // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle 73 | // extraPackagerArgs = [] 74 | 75 | /* Hermes Commands */ 76 | // The hermes compiler command to run. By default it is 'hermesc' 77 | // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" 78 | // 79 | // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" 80 | // hermesFlags = ["-O", "-output-source-map"] 81 | 82 | if (rnVersion >= versionToNumber(0, 75, 0)) { 83 | /* Autolinking */ 84 | autolinkLibrariesWithApp() 85 | } 86 | } 87 | 88 | /** 89 | * Set this to true to Run Proguard on Release builds to minify the Java bytecode. 90 | */ 91 | def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() 92 | 93 | /** 94 | * The preferred build flavor of JavaScriptCore (JSC) 95 | * 96 | * For example, to use the international variant, you can use: 97 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` 98 | * 99 | * The international variant includes ICU i18n library and necessary data 100 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that 101 | * give correct results when using with locales other than en-US. Note that 102 | * this variant is about 6MiB larger per architecture than default. 103 | */ 104 | def jscFlavor = 'org.webkit:android-jsc:+' 105 | 106 | android { 107 | ndkVersion rootProject.ext.ndkVersion 108 | 109 | buildToolsVersion rootProject.ext.buildToolsVersion 110 | compileSdk rootProject.ext.compileSdkVersion 111 | 112 | namespace 'com.inx.inx' 113 | defaultConfig { 114 | applicationId 'com.inx.inx' 115 | minSdkVersion rootProject.ext.minSdkVersion 116 | targetSdkVersion rootProject.ext.targetSdkVersion 117 | versionCode 1 118 | versionName "1.0.0" 119 | } 120 | signingConfigs { 121 | debug { 122 | storeFile file('debug.keystore') 123 | storePassword 'android' 124 | keyAlias 'androiddebugkey' 125 | keyPassword 'android' 126 | } 127 | } 128 | buildTypes { 129 | debug { 130 | signingConfig signingConfigs.debug 131 | } 132 | release { 133 | // Caution! In production, you need to generate your own keystore file. 134 | // see https://reactnative.dev/docs/signed-apk-android. 135 | signingConfig signingConfigs.debug 136 | shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) 137 | minifyEnabled enableProguardInReleaseBuilds 138 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 139 | crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true) 140 | } 141 | } 142 | packagingOptions { 143 | jniLibs { 144 | useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) 145 | } 146 | } 147 | } 148 | 149 | // Apply static values from `gradle.properties` to the `android.packagingOptions` 150 | // Accepts values in comma delimited lists, example: 151 | // android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini 152 | ["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> 153 | // Split option: 'foo,bar' -> ['foo', 'bar'] 154 | def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); 155 | // Trim all elements in place. 156 | for (i in 0.. 0) { 161 | println "android.packagingOptions.$prop += $options ($options.length)" 162 | // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' 163 | options.each { 164 | android.packagingOptions[prop] += it 165 | } 166 | } 167 | } 168 | 169 | dependencies { 170 | // The version of react-native is set by the React Native Gradle Plugin 171 | implementation("com.facebook.react:react-android") 172 | 173 | def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; 174 | def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; 175 | def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; 176 | 177 | if (isGifEnabled) { 178 | // For animated gif support 179 | implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") 180 | } 181 | 182 | if (isWebpEnabled) { 183 | // For webp support 184 | implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") 185 | if (isWebpAnimatedEnabled) { 186 | // Animated webp support 187 | implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") 188 | } 189 | } 190 | 191 | if (hermesEnabled.toBoolean()) { 192 | implementation("com.facebook.react:hermes-android") 193 | } else { 194 | implementation jscFlavor 195 | } 196 | } 197 | 198 | if (rnVersion < versionToNumber(0, 75, 0)) { 199 | apply from: new File(["node", "--print", "require.resolve('@react-native-community/cli-platform-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), "../native_modules.gradle"); 200 | applyNativeModulesAppBuildGradle(project) 201 | } 202 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | # This is normally unused 84 | # shellcheck disable=SC2034 85 | APP_BASE_NAME=${0##*/} 86 | # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 87 | APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit 88 | 89 | # Use the maximum available, or set MAX_FD != -1 to use that value. 90 | MAX_FD=maximum 91 | 92 | warn () { 93 | echo "$*" 94 | } >&2 95 | 96 | die () { 97 | echo 98 | echo "$*" 99 | echo 100 | exit 1 101 | } >&2 102 | 103 | # OS specific support (must be 'true' or 'false'). 104 | cygwin=false 105 | msys=false 106 | darwin=false 107 | nonstop=false 108 | case "$( uname )" in #( 109 | CYGWIN* ) cygwin=true ;; #( 110 | Darwin* ) darwin=true ;; #( 111 | MSYS* | MINGW* ) msys=true ;; #( 112 | NONSTOP* ) nonstop=true ;; 113 | esac 114 | 115 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 116 | 117 | 118 | # Determine the Java command to use to start the JVM. 119 | if [ -n "$JAVA_HOME" ] ; then 120 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 121 | # IBM's JDK on AIX uses strange locations for the executables 122 | JAVACMD=$JAVA_HOME/jre/sh/java 123 | else 124 | JAVACMD=$JAVA_HOME/bin/java 125 | fi 126 | if [ ! -x "$JAVACMD" ] ; then 127 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 128 | 129 | Please set the JAVA_HOME variable in your environment to match the 130 | location of your Java installation." 131 | fi 132 | else 133 | JAVACMD=java 134 | if ! command -v java >/dev/null 2>&1 135 | then 136 | die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137 | 138 | Please set the JAVA_HOME variable in your environment to match the 139 | location of your Java installation." 140 | fi 141 | fi 142 | 143 | # Increase the maximum file descriptors if we can. 144 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 145 | case $MAX_FD in #( 146 | max*) 147 | # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 148 | # shellcheck disable=SC2039,SC3045 149 | MAX_FD=$( ulimit -H -n ) || 150 | warn "Could not query maximum file descriptor limit" 151 | esac 152 | case $MAX_FD in #( 153 | '' | soft) :;; #( 154 | *) 155 | # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 156 | # shellcheck disable=SC2039,SC3045 157 | ulimit -n "$MAX_FD" || 158 | warn "Could not set maximum file descriptor limit to $MAX_FD" 159 | esac 160 | fi 161 | 162 | # Collect all arguments for the java command, stacking in reverse order: 163 | # * args from the command line 164 | # * the main class name 165 | # * -classpath 166 | # * -D...appname settings 167 | # * --module-path (only if needed) 168 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 169 | 170 | # For Cygwin or MSYS, switch paths to Windows format before running java 171 | if "$cygwin" || "$msys" ; then 172 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 173 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 174 | 175 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 176 | 177 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 178 | for arg do 179 | if 180 | case $arg in #( 181 | -*) false ;; # don't mess with options #( 182 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 183 | [ -e "$t" ] ;; #( 184 | *) false ;; 185 | esac 186 | then 187 | arg=$( cygpath --path --ignore --mixed "$arg" ) 188 | fi 189 | # Roll the args list around exactly as many times as the number of 190 | # args, so each arg winds up back in the position where it started, but 191 | # possibly modified. 192 | # 193 | # NB: a `for` loop captures its iteration list before it begins, so 194 | # changing the positional parameters here affects neither the number of 195 | # iterations, nor the values presented in `arg`. 196 | shift # remove old arg 197 | set -- "$@" "$arg" # push replacement arg 198 | done 199 | fi 200 | 201 | 202 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 203 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 204 | 205 | # Collect all arguments for the java command: 206 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, 207 | # and any embedded shellness will be escaped. 208 | # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be 209 | # treated as '${Hostname}' itself on the command line. 210 | 211 | set -- \ 212 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 213 | -classpath "$CLASSPATH" \ 214 | org.gradle.wrapper.GradleWrapperMain \ 215 | "$@" 216 | 217 | # Stop when "xargs" is not available. 218 | if ! command -v xargs >/dev/null 2>&1 219 | then 220 | die "xargs is not available" 221 | fi 222 | 223 | # Use "xargs" to parse quoted args. 224 | # 225 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 226 | # 227 | # In Bash we could simply go: 228 | # 229 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 230 | # set -- "${ARGS[@]}" "$@" 231 | # 232 | # but POSIX shell has neither arrays nor command substitution, so instead we 233 | # post-process each arg (as a line of input to sed) to backslash-escape any 234 | # character that might be a shell metacharacter, then use eval to reverse 235 | # that process (while maintaining the separation between arguments), and wrap 236 | # the whole thing up as a single "set" statement. 237 | # 238 | # This will of course break if any of these variables contains a newline or 239 | # an unmatched quote. 240 | # 241 | 242 | eval "set -- $( 243 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 244 | xargs -n1 | 245 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 246 | tr '\n' ' ' 247 | )" '"$@"' 248 | 249 | exec "$JAVACMD" "$@" 250 | -------------------------------------------------------------------------------- /src/screens/HomeScreen.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC, useMemo, useState, ReactElement } from 'react'; 2 | import { 3 | View, 4 | Text, 5 | Pressable, 6 | ActivityIndicator, 7 | StyleSheet, 8 | StyleProp, 9 | ViewStyle, 10 | Image, 11 | } from 'react-native'; 12 | import { SafeAreaView } from 'react-native-safe-area-context'; 13 | import AsyncStorage from "@react-native-async-storage/async-storage"; 14 | import { useAuth } from 'src/contexts/AuthContext'; 15 | import { LinearGradient } from 'expo-linear-gradient'; 16 | import MasonryList from '@react-native-seoul/masonry-list'; 17 | // import {useTheme} from 'dooboo-ui'; 18 | 19 | 20 | interface Furniture { 21 | id: string; 22 | imgURL: string; 23 | text: string; 24 | } 25 | 26 | const data: Furniture[] = [ 27 | { 28 | id: 'id123', 29 | imgURL: 30 | 'https://ii1.pepperfry.com/media/catalog/product/m/o/568x625/modern-chaise-lounger-in-grey-colour-by-dreamzz-furniture-modern-chaise-lounger-in-grey-colour-by-dr-tmnirx.jpg', 31 | text: 'Pioneer LHS Chaise Lounger in Grey Colour', 32 | }, 33 | { 34 | id: 'id124', 35 | imgURL: 36 | 'https://www.precedent-furniture.com/sites/precedent-furniture.com/files/styles/header_slideshow/public/3360_SL%20CR.jpg?itok=3Ltk6red', 37 | text: 'Precedant Furniture', 38 | }, 39 | { 40 | id: 'id125', 41 | imgURL: 42 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/leverette-fabric-queen-upholstered-platform-bed-1594829293.jpg', 43 | text: 'Leverette Upholstered Platform Bed', 44 | }, 45 | { 46 | id: 'id126', 47 | imgURL: 48 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/briget-side-table-1582143245.jpg?crop=1.00xw:0.770xh;0,0.129xh&resize=768:*', 49 | text: 'Briget Accent Table', 50 | }, 51 | { 52 | id: 'id127', 53 | imgURL: 54 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/rivet-emerly-media-console-1610578756.jpg?crop=1xw:1xh;center,top&resize=768:*', 55 | text: 'Rivet Emerly Media Console', 56 | }, 57 | { 58 | id: 'id128', 59 | imgURL: 60 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/drew-barrymore-flower-home-petal-chair-1594829759.jpeg?crop=1xw:1xh;center,top&resize=768:*', 61 | text: 'Drew Barrymore Flower Home Accent Chair', 62 | }, 63 | { 64 | id: 'id129', 65 | imgURL: 66 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/goodee-ecobirdy-charlie-chairs-1594834221.jpg?crop=1xw:1xh;center,top&resize=768:*', 67 | text: 'Ecobirdy Charlie Chair', 68 | }, 69 | { 70 | id: 'id130', 71 | imgURL: 72 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/hailey-sofa-1571430947.jpg?crop=0.481xw:0.722xh;0.252xw,0.173xh&resize=768:*', 73 | text: 'Hailey Sofa', 74 | }, 75 | { 76 | id: 'id131', 77 | imgURL: 78 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/archer-home-designs-dining-table-1594830125.jpg?crop=0.657xw:1.00xh;0.0986xw,0&resize=768:*', 79 | text: 'Farmhouse Dining Table', 80 | }, 81 | { 82 | id: 'id132', 83 | imgURL: 84 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/evelyn-coffee-table-1610578857.jpeg?crop=1xw:1xh;center,top&resize=768:*', 85 | text: 'Evelyn Coffee Table', 86 | }, 87 | { 88 | id: 'id133', 89 | imgURL: 90 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/burrow-nomad-sofa-1594837995.jpg?crop=1xw:1xh;center,top&resize=768:*', 91 | text: 'Slope Nomad Leather Sofa', 92 | }, 93 | { 94 | id: 'id134', 95 | imgURL: 96 | 'https://apicms.thestar.com.my/uploads/images/2020/02/21/570850.jpg', 97 | text: 'Chair and Table', 98 | }, 99 | { 100 | id: 'id223', 101 | imgURL: 102 | 'https://ii1.pepperfry.com/media/catalog/product/m/o/568x625/modern-chaise-lounger-in-grey-colour-by-dreamzz-furniture-modern-chaise-lounger-in-grey-colour-by-dr-tmnirx.jpg', 103 | text: 'Pioneer LHS Chaise Lounger in Grey Colour', 104 | }, 105 | { 106 | id: 'id224', 107 | imgURL: 108 | 'https://www.precedent-furniture.com/sites/precedent-furniture.com/files/styles/header_slideshow/public/3360_SL%20CR.jpg?itok=3Ltk6red', 109 | text: 'Precedant Furniture', 110 | }, 111 | { 112 | id: 'id225', 113 | imgURL: 114 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/leverette-fabric-queen-upholstered-platform-bed-1594829293.jpg', 115 | text: 'Leverette Upholstered Platform Bed', 116 | }, 117 | { 118 | id: 'id226', 119 | imgURL: 120 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/briget-side-table-1582143245.jpg?crop=1.00xw:0.770xh;0,0.129xh&resize=768:*', 121 | text: 'Briget Accent Table', 122 | }, 123 | { 124 | id: 'id227', 125 | imgURL: 126 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/rivet-emerly-media-console-1610578756.jpg?crop=1xw:1xh;center,top&resize=768:*', 127 | text: 'Rivet Emerly Media Console', 128 | }, 129 | { 130 | id: 'id228', 131 | imgURL: 132 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/drew-barrymore-flower-home-petal-chair-1594829759.jpeg?crop=1xw:1xh;center,top&resize=768:*', 133 | text: 'Drew Barrymore Flower Home Accent Chair', 134 | }, 135 | { 136 | id: 'id229', 137 | imgURL: 138 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/goodee-ecobirdy-charlie-chairs-1594834221.jpg?crop=1xw:1xh;center,top&resize=768:*', 139 | text: 'Ecobirdy Charlie Chair', 140 | }, 141 | { 142 | id: 'id230', 143 | imgURL: 144 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/hailey-sofa-1571430947.jpg?crop=0.481xw:0.722xh;0.252xw,0.173xh&resize=768:*', 145 | text: 'Hailey Sofa', 146 | }, 147 | { 148 | id: 'id231', 149 | imgURL: 150 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/archer-home-designs-dining-table-1594830125.jpg?crop=0.657xw:1.00xh;0.0986xw,0&resize=768:*', 151 | text: 'Farmhouse Dining Table', 152 | }, 153 | { 154 | id: 'id232', 155 | imgURL: 156 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/evelyn-coffee-table-1610578857.jpeg?crop=1xw:1xh;center,top&resize=768:*', 157 | text: 'Evelyn Coffee Table', 158 | }, 159 | { 160 | id: 'id233', 161 | imgURL: 162 | 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/burrow-nomad-sofa-1594837995.jpg?crop=1xw:1xh;center,top&resize=768:*', 163 | text: 'Slope Nomad Leather Sofa', 164 | }, 165 | { 166 | id: 'id234', 167 | imgURL: 168 | 'https://apicms.thestar.com.my/uploads/images/2020/02/21/570850.jpg', 169 | text: 'Chair and Table', 170 | }, 171 | ]; 172 | 173 | const FurnitureCard: FC<{item: Furniture; style: StyleProp}> = ({ 174 | item, 175 | style, 176 | }) => { 177 | const randomBool = useMemo(() => Math.random() > 0.5, []); 178 | // const {colors} = useTheme(); 179 | const colors = { text: '#100' }; 180 | 181 | return ( 182 | 183 | 191 | {item.text} 192 | 193 | ) 194 | } 195 | 196 | const HomeScreen = ({ navigation }: { navigation: any }) => { 197 | const {loggedInUser, setLoggedInUser} = useAuth(); 198 | const [furnitureList, setFurnitureList] = useState(data.slice(0, 7)); 199 | console.log('------ loggedInUser: ', loggedInUser); 200 | const [isLoading, setIsLoading] = useState(false); 201 | 202 | const handleLogout = async () => { 203 | try { 204 | setIsLoading(true); 205 | navigation.reset({ 206 | index: 0, 207 | routes: [{ name: 'Login' }], 208 | }); 209 | } catch (error) { 210 | console.log('error signing out', error); 211 | } 212 | setIsLoading(false); 213 | }; 214 | const renderItem = ({item, i}: {item: any; i: number}): ReactElement => { 215 | return ( 216 | 217 | ); 218 | }; 219 | const listEmptyComponent = () => { 220 | return ( 221 | <> 222 | 223 | No Posts Found 224 | 225 | 226 | ); 227 | }; 228 | const delay = (ms :number) => new Promise((resolve) => setTimeout(resolve, ms)); 229 | return ( 230 | 231 | 232 | Welcome {loggedInUser.name} 233 | item.id} 235 | ListHeaderComponent={} 236 | contentContainerStyle={{ 237 | paddingHorizontal: 24, 238 | alignSelf: 'stretch', 239 | }} 240 | // loading={isLoading} 241 | // onEndReached={async() => { 242 | // setIsLoading(true); 243 | // await new Promise( 244 | // resolve => { 245 | // setTimeout(resolve, 1000); 246 | // setFurnitureList(prevList => [ 247 | // ...prevList, 248 | // ...data.slice(prevList.length, prevList.length + 7), 249 | // ]); 250 | // } 251 | // ); 252 | // setIsLoading(false); 253 | // }} 254 | 255 | onEndReached={async() => { 256 | setIsLoading(true); 257 | await delay(1000); 258 | setIsLoading(false); 259 | setFurnitureList(prevList => [ 260 | ...prevList, 261 | ...data.slice(prevList.length, prevList.length + 6), 262 | ]); 263 | }} 264 | numColumns={2} 265 | data={furnitureList} 266 | renderItem={renderItem} 267 | ListEmptyComponent={listEmptyComponent} 268 | /> 269 | 275 | 276 | {isLoading ? ( 277 | 282 | ) : ( 283 | Log Out 284 | )} 285 | 286 | 287 | 288 | 289 | ); 290 | }; 291 | 292 | const styles = StyleSheet.create({ 293 | container: { 294 | flex: 1, 295 | justifyContent: 'space-evenly', 296 | padding: 10, 297 | }, 298 | title: { 299 | alignSelf: 'flex-start', 300 | fontSize: 18, 301 | fontWeight: '500', 302 | marginBottom: 24, 303 | marginLeft: 24, 304 | }, 305 | gradient: { 306 | borderRadius: 16, 307 | marginTop: 32, 308 | }, 309 | button: { 310 | padding: 16, 311 | }, 312 | loader: { 313 | alignSelf: 'center', 314 | }, 315 | buttonText: { 316 | color: 'white', 317 | textAlign: 'center', 318 | fontSize: 14, 319 | fontFamily: 'Manrope-SemiBold', 320 | }, 321 | }); 322 | 323 | export default HomeScreen; -------------------------------------------------------------------------------- /src/screens/LoginScreen.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState, useCallback, useRef } from "react"; 2 | import { 3 | View, 4 | Text, 5 | TextInput, 6 | Pressable, 7 | ActivityIndicator, 8 | KeyboardAvoidingView, 9 | ScrollView, 10 | Platform, 11 | Alert, 12 | StyleSheet, 13 | } from "react-native"; 14 | import { Image } from "expo-image"; 15 | import { SafeAreaView } from "react-native-safe-area-context"; 16 | import Spinner from 'react-native-loading-spinner-overlay'; 17 | import Checkbox from "expo-checkbox"; 18 | import { Feather } from "@expo/vector-icons"; 19 | import AsyncStorage from '@react-native-async-storage/async-storage'; 20 | import { CommonActions, useFocusEffect } from "@react-navigation/native"; 21 | import { LinearGradient } from 'expo-linear-gradient'; 22 | import { useAuth } from "src/contexts/AuthContext"; 23 | 24 | import * as WebBrowser from "expo-web-browser"; 25 | WebBrowser.maybeCompleteAuthSession(); 26 | import * as Google from "expo-auth-session/build/providers/Google"; 27 | 28 | const LoginScreen = ({ navigation }: { navigation: any }) => { 29 | const { loggedInUser, setLoggedInUser } = useAuth(); 30 | const [error, setError] = useState(null); 31 | const [email, setEmail] = React.useState(""); 32 | const [password, setPassword] = React.useState(""); 33 | const [hidePassword, setHidePassword] = React.useState(true); 34 | 35 | const [authError, setAuthError] = React.useState(""); 36 | const [emailError, setEmailError] = useState(""); 37 | const [passwordError, setPasswordError] = useState(""); 38 | const [rememberMe, setRememberMe] = useState(false); 39 | const [checked, setChecked] = useState(false); 40 | const [isLoading, setIsLoading] = useState(false); 41 | const [googleLoading, setGoogleLoading] = useState(false); 42 | 43 | const [request, response, promptAsync] = Google.useAuthRequest({ 44 | androidClientId: process.env.EXPO_PUBLIC_OAUTH_CLIENT_ID, 45 | }) 46 | 47 | const getUserInfo = async (token: any) => { 48 | if (!token) return; 49 | try { 50 | setGoogleLoading(true); 51 | const response = await fetch( 52 | 'https://www.googleapis.com/oauth2/v3/userinfo', 53 | { 54 | headers: { 55 | Authorization: `Bearer ${token}`, 56 | }, 57 | } 58 | ); 59 | const user = await response.json(); 60 | console.log('Google-SignedIn User info: ', user); 61 | if (user) { 62 | setGoogleLoading(true); 63 | const userInfo = { email: user.email, name: user.name, avatar: user.picture,authType: 'google' }; 64 | setLoggedInUser(userInfo); 65 | setGoogleLoading(false); 66 | navigation.navigate('Home'); 67 | } 68 | } catch (err) { 69 | console.error(err); 70 | setGoogleLoading(false); 71 | } 72 | } 73 | 74 | const handleSignInWithGoogle = async () => { 75 | try { 76 | setGoogleLoading(true); 77 | if (response?.type === 'success') { 78 | await getUserInfo(response.authentication?.accessToken); 79 | console.log("User info is saved:", response.authentication?.accessToken); 80 | } 81 | } catch (err) { 82 | console.log('error signing in with google', err); 83 | } finally { 84 | setGoogleLoading(false); 85 | } 86 | } 87 | 88 | useEffect(() => { 89 | handleSignInWithGoogle(); 90 | }, [response]); 91 | 92 | const createErrorMsg = (error: any) => { 93 | let name = error.name; 94 | console.log('createErrorMsg- error.name: ', name); 95 | if (name === 'NotAuthorizedException') setAuthError('Incorrect username or password'); 96 | if (name === 'UserNotFoundException') setAuthError('User not registered'); 97 | }; 98 | 99 | const handleCheckboxPress = async () => { 100 | setChecked(!checked); 101 | }; 102 | 103 | return ( 104 | 105 | 111 | 115 | 120 | INX 121 | Log in 122 | Enter your email and password to continue 123 | 124 | Email / User Name 125 | setEmail(email)} 133 | /> 134 | {emailError && {emailError}} 135 | 136 | 137 | Password 138 | 139 | setPassword(text)} 146 | /> 147 | setHidePassword(!hidePassword)} 149 | style={styles.eyeIcon} 150 | > 151 | {!hidePassword ? ( 152 | 153 | ) : ( 154 | 155 | )} 156 | 157 | 158 | {passwordError && {passwordError}} 159 | {!passwordError && authError && {authError}} 160 | 161 | 162 | 163 | 169 | Remember Me 170 | 171 | { }}> 172 | Forgot Password? 173 | 174 | 175 | 176 | 182 | { }} style={styles.continueButton} disabled={isLoading}> 183 | {isLoading ? ( 184 | 189 | ) : Continue} 190 | 191 | 192 | 193 | 194 | 195 | Or 196 | 197 | 198 | promptAsync()} style={styles.googleButton} disabled={googleLoading}> 199 | {googleLoading ? ( 200 | 205 | ) : 206 | 207 | 212 | Continue With Google 213 | 214 | } 215 | 216 | { }} style={styles.appleButton}> 217 | 222 | Continue With Apple 223 | 224 | 225 | You don't have an account yet? 226 | {}}> 227 | Sign Up 228 | 229 | 230 | 231 | 232 | 233 | ); 234 | }; 235 | 236 | const styles = StyleSheet.create({ 237 | container: { 238 | flex: 1, 239 | flexDirection: 'column', 240 | backgroundColor: 'white', 241 | }, 242 | scrollViewContent: { 243 | paddingTop: 32, 244 | paddingBottom: 32, 245 | paddingHorizontal: 30, 246 | }, 247 | header: { 248 | alignSelf: 'center', 249 | fontSize: 48, 250 | color: '#1E1445', 251 | marginTop: 12, 252 | }, 253 | loginTitle: { 254 | fontSize: 30, 255 | color: '#1E1445', 256 | marginTop: 36, 257 | }, 258 | subTitle: { 259 | fontSize: 12, 260 | color: '#9B92BF', 261 | marginTop: 8, 262 | }, 263 | inputWrapper: { 264 | flexDirection: 'column', 265 | marginTop: 32, 266 | }, 267 | inputLabel: { 268 | fontSize: 12, 269 | color: '#1E1445', 270 | }, 271 | textInput: { 272 | marginTop: 6, 273 | width: '100%', 274 | paddingHorizontal: 20, 275 | paddingVertical: 16, 276 | borderRadius: 32, 277 | backgroundColor: '#F7F1FE', 278 | fontSize: 12, 279 | color: '#1E1445', 280 | }, 281 | errorText: { 282 | color: 'red', 283 | fontSize: 12, 284 | marginTop: 4, 285 | }, 286 | textInputWrapper: { 287 | flexDirection: 'row', 288 | justifyContent: 'center', 289 | alignItems: 'center', 290 | marginTop: 6, 291 | }, 292 | eyeIcon: { 293 | position: 'absolute', 294 | right: 20, 295 | top: 25, 296 | zIndex: 10, 297 | }, 298 | checkboxWrapper: { 299 | flexDirection: 'row', 300 | justifyContent: 'space-between', 301 | alignItems: 'center', 302 | marginTop: 10, 303 | }, 304 | rememberMeWrapper: { 305 | flexDirection: 'row', 306 | alignItems: 'center', 307 | }, 308 | checkbox: { 309 | width: 16, 310 | height: 16, 311 | borderRadius: 4, 312 | }, 313 | rememberMeText: { 314 | color: '#1E1445', 315 | fontSize: 12, 316 | marginLeft: 6, 317 | }, 318 | forgotPasswordText: { 319 | fontSize: 12, 320 | color: '#1E1445', 321 | textDecorationLine: 'underline', 322 | }, 323 | gradientButton: { 324 | borderRadius: 16, 325 | marginTop: 32, 326 | }, 327 | continueButton: { 328 | padding: 16, 329 | }, 330 | activityIndicator: { 331 | alignSelf: 'center', 332 | }, 333 | continueButtonText: { 334 | color: 'white', 335 | textAlign: 'center', 336 | fontSize: 14, 337 | }, 338 | orSection: { 339 | flexDirection: 'row', 340 | justifyContent: 'center', 341 | alignItems: 'center', 342 | marginTop: 32, 343 | marginBottom: 16, 344 | }, 345 | line: { 346 | flex: 1, 347 | height: 1, 348 | backgroundColor: 'gray', 349 | marginHorizontal: 16, 350 | }, 351 | orText: { 352 | fontSize: 12, 353 | color: '#1E1445', 354 | }, 355 | googleButton: { 356 | flexDirection: 'row', 357 | justifyContent: 'center', 358 | alignItems: 'center', 359 | backgroundColor: 'white', 360 | borderRadius: 16, 361 | paddingVertical: 12, 362 | borderWidth: 1, 363 | borderColor: '#9B92BF', 364 | marginBottom: 8, 365 | }, 366 | flexRow: { 367 | flexDirection: 'row' 368 | }, 369 | googleIcon: { 370 | width: 20, 371 | height: 20, 372 | marginRight: 8 373 | }, 374 | googleButtonText: { 375 | textAlign: 'center', 376 | fontSize: 12, 377 | color: '#1E1445', 378 | }, 379 | appleButton: { 380 | flexDirection: 'row', 381 | justifyContent: 'center', 382 | alignItems: 'center', 383 | backgroundColor: 'white', 384 | borderRadius: 16, 385 | paddingVertical: 12, 386 | borderWidth: 1, 387 | borderColor: '#9B92BF', 388 | }, 389 | appleIcon: { 390 | width: 20, 391 | height: 20, 392 | marginRight: 8, 393 | }, 394 | appleButtonText: { 395 | textAlign: 'center', 396 | fontSize: 12, 397 | color: '#1E1445', 398 | }, 399 | signUpWrapper: { 400 | flexDirection: 'row', 401 | justifyContent: 'center', 402 | alignItems: 'center', 403 | marginTop: 16 404 | }, 405 | noAccountText: { 406 | fontSize: 12, 407 | color: '#1E1445', 408 | marginRight: 8 409 | }, 410 | signUpText: { 411 | fontSize: 12, 412 | color: '#8839ED', 413 | } 414 | }); 415 | 416 | export default LoginScreen; --------------------------------------------------------------------------------