├── .eslintrc.js ├── .github └── workflows │ ├── android.yml │ └── web.yml ├── .gitignore ├── .keys-n-stuff.json ├── README.md ├── android ├── .gitignore ├── app │ ├── build.gradle │ ├── debug.keystore │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── onemdev │ │ │ └── rnloop │ │ │ ├── MainActivity.kt │ │ │ └── MainApplication.kt │ │ └── res │ │ ├── drawable-hdpi │ │ └── splashscreen_logo.png │ │ ├── drawable-mdpi │ │ └── splashscreen_logo.png │ │ ├── drawable-xhdpi │ │ └── splashscreen_logo.png │ │ ├── drawable-xxhdpi │ │ └── splashscreen_logo.png │ │ ├── drawable-xxxhdpi │ │ └── splashscreen_logo.png │ │ ├── drawable │ │ ├── ic_launcher_background.xml │ │ └── rn_edit_text_material.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_foreground.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_foreground.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_foreground.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_foreground.webp │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.webp │ │ ├── ic_launcher_foreground.webp │ │ └── ic_launcher_round.webp │ │ ├── values-night │ │ └── colors.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── app.json ├── app ├── +html.tsx ├── +not-found.tsx ├── _layout.tsx ├── about-app │ ├── analytics.tsx │ ├── data.ts │ └── index.tsx ├── developer │ ├── data.ts │ └── index.tsx ├── index.tsx ├── level │ ├── SelectOverlay.tsx │ ├── Shapes.tsx │ ├── [id].tsx │ └── styles.ts ├── levels │ └── index.tsx ├── privacy │ └── index.tsx └── settings │ ├── analytics.ts │ ├── index.tsx │ └── player.tsx ├── assets ├── audio │ ├── ambient.mp3 │ ├── forest.mp3 │ └── piano.mp3 ├── fonts │ ├── Muli-Black.ttf │ ├── Muli-Bold.ttf │ ├── Muli-ExtraBold.ttf │ ├── Muli-ExtraLight.ttf │ ├── Muli-Light.ttf │ ├── Muli-Regular.ttf │ ├── Muli-SemiBold.ttf │ └── SpaceMono-Regular.ttf ├── goku.png └── images │ ├── adaptive-icon.png │ ├── favicon.png │ ├── icon.png │ └── splash.png ├── babel.config.js ├── bun.lockb ├── components ├── AudioPlayer.tsx ├── AudioProgress.tsx ├── Collapsible.tsx ├── ExternalLink.tsx ├── Header.tsx ├── HelloWave.tsx ├── Loading.tsx ├── PageView.tsx ├── ParallaxScrollView.tsx ├── ThemedText.tsx ├── ThemedView.tsx ├── __tests__ │ ├── ThemedText-test.tsx │ └── __snapshots__ │ │ └── ThemedText-test.tsx.snap └── navigation │ └── TabBarIcon.tsx ├── constants └── Colors.ts ├── contexts ├── Settings.tsx └── Theme.tsx ├── engine ├── capture.ts ├── capture.web.ts ├── colors.ts ├── constants.ts ├── index.ts ├── levels │ ├── index.ts │ ├── level-1.ts │ ├── level-10.ts │ ├── level-11.ts │ ├── level-12.ts │ ├── level-13.ts │ ├── level-14.ts │ ├── level-15.ts │ ├── level-2.ts │ ├── level-3.ts │ ├── level-4.ts │ ├── level-5.ts │ ├── level-6.ts │ ├── level-7.ts │ ├── level-8.ts │ └── level-9.ts ├── types.ts ├── ui.ts └── utils.ts ├── global.css ├── hooks ├── types.ts ├── useAnimation.ts ├── useColorScheme.ts ├── useColorScheme.web.ts ├── useGameEngine.ts ├── useLinkTracking.ts ├── useScreenTracking.ts ├── useScrollTracking.ts ├── useThemeColor.ts └── useViewportTracking.ts ├── ios ├── .gitignore ├── .xcode.env ├── Podfile ├── Podfile.lock ├── Podfile.properties.json ├── rnloop.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── rnloop.xcscheme ├── rnloop.xcworkspace │ └── contents.xcworkspacedata └── rnloop │ ├── AppDelegate.h │ ├── AppDelegate.mm │ ├── Images.xcassets │ ├── AppIcon.appiconset │ │ ├── App-Icon-1024x1024@1x.png │ │ └── Contents.json │ ├── Contents.json │ └── SplashScreenBackground.colorset │ │ └── Contents.json │ ├── Info.plist │ ├── PrivacyInfo.xcprivacy │ ├── SplashScreen.storyboard │ ├── Supporting │ └── Expo.plist │ ├── main.m │ ├── noop-file.swift │ ├── rnloop-Bridging-Header.h │ └── rnloop.entitlements ├── metro.config.js ├── nativewind-env.d.ts ├── package.json ├── scripts ├── keys-n-stuff.ts └── reset-project.js ├── service ├── firebase.ts └── firebase.web.ts ├── tailwind.config.js ├── tsconfig.json ├── types.ts └── utils ├── animations.ts ├── audio.ts └── colors.ts /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://docs.expo.dev/guides/using-eslint/ 2 | module.exports = { 3 | extends: 'expo', 4 | ignorePatterns: ['/dist/*'], 5 | }; 6 | -------------------------------------------------------------------------------- /.github/workflows/android.yml: -------------------------------------------------------------------------------- 1 | name: Android Build 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | jobs: 9 | build: 10 | name: Android build 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: 📦 Checkout repository 14 | uses: actions/checkout@v4 15 | 16 | - name: 🔑 Checkout keys repository 17 | uses: actions/checkout@v4 18 | with: 19 | repository: hmziqrs/keys-n-stuff 20 | ssh-key: ${{ secrets.KEYS_DEPLOY_KEY }} 21 | path: .keys-n-stuff 22 | 23 | - name: ⚙️ Setup Bun 24 | uses: oven-sh/setup-bun@v2 25 | 26 | - name: 🔧 Setup Java 27 | uses: actions/setup-java@v4 28 | with: 29 | java-version: "17" 30 | distribution: "temurin" 31 | 32 | - name: 📱 Setup Android SDK 33 | uses: android-actions/setup-android@v3 34 | 35 | - name: 🔐 Setup credentials 36 | run: bun scripts/keys-n-stuff.ts 37 | 38 | - name: 📥 Install dependencies 39 | run: bun install 40 | 41 | - name: 🏗️ Build Android Bundle 42 | run: bunx expo prebuild --platform android && cd android && ./gradlew bundleRelease 43 | 44 | - name: 🏗️ Build Android APK 45 | run: cd android && ./gradlew assembleRelease 46 | 47 | - name: 📤 Upload AAB Artifact 48 | uses: actions/upload-artifact@v3 49 | with: 50 | name: app-release-bundle 51 | path: android/app/build/outputs/bundle/release/app-release.aab 52 | 53 | - name: 📤 Upload APK Artifact 54 | uses: actions/upload-artifact@v3 55 | with: 56 | name: app-release-apk 57 | path: android/app/build/outputs/apk/release/app-release.apk 58 | 59 | - name: Create Android release 60 | uses: ncipollo/release-action@v1 61 | with: 62 | artifacts: | 63 | android/app/build/outputs/bundle/release/app-release.aab 64 | android/app/build/outputs/bundle/release/app-release.apk 65 | token: ${{ secrets.TOKEN }} 66 | allowUpdates: true 67 | 68 | release: 69 | name: Android release 70 | needs: build 71 | runs-on: ubuntu-latest 72 | steps: 73 | - name: 🔑 Checkout keys repository 74 | uses: actions/checkout@v4 75 | with: 76 | repository: hmziqrs/keys-n-stuff 77 | ssh-key: ${{ secrets.KEYS_DEPLOY_KEY }} 78 | path: keys 79 | 80 | - name: ⚙️ Setup Bun 81 | uses: oven-sh/setup-bun@v2 82 | 83 | - name: 🔐 Setup credentials 84 | run: bun scripts/keys-n-stuff.ts 85 | 86 | - name: 📥 Download AAB artifact 87 | uses: actions/download-artifact@v4 88 | with: 89 | name: app-release.aab 90 | path: artifacts 91 | 92 | - name: 🚀 Upload to Play Store 93 | uses: r0adkll/upload-google-play@v1 94 | with: 95 | serviceAccountJson: "keys/rnloop/service-account.json" 96 | packageName: "com.onemdev.rnloop" 97 | releaseFiles: "artifacts/*.aab" 98 | track: "beta" 99 | inAppUpdatePriority: 3 100 | status: completed 101 | -------------------------------------------------------------------------------- /.github/workflows/web.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Expo Web to Pages 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | permissions: 9 | contents: read 10 | pages: write 11 | id-token: write 12 | 13 | concurrency: 14 | group: "pages" 15 | cancel-in-progress: false 16 | 17 | jobs: 18 | build: 19 | runs-on: ubuntu-latest 20 | steps: 21 | - uses: actions/checkout@v4 22 | - uses: oven-sh/setup-bun@v2 23 | 24 | - name: Setup Pages 25 | uses: actions/configure-pages@v5 26 | 27 | - name: Install dependencies 28 | run: bun install 29 | 30 | - name: Build Expo Web 31 | run: bunx expo export -p web 32 | 33 | - name: Deploy cloudflare pages 34 | uses: cloudflare/wrangler-action@v3 35 | with: 36 | apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} 37 | accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} 38 | packageManager: "bun" 39 | command: pages deploy ./dist --project-name=rnloop --branch=main 40 | 41 | - name: Upload artifact 42 | uses: actions/upload-pages-artifact@v3 43 | with: 44 | path: ./dist 45 | 46 | deploy: 47 | environment: 48 | name: github-pages 49 | url: ${{ steps.deployment.outputs.page_url }} 50 | runs-on: ubuntu-latest 51 | needs: build 52 | steps: 53 | - name: Deploy to GitHub Pages 54 | id: deployment 55 | uses: actions/deploy-pages@v4 56 | -------------------------------------------------------------------------------- /.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 | expo-env.d.ts 11 | 12 | # Native 13 | *.orig.* 14 | *.jks 15 | *.p8 16 | *.p12 17 | *.key 18 | *.mobileprovision 19 | 20 | # Metro 21 | .metro-health-check* 22 | 23 | # debug 24 | npm-debug.* 25 | yarn-debug.* 26 | yarn-error.* 27 | 28 | # macOS 29 | .DS_Store 30 | *.pem 31 | 32 | # local env files 33 | .env*.local 34 | 35 | # typescript 36 | *.tsbuildinfo 37 | 38 | app-example 39 | 40 | prod.properties 41 | dev.properties 42 | prod.jks 43 | dev.jks 44 | google-services.json 45 | 46 | GoogleService-Info.plist 47 | 48 | .keys-n-stuff/ 49 | service-account.json 50 | 51 | -------------------------------------------------------------------------------- /.keys-n-stuff.json: -------------------------------------------------------------------------------- 1 | { 2 | "dir": "rnloop", 3 | "type": "expo", 4 | "repo": "git@github.com:hmziqrs/keys-n-stuff.git" 5 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Archiving it. I seriously do something else than wasting my time fixing the expo issues. 2 | 3 | 4 | I will rewrite this in the flutter like cosmos intended it to be. 5 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | /** 8 | * This is the configuration block to customize your React Native Android app. 9 | * By default you don't need to apply any configuration, just uncomment the lines you need. 10 | */ 11 | react { 12 | entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim()) 13 | reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile() 14 | hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc" 15 | 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() 16 | 17 | // Use Expo CLI to bundle the app, this ensures the Metro config 18 | // works correctly with Expo projects. 19 | cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim()) 20 | bundleCommand = "export:embed" 21 | 22 | /* Folders */ 23 | // The root of your project, i.e. where "package.json" lives. Default is '../..' 24 | // root = file("../../") 25 | // The folder where the react-native NPM package is. Default is ../../node_modules/react-native 26 | // reactNativeDir = file("../../node_modules/react-native") 27 | // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen 28 | // codegenDir = file("../../node_modules/@react-native/codegen") 29 | 30 | /* Variants */ 31 | // The list of variants to that are debuggable. For those we're going to 32 | // skip the bundling of the JS bundle and the assets. By default is just 'debug'. 33 | // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. 34 | // debuggableVariants = ["liteDebug", "prodDebug"] 35 | 36 | /* Bundling */ 37 | // A list containing the node command and its flags. Default is just 'node'. 38 | // nodeExecutableAndArgs = ["node"] 39 | 40 | // 41 | // The path to the CLI configuration file. Default is empty. 42 | // bundleConfig = file(../rn-cli.config.js) 43 | // 44 | // The name of the generated asset file containing your JS bundle 45 | // bundleAssetName = "MyApplication.android.bundle" 46 | // 47 | // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' 48 | // entryFile = file("../js/MyApplication.android.js") 49 | // 50 | // A list of extra flags to pass to the 'bundle' commands. 51 | // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle 52 | // extraPackagerArgs = [] 53 | 54 | /* Hermes Commands */ 55 | // The hermes compiler command to run. By default it is 'hermesc' 56 | // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" 57 | // 58 | // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" 59 | // hermesFlags = ["-O", "-output-source-map"] 60 | 61 | /* Autolinking */ 62 | autolinkLibrariesWithApp() 63 | } 64 | 65 | /** 66 | * Set this to true to Run Proguard on Release builds to minify the Java bytecode. 67 | */ 68 | def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean() 69 | 70 | /** 71 | * The preferred build flavor of JavaScriptCore (JSC) 72 | * 73 | * For example, to use the international variant, you can use: 74 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` 75 | * 76 | * The international variant includes ICU i18n library and necessary data 77 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that 78 | * give correct results when using with locales other than en-US. Note that 79 | * this variant is about 6MiB larger per architecture than default. 80 | */ 81 | def jscFlavor = 'org.webkit:android-jsc:+' 82 | 83 | def devStore = new Properties() 84 | def devStoreFile = rootProject.file('dev.properties') 85 | if (devStoreFile.exists()) { 86 | devStore.load(new FileInputStream(devStoreFile)) 87 | } 88 | 89 | def prodStore = new Properties() 90 | def prodStoreFile = rootProject.file('prod.properties') 91 | if (prodStoreFile.exists()) { 92 | prodStore.load(new FileInputStream(prodStoreFile)) 93 | } 94 | 95 | android { 96 | ndkVersion rootProject.ext.ndkVersion 97 | 98 | buildToolsVersion rootProject.ext.buildToolsVersion 99 | compileSdk rootProject.ext.compileSdkVersion 100 | 101 | namespace 'com.onemdev.rnloop' 102 | defaultConfig { 103 | applicationId 'com.onemdev.rnloop' 104 | minSdkVersion rootProject.ext.minSdkVersion 105 | targetSdkVersion rootProject.ext.targetSdkVersion 106 | versionCode 1 107 | versionName "1.0.0" 108 | } 109 | signingConfigs { 110 | debug { 111 | keyAlias devStore['keyAlias'] 112 | keyPassword devStore['keyPassword'] 113 | storeFile file(devStore['storeFile']) 114 | storePassword devStore['storePassword'] 115 | } 116 | release { 117 | keyAlias prodStore['keyAlias'] 118 | keyPassword prodStore['keyPassword'] 119 | storeFile file(prodStore['storeFile']) 120 | storePassword prodStore['storePassword'] 121 | } 122 | } 123 | buildTypes { 124 | debug { 125 | signingConfig signingConfigs.debug 126 | } 127 | release { 128 | // Caution! In production, you need to generate your own keystore file. 129 | // see https://reactnative.dev/docs/signed-apk-android. 130 | signingConfig signingConfigs.release 131 | shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false) 132 | minifyEnabled enableProguardInReleaseBuilds 133 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 134 | crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true) 135 | } 136 | } 137 | packagingOptions { 138 | jniLibs { 139 | useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false) 140 | } 141 | } 142 | androidResources { 143 | ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~' 144 | } 145 | } 146 | 147 | // Apply static values from `gradle.properties` to the `android.packagingOptions` 148 | // Accepts values in comma delimited lists, example: 149 | // android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini 150 | ["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop -> 151 | // Split option: 'foo,bar' -> ['foo', 'bar'] 152 | def options = (findProperty("android.packagingOptions.$prop") ?: "").split(","); 153 | // Trim all elements in place. 154 | for (i in 0.. 0) { 159 | println "android.packagingOptions.$prop += $options ($options.length)" 160 | // Ex: android.packagingOptions.pickFirsts += '**/SCCS/**' 161 | options.each { 162 | android.packagingOptions[prop] += it 163 | } 164 | } 165 | } 166 | 167 | dependencies { 168 | // The version of react-native is set by the React Native Gradle Plugin 169 | implementation("com.facebook.react:react-android") 170 | 171 | def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true"; 172 | def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true"; 173 | def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true"; 174 | 175 | if (isGifEnabled) { 176 | // For animated gif support 177 | implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}") 178 | } 179 | 180 | if (isWebpEnabled) { 181 | // For webp support 182 | implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}") 183 | if (isWebpAnimatedEnabled) { 184 | // Animated webp support 185 | implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}") 186 | } 187 | } 188 | 189 | if (hermesEnabled.toBoolean()) { 190 | implementation("com.facebook.react:hermes-android") 191 | } else { 192 | implementation jscFlavor 193 | } 194 | } 195 | 196 | apply plugin: 'com.google.gms.google-services' 197 | apply plugin: 'com.google.firebase.firebase-perf' 198 | apply plugin: 'com.google.firebase.crashlytics' -------------------------------------------------------------------------------- /android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/debug.keystore -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /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 | 35 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/onemdev/rnloop/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.onemdev.rnloop 2 | import expo.modules.splashscreen.SplashScreenManager 3 | 4 | import android.os.Build 5 | import android.os.Bundle 6 | 7 | import com.facebook.react.ReactActivity 8 | import com.facebook.react.ReactActivityDelegate 9 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled 10 | import com.facebook.react.defaults.DefaultReactActivityDelegate 11 | 12 | import expo.modules.ReactActivityDelegateWrapper 13 | 14 | class MainActivity : ReactActivity() { 15 | override fun onCreate(savedInstanceState: Bundle?) { 16 | // Set the theme to AppTheme BEFORE onCreate to support 17 | // coloring the background, status bar, and navigation bar. 18 | // This is required for expo-splash-screen. 19 | // setTheme(R.style.AppTheme); 20 | // @generated begin expo-splashscreen - expo prebuild (DO NOT MODIFY) sync-f3ff59a738c56c9a6119210cb55f0b613eb8b6af 21 | SplashScreenManager.registerOnActivity(this) 22 | // @generated end expo-splashscreen 23 | super.onCreate(null) 24 | } 25 | 26 | /** 27 | * Returns the name of the main component registered from JavaScript. This is used to schedule 28 | * rendering of the component. 29 | */ 30 | override fun getMainComponentName(): String = "main" 31 | 32 | /** 33 | * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] 34 | * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] 35 | */ 36 | override fun createReactActivityDelegate(): ReactActivityDelegate { 37 | return ReactActivityDelegateWrapper( 38 | this, 39 | BuildConfig.IS_NEW_ARCHITECTURE_ENABLED, 40 | object : DefaultReactActivityDelegate( 41 | this, 42 | mainComponentName, 43 | fabricEnabled 44 | ){}) 45 | } 46 | 47 | /** 48 | * Align the back button behavior with Android S 49 | * where moving root activities to background instead of finishing activities. 50 | * @see onBackPressed 51 | */ 52 | override fun invokeDefaultOnBackPressed() { 53 | if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { 54 | if (!moveTaskToBack(false)) { 55 | // For non-root activities, use the default implementation to finish them. 56 | super.invokeDefaultOnBackPressed() 57 | } 58 | return 59 | } 60 | 61 | // Use the default back button implementation on Android S 62 | // because it's doing more than [Activity.moveTaskToBack] in fact. 63 | super.invokeDefaultOnBackPressed() 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/onemdev/rnloop/MainApplication.kt: -------------------------------------------------------------------------------- 1 | package com.onemdev.rnloop 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.react.soloader.OpenSourceMergedSoMapping 14 | import com.facebook.soloader.SoLoader 15 | 16 | import expo.modules.ApplicationLifecycleDispatcher 17 | import expo.modules.ReactNativeHostWrapper 18 | 19 | class MainApplication : Application(), ReactApplication { 20 | 21 | override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper( 22 | this, 23 | object : DefaultReactNativeHost(this) { 24 | override fun getPackages(): List { 25 | val packages = PackageList(this).packages 26 | // Packages that cannot be autolinked yet can be added manually here, for example: 27 | // packages.add(new MyReactNativePackage()); 28 | return packages 29 | } 30 | 31 | override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry" 32 | 33 | override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG 34 | 35 | override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED 36 | override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED 37 | } 38 | ) 39 | 40 | override val reactHost: ReactHost 41 | get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost) 42 | 43 | override fun onCreate() { 44 | super.onCreate() 45 | SoLoader.init(this, OpenSourceMergedSoMapping) 46 | if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { 47 | // If you opted-in for the New Architecture, we load the native entry point for this app. 48 | load() 49 | } 50 | ApplicationLifecycleDispatcher.onApplicationCreate(this) 51 | } 52 | 53 | override fun onConfigurationChanged(newConfig: Configuration) { 54 | super.onConfigurationChanged(newConfig) 55 | ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splashscreen_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/drawable-hdpi/splashscreen_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splashscreen_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/drawable-mdpi/splashscreen_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/drawable-xhdpi/splashscreen_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/drawable-xxhdpi/splashscreen_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/drawable-xxxhdpi/splashscreen_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/rn_edit_text_material.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 22 | 23 | 24 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /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/app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #000000 3 | #000000 4 | #023c69 5 | #000000 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | rnloop 3 | contain 4 | true 5 | automatic 6 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 14 | 19 | -------------------------------------------------------------------------------- /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') ?: '35.0.0' 6 | minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24') 7 | compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35') 8 | targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34') 9 | kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.24' 10 | 11 | ndkVersion = "26.1.10909125" 12 | } 13 | repositories { 14 | google() 15 | mavenCentral() 16 | } 17 | dependencies { 18 | classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2' 19 | classpath 'com.google.firebase:perf-plugin:1.4.2' 20 | classpath 'com.google.gms:google-services:4.4.1' 21 | classpath('com.android.tools.build:gradle') 22 | classpath('com.facebook.react:react-native-gradle-plugin') 23 | classpath('org.jetbrains.kotlin:kotlin-gradle-plugin') 24 | } 25 | } 26 | 27 | apply plugin: "com.facebook.react.rootproject" 28 | 29 | allprojects { 30 | repositories { 31 | maven { 32 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 33 | url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android')) 34 | } 35 | maven { 36 | // Android JSC is installed from npm 37 | url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist')) 38 | } 39 | 40 | google() 41 | mavenCentral() 42 | maven { url 'https://www.jitpack.io' } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /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 | # Enable AAPT2 PNG crunching 26 | android.enablePngCrunchInReleaseBuilds=true 27 | 28 | # Use this property to specify which architecture you want to build. 29 | # You can also override it from the CLI using 30 | # ./gradlew -PreactNativeArchitectures=x86_64 31 | reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 32 | 33 | # Use this property to enable support to the new architecture. 34 | # This will allow you to use TurboModules and the Fabric render in 35 | # your application. You should enable this flag either if you want 36 | # to write custom TurboModules/Fabric components OR use libraries that 37 | # are providing them. 38 | newArchEnabled=false 39 | 40 | # Use this property to enable or disable the Hermes JS engine. 41 | # If set to false, you will be using JSC instead. 42 | hermesEnabled=true 43 | 44 | # Enable GIF support in React Native images (~200 B increase) 45 | expo.gif.enabled=true 46 | # Enable webp support in React Native images (~85 KB increase) 47 | expo.webp.enabled=true 48 | # Enable animated webp support (~3.4 MB increase) 49 | # Disabled by default because iOS doesn't support animated webp 50 | expo.webp.animated=false 51 | 52 | # Enable network inspector 53 | EX_DEV_CLIENT_NETWORK_INSPECTOR=true 54 | 55 | # Use legacy packaging to compress native libraries in the resulting APK. 56 | expo.useLegacyPackaging=false 57 | 58 | android.extraMavenRepos=[] -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmziqrs/react-native-loop-game/e5c27b763f77bc637a3196ed587b6ee25211efae/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /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 | @rem SPDX-License-Identifier: Apache-2.0 17 | @rem 18 | 19 | @if "%DEBUG%"=="" @echo off 20 | @rem ########################################################################## 21 | @rem 22 | @rem Gradle startup script for Windows 23 | @rem 24 | @rem ########################################################################## 25 | 26 | @rem Set local scope for the variables with windows NT shell 27 | if "%OS%"=="Windows_NT" setlocal 28 | 29 | set DIRNAME=%~dp0 30 | if "%DIRNAME%"=="" set DIRNAME=. 31 | @rem This is normally unused 32 | set APP_BASE_NAME=%~n0 33 | set APP_HOME=%DIRNAME% 34 | 35 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 36 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 37 | 38 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 39 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 40 | 41 | @rem Find java.exe 42 | if defined JAVA_HOME goto findJavaFromJavaHome 43 | 44 | set JAVA_EXE=java.exe 45 | %JAVA_EXE% -version >NUL 2>&1 46 | if %ERRORLEVEL% equ 0 goto execute 47 | 48 | echo. 1>&2 49 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 50 | echo. 1>&2 51 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 52 | echo location of your Java installation. 1>&2 53 | 54 | goto fail 55 | 56 | :findJavaFromJavaHome 57 | set JAVA_HOME=%JAVA_HOME:"=% 58 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 59 | 60 | if exist "%JAVA_EXE%" goto execute 61 | 62 | echo. 1>&2 63 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 64 | echo. 1>&2 65 | echo Please set the JAVA_HOME variable in your environment to match the 1>&2 66 | echo location of your Java installation. 1>&2 67 | 68 | goto fail 69 | 70 | :execute 71 | @rem Setup the command line 72 | 73 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 74 | 75 | 76 | @rem Execute Gradle 77 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 78 | 79 | :end 80 | @rem End local scope for the variables with windows NT shell 81 | if %ERRORLEVEL% equ 0 goto mainEnd 82 | 83 | :fail 84 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 85 | rem the _cmd.exe /c_ return code! 86 | set EXIT_CODE=%ERRORLEVEL% 87 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 88 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 89 | exit /b %EXIT_CODE% 90 | 91 | :mainEnd 92 | if "%OS%"=="Windows_NT" endlocal 93 | 94 | :omega 95 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json')"].execute(null, rootDir).text.trim()).getParentFile().toString()) 3 | } 4 | plugins { id("com.facebook.react.settings") } 5 | 6 | extensions.configure(com.facebook.react.ReactSettingsExtension) { ex -> 7 | if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') { 8 | ex.autolinkLibrariesFromCommand() 9 | } else { 10 | def command = [ 11 | 'node', 12 | '--no-warnings', 13 | '--eval', 14 | 'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))', 15 | 'react-native-config', 16 | '--json', 17 | '--platform', 18 | 'android' 19 | ].toList() 20 | ex.autolinkLibrariesFromCommand(command) 21 | } 22 | } 23 | 24 | rootProject.name = 'rnloop' 25 | 26 | dependencyResolutionManagement { 27 | versionCatalogs { 28 | reactAndroidLibs { 29 | from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml"))) 30 | } 31 | } 32 | } 33 | 34 | apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle"); 35 | useExpoModules() 36 | 37 | include ':app' 38 | 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()) 39 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "rnloop", 4 | "slug": "rnloop", 5 | "version": "1.0.0", 6 | "orientation": "portrait", 7 | "icon": "./assets/images/icon.png", 8 | "scheme": "rnloop", 9 | "userInterfaceStyle": "automatic", 10 | "splash": { 11 | "image": "./assets/images/splash.png", 12 | "resizeMode": "contain", 13 | "backgroundColor": "#000000" 14 | }, 15 | "ios": { 16 | "supportsTablet": true, 17 | "googleServicesFile": "./GoogleService-Info.plist", 18 | "bundleIdentifier": "com.onemdev.rnloop", 19 | "entitlements": { 20 | "aps-environment": "production" 21 | } 22 | }, 23 | "androidStatusBar": { 24 | "translucent": true 25 | }, 26 | "android": { 27 | "googleServicesFile": "./google-services.json", 28 | "package": "com.onemdev.rnloop", 29 | "adaptiveIcon": { 30 | "foregroundImage": "./assets/images/adaptive-icon.png", 31 | "backgroundColor": "#000000" 32 | }, 33 | "permissions": [ 34 | "android.permission.RECORD_AUDIO", 35 | "android.permission.MODIFY_AUDIO_SETTINGS", 36 | "android.permission.RECORD_AUDIO", 37 | "android.permission.MODIFY_AUDIO_SETTINGS" 38 | ] 39 | }, 40 | "web": { 41 | "bundler": "metro", 42 | "output": "static", 43 | "favicon": "./assets/images/favicon.png" 44 | }, 45 | "plugins": [ 46 | "expo-router", 47 | "expo-av", 48 | 49 | "@react-native-firebase/app", 50 | "@react-native-firebase/crashlytics", 51 | "@react-native-firebase/messaging", 52 | "@react-native-firebase/perf", 53 | [ 54 | "expo-build-properties", 55 | { 56 | "ios": { 57 | "useFrameworks": "static" 58 | } 59 | } 60 | ] 61 | ], 62 | "experiments": { 63 | "typedRoutes": true 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/+html.tsx: -------------------------------------------------------------------------------- 1 | import { ScrollViewStyleReset } from 'expo-router/html'; 2 | import { type PropsWithChildren } from 'react'; 3 | 4 | /** 5 | * This file is web-only and used to configure the root HTML for every web page during static rendering. 6 | * The contents of this function only run in Node.js environments and do not have access to the DOM or browser APIs. 7 | */ 8 | export default function Root({ children }: PropsWithChildren) { 9 | return ( 10 | 11 | 12 | 13 | 14 | 15 | 16 | {/* 17 | Disable body scrolling on web. This makes ScrollView components work closer to how they do on native. 18 | However, body scrolling is often nice to have for mobile web. If you want to enable it, remove this line. 19 | */} 20 | 21 | 22 | {/* Using raw CSS styles as an escape-hatch to ensure the background color never flickers in dark-mode. */} 23 |