├── .bundle └── config ├── .eslintrc.js ├── .gitignore ├── .prettierrc.js ├── .watchmanconfig ├── .yarn └── releases │ └── yarn-stable-temp.cjs ├── App.tsx ├── Gemfile ├── Gemfile.lock ├── README.md ├── __tests__ └── App.test.tsx ├── android ├── app │ ├── build.gradle │ ├── debug.keystore │ ├── proguard-rules.pro │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── cleanarc │ │ │ ├── MainActivity.kt │ │ │ └── MainApplication.kt │ │ └── res │ │ ├── drawable │ │ └── rn_edit_text_material.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── app.json ├── babel.config.js ├── index.js ├── ios ├── .xcode.env ├── CleanArc.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── CleanArc.xcscheme ├── CleanArc.xcworkspace │ └── contents.xcworkspacedata ├── CleanArc │ ├── AppDelegate.h │ ├── AppDelegate.mm │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Info.plist │ ├── LaunchScreen.storyboard │ ├── PrivacyInfo.xcprivacy │ └── main.m ├── CleanArcTests │ ├── CleanArcTests.m │ └── Info.plist ├── Podfile └── Podfile.lock ├── jest.config.js ├── metro.config.js ├── package.json ├── src ├── application │ ├── models │ │ ├── ICharacterRepository.ts │ │ ├── IPokemonRepository.ts │ │ └── IUserRepository.ts │ ├── repositories │ │ ├── CharacterRepository.ts │ │ ├── PokemonRepository.ts │ │ └── UserRepository.ts │ └── services │ │ ├── Pokemon.service.ts │ │ └── RickAndMorty.service copy.ts ├── domain │ ├── entities │ │ ├── Character.ts │ │ ├── Pokemon.ts │ │ ├── User.ts │ │ └── UserEntity.ts │ └── usecases │ │ ├── GetCharactersUseCase.ts │ │ ├── GetPokemonsUseCase.ts │ │ └── GetUserUseCase.ts ├── infrastructure │ ├── hooks │ │ └── useInfinitiScroll.ts │ ├── network │ │ ├── ApiClient.ts │ │ ├── axiosInterceptor.ts │ │ └── types │ │ │ └── index.ts │ └── reactQuery │ │ └── QueryProvider.tsx └── presentation │ ├── pages │ ├── CharacterScreen.tsx │ ├── PokemonScreen.tsx │ ├── UserDetailScreen.tsx │ └── UserScreen.tsx │ ├── types │ └── NavigationType.ts │ └── viewModels │ ├── CharacterViewModel.ts │ ├── PokemonViewModel.ts │ ├── UserViewModel.ts │ └── UsersViewModel.ts ├── tsconfig.json └── yarn.lock /.bundle/config: -------------------------------------------------------------------------------- 1 | BUNDLE_PATH: "vendor/bundle" 2 | BUNDLE_FORCE_RUBY_PLATFORM: 1 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: '@react-native', 4 | }; 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | **/.xcode.env.local 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | *.hprof 33 | .cxx/ 34 | *.keystore 35 | !debug.keystore 36 | 37 | # node.js 38 | # 39 | node_modules/ 40 | npm-debug.log 41 | yarn-error.log 42 | 43 | # fastlane 44 | # 45 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 46 | # screenshots whenever they are needed. 47 | # For more information about the recommended setup visit: 48 | # https://docs.fastlane.tools/best-practices/source-control/ 49 | 50 | **/fastlane/report.xml 51 | **/fastlane/Preview.html 52 | **/fastlane/screenshots 53 | **/fastlane/test_output 54 | 55 | # Bundle artifact 56 | *.jsbundle 57 | 58 | # Ruby / CocoaPods 59 | **/Pods/ 60 | /vendor/bundle/ 61 | 62 | # Temporary files created by Metro to check the health of the file watcher 63 | .metro-health-check* 64 | 65 | # testing 66 | /coverage 67 | 68 | # Yarn 69 | .yarn/* 70 | !.yarn/patches 71 | !.yarn/plugins 72 | !.yarn/releases 73 | !.yarn/sdks 74 | !.yarn/versions 75 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | arrowParens: 'avoid', 3 | bracketSameLine: true, 4 | bracketSpacing: false, 5 | singleQuote: true, 6 | trailingComma: 'all', 7 | }; 8 | -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /App.tsx: -------------------------------------------------------------------------------- 1 | import {createNativeStackNavigator} from '@react-navigation/native-stack'; 2 | import React from 'react'; 3 | import UserScreen from './src/presentation/pages/UserScreen'; 4 | import { 5 | DefaultTheme, 6 | NavigationContainer, 7 | RouteProp, 8 | } from '@react-navigation/native'; 9 | import UserDetailScreen from './src/presentation/pages/UserDetailScreen'; 10 | import CharacterScreen from './src/presentation/pages/CharacterScreen'; 11 | import {QueryClient, QueryClientProvider} from 'react-query'; 12 | import PokemonScreen from './src/presentation/pages/PokemonScreen'; 13 | import {StatusBar} from 'react-native'; 14 | import {UserDetailParams} from './src/presentation/types/NavigationType'; 15 | 16 | const queryClient = new QueryClient(); 17 | 18 | const theme = Object.freeze({ 19 | ...DefaultTheme, 20 | colors: { 21 | ...DefaultTheme.colors, 22 | background: '#fff', 23 | }, 24 | }); 25 | 26 | export type AppStackParams = { 27 | Pokemon: undefined; 28 | Characters: undefined; 29 | User: undefined; 30 | UserDetail: UserDetailParams; 31 | }; 32 | export type RootRouteProps = RouteProp< 33 | AppStackParams, 34 | RouteName 35 | >; 36 | 37 | const Stack = createNativeStackNavigator(); 38 | 39 | export default function MyStack() { 40 | return ( 41 | 42 | 43 | 44 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | ); 55 | } 56 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version 4 | ruby ">= 2.6.10" 5 | 6 | # Cocoapods 1.15 introduced a bug which break the build. We will remove the upper 7 | # bound in the template on Cocoapods with next React Native release. 8 | gem 'cocoapods', '>= 1.13', '< 1.15' 9 | gem 'activesupport', '>= 6.1.7.5', '< 7.1.0' 10 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | CFPropertyList (3.0.7) 5 | base64 6 | nkf 7 | rexml 8 | activesupport (6.1.7.8) 9 | concurrent-ruby (~> 1.0, >= 1.0.2) 10 | i18n (>= 1.6, < 2) 11 | minitest (>= 5.1) 12 | tzinfo (~> 2.0) 13 | zeitwerk (~> 2.3) 14 | addressable (2.8.7) 15 | public_suffix (>= 2.0.2, < 7.0) 16 | algoliasearch (1.27.5) 17 | httpclient (~> 2.8, >= 2.8.3) 18 | json (>= 1.5.1) 19 | atomos (0.1.3) 20 | base64 (0.2.0) 21 | claide (1.1.0) 22 | cocoapods (1.14.3) 23 | addressable (~> 2.8) 24 | claide (>= 1.0.2, < 2.0) 25 | cocoapods-core (= 1.14.3) 26 | cocoapods-deintegrate (>= 1.0.3, < 2.0) 27 | cocoapods-downloader (>= 2.1, < 3.0) 28 | cocoapods-plugins (>= 1.0.0, < 2.0) 29 | cocoapods-search (>= 1.0.0, < 2.0) 30 | cocoapods-trunk (>= 1.6.0, < 2.0) 31 | cocoapods-try (>= 1.1.0, < 2.0) 32 | colored2 (~> 3.1) 33 | escape (~> 0.0.4) 34 | fourflusher (>= 2.3.0, < 3.0) 35 | gh_inspector (~> 1.0) 36 | molinillo (~> 0.8.0) 37 | nap (~> 1.0) 38 | ruby-macho (>= 2.3.0, < 3.0) 39 | xcodeproj (>= 1.23.0, < 2.0) 40 | cocoapods-core (1.14.3) 41 | activesupport (>= 5.0, < 8) 42 | addressable (~> 2.8) 43 | algoliasearch (~> 1.0) 44 | concurrent-ruby (~> 1.1) 45 | fuzzy_match (~> 2.0.4) 46 | nap (~> 1.0) 47 | netrc (~> 0.11) 48 | public_suffix (~> 4.0) 49 | typhoeus (~> 1.0) 50 | cocoapods-deintegrate (1.0.5) 51 | cocoapods-downloader (2.1) 52 | cocoapods-plugins (1.0.0) 53 | nap 54 | cocoapods-search (1.0.1) 55 | cocoapods-trunk (1.6.0) 56 | nap (>= 0.8, < 2.0) 57 | netrc (~> 0.11) 58 | cocoapods-try (1.2.0) 59 | colored2 (3.1.2) 60 | concurrent-ruby (1.3.3) 61 | escape (0.0.4) 62 | ethon (0.16.0) 63 | ffi (>= 1.15.0) 64 | ffi (1.17.0) 65 | fourflusher (2.3.1) 66 | fuzzy_match (2.0.4) 67 | gh_inspector (1.1.3) 68 | httpclient (2.8.3) 69 | i18n (1.14.5) 70 | concurrent-ruby (~> 1.0) 71 | json (2.7.2) 72 | minitest (5.24.1) 73 | molinillo (0.8.0) 74 | nanaimo (0.3.0) 75 | nap (1.1.0) 76 | netrc (0.11.0) 77 | nkf (0.2.0) 78 | public_suffix (4.0.7) 79 | rexml (3.2.9) 80 | strscan 81 | ruby-macho (2.5.1) 82 | strscan (3.1.0) 83 | typhoeus (1.4.1) 84 | ethon (>= 0.9.0) 85 | tzinfo (2.0.6) 86 | concurrent-ruby (~> 1.0) 87 | xcodeproj (1.24.0) 88 | CFPropertyList (>= 2.3.3, < 4.0) 89 | atomos (~> 0.1.3) 90 | claide (>= 1.0.2, < 2.0) 91 | colored2 (~> 3.1) 92 | nanaimo (~> 0.3.0) 93 | rexml (~> 3.2.4) 94 | zeitwerk (2.6.16) 95 | 96 | PLATFORMS 97 | ruby 98 | 99 | DEPENDENCIES 100 | activesupport (>= 6.1.7.5, < 7.1.0) 101 | cocoapods (>= 1.13, < 1.15) 102 | 103 | RUBY VERSION 104 | ruby 2.6.10p210 105 | 106 | BUNDLED WITH 107 | 1.17.2 108 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is a new [**React Native**](https://reactnative.dev) project, bootstrapped using [`@react-native-community/cli`](https://github.com/react-native-community/cli). 2 | 3 | # Getting Started 4 | 5 | >**Note**: Make sure you have completed the [React Native - Environment Setup](https://reactnative.dev/docs/environment-setup) instructions till "Creating a new application" step, before proceeding. 6 | 7 | ## Step 1: Start the Metro Server 8 | 9 | First, you will need to start **Metro**, the JavaScript _bundler_ that ships _with_ React Native. 10 | 11 | To start Metro, run the following command from the _root_ of your React Native project: 12 | 13 | ```bash 14 | # using npm 15 | npm start 16 | 17 | # OR using Yarn 18 | yarn start 19 | ``` 20 | 21 | ## Step 2: Start your Application 22 | 23 | Let Metro Bundler run in its _own_ terminal. Open a _new_ terminal from the _root_ of your React Native project. Run the following command to start your _Android_ or _iOS_ app: 24 | 25 | ### For Android 26 | 27 | ```bash 28 | # using npm 29 | npm run android 30 | 31 | # OR using Yarn 32 | yarn android 33 | ``` 34 | 35 | ### For iOS 36 | 37 | ```bash 38 | # using npm 39 | npm run ios 40 | 41 | # OR using Yarn 42 | yarn ios 43 | ``` 44 | 45 | If everything is set up _correctly_, you should see your new app running in your _Android Emulator_ or _iOS Simulator_ shortly provided you have set up your emulator/simulator correctly. 46 | 47 | This is one way to run your app — you can also run it directly from within Android Studio and Xcode respectively. 48 | 49 | ## Step 3: Modifying your App 50 | 51 | Now that you have successfully run the app, let's modify it. 52 | 53 | 1. Open `App.tsx` in your text editor of choice and edit some lines. 54 | 2. For **Android**: Press the R key twice or select **"Reload"** from the **Developer Menu** (Ctrl + M (on Window and Linux) or Cmd ⌘ + M (on macOS)) to see your changes! 55 | 56 | For **iOS**: Hit Cmd ⌘ + R in your iOS Simulator to reload the app and see your changes! 57 | 58 | ## Congratulations! :tada: 59 | 60 | You've successfully run and modified your React Native App. :partying_face: 61 | 62 | ### Now what? 63 | 64 | - If you want to add this new React Native code to an existing application, check out the [Integration guide](https://reactnative.dev/docs/integration-with-existing-apps). 65 | - If you're curious to learn more about React Native, check out the [Introduction to React Native](https://reactnative.dev/docs/getting-started). 66 | 67 | # Troubleshooting 68 | 69 | If you can't get this to work, see the [Troubleshooting](https://reactnative.dev/docs/troubleshooting) page. 70 | 71 | # Learn More 72 | 73 | To learn more about React Native, take a look at the following resources: 74 | 75 | - [React Native Website](https://reactnative.dev) - learn more about React Native. 76 | - [Getting Started](https://reactnative.dev/docs/environment-setup) - an **overview** of React Native and how setup your environment. 77 | - [Learn the Basics](https://reactnative.dev/docs/getting-started) - a **guided tour** of the React Native **basics**. 78 | - [Blog](https://reactnative.dev/blog) - read the latest official React Native **Blog** posts. 79 | - [`@facebook/react-native`](https://github.com/facebook/react-native) - the Open Source; GitHub **repository** for React Native. 80 | # react-native-clean-architecture-mvvm-react-query--infinite-scroll 81 | -------------------------------------------------------------------------------- /__tests__/App.test.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * @format 3 | */ 4 | 5 | import 'react-native'; 6 | import React from 'react'; 7 | import App from '../App'; 8 | 9 | // Note: import explicitly to use the types shipped with jest. 10 | import {it} from '@jest/globals'; 11 | 12 | // Note: test renderer must be required after react-native. 13 | import renderer from 'react-test-renderer'; 14 | 15 | it('renders correctly', () => { 16 | renderer.create(); 17 | }); 18 | -------------------------------------------------------------------------------- /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 | /** 6 | * This is the configuration block to customize your React Native Android app. 7 | * By default you don't need to apply any configuration, just uncomment the lines you need. 8 | */ 9 | react { 10 | /* Folders */ 11 | // The root of your project, i.e. where "package.json" lives. Default is '..' 12 | // root = file("../") 13 | // The folder where the react-native NPM package is. Default is ../node_modules/react-native 14 | // reactNativeDir = file("../node_modules/react-native") 15 | // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen 16 | // codegenDir = file("../node_modules/@react-native/codegen") 17 | // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js 18 | // cliFile = file("../node_modules/react-native/cli.js") 19 | 20 | /* Variants */ 21 | // The list of variants to that are debuggable. For those we're going to 22 | // skip the bundling of the JS bundle and the assets. By default is just 'debug'. 23 | // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. 24 | // debuggableVariants = ["liteDebug", "prodDebug"] 25 | 26 | /* Bundling */ 27 | // A list containing the node command and its flags. Default is just 'node'. 28 | // nodeExecutableAndArgs = ["node"] 29 | // 30 | // The command to run when bundling. By default is 'bundle' 31 | // bundleCommand = "ram-bundle" 32 | // 33 | // The path to the CLI configuration file. Default is empty. 34 | // bundleConfig = file(../rn-cli.config.js) 35 | // 36 | // The name of the generated asset file containing your JS bundle 37 | // bundleAssetName = "MyApplication.android.bundle" 38 | // 39 | // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' 40 | // entryFile = file("../js/MyApplication.android.js") 41 | // 42 | // A list of extra flags to pass to the 'bundle' commands. 43 | // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle 44 | // extraPackagerArgs = [] 45 | 46 | /* Hermes Commands */ 47 | // The hermes compiler command to run. By default it is 'hermesc' 48 | // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" 49 | // 50 | // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" 51 | // hermesFlags = ["-O", "-output-source-map"] 52 | } 53 | 54 | /** 55 | * Set this to true to Run Proguard on Release builds to minify the Java bytecode. 56 | */ 57 | def enableProguardInReleaseBuilds = false 58 | 59 | /** 60 | * The preferred build flavor of JavaScriptCore (JSC) 61 | * 62 | * For example, to use the international variant, you can use: 63 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` 64 | * 65 | * The international variant includes ICU i18n library and necessary data 66 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that 67 | * give correct results when using with locales other than en-US. Note that 68 | * this variant is about 6MiB larger per architecture than default. 69 | */ 70 | def jscFlavor = 'org.webkit:android-jsc:+' 71 | 72 | android { 73 | ndkVersion rootProject.ext.ndkVersion 74 | buildToolsVersion rootProject.ext.buildToolsVersion 75 | compileSdk rootProject.ext.compileSdkVersion 76 | 77 | namespace "com.cleanarc" 78 | defaultConfig { 79 | applicationId "com.cleanarc" 80 | minSdkVersion rootProject.ext.minSdkVersion 81 | targetSdkVersion rootProject.ext.targetSdkVersion 82 | versionCode 1 83 | versionName "1.0" 84 | } 85 | signingConfigs { 86 | debug { 87 | storeFile file('debug.keystore') 88 | storePassword 'android' 89 | keyAlias 'androiddebugkey' 90 | keyPassword 'android' 91 | } 92 | } 93 | buildTypes { 94 | debug { 95 | signingConfig signingConfigs.debug 96 | } 97 | release { 98 | // Caution! In production, you need to generate your own keystore file. 99 | // see https://reactnative.dev/docs/signed-apk-android. 100 | signingConfig signingConfigs.debug 101 | minifyEnabled enableProguardInReleaseBuilds 102 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 103 | } 104 | } 105 | } 106 | 107 | dependencies { 108 | // The version of react-native is set by the React Native Gradle Plugin 109 | implementation("com.facebook.react:react-android") 110 | 111 | if (hermesEnabled.toBoolean()) { 112 | implementation("com.facebook.react:hermes-android") 113 | } else { 114 | implementation jscFlavor 115 | } 116 | } 117 | 118 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) 119 | -------------------------------------------------------------------------------- /android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/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 | # Add any project specific keep options here: 11 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 12 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/cleanarc/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.cleanarc 2 | 3 | import com.facebook.react.ReactActivity 4 | import com.facebook.react.ReactActivityDelegate 5 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled 6 | import com.facebook.react.defaults.DefaultReactActivityDelegate 7 | 8 | class MainActivity : ReactActivity() { 9 | 10 | /** 11 | * Returns the name of the main component registered from JavaScript. This is used to schedule 12 | * rendering of the component. 13 | */ 14 | override fun getMainComponentName(): String = "CleanArc" 15 | 16 | /** 17 | * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate] 18 | * which allows you to enable New Architecture with a single boolean flags [fabricEnabled] 19 | */ 20 | override fun createReactActivityDelegate(): ReactActivityDelegate = 21 | DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled) 22 | } 23 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/cleanarc/MainApplication.kt: -------------------------------------------------------------------------------- 1 | package com.cleanarc 2 | 3 | import android.app.Application 4 | import com.facebook.react.PackageList 5 | import com.facebook.react.ReactApplication 6 | import com.facebook.react.ReactHost 7 | import com.facebook.react.ReactNativeHost 8 | import com.facebook.react.ReactPackage 9 | import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load 10 | import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost 11 | import com.facebook.react.defaults.DefaultReactNativeHost 12 | import com.facebook.soloader.SoLoader 13 | 14 | class MainApplication : Application(), ReactApplication { 15 | 16 | override val reactNativeHost: ReactNativeHost = 17 | object : DefaultReactNativeHost(this) { 18 | override fun getPackages(): List = 19 | PackageList(this).packages.apply { 20 | // Packages that cannot be autolinked yet can be added manually here, for example: 21 | // add(MyReactNativePackage()) 22 | } 23 | 24 | override fun getJSMainModuleName(): String = "index" 25 | 26 | override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG 27 | 28 | override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED 29 | override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED 30 | } 31 | 32 | override val reactHost: ReactHost 33 | get() = getDefaultReactHost(applicationContext, reactNativeHost) 34 | 35 | override fun onCreate() { 36 | super.onCreate() 37 | SoLoader.init(this, false) 38 | if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { 39 | // If you opted-in for the New Architecture, we load the native entry point for this app. 40 | load() 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /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-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | CleanArc 3 | 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext { 3 | buildToolsVersion = "34.0.0" 4 | minSdkVersion = 23 5 | compileSdkVersion = 34 6 | targetSdkVersion = 34 7 | ndkVersion = "26.1.10909125" 8 | kotlinVersion = "1.9.22" 9 | } 10 | repositories { 11 | google() 12 | mavenCentral() 13 | } 14 | dependencies { 15 | classpath("com.android.tools.build:gradle") 16 | classpath("com.facebook.react:react-native-gradle-plugin") 17 | classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") 18 | } 19 | } 20 | 21 | apply plugin: "com.facebook.react.rootproject" 22 | -------------------------------------------------------------------------------- /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 | # Automatically convert third-party libraries to use AndroidX 25 | android.enableJetifier=true 26 | 27 | # Use this property to specify which architecture you want to build. 28 | # You can also override it from the CLI using 29 | # ./gradlew -PreactNativeArchitectures=x86_64 30 | reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 31 | 32 | # Use this property to enable support to the new architecture. 33 | # This will allow you to use TurboModules and the Fabric render in 34 | # your application. You should enable this flag either if you want 35 | # to write custom TurboModules/Fabric components OR use libraries that 36 | # are providing them. 37 | newArchEnabled=false 38 | 39 | # Use this property to enable or disable the Hermes JS engine. 40 | # If set to false, you will be using JSC instead. 41 | hermesEnabled=true 42 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/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.6-all.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'CleanArc' 2 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) 3 | include ':app' 4 | includeBuild('../node_modules/@react-native/gradle-plugin') 5 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CleanArc", 3 | "displayName": "CleanArc" 4 | } 5 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['module:@react-native/babel-preset'], 3 | }; 4 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @format 3 | */ 4 | 5 | import {AppRegistry} from 'react-native'; 6 | import App from './App'; 7 | import {name as appName} from './app.json'; 8 | 9 | AppRegistry.registerComponent(appName, () => App); 10 | -------------------------------------------------------------------------------- /ios/.xcode.env: -------------------------------------------------------------------------------- 1 | # This `.xcode.env` file is versioned and is used to source the environment 2 | # used when running script phases inside Xcode. 3 | # To customize your local environment, you can create an `.xcode.env.local` 4 | # file that is not versioned. 5 | 6 | # NODE_BINARY variable contains the PATH to the node executable. 7 | # 8 | # Customize the NODE_BINARY variable here. 9 | # For example, to use nvm with brew, add the following line 10 | # . "$(brew --prefix nvm)/nvm.sh" --no-use 11 | export NODE_BINARY=$(command -v node) 12 | -------------------------------------------------------------------------------- /ios/CleanArc.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00E356F31AD99517003FC87E /* CleanArcTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* CleanArcTests.m */; }; 11 | 0C80B921A6F3F58F76C31292 /* libPods-CleanArc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-CleanArc.a */; }; 12 | 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 13 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 14 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 15 | 7699B88040F8A987B510C191 /* libPods-CleanArc-CleanArcTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-CleanArc-CleanArcTests.a */; }; 16 | 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; 17 | E11F556F125438ADF2F6F0E2 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3263D7020BA14F926116078E /* PrivacyInfo.xcprivacy */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 26 | remoteInfo = CleanArc; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 00E356EE1AD99517003FC87E /* CleanArcTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CleanArcTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | 00E356F21AD99517003FC87E /* CleanArcTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CleanArcTests.m; sourceTree = ""; }; 34 | 13B07F961A680F5B00A75B9A /* CleanArc.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CleanArc.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = CleanArc/AppDelegate.h; sourceTree = ""; }; 36 | 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = CleanArc/AppDelegate.mm; sourceTree = ""; }; 37 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = CleanArc/Images.xcassets; sourceTree = ""; }; 38 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = CleanArc/Info.plist; sourceTree = ""; }; 39 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = CleanArc/main.m; sourceTree = ""; }; 40 | 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = CleanArc/PrivacyInfo.xcprivacy; sourceTree = ""; }; 41 | 19F6CBCC0A4E27FBF8BF4A61 /* libPods-CleanArc-CleanArcTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CleanArc-CleanArcTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | 3263D7020BA14F926116078E /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = CleanArc/PrivacyInfo.xcprivacy; sourceTree = ""; }; 43 | 3B4392A12AC88292D35C810B /* Pods-CleanArc.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CleanArc.debug.xcconfig"; path = "Target Support Files/Pods-CleanArc/Pods-CleanArc.debug.xcconfig"; sourceTree = ""; }; 44 | 5709B34CF0A7D63546082F79 /* Pods-CleanArc.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CleanArc.release.xcconfig"; path = "Target Support Files/Pods-CleanArc/Pods-CleanArc.release.xcconfig"; sourceTree = ""; }; 45 | 5B7EB9410499542E8C5724F5 /* Pods-CleanArc-CleanArcTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CleanArc-CleanArcTests.debug.xcconfig"; path = "Target Support Files/Pods-CleanArc-CleanArcTests/Pods-CleanArc-CleanArcTests.debug.xcconfig"; sourceTree = ""; }; 46 | 5DCACB8F33CDC322A6C60F78 /* libPods-CleanArc.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CleanArc.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = CleanArc/LaunchScreen.storyboard; sourceTree = ""; }; 48 | 89C6BE57DB24E9ADA2F236DE /* Pods-CleanArc-CleanArcTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CleanArc-CleanArcTests.release.xcconfig"; path = "Target Support Files/Pods-CleanArc-CleanArcTests/Pods-CleanArc-CleanArcTests.release.xcconfig"; sourceTree = ""; }; 49 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | 7699B88040F8A987B510C191 /* libPods-CleanArc-CleanArcTests.a in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | 0C80B921A6F3F58F76C31292 /* libPods-CleanArc.a in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 00E356EF1AD99517003FC87E /* CleanArcTests */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 00E356F21AD99517003FC87E /* CleanArcTests.m */, 76 | 00E356F01AD99517003FC87E /* Supporting Files */, 77 | ); 78 | path = CleanArcTests; 79 | sourceTree = ""; 80 | }; 81 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | 00E356F11AD99517003FC87E /* Info.plist */, 85 | ); 86 | name = "Supporting Files"; 87 | sourceTree = ""; 88 | }; 89 | 13B07FAE1A68108700A75B9A /* CleanArc */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 93 | 13B07FB01A68108700A75B9A /* AppDelegate.mm */, 94 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 95 | 13B07FB61A68108700A75B9A /* Info.plist */, 96 | 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, 97 | 13B07FB71A68108700A75B9A /* main.m */, 98 | 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */, 99 | 3263D7020BA14F926116078E /* PrivacyInfo.xcprivacy */, 100 | ); 101 | name = CleanArc; 102 | sourceTree = ""; 103 | }; 104 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */, 108 | 5DCACB8F33CDC322A6C60F78 /* libPods-CleanArc.a */, 109 | 19F6CBCC0A4E27FBF8BF4A61 /* libPods-CleanArc-CleanArcTests.a */, 110 | ); 111 | name = Frameworks; 112 | sourceTree = ""; 113 | }; 114 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | ); 118 | name = Libraries; 119 | sourceTree = ""; 120 | }; 121 | 83CBB9F61A601CBA00E9B192 = { 122 | isa = PBXGroup; 123 | children = ( 124 | 13B07FAE1A68108700A75B9A /* CleanArc */, 125 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 126 | 00E356EF1AD99517003FC87E /* CleanArcTests */, 127 | 83CBBA001A601CBA00E9B192 /* Products */, 128 | 2D16E6871FA4F8E400B85C8A /* Frameworks */, 129 | BBD78D7AC51CEA395F1C20DB /* Pods */, 130 | ); 131 | indentWidth = 2; 132 | sourceTree = ""; 133 | tabWidth = 2; 134 | usesTabs = 0; 135 | }; 136 | 83CBBA001A601CBA00E9B192 /* Products */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | 13B07F961A680F5B00A75B9A /* CleanArc.app */, 140 | 00E356EE1AD99517003FC87E /* CleanArcTests.xctest */, 141 | ); 142 | name = Products; 143 | sourceTree = ""; 144 | }; 145 | BBD78D7AC51CEA395F1C20DB /* Pods */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | 3B4392A12AC88292D35C810B /* Pods-CleanArc.debug.xcconfig */, 149 | 5709B34CF0A7D63546082F79 /* Pods-CleanArc.release.xcconfig */, 150 | 5B7EB9410499542E8C5724F5 /* Pods-CleanArc-CleanArcTests.debug.xcconfig */, 151 | 89C6BE57DB24E9ADA2F236DE /* Pods-CleanArc-CleanArcTests.release.xcconfig */, 152 | ); 153 | path = Pods; 154 | sourceTree = ""; 155 | }; 156 | /* End PBXGroup section */ 157 | 158 | /* Begin PBXNativeTarget section */ 159 | 00E356ED1AD99517003FC87E /* CleanArcTests */ = { 160 | isa = PBXNativeTarget; 161 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "CleanArcTests" */; 162 | buildPhases = ( 163 | A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, 164 | 00E356EA1AD99517003FC87E /* Sources */, 165 | 00E356EB1AD99517003FC87E /* Frameworks */, 166 | 00E356EC1AD99517003FC87E /* Resources */, 167 | C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, 168 | F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, 169 | ); 170 | buildRules = ( 171 | ); 172 | dependencies = ( 173 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 174 | ); 175 | name = CleanArcTests; 176 | productName = CleanArcTests; 177 | productReference = 00E356EE1AD99517003FC87E /* CleanArcTests.xctest */; 178 | productType = "com.apple.product-type.bundle.unit-test"; 179 | }; 180 | 13B07F861A680F5B00A75B9A /* CleanArc */ = { 181 | isa = PBXNativeTarget; 182 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "CleanArc" */; 183 | buildPhases = ( 184 | C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, 185 | 13B07F871A680F5B00A75B9A /* Sources */, 186 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 187 | 13B07F8E1A680F5B00A75B9A /* Resources */, 188 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 189 | 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, 190 | E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, 191 | ); 192 | buildRules = ( 193 | ); 194 | dependencies = ( 195 | ); 196 | name = CleanArc; 197 | productName = CleanArc; 198 | productReference = 13B07F961A680F5B00A75B9A /* CleanArc.app */; 199 | productType = "com.apple.product-type.application"; 200 | }; 201 | /* End PBXNativeTarget section */ 202 | 203 | /* Begin PBXProject section */ 204 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 205 | isa = PBXProject; 206 | attributes = { 207 | LastUpgradeCheck = 1210; 208 | TargetAttributes = { 209 | 00E356ED1AD99517003FC87E = { 210 | CreatedOnToolsVersion = 6.2; 211 | TestTargetID = 13B07F861A680F5B00A75B9A; 212 | }; 213 | 13B07F861A680F5B00A75B9A = { 214 | LastSwiftMigration = 1120; 215 | }; 216 | }; 217 | }; 218 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "CleanArc" */; 219 | compatibilityVersion = "Xcode 12.0"; 220 | developmentRegion = en; 221 | hasScannedForEncodings = 0; 222 | knownRegions = ( 223 | en, 224 | Base, 225 | ); 226 | mainGroup = 83CBB9F61A601CBA00E9B192; 227 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 228 | projectDirPath = ""; 229 | projectRoot = ""; 230 | targets = ( 231 | 13B07F861A680F5B00A75B9A /* CleanArc */, 232 | 00E356ED1AD99517003FC87E /* CleanArcTests */, 233 | ); 234 | }; 235 | /* End PBXProject section */ 236 | 237 | /* Begin PBXResourcesBuildPhase section */ 238 | 00E356EC1AD99517003FC87E /* Resources */ = { 239 | isa = PBXResourcesBuildPhase; 240 | buildActionMask = 2147483647; 241 | files = ( 242 | ); 243 | runOnlyForDeploymentPostprocessing = 0; 244 | }; 245 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 246 | isa = PBXResourcesBuildPhase; 247 | buildActionMask = 2147483647; 248 | files = ( 249 | 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, 250 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 251 | E11F556F125438ADF2F6F0E2 /* PrivacyInfo.xcprivacy in Resources */, 252 | ); 253 | runOnlyForDeploymentPostprocessing = 0; 254 | }; 255 | /* End PBXResourcesBuildPhase section */ 256 | 257 | /* Begin PBXShellScriptBuildPhase section */ 258 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 259 | isa = PBXShellScriptBuildPhase; 260 | buildActionMask = 2147483647; 261 | files = ( 262 | ); 263 | inputPaths = ( 264 | "$(SRCROOT)/.xcode.env.local", 265 | "$(SRCROOT)/.xcode.env", 266 | ); 267 | name = "Bundle React Native code and images"; 268 | outputPaths = ( 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | shellPath = /bin/sh; 272 | shellScript = "set -e\n\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; 273 | }; 274 | 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { 275 | isa = PBXShellScriptBuildPhase; 276 | buildActionMask = 2147483647; 277 | files = ( 278 | ); 279 | inputFileListPaths = ( 280 | "${PODS_ROOT}/Target Support Files/Pods-CleanArc/Pods-CleanArc-frameworks-${CONFIGURATION}-input-files.xcfilelist", 281 | ); 282 | name = "[CP] Embed Pods Frameworks"; 283 | outputFileListPaths = ( 284 | "${PODS_ROOT}/Target Support Files/Pods-CleanArc/Pods-CleanArc-frameworks-${CONFIGURATION}-output-files.xcfilelist", 285 | ); 286 | runOnlyForDeploymentPostprocessing = 0; 287 | shellPath = /bin/sh; 288 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CleanArc/Pods-CleanArc-frameworks.sh\"\n"; 289 | showEnvVarsInLog = 0; 290 | }; 291 | A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { 292 | isa = PBXShellScriptBuildPhase; 293 | buildActionMask = 2147483647; 294 | files = ( 295 | ); 296 | inputFileListPaths = ( 297 | ); 298 | inputPaths = ( 299 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 300 | "${PODS_ROOT}/Manifest.lock", 301 | ); 302 | name = "[CP] Check Pods Manifest.lock"; 303 | outputFileListPaths = ( 304 | ); 305 | outputPaths = ( 306 | "$(DERIVED_FILE_DIR)/Pods-CleanArc-CleanArcTests-checkManifestLockResult.txt", 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | shellPath = /bin/sh; 310 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 311 | showEnvVarsInLog = 0; 312 | }; 313 | C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { 314 | isa = PBXShellScriptBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | ); 318 | inputFileListPaths = ( 319 | ); 320 | inputPaths = ( 321 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 322 | "${PODS_ROOT}/Manifest.lock", 323 | ); 324 | name = "[CP] Check Pods Manifest.lock"; 325 | outputFileListPaths = ( 326 | ); 327 | outputPaths = ( 328 | "$(DERIVED_FILE_DIR)/Pods-CleanArc-checkManifestLockResult.txt", 329 | ); 330 | runOnlyForDeploymentPostprocessing = 0; 331 | shellPath = /bin/sh; 332 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 333 | showEnvVarsInLog = 0; 334 | }; 335 | C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { 336 | isa = PBXShellScriptBuildPhase; 337 | buildActionMask = 2147483647; 338 | files = ( 339 | ); 340 | inputFileListPaths = ( 341 | "${PODS_ROOT}/Target Support Files/Pods-CleanArc-CleanArcTests/Pods-CleanArc-CleanArcTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", 342 | ); 343 | name = "[CP] Embed Pods Frameworks"; 344 | outputFileListPaths = ( 345 | "${PODS_ROOT}/Target Support Files/Pods-CleanArc-CleanArcTests/Pods-CleanArc-CleanArcTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", 346 | ); 347 | runOnlyForDeploymentPostprocessing = 0; 348 | shellPath = /bin/sh; 349 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CleanArc-CleanArcTests/Pods-CleanArc-CleanArcTests-frameworks.sh\"\n"; 350 | showEnvVarsInLog = 0; 351 | }; 352 | E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { 353 | isa = PBXShellScriptBuildPhase; 354 | buildActionMask = 2147483647; 355 | files = ( 356 | ); 357 | inputFileListPaths = ( 358 | "${PODS_ROOT}/Target Support Files/Pods-CleanArc/Pods-CleanArc-resources-${CONFIGURATION}-input-files.xcfilelist", 359 | ); 360 | name = "[CP] Copy Pods Resources"; 361 | outputFileListPaths = ( 362 | "${PODS_ROOT}/Target Support Files/Pods-CleanArc/Pods-CleanArc-resources-${CONFIGURATION}-output-files.xcfilelist", 363 | ); 364 | runOnlyForDeploymentPostprocessing = 0; 365 | shellPath = /bin/sh; 366 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CleanArc/Pods-CleanArc-resources.sh\"\n"; 367 | showEnvVarsInLog = 0; 368 | }; 369 | F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { 370 | isa = PBXShellScriptBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | ); 374 | inputFileListPaths = ( 375 | "${PODS_ROOT}/Target Support Files/Pods-CleanArc-CleanArcTests/Pods-CleanArc-CleanArcTests-resources-${CONFIGURATION}-input-files.xcfilelist", 376 | ); 377 | name = "[CP] Copy Pods Resources"; 378 | outputFileListPaths = ( 379 | "${PODS_ROOT}/Target Support Files/Pods-CleanArc-CleanArcTests/Pods-CleanArc-CleanArcTests-resources-${CONFIGURATION}-output-files.xcfilelist", 380 | ); 381 | runOnlyForDeploymentPostprocessing = 0; 382 | shellPath = /bin/sh; 383 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CleanArc-CleanArcTests/Pods-CleanArc-CleanArcTests-resources.sh\"\n"; 384 | showEnvVarsInLog = 0; 385 | }; 386 | /* End PBXShellScriptBuildPhase section */ 387 | 388 | /* Begin PBXSourcesBuildPhase section */ 389 | 00E356EA1AD99517003FC87E /* Sources */ = { 390 | isa = PBXSourcesBuildPhase; 391 | buildActionMask = 2147483647; 392 | files = ( 393 | 00E356F31AD99517003FC87E /* CleanArcTests.m in Sources */, 394 | ); 395 | runOnlyForDeploymentPostprocessing = 0; 396 | }; 397 | 13B07F871A680F5B00A75B9A /* Sources */ = { 398 | isa = PBXSourcesBuildPhase; 399 | buildActionMask = 2147483647; 400 | files = ( 401 | 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, 402 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 403 | ); 404 | runOnlyForDeploymentPostprocessing = 0; 405 | }; 406 | /* End PBXSourcesBuildPhase section */ 407 | 408 | /* Begin PBXTargetDependency section */ 409 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 410 | isa = PBXTargetDependency; 411 | target = 13B07F861A680F5B00A75B9A /* CleanArc */; 412 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 413 | }; 414 | /* End PBXTargetDependency section */ 415 | 416 | /* Begin XCBuildConfiguration section */ 417 | 00E356F61AD99517003FC87E /* Debug */ = { 418 | isa = XCBuildConfiguration; 419 | baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-CleanArc-CleanArcTests.debug.xcconfig */; 420 | buildSettings = { 421 | BUNDLE_LOADER = "$(TEST_HOST)"; 422 | GCC_PREPROCESSOR_DEFINITIONS = ( 423 | "DEBUG=1", 424 | "$(inherited)", 425 | ); 426 | INFOPLIST_FILE = CleanArcTests/Info.plist; 427 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 428 | LD_RUNPATH_SEARCH_PATHS = ( 429 | "$(inherited)", 430 | "@executable_path/Frameworks", 431 | "@loader_path/Frameworks", 432 | ); 433 | OTHER_LDFLAGS = ( 434 | "-ObjC", 435 | "-lc++", 436 | "$(inherited)", 437 | ); 438 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 439 | PRODUCT_NAME = "$(TARGET_NAME)"; 440 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CleanArc.app/CleanArc"; 441 | }; 442 | name = Debug; 443 | }; 444 | 00E356F71AD99517003FC87E /* Release */ = { 445 | isa = XCBuildConfiguration; 446 | baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-CleanArc-CleanArcTests.release.xcconfig */; 447 | buildSettings = { 448 | BUNDLE_LOADER = "$(TEST_HOST)"; 449 | COPY_PHASE_STRIP = NO; 450 | INFOPLIST_FILE = CleanArcTests/Info.plist; 451 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 452 | LD_RUNPATH_SEARCH_PATHS = ( 453 | "$(inherited)", 454 | "@executable_path/Frameworks", 455 | "@loader_path/Frameworks", 456 | ); 457 | OTHER_LDFLAGS = ( 458 | "-ObjC", 459 | "-lc++", 460 | "$(inherited)", 461 | ); 462 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 463 | PRODUCT_NAME = "$(TARGET_NAME)"; 464 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CleanArc.app/CleanArc"; 465 | }; 466 | name = Release; 467 | }; 468 | 13B07F941A680F5B00A75B9A /* Debug */ = { 469 | isa = XCBuildConfiguration; 470 | baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-CleanArc.debug.xcconfig */; 471 | buildSettings = { 472 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 473 | CLANG_ENABLE_MODULES = YES; 474 | CURRENT_PROJECT_VERSION = 1; 475 | ENABLE_BITCODE = NO; 476 | INFOPLIST_FILE = CleanArc/Info.plist; 477 | LD_RUNPATH_SEARCH_PATHS = ( 478 | "$(inherited)", 479 | "@executable_path/Frameworks", 480 | ); 481 | MARKETING_VERSION = 1.0; 482 | OTHER_LDFLAGS = ( 483 | "$(inherited)", 484 | "-ObjC", 485 | "-lc++", 486 | ); 487 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 488 | PRODUCT_NAME = CleanArc; 489 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 490 | SWIFT_VERSION = 5.0; 491 | VERSIONING_SYSTEM = "apple-generic"; 492 | }; 493 | name = Debug; 494 | }; 495 | 13B07F951A680F5B00A75B9A /* Release */ = { 496 | isa = XCBuildConfiguration; 497 | baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-CleanArc.release.xcconfig */; 498 | buildSettings = { 499 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 500 | CLANG_ENABLE_MODULES = YES; 501 | CURRENT_PROJECT_VERSION = 1; 502 | INFOPLIST_FILE = CleanArc/Info.plist; 503 | LD_RUNPATH_SEARCH_PATHS = ( 504 | "$(inherited)", 505 | "@executable_path/Frameworks", 506 | ); 507 | MARKETING_VERSION = 1.0; 508 | OTHER_LDFLAGS = ( 509 | "$(inherited)", 510 | "-ObjC", 511 | "-lc++", 512 | ); 513 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 514 | PRODUCT_NAME = CleanArc; 515 | SWIFT_VERSION = 5.0; 516 | VERSIONING_SYSTEM = "apple-generic"; 517 | }; 518 | name = Release; 519 | }; 520 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 521 | isa = XCBuildConfiguration; 522 | buildSettings = { 523 | ALWAYS_SEARCH_USER_PATHS = NO; 524 | CC = ""; 525 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 526 | CLANG_CXX_LANGUAGE_STANDARD = "c++20"; 527 | CLANG_CXX_LIBRARY = "libc++"; 528 | CLANG_ENABLE_MODULES = YES; 529 | CLANG_ENABLE_OBJC_ARC = YES; 530 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 531 | CLANG_WARN_BOOL_CONVERSION = YES; 532 | CLANG_WARN_COMMA = YES; 533 | CLANG_WARN_CONSTANT_CONVERSION = YES; 534 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 535 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 536 | CLANG_WARN_EMPTY_BODY = YES; 537 | CLANG_WARN_ENUM_CONVERSION = YES; 538 | CLANG_WARN_INFINITE_RECURSION = YES; 539 | CLANG_WARN_INT_CONVERSION = YES; 540 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 541 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 542 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 543 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 544 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 545 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 546 | CLANG_WARN_STRICT_PROTOTYPES = YES; 547 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 548 | CLANG_WARN_UNREACHABLE_CODE = YES; 549 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 550 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 551 | COPY_PHASE_STRIP = NO; 552 | CXX = ""; 553 | ENABLE_STRICT_OBJC_MSGSEND = YES; 554 | ENABLE_TESTABILITY = YES; 555 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; 556 | GCC_C_LANGUAGE_STANDARD = gnu99; 557 | GCC_DYNAMIC_NO_PIC = NO; 558 | GCC_NO_COMMON_BLOCKS = YES; 559 | GCC_OPTIMIZATION_LEVEL = 0; 560 | GCC_PREPROCESSOR_DEFINITIONS = ( 561 | "DEBUG=1", 562 | "$(inherited)", 563 | ); 564 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 565 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 566 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 567 | GCC_WARN_UNDECLARED_SELECTOR = YES; 568 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 569 | GCC_WARN_UNUSED_FUNCTION = YES; 570 | GCC_WARN_UNUSED_VARIABLE = YES; 571 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 572 | LD = ""; 573 | LDPLUSPLUS = ""; 574 | LD_RUNPATH_SEARCH_PATHS = ( 575 | /usr/lib/swift, 576 | "$(inherited)", 577 | ); 578 | LIBRARY_SEARCH_PATHS = ( 579 | "\"$(SDKROOT)/usr/lib/swift\"", 580 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", 581 | "\"$(inherited)\"", 582 | ); 583 | MTL_ENABLE_DEBUG_INFO = YES; 584 | ONLY_ACTIVE_ARCH = YES; 585 | OTHER_CPLUSPLUSFLAGS = ( 586 | "$(OTHER_CFLAGS)", 587 | "-DFOLLY_NO_CONFIG", 588 | "-DFOLLY_MOBILE=1", 589 | "-DFOLLY_USE_LIBCPP=1", 590 | "-DFOLLY_CFG_NO_COROUTINES=1", 591 | "-DFOLLY_HAVE_CLOCK_GETTIME=1", 592 | ); 593 | OTHER_LDFLAGS = ( 594 | "$(inherited)", 595 | " ", 596 | ); 597 | REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; 598 | SDKROOT = iphoneos; 599 | USE_HERMES = true; 600 | }; 601 | name = Debug; 602 | }; 603 | 83CBBA211A601CBA00E9B192 /* Release */ = { 604 | isa = XCBuildConfiguration; 605 | buildSettings = { 606 | ALWAYS_SEARCH_USER_PATHS = NO; 607 | CC = ""; 608 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 609 | CLANG_CXX_LANGUAGE_STANDARD = "c++20"; 610 | CLANG_CXX_LIBRARY = "libc++"; 611 | CLANG_ENABLE_MODULES = YES; 612 | CLANG_ENABLE_OBJC_ARC = YES; 613 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 614 | CLANG_WARN_BOOL_CONVERSION = YES; 615 | CLANG_WARN_COMMA = YES; 616 | CLANG_WARN_CONSTANT_CONVERSION = YES; 617 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 618 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 619 | CLANG_WARN_EMPTY_BODY = YES; 620 | CLANG_WARN_ENUM_CONVERSION = YES; 621 | CLANG_WARN_INFINITE_RECURSION = YES; 622 | CLANG_WARN_INT_CONVERSION = YES; 623 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 624 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 625 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 626 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 627 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 628 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 629 | CLANG_WARN_STRICT_PROTOTYPES = YES; 630 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 631 | CLANG_WARN_UNREACHABLE_CODE = YES; 632 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 633 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 634 | COPY_PHASE_STRIP = YES; 635 | CXX = ""; 636 | ENABLE_NS_ASSERTIONS = NO; 637 | ENABLE_STRICT_OBJC_MSGSEND = YES; 638 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; 639 | GCC_C_LANGUAGE_STANDARD = gnu99; 640 | GCC_NO_COMMON_BLOCKS = YES; 641 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 642 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 643 | GCC_WARN_UNDECLARED_SELECTOR = YES; 644 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 645 | GCC_WARN_UNUSED_FUNCTION = YES; 646 | GCC_WARN_UNUSED_VARIABLE = YES; 647 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 648 | LD = ""; 649 | LDPLUSPLUS = ""; 650 | LD_RUNPATH_SEARCH_PATHS = ( 651 | /usr/lib/swift, 652 | "$(inherited)", 653 | ); 654 | LIBRARY_SEARCH_PATHS = ( 655 | "\"$(SDKROOT)/usr/lib/swift\"", 656 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", 657 | "\"$(inherited)\"", 658 | ); 659 | MTL_ENABLE_DEBUG_INFO = NO; 660 | OTHER_CPLUSPLUSFLAGS = ( 661 | "$(OTHER_CFLAGS)", 662 | "-DFOLLY_NO_CONFIG", 663 | "-DFOLLY_MOBILE=1", 664 | "-DFOLLY_USE_LIBCPP=1", 665 | "-DFOLLY_CFG_NO_COROUTINES=1", 666 | "-DFOLLY_HAVE_CLOCK_GETTIME=1", 667 | ); 668 | OTHER_LDFLAGS = ( 669 | "$(inherited)", 670 | " ", 671 | ); 672 | REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; 673 | SDKROOT = iphoneos; 674 | USE_HERMES = true; 675 | VALIDATE_PRODUCT = YES; 676 | }; 677 | name = Release; 678 | }; 679 | /* End XCBuildConfiguration section */ 680 | 681 | /* Begin XCConfigurationList section */ 682 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "CleanArcTests" */ = { 683 | isa = XCConfigurationList; 684 | buildConfigurations = ( 685 | 00E356F61AD99517003FC87E /* Debug */, 686 | 00E356F71AD99517003FC87E /* Release */, 687 | ); 688 | defaultConfigurationIsVisible = 0; 689 | defaultConfigurationName = Release; 690 | }; 691 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "CleanArc" */ = { 692 | isa = XCConfigurationList; 693 | buildConfigurations = ( 694 | 13B07F941A680F5B00A75B9A /* Debug */, 695 | 13B07F951A680F5B00A75B9A /* Release */, 696 | ); 697 | defaultConfigurationIsVisible = 0; 698 | defaultConfigurationName = Release; 699 | }; 700 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "CleanArc" */ = { 701 | isa = XCConfigurationList; 702 | buildConfigurations = ( 703 | 83CBBA201A601CBA00E9B192 /* Debug */, 704 | 83CBBA211A601CBA00E9B192 /* Release */, 705 | ); 706 | defaultConfigurationIsVisible = 0; 707 | defaultConfigurationName = Release; 708 | }; 709 | /* End XCConfigurationList section */ 710 | }; 711 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 712 | } 713 | -------------------------------------------------------------------------------- /ios/CleanArc.xcodeproj/xcshareddata/xcschemes/CleanArc.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /ios/CleanArc.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/CleanArc/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : RCTAppDelegate 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ios/CleanArc/AppDelegate.mm: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | 3 | #import 4 | 5 | @implementation AppDelegate 6 | 7 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 8 | { 9 | self.moduleName = @"CleanArc"; 10 | // You can add your custom initial props in the dictionary below. 11 | // They will be passed down to the ViewController used by React Native. 12 | self.initialProps = @{}; 13 | 14 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 15 | } 16 | 17 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge 18 | { 19 | return [self bundleURL]; 20 | } 21 | 22 | - (NSURL *)bundleURL 23 | { 24 | #if DEBUG 25 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; 26 | #else 27 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 28 | #endif 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ios/CleanArc/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "scale" : "1x", 46 | "size" : "1024x1024" 47 | } 48 | ], 49 | "info" : { 50 | "author" : "xcode", 51 | "version" : 1 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /ios/CleanArc/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/CleanArc/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | CleanArc 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | $(CURRENT_PROJECT_VERSION) 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | 30 | NSAllowsArbitraryLoads 31 | 32 | NSAllowsLocalNetworking 33 | 34 | 35 | NSLocationWhenInUseUsageDescription 36 | 37 | UILaunchStoryboardName 38 | LaunchScreen 39 | UIRequiredDeviceCapabilities 40 | 41 | arm64 42 | 43 | UISupportedInterfaceOrientations 44 | 45 | UIInterfaceOrientationPortrait 46 | UIInterfaceOrientationLandscapeLeft 47 | UIInterfaceOrientationLandscapeRight 48 | 49 | UIViewControllerBasedStatusBarAppearance 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /ios/CleanArc/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 24 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /ios/CleanArc/PrivacyInfo.xcprivacy: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSPrivacyAccessedAPITypes 6 | 7 | 8 | NSPrivacyAccessedAPIType 9 | NSPrivacyAccessedAPICategoryFileTimestamp 10 | NSPrivacyAccessedAPITypeReasons 11 | 12 | C617.1 13 | 14 | 15 | 16 | NSPrivacyAccessedAPIType 17 | NSPrivacyAccessedAPICategoryUserDefaults 18 | NSPrivacyAccessedAPITypeReasons 19 | 20 | CA92.1 21 | 22 | 23 | 24 | NSPrivacyAccessedAPIType 25 | NSPrivacyAccessedAPICategorySystemBootTime 26 | NSPrivacyAccessedAPITypeReasons 27 | 28 | 35F9.1 29 | 30 | 31 | 32 | NSPrivacyCollectedDataTypes 33 | 34 | NSPrivacyTracking 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ios/CleanArc/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | @autoreleasepool { 8 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /ios/CleanArcTests/CleanArcTests.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | #import 5 | #import 6 | 7 | #define TIMEOUT_SECONDS 600 8 | #define TEXT_TO_LOOK_FOR @"Welcome to React" 9 | 10 | @interface CleanArcTests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation CleanArcTests 15 | 16 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test 17 | { 18 | if (test(view)) { 19 | return YES; 20 | } 21 | for (UIView *subview in [view subviews]) { 22 | if ([self findSubviewInView:subview matching:test]) { 23 | return YES; 24 | } 25 | } 26 | return NO; 27 | } 28 | 29 | - (void)testRendersWelcomeScreen 30 | { 31 | UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; 32 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 33 | BOOL foundElement = NO; 34 | 35 | __block NSString *redboxError = nil; 36 | #ifdef DEBUG 37 | RCTSetLogFunction( 38 | ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 39 | if (level >= RCTLogLevelError) { 40 | redboxError = message; 41 | } 42 | }); 43 | #endif 44 | 45 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 46 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 47 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 48 | 49 | foundElement = [self findSubviewInView:vc.view 50 | matching:^BOOL(UIView *view) { 51 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 52 | return YES; 53 | } 54 | return NO; 55 | }]; 56 | } 57 | 58 | #ifdef DEBUG 59 | RCTSetLogFunction(RCTDefaultLogFunction); 60 | #endif 61 | 62 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 63 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 64 | } 65 | 66 | @end 67 | -------------------------------------------------------------------------------- /ios/CleanArcTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | # Resolve react_native_pods.rb with node to allow for hoisting 2 | require Pod::Executable.execute_command('node', ['-p', 3 | 'require.resolve( 4 | "react-native/scripts/react_native_pods.rb", 5 | {paths: [process.argv[1]]}, 6 | )', __dir__]).strip 7 | 8 | platform :ios, min_ios_version_supported 9 | prepare_react_native_project! 10 | 11 | linkage = ENV['USE_FRAMEWORKS'] 12 | if linkage != nil 13 | Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green 14 | use_frameworks! :linkage => linkage.to_sym 15 | end 16 | 17 | target 'CleanArc' do 18 | config = use_native_modules! 19 | 20 | use_react_native!( 21 | :path => config[:reactNativePath], 22 | # An absolute path to your application root. 23 | :app_path => "#{Pod::Config.instance.installation_root}/.." 24 | ) 25 | 26 | target 'CleanArcTests' do 27 | inherit! :complete 28 | # Pods for testing 29 | end 30 | 31 | post_install do |installer| 32 | # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 33 | react_native_post_install( 34 | installer, 35 | config[:reactNativePath], 36 | :mac_catalyst_enabled => false, 37 | # :ccache_enabled => true 38 | ) 39 | end 40 | end 41 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - boost (1.83.0) 3 | - DoubleConversion (1.1.6) 4 | - FBLazyVector (0.74.3) 5 | - fmt (9.1.0) 6 | - glog (0.3.5) 7 | - hermes-engine (0.74.3): 8 | - hermes-engine/Pre-built (= 0.74.3) 9 | - hermes-engine/Pre-built (0.74.3) 10 | - libwebp (1.3.2): 11 | - libwebp/demux (= 1.3.2) 12 | - libwebp/mux (= 1.3.2) 13 | - libwebp/sharpyuv (= 1.3.2) 14 | - libwebp/webp (= 1.3.2) 15 | - libwebp/demux (1.3.2): 16 | - libwebp/webp 17 | - libwebp/mux (1.3.2): 18 | - libwebp/demux 19 | - libwebp/sharpyuv (1.3.2) 20 | - libwebp/webp (1.3.2): 21 | - libwebp/sharpyuv 22 | - RCT-Folly (2024.01.01.00): 23 | - boost 24 | - DoubleConversion 25 | - fmt (= 9.1.0) 26 | - glog 27 | - RCT-Folly/Default (= 2024.01.01.00) 28 | - RCT-Folly/Default (2024.01.01.00): 29 | - boost 30 | - DoubleConversion 31 | - fmt (= 9.1.0) 32 | - glog 33 | - RCT-Folly/Fabric (2024.01.01.00): 34 | - boost 35 | - DoubleConversion 36 | - fmt (= 9.1.0) 37 | - glog 38 | - RCTDeprecation (0.74.3) 39 | - RCTRequired (0.74.3) 40 | - RCTTypeSafety (0.74.3): 41 | - FBLazyVector (= 0.74.3) 42 | - RCTRequired (= 0.74.3) 43 | - React-Core (= 0.74.3) 44 | - React (0.74.3): 45 | - React-Core (= 0.74.3) 46 | - React-Core/DevSupport (= 0.74.3) 47 | - React-Core/RCTWebSocket (= 0.74.3) 48 | - React-RCTActionSheet (= 0.74.3) 49 | - React-RCTAnimation (= 0.74.3) 50 | - React-RCTBlob (= 0.74.3) 51 | - React-RCTImage (= 0.74.3) 52 | - React-RCTLinking (= 0.74.3) 53 | - React-RCTNetwork (= 0.74.3) 54 | - React-RCTSettings (= 0.74.3) 55 | - React-RCTText (= 0.74.3) 56 | - React-RCTVibration (= 0.74.3) 57 | - React-callinvoker (0.74.3) 58 | - React-Codegen (0.74.3): 59 | - DoubleConversion 60 | - glog 61 | - hermes-engine 62 | - RCT-Folly 63 | - RCTRequired 64 | - RCTTypeSafety 65 | - React-Core 66 | - React-debug 67 | - React-Fabric 68 | - React-FabricImage 69 | - React-featureflags 70 | - React-graphics 71 | - React-jsi 72 | - React-jsiexecutor 73 | - React-NativeModulesApple 74 | - React-rendererdebug 75 | - React-utils 76 | - ReactCommon/turbomodule/bridging 77 | - ReactCommon/turbomodule/core 78 | - React-Core (0.74.3): 79 | - glog 80 | - hermes-engine 81 | - RCT-Folly (= 2024.01.01.00) 82 | - RCTDeprecation 83 | - React-Core/Default (= 0.74.3) 84 | - React-cxxreact 85 | - React-featureflags 86 | - React-hermes 87 | - React-jsi 88 | - React-jsiexecutor 89 | - React-jsinspector 90 | - React-perflogger 91 | - React-runtimescheduler 92 | - React-utils 93 | - SocketRocket (= 0.7.0) 94 | - Yoga 95 | - React-Core/CoreModulesHeaders (0.74.3): 96 | - glog 97 | - hermes-engine 98 | - RCT-Folly (= 2024.01.01.00) 99 | - RCTDeprecation 100 | - React-Core/Default 101 | - React-cxxreact 102 | - React-featureflags 103 | - React-hermes 104 | - React-jsi 105 | - React-jsiexecutor 106 | - React-jsinspector 107 | - React-perflogger 108 | - React-runtimescheduler 109 | - React-utils 110 | - SocketRocket (= 0.7.0) 111 | - Yoga 112 | - React-Core/Default (0.74.3): 113 | - glog 114 | - hermes-engine 115 | - RCT-Folly (= 2024.01.01.00) 116 | - RCTDeprecation 117 | - React-cxxreact 118 | - React-featureflags 119 | - React-hermes 120 | - React-jsi 121 | - React-jsiexecutor 122 | - React-jsinspector 123 | - React-perflogger 124 | - React-runtimescheduler 125 | - React-utils 126 | - SocketRocket (= 0.7.0) 127 | - Yoga 128 | - React-Core/DevSupport (0.74.3): 129 | - glog 130 | - hermes-engine 131 | - RCT-Folly (= 2024.01.01.00) 132 | - RCTDeprecation 133 | - React-Core/Default (= 0.74.3) 134 | - React-Core/RCTWebSocket (= 0.74.3) 135 | - React-cxxreact 136 | - React-featureflags 137 | - React-hermes 138 | - React-jsi 139 | - React-jsiexecutor 140 | - React-jsinspector 141 | - React-perflogger 142 | - React-runtimescheduler 143 | - React-utils 144 | - SocketRocket (= 0.7.0) 145 | - Yoga 146 | - React-Core/RCTActionSheetHeaders (0.74.3): 147 | - glog 148 | - hermes-engine 149 | - RCT-Folly (= 2024.01.01.00) 150 | - RCTDeprecation 151 | - React-Core/Default 152 | - React-cxxreact 153 | - React-featureflags 154 | - React-hermes 155 | - React-jsi 156 | - React-jsiexecutor 157 | - React-jsinspector 158 | - React-perflogger 159 | - React-runtimescheduler 160 | - React-utils 161 | - SocketRocket (= 0.7.0) 162 | - Yoga 163 | - React-Core/RCTAnimationHeaders (0.74.3): 164 | - glog 165 | - hermes-engine 166 | - RCT-Folly (= 2024.01.01.00) 167 | - RCTDeprecation 168 | - React-Core/Default 169 | - React-cxxreact 170 | - React-featureflags 171 | - React-hermes 172 | - React-jsi 173 | - React-jsiexecutor 174 | - React-jsinspector 175 | - React-perflogger 176 | - React-runtimescheduler 177 | - React-utils 178 | - SocketRocket (= 0.7.0) 179 | - Yoga 180 | - React-Core/RCTBlobHeaders (0.74.3): 181 | - glog 182 | - hermes-engine 183 | - RCT-Folly (= 2024.01.01.00) 184 | - RCTDeprecation 185 | - React-Core/Default 186 | - React-cxxreact 187 | - React-featureflags 188 | - React-hermes 189 | - React-jsi 190 | - React-jsiexecutor 191 | - React-jsinspector 192 | - React-perflogger 193 | - React-runtimescheduler 194 | - React-utils 195 | - SocketRocket (= 0.7.0) 196 | - Yoga 197 | - React-Core/RCTImageHeaders (0.74.3): 198 | - glog 199 | - hermes-engine 200 | - RCT-Folly (= 2024.01.01.00) 201 | - RCTDeprecation 202 | - React-Core/Default 203 | - React-cxxreact 204 | - React-featureflags 205 | - React-hermes 206 | - React-jsi 207 | - React-jsiexecutor 208 | - React-jsinspector 209 | - React-perflogger 210 | - React-runtimescheduler 211 | - React-utils 212 | - SocketRocket (= 0.7.0) 213 | - Yoga 214 | - React-Core/RCTLinkingHeaders (0.74.3): 215 | - glog 216 | - hermes-engine 217 | - RCT-Folly (= 2024.01.01.00) 218 | - RCTDeprecation 219 | - React-Core/Default 220 | - React-cxxreact 221 | - React-featureflags 222 | - React-hermes 223 | - React-jsi 224 | - React-jsiexecutor 225 | - React-jsinspector 226 | - React-perflogger 227 | - React-runtimescheduler 228 | - React-utils 229 | - SocketRocket (= 0.7.0) 230 | - Yoga 231 | - React-Core/RCTNetworkHeaders (0.74.3): 232 | - glog 233 | - hermes-engine 234 | - RCT-Folly (= 2024.01.01.00) 235 | - RCTDeprecation 236 | - React-Core/Default 237 | - React-cxxreact 238 | - React-featureflags 239 | - React-hermes 240 | - React-jsi 241 | - React-jsiexecutor 242 | - React-jsinspector 243 | - React-perflogger 244 | - React-runtimescheduler 245 | - React-utils 246 | - SocketRocket (= 0.7.0) 247 | - Yoga 248 | - React-Core/RCTSettingsHeaders (0.74.3): 249 | - glog 250 | - hermes-engine 251 | - RCT-Folly (= 2024.01.01.00) 252 | - RCTDeprecation 253 | - React-Core/Default 254 | - React-cxxreact 255 | - React-featureflags 256 | - React-hermes 257 | - React-jsi 258 | - React-jsiexecutor 259 | - React-jsinspector 260 | - React-perflogger 261 | - React-runtimescheduler 262 | - React-utils 263 | - SocketRocket (= 0.7.0) 264 | - Yoga 265 | - React-Core/RCTTextHeaders (0.74.3): 266 | - glog 267 | - hermes-engine 268 | - RCT-Folly (= 2024.01.01.00) 269 | - RCTDeprecation 270 | - React-Core/Default 271 | - React-cxxreact 272 | - React-featureflags 273 | - React-hermes 274 | - React-jsi 275 | - React-jsiexecutor 276 | - React-jsinspector 277 | - React-perflogger 278 | - React-runtimescheduler 279 | - React-utils 280 | - SocketRocket (= 0.7.0) 281 | - Yoga 282 | - React-Core/RCTVibrationHeaders (0.74.3): 283 | - glog 284 | - hermes-engine 285 | - RCT-Folly (= 2024.01.01.00) 286 | - RCTDeprecation 287 | - React-Core/Default 288 | - React-cxxreact 289 | - React-featureflags 290 | - React-hermes 291 | - React-jsi 292 | - React-jsiexecutor 293 | - React-jsinspector 294 | - React-perflogger 295 | - React-runtimescheduler 296 | - React-utils 297 | - SocketRocket (= 0.7.0) 298 | - Yoga 299 | - React-Core/RCTWebSocket (0.74.3): 300 | - glog 301 | - hermes-engine 302 | - RCT-Folly (= 2024.01.01.00) 303 | - RCTDeprecation 304 | - React-Core/Default (= 0.74.3) 305 | - React-cxxreact 306 | - React-featureflags 307 | - React-hermes 308 | - React-jsi 309 | - React-jsiexecutor 310 | - React-jsinspector 311 | - React-perflogger 312 | - React-runtimescheduler 313 | - React-utils 314 | - SocketRocket (= 0.7.0) 315 | - Yoga 316 | - React-CoreModules (0.74.3): 317 | - DoubleConversion 318 | - fmt (= 9.1.0) 319 | - RCT-Folly (= 2024.01.01.00) 320 | - RCTTypeSafety (= 0.74.3) 321 | - React-Codegen 322 | - React-Core/CoreModulesHeaders (= 0.74.3) 323 | - React-jsi (= 0.74.3) 324 | - React-jsinspector 325 | - React-NativeModulesApple 326 | - React-RCTBlob 327 | - React-RCTImage (= 0.74.3) 328 | - ReactCommon 329 | - SocketRocket (= 0.7.0) 330 | - React-cxxreact (0.74.3): 331 | - boost (= 1.83.0) 332 | - DoubleConversion 333 | - fmt (= 9.1.0) 334 | - glog 335 | - hermes-engine 336 | - RCT-Folly (= 2024.01.01.00) 337 | - React-callinvoker (= 0.74.3) 338 | - React-debug (= 0.74.3) 339 | - React-jsi (= 0.74.3) 340 | - React-jsinspector 341 | - React-logger (= 0.74.3) 342 | - React-perflogger (= 0.74.3) 343 | - React-runtimeexecutor (= 0.74.3) 344 | - React-debug (0.74.3) 345 | - React-Fabric (0.74.3): 346 | - DoubleConversion 347 | - fmt (= 9.1.0) 348 | - glog 349 | - hermes-engine 350 | - RCT-Folly/Fabric (= 2024.01.01.00) 351 | - RCTRequired 352 | - RCTTypeSafety 353 | - React-Core 354 | - React-cxxreact 355 | - React-debug 356 | - React-Fabric/animations (= 0.74.3) 357 | - React-Fabric/attributedstring (= 0.74.3) 358 | - React-Fabric/componentregistry (= 0.74.3) 359 | - React-Fabric/componentregistrynative (= 0.74.3) 360 | - React-Fabric/components (= 0.74.3) 361 | - React-Fabric/core (= 0.74.3) 362 | - React-Fabric/imagemanager (= 0.74.3) 363 | - React-Fabric/leakchecker (= 0.74.3) 364 | - React-Fabric/mounting (= 0.74.3) 365 | - React-Fabric/scheduler (= 0.74.3) 366 | - React-Fabric/telemetry (= 0.74.3) 367 | - React-Fabric/templateprocessor (= 0.74.3) 368 | - React-Fabric/textlayoutmanager (= 0.74.3) 369 | - React-Fabric/uimanager (= 0.74.3) 370 | - React-graphics 371 | - React-jsi 372 | - React-jsiexecutor 373 | - React-logger 374 | - React-rendererdebug 375 | - React-runtimescheduler 376 | - React-utils 377 | - ReactCommon/turbomodule/core 378 | - React-Fabric/animations (0.74.3): 379 | - DoubleConversion 380 | - fmt (= 9.1.0) 381 | - glog 382 | - hermes-engine 383 | - RCT-Folly/Fabric (= 2024.01.01.00) 384 | - RCTRequired 385 | - RCTTypeSafety 386 | - React-Core 387 | - React-cxxreact 388 | - React-debug 389 | - React-graphics 390 | - React-jsi 391 | - React-jsiexecutor 392 | - React-logger 393 | - React-rendererdebug 394 | - React-runtimescheduler 395 | - React-utils 396 | - ReactCommon/turbomodule/core 397 | - React-Fabric/attributedstring (0.74.3): 398 | - DoubleConversion 399 | - fmt (= 9.1.0) 400 | - glog 401 | - hermes-engine 402 | - RCT-Folly/Fabric (= 2024.01.01.00) 403 | - RCTRequired 404 | - RCTTypeSafety 405 | - React-Core 406 | - React-cxxreact 407 | - React-debug 408 | - React-graphics 409 | - React-jsi 410 | - React-jsiexecutor 411 | - React-logger 412 | - React-rendererdebug 413 | - React-runtimescheduler 414 | - React-utils 415 | - ReactCommon/turbomodule/core 416 | - React-Fabric/componentregistry (0.74.3): 417 | - DoubleConversion 418 | - fmt (= 9.1.0) 419 | - glog 420 | - hermes-engine 421 | - RCT-Folly/Fabric (= 2024.01.01.00) 422 | - RCTRequired 423 | - RCTTypeSafety 424 | - React-Core 425 | - React-cxxreact 426 | - React-debug 427 | - React-graphics 428 | - React-jsi 429 | - React-jsiexecutor 430 | - React-logger 431 | - React-rendererdebug 432 | - React-runtimescheduler 433 | - React-utils 434 | - ReactCommon/turbomodule/core 435 | - React-Fabric/componentregistrynative (0.74.3): 436 | - DoubleConversion 437 | - fmt (= 9.1.0) 438 | - glog 439 | - hermes-engine 440 | - RCT-Folly/Fabric (= 2024.01.01.00) 441 | - RCTRequired 442 | - RCTTypeSafety 443 | - React-Core 444 | - React-cxxreact 445 | - React-debug 446 | - React-graphics 447 | - React-jsi 448 | - React-jsiexecutor 449 | - React-logger 450 | - React-rendererdebug 451 | - React-runtimescheduler 452 | - React-utils 453 | - ReactCommon/turbomodule/core 454 | - React-Fabric/components (0.74.3): 455 | - DoubleConversion 456 | - fmt (= 9.1.0) 457 | - glog 458 | - hermes-engine 459 | - RCT-Folly/Fabric (= 2024.01.01.00) 460 | - RCTRequired 461 | - RCTTypeSafety 462 | - React-Core 463 | - React-cxxreact 464 | - React-debug 465 | - React-Fabric/components/inputaccessory (= 0.74.3) 466 | - React-Fabric/components/legacyviewmanagerinterop (= 0.74.3) 467 | - React-Fabric/components/modal (= 0.74.3) 468 | - React-Fabric/components/rncore (= 0.74.3) 469 | - React-Fabric/components/root (= 0.74.3) 470 | - React-Fabric/components/safeareaview (= 0.74.3) 471 | - React-Fabric/components/scrollview (= 0.74.3) 472 | - React-Fabric/components/text (= 0.74.3) 473 | - React-Fabric/components/textinput (= 0.74.3) 474 | - React-Fabric/components/unimplementedview (= 0.74.3) 475 | - React-Fabric/components/view (= 0.74.3) 476 | - React-graphics 477 | - React-jsi 478 | - React-jsiexecutor 479 | - React-logger 480 | - React-rendererdebug 481 | - React-runtimescheduler 482 | - React-utils 483 | - ReactCommon/turbomodule/core 484 | - React-Fabric/components/inputaccessory (0.74.3): 485 | - DoubleConversion 486 | - fmt (= 9.1.0) 487 | - glog 488 | - hermes-engine 489 | - RCT-Folly/Fabric (= 2024.01.01.00) 490 | - RCTRequired 491 | - RCTTypeSafety 492 | - React-Core 493 | - React-cxxreact 494 | - React-debug 495 | - React-graphics 496 | - React-jsi 497 | - React-jsiexecutor 498 | - React-logger 499 | - React-rendererdebug 500 | - React-runtimescheduler 501 | - React-utils 502 | - ReactCommon/turbomodule/core 503 | - React-Fabric/components/legacyviewmanagerinterop (0.74.3): 504 | - DoubleConversion 505 | - fmt (= 9.1.0) 506 | - glog 507 | - hermes-engine 508 | - RCT-Folly/Fabric (= 2024.01.01.00) 509 | - RCTRequired 510 | - RCTTypeSafety 511 | - React-Core 512 | - React-cxxreact 513 | - React-debug 514 | - React-graphics 515 | - React-jsi 516 | - React-jsiexecutor 517 | - React-logger 518 | - React-rendererdebug 519 | - React-runtimescheduler 520 | - React-utils 521 | - ReactCommon/turbomodule/core 522 | - React-Fabric/components/modal (0.74.3): 523 | - DoubleConversion 524 | - fmt (= 9.1.0) 525 | - glog 526 | - hermes-engine 527 | - RCT-Folly/Fabric (= 2024.01.01.00) 528 | - RCTRequired 529 | - RCTTypeSafety 530 | - React-Core 531 | - React-cxxreact 532 | - React-debug 533 | - React-graphics 534 | - React-jsi 535 | - React-jsiexecutor 536 | - React-logger 537 | - React-rendererdebug 538 | - React-runtimescheduler 539 | - React-utils 540 | - ReactCommon/turbomodule/core 541 | - React-Fabric/components/rncore (0.74.3): 542 | - DoubleConversion 543 | - fmt (= 9.1.0) 544 | - glog 545 | - hermes-engine 546 | - RCT-Folly/Fabric (= 2024.01.01.00) 547 | - RCTRequired 548 | - RCTTypeSafety 549 | - React-Core 550 | - React-cxxreact 551 | - React-debug 552 | - React-graphics 553 | - React-jsi 554 | - React-jsiexecutor 555 | - React-logger 556 | - React-rendererdebug 557 | - React-runtimescheduler 558 | - React-utils 559 | - ReactCommon/turbomodule/core 560 | - React-Fabric/components/root (0.74.3): 561 | - DoubleConversion 562 | - fmt (= 9.1.0) 563 | - glog 564 | - hermes-engine 565 | - RCT-Folly/Fabric (= 2024.01.01.00) 566 | - RCTRequired 567 | - RCTTypeSafety 568 | - React-Core 569 | - React-cxxreact 570 | - React-debug 571 | - React-graphics 572 | - React-jsi 573 | - React-jsiexecutor 574 | - React-logger 575 | - React-rendererdebug 576 | - React-runtimescheduler 577 | - React-utils 578 | - ReactCommon/turbomodule/core 579 | - React-Fabric/components/safeareaview (0.74.3): 580 | - DoubleConversion 581 | - fmt (= 9.1.0) 582 | - glog 583 | - hermes-engine 584 | - RCT-Folly/Fabric (= 2024.01.01.00) 585 | - RCTRequired 586 | - RCTTypeSafety 587 | - React-Core 588 | - React-cxxreact 589 | - React-debug 590 | - React-graphics 591 | - React-jsi 592 | - React-jsiexecutor 593 | - React-logger 594 | - React-rendererdebug 595 | - React-runtimescheduler 596 | - React-utils 597 | - ReactCommon/turbomodule/core 598 | - React-Fabric/components/scrollview (0.74.3): 599 | - DoubleConversion 600 | - fmt (= 9.1.0) 601 | - glog 602 | - hermes-engine 603 | - RCT-Folly/Fabric (= 2024.01.01.00) 604 | - RCTRequired 605 | - RCTTypeSafety 606 | - React-Core 607 | - React-cxxreact 608 | - React-debug 609 | - React-graphics 610 | - React-jsi 611 | - React-jsiexecutor 612 | - React-logger 613 | - React-rendererdebug 614 | - React-runtimescheduler 615 | - React-utils 616 | - ReactCommon/turbomodule/core 617 | - React-Fabric/components/text (0.74.3): 618 | - DoubleConversion 619 | - fmt (= 9.1.0) 620 | - glog 621 | - hermes-engine 622 | - RCT-Folly/Fabric (= 2024.01.01.00) 623 | - RCTRequired 624 | - RCTTypeSafety 625 | - React-Core 626 | - React-cxxreact 627 | - React-debug 628 | - React-graphics 629 | - React-jsi 630 | - React-jsiexecutor 631 | - React-logger 632 | - React-rendererdebug 633 | - React-runtimescheduler 634 | - React-utils 635 | - ReactCommon/turbomodule/core 636 | - React-Fabric/components/textinput (0.74.3): 637 | - DoubleConversion 638 | - fmt (= 9.1.0) 639 | - glog 640 | - hermes-engine 641 | - RCT-Folly/Fabric (= 2024.01.01.00) 642 | - RCTRequired 643 | - RCTTypeSafety 644 | - React-Core 645 | - React-cxxreact 646 | - React-debug 647 | - React-graphics 648 | - React-jsi 649 | - React-jsiexecutor 650 | - React-logger 651 | - React-rendererdebug 652 | - React-runtimescheduler 653 | - React-utils 654 | - ReactCommon/turbomodule/core 655 | - React-Fabric/components/unimplementedview (0.74.3): 656 | - DoubleConversion 657 | - fmt (= 9.1.0) 658 | - glog 659 | - hermes-engine 660 | - RCT-Folly/Fabric (= 2024.01.01.00) 661 | - RCTRequired 662 | - RCTTypeSafety 663 | - React-Core 664 | - React-cxxreact 665 | - React-debug 666 | - React-graphics 667 | - React-jsi 668 | - React-jsiexecutor 669 | - React-logger 670 | - React-rendererdebug 671 | - React-runtimescheduler 672 | - React-utils 673 | - ReactCommon/turbomodule/core 674 | - React-Fabric/components/view (0.74.3): 675 | - DoubleConversion 676 | - fmt (= 9.1.0) 677 | - glog 678 | - hermes-engine 679 | - RCT-Folly/Fabric (= 2024.01.01.00) 680 | - RCTRequired 681 | - RCTTypeSafety 682 | - React-Core 683 | - React-cxxreact 684 | - React-debug 685 | - React-graphics 686 | - React-jsi 687 | - React-jsiexecutor 688 | - React-logger 689 | - React-rendererdebug 690 | - React-runtimescheduler 691 | - React-utils 692 | - ReactCommon/turbomodule/core 693 | - Yoga 694 | - React-Fabric/core (0.74.3): 695 | - DoubleConversion 696 | - fmt (= 9.1.0) 697 | - glog 698 | - hermes-engine 699 | - RCT-Folly/Fabric (= 2024.01.01.00) 700 | - RCTRequired 701 | - RCTTypeSafety 702 | - React-Core 703 | - React-cxxreact 704 | - React-debug 705 | - React-graphics 706 | - React-jsi 707 | - React-jsiexecutor 708 | - React-logger 709 | - React-rendererdebug 710 | - React-runtimescheduler 711 | - React-utils 712 | - ReactCommon/turbomodule/core 713 | - React-Fabric/imagemanager (0.74.3): 714 | - DoubleConversion 715 | - fmt (= 9.1.0) 716 | - glog 717 | - hermes-engine 718 | - RCT-Folly/Fabric (= 2024.01.01.00) 719 | - RCTRequired 720 | - RCTTypeSafety 721 | - React-Core 722 | - React-cxxreact 723 | - React-debug 724 | - React-graphics 725 | - React-jsi 726 | - React-jsiexecutor 727 | - React-logger 728 | - React-rendererdebug 729 | - React-runtimescheduler 730 | - React-utils 731 | - ReactCommon/turbomodule/core 732 | - React-Fabric/leakchecker (0.74.3): 733 | - DoubleConversion 734 | - fmt (= 9.1.0) 735 | - glog 736 | - hermes-engine 737 | - RCT-Folly/Fabric (= 2024.01.01.00) 738 | - RCTRequired 739 | - RCTTypeSafety 740 | - React-Core 741 | - React-cxxreact 742 | - React-debug 743 | - React-graphics 744 | - React-jsi 745 | - React-jsiexecutor 746 | - React-logger 747 | - React-rendererdebug 748 | - React-runtimescheduler 749 | - React-utils 750 | - ReactCommon/turbomodule/core 751 | - React-Fabric/mounting (0.74.3): 752 | - DoubleConversion 753 | - fmt (= 9.1.0) 754 | - glog 755 | - hermes-engine 756 | - RCT-Folly/Fabric (= 2024.01.01.00) 757 | - RCTRequired 758 | - RCTTypeSafety 759 | - React-Core 760 | - React-cxxreact 761 | - React-debug 762 | - React-graphics 763 | - React-jsi 764 | - React-jsiexecutor 765 | - React-logger 766 | - React-rendererdebug 767 | - React-runtimescheduler 768 | - React-utils 769 | - ReactCommon/turbomodule/core 770 | - React-Fabric/scheduler (0.74.3): 771 | - DoubleConversion 772 | - fmt (= 9.1.0) 773 | - glog 774 | - hermes-engine 775 | - RCT-Folly/Fabric (= 2024.01.01.00) 776 | - RCTRequired 777 | - RCTTypeSafety 778 | - React-Core 779 | - React-cxxreact 780 | - React-debug 781 | - React-graphics 782 | - React-jsi 783 | - React-jsiexecutor 784 | - React-logger 785 | - React-rendererdebug 786 | - React-runtimescheduler 787 | - React-utils 788 | - ReactCommon/turbomodule/core 789 | - React-Fabric/telemetry (0.74.3): 790 | - DoubleConversion 791 | - fmt (= 9.1.0) 792 | - glog 793 | - hermes-engine 794 | - RCT-Folly/Fabric (= 2024.01.01.00) 795 | - RCTRequired 796 | - RCTTypeSafety 797 | - React-Core 798 | - React-cxxreact 799 | - React-debug 800 | - React-graphics 801 | - React-jsi 802 | - React-jsiexecutor 803 | - React-logger 804 | - React-rendererdebug 805 | - React-runtimescheduler 806 | - React-utils 807 | - ReactCommon/turbomodule/core 808 | - React-Fabric/templateprocessor (0.74.3): 809 | - DoubleConversion 810 | - fmt (= 9.1.0) 811 | - glog 812 | - hermes-engine 813 | - RCT-Folly/Fabric (= 2024.01.01.00) 814 | - RCTRequired 815 | - RCTTypeSafety 816 | - React-Core 817 | - React-cxxreact 818 | - React-debug 819 | - React-graphics 820 | - React-jsi 821 | - React-jsiexecutor 822 | - React-logger 823 | - React-rendererdebug 824 | - React-runtimescheduler 825 | - React-utils 826 | - ReactCommon/turbomodule/core 827 | - React-Fabric/textlayoutmanager (0.74.3): 828 | - DoubleConversion 829 | - fmt (= 9.1.0) 830 | - glog 831 | - hermes-engine 832 | - RCT-Folly/Fabric (= 2024.01.01.00) 833 | - RCTRequired 834 | - RCTTypeSafety 835 | - React-Core 836 | - React-cxxreact 837 | - React-debug 838 | - React-Fabric/uimanager 839 | - React-graphics 840 | - React-jsi 841 | - React-jsiexecutor 842 | - React-logger 843 | - React-rendererdebug 844 | - React-runtimescheduler 845 | - React-utils 846 | - ReactCommon/turbomodule/core 847 | - React-Fabric/uimanager (0.74.3): 848 | - DoubleConversion 849 | - fmt (= 9.1.0) 850 | - glog 851 | - hermes-engine 852 | - RCT-Folly/Fabric (= 2024.01.01.00) 853 | - RCTRequired 854 | - RCTTypeSafety 855 | - React-Core 856 | - React-cxxreact 857 | - React-debug 858 | - React-graphics 859 | - React-jsi 860 | - React-jsiexecutor 861 | - React-logger 862 | - React-rendererdebug 863 | - React-runtimescheduler 864 | - React-utils 865 | - ReactCommon/turbomodule/core 866 | - React-FabricImage (0.74.3): 867 | - DoubleConversion 868 | - fmt (= 9.1.0) 869 | - glog 870 | - hermes-engine 871 | - RCT-Folly/Fabric (= 2024.01.01.00) 872 | - RCTRequired (= 0.74.3) 873 | - RCTTypeSafety (= 0.74.3) 874 | - React-Fabric 875 | - React-graphics 876 | - React-ImageManager 877 | - React-jsi 878 | - React-jsiexecutor (= 0.74.3) 879 | - React-logger 880 | - React-rendererdebug 881 | - React-utils 882 | - ReactCommon 883 | - Yoga 884 | - React-featureflags (0.74.3) 885 | - React-graphics (0.74.3): 886 | - DoubleConversion 887 | - fmt (= 9.1.0) 888 | - glog 889 | - RCT-Folly/Fabric (= 2024.01.01.00) 890 | - React-Core/Default (= 0.74.3) 891 | - React-utils 892 | - React-hermes (0.74.3): 893 | - DoubleConversion 894 | - fmt (= 9.1.0) 895 | - glog 896 | - hermes-engine 897 | - RCT-Folly (= 2024.01.01.00) 898 | - React-cxxreact (= 0.74.3) 899 | - React-jsi 900 | - React-jsiexecutor (= 0.74.3) 901 | - React-jsinspector 902 | - React-perflogger (= 0.74.3) 903 | - React-runtimeexecutor 904 | - React-ImageManager (0.74.3): 905 | - glog 906 | - RCT-Folly/Fabric 907 | - React-Core/Default 908 | - React-debug 909 | - React-Fabric 910 | - React-graphics 911 | - React-rendererdebug 912 | - React-utils 913 | - React-jserrorhandler (0.74.3): 914 | - RCT-Folly/Fabric (= 2024.01.01.00) 915 | - React-debug 916 | - React-jsi 917 | - React-Mapbuffer 918 | - React-jsi (0.74.3): 919 | - boost (= 1.83.0) 920 | - DoubleConversion 921 | - fmt (= 9.1.0) 922 | - glog 923 | - hermes-engine 924 | - RCT-Folly (= 2024.01.01.00) 925 | - React-jsiexecutor (0.74.3): 926 | - DoubleConversion 927 | - fmt (= 9.1.0) 928 | - glog 929 | - hermes-engine 930 | - RCT-Folly (= 2024.01.01.00) 931 | - React-cxxreact (= 0.74.3) 932 | - React-jsi (= 0.74.3) 933 | - React-jsinspector 934 | - React-perflogger (= 0.74.3) 935 | - React-jsinspector (0.74.3): 936 | - DoubleConversion 937 | - glog 938 | - hermes-engine 939 | - RCT-Folly (= 2024.01.01.00) 940 | - React-featureflags 941 | - React-jsi 942 | - React-runtimeexecutor (= 0.74.3) 943 | - React-jsitracing (0.74.3): 944 | - React-jsi 945 | - React-logger (0.74.3): 946 | - glog 947 | - React-Mapbuffer (0.74.3): 948 | - glog 949 | - React-debug 950 | - react-native-safe-area-context (4.10.8): 951 | - React-Core 952 | - React-nativeconfig (0.74.3) 953 | - React-NativeModulesApple (0.74.3): 954 | - glog 955 | - hermes-engine 956 | - React-callinvoker 957 | - React-Core 958 | - React-cxxreact 959 | - React-jsi 960 | - React-jsinspector 961 | - React-runtimeexecutor 962 | - ReactCommon/turbomodule/bridging 963 | - ReactCommon/turbomodule/core 964 | - React-perflogger (0.74.3) 965 | - React-RCTActionSheet (0.74.3): 966 | - React-Core/RCTActionSheetHeaders (= 0.74.3) 967 | - React-RCTAnimation (0.74.3): 968 | - RCT-Folly (= 2024.01.01.00) 969 | - RCTTypeSafety 970 | - React-Codegen 971 | - React-Core/RCTAnimationHeaders 972 | - React-jsi 973 | - React-NativeModulesApple 974 | - ReactCommon 975 | - React-RCTAppDelegate (0.74.3): 976 | - RCT-Folly (= 2024.01.01.00) 977 | - RCTRequired 978 | - RCTTypeSafety 979 | - React-Codegen 980 | - React-Core 981 | - React-CoreModules 982 | - React-debug 983 | - React-Fabric 984 | - React-featureflags 985 | - React-graphics 986 | - React-hermes 987 | - React-nativeconfig 988 | - React-NativeModulesApple 989 | - React-RCTFabric 990 | - React-RCTImage 991 | - React-RCTNetwork 992 | - React-rendererdebug 993 | - React-RuntimeApple 994 | - React-RuntimeCore 995 | - React-RuntimeHermes 996 | - React-runtimescheduler 997 | - React-utils 998 | - ReactCommon 999 | - React-RCTBlob (0.74.3): 1000 | - DoubleConversion 1001 | - fmt (= 9.1.0) 1002 | - hermes-engine 1003 | - RCT-Folly (= 2024.01.01.00) 1004 | - React-Codegen 1005 | - React-Core/RCTBlobHeaders 1006 | - React-Core/RCTWebSocket 1007 | - React-jsi 1008 | - React-jsinspector 1009 | - React-NativeModulesApple 1010 | - React-RCTNetwork 1011 | - ReactCommon 1012 | - React-RCTFabric (0.74.3): 1013 | - glog 1014 | - hermes-engine 1015 | - RCT-Folly/Fabric (= 2024.01.01.00) 1016 | - React-Core 1017 | - React-debug 1018 | - React-Fabric 1019 | - React-FabricImage 1020 | - React-featureflags 1021 | - React-graphics 1022 | - React-ImageManager 1023 | - React-jsi 1024 | - React-jsinspector 1025 | - React-nativeconfig 1026 | - React-RCTImage 1027 | - React-RCTText 1028 | - React-rendererdebug 1029 | - React-runtimescheduler 1030 | - React-utils 1031 | - Yoga 1032 | - React-RCTImage (0.74.3): 1033 | - RCT-Folly (= 2024.01.01.00) 1034 | - RCTTypeSafety 1035 | - React-Codegen 1036 | - React-Core/RCTImageHeaders 1037 | - React-jsi 1038 | - React-NativeModulesApple 1039 | - React-RCTNetwork 1040 | - ReactCommon 1041 | - React-RCTLinking (0.74.3): 1042 | - React-Codegen 1043 | - React-Core/RCTLinkingHeaders (= 0.74.3) 1044 | - React-jsi (= 0.74.3) 1045 | - React-NativeModulesApple 1046 | - ReactCommon 1047 | - ReactCommon/turbomodule/core (= 0.74.3) 1048 | - React-RCTNetwork (0.74.3): 1049 | - RCT-Folly (= 2024.01.01.00) 1050 | - RCTTypeSafety 1051 | - React-Codegen 1052 | - React-Core/RCTNetworkHeaders 1053 | - React-jsi 1054 | - React-NativeModulesApple 1055 | - ReactCommon 1056 | - React-RCTSettings (0.74.3): 1057 | - RCT-Folly (= 2024.01.01.00) 1058 | - RCTTypeSafety 1059 | - React-Codegen 1060 | - React-Core/RCTSettingsHeaders 1061 | - React-jsi 1062 | - React-NativeModulesApple 1063 | - ReactCommon 1064 | - React-RCTText (0.74.3): 1065 | - React-Core/RCTTextHeaders (= 0.74.3) 1066 | - Yoga 1067 | - React-RCTVibration (0.74.3): 1068 | - RCT-Folly (= 2024.01.01.00) 1069 | - React-Codegen 1070 | - React-Core/RCTVibrationHeaders 1071 | - React-jsi 1072 | - React-NativeModulesApple 1073 | - ReactCommon 1074 | - React-rendererdebug (0.74.3): 1075 | - DoubleConversion 1076 | - fmt (= 9.1.0) 1077 | - RCT-Folly (= 2024.01.01.00) 1078 | - React-debug 1079 | - React-rncore (0.74.3) 1080 | - React-RuntimeApple (0.74.3): 1081 | - hermes-engine 1082 | - RCT-Folly/Fabric (= 2024.01.01.00) 1083 | - React-callinvoker 1084 | - React-Core/Default 1085 | - React-CoreModules 1086 | - React-cxxreact 1087 | - React-jserrorhandler 1088 | - React-jsi 1089 | - React-jsiexecutor 1090 | - React-jsinspector 1091 | - React-Mapbuffer 1092 | - React-NativeModulesApple 1093 | - React-RCTFabric 1094 | - React-RuntimeCore 1095 | - React-runtimeexecutor 1096 | - React-RuntimeHermes 1097 | - React-utils 1098 | - React-RuntimeCore (0.74.3): 1099 | - glog 1100 | - hermes-engine 1101 | - RCT-Folly/Fabric (= 2024.01.01.00) 1102 | - React-cxxreact 1103 | - React-featureflags 1104 | - React-jserrorhandler 1105 | - React-jsi 1106 | - React-jsiexecutor 1107 | - React-jsinspector 1108 | - React-runtimeexecutor 1109 | - React-runtimescheduler 1110 | - React-utils 1111 | - React-runtimeexecutor (0.74.3): 1112 | - React-jsi (= 0.74.3) 1113 | - React-RuntimeHermes (0.74.3): 1114 | - hermes-engine 1115 | - RCT-Folly/Fabric (= 2024.01.01.00) 1116 | - React-featureflags 1117 | - React-hermes 1118 | - React-jsi 1119 | - React-jsinspector 1120 | - React-jsitracing 1121 | - React-nativeconfig 1122 | - React-RuntimeCore 1123 | - React-utils 1124 | - React-runtimescheduler (0.74.3): 1125 | - glog 1126 | - hermes-engine 1127 | - RCT-Folly (= 2024.01.01.00) 1128 | - React-callinvoker 1129 | - React-cxxreact 1130 | - React-debug 1131 | - React-featureflags 1132 | - React-jsi 1133 | - React-rendererdebug 1134 | - React-runtimeexecutor 1135 | - React-utils 1136 | - React-utils (0.74.3): 1137 | - glog 1138 | - hermes-engine 1139 | - RCT-Folly (= 2024.01.01.00) 1140 | - React-debug 1141 | - React-jsi (= 0.74.3) 1142 | - ReactCommon (0.74.3): 1143 | - ReactCommon/turbomodule (= 0.74.3) 1144 | - ReactCommon/turbomodule (0.74.3): 1145 | - DoubleConversion 1146 | - fmt (= 9.1.0) 1147 | - glog 1148 | - hermes-engine 1149 | - RCT-Folly (= 2024.01.01.00) 1150 | - React-callinvoker (= 0.74.3) 1151 | - React-cxxreact (= 0.74.3) 1152 | - React-jsi (= 0.74.3) 1153 | - React-logger (= 0.74.3) 1154 | - React-perflogger (= 0.74.3) 1155 | - ReactCommon/turbomodule/bridging (= 0.74.3) 1156 | - ReactCommon/turbomodule/core (= 0.74.3) 1157 | - ReactCommon/turbomodule/bridging (0.74.3): 1158 | - DoubleConversion 1159 | - fmt (= 9.1.0) 1160 | - glog 1161 | - hermes-engine 1162 | - RCT-Folly (= 2024.01.01.00) 1163 | - React-callinvoker (= 0.74.3) 1164 | - React-cxxreact (= 0.74.3) 1165 | - React-jsi (= 0.74.3) 1166 | - React-logger (= 0.74.3) 1167 | - React-perflogger (= 0.74.3) 1168 | - ReactCommon/turbomodule/core (0.74.3): 1169 | - DoubleConversion 1170 | - fmt (= 9.1.0) 1171 | - glog 1172 | - hermes-engine 1173 | - RCT-Folly (= 2024.01.01.00) 1174 | - React-callinvoker (= 0.74.3) 1175 | - React-cxxreact (= 0.74.3) 1176 | - React-debug (= 0.74.3) 1177 | - React-jsi (= 0.74.3) 1178 | - React-logger (= 0.74.3) 1179 | - React-perflogger (= 0.74.3) 1180 | - React-utils (= 0.74.3) 1181 | - RNFastImage (8.6.3): 1182 | - React-Core 1183 | - SDWebImage (~> 5.11.1) 1184 | - SDWebImageWebPCoder (~> 0.8.4) 1185 | - RNFlashList (1.7.0): 1186 | - DoubleConversion 1187 | - glog 1188 | - hermes-engine 1189 | - RCT-Folly (= 2024.01.01.00) 1190 | - RCTRequired 1191 | - RCTTypeSafety 1192 | - React-Codegen 1193 | - React-Core 1194 | - React-debug 1195 | - React-Fabric 1196 | - React-featureflags 1197 | - React-graphics 1198 | - React-ImageManager 1199 | - React-NativeModulesApple 1200 | - React-RCTFabric 1201 | - React-rendererdebug 1202 | - React-utils 1203 | - ReactCommon/turbomodule/bridging 1204 | - ReactCommon/turbomodule/core 1205 | - Yoga 1206 | - RNScreens (3.32.0): 1207 | - DoubleConversion 1208 | - glog 1209 | - hermes-engine 1210 | - RCT-Folly (= 2024.01.01.00) 1211 | - RCTRequired 1212 | - RCTTypeSafety 1213 | - React-Codegen 1214 | - React-Core 1215 | - React-debug 1216 | - React-Fabric 1217 | - React-featureflags 1218 | - React-graphics 1219 | - React-ImageManager 1220 | - React-NativeModulesApple 1221 | - React-RCTFabric 1222 | - React-RCTImage 1223 | - React-rendererdebug 1224 | - React-utils 1225 | - ReactCommon/turbomodule/bridging 1226 | - ReactCommon/turbomodule/core 1227 | - Yoga 1228 | - SDWebImage (5.11.1): 1229 | - SDWebImage/Core (= 5.11.1) 1230 | - SDWebImage/Core (5.11.1) 1231 | - SDWebImageWebPCoder (0.8.5): 1232 | - libwebp (~> 1.0) 1233 | - SDWebImage/Core (~> 5.10) 1234 | - SocketRocket (0.7.0) 1235 | - Yoga (0.0.0) 1236 | 1237 | DEPENDENCIES: 1238 | - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) 1239 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) 1240 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) 1241 | - fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`) 1242 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) 1243 | - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) 1244 | - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) 1245 | - RCT-Folly/Fabric (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) 1246 | - RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`) 1247 | - RCTRequired (from `../node_modules/react-native/Libraries/Required`) 1248 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) 1249 | - React (from `../node_modules/react-native/`) 1250 | - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) 1251 | - React-Codegen (from `build/generated/ios`) 1252 | - React-Core (from `../node_modules/react-native/`) 1253 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`) 1254 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) 1255 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) 1256 | - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) 1257 | - React-Fabric (from `../node_modules/react-native/ReactCommon`) 1258 | - React-FabricImage (from `../node_modules/react-native/ReactCommon`) 1259 | - React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`) 1260 | - React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`) 1261 | - React-hermes (from `../node_modules/react-native/ReactCommon/hermes`) 1262 | - React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`) 1263 | - React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`) 1264 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) 1265 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) 1266 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`) 1267 | - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) 1268 | - React-logger (from `../node_modules/react-native/ReactCommon/logger`) 1269 | - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) 1270 | - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) 1271 | - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) 1272 | - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) 1273 | - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) 1274 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) 1275 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) 1276 | - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) 1277 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) 1278 | - React-RCTFabric (from `../node_modules/react-native/React`) 1279 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) 1280 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) 1281 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) 1282 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) 1283 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`) 1284 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) 1285 | - React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`) 1286 | - React-rncore (from `../node_modules/react-native/ReactCommon`) 1287 | - React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`) 1288 | - React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`) 1289 | - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) 1290 | - React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`) 1291 | - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) 1292 | - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) 1293 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) 1294 | - RNFastImage (from `../node_modules/react-native-fast-image`) 1295 | - "RNFlashList (from `../node_modules/@shopify/flash-list`)" 1296 | - RNScreens (from `../node_modules/react-native-screens`) 1297 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) 1298 | 1299 | SPEC REPOS: 1300 | trunk: 1301 | - libwebp 1302 | - SDWebImage 1303 | - SDWebImageWebPCoder 1304 | - SocketRocket 1305 | 1306 | EXTERNAL SOURCES: 1307 | boost: 1308 | :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" 1309 | DoubleConversion: 1310 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" 1311 | FBLazyVector: 1312 | :path: "../node_modules/react-native/Libraries/FBLazyVector" 1313 | fmt: 1314 | :podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec" 1315 | glog: 1316 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" 1317 | hermes-engine: 1318 | :podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec" 1319 | :tag: hermes-2024-06-28-RNv0.74.3-7bda0c267e76d11b68a585f84cfdd65000babf85 1320 | RCT-Folly: 1321 | :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" 1322 | RCTDeprecation: 1323 | :path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation" 1324 | RCTRequired: 1325 | :path: "../node_modules/react-native/Libraries/Required" 1326 | RCTTypeSafety: 1327 | :path: "../node_modules/react-native/Libraries/TypeSafety" 1328 | React: 1329 | :path: "../node_modules/react-native/" 1330 | React-callinvoker: 1331 | :path: "../node_modules/react-native/ReactCommon/callinvoker" 1332 | React-Codegen: 1333 | :path: build/generated/ios 1334 | React-Core: 1335 | :path: "../node_modules/react-native/" 1336 | React-CoreModules: 1337 | :path: "../node_modules/react-native/React/CoreModules" 1338 | React-cxxreact: 1339 | :path: "../node_modules/react-native/ReactCommon/cxxreact" 1340 | React-debug: 1341 | :path: "../node_modules/react-native/ReactCommon/react/debug" 1342 | React-Fabric: 1343 | :path: "../node_modules/react-native/ReactCommon" 1344 | React-FabricImage: 1345 | :path: "../node_modules/react-native/ReactCommon" 1346 | React-featureflags: 1347 | :path: "../node_modules/react-native/ReactCommon/react/featureflags" 1348 | React-graphics: 1349 | :path: "../node_modules/react-native/ReactCommon/react/renderer/graphics" 1350 | React-hermes: 1351 | :path: "../node_modules/react-native/ReactCommon/hermes" 1352 | React-ImageManager: 1353 | :path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios" 1354 | React-jserrorhandler: 1355 | :path: "../node_modules/react-native/ReactCommon/jserrorhandler" 1356 | React-jsi: 1357 | :path: "../node_modules/react-native/ReactCommon/jsi" 1358 | React-jsiexecutor: 1359 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor" 1360 | React-jsinspector: 1361 | :path: "../node_modules/react-native/ReactCommon/jsinspector-modern" 1362 | React-jsitracing: 1363 | :path: "../node_modules/react-native/ReactCommon/hermes/executor/" 1364 | React-logger: 1365 | :path: "../node_modules/react-native/ReactCommon/logger" 1366 | React-Mapbuffer: 1367 | :path: "../node_modules/react-native/ReactCommon" 1368 | react-native-safe-area-context: 1369 | :path: "../node_modules/react-native-safe-area-context" 1370 | React-nativeconfig: 1371 | :path: "../node_modules/react-native/ReactCommon" 1372 | React-NativeModulesApple: 1373 | :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" 1374 | React-perflogger: 1375 | :path: "../node_modules/react-native/ReactCommon/reactperflogger" 1376 | React-RCTActionSheet: 1377 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS" 1378 | React-RCTAnimation: 1379 | :path: "../node_modules/react-native/Libraries/NativeAnimation" 1380 | React-RCTAppDelegate: 1381 | :path: "../node_modules/react-native/Libraries/AppDelegate" 1382 | React-RCTBlob: 1383 | :path: "../node_modules/react-native/Libraries/Blob" 1384 | React-RCTFabric: 1385 | :path: "../node_modules/react-native/React" 1386 | React-RCTImage: 1387 | :path: "../node_modules/react-native/Libraries/Image" 1388 | React-RCTLinking: 1389 | :path: "../node_modules/react-native/Libraries/LinkingIOS" 1390 | React-RCTNetwork: 1391 | :path: "../node_modules/react-native/Libraries/Network" 1392 | React-RCTSettings: 1393 | :path: "../node_modules/react-native/Libraries/Settings" 1394 | React-RCTText: 1395 | :path: "../node_modules/react-native/Libraries/Text" 1396 | React-RCTVibration: 1397 | :path: "../node_modules/react-native/Libraries/Vibration" 1398 | React-rendererdebug: 1399 | :path: "../node_modules/react-native/ReactCommon/react/renderer/debug" 1400 | React-rncore: 1401 | :path: "../node_modules/react-native/ReactCommon" 1402 | React-RuntimeApple: 1403 | :path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios" 1404 | React-RuntimeCore: 1405 | :path: "../node_modules/react-native/ReactCommon/react/runtime" 1406 | React-runtimeexecutor: 1407 | :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" 1408 | React-RuntimeHermes: 1409 | :path: "../node_modules/react-native/ReactCommon/react/runtime" 1410 | React-runtimescheduler: 1411 | :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" 1412 | React-utils: 1413 | :path: "../node_modules/react-native/ReactCommon/react/utils" 1414 | ReactCommon: 1415 | :path: "../node_modules/react-native/ReactCommon" 1416 | RNFastImage: 1417 | :path: "../node_modules/react-native-fast-image" 1418 | RNFlashList: 1419 | :path: "../node_modules/@shopify/flash-list" 1420 | RNScreens: 1421 | :path: "../node_modules/react-native-screens" 1422 | Yoga: 1423 | :path: "../node_modules/react-native/ReactCommon/yoga" 1424 | 1425 | SPEC CHECKSUMS: 1426 | boost: d3f49c53809116a5d38da093a8aa78bf551aed09 1427 | DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 1428 | FBLazyVector: 7e977dd099937dc5458851233141583abba49ff2 1429 | fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 1430 | glog: fdfdfe5479092de0c4bdbebedd9056951f092c4f 1431 | hermes-engine: 1f547997900dd0752dc0cc0ae6dd16173c49e09b 1432 | libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009 1433 | RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47 1434 | RCTDeprecation: 4c7eeb42be0b2e95195563c49be08d0b839d22b4 1435 | RCTRequired: d530a0f489699c8500e944fde963102c42dcd0c2 1436 | RCTTypeSafety: b20878506b094fa3d9007d7b9e4be0faa3562499 1437 | React: 2f9da0177233f60fa3462d83fcccde245759f81a 1438 | React-callinvoker: d0205f0dcebf72ec27263ab41e3a5ad827ed503f 1439 | React-Codegen: b4457c8557cb61a27508745f8b03f16afeb9ef59 1440 | React-Core: 690ebbbf8f8dcfba6686ce8927731d3f025c3114 1441 | React-CoreModules: 185da31f5eb2e6043c3d19b10c64c4661322ed6a 1442 | React-cxxreact: c53d2ac9246235351086b8c588feaf775b4ec7f7 1443 | React-debug: dd8f7c772fda4196814a3b12620863d1d98b3a53 1444 | React-Fabric: 68935648d5c81e6b84445d9e726a79301f1fac8f 1445 | React-FabricImage: c92bd5ed4b553c800ca39aee305aaf8dd3e9f4b0 1446 | React-featureflags: ead50fe0ee4ab9278b5fd9f3f2f0f63e316452f4 1447 | React-graphics: 71c87b09041e45c61809cd357436e570dea5ed48 1448 | React-hermes: 917b7ab4c3cb9204c2ad020d74f313830097148b 1449 | React-ImageManager: 1086d48d00fcb511ea119bfc58fb12a72c4dcb95 1450 | React-jserrorhandler: 84d45913636750c2e620a8c8e049964967040405 1451 | React-jsi: 024b933267079f80c30a5cae97bf5ce521217505 1452 | React-jsiexecutor: 45cb079c87db3f514da3acfc686387a0e01de5c5 1453 | React-jsinspector: 1066f8b3da937daf8ced4cf3786eb29e1e4f9b30 1454 | React-jsitracing: 6b3c8c98313642140530f93c46f5a6ca4530b446 1455 | React-logger: fa92ba4d3a5d39ac450f59be2a3cec7b099f0304 1456 | React-Mapbuffer: 9f68550e7c6839d01411ac8896aea5c868eff63a 1457 | react-native-safe-area-context: b7daa1a8df36095a032dff095a1ea8963cb48371 1458 | React-nativeconfig: fa5de9d8f4dbd5917358f8ad3ad1e08762f01dcb 1459 | React-NativeModulesApple: 585d1b78e0597de364d259cb56007052d0bda5e5 1460 | React-perflogger: 7bb9ba49435ff66b666e7966ee10082508a203e8 1461 | React-RCTActionSheet: a2816ae2b5c8523c2bc18a8f874a724a096e6d97 1462 | React-RCTAnimation: e78f52d7422bac13e1213e25e9bcbf99be872e1a 1463 | React-RCTAppDelegate: 24f46de486cfa3a9f46e4b0786eaf17d92e1e0c6 1464 | React-RCTBlob: 9f9d6599d1b00690704dadc4a4bc33a7e76938be 1465 | React-RCTFabric: 609e66bb0371b9082c62ed677ee0614efe711bf2 1466 | React-RCTImage: 39dd5aee6b92213845e1e7a7c41865801dc33493 1467 | React-RCTLinking: 35d742a982f901f9ea416d772763e2da65c2dc7d 1468 | React-RCTNetwork: b078576c0c896c71905f841716b9f9f5922111dc 1469 | React-RCTSettings: 900aab52b5b1212f247c2944d88f4defbf6146f2 1470 | React-RCTText: a3895ab4e5df4a5fd41b6f059eed484a0c7016d1 1471 | React-RCTVibration: ab4912e1427d8de00ef89e9e6582094c4c25dc05 1472 | React-rendererdebug: 542934058708a643fa5743902eb2fedc0833770a 1473 | React-rncore: f6c23d9810c8de9e369781bb7b1d5511e9d9f4e7 1474 | React-RuntimeApple: ce41ba7df744c7a6c2cc490a9b2e15fc58019508 1475 | React-RuntimeCore: 350218ac9ee1412ddc9806f248141c8fb9bccd8b 1476 | React-runtimeexecutor: 69cab8ddf409de6d6a855a71c8af9e7290c4e55b 1477 | React-RuntimeHermes: 9d0812e3370111dd175aa1fa8bd4da93a9efc4fd 1478 | React-runtimescheduler: 0c80752bceb80924cb8a4babc2a8e3ed70d41e87 1479 | React-utils: a06061b3887c702235d2dac92dacbd93e1ea079e 1480 | ReactCommon: f00e436b3925a7ae44dfa294b43ef360fbd8ccc4 1481 | RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8 1482 | RNFlashList: e9b57a5553639f9b528cc50ab53f25831722ed62 1483 | RNScreens: 5aeecbb09aa7285379b6e9f3c8a3c859bb16401c 1484 | SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d 1485 | SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d 1486 | SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d 1487 | Yoga: 88480008ccacea6301ff7bf58726e27a72931c8d 1488 | 1489 | PODFILE CHECKSUM: baf45152e05de6e137288a2c7e40b5979da97295 1490 | 1491 | COCOAPODS: 1.15.2 1492 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | preset: 'react-native', 3 | }; 4 | -------------------------------------------------------------------------------- /metro.config.js: -------------------------------------------------------------------------------- 1 | const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); 2 | 3 | /** 4 | * Metro configuration 5 | * https://reactnative.dev/docs/metro 6 | * 7 | * @type {import('metro-config').MetroConfig} 8 | */ 9 | const config = {}; 10 | 11 | module.exports = mergeConfig(getDefaultConfig(__dirname), config); 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "CleanArc", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "android": "react-native run-android", 7 | "ios": "react-native run-ios", 8 | "lint": "eslint .", 9 | "start": "react-native start", 10 | "test": "jest" 11 | }, 12 | "dependencies": { 13 | "@react-navigation/native": "^6.1.17", 14 | "@react-navigation/native-stack": "^6.10.0", 15 | "@shopify/flash-list": "^1.7.0", 16 | "@tanstack/react-query": "^5.51.1", 17 | "axios": "^1.7.2", 18 | "lodash": "^4.17.21", 19 | "react": "18.2.0", 20 | "react-native": "0.74.3", 21 | "react-native-fast-image": "^8.6.3", 22 | "react-native-safe-area-context": "^4.10.8", 23 | "react-native-screens": "^3.32.0", 24 | "react-query": "^3.39.3" 25 | }, 26 | "devDependencies": { 27 | "@babel/core": "^7.20.0", 28 | "@babel/preset-env": "^7.20.0", 29 | "@babel/runtime": "^7.20.0", 30 | "@react-native/babel-preset": "0.74.85", 31 | "@react-native/eslint-config": "0.74.85", 32 | "@react-native/metro-config": "0.74.85", 33 | "@react-native/typescript-config": "0.74.85", 34 | "@tanstack/eslint-plugin-query": "^5.51.1", 35 | "@types/react": "^18.2.6", 36 | "@types/react-test-renderer": "^18.0.0", 37 | "babel-jest": "^29.6.3", 38 | "eslint": "^8.19.0", 39 | "jest": "^29.6.3", 40 | "prettier": "2.8.8", 41 | "react-test-renderer": "18.2.0", 42 | "typescript": "5.0.4" 43 | }, 44 | "engines": { 45 | "node": ">=18" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/application/models/ICharacterRepository.ts: -------------------------------------------------------------------------------- 1 | import {Character} from '../../domain/entities/Character'; 2 | 3 | export interface ICharacterRepository { 4 | getAllCharacters(page: number): Promise; 5 | } 6 | -------------------------------------------------------------------------------- /src/application/models/IPokemonRepository.ts: -------------------------------------------------------------------------------- 1 | import {Pokemon} from '../../domain/entities/Pokemon'; 2 | 3 | export interface IPokemonRepository { 4 | getAllPokemons(limit: number, offset: number): Promise; 5 | } 6 | -------------------------------------------------------------------------------- /src/application/models/IUserRepository.ts: -------------------------------------------------------------------------------- 1 | import User from '../../domain/entities/User'; 2 | 3 | export interface IUserRepository { 4 | getUsers(): Promise; 5 | getByUserId(userId: number): Promise; 6 | // N data logically 7 | } 8 | -------------------------------------------------------------------------------- /src/application/repositories/CharacterRepository.ts: -------------------------------------------------------------------------------- 1 | import {Character} from '../../domain/entities/Character'; 2 | import {rickAndMortyApiClient} from '../../infrastructure/network/ApiClient'; 3 | import {RickAndMortyResponse} from '../../infrastructure/network/types'; 4 | import {ICharacterRepository} from '../models/ICharacterRepository'; 5 | export class CharacterRepository implements ICharacterRepository { 6 | async getAllCharacters(page: number): Promise { 7 | const data = await rickAndMortyApiClient.get( 8 | 'character', 9 | { 10 | params: {page}, 11 | }, 12 | ); 13 | 14 | return data?.data?.results.map((char: any) => 15 | Character.setCharacterData(char), 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/application/repositories/PokemonRepository.ts: -------------------------------------------------------------------------------- 1 | import {Pokemon} from '../../domain/entities/Pokemon'; 2 | import {pokeApiClient} from '../../infrastructure/network/ApiClient'; 3 | import {IPokemonRepository} from '../models/IPokemonRepository'; 4 | 5 | export class PokemonRepository implements IPokemonRepository { 6 | async getAllPokemons(limit: number, offset: number): Promise { 7 | const response = await pokeApiClient.get('pokemon', { 8 | params: {offset, limit}, 9 | }); 10 | const data = response?.data; 11 | return data?.results?.map(({name, url}: any) => 12 | Pokemon.setPokemonData({ 13 | image: `https://img.pokemondb.net/artwork/${name}.jpg`, 14 | name, 15 | url, 16 | }), 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/application/repositories/UserRepository.ts: -------------------------------------------------------------------------------- 1 | import {User} from '../../domain/entities/User'; 2 | import {UserEntity} from '../../domain/entities/UserEntity'; 3 | import {IUserRepository} from '../models/IUserRepository'; 4 | 5 | export class UserRepository implements IUserRepository { 6 | async getUsers(): Promise { 7 | const response = await fetch('https://jsonplaceholder.typicode.com/users'); 8 | 9 | const data = await response.json(); 10 | 11 | return data.map( 12 | (user: UserEntity) => new User(user.id, user.name, user.email), 13 | ); 14 | } 15 | async getByUserId(userId: number): Promise { 16 | const response = await fetch( 17 | `https://jsonplaceholder.typicode.com/users/${userId}`, 18 | ); 19 | 20 | const data = await response.json(); 21 | 22 | return new User(data.id, data.name, data.email); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/application/services/Pokemon.service.ts: -------------------------------------------------------------------------------- 1 | export const fetchPokemons = async (limit: number, offset: number) => { 2 | const response = await fetch( 3 | `https://pokeapi.co/api/v2/pokemon?limit=${limit}&offset=${offset}`, 4 | ); 5 | return await response.json(); 6 | }; 7 | -------------------------------------------------------------------------------- /src/application/services/RickAndMorty.service copy.ts: -------------------------------------------------------------------------------- 1 | export const fetchCharacters = async (page: number) => { 2 | const response = await fetch( 3 | `https://rickandmortyapi.com/api/character?page=${page}`, 4 | ); 5 | return await response.json(); 6 | }; 7 | -------------------------------------------------------------------------------- /src/domain/entities/Character.ts: -------------------------------------------------------------------------------- 1 | export interface CharacterData { 2 | id: number; 3 | name: string; 4 | status: string; 5 | species: string; 6 | gender: string; 7 | image: string; 8 | } 9 | 10 | export class Character { 11 | constructor( 12 | public id: number, 13 | public name: string, 14 | public status: string, 15 | public species: string, 16 | public gender: string, 17 | public image: string, 18 | ) {} 19 | 20 | static setCharacterData(obj: CharacterData): Character { 21 | return new Character( 22 | obj.id, 23 | obj.name, 24 | obj.status, 25 | obj.species, 26 | obj.gender, 27 | obj.image, 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/domain/entities/Pokemon.ts: -------------------------------------------------------------------------------- 1 | export interface PokemonData { 2 | name: string; 3 | url: string; 4 | image: string; 5 | } 6 | 7 | export class Pokemon { 8 | constructor(public name: string, public url: string, public image: string) {} 9 | 10 | static setPokemonData(obj: PokemonData): Pokemon { 11 | return new Pokemon(obj.name, obj.url, obj.image); 12 | } 13 | } 14 | 15 | // export interface PokemonData { 16 | // name: string; 17 | // url: string; 18 | // image: string; 19 | // } 20 | 21 | // export class Pokemon { 22 | // private readonly data: PokemonData; 23 | 24 | // constructor(data: PokemonData) { 25 | // this.data = data; 26 | // } 27 | 28 | // get name(): string { 29 | // return this.data.name; 30 | // } 31 | 32 | // get url(): string { 33 | // return this.data.url; 34 | // } 35 | 36 | // get image(): string { 37 | // return this.data.image; 38 | // } 39 | // } 40 | -------------------------------------------------------------------------------- /src/domain/entities/User.ts: -------------------------------------------------------------------------------- 1 | // import {useState} from 'react'; 2 | 3 | export class User { 4 | constructor(public id: number, public name: string, public email: string) {} 5 | } 6 | 7 | // interface UserProps { 8 | // initialId: string; 9 | // initialName: string; 10 | // initialEmail: string; 11 | // } 12 | 13 | // const UserFunc = ({initialId, initialName, initialEmail}: UserProps): any => { 14 | // const [id, setId] = useState(initialId); 15 | // const [name, setName] = useState(initialName); 16 | // const [email, setEmail] = useState(initialEmail); 17 | 18 | // return {id, setId, name, setName, email, setEmail}; 19 | // }; 20 | 21 | export default User; 22 | -------------------------------------------------------------------------------- /src/domain/entities/UserEntity.ts: -------------------------------------------------------------------------------- 1 | export interface UserEntity { 2 | id: number; 3 | name: string; 4 | username: string; 5 | email: string; 6 | address: Address; 7 | phone: string; 8 | website: string; 9 | company: Company; 10 | } 11 | 12 | export interface Address { 13 | street: string; 14 | suite: string; 15 | city: string; 16 | zipcode: string; 17 | geo: Geo; 18 | } 19 | 20 | export interface Geo { 21 | lat: string; 22 | lng: string; 23 | } 24 | 25 | export interface Company { 26 | name: string; 27 | catchPhrase: string; 28 | bs: string; 29 | } 30 | -------------------------------------------------------------------------------- /src/domain/usecases/GetCharactersUseCase.ts: -------------------------------------------------------------------------------- 1 | import {ICharacterRepository} from '../../application/models/ICharacterRepository'; 2 | import {Character} from '../entities/Character'; 3 | 4 | export class GetCharactersUseCase { 5 | constructor(private characterRepository: ICharacterRepository) {} 6 | 7 | async execute(page: number): Promise { 8 | return await this.characterRepository.getAllCharacters(page); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/domain/usecases/GetPokemonsUseCase.ts: -------------------------------------------------------------------------------- 1 | import {IPokemonRepository} from '../../application/models/IPokemonRepository'; 2 | import {Pokemon} from '../entities/Pokemon'; 3 | 4 | export class GetPokemonsUseCase { 5 | constructor(private pokemonRepository: IPokemonRepository) {} 6 | 7 | async execute(limit: number, offset: number): Promise { 8 | return await this.pokemonRepository.getAllPokemons(limit, offset); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/domain/usecases/GetUserUseCase.ts: -------------------------------------------------------------------------------- 1 | import {IUserRepository} from '../../application/models/IUserRepository'; 2 | import {User} from '../entities/User'; 3 | 4 | export class GetUserUseCase { 5 | constructor(private userRepository: IUserRepository) {} 6 | 7 | async execute(): Promise { 8 | return await this.userRepository.getUsers(); 9 | } 10 | 11 | async executeById(id: number): Promise { 12 | return await this.userRepository.getByUserId(id); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/infrastructure/hooks/useInfinitiScroll.ts: -------------------------------------------------------------------------------- 1 | import {useInfiniteQuery} from '@tanstack/react-query'; 2 | import {useCallback, useMemo, useState} from 'react'; 3 | import _ from 'lodash'; 4 | import axios from 'axios'; 5 | 6 | type Params = { 7 | key: string; 8 | url: string; 9 | limit?: number; 10 | filters?: F; 11 | }; 12 | 13 | export const useInfiniteScroll = ({ 14 | key, 15 | url, 16 | limit = 10, 17 | filters, 18 | }: Params) => { 19 | const queryKey = [ 20 | key, 21 | ..._.values(_.omitBy(filters || {}, _.isEmpty)), 22 | ].filter(c => Boolean(c) && !_.isEmpty(c)); 23 | 24 | const [isRefreshing, setIsRefreshing] = useState(false); 25 | 26 | const queryFn = async ({pageParam = 1}) => { 27 | const {data} = await axios.get(url, { 28 | params: { 29 | page: pageParam, 30 | limit, 31 | ...filters, 32 | }, 33 | }); 34 | return { 35 | data: data, 36 | nextPage: pageParam + 1, 37 | }; 38 | }; 39 | const {data, hasNextPage, fetchNextPage, isFetchingNextPage, refetch} = 40 | useInfiniteQuery({ 41 | queryKey, 42 | queryFn, 43 | initialPageParam: 1, 44 | getNextPageParam: (lastPage, __, lastPageParam) => { 45 | if (lastPage.data.length < limit) { 46 | return undefined; 47 | } 48 | return lastPageParam + 1; 49 | }, 50 | getPreviousPageParam: (_, __, firstPageParam) => { 51 | if (firstPageParam === 1) { 52 | return undefined; 53 | } 54 | return firstPageParam - 1; 55 | }, 56 | }); 57 | 58 | const loadNext = useCallback(() => { 59 | hasNextPage && fetchNextPage(); 60 | }, [fetchNextPage, hasNextPage]); 61 | 62 | const onRefresh = useCallback(() => { 63 | if (!isRefreshing) { 64 | setIsRefreshing(true); 65 | refetch() 66 | .then(() => setIsRefreshing(false)) 67 | .catch(() => setIsRefreshing(false)); 68 | } 69 | }, [isRefreshing, refetch]); 70 | 71 | const flattenData = useMemo(() => { 72 | return data?.pages.flatMap(page => page.data) || []; 73 | }, [data?.pages]); 74 | 75 | return { 76 | data: flattenData, 77 | onEndReached: loadNext, 78 | isRefreshing, 79 | onRefresh, 80 | isFetchingNextPage, 81 | }; 82 | }; 83 | -------------------------------------------------------------------------------- /src/infrastructure/network/ApiClient.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | // Rick and Morty API Client 4 | const rickAndMortyApiClient = axios.create({ 5 | baseURL: 'https://rickandmortyapi.com/api/', 6 | timeout: 10000, 7 | }); 8 | 9 | rickAndMortyApiClient.interceptors.request.use( 10 | config => { 11 | console.log('Rick and Morty API Request:', config); 12 | return config; 13 | }, 14 | error => { 15 | return Promise.reject(error); 16 | }, 17 | ); 18 | 19 | rickAndMortyApiClient.interceptors.response.use( 20 | response => { 21 | console.log('Rick and Morty API Response:', response?.data); 22 | return response; 23 | }, 24 | error => { 25 | console.error('Rick and Morty API Response Error:', error); 26 | return Promise.reject(error); 27 | }, 28 | ); 29 | 30 | // PokeAPI Client 31 | const pokeApiClient = axios.create({ 32 | baseURL: 'https://pokeapi.co/api/v2/', 33 | timeout: 10000, 34 | }); 35 | 36 | pokeApiClient.interceptors.request.use( 37 | config => { 38 | console.log('PokeAPI Request:', config); 39 | return config; 40 | }, 41 | error => { 42 | return Promise.reject(error); 43 | }, 44 | ); 45 | 46 | pokeApiClient.interceptors.response.use( 47 | response => { 48 | console.log('PokeAPI Response:', response?.data); 49 | return response; 50 | }, 51 | error => { 52 | console.error('PokeAPI Response Error:', error); 53 | return Promise.reject(error); 54 | }, 55 | ); 56 | 57 | export {rickAndMortyApiClient, pokeApiClient}; 58 | -------------------------------------------------------------------------------- /src/infrastructure/network/axiosInterceptor.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fturkyilmaz/react-native-clean-architecture-mvvm-react-query--infinite-scroll/090c7a079f94cc05b42d23c62273366cf58e4162/src/infrastructure/network/axiosInterceptor.ts -------------------------------------------------------------------------------- /src/infrastructure/network/types/index.ts: -------------------------------------------------------------------------------- 1 | export interface PokeApiResponse { 2 | count: number; 3 | next: string; 4 | previous: string; 5 | results: PokeApiResult[]; 6 | } 7 | 8 | export interface PokeApiResult { 9 | name: string; 10 | url: string; 11 | } 12 | 13 | export interface RickAndMortyResponse { 14 | info: Info; 15 | results: RickAndMortyResult[]; 16 | } 17 | 18 | export interface Info { 19 | count: number; 20 | pages: number; 21 | next: string; 22 | prev: any; 23 | } 24 | 25 | export interface RickAndMortyResult { 26 | id: number; 27 | name: string; 28 | status: string; 29 | species: string; 30 | type: string; 31 | gender: string; 32 | origin: Origin; 33 | location: Location; 34 | image: string; 35 | episode: string[]; 36 | url: string; 37 | created: string; 38 | } 39 | 40 | export interface Origin { 41 | name: string; 42 | url: string; 43 | } 44 | 45 | export interface Location { 46 | name: string; 47 | url: string; 48 | } 49 | -------------------------------------------------------------------------------- /src/infrastructure/reactQuery/QueryProvider.tsx: -------------------------------------------------------------------------------- 1 | // QueryProvider.tsx 2 | 3 | import {PropsWithChildren} from 'react'; 4 | import {QueryClient, QueryClientProvider} from '@tanstack/react-query'; 5 | import React from 'react'; 6 | 7 | // Instantiate a new QueryClient 8 | const queryClient = new QueryClient({ 9 | defaultOptions: { 10 | queries: { 11 | staleTime: 300000, // 5 minutes 12 | retry: 2, 13 | refetchOnWindowFocus: true, 14 | }, 15 | }, 16 | }); 17 | 18 | // Export the QueryClientProvider with our instantiated queryClient 19 | export const QueryProvider = ({children}: PropsWithChildren) => { 20 | return ( 21 | 22 | {children} 23 | 24 | ); 25 | }; 26 | -------------------------------------------------------------------------------- /src/presentation/pages/CharacterScreen.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | View, 3 | Text, 4 | FlatList, 5 | ActivityIndicator, 6 | Image, 7 | StyleSheet, 8 | } from 'react-native'; 9 | import React from 'react'; 10 | import useCharacterViewModel from '../viewModels/CharacterViewModel'; 11 | import {Character} from '../../domain/entities/Character'; 12 | 13 | const CharacterScreen: React.FC = () => { 14 | const { 15 | characters, 16 | error, 17 | isFetching, 18 | isFetchingNextPage, 19 | fetchNextPage, 20 | hasNextPage, 21 | } = useCharacterViewModel(); 22 | 23 | if (isFetching && !isFetchingNextPage) { 24 | return ; 25 | } 26 | 27 | if (error) { 28 | return Bir hata oluştu; 29 | } 30 | 31 | return ( 32 | 33 | 34 | data={characters} 35 | keyExtractor={item => item.id.toString()} 36 | renderItem={({item}) => ( 37 | 38 | 43 | 44 | {item.name} 45 | 46 | {item.species} - {item.status} 47 | 48 | 49 | 50 | )} 51 | onEndReached={() => { 52 | if (hasNextPage) { 53 | fetchNextPage(); 54 | } 55 | }} 56 | onEndReachedThreshold={0.8} 57 | ListFooterComponent={ 58 | isFetchingNextPage ? : null 59 | } 60 | /> 61 | 62 | ); 63 | }; 64 | 65 | const styles = StyleSheet.create({ 66 | container: {flex: 1, padding: 20, backgroundColor: '#fff'}, 67 | cardContainer: { 68 | padding: 10, 69 | borderBottomWidth: 1, 70 | borderBottomColor: '#ccc', 71 | flexDirection: 'row', 72 | alignItems: 'center', 73 | }, 74 | image: {width: 100, height: 100, marginRight: 10}, 75 | title: {fontSize: 20, fontWeight: '800', color: '#000'}, 76 | description: {fontSize: 14, fontWeight: '400', color: '#000'}, 77 | textContainer: {gap: 5}, 78 | }); 79 | 80 | export default CharacterScreen; 81 | -------------------------------------------------------------------------------- /src/presentation/pages/PokemonScreen.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | View, 3 | Text, 4 | ActivityIndicator, 5 | StyleSheet, 6 | RefreshControl, 7 | } from 'react-native'; 8 | import React from 'react'; 9 | import usePokemonViewModel from '../viewModels/PokemonViewModel'; 10 | import {Pokemon} from '../../domain/entities/Pokemon'; 11 | import FastImage from 'react-native-fast-image'; 12 | import {FlashList} from '@shopify/flash-list'; 13 | const PokemonScreen: React.FC = () => { 14 | const { 15 | pokemons, 16 | error, 17 | isFetching, 18 | isFetchingNextPage, 19 | fetchNextPage, 20 | hasNextPage, 21 | isRefreshing, 22 | onRefresh, 23 | } = usePokemonViewModel(); 24 | 25 | if (isFetching && !isFetchingNextPage) { 26 | return ; 27 | } 28 | 29 | if (error) { 30 | return Bir hata oluştu; 31 | } 32 | 33 | return ( 34 | 35 | 36 | estimatedItemSize={10} 37 | data={pokemons} 38 | refreshControl={ 39 | 40 | } 41 | keyExtractor={item => item.name} 42 | renderItem={({item}) => ( 43 | 44 | 52 | 53 | 54 | 55 | {item.name} 56 | 57 | 58 | 59 | )} 60 | onEndReached={() => { 61 | if (hasNextPage) { 62 | fetchNextPage(); 63 | } 64 | }} 65 | removeClippedSubviews={true} 66 | onEndReachedThreshold={0.8} 67 | ListEmptyComponent={ 68 | 69 | Empty Data 70 | 71 | } 72 | ListFooterComponent={ 73 | isFetchingNextPage ? : null 74 | } 75 | /> 76 | 77 | ); 78 | }; 79 | 80 | const styles = StyleSheet.create({ 81 | container: {flex: 1, padding: 20}, 82 | listEmptyComponent: {}, 83 | cardContainer: { 84 | padding: 10, 85 | borderBottomWidth: 1, 86 | borderBottomColor: '#ccc', 87 | flexDirection: 'row', 88 | alignItems: 'center', 89 | }, 90 | image: {width: 100, height: 100, marginRight: 10}, 91 | title: { 92 | color: 'black', 93 | fontSize: 20, 94 | fontWeight: '800', 95 | textTransform: 'capitalize', 96 | }, 97 | textContainer: {gap: 5}, 98 | }); 99 | 100 | export default PokemonScreen; 101 | -------------------------------------------------------------------------------- /src/presentation/pages/UserDetailScreen.tsx: -------------------------------------------------------------------------------- 1 | import {View, Text, SafeAreaView} from 'react-native'; 2 | import React from 'react'; 3 | import {useRoute} from '@react-navigation/native'; 4 | import useUserViewModel from '../viewModels/UserViewModel'; 5 | import {RootRouteProps} from '../../../App'; 6 | 7 | export default function UserDetailScreen() { 8 | const {id} = useRoute>()?.params; 9 | 10 | const {user} = useUserViewModel(id); 11 | 12 | return ( 13 | 14 | 15 | 16 | {user?.id} : {user?.name} {user?.email} 17 | 18 | 19 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /src/presentation/pages/UserScreen.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | View, 3 | Text, 4 | SafeAreaView, 5 | ActivityIndicator, 6 | FlatList, 7 | Button, 8 | } from 'react-native'; 9 | import React from 'react'; 10 | import useUsersViewModel from '../viewModels/UsersViewModel'; 11 | import {useNavigation} from '@react-navigation/native'; 12 | import {NativeStackNavigationProp} from '@react-navigation/native-stack'; 13 | import {AppStackParams} from '../../../App'; 14 | 15 | export default function UserScreen() { 16 | const {users, loading} = useUsersViewModel(); 17 | 18 | const navigation = useNavigation>(); 19 | 20 | const goToNavigate = (id: number) => { 21 | navigation.navigate('UserDetail', {id}); 22 | }; 23 | 24 | return ( 25 | 26 | {loading ? ( 27 | 28 | ) : ( 29 | item?.id.toString()} 32 | renderItem={({item}) => ( 33 | 40 | {item?.name} 41 | {item?.email} 42 | 43 |