├── .ruby-version ├── .watchmanconfig ├── src ├── components │ ├── layout │ │ ├── index.ts │ │ └── layout.tsx │ ├── animated │ │ ├── index.ts │ │ └── AnimatedText.tsx │ ├── buttons │ │ ├── index.ts │ │ └── BackButton.tsx │ └── index.ts ├── navigation │ ├── index.ts │ ├── routes.ts │ ├── screen-list.ts │ └── RootNavigator.tsx ├── screens │ ├── home-screen │ │ ├── index.ts │ │ ├── components │ │ │ └── ScreenListItem.tsx │ │ └── HomeScreen.tsx │ ├── apple-wallet-screen │ │ ├── index.ts │ │ ├── assets │ │ │ ├── images │ │ │ │ ├── card1.png │ │ │ │ ├── card2.png │ │ │ │ ├── card3.png │ │ │ │ ├── card4.png │ │ │ │ ├── card5.png │ │ │ │ ├── card6.jpg │ │ │ │ ├── card6.png │ │ │ │ ├── card7.png │ │ │ │ └── qr-code.png │ │ │ ├── theme.ts │ │ │ ├── types.ts │ │ │ └── config.ts │ │ ├── README.md │ │ ├── components │ │ │ ├── SwipeGesture.tsx │ │ │ └── Card.tsx │ │ └── AppleWalletScreen.tsx │ ├── contact-list-screen │ │ ├── index.ts │ │ ├── assets │ │ │ ├── avatars │ │ │ │ ├── owner.jpg │ │ │ │ ├── avatar1.jpg │ │ │ │ ├── avatar2.jpg │ │ │ │ └── avatar3.jpg │ │ │ ├── list-config.ts │ │ │ ├── text-utils.ts │ │ │ ├── theme.ts │ │ │ ├── tab-config.ts │ │ │ └── contacts.ts │ │ ├── README.md │ │ ├── components │ │ │ ├── ContactHeader.tsx │ │ │ ├── SlideContainer.tsx │ │ │ ├── TopBar.tsx │ │ │ ├── types.ts │ │ │ ├── FavoriteList.tsx │ │ │ ├── FavoriteItem.tsx │ │ │ ├── ContactItem.tsx │ │ │ ├── AnimatedTab.tsx │ │ │ ├── RecentList.tsx │ │ │ ├── ContactList.tsx │ │ │ └── Header.tsx │ │ └── ContactListScreen.tsx │ └── adjustment-wheel-screen │ │ ├── index.ts │ │ ├── README.md │ │ ├── assets │ │ ├── theme.ts │ │ ├── utils.ts │ │ └── config.ts │ │ ├── components │ │ ├── types.ts │ │ ├── Mark.tsx │ │ ├── Interval.tsx │ │ ├── IntervalAndroid.tsx │ │ ├── Picker.tsx │ │ ├── Picker.android.tsx │ │ ├── WheelAndroid.tsx │ │ └── Wheel.tsx │ │ └── AdjustmentWheelScreen.tsx ├── assets │ ├── images │ │ └── gradient.png │ ├── fonts │ │ └── Monda-Regular.ttf │ └── globalTheme.ts ├── constants │ ├── misc.ts │ └── metrics.ts ├── utils │ └── console.ts └── App.tsx ├── .env ├── app.json ├── .bundle └── config ├── android ├── app │ ├── debug.keystore │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── values │ │ │ │ │ ├── strings.xml │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ └── styles.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ ├── ic_launcher.xml │ │ │ │ │ └── ic_launcher_round.xml │ │ │ │ └── drawable │ │ │ │ │ └── rn_edit_text_material.xml │ │ │ ├── assets │ │ │ │ └── fonts │ │ │ │ │ ├── Ionicons.ttf │ │ │ │ │ └── Monda-Regular.ttf │ │ │ ├── ic_launcher-playstore.png │ │ │ ├── java │ │ │ │ └── com │ │ │ │ │ └── rnui │ │ │ │ │ ├── MainActivity.java │ │ │ │ │ └── MainApplication.java │ │ │ └── AndroidManifest.xml │ │ └── debug │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── com │ │ │ └── rnui │ │ │ └── ReactNativeFlipper.java │ ├── proguard-rules.pro │ ├── build_defs.bzl │ ├── _BUCK │ └── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── settings.gradle ├── gradle.properties ├── build.gradle ├── gradlew.bat └── gradlew ├── ios ├── Resources │ └── Ionicons.ttf ├── rnui │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── Splash.imageset │ │ │ ├── splash.png │ │ │ ├── splash 1.png │ │ │ ├── splash 2.png │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── App_store_1024_1x.png │ │ │ ├── iPhone_App_60_2x.png │ │ │ ├── iPhone_App_60_3x.png │ │ │ ├── iPhone_Settings_29_2x.png │ │ │ ├── iPhone_Settings_29_3x.png │ │ │ ├── iPhone_Spotlight_40_2x.png │ │ │ ├── iPhone_Spotlight_40_3x.png │ │ │ ├── iPhone_Notifications_20_2x.png │ │ │ ├── iPhone_Notifications_20_3x.png │ │ │ └── Contents.json │ ├── AppDelegate.h │ ├── main.m │ ├── Info.plist │ └── AppDelegate.m ├── rnui.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── rnuiTests │ ├── Info.plist │ └── rnuiTests.m ├── Podfile ├── LaunchScreen.storyboard ├── rnui.xcodeproj │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── rnui.xcscheme │ └── project.pbxproj └── Podfile.lock ├── .buckconfig ├── .prettierrc.js ├── Gemfile ├── index.js ├── __tests__ └── App-test.tsx ├── metro.config.js ├── .eslintrc.js ├── README.md ├── patches └── @react-native-masked-view+masked-view+0.2.8.patch ├── tsconfig.json ├── babel.config.js ├── .gitignore ├── package.json └── Gemfile.lock /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.7.4 -------------------------------------------------------------------------------- /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /src/components/layout/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./layout"; 2 | -------------------------------------------------------------------------------- /src/navigation/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./RootNavigator"; 2 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | SIZE_MATTERS_BASE_WIDTH=390 2 | SIZE_MATTERS_BASE_HEIGHT=844 -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rnui", 3 | "displayName": "rnui" 4 | } -------------------------------------------------------------------------------- /src/components/animated/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./AnimatedText"; 2 | -------------------------------------------------------------------------------- /src/components/buttons/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./BackButton"; 2 | -------------------------------------------------------------------------------- /.bundle/config: -------------------------------------------------------------------------------- 1 | BUNDLE_PATH: "vendor/bundle" 2 | BUNDLE_FORCE_RUBY_PLATFORM: 1 -------------------------------------------------------------------------------- /src/screens/home-screen/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./HomeScreen"; 2 | -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./AppleWalletScreen"; 2 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./ContactListScreen"; 2 | -------------------------------------------------------------------------------- /android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/debug.keystore -------------------------------------------------------------------------------- /ios/Resources/Ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/Resources/Ionicons.ttf -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/index.ts: -------------------------------------------------------------------------------- 1 | export { default } from "./AdjustmentWheelScreen"; 2 | -------------------------------------------------------------------------------- /src/assets/images/gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/assets/images/gradient.png -------------------------------------------------------------------------------- /src/constants/misc.ts: -------------------------------------------------------------------------------- 1 | export const CONSOLE_COLORS = { 2 | GREEN: "\x1b[32m", 3 | OFF: "\x1b[0m", 4 | }; 5 | -------------------------------------------------------------------------------- /src/assets/fonts/Monda-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/assets/fonts/Monda-Regular.ttf -------------------------------------------------------------------------------- /src/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./animated"; 2 | export * from "./buttons"; 3 | export * from "./layout"; 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | rnui 3 | 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/src/main/assets/fonts/Ionicons.ttf -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/Monda-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/src/main/assets/fonts/Monda-Regular.ttf -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/Splash.imageset/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/Splash.imageset/splash.png -------------------------------------------------------------------------------- /.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/Splash.imageset/splash 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/Splash.imageset/splash 1.png -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/Splash.imageset/splash 2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/Splash.imageset/splash 2.png -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/card1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/card1.png -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/card2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/card2.png -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/card3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/card3.png -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/card4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/card4.png -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/card5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/card5.png -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/card6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/card6.jpg -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/card6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/card6.png -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/card7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/card7.png -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/avatars/owner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/contact-list-screen/assets/avatars/owner.jpg -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/images/qr-code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/apple-wallet-screen/assets/images/qr-code.png -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/avatars/avatar1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/contact-list-screen/assets/avatars/avatar1.jpg -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/avatars/avatar2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/contact-list-screen/assets/avatars/avatar2.jpg -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/avatars/avatar3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/src/screens/contact-list-screen/assets/avatars/avatar3.jpg -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/App_store_1024_1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/App_store_1024_1x.png -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_App_60_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_App_60_2x.png -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_App_60_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_App_60_3x.png -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | bracketSpacing: true, 3 | jsxBracketSameLine: true, 4 | singleQuote: false, 5 | trailingComma: 'all', 6 | arrowParens: 'avoid', 7 | }; 8 | -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Settings_29_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Settings_29_2x.png -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Settings_29_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Settings_29_3x.png -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Spotlight_40_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Spotlight_40_2x.png -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Spotlight_40_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Spotlight_40_3x.png -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version 3 | ruby '2.7.4' 4 | gem 'cocoapods', '~> 1.11', '>= 1.11.2' 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Notifications_20_2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Notifications_20_2x.png -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Notifications_20_3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mxm87/rnui/HEAD/ios/rnui/Images.xcassets/AppIcon.appiconset/iPhone_Notifications_20_3x.png -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/theme.ts: -------------------------------------------------------------------------------- 1 | export const theme = { 2 | colors: { 3 | white: "#FFFFFF", 4 | background: "#181B21", 5 | border: "rgba(0,0,0,0.16)", 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'rnui' 2 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) 3 | include ':app' 4 | -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/README.md: -------------------------------------------------------------------------------- 1 | **Apple Wallet style interactions w/ Reanimated 2** 2 | 3 | ![AppleWallet](https://user-images.githubusercontent.com/47810008/219683173-15218d17-9ecf-4295-992e-597398116582.gif) 4 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/README.md: -------------------------------------------------------------------------------- 1 | **Adjustment Wheel w/ Reanimated and FlashList** 2 | 3 | ![AdjustmentWheel](https://user-images.githubusercontent.com/47810008/214886312-dfae80d2-eb34-4ff4-8434-87d316e4fdf8.gif) 4 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import 'react-native-gesture-handler'; 2 | import {AppRegistry} from 'react-native'; 3 | import App from './src/App'; 4 | import {name as appName} from './app.json'; 5 | 6 | AppRegistry.registerComponent(appName, () => App); 7 | -------------------------------------------------------------------------------- /ios/rnui/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : UIResponder 5 | 6 | @property (nonatomic, strong) UIWindow *window; 7 | 8 | @end 9 | -------------------------------------------------------------------------------- /ios/rnui/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char * argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/list-config.ts: -------------------------------------------------------------------------------- 1 | import { mvs, s } from "react-native-size-matters/extend"; 2 | 3 | export const HEADER_HEIGHT_BASE = mvs(80); 4 | export const HEADER_HEIGHT_EXT = mvs(200); 5 | export const HEADER_TITLE_WIDTH = s(240); 6 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/assets/theme.ts: -------------------------------------------------------------------------------- 1 | export const theme = { 2 | colors: { 3 | white: "#EAEAEA", 4 | offWhite: "#E5E5E7", 5 | black: "#151D2B", 6 | background: "#181B21", 7 | blue: "#5B81F5", 8 | brightBlue: "#3377FF", 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /src/navigation/routes.ts: -------------------------------------------------------------------------------- 1 | const Routes = { 2 | Home: "Home", 3 | ContactList: "ContactList", 4 | AdjustmentWheel: "AdjustmentWheel", 5 | AppleWallet: "AppleWallet", 6 | }; 7 | 8 | export type RoutesT = keyof typeof Routes; 9 | 10 | export default Routes; 11 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/README.md: -------------------------------------------------------------------------------- 1 | **Contact List interactions w/ vanilla Animated API** 2 | 3 | ![contactlist](https://user-images.githubusercontent.com/47810008/213226808-857ef963-a7a2-46e6-8e21-e175644a0d1b.gif) 4 | 5 | Based on: 6 | https://dribbble.com/shots/16413223-Android-Phone-App-Concept 7 | -------------------------------------------------------------------------------- /ios/rnui.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/globalTheme.ts: -------------------------------------------------------------------------------- 1 | export const globalTheme = { 2 | colors: { 3 | white: "#FFFFFF", 4 | black: "#000000", 5 | gray: "#666972", 6 | lightGray: "#C5C5C7", 7 | darkGray: "#424242", 8 | transBlack: "rgba(0,0,0,0.8)", 9 | transWhite: "rgba(255,255,255,0.5)", 10 | }, 11 | }; 12 | -------------------------------------------------------------------------------- /ios/rnui.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /__tests__/App-test.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * @format 3 | */ 4 | 5 | import 'react-native'; 6 | import React from 'react'; 7 | import App from '../src/App'; 8 | 9 | // Note: test renderer must be required after react-native. 10 | import renderer from 'react-test-renderer'; 11 | 12 | it('renders correctly', () => { 13 | renderer.create(); 14 | }); 15 | -------------------------------------------------------------------------------- /metro.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Metro configuration for React Native 3 | * https://github.com/facebook/react-native 4 | * 5 | * @format 6 | */ 7 | 8 | module.exports = { 9 | transformer: { 10 | getTransformOptions: async () => ({ 11 | transform: { 12 | experimentalImportSupport: false, 13 | inlineRequires: true, 14 | }, 15 | }), 16 | }, 17 | }; 18 | -------------------------------------------------------------------------------- /src/constants/metrics.ts: -------------------------------------------------------------------------------- 1 | import { Dimensions, Platform } from "react-native"; 2 | 3 | const { width, height } = Dimensions.get("window"); 4 | const isIOS = Platform.OS === "ios"; 5 | const screenWidth = width < height ? width : height; 6 | const screenHeight = width < height ? height : width; 7 | 8 | export const metrics = { 9 | screenWidth, 10 | screenHeight, 11 | isIOS, 12 | }; 13 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: '@react-native-community', 4 | parser: '@typescript-eslint/parser', 5 | plugins: ['@typescript-eslint'], 6 | overrides: [ 7 | { 8 | files: ['*.ts', '*.tsx'], 9 | rules: { 10 | '@typescript-eslint/no-shadow': ['error'], 11 | 'no-shadow': 'off', 12 | 'no-undef': 'off', 13 | }, 14 | }, 15 | ], 16 | }; 17 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/rnui/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.rnui; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. This is used to schedule 9 | * rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "rnui"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/navigation/screen-list.ts: -------------------------------------------------------------------------------- 1 | import Routes, { RoutesT } from "./routes"; 2 | 3 | export type ScreenListItemT = { 4 | title: string; 5 | destination: RoutesT; 6 | }; 7 | 8 | export const SCREEN_LIST: ScreenListItemT[] = [ 9 | { title: "📱 Contact List", destination: Routes.ContactList }, 10 | { title: "⚙️ Adjustment Wheel", destination: Routes.AdjustmentWheel }, 11 | { title: "🍏 Apple Wallet", destination: Routes.AppleWallet }, 12 | ]; 13 | -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/Splash.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "splash 2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "splash 1.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "splash.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/console.ts: -------------------------------------------------------------------------------- 1 | import { RenderPassReport } from "@shopify/react-native-performance"; 2 | import { CONSOLE_COLORS } from "@constants/misc"; 3 | 4 | export function printRenderReportConsole(report: RenderPassReport) { 5 | if (report.interactive) { 6 | console.log( 7 | `🚀 ~ ${process.env.NODE_ENV?.toUpperCase()} MODE: ${ 8 | report.destinationScreen 9 | } rendered in ${CONSOLE_COLORS.GREEN} ${report.timeToRenderMillis.toFixed( 10 | 2, 11 | )} ms ${CONSOLE_COLORS.OFF}`, 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/text-utils.ts: -------------------------------------------------------------------------------- 1 | export function getFullName(firstName: string, lastName: string | undefined) { 2 | return `${firstName} ${lastName ?? ""}`; 3 | } 4 | 5 | export function getInitials(firstName: string, lastName: string | undefined) { 6 | if (lastName) { 7 | return `${firstName[0].toUpperCase()}${lastName[0].toLowerCase()}`; 8 | } else { 9 | return `${firstName[0].toUpperCase()}${firstName[1].toLowerCase()}`; 10 | } 11 | } 12 | 13 | export function formatPhoneNumber(phoneNumber: string) { 14 | return phoneNumber.replace(/(\d{3})(\d{3})(\d{3})/, "$1 $2 $3"); 15 | } 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **This project is dedicated to exploring what's possible in React Native UI/UX** 2 | 3 | What's currently inside: 4 | 5 | - Apple Wallet style interactions 6 | 7 | ![AppleWallet](https://user-images.githubusercontent.com/47810008/219685054-a8efd14a-3678-4882-b03e-21c1f9b06b7a.gif) 8 | 9 | 10 | - Adjustment Wheel 11 | 12 | ![AdjustmentWheel](https://user-images.githubusercontent.com/47810008/219686155-bd7a7b34-7ffa-4b0a-bc55-95ed45f57097.gif) 13 | 14 | 15 | - Contact List interactions 16 | 17 | ![contactlist](https://user-images.githubusercontent.com/47810008/219685871-5e6e69e4-f694-4d8a-8e2b-daf3c6da6928.gif) 18 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/theme.ts: -------------------------------------------------------------------------------- 1 | export const theme = { 2 | colors: { 3 | white: "#FFFFFF", 4 | offWhite: "#EEEEEE", 5 | black: "#151D2B", 6 | background: "#252836", 7 | gray: "#666972", 8 | lightGray: "#A1A5AA", 9 | blueGray: "#9C9DA9", 10 | green: "#3E8B6F", 11 | greenBlueLight: "#3784C5", 12 | greenBlueMidDark: "#355270", 13 | greenBlueDark: "#344D6B", 14 | blueLight: "#5386E4", 15 | blueMid: "#4062BB", 16 | blueMidDark: "#3A58A8", 17 | blueDark: "#3B518C", 18 | azure: "#3782ED", 19 | yellow: "#E59935", 20 | orange: "#EB5D3C", 21 | red: "#F02B19", 22 | }, 23 | }; 24 | -------------------------------------------------------------------------------- /android/app/build_defs.bzl: -------------------------------------------------------------------------------- 1 | """Helper definitions to glob .aar and .jar targets""" 2 | 3 | def create_aar_targets(aarfiles): 4 | for aarfile in aarfiles: 5 | name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] 6 | lib_deps.append(":" + name) 7 | android_prebuilt_aar( 8 | name = name, 9 | aar = aarfile, 10 | ) 11 | 12 | def create_jar_targets(jarfiles): 13 | for jarfile in jarfiles: 14 | name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] 15 | lib_deps.append(":" + name) 16 | prebuilt_jar( 17 | name = name, 18 | binary_jar = jarfile, 19 | ) 20 | -------------------------------------------------------------------------------- /patches/@react-native-masked-view+masked-view+0.2.8.patch: -------------------------------------------------------------------------------- 1 | diff --git a/node_modules/@react-native-masked-view/masked-view/js/MaskedView.js b/node_modules/@react-native-masked-view/masked-view/js/MaskedView.js 2 | index b336b7a..57167e3 100644 3 | --- a/node_modules/@react-native-masked-view/masked-view/js/MaskedView.js 4 | +++ b/node_modules/@react-native-masked-view/masked-view/js/MaskedView.js 5 | @@ -71,7 +71,7 @@ export default class MaskedView extends React.Component { 6 | 7 | return ( 8 | 9 | - 10 | + 11 | {maskElement} 12 | 13 | {children} 14 | -------------------------------------------------------------------------------- /ios/rnuiTests/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 | -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/types.ts: -------------------------------------------------------------------------------- 1 | import { SharedValue } from "react-native-reanimated"; 2 | 3 | type Field = { 4 | label: string; 5 | value: string; 6 | }; 7 | 8 | export type CardContentProps = { 9 | title: string; 10 | headerField: Field; 11 | auxiliaryField: Field; 12 | secondaryField: Field; 13 | tertiaryField: Field; 14 | image: any; 15 | bg: string; 16 | }; 17 | 18 | export type CardProps = { 19 | item: CardContentProps; 20 | index: number; 21 | selectedCard: SharedValue; 22 | scrollY: SharedValue; 23 | swipeY: SharedValue; 24 | inTransition: SharedValue; 25 | }; 26 | 27 | export type SwipeGestureProps = { 28 | children: React.ReactNode; 29 | selectedCard: SharedValue; 30 | swipeY: SharedValue; 31 | inTransition: SharedValue; 32 | }; 33 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/ContactHeader.tsx: -------------------------------------------------------------------------------- 1 | import { StyleSheet, Text, View } from "react-native"; 2 | import { mvs, s } from "react-native-size-matters/extend"; 3 | import { theme } from "../assets/theme"; 4 | import { ContactHeaderProps } from "./types"; 5 | 6 | const ContactHeader = ({ item }: ContactHeaderProps) => { 7 | return ( 8 | 9 | {item} 10 | 11 | ); 12 | }; 13 | 14 | const styles = StyleSheet.create({ 15 | section: { 16 | height: s(56), 17 | paddingLeft: s(14), 18 | justifyContent: "center", 19 | backgroundColor: theme.colors.background, 20 | }, 21 | sectionTitle: { 22 | fontSize: mvs(16), 23 | fontWeight: "600", 24 | color: theme.colors.offWhite, 25 | }, 26 | }); 27 | 28 | export default ContactHeader; 29 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/SlideContainer.tsx: -------------------------------------------------------------------------------- 1 | import { metrics } from "@constants/metrics"; 2 | import { Animated, StyleSheet } from "react-native"; 3 | import { SlideContainerProps } from "./types"; 4 | 5 | const SlideContainer = ({ item, index, progress }: SlideContainerProps) => { 6 | const RenderComponent = item.component; 7 | const opacity = progress.interpolate({ 8 | inputRange: [index - 1, index - 0.75, index, index + 0.75, index + 1], 9 | outputRange: [0, 1, 1, 1, 0], 10 | }); 11 | 12 | return ( 13 | 14 | 15 | 16 | ); 17 | }; 18 | 19 | const styles = StyleSheet.create({ 20 | container: { 21 | width: metrics.screenWidth, 22 | flexGrow: 1, 23 | }, 24 | }); 25 | 26 | export default SlideContainer; 27 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | require_relative '../node_modules/react-native/scripts/react_native_pods' 2 | require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' 3 | 4 | platform :ios, '11.0' 5 | 6 | target 'rnui' do 7 | config = use_native_modules! 8 | 9 | use_react_native!( 10 | :path => config[:reactNativePath], 11 | # to enable hermes on iOS, change `false` to `true` and then install pods 12 | :hermes_enabled => false 13 | ) 14 | 15 | target 'rnuiTests' do 16 | inherit! :complete 17 | # Pods for testing 18 | end 19 | 20 | # Enables Flipper. 21 | # 22 | # Note that if you have use_frameworks! enabled, Flipper will not work and 23 | # you should disable the next line. 24 | use_flipper!() 25 | 26 | post_install do |installer| 27 | react_native_post_install(installer) 28 | __apply_Xcode_12_5_M1_post_install_workaround(installer) 29 | end 30 | end -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/components/types.ts: -------------------------------------------------------------------------------- 1 | import { Animated } from "react-native"; 2 | import { SharedValue } from "react-native-reanimated"; 3 | 4 | export type WheelItem = { 5 | value: number; 6 | label: string; 7 | }; 8 | 9 | export type MarkProps = { 10 | item: WheelItem; 11 | width: number; 12 | color: string; 13 | }; 14 | 15 | type ProgressT = { 16 | progress: SharedValue; 17 | }; 18 | 19 | type IndexNodeT = { 20 | currentIndexNode: Animated.AnimatedDivision; 21 | }; 22 | 23 | export type IntervalProps = ProgressT & { 24 | item: WheelItem; 25 | index: number; 26 | }; 27 | 28 | export type IntervalAndroidProps = IndexNodeT & { 29 | item: WheelItem; 30 | index: number; 31 | }; 32 | 33 | export type WheelAndroidProps = IndexNodeT & { 34 | scrollX: Animated.Value; 35 | }; 36 | 37 | export type WheelProps = ProgressT & { 38 | scrollX: SharedValue; 39 | }; 40 | -------------------------------------------------------------------------------- /src/components/layout/layout.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | Edge, 3 | SafeAreaView, 4 | SafeAreaViewProps, 5 | } from "react-native-safe-area-context"; 6 | import { View, ViewProps } from "react-native"; 7 | 8 | export const Flex = ({ children, style, ...rest }: ViewProps) => ( 9 | 10 | {children} 11 | 12 | ); 13 | 14 | export const SafeFlex = ({ 15 | children, 16 | style, 17 | top, 18 | bottom, 19 | ...rest 20 | }: SafeAreaViewProps & { top?: boolean; bottom?: boolean }) => ( 21 | 25 | {children} 26 | 27 | ); 28 | 29 | export const HStack = ({ children, style, ...rest }: ViewProps) => ( 30 | 31 | {children} 32 | 33 | ); 34 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "lib": ["ES2019"], 5 | "allowJs": false, 6 | "jsx": "react-native", 7 | "removeComments": true, 8 | "noEmit": true, 9 | "isolatedModules": true, 10 | 11 | "strict": true, 12 | "noUnusedLocals": true, 13 | "noImplicitReturns": true, 14 | 15 | "moduleResolution": "node", 16 | "allowSyntheticDefaultImports": true, 17 | "esModuleInterop": true, 18 | "skipLibCheck": true, 19 | "resolveJsonModule": true, 20 | 21 | "baseUrl": "./", 22 | "paths": { 23 | "@assets/*": ["src/assets/*"], 24 | "@components/*": ["src/components/*"], 25 | "@constants/*": ["src/constants/*"], 26 | "@navigation/*": ["src/navigation/*"], 27 | "@screens/*": ["src/screens/*"], 28 | "@services/*": ["src/services/*"], 29 | "@styles/*": ["src/styles/*"], 30 | "@utils/*": ["src/utils/*"] 31 | } 32 | }, 33 | "exclude": ["node_modules", "babel.config.js", "metro.config.js"] 34 | } 35 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ["module:metro-react-native-babel-preset"], 3 | env: { 4 | development: {}, 5 | production: { 6 | plugins: ["transform-remove-console"], 7 | }, 8 | }, 9 | plugins: [ 10 | ["module:react-native-dotenv"], 11 | [ 12 | "@babel/plugin-transform-react-jsx", 13 | { 14 | runtime: "automatic", 15 | }, 16 | ], 17 | [ 18 | "module-resolver", 19 | { 20 | root: ["."], 21 | extensions: [".ios.js", ".android.js", ".js", ".ts", ".tsx", ".json"], 22 | alias: { 23 | "@assets": "./src/assets", 24 | "@components": "./src/components", 25 | "@constants": "./src/constants", 26 | "@navigation": "./src/navigation", 27 | "@screens": "./src/screens", 28 | "@services": "./src/services", 29 | "@styles": "./src/styles", 30 | "@utils": "./src/utils", 31 | }, 32 | }, 33 | ], 34 | ["react-native-reanimated/plugin"], 35 | ], 36 | }; 37 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/tab-config.ts: -------------------------------------------------------------------------------- 1 | import FavoriteList from "../components/FavoriteList"; 2 | import ContactList from "../components/ContactList"; 3 | import { s } from "react-native-size-matters/extend"; 4 | import { metrics } from "@constants/metrics"; 5 | import RecentList from "../components/RecentList"; 6 | import { TabConfigItem } from "../components/types"; 7 | 8 | export const TABS_CONFIG: TabConfigItem[] = [ 9 | { 10 | iconName: "heart", 11 | iconSize: s(25), 12 | iconScaleFactor: 0.8, 13 | component: FavoriteList, 14 | }, 15 | { 16 | iconName: "person", 17 | iconSize: s(23), 18 | iconScaleFactor: 0.85, 19 | component: ContactList, 20 | }, 21 | { 22 | iconName: "time", 23 | iconSize: s(24), 24 | iconScaleFactor: 0.8, 25 | component: RecentList, 26 | }, 27 | ]; 28 | 29 | export const BAR_PADDING = s(20 - TABS_CONFIG.length); 30 | export const BAR_LENGHT = 31 | (metrics.screenWidth - BAR_PADDING * (2 + TABS_CONFIG.length - 1)) / 32 | TABS_CONFIG.length - 33 | 1; 34 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { SafeAreaProvider } from "react-native-safe-area-context"; 2 | import { 3 | PerformanceProfiler, 4 | RenderPassReport, 5 | } from "@shopify/react-native-performance"; 6 | import { useCallback } from "react"; 7 | import { NavigationContainer } from "@react-navigation/native"; 8 | import { printRenderReportConsole } from "@utils/console"; 9 | import { RootNavigator } from "@navigation/index"; 10 | import { StatusBar } from "react-native"; 11 | 12 | const App = () => { 13 | const onReportPrepared = useCallback((report: RenderPassReport) => { 14 | // uncomment to enable perfomance logs 15 | printRenderReportConsole(report); 16 | }, []); 17 | 18 | return ( 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | ); 28 | }; 29 | 30 | export default App; 31 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/AdjustmentWheelScreen.tsx: -------------------------------------------------------------------------------- 1 | import { Flex, BackButton } from "@components/index"; 2 | import { PerformanceMeasureView } from "@shopify/react-native-performance"; 3 | import { theme } from "./assets/theme"; 4 | import Routes from "@navigation/routes"; 5 | import Picker from "./components/Picker"; 6 | import { StatusBar, StyleSheet } from "react-native"; 7 | import { vs } from "react-native-size-matters/extend"; 8 | 9 | const AdjustmentWheelScreen = () => { 10 | return ( 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | ); 19 | }; 20 | 21 | const styles = StyleSheet.create({ 22 | container: { 23 | backgroundColor: theme.colors.background, 24 | alignItems: "center", 25 | justifyContent: "center", 26 | paddingBottom: vs(42), 27 | }, 28 | }); 29 | 30 | export default AdjustmentWheelScreen; 31 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/TopBar.tsx: -------------------------------------------------------------------------------- 1 | import { StyleSheet, View } from "react-native"; 2 | import { s, vs } from "react-native-size-matters/extend"; 3 | import { TABS_CONFIG } from "../assets/tab-config"; 4 | import AnimatedTab from "./AnimatedTab"; 5 | import { TopBarProps } from "./types"; 6 | 7 | const TopBar = ({ onPress, progress }: TopBarProps) => { 8 | return ( 9 | 10 | {TABS_CONFIG.map((item, index) => ( 11 | onPress(index)} 16 | progress={progress} 17 | index={index} 18 | key={index} 19 | /> 20 | ))} 21 | 22 | ); 23 | }; 24 | 25 | const styles = StyleSheet.create({ 26 | container: { 27 | marginTop: vs(12), 28 | paddingHorizontal: s(20), 29 | flexDirection: "row", 30 | justifyContent: "space-between", 31 | }, 32 | }); 33 | 34 | export default TopBar; 35 | -------------------------------------------------------------------------------- /.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 | 24 | # Android/IntelliJ 25 | # 26 | build/ 27 | .idea 28 | .gradle 29 | local.properties 30 | *.iml 31 | *.hprof 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | yarn-error.log 38 | 39 | # BUCK 40 | buck-out/ 41 | \.buckd/ 42 | *.keystore 43 | !debug.keystore 44 | 45 | # fastlane 46 | # 47 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 48 | # screenshots whenever they are needed. 49 | # For more information about the recommended setup visit: 50 | # https://docs.fastlane.tools/best-practices/source-control/ 51 | 52 | */fastlane/report.xml 53 | */fastlane/Preview.html 54 | */fastlane/screenshots 55 | 56 | # Bundle artifact 57 | *.jsbundle 58 | 59 | # CocoaPods 60 | /ios/Pods/ 61 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 13 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/components/animated/AnimatedText.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | StyleProp, 3 | StyleSheet, 4 | TextInput, 5 | TextInputProps, 6 | TextStyle, 7 | } from "react-native"; 8 | import Animated, { useAnimatedProps } from "react-native-reanimated"; 9 | 10 | type AnimatedTextProps = { 11 | style?: StyleProp>>; 12 | text: Animated.SharedValue; 13 | }; 14 | 15 | Animated.addWhitelistedNativeProps({ text: true }); 16 | 17 | const AnimatedTextInput = Animated.createAnimatedComponent(TextInput); 18 | 19 | export const AnimatedText = ({ style, text }: AnimatedTextProps) => { 20 | const animatedProps = useAnimatedProps(() => { 21 | return { text: text.value } as unknown as TextInputProps; 22 | }); 23 | 24 | return ( 25 | 32 | ); 33 | }; 34 | 35 | const styles = StyleSheet.create({ 36 | text: { 37 | color: "black", 38 | }, 39 | }); 40 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/assets/utils.ts: -------------------------------------------------------------------------------- 1 | import ReactNativeHapticFeedback from "react-native-haptic-feedback"; 2 | 3 | export function getWheelValues(length: number, offset: number) { 4 | return new Array(length).fill(0).map((_, i) => { 5 | const value = i + offset; 6 | return { value, label: String(value) }; 7 | }); 8 | } 9 | 10 | export function getShiftIntervals(itemsTotal: number) { 11 | let prev = 0; 12 | let currentItem = 0; 13 | const negativeArray = [0, 0, 0]; 14 | const positiveArray = []; 15 | 16 | for (let i = 0; i < itemsTotal; i++) { 17 | currentItem = prev + 2 + i; 18 | positiveArray.push(currentItem); 19 | negativeArray.unshift(-currentItem); 20 | prev = currentItem; 21 | } 22 | 23 | return negativeArray.concat(positiveArray); 24 | } 25 | 26 | export function toNearesEvenNumber(value: number) { 27 | return 2 * Math.round(value / 2); 28 | } 29 | 30 | export function getHeaderText(index: number, offset: number) { 31 | return `${index < 10 - offset ? "0" : ""}${index + offset}:00`; 32 | } 33 | 34 | export function tickHaptic() { 35 | ReactNativeHapticFeedback.trigger("selection"); 36 | } 37 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/components/Mark.tsx: -------------------------------------------------------------------------------- 1 | import { StyleSheet, Text, View } from "react-native"; 2 | import { 3 | ITEM_WIDTH, 4 | LONG_MARK_HEIGHT, 5 | SHORT_MARK_HEIGHT, 6 | } from "../assets/config"; 7 | import { MarkProps } from "./types"; 8 | 9 | const Mark = ({ item, width, color }: MarkProps) => { 10 | return ( 11 | 12 | 13 | {item.value % 5 == 0 ? item.label : null} 14 | 15 | 25 | 26 | ); 27 | }; 28 | 29 | const styles = StyleSheet.create({ 30 | mark: { 31 | borderRadius: 2, 32 | alignSelf: "center", 33 | }, 34 | label: { 35 | color: "white", 36 | fontSize: 13, 37 | lineHeight: ITEM_WIDTH, 38 | textAlign: "center", 39 | textAlignVertical: "center", 40 | }, 41 | }); 42 | 43 | export default Mark; 44 | -------------------------------------------------------------------------------- /src/navigation/RootNavigator.tsx: -------------------------------------------------------------------------------- 1 | import { createNativeStackNavigator } from "@react-navigation/native-stack"; 2 | import { gestureHandlerRootHOC } from "react-native-gesture-handler"; 3 | import Routes from "./routes"; 4 | 5 | const Stack = createNativeStackNavigator(); 6 | 7 | export const RootNavigator = () => { 8 | return ( 9 | 13 | 17 | 22 | 27 | 34 | 35 | ); 36 | }; 37 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/types.ts: -------------------------------------------------------------------------------- 1 | import { Animated } from "react-native"; 2 | import Ionicons from "react-native-vector-icons/glyphmaps/Ionicons.json"; 3 | 4 | export type AnimatedIcon = { 5 | iconName: keyof typeof Ionicons; 6 | iconSize: number; 7 | iconScaleFactor: number; 8 | }; 9 | 10 | export type AnimatedTabProps = AnimatedIcon & { 11 | onPress: () => void; 12 | progress: Animated.AnimatedInterpolation; 13 | index: number; 14 | }; 15 | 16 | export type TabConfigItem = AnimatedIcon & { 17 | component: () => JSX.Element; 18 | }; 19 | 20 | export type HeaderProps = { 21 | title: string; 22 | subtitle: string; 23 | scrollY: Animated.Value; 24 | }; 25 | 26 | export type ContactHeaderProps = { item: string }; 27 | 28 | export type Contact = { 29 | firstName: string; 30 | lastName?: string; 31 | image?: any; 32 | color?: string; 33 | phoneNumber?: string; 34 | email?: string; 35 | }; 36 | 37 | export type ContactListItem = { 38 | item: Contact; 39 | titleColor?: string; 40 | }; 41 | 42 | export type SlideContainerProps = { 43 | item: TabConfigItem; 44 | index: number; 45 | progress: Animated.AnimatedInterpolation; 46 | }; 47 | 48 | export type TopBarProps = { 49 | onPress: (index: number) => void; 50 | progress: Animated.AnimatedInterpolation; 51 | }; 52 | -------------------------------------------------------------------------------- /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: -Xmx1024m -XX:MaxPermSize=256m 13 | org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 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 | # Version of flipper SDK to use with React Native 28 | FLIPPER_VERSION=0.99.0 29 | -------------------------------------------------------------------------------- /src/components/buttons/BackButton.tsx: -------------------------------------------------------------------------------- 1 | import { StyleSheet, TouchableOpacity, ViewStyle } from "react-native"; 2 | import Icon from "react-native-vector-icons/Ionicons"; 3 | import { useSafeAreaInsets } from "react-native-safe-area-context"; 4 | import { globalTheme } from "@assets/globalTheme"; 5 | import { useProfiledNavigation } from "@shopify/react-native-performance-navigation"; 6 | import { s } from "react-native-size-matters/extend"; 7 | 8 | type BackButtonProps = { 9 | style?: ViewStyle; 10 | color?: string; 11 | iconSize?: number; 12 | }; 13 | 14 | export const BackButton = ({ style, color, iconSize }: BackButtonProps) => { 15 | const { top } = useSafeAreaInsets(); 16 | const navigation = useProfiledNavigation(); 17 | return ( 18 | 28 | 33 | 34 | ); 35 | }; 36 | 37 | const styles = StyleSheet.create({ 38 | container: { 39 | opacity: 0.9, 40 | alignItems: "center", 41 | justifyContent: "center", 42 | left: s(20), 43 | width: s(48), 44 | height: s(48), 45 | }, 46 | }); 47 | -------------------------------------------------------------------------------- /src/screens/home-screen/components/ScreenListItem.tsx: -------------------------------------------------------------------------------- 1 | import { globalTheme } from "@assets/globalTheme"; 2 | import { StyleSheet, Text, TouchableOpacity } from "react-native"; 3 | import { mvs, s } from "react-native-size-matters/extend"; 4 | import Icon from "react-native-vector-icons/Ionicons"; 5 | import { RoutesT } from "@navigation/routes"; 6 | import { ScreenListItemT } from "@navigation/screen-list"; 7 | 8 | export type ScreenListItemProps = { 9 | item: ScreenListItemT; 10 | onPress: (destination: RoutesT) => void; 11 | }; 12 | 13 | const ScreenListItem = ({ item, onPress }: ScreenListItemProps) => { 14 | return ( 15 | onPress(item.destination)}> 18 | {item.title} 19 | 24 | 25 | ); 26 | }; 27 | 28 | const styles = StyleSheet.create({ 29 | row: { 30 | marginHorizontal: s(20), 31 | paddingTop: mvs(25), 32 | paddingBottom: mvs(17), 33 | flexDirection: "row", 34 | alignItems: "center", 35 | justifyContent: "space-between", 36 | borderBottomColor: globalTheme.colors.lightGray, 37 | borderBottomWidth: 1, 38 | }, 39 | label: { 40 | color: globalTheme.colors.black, 41 | fontSize: mvs(16), 42 | }, 43 | }); 44 | 45 | export default ScreenListItem; 46 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/assets/config.ts: -------------------------------------------------------------------------------- 1 | import { metrics } from "@constants/metrics"; 2 | import { s } from "react-native-size-matters/extend"; 3 | import { getShiftIntervals, getWheelValues, toNearesEvenNumber } from "./utils"; 4 | 5 | export const LENGTH = 55; 6 | export const INITIAL_INDEX = 25; 7 | export const INDEX_OFFSET = 5; 8 | export const WHEEL = getWheelValues(LENGTH, INDEX_OFFSET); 9 | export const LONG_MARK_HEIGHT = 48; 10 | export const SHORT_MARK_HEIGHT = Math.floor(LONG_MARK_HEIGHT / 1.61); 11 | 12 | export const ITEM_WIDTH = 17; 13 | export const VISIBLE_ITEMS = 29; 14 | export const DRAW_ITEMS = Math.floor(VISIBLE_ITEMS / 2); 15 | export const SHIFT_INTERVALS = getShiftIntervals(DRAW_ITEMS - 1); 16 | export const WHEEL_WIDTH = s(350); 17 | export const WHEEL_PADDING = WHEEL_WIDTH / 2 - ITEM_WIDTH / 2; 18 | export const IDXS = [...Array(VISIBLE_ITEMS).keys()].map( 19 | index => index - DRAW_ITEMS, 20 | ); 21 | 22 | export const ANDROID_ITEM_WIDTH = 20; 23 | export const ANDROID_VISIBLE_ITEMS = 23; 24 | export const ANDROID_DRAW_ITEMS = Math.floor(ANDROID_VISIBLE_ITEMS / 2); 25 | export const ANDROID_SHIFT_INTERVALS = getShiftIntervals( 26 | ANDROID_DRAW_ITEMS - 1, 27 | ); 28 | export const ANDROID_WHEEL_WIDTH = toNearesEvenNumber(metrics.screenWidth - 20); 29 | export const ANDROID_WHEEL_PADDING = 30 | ANDROID_WHEEL_WIDTH / 2 - ANDROID_ITEM_WIDTH / 2; 31 | export const ANDROID_IDXS = [...Array(ANDROID_VISIBLE_ITEMS).keys()].map( 32 | index => index - ANDROID_DRAW_ITEMS, 33 | ); 34 | -------------------------------------------------------------------------------- /android/app/_BUCK: -------------------------------------------------------------------------------- 1 | # To learn about Buck see [Docs](https://buckbuild.com/). 2 | # To run your application with Buck: 3 | # - install Buck 4 | # - `npm start` - to start the packager 5 | # - `cd android` 6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 8 | # - `buck install -r android/app` - compile, install and run application 9 | # 10 | 11 | load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") 12 | 13 | lib_deps = [] 14 | 15 | create_aar_targets(glob(["libs/*.aar"])) 16 | 17 | create_jar_targets(glob(["libs/*.jar"])) 18 | 19 | android_library( 20 | name = "all-libs", 21 | exported_deps = lib_deps, 22 | ) 23 | 24 | android_library( 25 | name = "app-code", 26 | srcs = glob([ 27 | "src/main/java/**/*.java", 28 | ]), 29 | deps = [ 30 | ":all-libs", 31 | ":build_config", 32 | ":res", 33 | ], 34 | ) 35 | 36 | android_build_config( 37 | name = "build_config", 38 | package = "com.rnui", 39 | ) 40 | 41 | android_resource( 42 | name = "res", 43 | package = "com.rnui", 44 | res = "src/main/res", 45 | ) 46 | 47 | android_binary( 48 | name = "app", 49 | keystore = "//android/keystores:debug", 50 | manifest = "src/main/AndroidManifest.xml", 51 | package_type = "debug", 52 | deps = [ 53 | ":app-code", 54 | ], 55 | ) 56 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | buildToolsVersion = "30.0.2" 6 | minSdkVersion = 23 7 | compileSdkVersion = 31 8 | targetSdkVersion = 31 9 | ndkVersion = "21.4.7075529" 10 | kotlinVersion = "1.6.0" 11 | } 12 | repositories { 13 | google() 14 | mavenCentral() 15 | } 16 | dependencies { 17 | classpath("com.android.tools.build:gradle:7.0.2") 18 | // NOTE: Do not place your application dependencies here; they belong 19 | // in the individual module build.gradle files 20 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" 21 | } 22 | } 23 | 24 | allprojects { 25 | repositories { 26 | maven { 27 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 28 | url("$rootDir/../node_modules/react-native/android") 29 | } 30 | maven { 31 | // Android JSC is installed from npm 32 | url("$rootDir/../node_modules/jsc-android/dist") 33 | } 34 | mavenCentral { 35 | // We don't want to fetch react-native from Maven Central as there are 36 | // older versions over there. 37 | content { 38 | excludeGroup "com.facebook.react" 39 | } 40 | } 41 | google() 42 | maven { url 'https://www.jitpack.io' } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/screens/home-screen/HomeScreen.tsx: -------------------------------------------------------------------------------- 1 | import { SafeFlex } from "@components/index"; 2 | import { ScreenListItemT, SCREEN_LIST } from "@navigation/screen-list"; 3 | import { PerformanceMeasureView } from "@shopify/react-native-performance"; 4 | import { useProfiledNavigation } from "@shopify/react-native-performance-navigation"; 5 | import { 6 | FlatList, 7 | ListRenderItem, 8 | Platform, 9 | StatusBar, 10 | StyleSheet, 11 | } from "react-native"; 12 | import Routes, { RoutesT } from "@navigation/routes"; 13 | import ScreenListItem from "./components/ScreenListItem"; 14 | import { mvs } from "react-native-size-matters/extend"; 15 | 16 | const HomeScreen = () => { 17 | const { navigate } = useProfiledNavigation(); 18 | 19 | const handleItemPress = (destination: RoutesT) => { 20 | navigate({ source: Routes.Home }, destination); 21 | }; 22 | 23 | const renderItem: ListRenderItem = ({ item }) => { 24 | return ; 25 | }; 26 | 27 | return ( 28 | 29 | 30 | 31 | 36 | 37 | 38 | ); 39 | }; 40 | 41 | const styles = StyleSheet.create({ 42 | list: { 43 | paddingTop: Platform.OS === "android" ? mvs(20) : 0, 44 | }, 45 | }); 46 | 47 | export default HomeScreen; 48 | -------------------------------------------------------------------------------- /ios/rnui/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "iPhone_Notifications_20_2x.png", 5 | "idiom" : "iphone", 6 | "scale" : "2x", 7 | "size" : "20x20" 8 | }, 9 | { 10 | "filename" : "iPhone_Notifications_20_3x.png", 11 | "idiom" : "iphone", 12 | "scale" : "3x", 13 | "size" : "20x20" 14 | }, 15 | { 16 | "filename" : "iPhone_Settings_29_2x.png", 17 | "idiom" : "iphone", 18 | "scale" : "2x", 19 | "size" : "29x29" 20 | }, 21 | { 22 | "filename" : "iPhone_Settings_29_3x.png", 23 | "idiom" : "iphone", 24 | "scale" : "3x", 25 | "size" : "29x29" 26 | }, 27 | { 28 | "filename" : "iPhone_Spotlight_40_2x.png", 29 | "idiom" : "iphone", 30 | "scale" : "2x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "filename" : "iPhone_Spotlight_40_3x.png", 35 | "idiom" : "iphone", 36 | "scale" : "3x", 37 | "size" : "40x40" 38 | }, 39 | { 40 | "filename" : "iPhone_App_60_2x.png", 41 | "idiom" : "iphone", 42 | "scale" : "2x", 43 | "size" : "60x60" 44 | }, 45 | { 46 | "filename" : "iPhone_App_60_3x.png", 47 | "idiom" : "iphone", 48 | "scale" : "3x", 49 | "size" : "60x60" 50 | }, 51 | { 52 | "filename" : "App_store_1024_1x.png", 53 | "idiom" : "ios-marketing", 54 | "scale" : "1x", 55 | "size" : "1024x1024" 56 | } 57 | ], 58 | "info" : { 59 | "author" : "xcode", 60 | "version" : 1 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/components/SwipeGesture.tsx: -------------------------------------------------------------------------------- 1 | import { withDelay, withSpring, withTiming } from "react-native-reanimated"; 2 | import { Gesture, GestureDetector } from "react-native-gesture-handler"; 3 | import { CLOSE_THRESHOLD, SPRING_CONFIG } from "../assets/config"; 4 | import { SwipeGestureProps } from "../assets/types"; 5 | 6 | const SwipeGesture = ({ 7 | children, 8 | selectedCard, 9 | swipeY, 10 | inTransition, 11 | }: SwipeGestureProps) => { 12 | const gesture = Gesture.Pan() 13 | .manualActivation(true) 14 | .onTouchesDown((_, state) => { 15 | if (selectedCard.value !== -1) { 16 | state.activate(); 17 | } else { 18 | state.fail(); 19 | } 20 | }) 21 | .onBegin(() => { 22 | inTransition.value = 0; 23 | }) 24 | .onUpdate(e => { 25 | if (!inTransition.value) { 26 | if (e.translationY > CLOSE_THRESHOLD) { 27 | inTransition.value = 1; 28 | selectedCard.value = -1; 29 | } else if (e.translationY >= 0) { 30 | swipeY.value = e.translationY; 31 | } 32 | } 33 | }) 34 | .onTouchesUp(() => { 35 | inTransition.value = withDelay(100, withTiming(0, { duration: 0 })); 36 | }) 37 | .onEnd(e => { 38 | if (!inTransition.value && e.translationY <= CLOSE_THRESHOLD) { 39 | swipeY.value = withSpring(0, SPRING_CONFIG.SWIPE); 40 | } else { 41 | swipeY.value = 0; 42 | } 43 | }); 44 | 45 | return {children}; 46 | }; 47 | 48 | export default SwipeGesture; 49 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/components/Interval.tsx: -------------------------------------------------------------------------------- 1 | import { StyleSheet } from "react-native"; 2 | import Animated, { 3 | Extrapolate, 4 | interpolate, 5 | useAnimatedStyle, 6 | useDerivedValue, 7 | } from "react-native-reanimated"; 8 | import { 9 | DRAW_ITEMS, 10 | IDXS, 11 | ITEM_WIDTH, 12 | SHIFT_INTERVALS, 13 | } from "../assets/config"; 14 | import Mark from "./Mark"; 15 | import { IntervalProps } from "./types"; 16 | 17 | const Interval = ({ item, index, progress }: IntervalProps) => { 18 | const indexDiff = useDerivedValue(() => { 19 | return progress.value - index; 20 | }); 21 | 22 | const animatedStyle = useAnimatedStyle(() => { 23 | return { 24 | opacity: interpolate( 25 | progress.value, 26 | [ 27 | index - DRAW_ITEMS, 28 | index - (DRAW_ITEMS - 1), 29 | index - (DRAW_ITEMS - 5), 30 | index, 31 | index + (DRAW_ITEMS - 5), 32 | index + (DRAW_ITEMS - 1), 33 | index + DRAW_ITEMS, 34 | ], 35 | [0, 0.25, 1, 1, 1, 0.25, 0], 36 | Extrapolate.CLAMP, 37 | ), 38 | transform: [ 39 | { 40 | translateX: interpolate( 41 | indexDiff.value, 42 | [...IDXS], 43 | [...SHIFT_INTERVALS], 44 | Extrapolate.CLAMP, 45 | ), 46 | }, 47 | ], 48 | }; 49 | }); 50 | 51 | return ( 52 | 53 | 54 | 55 | ); 56 | }; 57 | 58 | const styles = StyleSheet.create({ 59 | item: { 60 | width: ITEM_WIDTH, 61 | height: 70, 62 | justifyContent: "center", 63 | }, 64 | }); 65 | 66 | export default Interval; 67 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/components/IntervalAndroid.tsx: -------------------------------------------------------------------------------- 1 | import { Animated, StyleSheet } from "react-native"; 2 | import { 3 | ANDROID_DRAW_ITEMS, 4 | ANDROID_IDXS, 5 | ANDROID_ITEM_WIDTH, 6 | ANDROID_SHIFT_INTERVALS, 7 | } from "../assets/config"; 8 | import { theme } from "../assets/theme"; 9 | import { IntervalAndroidProps } from "./types"; 10 | import Mark from "./Mark"; 11 | 12 | const IntervalAndroid = ({ 13 | item, 14 | index, 15 | currentIndexNode, 16 | }: IntervalAndroidProps) => { 17 | const indexDiff = Animated.subtract(currentIndexNode, index); 18 | return ( 19 | 47 | 48 | 49 | ); 50 | }; 51 | 52 | const styles = StyleSheet.create({ 53 | item: { 54 | width: ANDROID_ITEM_WIDTH, 55 | height: 70, 56 | justifyContent: "center", 57 | }, 58 | }); 59 | 60 | export default IntervalAndroid; 61 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/FavoriteList.tsx: -------------------------------------------------------------------------------- 1 | import { useRef } from "react"; 2 | import { Animated, StyleSheet, View } from "react-native"; 3 | import { FAVORITES } from "../assets/contacts"; 4 | import FavoriteItem from "./FavoriteItem"; 5 | import Header from "./Header"; 6 | import { AnimatedFlashList, ListRenderItem } from "@shopify/flash-list"; 7 | import { s } from "react-native-size-matters/extend"; 8 | import { HEADER_HEIGHT_BASE, HEADER_HEIGHT_EXT } from "../assets/list-config"; 9 | import { Contact } from "./types"; 10 | 11 | const FavoriteList = () => { 12 | const scrollY = useRef(new Animated.Value(0)).current; 13 | const onScroll = Animated.event( 14 | [{ nativeEvent: { contentOffset: { y: scrollY } } }], 15 | { useNativeDriver: true }, 16 | ); 17 | 18 | const renderFavoriteItem: ListRenderItem = ({ item }) => { 19 | return ; 20 | }; 21 | 22 | return ( 23 | 24 |
29 | 30 | String(index)} 34 | renderItem={renderFavoriteItem} 35 | numColumns={2} 36 | onScroll={onScroll} 37 | showsVerticalScrollIndicator={false} 38 | scrollEventThrottle={16} 39 | contentContainerStyle={styles.content} 40 | /> 41 | 42 | 43 | ); 44 | }; 45 | 46 | const styles = StyleSheet.create({ 47 | container: { flex: 1 }, 48 | listContainer: { 49 | marginTop: HEADER_HEIGHT_BASE, 50 | flexGrow: 1, 51 | }, 52 | content: { paddingTop: HEADER_HEIGHT_EXT }, 53 | }); 54 | 55 | export default FavoriteList; 56 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/rn_edit_text_material.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 18 | 19 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /ios/rnuiTests/rnuiTests.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 rnuiTests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation rnuiTests 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(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 38 | if (level >= RCTLogLevelError) { 39 | redboxError = message; 40 | } 41 | }); 42 | #endif 43 | 44 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 45 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 46 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 47 | 48 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 49 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 50 | return YES; 51 | } 52 | return NO; 53 | }]; 54 | } 55 | 56 | #ifdef DEBUG 57 | RCTSetLogFunction(RCTDefaultLogFunction); 58 | #endif 59 | 60 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 61 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 62 | } 63 | 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /ios/rnui/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | React Naive UI 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 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSExceptionDomains 30 | 31 | localhost 32 | 33 | NSExceptionAllowsInsecureHTTPLoads 34 | 35 | 36 | 37 | 38 | NSLocationWhenInUseUsageDescription 39 | 40 | UIAppFonts 41 | 42 | Ionicons.ttf 43 | Monda-Regular.ttf 44 | 45 | UILaunchStoryboardName 46 | LaunchScreen.storyboard 47 | UIRequiredDeviceCapabilities 48 | 49 | armv7 50 | 51 | UISupportedInterfaceOrientations 52 | 53 | UIInterfaceOrientationPortrait 54 | 55 | UISupportedInterfaceOrientations~ipad 56 | 57 | UIInterfaceOrientationLandscapeLeft 58 | UIInterfaceOrientationLandscapeRight 59 | UIInterfaceOrientationPortrait 60 | 61 | UIViewControllerBasedStatusBarAppearance 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/FavoriteItem.tsx: -------------------------------------------------------------------------------- 1 | import { Image, ImageBackground, StyleSheet, Text, View } from "react-native"; 2 | import { mvs, s } from "react-native-size-matters/extend"; 3 | import { getFullName, getInitials } from "../assets/text-utils"; 4 | import { ContactListItem } from "./types"; 5 | 6 | const FavoriteItem = ({ item }: ContactListItem) => ( 7 | 13 | {item.image ? ( 14 | <> 15 | 16 | 20 | 21 | {getFullName(item.firstName, item.lastName)} 22 | 23 | 24 | 25 | ) : ( 26 | <> 27 | 28 | {getInitials(item.firstName, item.lastName)} 29 | 30 | 31 | {getFullName(item.firstName, item.lastName)} 32 | 33 | 34 | )} 35 | 36 | ); 37 | 38 | const styles = StyleSheet.create({ 39 | container: { height: s(183), width: "100%" }, 40 | image: { width: "100%", height: "100%" }, 41 | nameContainer: { 42 | justifyContent: "flex-end", 43 | paddingBottom: mvs(20), 44 | }, 45 | initials: { 46 | color: "white", 47 | fontWeight: "700", 48 | fontSize: mvs(84), 49 | paddingLeft: s(19), 50 | opacity: 0.25, 51 | }, 52 | name: { 53 | color: "white", 54 | fontWeight: "500", 55 | fontSize: mvs(15), 56 | paddingLeft: s(19), 57 | }, 58 | gradientContainer: { 59 | width: "100%", 60 | height: s(40), 61 | justifyContent: "center", 62 | position: "absolute", 63 | paddingBottom: s(4), 64 | bottom: 0, 65 | }, 66 | }); 67 | 68 | export default FavoriteItem; 69 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/components/Picker.tsx: -------------------------------------------------------------------------------- 1 | import { AnimatedText } from "@components/index"; 2 | import { StyleSheet, View } from "react-native"; 3 | import { 4 | runOnJS, 5 | useAnimatedReaction, 6 | useDerivedValue, 7 | useSharedValue, 8 | } from "react-native-reanimated"; 9 | import { mvs, s } from "react-native-size-matters/extend"; 10 | import { 11 | INDEX_OFFSET, 12 | INITIAL_INDEX, 13 | ITEM_WIDTH, 14 | LENGTH, 15 | } from "../assets/config"; 16 | import { tickHaptic } from "../assets/utils"; 17 | import Wheel from "./Wheel"; 18 | 19 | const AdjustmentWheelScreen = () => { 20 | const scrollX = useSharedValue(0); 21 | const progress = useDerivedValue(() => { 22 | return scrollX.value / ITEM_WIDTH; 23 | }); 24 | 25 | const currentIndex = useSharedValue(INITIAL_INDEX); 26 | 27 | useAnimatedReaction( 28 | () => Math.min(Math.max(0, progress.value), LENGTH - 1), 29 | minMaxProgress => { 30 | if (Math.abs(currentIndex.value - minMaxProgress) > 0.5) { 31 | runOnJS(tickHaptic)(); 32 | currentIndex.value = Math.round(minMaxProgress); 33 | } 34 | }, 35 | ); 36 | 37 | const headerTx = useDerivedValue(() => { 38 | return `${currentIndex.value < 10 - INDEX_OFFSET ? "0" : ""}${ 39 | currentIndex.value + INDEX_OFFSET 40 | }:00`; 41 | }); 42 | 43 | return ( 44 | 45 | 46 | 47 | 48 | 49 | ); 50 | }; 51 | 52 | const styles = StyleSheet.create({ 53 | header: { 54 | color: "white", 55 | fontSize: mvs(74), 56 | textAlign: "center", 57 | fontFamily: "Monda-Regular", 58 | }, 59 | container: { 60 | height: 114, 61 | alignItems: "center", 62 | justifyContent: "center", 63 | }, 64 | separator: { 65 | opacity: 0.3, 66 | width: s(270), 67 | backgroundColor: "white", 68 | height: 1, 69 | marginTop: mvs(-10), 70 | marginBottom: mvs(12), 71 | alignSelf: "center", 72 | }, 73 | }); 74 | 75 | export default AdjustmentWheelScreen; 76 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/ContactItem.tsx: -------------------------------------------------------------------------------- 1 | import { HStack } from "@components/index"; 2 | import { Image, StyleSheet, Text, View } from "react-native"; 3 | import { mvs, s, vs } from "react-native-size-matters/extend"; 4 | import { 5 | formatPhoneNumber, 6 | getFullName, 7 | getInitials, 8 | } from "../assets/text-utils"; 9 | import { theme } from "../assets/theme"; 10 | import { ContactListItem } from "./types"; 11 | 12 | const ContactItem = ({ item, titleColor }: ContactListItem) => { 13 | return ( 14 | 15 | {item.image ? ( 16 | 17 | ) : ( 18 | 25 | 26 | {getInitials(item.firstName, item.lastName)} 27 | 28 | 29 | )} 30 | 31 | 32 | {getFullName(item.firstName, item.lastName)} 33 | 34 | 35 | {item.phoneNumber ? formatPhoneNumber(item.phoneNumber) : item.email} 36 | 37 | 38 | 39 | ); 40 | }; 41 | 42 | const styles = StyleSheet.create({ 43 | container: { height: s(90) }, 44 | image: { height: "100%", width: s(90) }, 45 | initialsContainer: { 46 | height: "100%", 47 | width: s(90), 48 | paddingLeft: s(9), 49 | justifyContent: "flex-end", 50 | }, 51 | initials: { 52 | color: "white", 53 | fontWeight: "600", 54 | fontSize: mvs(52), 55 | opacity: 0.5, 56 | }, 57 | nameContainer: { 58 | backgroundColor: theme.colors.black, 59 | flexGrow: 1, 60 | justifyContent: "center", 61 | paddingLeft: s(32), 62 | }, 63 | name: { 64 | color: theme.colors.white, 65 | fontWeight: "800", 66 | fontSize: mvs(16), 67 | marginBottom: vs(5), 68 | }, 69 | contactInfo: { 70 | color: theme.colors.lightGray, 71 | }, 72 | }); 73 | 74 | export default ContactItem; 75 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/ContactListScreen.tsx: -------------------------------------------------------------------------------- 1 | import { useRef } from "react"; 2 | import { Flex, SafeFlex } from "@components/index"; 3 | import { metrics } from "@constants/metrics"; 4 | import { PerformanceMeasureView } from "@shopify/react-native-performance"; 5 | import { Animated, StatusBar, StyleSheet } from "react-native"; 6 | import { TABS_CONFIG } from "./assets/tab-config"; 7 | import { theme } from "./assets/theme"; 8 | import SlideContainer from "./components/SlideContainer"; 9 | import TopBar from "./components/TopBar"; 10 | import Routes from "@navigation/routes"; 11 | 12 | const ContactListScreen = () => { 13 | const scrollX = useRef(new Animated.Value(0)).current; 14 | const progress = useRef( 15 | Animated.divide(scrollX, metrics.screenWidth), 16 | ).current; 17 | 18 | const scrollRef = useRef(null); 19 | const onScroll = Animated.event( 20 | [{ nativeEvent: { contentOffset: { x: scrollX } } }], 21 | { useNativeDriver: true }, 22 | ); 23 | const scrollToIndex = (index: number) => { 24 | scrollRef.current?.scrollTo({ 25 | x: metrics.screenWidth * index, 26 | animated: true, 27 | }); 28 | }; 29 | 30 | return ( 31 | 32 | 33 | 34 | 35 | 36 | 44 | {TABS_CONFIG.map((item, index) => ( 45 | 51 | ))} 52 | 53 | 54 | 55 | 56 | ); 57 | }; 58 | 59 | const styles = StyleSheet.create({ 60 | container: { 61 | backgroundColor: theme.colors.background, 62 | }, 63 | }); 64 | 65 | export default ContactListScreen; 66 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/components/Picker.android.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef, useState } from "react"; 2 | import { StyleSheet, View, Animated, Text } from "react-native"; 3 | import { mvs, s } from "react-native-size-matters/extend"; 4 | import { ANDROID_ITEM_WIDTH, INDEX_OFFSET } from "../assets/config"; 5 | import { getHeaderText } from "../assets/utils"; 6 | import WheelAndroid from "./WheelAndroid"; 7 | 8 | /** 9 | * Android notes: 10 | * 1. MaskedView doesn't support scrollable masks on Android. 11 | * We use permanent indicator instead. 12 | * 2. Reanimated 2 at this point in time (Jan '23) doesn't handle 13 | * animation of many elements on low-end Android devices well. 14 | * So for now we fallback to vanilla Animated API. 15 | */ 16 | 17 | const PickerAndroid = () => { 18 | const [headerTx, setHeaderTx] = useState(getHeaderText(0, INDEX_OFFSET)); 19 | const scrollX = useRef(new Animated.Value(0)).current; 20 | const currentIndex = useRef(0); 21 | const currentIndexNode = useRef( 22 | Animated.divide(scrollX, ANDROID_ITEM_WIDTH), 23 | ).current; 24 | 25 | useEffect(() => { 26 | const subscription = currentIndexNode.addListener(({ value }) => { 27 | if (Math.abs(currentIndex.current - value) > 0.5) { 28 | currentIndex.current = Math.round(value); 29 | setHeaderTx(getHeaderText(currentIndex.current, INDEX_OFFSET)); 30 | } 31 | }); 32 | 33 | return () => currentIndexNode.removeListener(subscription); 34 | }, []); 35 | 36 | return ( 37 | 38 | {headerTx} 39 | 40 | 41 | 42 | ); 43 | }; 44 | 45 | const styles = StyleSheet.create({ 46 | header: { 47 | color: "white", 48 | fontSize: mvs(74), 49 | textAlign: "center", 50 | fontFamily: "Monda-Regular", 51 | }, 52 | container: { 53 | height: 114, 54 | alignItems: "center", 55 | justifyContent: "center", 56 | }, 57 | separator: { 58 | opacity: 0.3, 59 | width: s(270), 60 | backgroundColor: "white", 61 | height: 1, 62 | marginTop: mvs(-10), 63 | marginBottom: mvs(12), 64 | alignSelf: "center", 65 | }, 66 | }); 67 | 68 | export default PickerAndroid; 69 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/components/WheelAndroid.tsx: -------------------------------------------------------------------------------- 1 | import { FlashList, ListRenderItem } from "@shopify/flash-list"; 2 | import { memo, useCallback } from "react"; 3 | import { StyleSheet, View, Animated } from "react-native"; 4 | import { 5 | LONG_MARK_HEIGHT, 6 | WHEEL, 7 | ANDROID_ITEM_WIDTH, 8 | ANDROID_WHEEL_WIDTH, 9 | ANDROID_WHEEL_PADDING, 10 | } from "../assets/config"; 11 | import { theme } from "../assets/theme"; 12 | import IntervalAndroid from "./IntervalAndroid"; 13 | import { WheelAndroidProps } from "./types"; 14 | 15 | const AnimatedFlashList = Animated.createAnimatedComponent(FlashList); 16 | 17 | const WheelAndroid = ({ scrollX, currentIndexNode }: WheelAndroidProps) => { 18 | const onScroll = useCallback( 19 | Animated.event([{ nativeEvent: { contentOffset: { x: scrollX } } }], { 20 | useNativeDriver: true, 21 | }), 22 | [], 23 | ); 24 | 25 | const renderItem: ListRenderItem = ({ item, index }) => { 26 | return ( 27 | 32 | ); 33 | }; 34 | 35 | return ( 36 | 37 | index} 41 | renderItem={renderItem} 42 | onScroll={onScroll} 43 | scrollEventThrottle={16} 44 | horizontal 45 | showsHorizontalScrollIndicator={false} 46 | contentContainerStyle={styles.listContainer} 47 | /> 48 | 49 | 50 | 51 | 52 | ); 53 | }; 54 | 55 | const styles = StyleSheet.create({ 56 | container: { width: ANDROID_WHEEL_WIDTH }, 57 | listContainer: { paddingHorizontal: ANDROID_WHEEL_PADDING }, 58 | indicatorContainer: { 59 | alignSelf: "center", 60 | alignItems: "center", 61 | width: ANDROID_ITEM_WIDTH, 62 | marginTop: -2.5, 63 | top: -LONG_MARK_HEIGHT, 64 | }, 65 | indicator: { 66 | height: LONG_MARK_HEIGHT, 67 | borderRadius: 2, 68 | width: 2, 69 | backgroundColor: theme.colors.brightBlue, 70 | }, 71 | }); 72 | 73 | export default memo(WheelAndroid); 74 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rnui", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "android": "react-native run-android", 7 | "ios": "react-native run-ios", 8 | "start": "react-native start", 9 | "test": "jest", 10 | "lint": "eslint . --ext .js,.jsx,.ts,.tsx", 11 | "postinstall": "patch-package", 12 | "android-shake": "adb shell input keyevent 82" 13 | }, 14 | "dependencies": { 15 | "@react-native-masked-view/masked-view": "^0.2.8", 16 | "@react-navigation/native": "^6.1.2", 17 | "@react-navigation/native-stack": "^6.9.8", 18 | "@shopify/flash-list": "^1.4.0", 19 | "@shopify/react-native-performance": "^4.1.2", 20 | "@shopify/react-native-performance-navigation": "^3.0.0", 21 | "react": "17.0.2", 22 | "react-native": "0.67.4", 23 | "react-native-gesture-handler": "^2.9.0", 24 | "react-native-haptic-feedback": "^1.14.0", 25 | "react-native-reanimated": "^2.13.0", 26 | "react-native-safe-area-context": "^4.4.1", 27 | "react-native-screens": "^3.18.2", 28 | "react-native-size-matters": "^0.4.0", 29 | "react-native-vector-icons": "^9.2.0" 30 | }, 31 | "devDependencies": { 32 | "@babel/core": "^7.12.9", 33 | "@babel/runtime": "^7.12.5", 34 | "@react-native-community/eslint-config": "^2.0.0", 35 | "@types/jest": "^26.0.23", 36 | "@types/node": "^18.11.18", 37 | "@types/react-native": "^0.66.15", 38 | "@types/react-native-vector-icons": "^6.4.13", 39 | "@types/react-test-renderer": "^17.0.1", 40 | "@typescript-eslint/eslint-plugin": "^5.7.0", 41 | "@typescript-eslint/parser": "^5.7.0", 42 | "babel-jest": "^26.6.3", 43 | "babel-plugin-module-resolver": "^4.1.0", 44 | "babel-plugin-transform-remove-console": "^6.9.4", 45 | "eslint": "^7.14.0", 46 | "jest": "^26.6.3", 47 | "metro-react-native-babel-preset": "^0.66.2", 48 | "patch-package": "^6.5.1", 49 | "postinstall-postinstall": "^2.1.0", 50 | "react-native-dotenv": "^3.4.7", 51 | "react-test-renderer": "17.0.2", 52 | "typescript": "^4.4.4" 53 | }, 54 | "resolutions": { 55 | "@types/react": "^17" 56 | }, 57 | "jest": { 58 | "preset": "react-native", 59 | "moduleFileExtensions": [ 60 | "ts", 61 | "tsx", 62 | "js", 63 | "jsx", 64 | "json", 65 | "node" 66 | ] 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/AnimatedTab.tsx: -------------------------------------------------------------------------------- 1 | import { Animated, StyleSheet, TouchableOpacity, View } from "react-native"; 2 | import { vs } from "react-native-size-matters/extend"; 3 | import Icon from "react-native-vector-icons/Ionicons"; 4 | import { BAR_LENGHT, BAR_PADDING } from "../assets/tab-config"; 5 | import { theme } from "../assets/theme"; 6 | import { AnimatedTabProps } from "./types"; 7 | 8 | const AnimatedTab = ({ 9 | iconName, 10 | iconSize, 11 | iconScaleFactor, 12 | onPress, 13 | progress, 14 | index, 15 | }: AnimatedTabProps) => { 16 | const translateX = progress.interpolate({ 17 | inputRange: [index - 1, index, index + 1], 18 | outputRange: [ 19 | -BAR_LENGHT - BAR_PADDING / 3, 20 | 0, 21 | BAR_LENGHT + BAR_PADDING / 3, 22 | ], 23 | extrapolate: "clamp", 24 | }); 25 | 26 | const opacity = progress.interpolate({ 27 | inputRange: [index - 1, index, index + 1], 28 | outputRange: [0, 1, 0], 29 | extrapolate: "clamp", 30 | }); 31 | 32 | const scale = progress.interpolate({ 33 | inputRange: [index - 1, index - 0.5, index, index + 0.5, index + 1], 34 | outputRange: [1, iconScaleFactor, 1, iconScaleFactor, 1], 35 | extrapolate: "clamp", 36 | }); 37 | 38 | return ( 39 | 43 | 44 | 45 | 46 | 47 | 53 | 54 | 55 | 56 | 57 | 58 | ); 59 | }; 60 | 61 | const styles = StyleSheet.create({ 62 | container: { 63 | alignItems: "center", 64 | }, 65 | barContainer: { 66 | height: 3, 67 | width: BAR_LENGHT, 68 | backgroundColor: theme.colors.gray, 69 | overflow: "hidden", 70 | borderRadius: 1, 71 | marginBottom: vs(10), 72 | }, 73 | bar: { 74 | width: BAR_LENGHT, 75 | height: 3, 76 | borderRadius: 1, 77 | backgroundColor: theme.colors.white, 78 | }, 79 | }); 80 | 81 | export default AnimatedTab; 82 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | CFPropertyList (3.0.5) 5 | rexml 6 | activesupport (6.1.5) 7 | concurrent-ruby (~> 1.0, >= 1.0.2) 8 | i18n (>= 1.6, < 2) 9 | minitest (>= 5.1) 10 | tzinfo (~> 2.0) 11 | zeitwerk (~> 2.3) 12 | addressable (2.8.0) 13 | public_suffix (>= 2.0.2, < 5.0) 14 | algoliasearch (1.27.5) 15 | httpclient (~> 2.8, >= 2.8.3) 16 | json (>= 1.5.1) 17 | atomos (0.1.3) 18 | claide (1.1.0) 19 | cocoapods (1.11.3) 20 | addressable (~> 2.8) 21 | claide (>= 1.0.2, < 2.0) 22 | cocoapods-core (= 1.11.3) 23 | cocoapods-deintegrate (>= 1.0.3, < 2.0) 24 | cocoapods-downloader (>= 1.4.0, < 2.0) 25 | cocoapods-plugins (>= 1.0.0, < 2.0) 26 | cocoapods-search (>= 1.0.0, < 2.0) 27 | cocoapods-trunk (>= 1.4.0, < 2.0) 28 | cocoapods-try (>= 1.1.0, < 2.0) 29 | colored2 (~> 3.1) 30 | escape (~> 0.0.4) 31 | fourflusher (>= 2.3.0, < 3.0) 32 | gh_inspector (~> 1.0) 33 | molinillo (~> 0.8.0) 34 | nap (~> 1.0) 35 | ruby-macho (>= 1.0, < 3.0) 36 | xcodeproj (>= 1.21.0, < 2.0) 37 | cocoapods-core (1.11.3) 38 | activesupport (>= 5.0, < 7) 39 | addressable (~> 2.8) 40 | algoliasearch (~> 1.0) 41 | concurrent-ruby (~> 1.1) 42 | fuzzy_match (~> 2.0.4) 43 | nap (~> 1.0) 44 | netrc (~> 0.11) 45 | public_suffix (~> 4.0) 46 | typhoeus (~> 1.0) 47 | cocoapods-deintegrate (1.0.5) 48 | cocoapods-downloader (1.5.1) 49 | cocoapods-plugins (1.0.0) 50 | nap 51 | cocoapods-search (1.0.1) 52 | cocoapods-trunk (1.6.0) 53 | nap (>= 0.8, < 2.0) 54 | netrc (~> 0.11) 55 | cocoapods-try (1.2.0) 56 | colored2 (3.1.2) 57 | concurrent-ruby (1.1.9) 58 | escape (0.0.4) 59 | ethon (0.15.0) 60 | ffi (>= 1.15.0) 61 | ffi (1.15.5) 62 | fourflusher (2.3.1) 63 | fuzzy_match (2.0.4) 64 | gh_inspector (1.1.3) 65 | httpclient (2.8.3) 66 | i18n (1.10.0) 67 | concurrent-ruby (~> 1.0) 68 | json (2.6.1) 69 | minitest (5.15.0) 70 | molinillo (0.8.0) 71 | nanaimo (0.3.0) 72 | nap (1.1.0) 73 | netrc (0.11.0) 74 | public_suffix (4.0.6) 75 | rexml (3.2.5) 76 | ruby-macho (2.5.1) 77 | typhoeus (1.4.0) 78 | ethon (>= 0.9.0) 79 | tzinfo (2.0.4) 80 | concurrent-ruby (~> 1.0) 81 | xcodeproj (1.21.0) 82 | CFPropertyList (>= 2.3.3, < 4.0) 83 | atomos (~> 0.1.3) 84 | claide (>= 1.0.2, < 2.0) 85 | colored2 (~> 3.1) 86 | nanaimo (~> 0.3.0) 87 | rexml (~> 3.2.4) 88 | zeitwerk (2.5.4) 89 | PLATFORMS 90 | ruby 91 | DEPENDENCIES 92 | cocoapods (~> 1.11, >= 1.11.2) 93 | RUBY VERSION 94 | ruby 2.7.4p191 95 | BUNDLED WITH 96 | 2.2.27 -------------------------------------------------------------------------------- /ios/rnui/AppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | 3 | #import 4 | #import 5 | #import 6 | 7 | // [react-native-performance] - start 8 | #import 9 | // [react-native-performance] - end 10 | 11 | #ifdef FB_SONARKIT_ENABLED 12 | #import 13 | #import 14 | #import 15 | #import 16 | #import 17 | #import 18 | 19 | static void InitializeFlipper(UIApplication *application) { 20 | FlipperClient *client = [FlipperClient sharedClient]; 21 | SKDescriptorMapper *layoutDescriptorMapper = [[SKDescriptorMapper alloc] initWithDefaults]; 22 | [client addPlugin:[[FlipperKitLayoutPlugin alloc] initWithRootNode:application withDescriptorMapper:layoutDescriptorMapper]]; 23 | [client addPlugin:[[FKUserDefaultsPlugin alloc] initWithSuiteName:nil]]; 24 | [client addPlugin:[FlipperKitReactPlugin new]]; 25 | [client addPlugin:[[FlipperKitNetworkPlugin alloc] initWithNetworkAdapter:[SKIOSNetworkAdapter new]]]; 26 | [client start]; 27 | } 28 | #endif 29 | 30 | @implementation AppDelegate 31 | 32 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 33 | { 34 | // [react-native-performance] - start 35 | [ReactNativePerformance onAppStarted]; 36 | // [react-native-performance] - end 37 | 38 | #ifdef FB_SONARKIT_ENABLED 39 | InitializeFlipper(application); 40 | #endif 41 | 42 | RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; 43 | RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge 44 | moduleName:@"rnui" 45 | initialProperties:nil]; 46 | 47 | if (@available(iOS 13.0, *)) { 48 | rootView.backgroundColor = [UIColor systemBackgroundColor]; 49 | } else { 50 | rootView.backgroundColor = [UIColor whiteColor]; 51 | } 52 | 53 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 54 | UIViewController *rootViewController = [UIViewController new]; 55 | rootViewController.view = rootView; 56 | self.window.rootViewController = rootViewController; 57 | [self.window makeKeyAndVisible]; 58 | return YES; 59 | } 60 | 61 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge 62 | { 63 | #if DEBUG 64 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; 65 | #else 66 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 67 | #endif 68 | } 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/RecentList.tsx: -------------------------------------------------------------------------------- 1 | import { AnimatedFlashList, ListRenderItem } from "@shopify/flash-list"; 2 | import { useRef } from "react"; 3 | import { Animated, StyleSheet, View } from "react-native"; 4 | import { mvs, s } from "react-native-size-matters/extend"; 5 | import { HEADER_HEIGHT_BASE, HEADER_HEIGHT_EXT } from "../assets/list-config"; 6 | import { ContactRowType, Recent, RECENT_LIST } from "../assets/contacts"; 7 | import { theme } from "../assets/theme"; 8 | import ContactHeader from "./ContactHeader"; 9 | import ContactItem from "./ContactItem"; 10 | import Header from "./Header"; 11 | 12 | const RecentList = () => { 13 | const scrollY = useRef(new Animated.Value(0)).current; 14 | const onScroll = Animated.event( 15 | [{ nativeEvent: { contentOffset: { y: scrollY } } }], 16 | { useNativeDriver: true }, 17 | ); 18 | 19 | const renderItem: ListRenderItem = ({ item }) => { 20 | switch (typeof item) { 21 | case "string": 22 | return ; 23 | case "object": 24 | return ( 25 | 29 | ); 30 | default: 31 | return null; 32 | } 33 | }; 34 | 35 | const getItemType = (item: Recent | string) => { 36 | return typeof item === "string" 37 | ? ContactRowType.Header 38 | : ContactRowType.Contact; 39 | }; 40 | 41 | const ListFooterComponent = () => ; 42 | 43 | return ( 44 | 45 |
46 | 47 | String(index)} 51 | renderItem={renderItem} 52 | getItemType={getItemType} 53 | ListFooterComponent={ListFooterComponent} 54 | onScroll={onScroll} 55 | showsVerticalScrollIndicator={false} 56 | scrollEventThrottle={16} 57 | contentContainerStyle={styles.content} 58 | /> 59 | 60 | 61 | ); 62 | }; 63 | 64 | const styles = StyleSheet.create({ 65 | container: { flex: 1 }, 66 | listContainer: { 67 | marginTop: HEADER_HEIGHT_BASE, 68 | flexGrow: 1, 69 | }, 70 | content: { paddingTop: HEADER_HEIGHT_EXT - s(100) }, 71 | section: { 72 | height: s(56), 73 | paddingLeft: s(14), 74 | justifyContent: "center", 75 | backgroundColor: theme.colors.background, 76 | }, 77 | sectionTitle: { 78 | fontSize: mvs(18), 79 | fontWeight: "500", 80 | color: theme.colors.white, 81 | }, 82 | }); 83 | 84 | export default RecentList; 85 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/ContactList.tsx: -------------------------------------------------------------------------------- 1 | import { AnimatedFlashList, ListRenderItem } from "@shopify/flash-list"; 2 | import { useRef } from "react"; 3 | import { Animated, StyleSheet, View } from "react-native"; 4 | import { mvs, s } from "react-native-size-matters/extend"; 5 | import { HEADER_HEIGHT_BASE, HEADER_HEIGHT_EXT } from "../assets/list-config"; 6 | import { 7 | ContactRowType, 8 | CONTACTS, 9 | CONTACT_LIST, 10 | OWNER, 11 | } from "../assets/contacts"; 12 | import { theme } from "../assets/theme"; 13 | import ContactHeader from "./ContactHeader"; 14 | import ContactItem from "./ContactItem"; 15 | import Header from "./Header"; 16 | import { Contact } from "./types"; 17 | 18 | const ContactList = () => { 19 | const scrollY = useRef(new Animated.Value(0)).current; 20 | const onScroll = Animated.event( 21 | [{ nativeEvent: { contentOffset: { y: scrollY } } }], 22 | { useNativeDriver: true }, 23 | ); 24 | 25 | const renderItem: ListRenderItem = ({ item }) => { 26 | switch (typeof item) { 27 | case "string": 28 | return ; 29 | case "object": 30 | return ; 31 | default: 32 | return null; 33 | } 34 | }; 35 | 36 | const getItemType = (item: Contact | string) => { 37 | return typeof item === "string" 38 | ? ContactRowType.Header 39 | : ContactRowType.Contact; 40 | }; 41 | 42 | const ListHeaderComponent = () => { 43 | return ; 44 | }; 45 | 46 | const ListFooterComponent = () => ; 47 | 48 | return ( 49 | 50 |
55 | 56 | String(index)} 60 | renderItem={renderItem} 61 | getItemType={getItemType} 62 | ListHeaderComponent={ListHeaderComponent} 63 | ListFooterComponent={ListFooterComponent} 64 | onScroll={onScroll} 65 | showsVerticalScrollIndicator={false} 66 | scrollEventThrottle={16} 67 | contentContainerStyle={styles.content} 68 | /> 69 | 70 | 71 | ); 72 | }; 73 | 74 | const styles = StyleSheet.create({ 75 | container: { flex: 1 }, 76 | listContainer: { 77 | marginTop: HEADER_HEIGHT_BASE, 78 | flexGrow: 1, 79 | }, 80 | content: { paddingTop: HEADER_HEIGHT_EXT }, 81 | section: { 82 | height: s(56), 83 | paddingLeft: s(14), 84 | justifyContent: "center", 85 | backgroundColor: theme.colors.background, 86 | }, 87 | sectionTitle: { 88 | fontSize: mvs(18), 89 | fontWeight: "500", 90 | color: theme.colors.white, 91 | }, 92 | }); 93 | 94 | export default ContactList; 95 | -------------------------------------------------------------------------------- /src/screens/adjustment-wheel-screen/components/Wheel.tsx: -------------------------------------------------------------------------------- 1 | import MaskedView from "@react-native-masked-view/masked-view"; 2 | import { FlashList, ListRenderItem } from "@shopify/flash-list"; 3 | import { StyleSheet, View } from "react-native"; 4 | import Animated, { useAnimatedScrollHandler } from "react-native-reanimated"; 5 | import { s } from "react-native-size-matters/extend"; 6 | import Icon from "react-native-vector-icons/Ionicons"; 7 | import { 8 | INITIAL_INDEX, 9 | ITEM_WIDTH, 10 | WHEEL, 11 | WHEEL_PADDING, 12 | WHEEL_WIDTH, 13 | } from "../assets/config"; 14 | import { theme } from "../assets/theme"; 15 | import Interval from "./Interval"; 16 | import { WheelProps } from "./types"; 17 | 18 | const AnimatedFlashList = Animated.createAnimatedComponent(FlashList); 19 | 20 | const Wheel = ({ scrollX, progress }: WheelProps) => { 21 | const scrollHandler = useAnimatedScrollHandler(event => { 22 | scrollX.value = event.contentOffset.x; 23 | }); 24 | 25 | const renderItem: ListRenderItem = ({ item, index }) => { 26 | return ; 27 | }; 28 | 29 | const maskElement = ( 30 | 31 | index} 38 | renderItem={renderItem} 39 | onScroll={scrollHandler} 40 | scrollEventThrottle={16} 41 | horizontal 42 | estimatedFirstItemOffset={0} 43 | showsHorizontalScrollIndicator={false} 44 | contentContainerStyle={styles.listContainer} 45 | /> 46 | 47 | 48 | 49 | 50 | ); 51 | return ( 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | ); 60 | }; 61 | 62 | const styles = StyleSheet.create({ 63 | container: { 64 | height: 114, 65 | alignItems: "center", 66 | justifyContent: "center", 67 | }, 68 | maskedView: { 69 | flex: 1, 70 | flexDirection: "row", 71 | justifyContent: "center", 72 | alignItems: "center", 73 | }, 74 | maskContainer: { 75 | width: WHEEL_WIDTH, 76 | }, 77 | sideMask: { 78 | height: 160, 79 | width: WHEEL_PADDING, 80 | backgroundColor: theme.colors.white, 81 | }, 82 | centralMask: { 83 | height: 160, 84 | zIndex: 1, 85 | width: ITEM_WIDTH, 86 | backgroundColor: theme.colors.blue, 87 | }, 88 | listContainer: { paddingHorizontal: WHEEL_PADDING }, 89 | pointer: { alignSelf: "center", paddingTop: 2 }, 90 | }); 91 | 92 | export default Wheel; 93 | -------------------------------------------------------------------------------- /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 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /ios/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/rnui/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.rnui; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | import com.facebook.react.PackageList; 6 | import com.facebook.react.ReactApplication; 7 | import com.facebook.react.ReactInstanceManager; 8 | import com.facebook.react.ReactNativeHost; 9 | import com.facebook.react.ReactPackage; 10 | import com.facebook.soloader.SoLoader; 11 | import com.shopify.reactnativeperformance.ReactNativePerformance; 12 | 13 | import java.lang.reflect.InvocationTargetException; 14 | import java.util.List; 15 | 16 | public class MainApplication extends Application implements ReactApplication { 17 | 18 | private final ReactNativeHost mReactNativeHost = 19 | new ReactNativeHost(this) { 20 | @Override 21 | public boolean getUseDeveloperSupport() { 22 | return BuildConfig.DEBUG; 23 | } 24 | 25 | @Override 26 | protected List getPackages() { 27 | @SuppressWarnings("UnnecessaryLocalVariable") 28 | List packages = new PackageList(this).getPackages(); 29 | // Packages that cannot be autolinked yet can be added manually here, for example: 30 | // packages.add(new MyReactNativePackage()); 31 | return packages; 32 | } 33 | 34 | @Override 35 | protected String getJSMainModuleName() { 36 | return "index"; 37 | } 38 | }; 39 | 40 | @Override 41 | public ReactNativeHost getReactNativeHost() { 42 | return mReactNativeHost; 43 | } 44 | 45 | @Override 46 | public void onCreate() { 47 | // [react-native-performance] - start 48 | ReactNativePerformance.onAppStarted(); 49 | // [react-native-performance] - end 50 | super.onCreate(); 51 | SoLoader.init(this, /* native exopackage */ false); 52 | initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 53 | } 54 | 55 | /** 56 | * Loads Flipper in React Native templates. Call this in the onCreate method with something like 57 | * initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 58 | * 59 | * @param context 60 | * @param reactInstanceManager 61 | */ 62 | private static void initializeFlipper( 63 | Context context, ReactInstanceManager reactInstanceManager) { 64 | if (BuildConfig.DEBUG) { 65 | try { 66 | /* 67 | We use reflection here to pick up the class that initializes Flipper, 68 | since Flipper library is not available in release mode 69 | */ 70 | Class aClass = Class.forName("com.rnui.ReactNativeFlipper"); 71 | aClass 72 | .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) 73 | .invoke(null, context, reactInstanceManager); 74 | } catch (ClassNotFoundException e) { 75 | e.printStackTrace(); 76 | } catch (NoSuchMethodException e) { 77 | e.printStackTrace(); 78 | } catch (IllegalAccessException e) { 79 | e.printStackTrace(); 80 | } catch (InvocationTargetException e) { 81 | e.printStackTrace(); 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /android/app/src/debug/java/com/rnui/ReactNativeFlipper.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | *

This source code is licensed under the MIT license found in the LICENSE file in the root 5 | * directory of this source tree. 6 | */ 7 | package com.rnui; 8 | 9 | import android.content.Context; 10 | import com.facebook.flipper.android.AndroidFlipperClient; 11 | import com.facebook.flipper.android.utils.FlipperUtils; 12 | import com.facebook.flipper.core.FlipperClient; 13 | import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; 14 | import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; 15 | import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; 16 | import com.facebook.flipper.plugins.inspector.DescriptorMapping; 17 | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; 18 | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; 19 | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; 20 | import com.facebook.flipper.plugins.react.ReactFlipperPlugin; 21 | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; 22 | import com.facebook.react.ReactInstanceManager; 23 | import com.facebook.react.bridge.ReactContext; 24 | import com.facebook.react.modules.network.NetworkingModule; 25 | import okhttp3.OkHttpClient; 26 | 27 | public class ReactNativeFlipper { 28 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { 29 | if (FlipperUtils.shouldEnableFlipper(context)) { 30 | final FlipperClient client = AndroidFlipperClient.getInstance(context); 31 | 32 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); 33 | client.addPlugin(new ReactFlipperPlugin()); 34 | client.addPlugin(new DatabasesFlipperPlugin(context)); 35 | client.addPlugin(new SharedPreferencesFlipperPlugin(context)); 36 | client.addPlugin(CrashReporterPlugin.getInstance()); 37 | 38 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); 39 | NetworkingModule.setCustomClientBuilder( 40 | new NetworkingModule.CustomClientBuilder() { 41 | @Override 42 | public void apply(OkHttpClient.Builder builder) { 43 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); 44 | } 45 | }); 46 | client.addPlugin(networkFlipperPlugin); 47 | client.start(); 48 | 49 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized 50 | // Hence we run if after all native modules have been initialized 51 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); 52 | if (reactContext == null) { 53 | reactInstanceManager.addReactInstanceEventListener( 54 | new ReactInstanceManager.ReactInstanceEventListener() { 55 | @Override 56 | public void onReactContextInitialized(ReactContext reactContext) { 57 | reactInstanceManager.removeReactInstanceEventListener(this); 58 | reactContext.runOnNativeModulesQueueThread( 59 | new Runnable() { 60 | @Override 61 | public void run() { 62 | client.addPlugin(new FrescoFlipperPlugin()); 63 | } 64 | }); 65 | } 66 | }); 67 | } else { 68 | client.addPlugin(new FrescoFlipperPlugin()); 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /ios/rnui.xcodeproj/xcshareddata/xcschemes/rnui.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 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/components/Header.tsx: -------------------------------------------------------------------------------- 1 | import { Animated, StyleSheet, Text, View } from "react-native"; 2 | import { mvs, s } from "react-native-size-matters/extend"; 3 | import Icon from "react-native-vector-icons/Ionicons"; 4 | import { 5 | HEADER_HEIGHT_BASE, 6 | HEADER_HEIGHT_EXT, 7 | HEADER_TITLE_WIDTH, 8 | } from "../assets/list-config"; 9 | import { theme } from "../assets/theme"; 10 | import { HeaderProps } from "./types"; 11 | 12 | const AnimatedText = Animated.createAnimatedComponent(Text); 13 | 14 | const Header = ({ title, subtitle, scrollY }: HeaderProps) => { 15 | const titleContainerTY = scrollY.interpolate({ 16 | inputRange: [-1, 0, HEADER_HEIGHT_EXT], 17 | outputRange: [0.9, 0, mvs(-56)], 18 | extrapolateRight: "clamp", 19 | }); 20 | 21 | const titleScale = scrollY.interpolate({ 22 | inputRange: [-s(150), 0, HEADER_HEIGHT_EXT], 23 | outputRange: [1.06, 1, 0.55], 24 | extrapolateRight: "clamp", 25 | }); 26 | 27 | const subtitleTY = scrollY.interpolate({ 28 | inputRange: [0, HEADER_HEIGHT_EXT], 29 | outputRange: [0, mvs(-15)], 30 | extrapolateRight: "clamp", 31 | }); 32 | 33 | const buttonsTY = scrollY.interpolate({ 34 | inputRange: [0, HEADER_HEIGHT_EXT], 35 | outputRange: [0, -HEADER_HEIGHT_EXT], 36 | extrapolateRight: "clamp", 37 | }); 38 | 39 | return ( 40 | 41 | 48 | 59 | {title} 60 | 61 | 66 | {subtitle} 67 | 68 | 69 | 70 | 77 | 78 | 84 | 85 | 86 | ); 87 | }; 88 | 89 | const styles = StyleSheet.create({ 90 | container: { 91 | height: HEADER_HEIGHT_BASE + HEADER_HEIGHT_EXT, 92 | width: "100%", 93 | paddingTop: mvs(60), 94 | paddingLeft: s(20), 95 | position: "absolute", 96 | justifyContent: "space-between", 97 | }, 98 | titleContainer: { width: HEADER_TITLE_WIDTH }, 99 | title: { color: "white", fontSize: mvs(50), fontWeight: "700" }, 100 | subtitle: { 101 | color: theme.colors.blueGray, 102 | fontSize: mvs(15), 103 | marginTop: mvs(2), 104 | }, 105 | buttons: { 106 | flexDirection: "row", 107 | alignItems: "center", 108 | alignSelf: "flex-end", 109 | marginBottom: s(13), 110 | paddingRight: s(24), 111 | }, 112 | spacer: { 113 | marginLeft: s(33), 114 | }, 115 | }); 116 | 117 | export default Header; 118 | -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/AppleWalletScreen.tsx: -------------------------------------------------------------------------------- 1 | import { StatusBar, StyleSheet } from "react-native"; 2 | import { theme } from "./assets/theme"; 3 | import Animated, { 4 | useSharedValue, 5 | useAnimatedStyle, 6 | useAnimatedScrollHandler, 7 | interpolate, 8 | Extrapolation, 9 | } from "react-native-reanimated"; 10 | import Routes from "@navigation/routes"; 11 | import Card from "./components/Card"; 12 | import SwipeGesture from "./components/SwipeGesture"; 13 | import { metrics } from "@constants/metrics"; 14 | import { useSafeAreaInsets } from "react-native-safe-area-context"; 15 | import { PerformanceMeasureView } from "@shopify/react-native-performance"; 16 | import { 17 | BACK_BUTTON_HEIGHT, 18 | CARDS, 19 | CARD_HEIGHT_CLOSED, 20 | CARD_MARGIN, 21 | } from "./assets/config"; 22 | import { BackButton } from "@components/buttons"; 23 | import { globalTheme } from "@assets/globalTheme"; 24 | import { s } from "react-native-size-matters/extend"; 25 | 26 | const AppleWalletScreen = () => { 27 | const insets = useSafeAreaInsets(); 28 | const selectedCard = useSharedValue(-1); 29 | const swipeY = useSharedValue(0); 30 | const scrollY = useSharedValue(0); 31 | const onScroll = useAnimatedScrollHandler( 32 | e => (scrollY.value = e.contentOffset.y), 33 | ); 34 | const inTransition = useSharedValue(0); 35 | 36 | const scrollContainerStyle = metrics.isIOS 37 | ? useAnimatedStyle(() => { 38 | return { 39 | transform: [ 40 | { 41 | translateY: interpolate( 42 | scrollY.value, 43 | [-metrics.screenHeight / 2, 0], 44 | [-metrics.screenHeight / 2, 0], 45 | Extrapolation.CLAMP, 46 | ), 47 | }, 48 | ], 49 | }; 50 | }) 51 | : null; 52 | 53 | return ( 54 | 55 | 56 | 57 | 71 | 72 | {CARDS.map((e, i) => ( 73 | 79 | ))} 80 | 81 | 82 | 83 | 88 | 89 | ); 90 | }; 91 | 92 | const styles = StyleSheet.create({ 93 | container: { 94 | flex: 1, 95 | backgroundColor: theme.colors.background, 96 | paddingHorizontal: 16, 97 | }, 98 | backButton: { 99 | height: BACK_BUTTON_HEIGHT, 100 | width: BACK_BUTTON_HEIGHT, 101 | backgroundColor: globalTheme.colors.transWhite, 102 | borderRadius: 17, 103 | }, 104 | }); 105 | 106 | export default AppleWalletScreen; 107 | -------------------------------------------------------------------------------- /src/screens/contact-list-screen/assets/contacts.ts: -------------------------------------------------------------------------------- 1 | import { Contact } from "../components/types"; 2 | import { theme } from "./theme"; 3 | 4 | export const OWNER = { 5 | firstName: "Minh", 6 | lastName: "Pham", 7 | image: require("../assets/avatars/owner.jpg"), 8 | email: "minhpham.design@gmail.com", 9 | }; 10 | 11 | export const CONTACTS: { [key: number]: Contact } = { 12 | 0: { 13 | firstName: "Albert", 14 | lastName: "Dera", 15 | image: require("../assets/avatars/avatar3.jpg"), 16 | phoneNumber: "646566668", 17 | }, 18 | 1: { 19 | firstName: "Amber", 20 | lastName: "Zhu", 21 | color: theme.colors.greenBlueLight, 22 | phoneNumber: "455667900", 23 | }, 24 | 2: { 25 | firstName: "Andre", 26 | lastName: "Val", 27 | color: theme.colors.blueMid, 28 | phoneNumber: "455667900", 29 | }, 30 | 3: { 31 | firstName: "Ben", 32 | lastName: "Steward", 33 | color: theme.colors.yellow, 34 | phoneNumber: "755533868", 35 | }, 36 | 4: { 37 | firstName: "Blaise", 38 | lastName: "Ortiz", 39 | color: theme.colors.green, 40 | phoneNumber: "455037068", 41 | }, 42 | 5: { 43 | firstName: "Dad", 44 | color: theme.colors.blueMidDark, 45 | phoneNumber: "646537860", 46 | }, 47 | 6: { 48 | firstName: "Daniel", 49 | lastName: "Ingram", 50 | color: theme.colors.blueDark, 51 | phoneNumber: "646537860", 52 | }, 53 | 7: { 54 | firstName: "Kenadee", 55 | lastName: "Neal", 56 | image: require("../assets/avatars/avatar2.jpg"), 57 | phoneNumber: "646499032", 58 | }, 59 | 8: { 60 | firstName: "Kiara", 61 | color: theme.colors.greenBlueMidDark, 62 | phoneNumber: "646537860", 63 | }, 64 | 9: { 65 | firstName: "Larry", 66 | lastName: "J", 67 | image: require("../assets/avatars/avatar1.jpg"), 68 | phoneNumber: "646646646", 69 | }, 70 | 10: { 71 | firstName: "Mom", 72 | color: theme.colors.blueLight, 73 | phoneNumber: "646486122", 74 | }, 75 | 11: { 76 | firstName: "Monroe", 77 | lastName: "Hampton", 78 | color: theme.colors.greenBlueDark, 79 | phoneNumber: "646333444", 80 | }, 81 | 12: { 82 | firstName: "Russel", 83 | lastName: "Moreno", 84 | color: theme.colors.azure, 85 | phoneNumber: "650331424", 86 | }, 87 | 13: { 88 | firstName: "Work Office", 89 | color: theme.colors.orange, 90 | phoneNumber: "646537860", 91 | }, 92 | }; 93 | 94 | export const FAVORITES = [ 95 | CONTACTS[9], 96 | CONTACTS[3], 97 | CONTACTS[10], 98 | CONTACTS[5], 99 | CONTACTS[7], 100 | CONTACTS[12], 101 | CONTACTS[13], 102 | CONTACTS[0], 103 | CONTACTS[11], 104 | CONTACTS[8], 105 | CONTACTS[1], 106 | CONTACTS[6], 107 | ]; 108 | 109 | export enum ContactRowType { 110 | Header, 111 | Contact, 112 | } 113 | 114 | export const CONTACT_LIST = [ 115 | "A", 116 | CONTACTS[0], 117 | CONTACTS[1], 118 | CONTACTS[2], 119 | "B", 120 | CONTACTS[3], 121 | CONTACTS[4], 122 | "D", 123 | CONTACTS[5], 124 | CONTACTS[6], 125 | "K", 126 | CONTACTS[7], 127 | CONTACTS[8], 128 | "L", 129 | CONTACTS[9], 130 | "M", 131 | CONTACTS[10], 132 | CONTACTS[11], 133 | "R", 134 | CONTACTS[12], 135 | "W", 136 | CONTACTS[13], 137 | ]; 138 | 139 | export type Recent = { 140 | contact: Contact; 141 | missed: boolean; 142 | }; 143 | 144 | export const RECENT_LIST = [ 145 | "Today", 146 | { contact: CONTACTS[9], missed: true }, 147 | { contact: CONTACTS[11], missed: false }, 148 | { contact: CONTACTS[13], missed: false }, 149 | "Yesterday", 150 | { contact: CONTACTS[3], missed: false }, 151 | { contact: CONTACTS[4], missed: false }, 152 | "01/12/23", 153 | { contact: CONTACTS[5], missed: false }, 154 | { contact: CONTACTS[6], missed: true }, 155 | "01/8/23", 156 | { contact: CONTACTS[7], missed: false }, 157 | { contact: CONTACTS[8], missed: false }, 158 | "01/6/23", 159 | { contact: CONTACTS[5], missed: false }, 160 | { contact: CONTACTS[11], missed: true }, 161 | ]; 162 | -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/assets/config.ts: -------------------------------------------------------------------------------- 1 | import { metrics } from "@constants/metrics"; 2 | import { mvs, s } from "react-native-size-matters/extend"; 3 | import { CardContentProps } from "./types"; 4 | 5 | export const CARD_HEIGHT_CLOSED = s(224); 6 | export const CARD_HEIGHT_OPEN = s(590); 7 | export const CARD_IMAGE_HEIGTH = s(165); 8 | export const CARD_HEADER_HEIGHT = s(59); 9 | export const CARD_MARGIN = mvs(70); 10 | export const BACK_BUTTON_HEIGHT = s(40); 11 | export const CLOSE_THRESHOLD = metrics.screenHeight * 0.11; 12 | 13 | export const SPRING_CONFIG = { 14 | OPEN: { 15 | mass: 0.8, 16 | stiffness: 80, 17 | }, 18 | CLOSE: { 19 | mass: 0.8, 20 | damping: 11, 21 | stiffness: 87, 22 | }, 23 | SWIPE: { 24 | mass: 0.7, 25 | stiffness: 80, 26 | }, 27 | }; 28 | 29 | export const CARDS: CardContentProps[] = [ 30 | { 31 | title: "GameHub", 32 | headerField: { 33 | label: "Points", 34 | value: "1337", 35 | }, 36 | auxiliaryField: { 37 | label: "Name", 38 | value: "John Doe", 39 | }, 40 | secondaryField: { 41 | label: "Member ID", 42 | value: "GH-007", 43 | }, 44 | tertiaryField: { 45 | label: "Member since", 46 | value: "2017", 47 | }, 48 | image: require("./images/card1.png"), 49 | bg: "#007A96", 50 | }, 51 | { 52 | title: "Sky Train", 53 | headerField: { 54 | label: "Balance", 55 | value: "$102", 56 | }, 57 | auxiliaryField: { 58 | label: "Name", 59 | value: "John Doe", 60 | }, 61 | secondaryField: { 62 | label: "Member ID", 63 | value: "ST-845037", 64 | }, 65 | tertiaryField: { 66 | label: "Member since", 67 | value: "2017", 68 | }, 69 | image: require("./images/card2.png"), 70 | bg: "#9C312D", 71 | }, 72 | { 73 | title: "Vintage Blooms", 74 | headerField: { 75 | label: "Tier", 76 | value: "Gold", 77 | }, 78 | auxiliaryField: { 79 | label: "Name", 80 | value: "John Doe", 81 | }, 82 | secondaryField: { 83 | label: "Member ID", 84 | value: "VB-338", 85 | }, 86 | tertiaryField: { 87 | label: "Member since", 88 | value: "2017", 89 | }, 90 | image: require("./images/card3.png"), 91 | bg: "#1D8F88", 92 | }, 93 | { 94 | title: "Metro", 95 | headerField: { 96 | label: "Balance", 97 | value: "$37.02", 98 | }, 99 | auxiliaryField: { 100 | label: "Name", 101 | value: "John Doe", 102 | }, 103 | secondaryField: { 104 | label: "Member ID", 105 | value: "M-76430", 106 | }, 107 | tertiaryField: { 108 | label: "Member since", 109 | value: "2017", 110 | }, 111 | image: require("./images/card4.png"), 112 | bg: "#179C60", 113 | }, 114 | { 115 | title: "Higher Grounds", 116 | headerField: { 117 | label: "Points", 118 | value: "1900", 119 | }, 120 | auxiliaryField: { 121 | label: "Name", 122 | value: "John Doe", 123 | }, 124 | secondaryField: { 125 | label: "Member ID", 126 | value: "GR-2728", 127 | }, 128 | tertiaryField: { 129 | label: "Member since", 130 | value: "2017", 131 | }, 132 | image: require("./images/card5.png"), 133 | bg: "#764133", 134 | }, 135 | { 136 | title: "Dreamcatchers", 137 | headerField: { 138 | label: "Tier", 139 | value: "Silver", 140 | }, 141 | auxiliaryField: { 142 | label: "Name", 143 | value: "John Doe", 144 | }, 145 | secondaryField: { 146 | label: "Member ID", 147 | value: "DC-1303", 148 | }, 149 | tertiaryField: { 150 | label: "Member since", 151 | value: "2017", 152 | }, 153 | image: require("./images/card7.png"), 154 | bg: "#2B6391", 155 | }, 156 | { 157 | title: "Waves", 158 | headerField: { 159 | label: "Valid Till", 160 | value: "12/25", 161 | }, 162 | auxiliaryField: { 163 | label: "Name", 164 | value: "John Doe", 165 | }, 166 | secondaryField: { 167 | label: "Member ID", 168 | value: "W-76235", 169 | }, 170 | tertiaryField: { 171 | label: "Member since", 172 | value: "2017", 173 | }, 174 | image: require("./images/card6.png"), 175 | bg: "#41A02F", 176 | }, 177 | ]; 178 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or 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 UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /src/screens/apple-wallet-screen/components/Card.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | View, 3 | Text, 4 | StyleSheet, 5 | TouchableWithoutFeedback, 6 | Image, 7 | } from "react-native"; 8 | import Animated, { 9 | useSharedValue, 10 | useAnimatedStyle, 11 | withSpring, 12 | withTiming, 13 | withDelay, 14 | Easing, 15 | useAnimatedReaction, 16 | interpolate, 17 | Extrapolation, 18 | } from "react-native-reanimated"; 19 | import { mvs, s } from "react-native-size-matters/extend"; 20 | import { metrics } from "@constants/metrics"; 21 | import { 22 | BACK_BUTTON_HEIGHT, 23 | CARD_HEADER_HEIGHT, 24 | CARD_HEIGHT_CLOSED, 25 | CARD_HEIGHT_OPEN, 26 | CARD_IMAGE_HEIGTH, 27 | CARD_MARGIN, 28 | SPRING_CONFIG, 29 | } from "../assets/config"; 30 | import { theme } from "../assets/theme"; 31 | import { CardProps } from "../assets/types"; 32 | import { Flex } from "@components/index"; 33 | 34 | const Card = ({ 35 | item, 36 | index, 37 | selectedCard, 38 | scrollY, 39 | swipeY, 40 | inTransition, 41 | }: CardProps) => { 42 | const animatedHeight = useSharedValue(CARD_HEIGHT_CLOSED); 43 | const transY = useSharedValue(0); 44 | const scale = useSharedValue(1); 45 | const marginTop = index * CARD_MARGIN; 46 | const spread = 70 * index; 47 | const spreadOffset = Math.min(2.5 * index * index, spread); 48 | 49 | const animatedStyle = useAnimatedStyle(() => { 50 | return { 51 | height: animatedHeight.value, 52 | opacity: interpolate( 53 | scale.value, 54 | [0.9, 0.95], 55 | [0, 1], 56 | Extrapolation.CLAMP, 57 | ), 58 | transform: [ 59 | { 60 | translateY: interpolate( 61 | scrollY.value, 62 | [-metrics.screenHeight, 0], 63 | [50 + spread - spreadOffset, 0], 64 | Extrapolation.CLAMP, 65 | ), 66 | }, 67 | { translateY: transY.value }, 68 | { 69 | scale: scale.value, 70 | }, 71 | ], 72 | }; 73 | }); 74 | 75 | useAnimatedReaction( 76 | () => swipeY.value, 77 | (current, previous) => { 78 | if (selectedCard.value === index) { 79 | transY.value = transY.value + current - (previous ?? 0); 80 | } 81 | }, 82 | ); 83 | 84 | useAnimatedReaction( 85 | () => selectedCard.value, 86 | (currentSelection, previousSelection) => { 87 | if (selectedCard.value !== -1) { 88 | const isSelected = selectedCard.value === index; 89 | const slideUp = currentSelection >= index; 90 | const animateToValue = slideUp 91 | ? scrollY.value - marginTop 92 | : scrollY.value + 93 | metrics.screenHeight - 94 | marginTop - 95 | BACK_BUTTON_HEIGHT; 96 | 97 | transY.value = isSelected 98 | ? withSpring(animateToValue, SPRING_CONFIG.OPEN) 99 | : withTiming(animateToValue); 100 | 101 | if (isSelected) { 102 | animatedHeight.value = withTiming(CARD_HEIGHT_OPEN); 103 | } else { 104 | slideUp && (scale.value = withTiming(0.9)); 105 | } 106 | } else { 107 | if (previousSelection === index) { 108 | transY.value = withSpring(0, SPRING_CONFIG.CLOSE); 109 | } else { 110 | const wasAbove = (previousSelection ?? 0) > index; 111 | transY.value = withDelay( 112 | wasAbove ? 100 : 300, 113 | withTiming(0, { 114 | easing: Easing.out(Easing.quad), 115 | }), 116 | ); 117 | wasAbove && (scale.value = withTiming(1)); 118 | } 119 | 120 | animatedHeight.value > CARD_HEIGHT_CLOSED && 121 | (animatedHeight.value = withTiming(CARD_HEIGHT_CLOSED)); 122 | } 123 | }, 124 | ); 125 | 126 | const handleCardPress = () => { 127 | if (selectedCard.value === -1 && !inTransition.value) { 128 | selectedCard.value = index; 129 | } 130 | }; 131 | 132 | return ( 133 | 134 | 143 | 144 | {item.title} 145 | 146 | {item.headerField.label} 147 | {item.headerField.value} 148 | 149 | 150 | 151 | 152 | 153 | 154 | {item.auxiliaryField.label} 155 | 156 | {item.auxiliaryField.value} 157 | 158 | 159 | 160 | 161 | 162 | 163 | {item.secondaryField.label} 164 | 165 | 166 | {item.secondaryField.value} 167 | 168 | 169 | 170 | 171 | 172 | {item.tertiaryField.label} 173 | 174 | 175 | {item.tertiaryField.value} 176 | 177 | 178 | 179 | 180 | 181 | 182 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | ); 193 | }; 194 | 195 | const styles = StyleSheet.create({ 196 | cardContainer: { 197 | borderRadius: 12, 198 | position: "absolute", 199 | width: "100%", 200 | overflow: "hidden", 201 | }, 202 | cardSubContainer: { 203 | paddingHorizontal: s(16), 204 | paddingBottom: s(16), 205 | height: CARD_HEIGHT_OPEN - CARD_HEADER_HEIGHT - CARD_IMAGE_HEIGTH, 206 | }, 207 | title: { 208 | fontSize: mvs(18), 209 | fontWeight: "bold", 210 | color: theme.colors.white, 211 | }, 212 | headerContainer: { 213 | flexDirection: "row", 214 | alignItems: "center", 215 | justifyContent: "space-between", 216 | paddingHorizontal: s(16), 217 | height: CARD_HEADER_HEIGHT, 218 | }, 219 | headerSubcontainer: { 220 | alignItems: "center", 221 | }, 222 | fieldSpacer: { marginTop: s(32) }, 223 | stContainer: { flexDirection: "row", justifyContent: "space-between" }, 224 | fieldLabel: { 225 | fontSize: mvs(11), 226 | fontWeight: "600", 227 | color: theme.colors.white, 228 | textTransform: "uppercase", 229 | }, 230 | fieldValue: { 231 | fontSize: mvs(21), 232 | color: theme.colors.white, 233 | }, 234 | image: { 235 | height: CARD_IMAGE_HEIGTH, 236 | width: "100%", 237 | }, 238 | qrContainer: { 239 | alignSelf: "center", 240 | padding: s(8), 241 | backgroundColor: theme.colors.white, 242 | borderRadius: s(6), 243 | }, 244 | qr: { width: s(140), height: s(140) }, 245 | borderOverlay: { 246 | ...StyleSheet.absoluteFillObject, 247 | position: "absolute", 248 | borderRadius: 12, 249 | borderWidth: 1, 250 | borderColor: theme.colors.border, 251 | }, 252 | }); 253 | 254 | export default Card; 255 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation. If none specified and 19 | * // "index.android.js" exists, it will be used. Otherwise "index.js" is 20 | * // default. Can be overridden with ENTRY_FILE environment variable. 21 | * entryFile: "index.android.js", 22 | * 23 | * // https://reactnative.dev/docs/performance#enable-the-ram-format 24 | * bundleCommand: "ram-bundle", 25 | * 26 | * // whether to bundle JS and assets in debug mode 27 | * bundleInDebug: false, 28 | * 29 | * // whether to bundle JS and assets in release mode 30 | * bundleInRelease: true, 31 | * 32 | * // whether to bundle JS and assets in another build variant (if configured). 33 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 34 | * // The configuration property can be in the following formats 35 | * // 'bundleIn${productFlavor}${buildType}' 36 | * // 'bundleIn${buildType}' 37 | * // bundleInFreeDebug: true, 38 | * // bundleInPaidRelease: true, 39 | * // bundleInBeta: true, 40 | * 41 | * // whether to disable dev mode in custom build variants (by default only disabled in release) 42 | * // for example: to disable dev mode in the staging build type (if configured) 43 | * devDisabledInStaging: true, 44 | * // The configuration property can be in the following formats 45 | * // 'devDisabledIn${productFlavor}${buildType}' 46 | * // 'devDisabledIn${buildType}' 47 | * 48 | * // the root of your project, i.e. where "package.json" lives 49 | * root: "../../", 50 | * 51 | * // where to put the JS bundle asset in debug mode 52 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 53 | * 54 | * // where to put the JS bundle asset in release mode 55 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 56 | * 57 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 58 | * // require('./image.png')), in debug mode 59 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 60 | * 61 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 62 | * // require('./image.png')), in release mode 63 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 64 | * 65 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 66 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 67 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 68 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 69 | * // for example, you might want to remove it from here. 70 | * inputExcludes: ["android/**", "ios/**"], 71 | * 72 | * // override which node gets called and with what additional arguments 73 | * nodeExecutableAndArgs: ["node"], 74 | * 75 | * // supply additional arguments to the packager 76 | * extraPackagerArgs: [] 77 | * ] 78 | */ 79 | 80 | project.ext.react = [ 81 | enableHermes: true, // clean and rebuild if changing 82 | ] 83 | 84 | apply from: "../../node_modules/react-native/react.gradle" 85 | 86 | /** 87 | * Set this to true to create two separate APKs instead of one: 88 | * - An APK that only works on ARM devices 89 | * - An APK that only works on x86 devices 90 | * The advantage is the size of the APK is reduced by about 4MB. 91 | * Upload all the APKs to the Play Store and people will download 92 | * the correct one based on the CPU architecture of their device. 93 | */ 94 | def enableSeparateBuildPerCPUArchitecture = false 95 | 96 | /** 97 | * Run Proguard to shrink the Java bytecode in release builds. 98 | */ 99 | def enableProguardInReleaseBuilds = false 100 | 101 | /** 102 | * The preferred build flavor of JavaScriptCore. 103 | * 104 | * For example, to use the international variant, you can use: 105 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` 106 | * 107 | * The international variant includes ICU i18n library and necessary data 108 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that 109 | * give correct results when using with locales other than en-US. Note that 110 | * this variant is about 6MiB larger per architecture than default. 111 | */ 112 | def jscFlavor = 'org.webkit:android-jsc:+' 113 | 114 | /** 115 | * Whether to enable the Hermes VM. 116 | * 117 | * This should be set on project.ext.react and that value will be read here. If it is not set 118 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode 119 | * and the benefits of using Hermes will therefore be sharply reduced. 120 | */ 121 | def enableHermes = project.ext.react.get("enableHermes", true); 122 | 123 | /** 124 | * Architectures to build native code for in debug. 125 | */ 126 | def nativeArchitectures = project.getProperties().get("reactNativeDebugArchitectures") 127 | 128 | android { 129 | ndkVersion rootProject.ext.ndkVersion 130 | 131 | compileSdkVersion rootProject.ext.compileSdkVersion 132 | 133 | defaultConfig { 134 | applicationId "maxim.rnui.app" 135 | minSdkVersion rootProject.ext.minSdkVersion 136 | targetSdkVersion rootProject.ext.targetSdkVersion 137 | versionCode 1 138 | versionName "1.0" 139 | } 140 | splits { 141 | abi { 142 | reset() 143 | enable enableSeparateBuildPerCPUArchitecture 144 | universalApk false // If true, also generate a universal APK 145 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" 146 | } 147 | } 148 | signingConfigs { 149 | debug { 150 | storeFile file('debug.keystore') 151 | storePassword 'android' 152 | keyAlias 'androiddebugkey' 153 | keyPassword 'android' 154 | } 155 | } 156 | buildTypes { 157 | debug { 158 | signingConfig signingConfigs.debug 159 | if (nativeArchitectures) { 160 | ndk { 161 | abiFilters nativeArchitectures.split(',') 162 | } 163 | } 164 | } 165 | release { 166 | // Caution! In production, you need to generate your own keystore file. 167 | // see https://reactnative.dev/docs/signed-apk-android. 168 | signingConfig signingConfigs.debug 169 | minifyEnabled enableProguardInReleaseBuilds 170 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 171 | } 172 | } 173 | 174 | // applicationVariants are e.g. debug, release 175 | applicationVariants.all { variant -> 176 | variant.outputs.each { output -> 177 | // For each separate APK per architecture, set a unique version code as described here: 178 | // https://developer.android.com/studio/build/configure-apk-splits.html 179 | // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. 180 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] 181 | def abi = output.getFilter(OutputFile.ABI) 182 | if (abi != null) { // null for the universal-debug, universal-release variants 183 | output.versionCodeOverride = 184 | defaultConfig.versionCode * 1000 + versionCodes.get(abi) 185 | } 186 | 187 | } 188 | } 189 | } 190 | 191 | dependencies { 192 | implementation fileTree(dir: "libs", include: ["*.jar"]) 193 | //noinspection GradleDynamicVersion 194 | implementation "com.facebook.react:react-native:0.67.4!!" // From node_modules 195 | 196 | implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" 197 | 198 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { 199 | exclude group:'com.facebook.fbjni' 200 | } 201 | 202 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { 203 | exclude group:'com.facebook.flipper' 204 | exclude group:'com.squareup.okhttp3', module:'okhttp' 205 | } 206 | 207 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { 208 | exclude group:'com.facebook.flipper' 209 | } 210 | 211 | if (enableHermes) { 212 | def hermesPath = "../../node_modules/hermes-engine/android/"; 213 | debugImplementation files(hermesPath + "hermes-debug.aar") 214 | releaseImplementation files(hermesPath + "hermes-release.aar") 215 | } else { 216 | implementation jscFlavor 217 | } 218 | } 219 | 220 | // Run this once to be able to run the application with BUCK 221 | // puts all compile dependencies into folder libs for BUCK to use 222 | task copyDownloadableDepsToLibs(type: Copy) { 223 | from configurations.implementation 224 | into 'libs' 225 | } 226 | 227 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) 228 | -------------------------------------------------------------------------------- /ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - boost (1.76.0) 3 | - CocoaAsyncSocket (7.6.5) 4 | - DoubleConversion (1.1.6) 5 | - FBLazyVector (0.67.4) 6 | - FBReactNativeSpec (0.67.4): 7 | - RCT-Folly (= 2021.06.28.00-v2) 8 | - RCTRequired (= 0.67.4) 9 | - RCTTypeSafety (= 0.67.4) 10 | - React-Core (= 0.67.4) 11 | - React-jsi (= 0.67.4) 12 | - ReactCommon/turbomodule/core (= 0.67.4) 13 | - Flipper (0.99.0): 14 | - Flipper-Folly (~> 2.6) 15 | - Flipper-RSocket (~> 1.4) 16 | - Flipper-Boost-iOSX (1.76.0.1.11) 17 | - Flipper-DoubleConversion (3.1.7) 18 | - Flipper-Fmt (7.1.7) 19 | - Flipper-Folly (2.6.7): 20 | - Flipper-Boost-iOSX 21 | - Flipper-DoubleConversion 22 | - Flipper-Fmt (= 7.1.7) 23 | - Flipper-Glog 24 | - libevent (~> 2.1.12) 25 | - OpenSSL-Universal (= 1.1.180) 26 | - Flipper-Glog (0.3.6) 27 | - Flipper-PeerTalk (0.0.4) 28 | - Flipper-RSocket (1.4.3): 29 | - Flipper-Folly (~> 2.6) 30 | - FlipperKit (0.99.0): 31 | - FlipperKit/Core (= 0.99.0) 32 | - FlipperKit/Core (0.99.0): 33 | - Flipper (~> 0.99.0) 34 | - FlipperKit/CppBridge 35 | - FlipperKit/FBCxxFollyDynamicConvert 36 | - FlipperKit/FBDefines 37 | - FlipperKit/FKPortForwarding 38 | - FlipperKit/CppBridge (0.99.0): 39 | - Flipper (~> 0.99.0) 40 | - FlipperKit/FBCxxFollyDynamicConvert (0.99.0): 41 | - Flipper-Folly (~> 2.6) 42 | - FlipperKit/FBDefines (0.99.0) 43 | - FlipperKit/FKPortForwarding (0.99.0): 44 | - CocoaAsyncSocket (~> 7.6) 45 | - Flipper-PeerTalk (~> 0.0.4) 46 | - FlipperKit/FlipperKitHighlightOverlay (0.99.0) 47 | - FlipperKit/FlipperKitLayoutHelpers (0.99.0): 48 | - FlipperKit/Core 49 | - FlipperKit/FlipperKitHighlightOverlay 50 | - FlipperKit/FlipperKitLayoutTextSearchable 51 | - FlipperKit/FlipperKitLayoutIOSDescriptors (0.99.0): 52 | - FlipperKit/Core 53 | - FlipperKit/FlipperKitHighlightOverlay 54 | - FlipperKit/FlipperKitLayoutHelpers 55 | - YogaKit (~> 1.18) 56 | - FlipperKit/FlipperKitLayoutPlugin (0.99.0): 57 | - FlipperKit/Core 58 | - FlipperKit/FlipperKitHighlightOverlay 59 | - FlipperKit/FlipperKitLayoutHelpers 60 | - FlipperKit/FlipperKitLayoutIOSDescriptors 61 | - FlipperKit/FlipperKitLayoutTextSearchable 62 | - YogaKit (~> 1.18) 63 | - FlipperKit/FlipperKitLayoutTextSearchable (0.99.0) 64 | - FlipperKit/FlipperKitNetworkPlugin (0.99.0): 65 | - FlipperKit/Core 66 | - FlipperKit/FlipperKitReactPlugin (0.99.0): 67 | - FlipperKit/Core 68 | - FlipperKit/FlipperKitUserDefaultsPlugin (0.99.0): 69 | - FlipperKit/Core 70 | - FlipperKit/SKIOSNetworkPlugin (0.99.0): 71 | - FlipperKit/Core 72 | - FlipperKit/FlipperKitNetworkPlugin 73 | - fmt (6.2.1) 74 | - glog (0.3.5) 75 | - libevent (2.1.12) 76 | - OpenSSL-Universal (1.1.180) 77 | - RCT-Folly (2021.06.28.00-v2): 78 | - boost 79 | - DoubleConversion 80 | - fmt (~> 6.2.1) 81 | - glog 82 | - RCT-Folly/Default (= 2021.06.28.00-v2) 83 | - RCT-Folly/Default (2021.06.28.00-v2): 84 | - boost 85 | - DoubleConversion 86 | - fmt (~> 6.2.1) 87 | - glog 88 | - RCTRequired (0.67.4) 89 | - RCTTypeSafety (0.67.4): 90 | - FBLazyVector (= 0.67.4) 91 | - RCT-Folly (= 2021.06.28.00-v2) 92 | - RCTRequired (= 0.67.4) 93 | - React-Core (= 0.67.4) 94 | - React (0.67.4): 95 | - React-Core (= 0.67.4) 96 | - React-Core/DevSupport (= 0.67.4) 97 | - React-Core/RCTWebSocket (= 0.67.4) 98 | - React-RCTActionSheet (= 0.67.4) 99 | - React-RCTAnimation (= 0.67.4) 100 | - React-RCTBlob (= 0.67.4) 101 | - React-RCTImage (= 0.67.4) 102 | - React-RCTLinking (= 0.67.4) 103 | - React-RCTNetwork (= 0.67.4) 104 | - React-RCTSettings (= 0.67.4) 105 | - React-RCTText (= 0.67.4) 106 | - React-RCTVibration (= 0.67.4) 107 | - React-callinvoker (0.67.4) 108 | - React-Core (0.67.4): 109 | - glog 110 | - RCT-Folly (= 2021.06.28.00-v2) 111 | - React-Core/Default (= 0.67.4) 112 | - React-cxxreact (= 0.67.4) 113 | - React-jsi (= 0.67.4) 114 | - React-jsiexecutor (= 0.67.4) 115 | - React-perflogger (= 0.67.4) 116 | - Yoga 117 | - React-Core/CoreModulesHeaders (0.67.4): 118 | - glog 119 | - RCT-Folly (= 2021.06.28.00-v2) 120 | - React-Core/Default 121 | - React-cxxreact (= 0.67.4) 122 | - React-jsi (= 0.67.4) 123 | - React-jsiexecutor (= 0.67.4) 124 | - React-perflogger (= 0.67.4) 125 | - Yoga 126 | - React-Core/Default (0.67.4): 127 | - glog 128 | - RCT-Folly (= 2021.06.28.00-v2) 129 | - React-cxxreact (= 0.67.4) 130 | - React-jsi (= 0.67.4) 131 | - React-jsiexecutor (= 0.67.4) 132 | - React-perflogger (= 0.67.4) 133 | - Yoga 134 | - React-Core/DevSupport (0.67.4): 135 | - glog 136 | - RCT-Folly (= 2021.06.28.00-v2) 137 | - React-Core/Default (= 0.67.4) 138 | - React-Core/RCTWebSocket (= 0.67.4) 139 | - React-cxxreact (= 0.67.4) 140 | - React-jsi (= 0.67.4) 141 | - React-jsiexecutor (= 0.67.4) 142 | - React-jsinspector (= 0.67.4) 143 | - React-perflogger (= 0.67.4) 144 | - Yoga 145 | - React-Core/RCTActionSheetHeaders (0.67.4): 146 | - glog 147 | - RCT-Folly (= 2021.06.28.00-v2) 148 | - React-Core/Default 149 | - React-cxxreact (= 0.67.4) 150 | - React-jsi (= 0.67.4) 151 | - React-jsiexecutor (= 0.67.4) 152 | - React-perflogger (= 0.67.4) 153 | - Yoga 154 | - React-Core/RCTAnimationHeaders (0.67.4): 155 | - glog 156 | - RCT-Folly (= 2021.06.28.00-v2) 157 | - React-Core/Default 158 | - React-cxxreact (= 0.67.4) 159 | - React-jsi (= 0.67.4) 160 | - React-jsiexecutor (= 0.67.4) 161 | - React-perflogger (= 0.67.4) 162 | - Yoga 163 | - React-Core/RCTBlobHeaders (0.67.4): 164 | - glog 165 | - RCT-Folly (= 2021.06.28.00-v2) 166 | - React-Core/Default 167 | - React-cxxreact (= 0.67.4) 168 | - React-jsi (= 0.67.4) 169 | - React-jsiexecutor (= 0.67.4) 170 | - React-perflogger (= 0.67.4) 171 | - Yoga 172 | - React-Core/RCTImageHeaders (0.67.4): 173 | - glog 174 | - RCT-Folly (= 2021.06.28.00-v2) 175 | - React-Core/Default 176 | - React-cxxreact (= 0.67.4) 177 | - React-jsi (= 0.67.4) 178 | - React-jsiexecutor (= 0.67.4) 179 | - React-perflogger (= 0.67.4) 180 | - Yoga 181 | - React-Core/RCTLinkingHeaders (0.67.4): 182 | - glog 183 | - RCT-Folly (= 2021.06.28.00-v2) 184 | - React-Core/Default 185 | - React-cxxreact (= 0.67.4) 186 | - React-jsi (= 0.67.4) 187 | - React-jsiexecutor (= 0.67.4) 188 | - React-perflogger (= 0.67.4) 189 | - Yoga 190 | - React-Core/RCTNetworkHeaders (0.67.4): 191 | - glog 192 | - RCT-Folly (= 2021.06.28.00-v2) 193 | - React-Core/Default 194 | - React-cxxreact (= 0.67.4) 195 | - React-jsi (= 0.67.4) 196 | - React-jsiexecutor (= 0.67.4) 197 | - React-perflogger (= 0.67.4) 198 | - Yoga 199 | - React-Core/RCTSettingsHeaders (0.67.4): 200 | - glog 201 | - RCT-Folly (= 2021.06.28.00-v2) 202 | - React-Core/Default 203 | - React-cxxreact (= 0.67.4) 204 | - React-jsi (= 0.67.4) 205 | - React-jsiexecutor (= 0.67.4) 206 | - React-perflogger (= 0.67.4) 207 | - Yoga 208 | - React-Core/RCTTextHeaders (0.67.4): 209 | - glog 210 | - RCT-Folly (= 2021.06.28.00-v2) 211 | - React-Core/Default 212 | - React-cxxreact (= 0.67.4) 213 | - React-jsi (= 0.67.4) 214 | - React-jsiexecutor (= 0.67.4) 215 | - React-perflogger (= 0.67.4) 216 | - Yoga 217 | - React-Core/RCTVibrationHeaders (0.67.4): 218 | - glog 219 | - RCT-Folly (= 2021.06.28.00-v2) 220 | - React-Core/Default 221 | - React-cxxreact (= 0.67.4) 222 | - React-jsi (= 0.67.4) 223 | - React-jsiexecutor (= 0.67.4) 224 | - React-perflogger (= 0.67.4) 225 | - Yoga 226 | - React-Core/RCTWebSocket (0.67.4): 227 | - glog 228 | - RCT-Folly (= 2021.06.28.00-v2) 229 | - React-Core/Default (= 0.67.4) 230 | - React-cxxreact (= 0.67.4) 231 | - React-jsi (= 0.67.4) 232 | - React-jsiexecutor (= 0.67.4) 233 | - React-perflogger (= 0.67.4) 234 | - Yoga 235 | - React-CoreModules (0.67.4): 236 | - FBReactNativeSpec (= 0.67.4) 237 | - RCT-Folly (= 2021.06.28.00-v2) 238 | - RCTTypeSafety (= 0.67.4) 239 | - React-Core/CoreModulesHeaders (= 0.67.4) 240 | - React-jsi (= 0.67.4) 241 | - React-RCTImage (= 0.67.4) 242 | - ReactCommon/turbomodule/core (= 0.67.4) 243 | - React-cxxreact (0.67.4): 244 | - boost (= 1.76.0) 245 | - DoubleConversion 246 | - glog 247 | - RCT-Folly (= 2021.06.28.00-v2) 248 | - React-callinvoker (= 0.67.4) 249 | - React-jsi (= 0.67.4) 250 | - React-jsinspector (= 0.67.4) 251 | - React-logger (= 0.67.4) 252 | - React-perflogger (= 0.67.4) 253 | - React-runtimeexecutor (= 0.67.4) 254 | - React-jsi (0.67.4): 255 | - boost (= 1.76.0) 256 | - DoubleConversion 257 | - glog 258 | - RCT-Folly (= 2021.06.28.00-v2) 259 | - React-jsi/Default (= 0.67.4) 260 | - React-jsi/Default (0.67.4): 261 | - boost (= 1.76.0) 262 | - DoubleConversion 263 | - glog 264 | - RCT-Folly (= 2021.06.28.00-v2) 265 | - React-jsiexecutor (0.67.4): 266 | - DoubleConversion 267 | - glog 268 | - RCT-Folly (= 2021.06.28.00-v2) 269 | - React-cxxreact (= 0.67.4) 270 | - React-jsi (= 0.67.4) 271 | - React-perflogger (= 0.67.4) 272 | - React-jsinspector (0.67.4) 273 | - React-logger (0.67.4): 274 | - glog 275 | - react-native-safe-area-context (4.4.1): 276 | - RCT-Folly 277 | - RCTRequired 278 | - RCTTypeSafety 279 | - React-Core 280 | - ReactCommon/turbomodule/core 281 | - React-perflogger (0.67.4) 282 | - React-RCTActionSheet (0.67.4): 283 | - React-Core/RCTActionSheetHeaders (= 0.67.4) 284 | - React-RCTAnimation (0.67.4): 285 | - FBReactNativeSpec (= 0.67.4) 286 | - RCT-Folly (= 2021.06.28.00-v2) 287 | - RCTTypeSafety (= 0.67.4) 288 | - React-Core/RCTAnimationHeaders (= 0.67.4) 289 | - React-jsi (= 0.67.4) 290 | - ReactCommon/turbomodule/core (= 0.67.4) 291 | - React-RCTBlob (0.67.4): 292 | - FBReactNativeSpec (= 0.67.4) 293 | - RCT-Folly (= 2021.06.28.00-v2) 294 | - React-Core/RCTBlobHeaders (= 0.67.4) 295 | - React-Core/RCTWebSocket (= 0.67.4) 296 | - React-jsi (= 0.67.4) 297 | - React-RCTNetwork (= 0.67.4) 298 | - ReactCommon/turbomodule/core (= 0.67.4) 299 | - React-RCTImage (0.67.4): 300 | - FBReactNativeSpec (= 0.67.4) 301 | - RCT-Folly (= 2021.06.28.00-v2) 302 | - RCTTypeSafety (= 0.67.4) 303 | - React-Core/RCTImageHeaders (= 0.67.4) 304 | - React-jsi (= 0.67.4) 305 | - React-RCTNetwork (= 0.67.4) 306 | - ReactCommon/turbomodule/core (= 0.67.4) 307 | - React-RCTLinking (0.67.4): 308 | - FBReactNativeSpec (= 0.67.4) 309 | - React-Core/RCTLinkingHeaders (= 0.67.4) 310 | - React-jsi (= 0.67.4) 311 | - ReactCommon/turbomodule/core (= 0.67.4) 312 | - React-RCTNetwork (0.67.4): 313 | - FBReactNativeSpec (= 0.67.4) 314 | - RCT-Folly (= 2021.06.28.00-v2) 315 | - RCTTypeSafety (= 0.67.4) 316 | - React-Core/RCTNetworkHeaders (= 0.67.4) 317 | - React-jsi (= 0.67.4) 318 | - ReactCommon/turbomodule/core (= 0.67.4) 319 | - React-RCTSettings (0.67.4): 320 | - FBReactNativeSpec (= 0.67.4) 321 | - RCT-Folly (= 2021.06.28.00-v2) 322 | - RCTTypeSafety (= 0.67.4) 323 | - React-Core/RCTSettingsHeaders (= 0.67.4) 324 | - React-jsi (= 0.67.4) 325 | - ReactCommon/turbomodule/core (= 0.67.4) 326 | - React-RCTText (0.67.4): 327 | - React-Core/RCTTextHeaders (= 0.67.4) 328 | - React-RCTVibration (0.67.4): 329 | - FBReactNativeSpec (= 0.67.4) 330 | - RCT-Folly (= 2021.06.28.00-v2) 331 | - React-Core/RCTVibrationHeaders (= 0.67.4) 332 | - React-jsi (= 0.67.4) 333 | - ReactCommon/turbomodule/core (= 0.67.4) 334 | - React-runtimeexecutor (0.67.4): 335 | - React-jsi (= 0.67.4) 336 | - ReactCommon/turbomodule/core (0.67.4): 337 | - DoubleConversion 338 | - glog 339 | - RCT-Folly (= 2021.06.28.00-v2) 340 | - React-callinvoker (= 0.67.4) 341 | - React-Core (= 0.67.4) 342 | - React-cxxreact (= 0.67.4) 343 | - React-jsi (= 0.67.4) 344 | - React-logger (= 0.67.4) 345 | - React-perflogger (= 0.67.4) 346 | - ReactNativePerformance (4.1.2): 347 | - React-Core 348 | - RNCMaskedView (0.2.8): 349 | - React-Core 350 | - RNFlashList (1.4.0): 351 | - React-Core 352 | - RNGestureHandler (2.9.0): 353 | - React-Core 354 | - RNReactNativeHapticFeedback (1.14.0): 355 | - React-Core 356 | - RNReanimated (2.14.4): 357 | - DoubleConversion 358 | - FBLazyVector 359 | - FBReactNativeSpec 360 | - glog 361 | - RCT-Folly 362 | - RCTRequired 363 | - RCTTypeSafety 364 | - React-callinvoker 365 | - React-Core 366 | - React-Core/DevSupport 367 | - React-Core/RCTWebSocket 368 | - React-CoreModules 369 | - React-cxxreact 370 | - React-jsi 371 | - React-jsiexecutor 372 | - React-jsinspector 373 | - React-RCTActionSheet 374 | - React-RCTAnimation 375 | - React-RCTBlob 376 | - React-RCTImage 377 | - React-RCTLinking 378 | - React-RCTNetwork 379 | - React-RCTSettings 380 | - React-RCTText 381 | - ReactCommon/turbomodule/core 382 | - Yoga 383 | - RNScreens (3.18.2): 384 | - React-Core 385 | - React-RCTImage 386 | - RNVectorIcons (9.2.0): 387 | - React-Core 388 | - Yoga (1.14.0) 389 | - YogaKit (1.18.1): 390 | - Yoga (~> 1.14) 391 | 392 | DEPENDENCIES: 393 | - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) 394 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) 395 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) 396 | - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) 397 | - Flipper (= 0.99.0) 398 | - Flipper-Boost-iOSX (= 1.76.0.1.11) 399 | - Flipper-DoubleConversion (= 3.1.7) 400 | - Flipper-Fmt (= 7.1.7) 401 | - Flipper-Folly (= 2.6.7) 402 | - Flipper-Glog (= 0.3.6) 403 | - Flipper-PeerTalk (= 0.0.4) 404 | - Flipper-RSocket (= 1.4.3) 405 | - FlipperKit (= 0.99.0) 406 | - FlipperKit/Core (= 0.99.0) 407 | - FlipperKit/CppBridge (= 0.99.0) 408 | - FlipperKit/FBCxxFollyDynamicConvert (= 0.99.0) 409 | - FlipperKit/FBDefines (= 0.99.0) 410 | - FlipperKit/FKPortForwarding (= 0.99.0) 411 | - FlipperKit/FlipperKitHighlightOverlay (= 0.99.0) 412 | - FlipperKit/FlipperKitLayoutPlugin (= 0.99.0) 413 | - FlipperKit/FlipperKitLayoutTextSearchable (= 0.99.0) 414 | - FlipperKit/FlipperKitNetworkPlugin (= 0.99.0) 415 | - FlipperKit/FlipperKitReactPlugin (= 0.99.0) 416 | - FlipperKit/FlipperKitUserDefaultsPlugin (= 0.99.0) 417 | - FlipperKit/SKIOSNetworkPlugin (= 0.99.0) 418 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) 419 | - OpenSSL-Universal (= 1.1.180) 420 | - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) 421 | - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) 422 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) 423 | - React (from `../node_modules/react-native/`) 424 | - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) 425 | - React-Core (from `../node_modules/react-native/`) 426 | - React-Core/DevSupport (from `../node_modules/react-native/`) 427 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`) 428 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) 429 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) 430 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) 431 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) 432 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) 433 | - React-logger (from `../node_modules/react-native/ReactCommon/logger`) 434 | - react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`) 435 | - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) 436 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) 437 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) 438 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) 439 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) 440 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) 441 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) 442 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) 443 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`) 444 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) 445 | - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) 446 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) 447 | - "ReactNativePerformance (from `../node_modules/@shopify/react-native-performance`)" 448 | - "RNCMaskedView (from `../node_modules/@react-native-masked-view/masked-view`)" 449 | - "RNFlashList (from `../node_modules/@shopify/flash-list`)" 450 | - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) 451 | - RNReactNativeHapticFeedback (from `../node_modules/react-native-haptic-feedback`) 452 | - RNReanimated (from `../node_modules/react-native-reanimated`) 453 | - RNScreens (from `../node_modules/react-native-screens`) 454 | - RNVectorIcons (from `../node_modules/react-native-vector-icons`) 455 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) 456 | 457 | SPEC REPOS: 458 | trunk: 459 | - CocoaAsyncSocket 460 | - Flipper 461 | - Flipper-Boost-iOSX 462 | - Flipper-DoubleConversion 463 | - Flipper-Fmt 464 | - Flipper-Folly 465 | - Flipper-Glog 466 | - Flipper-PeerTalk 467 | - Flipper-RSocket 468 | - FlipperKit 469 | - fmt 470 | - libevent 471 | - OpenSSL-Universal 472 | - YogaKit 473 | 474 | EXTERNAL SOURCES: 475 | boost: 476 | :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" 477 | DoubleConversion: 478 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" 479 | FBLazyVector: 480 | :path: "../node_modules/react-native/Libraries/FBLazyVector" 481 | FBReactNativeSpec: 482 | :path: "../node_modules/react-native/React/FBReactNativeSpec" 483 | glog: 484 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" 485 | RCT-Folly: 486 | :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" 487 | RCTRequired: 488 | :path: "../node_modules/react-native/Libraries/RCTRequired" 489 | RCTTypeSafety: 490 | :path: "../node_modules/react-native/Libraries/TypeSafety" 491 | React: 492 | :path: "../node_modules/react-native/" 493 | React-callinvoker: 494 | :path: "../node_modules/react-native/ReactCommon/callinvoker" 495 | React-Core: 496 | :path: "../node_modules/react-native/" 497 | React-CoreModules: 498 | :path: "../node_modules/react-native/React/CoreModules" 499 | React-cxxreact: 500 | :path: "../node_modules/react-native/ReactCommon/cxxreact" 501 | React-jsi: 502 | :path: "../node_modules/react-native/ReactCommon/jsi" 503 | React-jsiexecutor: 504 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor" 505 | React-jsinspector: 506 | :path: "../node_modules/react-native/ReactCommon/jsinspector" 507 | React-logger: 508 | :path: "../node_modules/react-native/ReactCommon/logger" 509 | react-native-safe-area-context: 510 | :path: "../node_modules/react-native-safe-area-context" 511 | React-perflogger: 512 | :path: "../node_modules/react-native/ReactCommon/reactperflogger" 513 | React-RCTActionSheet: 514 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS" 515 | React-RCTAnimation: 516 | :path: "../node_modules/react-native/Libraries/NativeAnimation" 517 | React-RCTBlob: 518 | :path: "../node_modules/react-native/Libraries/Blob" 519 | React-RCTImage: 520 | :path: "../node_modules/react-native/Libraries/Image" 521 | React-RCTLinking: 522 | :path: "../node_modules/react-native/Libraries/LinkingIOS" 523 | React-RCTNetwork: 524 | :path: "../node_modules/react-native/Libraries/Network" 525 | React-RCTSettings: 526 | :path: "../node_modules/react-native/Libraries/Settings" 527 | React-RCTText: 528 | :path: "../node_modules/react-native/Libraries/Text" 529 | React-RCTVibration: 530 | :path: "../node_modules/react-native/Libraries/Vibration" 531 | React-runtimeexecutor: 532 | :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" 533 | ReactCommon: 534 | :path: "../node_modules/react-native/ReactCommon" 535 | ReactNativePerformance: 536 | :path: "../node_modules/@shopify/react-native-performance" 537 | RNCMaskedView: 538 | :path: "../node_modules/@react-native-masked-view/masked-view" 539 | RNFlashList: 540 | :path: "../node_modules/@shopify/flash-list" 541 | RNGestureHandler: 542 | :path: "../node_modules/react-native-gesture-handler" 543 | RNReactNativeHapticFeedback: 544 | :path: "../node_modules/react-native-haptic-feedback" 545 | RNReanimated: 546 | :path: "../node_modules/react-native-reanimated" 547 | RNScreens: 548 | :path: "../node_modules/react-native-screens" 549 | RNVectorIcons: 550 | :path: "../node_modules/react-native-vector-icons" 551 | Yoga: 552 | :path: "../node_modules/react-native/ReactCommon/yoga" 553 | 554 | SPEC CHECKSUMS: 555 | boost: a7c83b31436843459a1961bfd74b96033dc77234 556 | CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99 557 | DoubleConversion: 831926d9b8bf8166fd87886c4abab286c2422662 558 | FBLazyVector: f7b0632c6437e312acf6349288d9aa4cb6d59030 559 | FBReactNativeSpec: 0f4e1f4cfeace095694436e7c7fcc5bf4b03a0ff 560 | Flipper: 30e8eeeed6abdc98edaf32af0cda2f198be4b733 561 | Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c 562 | Flipper-DoubleConversion: 57ffbe81ef95306cc9e69c4aa3aeeeeb58a6a28c 563 | Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b 564 | Flipper-Folly: 83af37379faa69497529e414bd43fbfc7cae259a 565 | Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6 566 | Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9 567 | Flipper-RSocket: d9d9ade67cbecf6ac10730304bf5607266dd2541 568 | FlipperKit: d8d346844eca5d9120c17d441a2f38596e8ed2b9 569 | fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 570 | glog: 85ecdd10ee8d8ec362ef519a6a45ff9aa27b2e85 571 | libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 572 | OpenSSL-Universal: 1aa4f6a6ee7256b83db99ec1ccdaa80d10f9af9b 573 | RCT-Folly: 803a9cfd78114b2ec0f140cfa6fa2a6bafb2d685 574 | RCTRequired: 0aa6c1c27e1d65920df35ceea5341a5fe76bdb79 575 | RCTTypeSafety: d76a59d00632891e11ed7522dba3fd1a995e573a 576 | React: ab8c09da2e7704f4b3ebad4baa6cfdfcc852dcb5 577 | React-callinvoker: 216fb96b482da516b8aba4142b145938f6ea92f0 578 | React-Core: af99b93aff83599485e0e0879879aafa35ceae32 579 | React-CoreModules: 137a054ce8c547e81dc3502933b1bc0fd08df05d 580 | React-cxxreact: ec5ee6b08664f5b8ac71d8ad912f54d540c4f817 581 | React-jsi: 3e084c80fd364cee64668d5df46d40c39f7973e1 582 | React-jsiexecutor: cbdf37cebdc4f5d8b3d0bf5ccaa6147fd9de9f3d 583 | React-jsinspector: f4775ea9118cbe1f72b834f0f842baa7a99508d8 584 | React-logger: a1f028f6d8639a3f364ef80419e5e862e1115250 585 | react-native-safe-area-context: 99b24a0c5acd0d5dcac2b1a7f18c49ea317be99a 586 | React-perflogger: 0afaf2f01a47fd0fc368a93bfbb5bd3b26db6e7f 587 | React-RCTActionSheet: 59f35c4029e0b532fc42114241a06e170b7431a2 588 | React-RCTAnimation: aae4f4bed122e78bdab72f7118d291d70a932ce2 589 | React-RCTBlob: f6fb23394b4f28cd86fa7e9f5f6ae45c23669fda 590 | React-RCTImage: 638815cf96124386dd296067246d91441932ae3f 591 | React-RCTLinking: 254dd06283dd6fdb784285f95e7cec8053c3270f 592 | React-RCTNetwork: 8a4c2d4f357268e520b060572d02bc69a9b991fb 593 | React-RCTSettings: 35d44cbb9972ab933bd0a59ea3e6646dcb030ba3 594 | React-RCTText: cc5315df8458cfa7b537e621271ef43273955a97 595 | React-RCTVibration: 3b52a7dced19cdb025b4f88ab26ceb2d85f30ba2 596 | React-runtimeexecutor: a9d3c82ddf7ffdad9fbe6a81c6d6f8c06385464d 597 | ReactCommon: 07d0c460b9ba9af3eaf1b8f5abe7daaad28c9c4e 598 | ReactNativePerformance: ab7dee4c4862623d72c1530a9fc71b55458edf71 599 | RNCMaskedView: bc0170f389056201c82a55e242e5d90070e18e5a 600 | RNFlashList: 399bf6a0db68f594ad2c86aaff3ea39564f39f8a 601 | RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39 602 | RNReactNativeHapticFeedback: 1e3efeca9628ff9876ee7cdd9edec1b336913f8c 603 | RNReanimated: e0d473a3ffdcf1273f83cbc3e34cc47e2fff72ed 604 | RNScreens: 34cc502acf1b916c582c60003dc3089fa01dc66d 605 | RNVectorIcons: fcc2f6cb32f5735b586e66d14103a74ce6ad61f8 606 | Yoga: d6b6a80659aa3e91aaba01d0012e7edcbedcbecd 607 | YogaKit: f782866e155069a2cca2517aafea43200b01fd5a 608 | 609 | PODFILE CHECKSUM: b5a0d8a14ed7ae8b2964c9163d927707103ef5c4 610 | 611 | COCOAPODS: 1.11.2 612 | -------------------------------------------------------------------------------- /ios/rnui.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00E356F31AD99517003FC87E /* rnuiTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* rnuiTests.m */; }; 11 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 12 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 14 | 223C91DC2982CC80009B0614 /* Monda-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 223C91DB2982CB7E009B0614 /* Monda-Regular.ttf */; }; 15 | 22E1C59A29781D6C003A7AED /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 22E1C59929781D6B003A7AED /* LaunchScreen.storyboard */; }; 16 | 6172F2D35A4C3AA820D92908 /* libPods-rnui.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6423831EA8574132BED9D8CC /* libPods-rnui.a */; }; 17 | 7EF68E3733C33B6898317E18 /* libPods-rnui-rnuiTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ABFE59519B596E51CEFDCCC0 /* libPods-rnui-rnuiTests.a */; }; 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 = rnui; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 00E356EE1AD99517003FC87E /* rnuiTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = rnuiTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | 00E356F21AD99517003FC87E /* rnuiTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = rnuiTests.m; sourceTree = ""; }; 34 | 13B07F961A680F5B00A75B9A /* rnui.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = rnui.app; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = rnui/AppDelegate.h; sourceTree = ""; }; 36 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = rnui/AppDelegate.m; sourceTree = ""; }; 37 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = rnui/Images.xcassets; sourceTree = ""; }; 38 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = rnui/Info.plist; sourceTree = ""; }; 39 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = rnui/main.m; sourceTree = ""; }; 40 | 1D0AE47A65C8663E3B452821 /* Pods-rnui-rnuiTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnui-rnuiTests.release.xcconfig"; path = "Target Support Files/Pods-rnui-rnuiTests/Pods-rnui-rnuiTests.release.xcconfig"; sourceTree = ""; }; 41 | 223C91DB2982CB7E009B0614 /* Monda-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "Monda-Regular.ttf"; path = "../../src/assets/fonts/Monda-Regular.ttf"; sourceTree = ""; }; 42 | 22E1C59929781D6B003A7AED /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 43 | 22E6C10D2975A9B90083EAF1 /* Ionicons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Ionicons.ttf; sourceTree = ""; }; 44 | 6423831EA8574132BED9D8CC /* libPods-rnui.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-rnui.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 6C97AB639B58BBB4B15BBE30 /* Pods-rnui-rnuiTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnui-rnuiTests.debug.xcconfig"; path = "Target Support Files/Pods-rnui-rnuiTests/Pods-rnui-rnuiTests.debug.xcconfig"; sourceTree = ""; }; 46 | ABFE59519B596E51CEFDCCC0 /* libPods-rnui-rnuiTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-rnui-rnuiTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | C0A881CF5CF3F2B244570E2A /* Pods-rnui.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnui.debug.xcconfig"; path = "Target Support Files/Pods-rnui/Pods-rnui.debug.xcconfig"; sourceTree = ""; }; 48 | D00AAFFCFCFDA5787532823F /* Pods-rnui.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnui.release.xcconfig"; path = "Target Support Files/Pods-rnui/Pods-rnui.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 | 7EF68E3733C33B6898317E18 /* libPods-rnui-rnuiTests.a in Frameworks */, 58 | ); 59 | runOnlyForDeploymentPostprocessing = 0; 60 | }; 61 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | 6172F2D35A4C3AA820D92908 /* libPods-rnui.a in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXFrameworksBuildPhase section */ 70 | 71 | /* Begin PBXGroup section */ 72 | 00E356EF1AD99517003FC87E /* rnuiTests */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 00E356F21AD99517003FC87E /* rnuiTests.m */, 76 | 00E356F01AD99517003FC87E /* Supporting Files */, 77 | ); 78 | path = rnuiTests; 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 /* rnui */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 93 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 94 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 95 | 13B07FB61A68108700A75B9A /* Info.plist */, 96 | 22E1C59929781D6B003A7AED /* LaunchScreen.storyboard */, 97 | 13B07FB71A68108700A75B9A /* main.m */, 98 | ); 99 | name = rnui; 100 | sourceTree = ""; 101 | }; 102 | 22E6C10C2975A94C0083EAF1 /* Resources */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 223C91DB2982CB7E009B0614 /* Monda-Regular.ttf */, 106 | 22E6C10D2975A9B90083EAF1 /* Ionicons.ttf */, 107 | ); 108 | path = Resources; 109 | sourceTree = ""; 110 | }; 111 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */, 115 | 6423831EA8574132BED9D8CC /* libPods-rnui.a */, 116 | ABFE59519B596E51CEFDCCC0 /* libPods-rnui-rnuiTests.a */, 117 | ); 118 | name = Frameworks; 119 | sourceTree = ""; 120 | }; 121 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | ); 125 | name = Libraries; 126 | sourceTree = ""; 127 | }; 128 | 83CBB9F61A601CBA00E9B192 = { 129 | isa = PBXGroup; 130 | children = ( 131 | 13B07FAE1A68108700A75B9A /* rnui */, 132 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 133 | 00E356EF1AD99517003FC87E /* rnuiTests */, 134 | 83CBBA001A601CBA00E9B192 /* Products */, 135 | 2D16E6871FA4F8E400B85C8A /* Frameworks */, 136 | E233CBF5F47BEE60B243DCF8 /* Pods */, 137 | 22E6C10C2975A94C0083EAF1 /* Resources */, 138 | ); 139 | indentWidth = 2; 140 | sourceTree = ""; 141 | tabWidth = 2; 142 | usesTabs = 0; 143 | }; 144 | 83CBBA001A601CBA00E9B192 /* Products */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 13B07F961A680F5B00A75B9A /* rnui.app */, 148 | 00E356EE1AD99517003FC87E /* rnuiTests.xctest */, 149 | ); 150 | name = Products; 151 | sourceTree = ""; 152 | }; 153 | E233CBF5F47BEE60B243DCF8 /* Pods */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | C0A881CF5CF3F2B244570E2A /* Pods-rnui.debug.xcconfig */, 157 | D00AAFFCFCFDA5787532823F /* Pods-rnui.release.xcconfig */, 158 | 6C97AB639B58BBB4B15BBE30 /* Pods-rnui-rnuiTests.debug.xcconfig */, 159 | 1D0AE47A65C8663E3B452821 /* Pods-rnui-rnuiTests.release.xcconfig */, 160 | ); 161 | path = Pods; 162 | sourceTree = ""; 163 | }; 164 | /* End PBXGroup section */ 165 | 166 | /* Begin PBXNativeTarget section */ 167 | 00E356ED1AD99517003FC87E /* rnuiTests */ = { 168 | isa = PBXNativeTarget; 169 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "rnuiTests" */; 170 | buildPhases = ( 171 | A130D646172E58E1D159D8F2 /* [CP] Check Pods Manifest.lock */, 172 | 00E356EA1AD99517003FC87E /* Sources */, 173 | 00E356EB1AD99517003FC87E /* Frameworks */, 174 | 00E356EC1AD99517003FC87E /* Resources */, 175 | 077E01280D4B4AD18B2E1770 /* [CP] Embed Pods Frameworks */, 176 | 4E62BDF20514810D028A5FBF /* [CP] Copy Pods Resources */, 177 | ); 178 | buildRules = ( 179 | ); 180 | dependencies = ( 181 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 182 | ); 183 | name = rnuiTests; 184 | productName = rnuiTests; 185 | productReference = 00E356EE1AD99517003FC87E /* rnuiTests.xctest */; 186 | productType = "com.apple.product-type.bundle.unit-test"; 187 | }; 188 | 13B07F861A680F5B00A75B9A /* rnui */ = { 189 | isa = PBXNativeTarget; 190 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "rnui" */; 191 | buildPhases = ( 192 | 3E482C27206C4DEF2FE45063 /* [CP] Check Pods Manifest.lock */, 193 | FD10A7F022414F080027D42C /* Start Packager */, 194 | 13B07F871A680F5B00A75B9A /* Sources */, 195 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 196 | 13B07F8E1A680F5B00A75B9A /* Resources */, 197 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 198 | C8AC78B0264D0F9F6F6D630E /* [CP] Embed Pods Frameworks */, 199 | ADC9DDC32298B72B3CF5DC8E /* [CP] Copy Pods Resources */, 200 | ); 201 | buildRules = ( 202 | ); 203 | dependencies = ( 204 | ); 205 | name = rnui; 206 | productName = rnui; 207 | productReference = 13B07F961A680F5B00A75B9A /* rnui.app */; 208 | productType = "com.apple.product-type.application"; 209 | }; 210 | /* End PBXNativeTarget section */ 211 | 212 | /* Begin PBXProject section */ 213 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 214 | isa = PBXProject; 215 | attributes = { 216 | LastUpgradeCheck = 1210; 217 | TargetAttributes = { 218 | 00E356ED1AD99517003FC87E = { 219 | CreatedOnToolsVersion = 6.2; 220 | TestTargetID = 13B07F861A680F5B00A75B9A; 221 | }; 222 | 13B07F861A680F5B00A75B9A = { 223 | LastSwiftMigration = 1120; 224 | }; 225 | }; 226 | }; 227 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "rnui" */; 228 | compatibilityVersion = "Xcode 12.0"; 229 | developmentRegion = en; 230 | hasScannedForEncodings = 0; 231 | knownRegions = ( 232 | en, 233 | Base, 234 | ); 235 | mainGroup = 83CBB9F61A601CBA00E9B192; 236 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 237 | projectDirPath = ""; 238 | projectRoot = ""; 239 | targets = ( 240 | 13B07F861A680F5B00A75B9A /* rnui */, 241 | 00E356ED1AD99517003FC87E /* rnuiTests */, 242 | ); 243 | }; 244 | /* End PBXProject section */ 245 | 246 | /* Begin PBXResourcesBuildPhase section */ 247 | 00E356EC1AD99517003FC87E /* Resources */ = { 248 | isa = PBXResourcesBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | ); 252 | runOnlyForDeploymentPostprocessing = 0; 253 | }; 254 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 255 | isa = PBXResourcesBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | 223C91DC2982CC80009B0614 /* Monda-Regular.ttf in Resources */, 259 | 22E1C59A29781D6C003A7AED /* LaunchScreen.storyboard in Resources */, 260 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | /* End PBXResourcesBuildPhase section */ 265 | 266 | /* Begin PBXShellScriptBuildPhase section */ 267 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 268 | isa = PBXShellScriptBuildPhase; 269 | buildActionMask = 2147483647; 270 | files = ( 271 | ); 272 | inputPaths = ( 273 | ); 274 | name = "Bundle React Native code and images"; 275 | outputPaths = ( 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | shellPath = /bin/sh; 279 | shellScript = "set -e\n\nexport NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; 280 | }; 281 | 077E01280D4B4AD18B2E1770 /* [CP] Embed Pods Frameworks */ = { 282 | isa = PBXShellScriptBuildPhase; 283 | buildActionMask = 2147483647; 284 | files = ( 285 | ); 286 | inputFileListPaths = ( 287 | "${PODS_ROOT}/Target Support Files/Pods-rnui-rnuiTests/Pods-rnui-rnuiTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", 288 | ); 289 | name = "[CP] Embed Pods Frameworks"; 290 | outputFileListPaths = ( 291 | "${PODS_ROOT}/Target Support Files/Pods-rnui-rnuiTests/Pods-rnui-rnuiTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", 292 | ); 293 | runOnlyForDeploymentPostprocessing = 0; 294 | shellPath = /bin/sh; 295 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-rnui-rnuiTests/Pods-rnui-rnuiTests-frameworks.sh\"\n"; 296 | showEnvVarsInLog = 0; 297 | }; 298 | 3E482C27206C4DEF2FE45063 /* [CP] Check Pods Manifest.lock */ = { 299 | isa = PBXShellScriptBuildPhase; 300 | buildActionMask = 2147483647; 301 | files = ( 302 | ); 303 | inputFileListPaths = ( 304 | ); 305 | inputPaths = ( 306 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 307 | "${PODS_ROOT}/Manifest.lock", 308 | ); 309 | name = "[CP] Check Pods Manifest.lock"; 310 | outputFileListPaths = ( 311 | ); 312 | outputPaths = ( 313 | "$(DERIVED_FILE_DIR)/Pods-rnui-checkManifestLockResult.txt", 314 | ); 315 | runOnlyForDeploymentPostprocessing = 0; 316 | shellPath = /bin/sh; 317 | 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"; 318 | showEnvVarsInLog = 0; 319 | }; 320 | 4E62BDF20514810D028A5FBF /* [CP] Copy Pods Resources */ = { 321 | isa = PBXShellScriptBuildPhase; 322 | buildActionMask = 2147483647; 323 | files = ( 324 | ); 325 | inputFileListPaths = ( 326 | "${PODS_ROOT}/Target Support Files/Pods-rnui-rnuiTests/Pods-rnui-rnuiTests-resources-${CONFIGURATION}-input-files.xcfilelist", 327 | ); 328 | name = "[CP] Copy Pods Resources"; 329 | outputFileListPaths = ( 330 | "${PODS_ROOT}/Target Support Files/Pods-rnui-rnuiTests/Pods-rnui-rnuiTests-resources-${CONFIGURATION}-output-files.xcfilelist", 331 | ); 332 | runOnlyForDeploymentPostprocessing = 0; 333 | shellPath = /bin/sh; 334 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-rnui-rnuiTests/Pods-rnui-rnuiTests-resources.sh\"\n"; 335 | showEnvVarsInLog = 0; 336 | }; 337 | A130D646172E58E1D159D8F2 /* [CP] Check Pods Manifest.lock */ = { 338 | isa = PBXShellScriptBuildPhase; 339 | buildActionMask = 2147483647; 340 | files = ( 341 | ); 342 | inputFileListPaths = ( 343 | ); 344 | inputPaths = ( 345 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 346 | "${PODS_ROOT}/Manifest.lock", 347 | ); 348 | name = "[CP] Check Pods Manifest.lock"; 349 | outputFileListPaths = ( 350 | ); 351 | outputPaths = ( 352 | "$(DERIVED_FILE_DIR)/Pods-rnui-rnuiTests-checkManifestLockResult.txt", 353 | ); 354 | runOnlyForDeploymentPostprocessing = 0; 355 | shellPath = /bin/sh; 356 | 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"; 357 | showEnvVarsInLog = 0; 358 | }; 359 | ADC9DDC32298B72B3CF5DC8E /* [CP] Copy Pods Resources */ = { 360 | isa = PBXShellScriptBuildPhase; 361 | buildActionMask = 2147483647; 362 | files = ( 363 | ); 364 | inputFileListPaths = ( 365 | "${PODS_ROOT}/Target Support Files/Pods-rnui/Pods-rnui-resources-${CONFIGURATION}-input-files.xcfilelist", 366 | ); 367 | name = "[CP] Copy Pods Resources"; 368 | outputFileListPaths = ( 369 | "${PODS_ROOT}/Target Support Files/Pods-rnui/Pods-rnui-resources-${CONFIGURATION}-output-files.xcfilelist", 370 | ); 371 | runOnlyForDeploymentPostprocessing = 0; 372 | shellPath = /bin/sh; 373 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-rnui/Pods-rnui-resources.sh\"\n"; 374 | showEnvVarsInLog = 0; 375 | }; 376 | C8AC78B0264D0F9F6F6D630E /* [CP] Embed Pods Frameworks */ = { 377 | isa = PBXShellScriptBuildPhase; 378 | buildActionMask = 2147483647; 379 | files = ( 380 | ); 381 | inputFileListPaths = ( 382 | "${PODS_ROOT}/Target Support Files/Pods-rnui/Pods-rnui-frameworks-${CONFIGURATION}-input-files.xcfilelist", 383 | ); 384 | name = "[CP] Embed Pods Frameworks"; 385 | outputFileListPaths = ( 386 | "${PODS_ROOT}/Target Support Files/Pods-rnui/Pods-rnui-frameworks-${CONFIGURATION}-output-files.xcfilelist", 387 | ); 388 | runOnlyForDeploymentPostprocessing = 0; 389 | shellPath = /bin/sh; 390 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-rnui/Pods-rnui-frameworks.sh\"\n"; 391 | showEnvVarsInLog = 0; 392 | }; 393 | FD10A7F022414F080027D42C /* Start Packager */ = { 394 | isa = PBXShellScriptBuildPhase; 395 | buildActionMask = 2147483647; 396 | files = ( 397 | ); 398 | inputFileListPaths = ( 399 | ); 400 | inputPaths = ( 401 | ); 402 | name = "Start Packager"; 403 | outputFileListPaths = ( 404 | ); 405 | outputPaths = ( 406 | ); 407 | runOnlyForDeploymentPostprocessing = 0; 408 | shellPath = /bin/sh; 409 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; 410 | showEnvVarsInLog = 0; 411 | }; 412 | /* End PBXShellScriptBuildPhase section */ 413 | 414 | /* Begin PBXSourcesBuildPhase section */ 415 | 00E356EA1AD99517003FC87E /* Sources */ = { 416 | isa = PBXSourcesBuildPhase; 417 | buildActionMask = 2147483647; 418 | files = ( 419 | 00E356F31AD99517003FC87E /* rnuiTests.m in Sources */, 420 | ); 421 | runOnlyForDeploymentPostprocessing = 0; 422 | }; 423 | 13B07F871A680F5B00A75B9A /* Sources */ = { 424 | isa = PBXSourcesBuildPhase; 425 | buildActionMask = 2147483647; 426 | files = ( 427 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 428 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 429 | ); 430 | runOnlyForDeploymentPostprocessing = 0; 431 | }; 432 | /* End PBXSourcesBuildPhase section */ 433 | 434 | /* Begin PBXTargetDependency section */ 435 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 436 | isa = PBXTargetDependency; 437 | target = 13B07F861A680F5B00A75B9A /* rnui */; 438 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 439 | }; 440 | /* End PBXTargetDependency section */ 441 | 442 | /* Begin XCBuildConfiguration section */ 443 | 00E356F61AD99517003FC87E /* Debug */ = { 444 | isa = XCBuildConfiguration; 445 | baseConfigurationReference = 6C97AB639B58BBB4B15BBE30 /* Pods-rnui-rnuiTests.debug.xcconfig */; 446 | buildSettings = { 447 | BUNDLE_LOADER = "$(TEST_HOST)"; 448 | GCC_PREPROCESSOR_DEFINITIONS = ( 449 | "DEBUG=1", 450 | "$(inherited)", 451 | ); 452 | INFOPLIST_FILE = rnuiTests/Info.plist; 453 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 454 | LD_RUNPATH_SEARCH_PATHS = ( 455 | "$(inherited)", 456 | "@executable_path/Frameworks", 457 | "@loader_path/Frameworks", 458 | ); 459 | OTHER_LDFLAGS = ( 460 | "-ObjC", 461 | "-lc++", 462 | "$(inherited)", 463 | ); 464 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 465 | PRODUCT_NAME = "$(TARGET_NAME)"; 466 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/rnui.app/rnui"; 467 | }; 468 | name = Debug; 469 | }; 470 | 00E356F71AD99517003FC87E /* Release */ = { 471 | isa = XCBuildConfiguration; 472 | baseConfigurationReference = 1D0AE47A65C8663E3B452821 /* Pods-rnui-rnuiTests.release.xcconfig */; 473 | buildSettings = { 474 | BUNDLE_LOADER = "$(TEST_HOST)"; 475 | COPY_PHASE_STRIP = NO; 476 | INFOPLIST_FILE = rnuiTests/Info.plist; 477 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 478 | LD_RUNPATH_SEARCH_PATHS = ( 479 | "$(inherited)", 480 | "@executable_path/Frameworks", 481 | "@loader_path/Frameworks", 482 | ); 483 | OTHER_LDFLAGS = ( 484 | "-ObjC", 485 | "-lc++", 486 | "$(inherited)", 487 | ); 488 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 489 | PRODUCT_NAME = "$(TARGET_NAME)"; 490 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/rnui.app/rnui"; 491 | }; 492 | name = Release; 493 | }; 494 | 13B07F941A680F5B00A75B9A /* Debug */ = { 495 | isa = XCBuildConfiguration; 496 | baseConfigurationReference = C0A881CF5CF3F2B244570E2A /* Pods-rnui.debug.xcconfig */; 497 | buildSettings = { 498 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 499 | CLANG_ENABLE_MODULES = YES; 500 | CURRENT_PROJECT_VERSION = 1; 501 | DEVELOPMENT_TEAM = 994M36343R; 502 | ENABLE_BITCODE = NO; 503 | INFOPLIST_FILE = rnui/Info.plist; 504 | INFOPLIST_KEY_CFBundleDisplayName = "React Naive UI"; 505 | LD_RUNPATH_SEARCH_PATHS = ( 506 | "$(inherited)", 507 | "@executable_path/Frameworks", 508 | ); 509 | MARKETING_VERSION = 1.0; 510 | OTHER_LDFLAGS = ( 511 | "$(inherited)", 512 | "-ObjC", 513 | "-lc++", 514 | ); 515 | PRODUCT_BUNDLE_IDENTIFIER = maxim.rnui.app; 516 | PRODUCT_NAME = rnui; 517 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 518 | SWIFT_VERSION = 5.0; 519 | VERSIONING_SYSTEM = "apple-generic"; 520 | }; 521 | name = Debug; 522 | }; 523 | 13B07F951A680F5B00A75B9A /* Release */ = { 524 | isa = XCBuildConfiguration; 525 | baseConfigurationReference = D00AAFFCFCFDA5787532823F /* Pods-rnui.release.xcconfig */; 526 | buildSettings = { 527 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 528 | CLANG_ENABLE_MODULES = YES; 529 | CURRENT_PROJECT_VERSION = 1; 530 | DEVELOPMENT_TEAM = 994M36343R; 531 | INFOPLIST_FILE = rnui/Info.plist; 532 | INFOPLIST_KEY_CFBundleDisplayName = "React Naive UI"; 533 | LD_RUNPATH_SEARCH_PATHS = ( 534 | "$(inherited)", 535 | "@executable_path/Frameworks", 536 | ); 537 | MARKETING_VERSION = 1.0; 538 | OTHER_LDFLAGS = ( 539 | "$(inherited)", 540 | "-ObjC", 541 | "-lc++", 542 | ); 543 | PRODUCT_BUNDLE_IDENTIFIER = maxim.rnui.app; 544 | PRODUCT_NAME = rnui; 545 | SWIFT_VERSION = 5.0; 546 | VERSIONING_SYSTEM = "apple-generic"; 547 | }; 548 | name = Release; 549 | }; 550 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 551 | isa = XCBuildConfiguration; 552 | buildSettings = { 553 | ALWAYS_SEARCH_USER_PATHS = NO; 554 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 555 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 556 | CLANG_CXX_LIBRARY = "libc++"; 557 | CLANG_ENABLE_MODULES = YES; 558 | CLANG_ENABLE_OBJC_ARC = YES; 559 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 560 | CLANG_WARN_BOOL_CONVERSION = YES; 561 | CLANG_WARN_COMMA = YES; 562 | CLANG_WARN_CONSTANT_CONVERSION = YES; 563 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 564 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 565 | CLANG_WARN_EMPTY_BODY = YES; 566 | CLANG_WARN_ENUM_CONVERSION = YES; 567 | CLANG_WARN_INFINITE_RECURSION = YES; 568 | CLANG_WARN_INT_CONVERSION = YES; 569 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 570 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 571 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 572 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 573 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 574 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 575 | CLANG_WARN_STRICT_PROTOTYPES = YES; 576 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 577 | CLANG_WARN_UNREACHABLE_CODE = YES; 578 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 579 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 580 | COPY_PHASE_STRIP = NO; 581 | ENABLE_STRICT_OBJC_MSGSEND = YES; 582 | ENABLE_TESTABILITY = YES; 583 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; 584 | GCC_C_LANGUAGE_STANDARD = gnu99; 585 | GCC_DYNAMIC_NO_PIC = NO; 586 | GCC_NO_COMMON_BLOCKS = YES; 587 | GCC_OPTIMIZATION_LEVEL = 0; 588 | GCC_PREPROCESSOR_DEFINITIONS = ( 589 | "DEBUG=1", 590 | "$(inherited)", 591 | ); 592 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 593 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 594 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 595 | GCC_WARN_UNDECLARED_SELECTOR = YES; 596 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 597 | GCC_WARN_UNUSED_FUNCTION = YES; 598 | GCC_WARN_UNUSED_VARIABLE = YES; 599 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 600 | LD_RUNPATH_SEARCH_PATHS = ( 601 | /usr/lib/swift, 602 | "$(inherited)", 603 | ); 604 | LIBRARY_SEARCH_PATHS = ( 605 | "\"$(SDKROOT)/usr/lib/swift\"", 606 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", 607 | "\"$(inherited)\"", 608 | ); 609 | MTL_ENABLE_DEBUG_INFO = YES; 610 | ONLY_ACTIVE_ARCH = YES; 611 | SDKROOT = iphoneos; 612 | }; 613 | name = Debug; 614 | }; 615 | 83CBBA211A601CBA00E9B192 /* Release */ = { 616 | isa = XCBuildConfiguration; 617 | buildSettings = { 618 | ALWAYS_SEARCH_USER_PATHS = NO; 619 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 620 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 621 | CLANG_CXX_LIBRARY = "libc++"; 622 | CLANG_ENABLE_MODULES = YES; 623 | CLANG_ENABLE_OBJC_ARC = YES; 624 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 625 | CLANG_WARN_BOOL_CONVERSION = YES; 626 | CLANG_WARN_COMMA = YES; 627 | CLANG_WARN_CONSTANT_CONVERSION = YES; 628 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 629 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 630 | CLANG_WARN_EMPTY_BODY = YES; 631 | CLANG_WARN_ENUM_CONVERSION = YES; 632 | CLANG_WARN_INFINITE_RECURSION = YES; 633 | CLANG_WARN_INT_CONVERSION = YES; 634 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 635 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 636 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 637 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 638 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 639 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 640 | CLANG_WARN_STRICT_PROTOTYPES = YES; 641 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 642 | CLANG_WARN_UNREACHABLE_CODE = YES; 643 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 644 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 645 | COPY_PHASE_STRIP = YES; 646 | ENABLE_NS_ASSERTIONS = NO; 647 | ENABLE_STRICT_OBJC_MSGSEND = YES; 648 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; 649 | GCC_C_LANGUAGE_STANDARD = gnu99; 650 | GCC_NO_COMMON_BLOCKS = YES; 651 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 652 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 653 | GCC_WARN_UNDECLARED_SELECTOR = YES; 654 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 655 | GCC_WARN_UNUSED_FUNCTION = YES; 656 | GCC_WARN_UNUSED_VARIABLE = YES; 657 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 658 | LD_RUNPATH_SEARCH_PATHS = ( 659 | /usr/lib/swift, 660 | "$(inherited)", 661 | ); 662 | LIBRARY_SEARCH_PATHS = ( 663 | "\"$(SDKROOT)/usr/lib/swift\"", 664 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", 665 | "\"$(inherited)\"", 666 | ); 667 | MTL_ENABLE_DEBUG_INFO = NO; 668 | SDKROOT = iphoneos; 669 | VALIDATE_PRODUCT = YES; 670 | }; 671 | name = Release; 672 | }; 673 | /* End XCBuildConfiguration section */ 674 | 675 | /* Begin XCConfigurationList section */ 676 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "rnuiTests" */ = { 677 | isa = XCConfigurationList; 678 | buildConfigurations = ( 679 | 00E356F61AD99517003FC87E /* Debug */, 680 | 00E356F71AD99517003FC87E /* Release */, 681 | ); 682 | defaultConfigurationIsVisible = 0; 683 | defaultConfigurationName = Release; 684 | }; 685 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "rnui" */ = { 686 | isa = XCConfigurationList; 687 | buildConfigurations = ( 688 | 13B07F941A680F5B00A75B9A /* Debug */, 689 | 13B07F951A680F5B00A75B9A /* Release */, 690 | ); 691 | defaultConfigurationIsVisible = 0; 692 | defaultConfigurationName = Release; 693 | }; 694 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "rnui" */ = { 695 | isa = XCConfigurationList; 696 | buildConfigurations = ( 697 | 83CBBA201A601CBA00E9B192 /* Debug */, 698 | 83CBBA211A601CBA00E9B192 /* Release */, 699 | ); 700 | defaultConfigurationIsVisible = 0; 701 | defaultConfigurationName = Release; 702 | }; 703 | /* End XCConfigurationList section */ 704 | }; 705 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 706 | } 707 | --------------------------------------------------------------------------------